Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,500 BAD
Holders
640
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 BADLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BADDIES
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-07 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // 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) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/BADDIES.sol // Dev: https://twitter.com/MatthewPaquette pragma solidity ^0.8.4; contract BADDIES is ERC721AQueryable, Ownable, Pausable { uint256 public MAX_MINTS = 2000; uint256 public MAX_SUPPLY = 10000; uint256 public price = 0.08 ether; uint256 public wlPrice = 0.05 ether; uint256 public vipPrice = 0.05 ether; bool public wlActive = false; bool public vipActive = false; bytes32 public vipRoot; bytes32 public wlRoot; string public baseURI; uint256 public mintCounter = 0; uint256 public wlMintCounter = 0; uint256 public vipMintCounter = 0; uint256 public airDropCounter = 0; constructor(bytes32 _vipRoot, bytes32 _wlRoot) ERC721A("BADDIES", "BAD") { vipRoot = _vipRoot; wlRoot = _wlRoot; toggleAllMintPause(); } function checkVIP(bytes32[] calldata _proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(_proof, vipRoot, leaf); } function checkWL(bytes32[] calldata _proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(_proof, wlRoot, leaf); } function mint(uint256 quantity) external payable whenNotPaused { require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "mint: Exceeded the limit per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "mint: Not enough tokens left"); require(msg.value >= (price * quantity), "mint: Not enough ether sent"); mintCounter += quantity; _safeMint(msg.sender, quantity); } function mintVIP(uint256 quantity, bytes32[] calldata _proof) external payable { require(vipActive == true, "mintVIP: VIP mint is not active"); require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "mintVIP: Exceeded the limit per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "mintVIP: Not enough tokens left"); require(msg.value >= (vipPrice * quantity), "mintVIP: Not enough ether sent"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_proof, vipRoot, leaf), "mintVIP: address is not on whitelist"); vipMintCounter += quantity; _safeMint(msg.sender, quantity); } function mintWhitelist(uint256 quantity, bytes32[] calldata _proof) external payable { require(wlActive == true, "mintWL: WL mint is not active"); require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "mintWhitelist: Exceeded the limit per wallet"); require(totalSupply() + quantity <= MAX_SUPPLY, "mintWhitelist: Not enough tokens left"); require(msg.value >= (wlPrice * quantity), "mintWhitelist: Not enough ether sent"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_proof, wlRoot, leaf), "mintWhitelist: address is not on whitelist"); wlMintCounter += quantity; _safeMint(msg.sender, quantity); } function airDrop(address[] calldata addrs, uint256 quantity) external onlyOwner { uint256 len = addrs.length; require(totalSupply() + (quantity * len) <= MAX_SUPPLY, "airDrop: Not enough tokens to airdrop"); airDropCounter += quantity * len; for (uint256 i = 0; i < len; i++) { _safeMint(addrs[i], quantity); } } function updateWLRoot(bytes32 _wlRoot) external onlyOwner { wlRoot = _wlRoot; } function updateVIPRoot(bytes32 _vipRoot) external onlyOwner { vipRoot = _vipRoot; } function _baseURI() internal view override returns (string memory) { return baseURI; } function _startTokenId() internal pure override returns (uint256) { return 1; } //ADMIN function enableVIPMint(bool state) external onlyOwner { vipActive = state; } function enableWLMint(bool state) external onlyOwner { wlActive = state; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function setWLPrice(uint256 _price) external onlyOwner { wlPrice = _price; } function setVIPPrice(uint256 _price) external onlyOwner { vipPrice = _price; } function setMaxMint(uint256 _max) external onlyOwner { MAX_MINTS = _max; } function toggleAllMintPause() public onlyOwner { paused() ? _unpause() : _pause(); } function setBaseURI(string memory _uri) external onlyOwner { baseURI = _uri; } function updateMaxSupply(uint256 _max) external onlyOwner { MAX_SUPPLY = _max; } function withdraw() external onlyOwner { require(address(this).balance > 0, "withdraw: contract balance must be greater than 0"); uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"_vipRoot","type":"bytes32"},{"internalType":"bytes32","name":"_wlRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkVIP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"enableVIPMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"enableWLMint","outputs":[],"stateMutability":"nonpayable","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":[{"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setVIPPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWLPrice","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":"toggleAllMintPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_vipRoot","type":"bytes32"}],"name":"updateVIPRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_wlRoot","type":"bytes32"}],"name":"updateWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vipActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526107d0600955612710600a5567011c37937e080000600b5566b1a2bc2ec50000600c5566b1a2bc2ec50000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555060006012556000601355600060145560006015553480156200008957600080fd5b50604051620055a4380380620055a48339818101604052810190620000af919062000617565b6040518060400160405280600781526020017f42414444494553000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f424144000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200013392919062000550565b5080600390805190602001906200014c92919062000550565b506200015d620001c660201b60201c565b60008190555050506200018562000179620001cf60201b60201c565b620001d760201b60201c565b6000600860146101000a81548160ff02191690831515021790555081600f8190555080601081905550620001be6200029d60201b60201c565b5050620008b5565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ad620002eb60201b60201c565b620002bd6200037c60201b60201c565b620002d857620002d26200039360201b60201c565b620002e9565b620002e86200040860201b60201c565b5b565b620002fb620001cf60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003216200047d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200037a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003719062000745565b60405180910390fd5b565b6000600860149054906101000a900460ff16905090565b620003a3620004a760201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003ef620001cf60201b60201c565b604051620003fe9190620006e4565b60405180910390a1565b62000418620004fc60201b60201c565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa62000464620001cf60201b60201c565b604051620004739190620006e4565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004b76200037c60201b60201c565b15620004fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f19062000723565b60405180910390fd5b565b6200050c6200037c60201b60201c565b6200054e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005459062000701565b60405180910390fd5b565b8280546200055e90620007b6565b90600052602060002090601f016020900481019282620005825760008555620005ce565b82601f106200059d57805160ff1916838001178555620005ce565b82800160010185558215620005ce579182015b82811115620005cd578251825591602001919060010190620005b0565b5b509050620005dd9190620005e1565b5090565b5b80821115620005fc576000816000905550600101620005e2565b5090565b60008151905062000611816200089b565b92915050565b600080604083850312156200063157620006306200081b565b5b6000620006418582860162000600565b9250506020620006548582860162000600565b9150509250929050565b620006698162000778565b82525050565b60006200067e60148362000767565b91506200068b8262000820565b602082019050919050565b6000620006a560108362000767565b9150620006b28262000849565b602082019050919050565b6000620006cc60208362000767565b9150620006d98262000872565b602082019050919050565b6000602082019050620006fb60008301846200065e565b92915050565b600060208201905081810360008301526200071c816200066f565b9050919050565b600060208201905081810360008301526200073e8162000696565b9050919050565b600060208201905081810360008301526200076081620006bd565b9050919050565b600082825260208201905092915050565b6000620007858262000796565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620007cf57607f821691505b60208210811415620007e657620007e5620007ec565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008a6816200078c565b8114620008b257600080fd5b50565b614cdf80620008c56000396000f3fe6080604052600436106103355760003560e01c8063715018a6116101ab578063b1edcb07116100f7578063cd2248bc11610095578063f2fde38b1161006f578063f2fde38b14610bc1578063f6a5b8e614610bea578063faa95a8e14610c13578063fd1fc4a014610c3c57610335565b8063cd2248bc14610b1e578063e985e9c514610b5b578063f103b43314610b9857610335565b8063c23dc68f116100d1578063c23dc68f14610a4e578063c7f8d01a14610a8b578063c87b56dd14610ab6578063cce132d114610af357610335565b8063b1edcb07146109de578063b7acfe8614610a07578063b88d4fde14610a3257610335565b80638da5cb5b1161016457806399a2557a1161013e57806399a2557a14610931578063a035b1fe1461096e578063a0712d6814610999578063a22cb465146109b557610335565b80638da5cb5b146108b257806391b7f5ed146108dd57806395d89b411461090657610335565b8063715018a6146107c357806373be8f92146107da5780637d427b1e146108055780637ff9871d1461082e57806382c309871461084a5780638462151c1461087557610335565b80633711b23f11610285578063547520fe116102235780635c975abb116101fd5780635c975abb146106f35780636352211e1461071e5780636c0360eb1461075b57806370a082311461078657610335565b8063547520fe1461066457806355f804b31461068d5780635bbb2177146106b657610335565b80634238090b1161025f5780634238090b146105c957806342842e0e146105f257806346aa52ce1461060e57806348575bfa1461063957610335565b80633711b23f1461055e578063378fe582146105895780633ccfd60b146105b257610335565b806318160ddd116102f25780632174a68f116102cc5780632174a68f146104d557806323b872dd14610500578063274a32d31461051c57806332cb6b0c1461053357610335565b806318160ddd146104545780631a62dae41461047f578063213f16f3146104aa57610335565b806301ffc9a71461033a578063024577fe14610377578063061431a8146103b457806306fdde03146103d0578063081812fc146103fb578063095ea7b314610438575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c91906138a0565b610c65565b60405161036e919061402a565b60405180910390f35b34801561038357600080fd5b5061039e600480360381019061039991906137ac565b610cf7565b6040516103ab919061402a565b60405180910390f35b6103ce60048036038101906103c99190613970565b610d7a565b005b3480156103dc57600080fd5b506103e5610fb0565b6040516103f29190614060565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190613943565b611042565b60405161042f9190613f7f565b60405180910390f35b610452600480360381019061044d91906136b9565b6110c1565b005b34801561046057600080fd5b50610469611205565b60405161047691906142fd565b60405180910390f35b34801561048b57600080fd5b5061049461121c565b6040516104a191906142fd565b60405180910390f35b3480156104b657600080fd5b506104bf611222565b6040516104cc91906142fd565b60405180910390f35b3480156104e157600080fd5b506104ea611228565b6040516104f7919061402a565b60405180910390f35b61051a600480360381019061051591906135a3565b61123b565b005b34801561052857600080fd5b50610531611560565b005b34801561053f57600080fd5b5061054861158c565b60405161055591906142fd565b60405180910390f35b34801561056a57600080fd5b50610573611592565b60405161058091906142fd565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190613943565b611598565b005b3480156105be57600080fd5b506105c76115aa565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613873565b611644565b005b61060c600480360381019061060791906135a3565b611656565b005b34801561061a57600080fd5b50610623611676565b60405161063091906142fd565b60405180910390f35b34801561064557600080fd5b5061064e61167c565b60405161065b919061402a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613943565b61168f565b005b34801561069957600080fd5b506106b460048036038101906106af91906138fa565b6116a1565b005b3480156106c257600080fd5b506106dd60048036038101906106d891906137f9565b6116c3565b6040516106ea9190613fe6565b60405180910390f35b3480156106ff57600080fd5b50610708611786565b604051610715919061402a565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613943565b61179d565b6040516107529190613f7f565b60405180910390f35b34801561076757600080fd5b506107706117af565b60405161077d9190614060565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a89190613536565b61183d565b6040516107ba91906142fd565b60405180910390f35b3480156107cf57600080fd5b506107d86118f6565b005b3480156107e657600080fd5b506107ef61190a565b6040516107fc91906142fd565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613873565b611910565b005b61084860048036038101906108439190613970565b611922565b005b34801561085657600080fd5b5061085f611b58565b60405161086c9190614045565b60405180910390f35b34801561088157600080fd5b5061089c60048036038101906108979190613536565b611b5e565b6040516108a99190614008565b60405180910390f35b3480156108be57600080fd5b506108c7611ca8565b6040516108d49190613f7f565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190613943565b611cd2565b005b34801561091257600080fd5b5061091b611ce4565b6040516109289190614060565b60405180910390f35b34801561093d57600080fd5b50610958600480360381019061095391906136f9565b611d76565b6040516109659190614008565b60405180910390f35b34801561097a57600080fd5b50610983611f8a565b60405161099091906142fd565b60405180910390f35b6109b360048036038101906109ae9190613943565b611f90565b005b3480156109c157600080fd5b506109dc60048036038101906109d79190613679565b6120bd565b005b3480156109ea57600080fd5b50610a056004803603810190610a009190613846565b6121c8565b005b348015610a1357600080fd5b50610a1c6121ed565b604051610a299190614045565b60405180910390f35b610a4c6004803603810190610a4791906135f6565b6121f3565b005b348015610a5a57600080fd5b50610a756004803603810190610a709190613943565b612266565b604051610a8291906142e2565b60405180910390f35b348015610a9757600080fd5b50610aa06122d0565b604051610aad91906142fd565b60405180910390f35b348015610ac257600080fd5b50610add6004803603810190610ad89190613943565b6122d6565b604051610aea9190614060565b60405180910390f35b348015610aff57600080fd5b50610b08612375565b604051610b1591906142fd565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b4091906137ac565b61237b565b604051610b52919061402a565b60405180910390f35b348015610b6757600080fd5b50610b826004803603810190610b7d9190613563565b6123fe565b604051610b8f919061402a565b60405180910390f35b348015610ba457600080fd5b50610bbf6004803603810190610bba9190613943565b612492565b005b348015610bcd57600080fd5b50610be86004803603810190610be39190613536565b6124a4565b005b348015610bf657600080fd5b50610c116004803603810190610c0c9190613943565b612528565b005b348015610c1f57600080fd5b50610c3a6004803603810190610c359190613846565b61253a565b005b348015610c4857600080fd5b50610c636004803603810190610c5e919061374c565b61255f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cf05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008033604051602001610d0b9190613f40565b604051602081830303815290604052805190602001209050610d71848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361264b565b91505092915050565b60011515600e60009054906101000a900460ff16151514610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614182565b60405180910390fd5b600954610ddc33612662565b84610de79190614454565b1115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90614102565b60405180910390fd5b600a5483610e34611205565b610e3e9190614454565b1115610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614082565b60405180910390fd5b82600c54610e8d91906144aa565b341015610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614222565b60405180910390fd5b600033604051602001610ee29190613f40565b604051602081830303815290604052805190602001209050610f48838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361264b565b610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906142c2565b60405180910390fd5b8360136000828254610f999190614454565b92505081905550610faa33856126b9565b50505050565b606060028054610fbf906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb906145e7565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050905090565b600061104d826126d7565b611083576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110cc8261179d565b90508073ffffffffffffffffffffffffffffffffffffffff166110ed612736565b73ffffffffffffffffffffffffffffffffffffffff16146111505761111981611114612736565b6123fe565b61114f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061120f61273e565b6001546000540303905090565b60135481565b60145481565b600e60019054906101000a900460ff1681565b600061124682612747565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ad576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806112b984612815565b915091506112cf81876112ca612736565b61283c565b61131b576112e4866112df612736565b6123fe565b61131a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611382576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138f8686866001612880565b801561139a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061146885611444888887612886565b7c0200000000000000000000000000000000000000000000000000000000176128ae565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156114f05760006001850190506000600460008381526020019081526020016000205414156114ee5760005481146114ed578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461155886868660016128d9565b505050505050565b6115686128df565b611570611786565b6115815761157c61295d565b61158a565b6115896129c0565b5b565b600a5481565b600d5481565b6115a06128df565b80600d8190555050565b6115b26128df565b600047116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614262565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611640573d6000803e3d6000fd5b5050565b61164c6128df565b80600f8190555050565b611671838383604051806020016040528060008152506121f3565b505050565b60125481565b600e60009054906101000a900460ff1681565b6116976128df565b8060098190555050565b6116a96128df565b80601190805190602001906116bf9291906131e4565b5050565b6060600083839050905060008167ffffffffffffffff8111156116e9576116e8614744565b5b60405190808252806020026020018201604052801561172257816020015b61170f61326a565b8152602001906001900390816117075790505b50905060005b82811461177a5761175186868381811061174557611744614715565b5b90506020020135612266565b82828151811061176457611763614715565b5b6020026020010181905250806001019050611728565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b60006117a882612747565b9050919050565b601180546117bc906145e7565b80601f01602080910402602001604051908101604052809291908181526020018280546117e8906145e7565b80156118355780601f1061180a57610100808354040283529160200191611835565b820191906000526020600020905b81548152906001019060200180831161181857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118fe6128df565b6119086000612a23565b565b60155481565b6119186128df565b8060108190555050565b60011515600e60019054906101000a900460ff16151514611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614142565b60405180910390fd5b60095461198433612662565b8461198f9190614454565b11156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790614242565b60405180910390fd5b600a54836119dc611205565b6119e69190614454565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e906140c2565b60405180910390fd5b82600d54611a3591906144aa565b341015611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e906142a2565b60405180910390fd5b600033604051602001611a8a9190613f40565b604051602081830303815290604052805190602001209050611af0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361264b565b611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690614282565b60405180910390fd5b8360146000828254611b419190614454565b92505081905550611b5233856126b9565b50505050565b60105481565b60606000806000611b6e8561183d565b905060008167ffffffffffffffff811115611b8c57611b8b614744565b5b604051908082528060200260200182016040528015611bba5781602001602082028036833780820191505090505b509050611bc561326a565b6000611bcf61273e565b90505b838614611c9a57611be281612ae9565b9150816040015115611bf357611c8f565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c3357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611c8e5780838780600101985081518110611c8157611c80614715565b5b6020026020010181815250505b5b806001019050611bd2565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611cda6128df565b80600b8190555050565b606060038054611cf3906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1f906145e7565b8015611d6c5780601f10611d4157610100808354040283529160200191611d6c565b820191906000526020600020905b815481529060010190602001808311611d4f57829003601f168201915b5050505050905090565b6060818310611db1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611dbc612b14565b9050611dc661273e565b851015611dd857611dd561273e565b94505b80841115611de4578093505b6000611def8761183d565b905084861015611e12576000868603905081811015611e0c578091505b50611e17565b600090505b60008167ffffffffffffffff811115611e3357611e32614744565b5b604051908082528060200260200182016040528015611e615781602001602082028036833780820191505090505b5090506000821415611e795780945050505050611f83565b6000611e8488612266565b905060008160400151611e9957816000015190505b60008990505b888114158015611eaf5750848714155b15611f7557611ebd81612ae9565b9250826040015115611ece57611f6a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611f0e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f695780848880600101995081518110611f5c57611f5b614715565b5b6020026020010181815250505b5b806001019050611e9f565b508583528296505050505050505b9392505050565b600b5481565b611f98612b1d565b600954611fa433612662565b82611faf9190614454565b1115611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790614162565b60405180910390fd5b600a5481611ffc611205565b6120069190614454565b1115612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e906141c2565b60405180910390fd5b80600b5461205591906144aa565b341015612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90614122565b60405180910390fd5b80601260008282546120a99190614454565b925050819055506120ba33826126b9565b50565b80600760006120ca612736565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612177612736565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121bc919061402a565b60405180910390a35050565b6121d06128df565b80600e60016101000a81548160ff02191690831515021790555050565b600f5481565b6121fe84848461123b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122605761222984848484612b67565b61225f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61226e61326a565b61227661326a565b61227e61273e565b831080612292575061228e612b14565b8310155b156122a057809150506122cb565b6122a983612ae9565b90508060400151156122be57809150506122cb565b6122c783612cc7565b9150505b919050565b600c5481565b60606122e1826126d7565b612317576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612321612ce7565b9050600081511415612342576040518060200160405280600081525061236d565b8061234c84612d79565b60405160200161235d929190613f5b565b6040516020818303038152906040525b915050919050565b60095481565b6000803360405160200161238f9190613f40565b6040516020818303038152906040528051906020012090506123f5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361264b565b91505092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61249a6128df565b80600a8190555050565b6124ac6128df565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612513906140e2565b60405180910390fd5b61252581612a23565b50565b6125306128df565b80600c8190555050565b6125426128df565b80600e60006101000a81548160ff02191690831515021790555050565b6125676128df565b6000838390509050600a54818361257e91906144aa565b612586611205565b6125909190614454565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906141e2565b60405180910390fd5b80826125dd91906144aa565b601560008282546125ee9190614454565b9250508190555060005b818110156126445761263185858381811061261657612615614715565b5b905060200201602081019061262b9190613536565b846126b9565b808061263c9061464a565b9150506125f8565b5050505050565b6000826126588584612dd2565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6126d3828260405180602001604052806000815250612e28565b5050565b6000816126e261273e565b111580156126f1575060005482105b801561272f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061275661273e565b116127de576000548110156127dd5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156127db575b60008114156127d15760046000836001900393508381526020019081526020016000205490506127a6565b8092505050612810565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861289d868684612ec5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6128e7612ece565b73ffffffffffffffffffffffffffffffffffffffff16612905611ca8565b73ffffffffffffffffffffffffffffffffffffffff161461295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290614202565b60405180910390fd5b565b612965612b1d565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129a9612ece565b6040516129b69190613f7f565b60405180910390a1565b6129c8612ed6565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a0c612ece565b604051612a199190613f7f565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af161326a565b612b0d6004600084815260200190815260200160002054612f1f565b9050919050565b60008054905090565b612b25611786565b15612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c906141a2565b60405180910390fd5b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8d612736565b8786866040518563ffffffff1660e01b8152600401612baf9493929190613f9a565b602060405180830381600087803b158015612bc957600080fd5b505af1925050508015612bfa57506040513d601f19601f82011682018060405250810190612bf791906138cd565b60015b612c74573d8060008114612c2a576040519150601f19603f3d011682016040523d82523d6000602084013e612c2f565b606091505b50600081511415612c6c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ccf61326a565b612ce0612cdb83612747565b612f1f565b9050919050565b606060118054612cf6906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d22906145e7565b8015612d6f5780601f10612d4457610100808354040283529160200191612d6f565b820191906000526020600020905b815481529060010190602001808311612d5257829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612dbd57600184039350600a81066030018453600a8104905080612db857612dbd565b612d92565b50828103602084039350808452505050919050565b60008082905060005b8451811015612e1d57612e0882868381518110612dfb57612dfa614715565b5b6020026020010151612fd5565b91508080612e159061464a565b915050612ddb565b508091505092915050565b612e328383613000565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ec057600080549050600083820390505b612e726000868380600101945086612b67565b612ea8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612e5f578160005414612ebd57600080fd5b50505b505050565b60009392505050565b600033905090565b612ede611786565b612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f14906140a2565b60405180910390fd5b565b612f2761326a565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310612fed57612fe882846131bd565b612ff8565b612ff783836131bd565b5b905092915050565b6000805490506000821415613041576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304e6000848385612880565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130c5836130b66000866000612886565b6130bf856131d4565b176128ae565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461316657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061312b565b5060008214156131a2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506131b860008483856128d9565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131f0906145e7565b90600052602060002090601f0160209004810192826132125760008555613259565b82601f1061322b57805160ff1916838001178555613259565b82800160010185558215613259579182015b8281111561325857825182559160200191906001019061323d565b5b50905061326691906132b9565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156132d25760008160009055506001016132ba565b5090565b60006132e96132e48461433d565b614318565b90508281526020810184848401111561330557613304614782565b5b6133108482856145a5565b509392505050565b600061332b6133268461436e565b614318565b90508281526020810184848401111561334757613346614782565b5b6133528482856145a5565b509392505050565b60008135905061336981614c36565b92915050565b60008083601f84011261338557613384614778565b5b8235905067ffffffffffffffff8111156133a2576133a1614773565b5b6020830191508360208202830111156133be576133bd61477d565b5b9250929050565b60008083601f8401126133db576133da614778565b5b8235905067ffffffffffffffff8111156133f8576133f7614773565b5b6020830191508360208202830111156134145761341361477d565b5b9250929050565b60008083601f84011261343157613430614778565b5b8235905067ffffffffffffffff81111561344e5761344d614773565b5b60208301915083602082028301111561346a5761346961477d565b5b9250929050565b60008135905061348081614c4d565b92915050565b60008135905061349581614c64565b92915050565b6000813590506134aa81614c7b565b92915050565b6000815190506134bf81614c7b565b92915050565b600082601f8301126134da576134d9614778565b5b81356134ea8482602086016132d6565b91505092915050565b600082601f83011261350857613507614778565b5b8135613518848260208601613318565b91505092915050565b60008135905061353081614c92565b92915050565b60006020828403121561354c5761354b61478c565b5b600061355a8482850161335a565b91505092915050565b6000806040838503121561357a5761357961478c565b5b60006135888582860161335a565b92505060206135998582860161335a565b9150509250929050565b6000806000606084860312156135bc576135bb61478c565b5b60006135ca8682870161335a565b93505060206135db8682870161335a565b92505060406135ec86828701613521565b9150509250925092565b600080600080608085870312156136105761360f61478c565b5b600061361e8782880161335a565b945050602061362f8782880161335a565b935050604061364087828801613521565b925050606085013567ffffffffffffffff81111561366157613660614787565b5b61366d878288016134c5565b91505092959194509250565b600080604083850312156136905761368f61478c565b5b600061369e8582860161335a565b92505060206136af85828601613471565b9150509250929050565b600080604083850312156136d0576136cf61478c565b5b60006136de8582860161335a565b92505060206136ef85828601613521565b9150509250929050565b6000806000606084860312156137125761371161478c565b5b60006137208682870161335a565b935050602061373186828701613521565b925050604061374286828701613521565b9150509250925092565b6000806000604084860312156137655761376461478c565b5b600084013567ffffffffffffffff81111561378357613782614787565b5b61378f8682870161336f565b935093505060206137a286828701613521565b9150509250925092565b600080602083850312156137c3576137c261478c565b5b600083013567ffffffffffffffff8111156137e1576137e0614787565b5b6137ed858286016133c5565b92509250509250929050565b600080602083850312156138105761380f61478c565b5b600083013567ffffffffffffffff81111561382e5761382d614787565b5b61383a8582860161341b565b92509250509250929050565b60006020828403121561385c5761385b61478c565b5b600061386a84828501613471565b91505092915050565b6000602082840312156138895761388861478c565b5b600061389784828501613486565b91505092915050565b6000602082840312156138b6576138b561478c565b5b60006138c48482850161349b565b91505092915050565b6000602082840312156138e3576138e261478c565b5b60006138f1848285016134b0565b91505092915050565b6000602082840312156139105761390f61478c565b5b600082013567ffffffffffffffff81111561392e5761392d614787565b5b61393a848285016134f3565b91505092915050565b6000602082840312156139595761395861478c565b5b600061396784828501613521565b91505092915050565b6000806000604084860312156139895761398861478c565b5b600061399786828701613521565b935050602084013567ffffffffffffffff8111156139b8576139b7614787565b5b6139c4868287016133c5565b92509250509250925092565b60006139dc8383613e5a565b60808301905092915050565b60006139f48383613f13565b60208301905092915050565b613a0981614504565b82525050565b613a1881614504565b82525050565b613a2f613a2a82614504565b614693565b82525050565b6000613a40826143bf565b613a4a8185614405565b9350613a558361439f565b8060005b83811015613a86578151613a6d88826139d0565b9750613a78836143eb565b925050600181019050613a59565b5085935050505092915050565b6000613a9e826143ca565b613aa88185614416565b9350613ab3836143af565b8060005b83811015613ae4578151613acb88826139e8565b9750613ad6836143f8565b925050600181019050613ab7565b5085935050505092915050565b613afa81614516565b82525050565b613b0981614516565b82525050565b613b1881614522565b82525050565b6000613b29826143d5565b613b338185614427565b9350613b438185602086016145b4565b613b4c81614791565b840191505092915050565b6000613b62826143e0565b613b6c8185614438565b9350613b7c8185602086016145b4565b613b8581614791565b840191505092915050565b6000613b9b826143e0565b613ba58185614449565b9350613bb58185602086016145b4565b80840191505092915050565b6000613bce602583614438565b9150613bd9826147af565b604082019050919050565b6000613bf1601483614438565b9150613bfc826147fe565b602082019050919050565b6000613c14601f83614438565b9150613c1f82614827565b602082019050919050565b6000613c37602683614438565b9150613c4282614850565b604082019050919050565b6000613c5a602c83614438565b9150613c658261489f565b604082019050919050565b6000613c7d601b83614438565b9150613c88826148ee565b602082019050919050565b6000613ca0601f83614438565b9150613cab82614917565b602082019050919050565b6000613cc3602383614438565b9150613cce82614940565b604082019050919050565b6000613ce6601d83614438565b9150613cf18261498f565b602082019050919050565b6000613d09601083614438565b9150613d14826149b8565b602082019050919050565b6000613d2c601c83614438565b9150613d37826149e1565b602082019050919050565b6000613d4f602583614438565b9150613d5a82614a0a565b604082019050919050565b6000613d72602083614438565b9150613d7d82614a59565b602082019050919050565b6000613d95602483614438565b9150613da082614a82565b604082019050919050565b6000613db8602683614438565b9150613dc382614ad1565b604082019050919050565b6000613ddb603183614438565b9150613de682614b20565b604082019050919050565b6000613dfe602483614438565b9150613e0982614b6f565b604082019050919050565b6000613e21601e83614438565b9150613e2c82614bbe565b602082019050919050565b6000613e44602a83614438565b9150613e4f82614be7565b604082019050919050565b608082016000820151613e706000850182613a00565b506020820151613e836020850182613f31565b506040820151613e966040850182613af1565b506060820151613ea96060850182613f04565b50505050565b608082016000820151613ec56000850182613a00565b506020820151613ed86020850182613f31565b506040820151613eeb6040850182613af1565b506060820151613efe6060850182613f04565b50505050565b613f0d81614578565b82525050565b613f1c81614587565b82525050565b613f2b81614587565b82525050565b613f3a81614591565b82525050565b6000613f4c8284613a1e565b60148201915081905092915050565b6000613f678285613b90565b9150613f738284613b90565b91508190509392505050565b6000602082019050613f946000830184613a0f565b92915050565b6000608082019050613faf6000830187613a0f565b613fbc6020830186613a0f565b613fc96040830185613f22565b8181036060830152613fdb8184613b1e565b905095945050505050565b600060208201905081810360008301526140008184613a35565b905092915050565b600060208201905081810360008301526140228184613a93565b905092915050565b600060208201905061403f6000830184613b00565b92915050565b600060208201905061405a6000830184613b0f565b92915050565b6000602082019050818103600083015261407a8184613b57565b905092915050565b6000602082019050818103600083015261409b81613bc1565b9050919050565b600060208201905081810360008301526140bb81613be4565b9050919050565b600060208201905081810360008301526140db81613c07565b9050919050565b600060208201905081810360008301526140fb81613c2a565b9050919050565b6000602082019050818103600083015261411b81613c4d565b9050919050565b6000602082019050818103600083015261413b81613c70565b9050919050565b6000602082019050818103600083015261415b81613c93565b9050919050565b6000602082019050818103600083015261417b81613cb6565b9050919050565b6000602082019050818103600083015261419b81613cd9565b9050919050565b600060208201905081810360008301526141bb81613cfc565b9050919050565b600060208201905081810360008301526141db81613d1f565b9050919050565b600060208201905081810360008301526141fb81613d42565b9050919050565b6000602082019050818103600083015261421b81613d65565b9050919050565b6000602082019050818103600083015261423b81613d88565b9050919050565b6000602082019050818103600083015261425b81613dab565b9050919050565b6000602082019050818103600083015261427b81613dce565b9050919050565b6000602082019050818103600083015261429b81613df1565b9050919050565b600060208201905081810360008301526142bb81613e14565b9050919050565b600060208201905081810360008301526142db81613e37565b9050919050565b60006080820190506142f76000830184613eaf565b92915050565b60006020820190506143126000830184613f22565b92915050565b6000614322614333565b905061432e8282614619565b919050565b6000604051905090565b600067ffffffffffffffff82111561435857614357614744565b5b61436182614791565b9050602081019050919050565b600067ffffffffffffffff82111561438957614388614744565b5b61439282614791565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061445f82614587565b915061446a83614587565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561449f5761449e6146b7565b5b828201905092915050565b60006144b582614587565b91506144c083614587565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144f9576144f86146b7565b5b828202905092915050565b600061450f82614558565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156145d25780820151818401526020810190506145b7565b838111156145e1576000848401525b50505050565b600060028204905060018216806145ff57607f821691505b60208210811415614613576146126146e6565b5b50919050565b61462282614791565b810181811067ffffffffffffffff8211171561464157614640614744565b5b80604052505050565b600061465582614587565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614688576146876146b7565b5b600182019050919050565b600061469e826146a5565b9050919050565b60006146b0826147a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6d696e7457686974656c6973743a204e6f7420656e6f75676820746f6b656e7360008201527f206c656674000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f6d696e745649503a204e6f7420656e6f75676820746f6b656e73206c65667400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d696e7457686974656c6973743a20457863656564656420746865206c696d6960008201527f74207065722077616c6c65740000000000000000000000000000000000000000602082015250565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b7f6d696e745649503a20564950206d696e74206973206e6f742061637469766500600082015250565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e74574c3a20574c206d696e74206973206e6f7420616374697665000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d696e7457686974656c6973743a204e6f7420656e6f7567682065746865722060008201527f73656e7400000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e745649503a20457863656564656420746865206c696d6974207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b7f6d696e745649503a2061646472657373206973206e6f74206f6e20776869746560008201527f6c69737400000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e745649503a204e6f7420656e6f7567682065746865722073656e740000600082015250565b7f6d696e7457686974656c6973743a2061646472657373206973206e6f74206f6e60008201527f2077686974656c69737400000000000000000000000000000000000000000000602082015250565b614c3f81614504565b8114614c4a57600080fd5b50565b614c5681614516565b8114614c6157600080fd5b50565b614c6d81614522565b8114614c7857600080fd5b50565b614c848161452c565b8114614c8f57600080fd5b50565b614c9b81614587565b8114614ca657600080fd5b5056fea2646970667358221220f3d0c404c500e0e0de6b900839b5d965f60faa31f29889490e6eda6d6427569964736f6c63430008070033343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
Deployed Bytecode
0x6080604052600436106103355760003560e01c8063715018a6116101ab578063b1edcb07116100f7578063cd2248bc11610095578063f2fde38b1161006f578063f2fde38b14610bc1578063f6a5b8e614610bea578063faa95a8e14610c13578063fd1fc4a014610c3c57610335565b8063cd2248bc14610b1e578063e985e9c514610b5b578063f103b43314610b9857610335565b8063c23dc68f116100d1578063c23dc68f14610a4e578063c7f8d01a14610a8b578063c87b56dd14610ab6578063cce132d114610af357610335565b8063b1edcb07146109de578063b7acfe8614610a07578063b88d4fde14610a3257610335565b80638da5cb5b1161016457806399a2557a1161013e57806399a2557a14610931578063a035b1fe1461096e578063a0712d6814610999578063a22cb465146109b557610335565b80638da5cb5b146108b257806391b7f5ed146108dd57806395d89b411461090657610335565b8063715018a6146107c357806373be8f92146107da5780637d427b1e146108055780637ff9871d1461082e57806382c309871461084a5780638462151c1461087557610335565b80633711b23f11610285578063547520fe116102235780635c975abb116101fd5780635c975abb146106f35780636352211e1461071e5780636c0360eb1461075b57806370a082311461078657610335565b8063547520fe1461066457806355f804b31461068d5780635bbb2177146106b657610335565b80634238090b1161025f5780634238090b146105c957806342842e0e146105f257806346aa52ce1461060e57806348575bfa1461063957610335565b80633711b23f1461055e578063378fe582146105895780633ccfd60b146105b257610335565b806318160ddd116102f25780632174a68f116102cc5780632174a68f146104d557806323b872dd14610500578063274a32d31461051c57806332cb6b0c1461053357610335565b806318160ddd146104545780631a62dae41461047f578063213f16f3146104aa57610335565b806301ffc9a71461033a578063024577fe14610377578063061431a8146103b457806306fdde03146103d0578063081812fc146103fb578063095ea7b314610438575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c91906138a0565b610c65565b60405161036e919061402a565b60405180910390f35b34801561038357600080fd5b5061039e600480360381019061039991906137ac565b610cf7565b6040516103ab919061402a565b60405180910390f35b6103ce60048036038101906103c99190613970565b610d7a565b005b3480156103dc57600080fd5b506103e5610fb0565b6040516103f29190614060565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190613943565b611042565b60405161042f9190613f7f565b60405180910390f35b610452600480360381019061044d91906136b9565b6110c1565b005b34801561046057600080fd5b50610469611205565b60405161047691906142fd565b60405180910390f35b34801561048b57600080fd5b5061049461121c565b6040516104a191906142fd565b60405180910390f35b3480156104b657600080fd5b506104bf611222565b6040516104cc91906142fd565b60405180910390f35b3480156104e157600080fd5b506104ea611228565b6040516104f7919061402a565b60405180910390f35b61051a600480360381019061051591906135a3565b61123b565b005b34801561052857600080fd5b50610531611560565b005b34801561053f57600080fd5b5061054861158c565b60405161055591906142fd565b60405180910390f35b34801561056a57600080fd5b50610573611592565b60405161058091906142fd565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab9190613943565b611598565b005b3480156105be57600080fd5b506105c76115aa565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613873565b611644565b005b61060c600480360381019061060791906135a3565b611656565b005b34801561061a57600080fd5b50610623611676565b60405161063091906142fd565b60405180910390f35b34801561064557600080fd5b5061064e61167c565b60405161065b919061402a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613943565b61168f565b005b34801561069957600080fd5b506106b460048036038101906106af91906138fa565b6116a1565b005b3480156106c257600080fd5b506106dd60048036038101906106d891906137f9565b6116c3565b6040516106ea9190613fe6565b60405180910390f35b3480156106ff57600080fd5b50610708611786565b604051610715919061402a565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190613943565b61179d565b6040516107529190613f7f565b60405180910390f35b34801561076757600080fd5b506107706117af565b60405161077d9190614060565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a89190613536565b61183d565b6040516107ba91906142fd565b60405180910390f35b3480156107cf57600080fd5b506107d86118f6565b005b3480156107e657600080fd5b506107ef61190a565b6040516107fc91906142fd565b60405180910390f35b34801561081157600080fd5b5061082c60048036038101906108279190613873565b611910565b005b61084860048036038101906108439190613970565b611922565b005b34801561085657600080fd5b5061085f611b58565b60405161086c9190614045565b60405180910390f35b34801561088157600080fd5b5061089c60048036038101906108979190613536565b611b5e565b6040516108a99190614008565b60405180910390f35b3480156108be57600080fd5b506108c7611ca8565b6040516108d49190613f7f565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190613943565b611cd2565b005b34801561091257600080fd5b5061091b611ce4565b6040516109289190614060565b60405180910390f35b34801561093d57600080fd5b50610958600480360381019061095391906136f9565b611d76565b6040516109659190614008565b60405180910390f35b34801561097a57600080fd5b50610983611f8a565b60405161099091906142fd565b60405180910390f35b6109b360048036038101906109ae9190613943565b611f90565b005b3480156109c157600080fd5b506109dc60048036038101906109d79190613679565b6120bd565b005b3480156109ea57600080fd5b50610a056004803603810190610a009190613846565b6121c8565b005b348015610a1357600080fd5b50610a1c6121ed565b604051610a299190614045565b60405180910390f35b610a4c6004803603810190610a4791906135f6565b6121f3565b005b348015610a5a57600080fd5b50610a756004803603810190610a709190613943565b612266565b604051610a8291906142e2565b60405180910390f35b348015610a9757600080fd5b50610aa06122d0565b604051610aad91906142fd565b60405180910390f35b348015610ac257600080fd5b50610add6004803603810190610ad89190613943565b6122d6565b604051610aea9190614060565b60405180910390f35b348015610aff57600080fd5b50610b08612375565b604051610b1591906142fd565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b4091906137ac565b61237b565b604051610b52919061402a565b60405180910390f35b348015610b6757600080fd5b50610b826004803603810190610b7d9190613563565b6123fe565b604051610b8f919061402a565b60405180910390f35b348015610ba457600080fd5b50610bbf6004803603810190610bba9190613943565b612492565b005b348015610bcd57600080fd5b50610be86004803603810190610be39190613536565b6124a4565b005b348015610bf657600080fd5b50610c116004803603810190610c0c9190613943565b612528565b005b348015610c1f57600080fd5b50610c3a6004803603810190610c359190613846565b61253a565b005b348015610c4857600080fd5b50610c636004803603810190610c5e919061374c565b61255f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cf05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008033604051602001610d0b9190613f40565b604051602081830303815290604052805190602001209050610d71848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361264b565b91505092915050565b60011515600e60009054906101000a900460ff16151514610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614182565b60405180910390fd5b600954610ddc33612662565b84610de79190614454565b1115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90614102565b60405180910390fd5b600a5483610e34611205565b610e3e9190614454565b1115610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614082565b60405180910390fd5b82600c54610e8d91906144aa565b341015610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690614222565b60405180910390fd5b600033604051602001610ee29190613f40565b604051602081830303815290604052805190602001209050610f48838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506010548361264b565b610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906142c2565b60405180910390fd5b8360136000828254610f999190614454565b92505081905550610faa33856126b9565b50505050565b606060028054610fbf906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610feb906145e7565b80156110385780601f1061100d57610100808354040283529160200191611038565b820191906000526020600020905b81548152906001019060200180831161101b57829003601f168201915b5050505050905090565b600061104d826126d7565b611083576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110cc8261179d565b90508073ffffffffffffffffffffffffffffffffffffffff166110ed612736565b73ffffffffffffffffffffffffffffffffffffffff16146111505761111981611114612736565b6123fe565b61114f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061120f61273e565b6001546000540303905090565b60135481565b60145481565b600e60019054906101000a900460ff1681565b600061124682612747565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112ad576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806112b984612815565b915091506112cf81876112ca612736565b61283c565b61131b576112e4866112df612736565b6123fe565b61131a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611382576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138f8686866001612880565b801561139a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061146885611444888887612886565b7c0200000000000000000000000000000000000000000000000000000000176128ae565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156114f05760006001850190506000600460008381526020019081526020016000205414156114ee5760005481146114ed578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461155886868660016128d9565b505050505050565b6115686128df565b611570611786565b6115815761157c61295d565b61158a565b6115896129c0565b5b565b600a5481565b600d5481565b6115a06128df565b80600d8190555050565b6115b26128df565b600047116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90614262565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611640573d6000803e3d6000fd5b5050565b61164c6128df565b80600f8190555050565b611671838383604051806020016040528060008152506121f3565b505050565b60125481565b600e60009054906101000a900460ff1681565b6116976128df565b8060098190555050565b6116a96128df565b80601190805190602001906116bf9291906131e4565b5050565b6060600083839050905060008167ffffffffffffffff8111156116e9576116e8614744565b5b60405190808252806020026020018201604052801561172257816020015b61170f61326a565b8152602001906001900390816117075790505b50905060005b82811461177a5761175186868381811061174557611744614715565b5b90506020020135612266565b82828151811061176457611763614715565b5b6020026020010181905250806001019050611728565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b60006117a882612747565b9050919050565b601180546117bc906145e7565b80601f01602080910402602001604051908101604052809291908181526020018280546117e8906145e7565b80156118355780601f1061180a57610100808354040283529160200191611835565b820191906000526020600020905b81548152906001019060200180831161181857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118fe6128df565b6119086000612a23565b565b60155481565b6119186128df565b8060108190555050565b60011515600e60019054906101000a900460ff16151514611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614142565b60405180910390fd5b60095461198433612662565b8461198f9190614454565b11156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790614242565b60405180910390fd5b600a54836119dc611205565b6119e69190614454565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e906140c2565b60405180910390fd5b82600d54611a3591906144aa565b341015611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e906142a2565b60405180910390fd5b600033604051602001611a8a9190613f40565b604051602081830303815290604052805190602001209050611af0838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361264b565b611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690614282565b60405180910390fd5b8360146000828254611b419190614454565b92505081905550611b5233856126b9565b50505050565b60105481565b60606000806000611b6e8561183d565b905060008167ffffffffffffffff811115611b8c57611b8b614744565b5b604051908082528060200260200182016040528015611bba5781602001602082028036833780820191505090505b509050611bc561326a565b6000611bcf61273e565b90505b838614611c9a57611be281612ae9565b9150816040015115611bf357611c8f565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c3357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611c8e5780838780600101985081518110611c8157611c80614715565b5b6020026020010181815250505b5b806001019050611bd2565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611cda6128df565b80600b8190555050565b606060038054611cf3906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1f906145e7565b8015611d6c5780601f10611d4157610100808354040283529160200191611d6c565b820191906000526020600020905b815481529060010190602001808311611d4f57829003601f168201915b5050505050905090565b6060818310611db1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611dbc612b14565b9050611dc661273e565b851015611dd857611dd561273e565b94505b80841115611de4578093505b6000611def8761183d565b905084861015611e12576000868603905081811015611e0c578091505b50611e17565b600090505b60008167ffffffffffffffff811115611e3357611e32614744565b5b604051908082528060200260200182016040528015611e615781602001602082028036833780820191505090505b5090506000821415611e795780945050505050611f83565b6000611e8488612266565b905060008160400151611e9957816000015190505b60008990505b888114158015611eaf5750848714155b15611f7557611ebd81612ae9565b9250826040015115611ece57611f6a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611f0e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f695780848880600101995081518110611f5c57611f5b614715565b5b6020026020010181815250505b5b806001019050611e9f565b508583528296505050505050505b9392505050565b600b5481565b611f98612b1d565b600954611fa433612662565b82611faf9190614454565b1115611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790614162565b60405180910390fd5b600a5481611ffc611205565b6120069190614454565b1115612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e906141c2565b60405180910390fd5b80600b5461205591906144aa565b341015612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90614122565b60405180910390fd5b80601260008282546120a99190614454565b925050819055506120ba33826126b9565b50565b80600760006120ca612736565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612177612736565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121bc919061402a565b60405180910390a35050565b6121d06128df565b80600e60016101000a81548160ff02191690831515021790555050565b600f5481565b6121fe84848461123b565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122605761222984848484612b67565b61225f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61226e61326a565b61227661326a565b61227e61273e565b831080612292575061228e612b14565b8310155b156122a057809150506122cb565b6122a983612ae9565b90508060400151156122be57809150506122cb565b6122c783612cc7565b9150505b919050565b600c5481565b60606122e1826126d7565b612317576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612321612ce7565b9050600081511415612342576040518060200160405280600081525061236d565b8061234c84612d79565b60405160200161235d929190613f5b565b6040516020818303038152906040525b915050919050565b60095481565b6000803360405160200161238f9190613f40565b6040516020818303038152906040528051906020012090506123f5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f548361264b565b91505092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61249a6128df565b80600a8190555050565b6124ac6128df565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612513906140e2565b60405180910390fd5b61252581612a23565b50565b6125306128df565b80600c8190555050565b6125426128df565b80600e60006101000a81548160ff02191690831515021790555050565b6125676128df565b6000838390509050600a54818361257e91906144aa565b612586611205565b6125909190614454565b11156125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c8906141e2565b60405180910390fd5b80826125dd91906144aa565b601560008282546125ee9190614454565b9250508190555060005b818110156126445761263185858381811061261657612615614715565b5b905060200201602081019061262b9190613536565b846126b9565b808061263c9061464a565b9150506125f8565b5050505050565b6000826126588584612dd2565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6126d3828260405180602001604052806000815250612e28565b5050565b6000816126e261273e565b111580156126f1575060005482105b801561272f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061275661273e565b116127de576000548110156127dd5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156127db575b60008114156127d15760046000836001900393508381526020019081526020016000205490506127a6565b8092505050612810565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861289d868684612ec5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6128e7612ece565b73ffffffffffffffffffffffffffffffffffffffff16612905611ca8565b73ffffffffffffffffffffffffffffffffffffffff161461295b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295290614202565b60405180910390fd5b565b612965612b1d565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129a9612ece565b6040516129b69190613f7f565b60405180910390a1565b6129c8612ed6565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a0c612ece565b604051612a199190613f7f565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af161326a565b612b0d6004600084815260200190815260200160002054612f1f565b9050919050565b60008054905090565b612b25611786565b15612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c906141a2565b60405180910390fd5b565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8d612736565b8786866040518563ffffffff1660e01b8152600401612baf9493929190613f9a565b602060405180830381600087803b158015612bc957600080fd5b505af1925050508015612bfa57506040513d601f19601f82011682018060405250810190612bf791906138cd565b60015b612c74573d8060008114612c2a576040519150601f19603f3d011682016040523d82523d6000602084013e612c2f565b606091505b50600081511415612c6c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ccf61326a565b612ce0612cdb83612747565b612f1f565b9050919050565b606060118054612cf6906145e7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d22906145e7565b8015612d6f5780601f10612d4457610100808354040283529160200191612d6f565b820191906000526020600020905b815481529060010190602001808311612d5257829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612dbd57600184039350600a81066030018453600a8104905080612db857612dbd565b612d92565b50828103602084039350808452505050919050565b60008082905060005b8451811015612e1d57612e0882868381518110612dfb57612dfa614715565b5b6020026020010151612fd5565b91508080612e159061464a565b915050612ddb565b508091505092915050565b612e328383613000565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ec057600080549050600083820390505b612e726000868380600101945086612b67565b612ea8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612e5f578160005414612ebd57600080fd5b50505b505050565b60009392505050565b600033905090565b612ede611786565b612f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f14906140a2565b60405180910390fd5b565b612f2761326a565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310612fed57612fe882846131bd565b612ff8565b612ff783836131bd565b5b905092915050565b6000805490506000821415613041576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61304e6000848385612880565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130c5836130b66000866000612886565b6130bf856131d4565b176128ae565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461316657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061312b565b5060008214156131a2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506131b860008483856128d9565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131f0906145e7565b90600052602060002090601f0160209004810192826132125760008555613259565b82601f1061322b57805160ff1916838001178555613259565b82800160010185558215613259579182015b8281111561325857825182559160200191906001019061323d565b5b50905061326691906132b9565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156132d25760008160009055506001016132ba565b5090565b60006132e96132e48461433d565b614318565b90508281526020810184848401111561330557613304614782565b5b6133108482856145a5565b509392505050565b600061332b6133268461436e565b614318565b90508281526020810184848401111561334757613346614782565b5b6133528482856145a5565b509392505050565b60008135905061336981614c36565b92915050565b60008083601f84011261338557613384614778565b5b8235905067ffffffffffffffff8111156133a2576133a1614773565b5b6020830191508360208202830111156133be576133bd61477d565b5b9250929050565b60008083601f8401126133db576133da614778565b5b8235905067ffffffffffffffff8111156133f8576133f7614773565b5b6020830191508360208202830111156134145761341361477d565b5b9250929050565b60008083601f84011261343157613430614778565b5b8235905067ffffffffffffffff81111561344e5761344d614773565b5b60208301915083602082028301111561346a5761346961477d565b5b9250929050565b60008135905061348081614c4d565b92915050565b60008135905061349581614c64565b92915050565b6000813590506134aa81614c7b565b92915050565b6000815190506134bf81614c7b565b92915050565b600082601f8301126134da576134d9614778565b5b81356134ea8482602086016132d6565b91505092915050565b600082601f83011261350857613507614778565b5b8135613518848260208601613318565b91505092915050565b60008135905061353081614c92565b92915050565b60006020828403121561354c5761354b61478c565b5b600061355a8482850161335a565b91505092915050565b6000806040838503121561357a5761357961478c565b5b60006135888582860161335a565b92505060206135998582860161335a565b9150509250929050565b6000806000606084860312156135bc576135bb61478c565b5b60006135ca8682870161335a565b93505060206135db8682870161335a565b92505060406135ec86828701613521565b9150509250925092565b600080600080608085870312156136105761360f61478c565b5b600061361e8782880161335a565b945050602061362f8782880161335a565b935050604061364087828801613521565b925050606085013567ffffffffffffffff81111561366157613660614787565b5b61366d878288016134c5565b91505092959194509250565b600080604083850312156136905761368f61478c565b5b600061369e8582860161335a565b92505060206136af85828601613471565b9150509250929050565b600080604083850312156136d0576136cf61478c565b5b60006136de8582860161335a565b92505060206136ef85828601613521565b9150509250929050565b6000806000606084860312156137125761371161478c565b5b60006137208682870161335a565b935050602061373186828701613521565b925050604061374286828701613521565b9150509250925092565b6000806000604084860312156137655761376461478c565b5b600084013567ffffffffffffffff81111561378357613782614787565b5b61378f8682870161336f565b935093505060206137a286828701613521565b9150509250925092565b600080602083850312156137c3576137c261478c565b5b600083013567ffffffffffffffff8111156137e1576137e0614787565b5b6137ed858286016133c5565b92509250509250929050565b600080602083850312156138105761380f61478c565b5b600083013567ffffffffffffffff81111561382e5761382d614787565b5b61383a8582860161341b565b92509250509250929050565b60006020828403121561385c5761385b61478c565b5b600061386a84828501613471565b91505092915050565b6000602082840312156138895761388861478c565b5b600061389784828501613486565b91505092915050565b6000602082840312156138b6576138b561478c565b5b60006138c48482850161349b565b91505092915050565b6000602082840312156138e3576138e261478c565b5b60006138f1848285016134b0565b91505092915050565b6000602082840312156139105761390f61478c565b5b600082013567ffffffffffffffff81111561392e5761392d614787565b5b61393a848285016134f3565b91505092915050565b6000602082840312156139595761395861478c565b5b600061396784828501613521565b91505092915050565b6000806000604084860312156139895761398861478c565b5b600061399786828701613521565b935050602084013567ffffffffffffffff8111156139b8576139b7614787565b5b6139c4868287016133c5565b92509250509250925092565b60006139dc8383613e5a565b60808301905092915050565b60006139f48383613f13565b60208301905092915050565b613a0981614504565b82525050565b613a1881614504565b82525050565b613a2f613a2a82614504565b614693565b82525050565b6000613a40826143bf565b613a4a8185614405565b9350613a558361439f565b8060005b83811015613a86578151613a6d88826139d0565b9750613a78836143eb565b925050600181019050613a59565b5085935050505092915050565b6000613a9e826143ca565b613aa88185614416565b9350613ab3836143af565b8060005b83811015613ae4578151613acb88826139e8565b9750613ad6836143f8565b925050600181019050613ab7565b5085935050505092915050565b613afa81614516565b82525050565b613b0981614516565b82525050565b613b1881614522565b82525050565b6000613b29826143d5565b613b338185614427565b9350613b438185602086016145b4565b613b4c81614791565b840191505092915050565b6000613b62826143e0565b613b6c8185614438565b9350613b7c8185602086016145b4565b613b8581614791565b840191505092915050565b6000613b9b826143e0565b613ba58185614449565b9350613bb58185602086016145b4565b80840191505092915050565b6000613bce602583614438565b9150613bd9826147af565b604082019050919050565b6000613bf1601483614438565b9150613bfc826147fe565b602082019050919050565b6000613c14601f83614438565b9150613c1f82614827565b602082019050919050565b6000613c37602683614438565b9150613c4282614850565b604082019050919050565b6000613c5a602c83614438565b9150613c658261489f565b604082019050919050565b6000613c7d601b83614438565b9150613c88826148ee565b602082019050919050565b6000613ca0601f83614438565b9150613cab82614917565b602082019050919050565b6000613cc3602383614438565b9150613cce82614940565b604082019050919050565b6000613ce6601d83614438565b9150613cf18261498f565b602082019050919050565b6000613d09601083614438565b9150613d14826149b8565b602082019050919050565b6000613d2c601c83614438565b9150613d37826149e1565b602082019050919050565b6000613d4f602583614438565b9150613d5a82614a0a565b604082019050919050565b6000613d72602083614438565b9150613d7d82614a59565b602082019050919050565b6000613d95602483614438565b9150613da082614a82565b604082019050919050565b6000613db8602683614438565b9150613dc382614ad1565b604082019050919050565b6000613ddb603183614438565b9150613de682614b20565b604082019050919050565b6000613dfe602483614438565b9150613e0982614b6f565b604082019050919050565b6000613e21601e83614438565b9150613e2c82614bbe565b602082019050919050565b6000613e44602a83614438565b9150613e4f82614be7565b604082019050919050565b608082016000820151613e706000850182613a00565b506020820151613e836020850182613f31565b506040820151613e966040850182613af1565b506060820151613ea96060850182613f04565b50505050565b608082016000820151613ec56000850182613a00565b506020820151613ed86020850182613f31565b506040820151613eeb6040850182613af1565b506060820151613efe6060850182613f04565b50505050565b613f0d81614578565b82525050565b613f1c81614587565b82525050565b613f2b81614587565b82525050565b613f3a81614591565b82525050565b6000613f4c8284613a1e565b60148201915081905092915050565b6000613f678285613b90565b9150613f738284613b90565b91508190509392505050565b6000602082019050613f946000830184613a0f565b92915050565b6000608082019050613faf6000830187613a0f565b613fbc6020830186613a0f565b613fc96040830185613f22565b8181036060830152613fdb8184613b1e565b905095945050505050565b600060208201905081810360008301526140008184613a35565b905092915050565b600060208201905081810360008301526140228184613a93565b905092915050565b600060208201905061403f6000830184613b00565b92915050565b600060208201905061405a6000830184613b0f565b92915050565b6000602082019050818103600083015261407a8184613b57565b905092915050565b6000602082019050818103600083015261409b81613bc1565b9050919050565b600060208201905081810360008301526140bb81613be4565b9050919050565b600060208201905081810360008301526140db81613c07565b9050919050565b600060208201905081810360008301526140fb81613c2a565b9050919050565b6000602082019050818103600083015261411b81613c4d565b9050919050565b6000602082019050818103600083015261413b81613c70565b9050919050565b6000602082019050818103600083015261415b81613c93565b9050919050565b6000602082019050818103600083015261417b81613cb6565b9050919050565b6000602082019050818103600083015261419b81613cd9565b9050919050565b600060208201905081810360008301526141bb81613cfc565b9050919050565b600060208201905081810360008301526141db81613d1f565b9050919050565b600060208201905081810360008301526141fb81613d42565b9050919050565b6000602082019050818103600083015261421b81613d65565b9050919050565b6000602082019050818103600083015261423b81613d88565b9050919050565b6000602082019050818103600083015261425b81613dab565b9050919050565b6000602082019050818103600083015261427b81613dce565b9050919050565b6000602082019050818103600083015261429b81613df1565b9050919050565b600060208201905081810360008301526142bb81613e14565b9050919050565b600060208201905081810360008301526142db81613e37565b9050919050565b60006080820190506142f76000830184613eaf565b92915050565b60006020820190506143126000830184613f22565b92915050565b6000614322614333565b905061432e8282614619565b919050565b6000604051905090565b600067ffffffffffffffff82111561435857614357614744565b5b61436182614791565b9050602081019050919050565b600067ffffffffffffffff82111561438957614388614744565b5b61439282614791565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061445f82614587565b915061446a83614587565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561449f5761449e6146b7565b5b828201905092915050565b60006144b582614587565b91506144c083614587565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144f9576144f86146b7565b5b828202905092915050565b600061450f82614558565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156145d25780820151818401526020810190506145b7565b838111156145e1576000848401525b50505050565b600060028204905060018216806145ff57607f821691505b60208210811415614613576146126146e6565b5b50919050565b61462282614791565b810181811067ffffffffffffffff8211171561464157614640614744565b5b80604052505050565b600061465582614587565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614688576146876146b7565b5b600182019050919050565b600061469e826146a5565b9050919050565b60006146b0826147a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6d696e7457686974656c6973743a204e6f7420656e6f75676820746f6b656e7360008201527f206c656674000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f6d696e745649503a204e6f7420656e6f75676820746f6b656e73206c65667400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d696e7457686974656c6973743a20457863656564656420746865206c696d6960008201527f74207065722077616c6c65740000000000000000000000000000000000000000602082015250565b7f6d696e743a204e6f7420656e6f7567682065746865722073656e740000000000600082015250565b7f6d696e745649503a20564950206d696e74206973206e6f742061637469766500600082015250565b7f6d696e743a20457863656564656420746865206c696d6974207065722077616c60008201527f6c65740000000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e74574c3a20574c206d696e74206973206e6f7420616374697665000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f6d696e743a204e6f7420656e6f75676820746f6b656e73206c65667400000000600082015250565b7f61697244726f703a204e6f7420656e6f75676820746f6b656e7320746f20616960008201527f7264726f70000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d696e7457686974656c6973743a204e6f7420656e6f7567682065746865722060008201527f73656e7400000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e745649503a20457863656564656420746865206c696d6974207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f77697468647261773a20636f6e74726163742062616c616e6365206d7573742060008201527f62652067726561746572207468616e2030000000000000000000000000000000602082015250565b7f6d696e745649503a2061646472657373206973206e6f74206f6e20776869746560008201527f6c69737400000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e745649503a204e6f7420656e6f7567682065746865722073656e740000600082015250565b7f6d696e7457686974656c6973743a2061646472657373206973206e6f74206f6e60008201527f2077686974656c69737400000000000000000000000000000000000000000000602082015250565b614c3f81614504565b8114614c4a57600080fd5b50565b614c5681614516565b8114614c6157600080fd5b50565b614c6d81614522565b8114614c7857600080fd5b50565b614c848161452c565b8114614c8f57600080fd5b50565b614c9b81614587565b8114614ca657600080fd5b5056fea2646970667358221220f3d0c404c500e0e0de6b900839b5d965f60faa31f29889490e6eda6d6427569964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
-----Decoded View---------------
Arg [0] : _vipRoot (bytes32): 0x343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
Arg [1] : _wlRoot (bytes32): 0x343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
Arg [1] : 343096fde1ee2813700844cbbb323eebda7f439a590eff0cabe1895d8f37da7b
Deployed Bytecode Sourcemap
75499:5024:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33377:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76479:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77834:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34279:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40770:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40203:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30030:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75970:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76009:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75802:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44409:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79965:98;;;;;;;;;;;;;:::i;:::-;;75600:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75722:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79769:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80273:245;;;;;;;;;;;;;:::i;:::-;;79050:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47330:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75933:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75767:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79869:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80071:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70600:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11291:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35672:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75903:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31214:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14156:103;;;;;;;;;;;;;:::i;:::-;;76049:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78949:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77126:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75869:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74476:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13508:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79573:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34455:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71516:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75640:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76689:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41328:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79379:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75840:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48121:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70013:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75680:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34665:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75562:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76267:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41719:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80171:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14414:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79667:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79477:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78566:375;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33377:639;33462:4;33801:10;33786:25;;:11;:25;;;;:102;;;;33878:10;33863:25;;:11;:25;;;;33786:102;:179;;;;33955:10;33940:25;;:11;:25;;;;33786:179;33766:199;;33377:639;;;:::o;76479:202::-;76544:4;76561:12;76603:10;76586:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76576:39;;;;;;76561:54;;76633:40;76652:6;;76633:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76660:6;;76668:4;76633:18;:40::i;:::-;76626:47;;;76479:202;;;;:::o;77834:724::-;77950:4;77938:16;;:8;;;;;;;;;;;:16;;;77930:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;78047:9;;78018:25;78032:10;78018:13;:25::i;:::-;78007:8;:36;;;;:::i;:::-;:49;;77999:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;78152:10;;78140:8;78124:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;78116:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;78247:8;78237:7;;:18;;;;:::i;:::-;78223:9;:33;;78215:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;78310:12;78352:10;78335:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;78325:39;;;;;;78310:54;;78383:40;78402:6;;78383:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78410:6;;78418:4;78383:18;:40::i;:::-;78375:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;78500:8;78483:13;;:25;;;;;;;:::i;:::-;;;;;;;;78519:31;78529:10;78541:8;78519:9;:31::i;:::-;77919:639;77834:724;;;:::o;34279:100::-;34333:13;34366:5;34359:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34279:100;:::o;40770:218::-;40846:7;40871:16;40879:7;40871;:16::i;:::-;40866:64;;40896:34;;;;;;;;;;;;;;40866:64;40950:15;:24;40966:7;40950:24;;;;;;;;;;;:30;;;;;;;;;;;;40943:37;;40770:218;;;:::o;40203:408::-;40292:13;40308:16;40316:7;40308;:16::i;:::-;40292:32;;40364:5;40341:28;;:19;:17;:19::i;:::-;:28;;;40337:175;;40389:44;40406:5;40413:19;:17;:19::i;:::-;40389:16;:44::i;:::-;40384:128;;40461:35;;;;;;;;;;;;;;40384:128;40337:175;40557:2;40524:15;:24;40540:7;40524:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40595:7;40591:2;40575:28;;40584:5;40575:28;;;;;;;;;;;;40281:330;40203:408;;:::o;30030:323::-;30091:7;30319:15;:13;:15::i;:::-;30304:12;;30288:13;;:28;:46;30281:53;;30030:323;:::o;75970:32::-;;;;:::o;76009:33::-;;;;:::o;75802:29::-;;;;;;;;;;;;;:::o;44409:2825::-;44551:27;44581;44600:7;44581:18;:27::i;:::-;44551:57;;44666:4;44625:45;;44641:19;44625:45;;;44621:86;;44679:28;;;;;;;;;;;;;;44621:86;44721:27;44750:23;44777:35;44804:7;44777:26;:35::i;:::-;44720:92;;;;44912:68;44937:15;44954:4;44960:19;:17;:19::i;:::-;44912:24;:68::i;:::-;44907:180;;45000:43;45017:4;45023:19;:17;:19::i;:::-;45000:16;:43::i;:::-;44995:92;;45052:35;;;;;;;;;;;;;;44995:92;44907:180;45118:1;45104:16;;:2;:16;;;45100:52;;;45129:23;;;;;;;;;;;;;;45100:52;45165:43;45187:4;45193:2;45197:7;45206:1;45165:21;:43::i;:::-;45301:15;45298:160;;;45441:1;45420:19;45413:30;45298:160;45838:18;:24;45857:4;45838:24;;;;;;;;;;;;;;;;45836:26;;;;;;;;;;;;45907:18;:22;45926:2;45907:22;;;;;;;;;;;;;;;;45905:24;;;;;;;;;;;46229:146;46266:2;46315:45;46330:4;46336:2;46340:19;46315:14;:45::i;:::-;26429:8;46287:73;46229:18;:146::i;:::-;46200:17;:26;46218:7;46200:26;;;;;;;;;;;:175;;;;46546:1;26429:8;46495:19;:47;:52;46491:627;;;46568:19;46600:1;46590:7;:11;46568:33;;46757:1;46723:17;:30;46741:11;46723:30;;;;;;;;;;;;:35;46719:384;;;46861:13;;46846:11;:28;46842:242;;47041:19;47008:17;:30;47026:11;47008:30;;;;;;;;;;;:52;;;;46842:242;46719:384;46549:569;46491:627;47165:7;47161:2;47146:27;;47155:4;47146:27;;;;;;;;;;;;47184:42;47205:4;47211:2;47215:7;47224:1;47184:20;:42::i;:::-;44540:2694;;;44409:2825;;;:::o;79965:98::-;13394:13;:11;:13::i;:::-;80023:8:::1;:6;:8::i;:::-;:32;;80047:8;:6;:8::i;:::-;80023:32;;;80034:10;:8;:10::i;:::-;80023:32;79965:98::o:0;75600:33::-;;;;:::o;75722:36::-;;;;:::o;79769:92::-;13394:13;:11;:13::i;:::-;79847:6:::1;79836:8;:17;;;;79769:92:::0;:::o;80273:245::-;13394:13;:11;:13::i;:::-;80355:1:::1;80331:21;:25;80323:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;80422:15;80440:21;80422:39;;80481:10;80473:28;;:37;80502:7;80473:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;80312:206;80273:245::o:0;79050:97::-;13394:13;:11;:13::i;:::-;79131:8:::1;79121:7;:18;;;;79050:97:::0;:::o;47330:193::-;47476:39;47493:4;47499:2;47503:7;47476:39;;;;;;;;;;;;:16;:39::i;:::-;47330:193;;;:::o;75933:30::-;;;;:::o;75767:28::-;;;;;;;;;;;;;:::o;79869:88::-;13394:13;:11;:13::i;:::-;79945:4:::1;79933:9;:16;;;;79869:88:::0;:::o;80071:92::-;13394:13;:11;:13::i;:::-;80151:4:::1;80141:7;:14;;;;;;;;;;;;:::i;:::-;;80071:92:::0;:::o;70600:528::-;70744:23;70810:22;70835:8;;:15;;70810:40;;70865:34;70923:14;70902:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;70865:73;;70958:9;70953:125;70974:14;70969:1;:19;70953:125;;71030:32;71050:8;;71059:1;71050:11;;;;;;;:::i;:::-;;;;;;;;71030:19;:32::i;:::-;71014:10;71025:1;71014:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;70990:3;;;;;70953:125;;;;71099:10;71092:17;;;;70600:528;;;;:::o;11291:86::-;11338:4;11362:7;;;;;;;;;;;11355:14;;11291:86;:::o;35672:152::-;35744:7;35787:27;35806:7;35787:18;:27::i;:::-;35764:52;;35672:152;;;:::o;75903:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31214:233::-;31286:7;31327:1;31310:19;;:5;:19;;;31306:60;;;31338:28;;;;;;;;;;;;;;31306:60;25373:13;31384:18;:25;31403:5;31384:25;;;;;;;;;;;;;;;;:55;31377:62;;31214:233;;;:::o;14156:103::-;13394:13;:11;:13::i;:::-;14221:30:::1;14248:1;14221:18;:30::i;:::-;14156:103::o:0;76049:33::-;;;;:::o;78949:93::-;13394:13;:11;:13::i;:::-;79027:7:::1;79018:6;:16;;;;78949:93:::0;:::o;77126:700::-;77237:4;77224:17;;:9;;;;;;;;;;;:17;;;77216:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;77336:9;;77307:25;77321:10;77307:13;:25::i;:::-;77296:8;:36;;;;:::i;:::-;:49;;77288:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;77435:10;;77423:8;77407:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;77399:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;77525:8;77514;;:19;;;;:::i;:::-;77500:9;:34;;77492:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;77582:12;77624:10;77607:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;77597:39;;;;;;77582:54;;77655:41;77674:6;;77655:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77682:7;;77691:4;77655:18;:41::i;:::-;77647:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;77768:8;77750:14;;:26;;;;;;;:::i;:::-;;;;;;;;77787:31;77797:10;77809:8;77787:9;:31::i;:::-;77205:621;77126:700;;;:::o;75869:21::-;;;;:::o;74476:900::-;74554:16;74608:19;74642:25;74682:22;74707:16;74717:5;74707:9;:16::i;:::-;74682:41;;74738:25;74780:14;74766:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74738:57;;74810:31;;:::i;:::-;74861:9;74873:15;:13;:15::i;:::-;74861:27;;74856:472;74905:14;74890:11;:29;74856:472;;74957:15;74970:1;74957:12;:15::i;:::-;74945:27;;74995:9;:16;;;74991:73;;;75036:8;;74991:73;75112:1;75086:28;;:9;:14;;;:28;;;75082:111;;75159:9;:14;;;75139:34;;75082:111;75236:5;75215:26;;:17;:26;;;75211:102;;;75292:1;75266:8;75275:13;;;;;;75266:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;75211:102;74856:472;74921:3;;;;;74856:472;;;;75349:8;75342:15;;;;;;;74476:900;;;:::o;13508:87::-;13554:7;13581:6;;;;;;;;;;;13574:13;;13508:87;:::o;79573:86::-;13394:13;:11;:13::i;:::-;79645:6:::1;79637:5;:14;;;;79573:86:::0;:::o;34455:104::-;34511:13;34544:7;34537:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34455:104;:::o;71516:2513::-;71659:16;71726:4;71717:5;:13;71713:45;;71739:19;;;;;;;;;;;;;;71713:45;71773:19;71807:17;71827:14;:12;:14::i;:::-;71807:34;;71927:15;:13;:15::i;:::-;71919:5;:23;71915:87;;;71971:15;:13;:15::i;:::-;71963:23;;71915:87;72078:9;72071:4;:16;72067:73;;;72115:9;72108:16;;72067:73;72154:25;72182:16;72192:5;72182:9;:16::i;:::-;72154:44;;72376:4;72368:5;:12;72364:278;;;72401:19;72430:5;72423:4;:12;72401:34;;72472:17;72458:11;:31;72454:111;;;72534:11;72514:31;;72454:111;72382:198;72364:278;;;72625:1;72605:21;;72364:278;72656:25;72698:17;72684:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72656:60;;72756:1;72735:17;:22;72731:78;;;72785:8;72778:15;;;;;;;;72731:78;72953:31;72987:26;73007:5;72987:19;:26::i;:::-;72953:60;;73028:25;73273:9;:16;;;73268:92;;73330:9;:14;;;73310:34;;73268:92;73379:9;73391:5;73379:17;;73374:478;73403:4;73398:1;:9;;:45;;;;;73426:17;73411:11;:32;;73398:45;73374:478;;;73481:15;73494:1;73481:12;:15::i;:::-;73469:27;;73519:9;:16;;;73515:73;;;73560:8;;73515:73;73636:1;73610:28;;:9;:14;;;:28;;;73606:111;;73683:9;:14;;;73663:34;;73606:111;73760:5;73739:26;;:17;:26;;;73735:102;;;73816:1;73790:8;73799:13;;;;;;73790:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73735:102;73374:478;73445:3;;;;;73374:478;;;;73954:11;73944:8;73937:29;74002:8;73995:15;;;;;;;;71516:2513;;;;;;:::o;75640:33::-;;;;:::o;76689:429::-;10896:19;:17;:19::i;:::-;76811:9:::1;;76782:25;76796:10;76782:13;:25::i;:::-;76771:8;:36;;;;:::i;:::-;:49;;76763:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;76907:10;;76895:8;76879:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;76871:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;76991:8;76983:5;;:16;;;;:::i;:::-;76969:9;:31;;76961:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;77060:8;77045:11;;:23;;;;;;;:::i;:::-;;;;;;;;77079:31;77089:10;77101:8;77079:9;:31::i;:::-;76689:429:::0;:::o;41328:234::-;41475:8;41423:18;:39;41442:19;:17;:19::i;:::-;41423:39;;;;;;;;;;;;;;;:49;41463:8;41423:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41535:8;41499:55;;41514:19;:17;:19::i;:::-;41499:55;;;41545:8;41499:55;;;;;;:::i;:::-;;;;;;;;41328:234;;:::o;79379:90::-;13394:13;:11;:13::i;:::-;79456:5:::1;79444:9;;:17;;;;;;;;;;;;;;;;;;79379:90:::0;:::o;75840:22::-;;;;:::o;48121:407::-;48296:31;48309:4;48315:2;48319:7;48296:12;:31::i;:::-;48360:1;48342:2;:14;;;:19;48338:183;;48381:56;48412:4;48418:2;48422:7;48431:5;48381:30;:56::i;:::-;48376:145;;48465:40;;;;;;;;;;;;;;48376:145;48338:183;48121:407;;;;:::o;70013:428::-;70097:21;;:::i;:::-;70131:31;;:::i;:::-;70187:15;:13;:15::i;:::-;70177:7;:25;:54;;;;70217:14;:12;:14::i;:::-;70206:7;:25;;70177:54;70173:103;;;70255:9;70248:16;;;;;70173:103;70298:21;70311:7;70298:12;:21::i;:::-;70286:33;;70334:9;:16;;;70330:65;;;70374:9;70367:16;;;;;70330:65;70412:21;70425:7;70412:12;:21::i;:::-;70405:28;;;70013:428;;;;:::o;75680:35::-;;;;:::o;34665:318::-;34738:13;34769:16;34777:7;34769;:16::i;:::-;34764:59;;34794:29;;;;;;;;;;;;;;34764:59;34836:21;34860:10;:8;:10::i;:::-;34836:34;;34913:1;34894:7;34888:21;:26;;:87;;;;;;;;;;;;;;;;;34941:7;34950:18;34960:7;34950:9;:18::i;:::-;34924:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34888:87;34881:94;;;34665:318;;;:::o;75562:31::-;;;;:::o;76267:204::-;76333:4;76350:12;76392:10;76375:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76365:39;;;;;;76350:54;;76422:41;76441:6;;76422:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76449:7;;76458:4;76422:18;:41::i;:::-;76415:48;;;76267:204;;;;:::o;41719:164::-;41816:4;41840:18;:25;41859:5;41840:25;;;;;;;;;;;;;;;:35;41866:8;41840:35;;;;;;;;;;;;;;;;;;;;;;;;;41833:42;;41719:164;;;;:::o;80171:94::-;13394:13;:11;:13::i;:::-;80253:4:::1;80240:10;:17;;;;80171:94:::0;:::o;14414:201::-;13394:13;:11;:13::i;:::-;14523:1:::1;14503:22;;:8;:22;;;;14495:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14579:28;14598:8;14579:18;:28::i;:::-;14414:201:::0;:::o;79667:90::-;13394:13;:11;:13::i;:::-;79743:6:::1;79733:7;:16;;;;79667:90:::0;:::o;79477:88::-;13394:13;:11;:13::i;:::-;79552:5:::1;79541:8;;:16;;;;;;;;;;;;;;;;;;79477:88:::0;:::o;78566:375::-;13394:13;:11;:13::i;:::-;78657:11:::1;78671:5;;:12;;78657:26;;78738:10;;78730:3;78719:8;:14;;;;:::i;:::-;78702:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:46;;78694:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;78830:3;78819:8;:14;;;;:::i;:::-;78801;;:32;;;;;;;:::i;:::-;;;;;;;;78849:9;78844:90;78868:3;78864:1;:7;78844:90;;;78893:29;78903:5;;78909:1;78903:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;78913;78893:9;:29::i;:::-;78873:3;;;;;:::i;:::-;;;;78844:90;;;;78646:295;78566:375:::0;;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;31529:178::-;31590:7;25373:13;25511:2;31618:18;:25;31637:5;31618:25;;;;;;;;;;;;;;;;:50;;31617:82;31610:89;;31529:178;;;:::o;58281:112::-;58358:27;58368:2;58372:8;58358:27;;;;;;;;;;;;:9;:27::i;:::-;58281:112;;:::o;42141:282::-;42206:4;42262:7;42243:15;:13;:15::i;:::-;:26;;:66;;;;;42296:13;;42286:7;:23;42243:66;:153;;;;;42395:1;26149:8;42347:17;:26;42365:7;42347:26;;;;;;;;;;;;:44;:49;42243:153;42223:173;;42141:282;;;:::o;64449:105::-;64509:7;64536:10;64529:17;;64449:105;:::o;79263:93::-;79320:7;79347:1;79340:8;;79263:93;:::o;36827:1275::-;36894:7;36914:12;36929:7;36914:22;;36997:4;36978:15;:13;:15::i;:::-;:23;36974:1061;;37031:13;;37024:4;:20;37020:1015;;;37069:14;37086:17;:23;37104:4;37086:23;;;;;;;;;;;;37069:40;;37203:1;26149:8;37175:6;:24;:29;37171:845;;;37840:113;37857:1;37847:6;:11;37840:113;;;37900:17;:25;37918:6;;;;;;;37900:25;;;;;;;;;;;;37891:34;;37840:113;;;37986:6;37979:13;;;;;;37171:845;37046:989;37020:1015;36974:1061;38063:31;;;;;;;;;;;;;;36827:1275;;;;:::o;43304:485::-;43406:27;43435:23;43476:38;43517:15;:24;43533:7;43517:24;;;;;;;;;;;43476:65;;43694:18;43671:41;;43751:19;43745:26;43726:45;;43656:126;43304:485;;;:::o;42532:659::-;42681:11;42846:16;42839:5;42835:28;42826:37;;43006:16;42995:9;42991:32;42978:45;;43156:15;43145:9;43142:30;43134:5;43123:9;43120:20;43117:56;43107:66;;42532:659;;;;;:::o;49190:159::-;;;;;:::o;63758:311::-;63893:7;63913:16;26553:3;63939:19;:41;;63913:68;;26553:3;64007:31;64018:4;64024:2;64028:9;64007:10;:31::i;:::-;63999:40;;:62;;63992:69;;;63758:311;;;;;:::o;38650:450::-;38730:14;38898:16;38891:5;38887:28;38878:37;;39075:5;39061:11;39036:23;39032:41;39029:52;39022:5;39019:63;39009:73;;38650:450;;;;:::o;50014:158::-;;;;;:::o;13673:132::-;13748:12;:10;:12::i;:::-;13737:23;;:7;:5;:7::i;:::-;:23;;;13729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13673:132::o;11887:118::-;10896:19;:17;:19::i;:::-;11957:4:::1;11947:7;;:14;;;;;;;;;;;;;;;;;;11977:20;11984:12;:10;:12::i;:::-;11977:20;;;;;;:::i;:::-;;;;;;;;11887:118::o:0;12146:120::-;11155:16;:14;:16::i;:::-;12215:5:::1;12205:7;;:15;;;;;;;;;;;;;;;;;;12236:22;12245:12;:10;:12::i;:::-;12236:22;;;;;;:::i;:::-;;;;;;;;12146:120::o:0;14775:191::-;14849:16;14868:6;;;;;;;;;;;14849:25;;14894:8;14885:6;;:17;;;;;;;;;;;;;;;;;;14949:8;14918:40;;14939:8;14918:40;;;;;;;;;;;;14838:128;14775:191;:::o;36275:161::-;36343:21;;:::i;:::-;36384:44;36403:17;:24;36421:5;36403:24;;;;;;;;;;;;36384:18;:44::i;:::-;36377:51;;36275:161;;;:::o;29717:103::-;29772:7;29799:13;;29792:20;;29717:103;:::o;11450:108::-;11521:8;:6;:8::i;:::-;11520:9;11512:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;11450:108::o;50612:716::-;50775:4;50821:2;50796:45;;;50842:19;:17;:19::i;:::-;50863:4;50869:7;50878:5;50796:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50792:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51096:1;51079:6;:13;:18;51075:235;;;51125:40;;;;;;;;;;;;;;51075:235;51268:6;51262:13;51253:6;51249:2;51245:15;51238:38;50792:529;50965:54;;;50955:64;;;:6;:64;;;;50948:71;;;50612:716;;;;;;:::o;36013:166::-;36083:21;;:::i;:::-;36124:47;36143:27;36162:7;36143:18;:27::i;:::-;36124:18;:47::i;:::-;36117:54;;36013:166;;;:::o;79155:100::-;79207:13;79240:7;79233:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79155:100;:::o;64656:1745::-;64721:17;65155:4;65148;65142:11;65138:22;65247:1;65241:4;65234:15;65322:4;65319:1;65315:12;65308:19;;65404:1;65399:3;65392:14;65508:3;65747:5;65729:428;65755:1;65729:428;;;65795:1;65790:3;65786:11;65779:18;;65966:2;65960:4;65956:13;65952:2;65948:22;65943:3;65935:36;66060:2;66054:4;66050:13;66042:21;;66127:4;66117:25;;66135:5;;66117:25;65729:428;;;65733:21;66196:3;66191;66187:13;66311:4;66306:3;66302:14;66295:21;;66376:6;66371:3;66364:19;64760:1634;;;64656:1745;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;57508:689::-;57639:19;57645:2;57649:8;57639:5;:19::i;:::-;57718:1;57700:2;:14;;;:19;57696:483;;57740:11;57754:13;;57740:27;;57786:13;57808:8;57802:3;:14;57786:30;;57835:233;57866:62;57905:1;57909:2;57913:7;;;;;;57922:5;57866:30;:62::i;:::-;57861:167;;57964:40;;;;;;;;;;;;;;57861:167;58063:3;58055:5;:11;57835:233;;58150:3;58133:13;;:20;58129:34;;58155:8;;;58129:34;57721:458;;57696:483;57508:689;;;:::o;63459:147::-;63596:6;63459:147;;;;;:::o;9404:98::-;9457:7;9484:10;9477:17;;9404:98;:::o;11635:108::-;11702:8;:6;:8::i;:::-;11694:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;11635:108::o;38201:366::-;38267:31;;:::i;:::-;38344:6;38311:9;:14;;:41;;;;;;;;;;;26032:3;38397:6;:33;;38363:9;:24;;:68;;;;;;;;;;;38489:1;26149:8;38461:6;:24;:29;;38442:9;:16;;:48;;;;;;;;;;;26553:3;38530:6;:28;;38501:9;:19;;:58;;;;;;;;;;;38201:366;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;51790:2966::-;51863:20;51886:13;;51863:36;;51926:1;51914:8;:13;51910:44;;;51936:18;;;;;;;;;;;;;;51910:44;51967:61;51997:1;52001:2;52005:12;52019:8;51967:21;:61::i;:::-;52511:1;25511:2;52481:1;:26;;52480:32;52468:8;:45;52442:18;:22;52461:2;52442:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;52790:139;52827:2;52881:33;52904:1;52908:2;52912:1;52881:14;:33::i;:::-;52848:30;52869:8;52848:20;:30::i;:::-;:66;52790:18;:139::i;:::-;52756:17;:31;52774:12;52756:31;;;;;;;;;;;:173;;;;52946:16;52977:11;53006:8;52991:12;:23;52977:37;;53527:16;53523:2;53519:25;53507:37;;53899:12;53859:8;53818:1;53756:25;53697:1;53636;53609:335;54270:1;54256:12;54252:20;54210:346;54311:3;54302:7;54299:16;54210:346;;54529:7;54519:8;54516:1;54489:25;54486:1;54483;54478:59;54364:1;54355:7;54351:15;54340:26;;54210:346;;;54214:77;54601:1;54589:8;:13;54585:45;;;54611:19;;;;;;;;;;;;;;54585:45;54663:3;54647:13;:19;;;;52216:2462;;54688:60;54717:1;54721:2;54725:12;54739:8;54688:20;:60::i;:::-;51852:2904;51790:2966;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;39202:324::-;39272:14;39505:1;39495:8;39492:15;39466:24;39462:46;39452:56;;39202:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2185:::-;2258:8;2268:6;2318:3;2311:4;2303:6;2299:17;2295:27;2285:122;;2326:79;;:::i;:::-;2285:122;2439:6;2426:20;2416:30;;2469:18;2461:6;2458:30;2455:117;;;2491:79;;:::i;:::-;2455:117;2605:4;2597:6;2593:17;2581:29;;2659:3;2651:4;2643:6;2639:17;2629:8;2625:32;2622:41;2619:128;;;2666:79;;:::i;:::-;2619:128;2185:568;;;;;:::o;2759:133::-;2802:5;2840:6;2827:20;2818:29;;2856:30;2880:5;2856:30;:::i;:::-;2759:133;;;;:::o;2898:139::-;2944:5;2982:6;2969:20;2960:29;;2998:33;3025:5;2998:33;:::i;:::-;2898:139;;;;:::o;3043:137::-;3088:5;3126:6;3113:20;3104:29;;3142:32;3168:5;3142:32;:::i;:::-;3043:137;;;;:::o;3186:141::-;3242:5;3273:6;3267:13;3258:22;;3289:32;3315:5;3289:32;:::i;:::-;3186:141;;;;:::o;3346:338::-;3401:5;3450:3;3443:4;3435:6;3431:17;3427:27;3417:122;;3458:79;;:::i;:::-;3417:122;3575:6;3562:20;3600:78;3674:3;3666:6;3659:4;3651:6;3647:17;3600:78;:::i;:::-;3591:87;;3407:277;3346:338;;;;:::o;3704:340::-;3760:5;3809:3;3802:4;3794:6;3790:17;3786:27;3776:122;;3817:79;;:::i;:::-;3776:122;3934:6;3921:20;3959:79;4034:3;4026:6;4019:4;4011:6;4007:17;3959:79;:::i;:::-;3950:88;;3766:278;3704:340;;;;:::o;4050:139::-;4096:5;4134:6;4121:20;4112:29;;4150:33;4177:5;4150:33;:::i;:::-;4050:139;;;;:::o;4195:329::-;4254:6;4303:2;4291:9;4282:7;4278:23;4274:32;4271:119;;;4309:79;;:::i;:::-;4271:119;4429:1;4454:53;4499:7;4490:6;4479:9;4475:22;4454:53;:::i;:::-;4444:63;;4400:117;4195:329;;;;:::o;4530:474::-;4598:6;4606;4655:2;4643:9;4634:7;4630:23;4626:32;4623:119;;;4661:79;;:::i;:::-;4623:119;4781:1;4806:53;4851:7;4842:6;4831:9;4827:22;4806:53;:::i;:::-;4796:63;;4752:117;4908:2;4934:53;4979:7;4970:6;4959:9;4955:22;4934:53;:::i;:::-;4924:63;;4879:118;4530:474;;;;;:::o;5010:619::-;5087:6;5095;5103;5152:2;5140:9;5131:7;5127:23;5123:32;5120:119;;;5158:79;;:::i;:::-;5120:119;5278:1;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5249:117;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5533:2;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5504:118;5010:619;;;;;:::o;5635:943::-;5730:6;5738;5746;5754;5803:3;5791:9;5782:7;5778:23;5774:33;5771:120;;;5810:79;;:::i;:::-;5771:120;5930:1;5955:53;6000:7;5991:6;5980:9;5976:22;5955:53;:::i;:::-;5945:63;;5901:117;6057:2;6083:53;6128:7;6119:6;6108:9;6104:22;6083:53;:::i;:::-;6073:63;;6028:118;6185:2;6211:53;6256:7;6247:6;6236:9;6232:22;6211:53;:::i;:::-;6201:63;;6156:118;6341:2;6330:9;6326:18;6313:32;6372:18;6364:6;6361:30;6358:117;;;6394:79;;:::i;:::-;6358:117;6499:62;6553:7;6544:6;6533:9;6529:22;6499:62;:::i;:::-;6489:72;;6284:287;5635:943;;;;;;;:::o;6584:468::-;6649:6;6657;6706:2;6694:9;6685:7;6681:23;6677:32;6674:119;;;6712:79;;:::i;:::-;6674:119;6832:1;6857:53;6902:7;6893:6;6882:9;6878:22;6857:53;:::i;:::-;6847:63;;6803:117;6959:2;6985:50;7027:7;7018:6;7007:9;7003:22;6985:50;:::i;:::-;6975:60;;6930:115;6584:468;;;;;:::o;7058:474::-;7126:6;7134;7183:2;7171:9;7162:7;7158:23;7154:32;7151:119;;;7189:79;;:::i;:::-;7151:119;7309:1;7334:53;7379:7;7370:6;7359:9;7355:22;7334:53;:::i;:::-;7324:63;;7280:117;7436:2;7462:53;7507:7;7498:6;7487:9;7483:22;7462:53;:::i;:::-;7452:63;;7407:118;7058:474;;;;;:::o;7538:619::-;7615:6;7623;7631;7680:2;7668:9;7659:7;7655:23;7651:32;7648:119;;;7686:79;;:::i;:::-;7648:119;7806:1;7831:53;7876:7;7867:6;7856:9;7852:22;7831:53;:::i;:::-;7821:63;;7777:117;7933:2;7959:53;8004:7;7995:6;7984:9;7980:22;7959:53;:::i;:::-;7949:63;;7904:118;8061:2;8087:53;8132:7;8123:6;8112:9;8108:22;8087:53;:::i;:::-;8077:63;;8032:118;7538:619;;;;;:::o;8163:704::-;8258:6;8266;8274;8323:2;8311:9;8302:7;8298:23;8294:32;8291:119;;;8329:79;;:::i;:::-;8291:119;8477:1;8466:9;8462:17;8449:31;8507:18;8499:6;8496:30;8493:117;;;8529:79;;:::i;:::-;8493:117;8642:80;8714:7;8705:6;8694:9;8690:22;8642:80;:::i;:::-;8624:98;;;;8420:312;8771:2;8797:53;8842:7;8833:6;8822:9;8818:22;8797:53;:::i;:::-;8787:63;;8742:118;8163:704;;;;;:::o;8873:559::-;8959:6;8967;9016:2;9004:9;8995:7;8991:23;8987:32;8984:119;;;9022:79;;:::i;:::-;8984:119;9170:1;9159:9;9155:17;9142:31;9200:18;9192:6;9189:30;9186:117;;;9222:79;;:::i;:::-;9186:117;9335:80;9407:7;9398:6;9387:9;9383:22;9335:80;:::i;:::-;9317:98;;;;9113:312;8873:559;;;;;:::o;9438:::-;9524:6;9532;9581:2;9569:9;9560:7;9556:23;9552:32;9549:119;;;9587:79;;:::i;:::-;9549:119;9735:1;9724:9;9720:17;9707:31;9765:18;9757:6;9754:30;9751:117;;;9787:79;;:::i;:::-;9751:117;9900:80;9972:7;9963:6;9952:9;9948:22;9900:80;:::i;:::-;9882:98;;;;9678:312;9438:559;;;;;:::o;10003:323::-;10059:6;10108:2;10096:9;10087:7;10083:23;10079:32;10076:119;;;10114:79;;:::i;:::-;10076:119;10234:1;10259:50;10301:7;10292:6;10281:9;10277:22;10259:50;:::i;:::-;10249:60;;10205:114;10003:323;;;;:::o;10332:329::-;10391:6;10440:2;10428:9;10419:7;10415:23;10411:32;10408:119;;;10446:79;;:::i;:::-;10408:119;10566:1;10591:53;10636:7;10627:6;10616:9;10612:22;10591:53;:::i;:::-;10581:63;;10537:117;10332:329;;;;:::o;10667:327::-;10725:6;10774:2;10762:9;10753:7;10749:23;10745:32;10742:119;;;10780:79;;:::i;:::-;10742:119;10900:1;10925:52;10969:7;10960:6;10949:9;10945:22;10925:52;:::i;:::-;10915:62;;10871:116;10667:327;;;;:::o;11000:349::-;11069:6;11118:2;11106:9;11097:7;11093:23;11089:32;11086:119;;;11124:79;;:::i;:::-;11086:119;11244:1;11269:63;11324:7;11315:6;11304:9;11300:22;11269:63;:::i;:::-;11259:73;;11215:127;11000:349;;;;:::o;11355:509::-;11424:6;11473:2;11461:9;11452:7;11448:23;11444:32;11441:119;;;11479:79;;:::i;:::-;11441:119;11627:1;11616:9;11612:17;11599:31;11657:18;11649:6;11646:30;11643:117;;;11679:79;;:::i;:::-;11643:117;11784:63;11839:7;11830:6;11819:9;11815:22;11784:63;:::i;:::-;11774:73;;11570:287;11355:509;;;;:::o;11870:329::-;11929:6;11978:2;11966:9;11957:7;11953:23;11949:32;11946:119;;;11984:79;;:::i;:::-;11946:119;12104:1;12129:53;12174:7;12165:6;12154:9;12150:22;12129:53;:::i;:::-;12119:63;;12075:117;11870:329;;;;:::o;12205:704::-;12300:6;12308;12316;12365:2;12353:9;12344:7;12340:23;12336:32;12333:119;;;12371:79;;:::i;:::-;12333:119;12491:1;12516:53;12561:7;12552:6;12541:9;12537:22;12516:53;:::i;:::-;12506:63;;12462:117;12646:2;12635:9;12631:18;12618:32;12677:18;12669:6;12666:30;12663:117;;;12699:79;;:::i;:::-;12663:117;12812:80;12884:7;12875:6;12864:9;12860:22;12812:80;:::i;:::-;12794:98;;;;12589:313;12205:704;;;;;:::o;12915:303::-;13046:10;13067:108;13171:3;13163:6;13067:108;:::i;:::-;13207:4;13202:3;13198:14;13184:28;;12915:303;;;;:::o;13224:179::-;13293:10;13314:46;13356:3;13348:6;13314:46;:::i;:::-;13392:4;13387:3;13383:14;13369:28;;13224:179;;;;:::o;13409:108::-;13486:24;13504:5;13486:24;:::i;:::-;13481:3;13474:37;13409:108;;:::o;13523:118::-;13610:24;13628:5;13610:24;:::i;:::-;13605:3;13598:37;13523:118;;:::o;13647:157::-;13752:45;13772:24;13790:5;13772:24;:::i;:::-;13752:45;:::i;:::-;13747:3;13740:58;13647:157;;:::o;13886:980::-;14067:3;14096:85;14175:5;14096:85;:::i;:::-;14197:117;14307:6;14302:3;14197:117;:::i;:::-;14190:124;;14338:87;14419:5;14338:87;:::i;:::-;14448:7;14479:1;14464:377;14489:6;14486:1;14483:13;14464:377;;;14565:6;14559:13;14592:125;14713:3;14698:13;14592:125;:::i;:::-;14585:132;;14740:91;14824:6;14740:91;:::i;:::-;14730:101;;14524:317;14511:1;14508;14504:9;14499:14;;14464:377;;;14468:14;14857:3;14850:10;;14072:794;;;13886:980;;;;:::o;14902:732::-;15021:3;15050:54;15098:5;15050:54;:::i;:::-;15120:86;15199:6;15194:3;15120:86;:::i;:::-;15113:93;;15230:56;15280:5;15230:56;:::i;:::-;15309:7;15340:1;15325:284;15350:6;15347:1;15344:13;15325:284;;;15426:6;15420:13;15453:63;15512:3;15497:13;15453:63;:::i;:::-;15446:70;;15539:60;15592:6;15539:60;:::i;:::-;15529:70;;15385:224;15372:1;15369;15365:9;15360:14;;15325:284;;;15329:14;15625:3;15618:10;;15026:608;;;14902:732;;;;:::o;15640:99::-;15711:21;15726:5;15711:21;:::i;:::-;15706:3;15699:34;15640:99;;:::o;15745:109::-;15826:21;15841:5;15826:21;:::i;:::-;15821:3;15814:34;15745:109;;:::o;15860:118::-;15947:24;15965:5;15947:24;:::i;:::-;15942:3;15935:37;15860:118;;:::o;15984:360::-;16070:3;16098:38;16130:5;16098:38;:::i;:::-;16152:70;16215:6;16210:3;16152:70;:::i;:::-;16145:77;;16231:52;16276:6;16271:3;16264:4;16257:5;16253:16;16231:52;:::i;:::-;16308:29;16330:6;16308:29;:::i;:::-;16303:3;16299:39;16292:46;;16074:270;15984:360;;;;:::o;16350:364::-;16438:3;16466:39;16499:5;16466:39;:::i;:::-;16521:71;16585:6;16580:3;16521:71;:::i;:::-;16514:78;;16601:52;16646:6;16641:3;16634:4;16627:5;16623:16;16601:52;:::i;:::-;16678:29;16700:6;16678:29;:::i;:::-;16673:3;16669:39;16662:46;;16442:272;16350:364;;;;:::o;16720:377::-;16826:3;16854:39;16887:5;16854:39;:::i;:::-;16909:89;16991:6;16986:3;16909:89;:::i;:::-;16902:96;;17007:52;17052:6;17047:3;17040:4;17033:5;17029:16;17007:52;:::i;:::-;17084:6;17079:3;17075:16;17068:23;;16830:267;16720:377;;;;:::o;17103:366::-;17245:3;17266:67;17330:2;17325:3;17266:67;:::i;:::-;17259:74;;17342:93;17431:3;17342:93;:::i;:::-;17460:2;17455:3;17451:12;17444:19;;17103:366;;;:::o;17475:::-;17617:3;17638:67;17702:2;17697:3;17638:67;:::i;:::-;17631:74;;17714:93;17803:3;17714:93;:::i;:::-;17832:2;17827:3;17823:12;17816:19;;17475:366;;;:::o;17847:::-;17989:3;18010:67;18074:2;18069:3;18010:67;:::i;:::-;18003:74;;18086:93;18175:3;18086:93;:::i;:::-;18204:2;18199:3;18195:12;18188:19;;17847:366;;;:::o;18219:::-;18361:3;18382:67;18446:2;18441:3;18382:67;:::i;:::-;18375:74;;18458:93;18547:3;18458:93;:::i;:::-;18576:2;18571:3;18567:12;18560:19;;18219:366;;;:::o;18591:::-;18733:3;18754:67;18818:2;18813:3;18754:67;:::i;:::-;18747:74;;18830:93;18919:3;18830:93;:::i;:::-;18948:2;18943:3;18939:12;18932:19;;18591:366;;;:::o;18963:::-;19105:3;19126:67;19190:2;19185:3;19126:67;:::i;:::-;19119:74;;19202:93;19291:3;19202:93;:::i;:::-;19320:2;19315:3;19311:12;19304:19;;18963:366;;;:::o;19335:::-;19477:3;19498:67;19562:2;19557:3;19498:67;:::i;:::-;19491:74;;19574:93;19663:3;19574:93;:::i;:::-;19692:2;19687:3;19683:12;19676:19;;19335:366;;;:::o;19707:::-;19849:3;19870:67;19934:2;19929:3;19870:67;:::i;:::-;19863:74;;19946:93;20035:3;19946:93;:::i;:::-;20064:2;20059:3;20055:12;20048:19;;19707:366;;;:::o;20079:::-;20221:3;20242:67;20306:2;20301:3;20242:67;:::i;:::-;20235:74;;20318:93;20407:3;20318:93;:::i;:::-;20436:2;20431:3;20427:12;20420:19;;20079:366;;;:::o;20451:::-;20593:3;20614:67;20678:2;20673:3;20614:67;:::i;:::-;20607:74;;20690:93;20779:3;20690:93;:::i;:::-;20808:2;20803:3;20799:12;20792:19;;20451:366;;;:::o;20823:::-;20965:3;20986:67;21050:2;21045:3;20986:67;:::i;:::-;20979:74;;21062:93;21151:3;21062:93;:::i;:::-;21180:2;21175:3;21171:12;21164:19;;20823:366;;;:::o;21195:::-;21337:3;21358:67;21422:2;21417:3;21358:67;:::i;:::-;21351:74;;21434:93;21523:3;21434:93;:::i;:::-;21552:2;21547:3;21543:12;21536:19;;21195:366;;;:::o;21567:::-;21709:3;21730:67;21794:2;21789:3;21730:67;:::i;:::-;21723:74;;21806:93;21895:3;21806:93;:::i;:::-;21924:2;21919:3;21915:12;21908:19;;21567:366;;;:::o;21939:::-;22081:3;22102:67;22166:2;22161:3;22102:67;:::i;:::-;22095:74;;22178:93;22267:3;22178:93;:::i;:::-;22296:2;22291:3;22287:12;22280:19;;21939:366;;;:::o;22311:::-;22453:3;22474:67;22538:2;22533:3;22474:67;:::i;:::-;22467:74;;22550:93;22639:3;22550:93;:::i;:::-;22668:2;22663:3;22659:12;22652:19;;22311:366;;;:::o;22683:::-;22825:3;22846:67;22910:2;22905:3;22846:67;:::i;:::-;22839:74;;22922:93;23011:3;22922:93;:::i;:::-;23040:2;23035:3;23031:12;23024:19;;22683:366;;;:::o;23055:::-;23197:3;23218:67;23282:2;23277:3;23218:67;:::i;:::-;23211:74;;23294:93;23383:3;23294:93;:::i;:::-;23412:2;23407:3;23403:12;23396:19;;23055:366;;;:::o;23427:::-;23569:3;23590:67;23654:2;23649:3;23590:67;:::i;:::-;23583:74;;23666:93;23755:3;23666:93;:::i;:::-;23784:2;23779:3;23775:12;23768:19;;23427:366;;;:::o;23799:::-;23941:3;23962:67;24026:2;24021:3;23962:67;:::i;:::-;23955:74;;24038:93;24127:3;24038:93;:::i;:::-;24156:2;24151:3;24147:12;24140:19;;23799:366;;;:::o;24243:864::-;24392:4;24387:3;24383:14;24479:4;24472:5;24468:16;24462:23;24498:63;24555:4;24550:3;24546:14;24532:12;24498:63;:::i;:::-;24407:164;24663:4;24656:5;24652:16;24646:23;24682:61;24737:4;24732:3;24728:14;24714:12;24682:61;:::i;:::-;24581:172;24837:4;24830:5;24826:16;24820:23;24856:57;24907:4;24902:3;24898:14;24884:12;24856:57;:::i;:::-;24763:160;25010:4;25003:5;24999:16;24993:23;25029:61;25084:4;25079:3;25075:14;25061:12;25029:61;:::i;:::-;24933:167;24361:746;24243:864;;:::o;25185:874::-;25344:4;25339:3;25335:14;25431:4;25424:5;25420:16;25414:23;25450:63;25507:4;25502:3;25498:14;25484:12;25450:63;:::i;:::-;25359:164;25615:4;25608:5;25604:16;25598:23;25634:61;25689:4;25684:3;25680:14;25666:12;25634:61;:::i;:::-;25533:172;25789:4;25782:5;25778:16;25772:23;25808:57;25859:4;25854:3;25850:14;25836:12;25808:57;:::i;:::-;25715:160;25962:4;25955:5;25951:16;25945:23;25981:61;26036:4;26031:3;26027:14;26013:12;25981:61;:::i;:::-;25885:167;25313:746;25185:874;;:::o;26065:105::-;26140:23;26157:5;26140:23;:::i;:::-;26135:3;26128:36;26065:105;;:::o;26176:108::-;26253:24;26271:5;26253:24;:::i;:::-;26248:3;26241:37;26176:108;;:::o;26290:118::-;26377:24;26395:5;26377:24;:::i;:::-;26372:3;26365:37;26290:118;;:::o;26414:105::-;26489:23;26506:5;26489:23;:::i;:::-;26484:3;26477:36;26414:105;;:::o;26525:256::-;26637:3;26652:75;26723:3;26714:6;26652:75;:::i;:::-;26752:2;26747:3;26743:12;26736:19;;26772:3;26765:10;;26525:256;;;;:::o;26787:435::-;26967:3;26989:95;27080:3;27071:6;26989:95;:::i;:::-;26982:102;;27101:95;27192:3;27183:6;27101:95;:::i;:::-;27094:102;;27213:3;27206:10;;26787:435;;;;;:::o;27228:222::-;27321:4;27359:2;27348:9;27344:18;27336:26;;27372:71;27440:1;27429:9;27425:17;27416:6;27372:71;:::i;:::-;27228:222;;;;:::o;27456:640::-;27651:4;27689:3;27678:9;27674:19;27666:27;;27703:71;27771:1;27760:9;27756:17;27747:6;27703:71;:::i;:::-;27784:72;27852:2;27841:9;27837:18;27828:6;27784:72;:::i;:::-;27866;27934:2;27923:9;27919:18;27910:6;27866:72;:::i;:::-;27985:9;27979:4;27975:20;27970:2;27959:9;27955:18;27948:48;28013:76;28084:4;28075:6;28013:76;:::i;:::-;28005:84;;27456:640;;;;;;;:::o;28102:497::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:170;28587:4;28578:6;28422:170;:::i;:::-;28414:178;;28102:497;;;;:::o;28605:373::-;28748:4;28786:2;28775:9;28771:18;28763:26;;28835:9;28829:4;28825:20;28821:1;28810:9;28806:17;28799:47;28863:108;28966:4;28957:6;28863:108;:::i;:::-;28855:116;;28605:373;;;;:::o;28984:210::-;29071:4;29109:2;29098:9;29094:18;29086:26;;29122:65;29184:1;29173:9;29169:17;29160:6;29122:65;:::i;:::-;28984:210;;;;:::o;29200:222::-;29293:4;29331:2;29320:9;29316:18;29308:26;;29344:71;29412:1;29401:9;29397:17;29388:6;29344:71;:::i;:::-;29200:222;;;;:::o;29428:313::-;29541:4;29579:2;29568:9;29564:18;29556:26;;29628:9;29622:4;29618:20;29614:1;29603:9;29599:17;29592:47;29656:78;29729:4;29720:6;29656:78;:::i;:::-;29648:86;;29428:313;;;;:::o;29747:419::-;29913:4;29951:2;29940:9;29936:18;29928:26;;30000:9;29994:4;29990:20;29986:1;29975:9;29971:17;29964:47;30028:131;30154:4;30028:131;:::i;:::-;30020:139;;29747:419;;;:::o;30172:::-;30338:4;30376:2;30365:9;30361:18;30353:26;;30425:9;30419:4;30415:20;30411:1;30400:9;30396:17;30389:47;30453:131;30579:4;30453:131;:::i;:::-;30445:139;;30172:419;;;:::o;30597:::-;30763:4;30801:2;30790:9;30786:18;30778:26;;30850:9;30844:4;30840:20;30836:1;30825:9;30821:17;30814:47;30878:131;31004:4;30878:131;:::i;:::-;30870:139;;30597:419;;;:::o;31022:::-;31188:4;31226:2;31215:9;31211:18;31203:26;;31275:9;31269:4;31265:20;31261:1;31250:9;31246:17;31239:47;31303:131;31429:4;31303:131;:::i;:::-;31295:139;;31022:419;;;:::o;31447:::-;31613:4;31651:2;31640:9;31636:18;31628:26;;31700:9;31694:4;31690:20;31686:1;31675:9;31671:17;31664:47;31728:131;31854:4;31728:131;:::i;:::-;31720:139;;31447:419;;;:::o;31872:::-;32038:4;32076:2;32065:9;32061:18;32053:26;;32125:9;32119:4;32115:20;32111:1;32100:9;32096:17;32089:47;32153:131;32279:4;32153:131;:::i;:::-;32145:139;;31872:419;;;:::o;32297:::-;32463:4;32501:2;32490:9;32486:18;32478:26;;32550:9;32544:4;32540:20;32536:1;32525:9;32521:17;32514:47;32578:131;32704:4;32578:131;:::i;:::-;32570:139;;32297:419;;;:::o;32722:::-;32888:4;32926:2;32915:9;32911:18;32903:26;;32975:9;32969:4;32965:20;32961:1;32950:9;32946:17;32939:47;33003:131;33129:4;33003:131;:::i;:::-;32995:139;;32722:419;;;:::o;33147:::-;33313:4;33351:2;33340:9;33336:18;33328:26;;33400:9;33394:4;33390:20;33386:1;33375:9;33371:17;33364:47;33428:131;33554:4;33428:131;:::i;:::-;33420:139;;33147:419;;;:::o;33572:::-;33738:4;33776:2;33765:9;33761:18;33753:26;;33825:9;33819:4;33815:20;33811:1;33800:9;33796:17;33789:47;33853:131;33979:4;33853:131;:::i;:::-;33845:139;;33572:419;;;:::o;33997:::-;34163:4;34201:2;34190:9;34186:18;34178:26;;34250:9;34244:4;34240:20;34236:1;34225:9;34221:17;34214:47;34278:131;34404:4;34278:131;:::i;:::-;34270:139;;33997:419;;;:::o;34422:::-;34588:4;34626:2;34615:9;34611:18;34603:26;;34675:9;34669:4;34665:20;34661:1;34650:9;34646:17;34639:47;34703:131;34829:4;34703:131;:::i;:::-;34695:139;;34422:419;;;:::o;34847:::-;35013:4;35051:2;35040:9;35036:18;35028:26;;35100:9;35094:4;35090:20;35086:1;35075:9;35071:17;35064:47;35128:131;35254:4;35128:131;:::i;:::-;35120:139;;34847:419;;;:::o;35272:::-;35438:4;35476:2;35465:9;35461:18;35453:26;;35525:9;35519:4;35515:20;35511:1;35500:9;35496:17;35489:47;35553:131;35679:4;35553:131;:::i;:::-;35545:139;;35272:419;;;:::o;35697:::-;35863:4;35901:2;35890:9;35886:18;35878:26;;35950:9;35944:4;35940:20;35936:1;35925:9;35921:17;35914:47;35978:131;36104:4;35978:131;:::i;:::-;35970:139;;35697:419;;;:::o;36122:::-;36288:4;36326:2;36315:9;36311:18;36303:26;;36375:9;36369:4;36365:20;36361:1;36350:9;36346:17;36339:47;36403:131;36529:4;36403:131;:::i;:::-;36395:139;;36122:419;;;:::o;36547:::-;36713:4;36751:2;36740:9;36736:18;36728:26;;36800:9;36794:4;36790:20;36786:1;36775:9;36771:17;36764:47;36828:131;36954:4;36828:131;:::i;:::-;36820:139;;36547:419;;;:::o;36972:::-;37138:4;37176:2;37165:9;37161:18;37153:26;;37225:9;37219:4;37215:20;37211:1;37200:9;37196:17;37189:47;37253:131;37379:4;37253:131;:::i;:::-;37245:139;;36972:419;;;:::o;37397:::-;37563:4;37601:2;37590:9;37586:18;37578:26;;37650:9;37644:4;37640:20;37636:1;37625:9;37621:17;37614:47;37678:131;37804:4;37678:131;:::i;:::-;37670:139;;37397:419;;;:::o;37822:347::-;37977:4;38015:3;38004:9;38000:19;37992:27;;38029:133;38159:1;38148:9;38144:17;38135:6;38029:133;:::i;:::-;37822:347;;;;:::o;38175:222::-;38268:4;38306:2;38295:9;38291:18;38283:26;;38319:71;38387:1;38376:9;38372:17;38363:6;38319:71;:::i;:::-;38175:222;;;;:::o;38403:129::-;38437:6;38464:20;;:::i;:::-;38454:30;;38493:33;38521:4;38513:6;38493:33;:::i;:::-;38403:129;;;:::o;38538:75::-;38571:6;38604:2;38598:9;38588:19;;38538:75;:::o;38619:307::-;38680:4;38770:18;38762:6;38759:30;38756:56;;;38792:18;;:::i;:::-;38756:56;38830:29;38852:6;38830:29;:::i;:::-;38822:37;;38914:4;38908;38904:15;38896:23;;38619:307;;;:::o;38932:308::-;38994:4;39084:18;39076:6;39073:30;39070:56;;;39106:18;;:::i;:::-;39070:56;39144:29;39166:6;39144:29;:::i;:::-;39136:37;;39228:4;39222;39218:15;39210:23;;38932:308;;;:::o;39246:163::-;39344:4;39367:3;39359:11;;39397:4;39392:3;39388:14;39380:22;;39246:163;;;:::o;39415:132::-;39482:4;39505:3;39497:11;;39535:4;39530:3;39526:14;39518:22;;39415:132;;;:::o;39553:145::-;39651:6;39685:5;39679:12;39669:22;;39553:145;;;:::o;39704:114::-;39771:6;39805:5;39799:12;39789:22;;39704:114;;;:::o;39824:98::-;39875:6;39909:5;39903:12;39893:22;;39824:98;;;:::o;39928:99::-;39980:6;40014:5;40008:12;39998:22;;39928:99;;;:::o;40033:144::-;40134:4;40166;40161:3;40157:14;40149:22;;40033:144;;;:::o;40183:113::-;40253:4;40285;40280:3;40276:14;40268:22;;40183:113;;;:::o;40302:215::-;40432:11;40466:6;40461:3;40454:19;40506:4;40501:3;40497:14;40482:29;;40302:215;;;;:::o;40523:184::-;40622:11;40656:6;40651:3;40644:19;40696:4;40691:3;40687:14;40672:29;;40523:184;;;;:::o;40713:168::-;40796:11;40830:6;40825:3;40818:19;40870:4;40865:3;40861:14;40846:29;;40713:168;;;;:::o;40887:169::-;40971:11;41005:6;41000:3;40993:19;41045:4;41040:3;41036:14;41021:29;;40887:169;;;;:::o;41062:148::-;41164:11;41201:3;41186:18;;41062:148;;;;:::o;41216:305::-;41256:3;41275:20;41293:1;41275:20;:::i;:::-;41270:25;;41309:20;41327:1;41309:20;:::i;:::-;41304:25;;41463:1;41395:66;41391:74;41388:1;41385:81;41382:107;;;41469:18;;:::i;:::-;41382:107;41513:1;41510;41506:9;41499:16;;41216:305;;;;:::o;41527:348::-;41567:7;41590:20;41608:1;41590:20;:::i;:::-;41585:25;;41624:20;41642:1;41624:20;:::i;:::-;41619:25;;41812:1;41744:66;41740:74;41737:1;41734:81;41729:1;41722:9;41715:17;41711:105;41708:131;;;41819:18;;:::i;:::-;41708:131;41867:1;41864;41860:9;41849:20;;41527:348;;;;:::o;41881:96::-;41918:7;41947:24;41965:5;41947:24;:::i;:::-;41936:35;;41881:96;;;:::o;41983:90::-;42017:7;42060:5;42053:13;42046:21;42035:32;;41983:90;;;:::o;42079:77::-;42116:7;42145:5;42134:16;;42079:77;;;:::o;42162:149::-;42198:7;42238:66;42231:5;42227:78;42216:89;;42162:149;;;:::o;42317:126::-;42354:7;42394:42;42387:5;42383:54;42372:65;;42317:126;;;:::o;42449:91::-;42485:7;42525:8;42518:5;42514:20;42503:31;;42449:91;;;:::o;42546:77::-;42583:7;42612:5;42601:16;;42546:77;;;:::o;42629:101::-;42665:7;42705:18;42698:5;42694:30;42683:41;;42629:101;;;:::o;42736:154::-;42820:6;42815:3;42810;42797:30;42882:1;42873:6;42868:3;42864:16;42857:27;42736:154;;;:::o;42896:307::-;42964:1;42974:113;42988:6;42985:1;42982:13;42974:113;;;43073:1;43068:3;43064:11;43058:18;43054:1;43049:3;43045:11;43038:39;43010:2;43007:1;43003:10;42998:15;;42974:113;;;43105:6;43102:1;43099:13;43096:101;;;43185:1;43176:6;43171:3;43167:16;43160:27;43096:101;42945:258;42896:307;;;:::o;43209:320::-;43253:6;43290:1;43284:4;43280:12;43270:22;;43337:1;43331:4;43327:12;43358:18;43348:81;;43414:4;43406:6;43402:17;43392:27;;43348:81;43476:2;43468:6;43465:14;43445:18;43442:38;43439:84;;;43495:18;;:::i;:::-;43439:84;43260:269;43209:320;;;:::o;43535:281::-;43618:27;43640:4;43618:27;:::i;:::-;43610:6;43606:40;43748:6;43736:10;43733:22;43712:18;43700:10;43697:34;43694:62;43691:88;;;43759:18;;:::i;:::-;43691:88;43799:10;43795:2;43788:22;43578:238;43535:281;;:::o;43822:233::-;43861:3;43884:24;43902:5;43884:24;:::i;:::-;43875:33;;43930:66;43923:5;43920:77;43917:103;;;44000:18;;:::i;:::-;43917:103;44047:1;44040:5;44036:13;44029:20;;43822:233;;;:::o;44061:100::-;44100:7;44129:26;44149:5;44129:26;:::i;:::-;44118:37;;44061:100;;;:::o;44167:94::-;44206:7;44235:20;44249:5;44235:20;:::i;:::-;44224:31;;44167:94;;;:::o;44267:180::-;44315:77;44312:1;44305:88;44412:4;44409:1;44402:15;44436:4;44433:1;44426:15;44453:180;44501:77;44498:1;44491:88;44598:4;44595:1;44588:15;44622:4;44619:1;44612:15;44639:180;44687:77;44684:1;44677:88;44784:4;44781:1;44774:15;44808:4;44805:1;44798:15;44825:180;44873:77;44870:1;44863:88;44970:4;44967:1;44960:15;44994:4;44991:1;44984:15;45011:117;45120:1;45117;45110:12;45134:117;45243:1;45240;45233:12;45257:117;45366:1;45363;45356:12;45380:117;45489:1;45486;45479:12;45503:117;45612:1;45609;45602:12;45626:117;45735:1;45732;45725:12;45749:102;45790:6;45841:2;45837:7;45832:2;45825:5;45821:14;45817:28;45807:38;;45749:102;;;:::o;45857:94::-;45890:8;45938:5;45934:2;45930:14;45909:35;;45857:94;;;:::o;45957:224::-;46097:34;46093:1;46085:6;46081:14;46074:58;46166:7;46161:2;46153:6;46149:15;46142:32;45957:224;:::o;46187:170::-;46327:22;46323:1;46315:6;46311:14;46304:46;46187:170;:::o;46363:181::-;46503:33;46499:1;46491:6;46487:14;46480:57;46363:181;:::o;46550:225::-;46690:34;46686:1;46678:6;46674:14;46667:58;46759:8;46754:2;46746:6;46742:15;46735:33;46550:225;:::o;46781:231::-;46921:34;46917:1;46909:6;46905:14;46898:58;46990:14;46985:2;46977:6;46973:15;46966:39;46781:231;:::o;47018:177::-;47158:29;47154:1;47146:6;47142:14;47135:53;47018:177;:::o;47201:181::-;47341:33;47337:1;47329:6;47325:14;47318:57;47201:181;:::o;47388:222::-;47528:34;47524:1;47516:6;47512:14;47505:58;47597:5;47592:2;47584:6;47580:15;47573:30;47388:222;:::o;47616:179::-;47756:31;47752:1;47744:6;47740:14;47733:55;47616:179;:::o;47801:166::-;47941:18;47937:1;47929:6;47925:14;47918:42;47801:166;:::o;47973:178::-;48113:30;48109:1;48101:6;48097:14;48090:54;47973:178;:::o;48157:224::-;48297:34;48293:1;48285:6;48281:14;48274:58;48366:7;48361:2;48353:6;48349:15;48342:32;48157:224;:::o;48387:182::-;48527:34;48523:1;48515:6;48511:14;48504:58;48387:182;:::o;48575:223::-;48715:34;48711:1;48703:6;48699:14;48692:58;48784:6;48779:2;48771:6;48767:15;48760:31;48575:223;:::o;48804:225::-;48944:34;48940:1;48932:6;48928:14;48921:58;49013:8;49008:2;49000:6;48996:15;48989:33;48804:225;:::o;49035:236::-;49175:34;49171:1;49163:6;49159:14;49152:58;49244:19;49239:2;49231:6;49227:15;49220:44;49035:236;:::o;49277:223::-;49417:34;49413:1;49405:6;49401:14;49394:58;49486:6;49481:2;49473:6;49469:15;49462:31;49277:223;:::o;49506:180::-;49646:32;49642:1;49634:6;49630:14;49623:56;49506:180;:::o;49692:229::-;49832:34;49828:1;49820:6;49816:14;49809:58;49901:12;49896:2;49888:6;49884:15;49877:37;49692:229;:::o;49927:122::-;50000:24;50018:5;50000:24;:::i;:::-;49993:5;49990:35;49980:63;;50039:1;50036;50029:12;49980:63;49927:122;:::o;50055:116::-;50125:21;50140:5;50125:21;:::i;:::-;50118:5;50115:32;50105:60;;50161:1;50158;50151:12;50105:60;50055:116;:::o;50177:122::-;50250:24;50268:5;50250:24;:::i;:::-;50243:5;50240:35;50230:63;;50289:1;50286;50279:12;50230:63;50177:122;:::o;50305:120::-;50377:23;50394:5;50377:23;:::i;:::-;50370:5;50367:34;50357:62;;50415:1;50412;50405:12;50357:62;50305:120;:::o;50431:122::-;50504:24;50522:5;50504:24;:::i;:::-;50497:5;50494:35;50484:63;;50543:1;50540;50533:12;50484:63;50431:122;:::o
Swarm Source
ipfs://f3d0c404c500e0e0de6b900839b5d965f60faa31f29889490e6eda6d64275699
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.