ERC-721
Overview
Max Total Supply
4,784 CyberSaudis
Holders
1,439
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
30 CyberSaudisLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CyberSaudis
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-10 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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/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: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: cyber.sol pragma solidity >=0.8.9 <0.9.0; contract CyberSaudis is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public claimed; mapping(uint256 => TokenOwnership) internal _ownerships; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri; uint256 public cost; uint256 public finalMaxSupply = 5555; uint256 public currentMaxSupply; uint256 public maxMintAmountPerTx; uint256 public currentFreeSupply = 0; bool public paused = false; bool public whitelistMintEnabled = false; bool public revealed = false; constructor( string memory _tokenName, string memory _tokenSymbol, uint256 _cost, uint256 _maxSupply, uint256 _maxMintAmountPerTx, string memory _hiddenMetadataUri ) ERC721A(_tokenName, _tokenSymbol) { setCost(_cost); currentMaxSupply = _maxSupply; setMaxMintAmountPerTx(_maxMintAmountPerTx); setHiddenMetadataUri(_hiddenMetadataUri); } function mint(uint256 _mintAmount) external payable { require(!paused, 'The contract is paused!'); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= currentMaxSupply, 'Max supply exceeded!'); uint free = (claimed[_msgSender()] || currentFreeSupply > 500) ? 0 : 1; require(msg.value >= cost * (_mintAmount - free), "PAYMENT: invalid value"); currentFreeSupply++; claimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } function mintForAddress(uint256 _mintAmount, address _receiver) external onlyOwner { require(totalSupply() + _mintAmount <= currentMaxSupply, 'Max supply exceeded!'); _safeMint(_receiver, _mintAmount); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = _startTokenId(); uint256 ownedTokenIndex = 0; address latestOwnerAddress; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= currentMaxSupply) { TokenOwnership memory ownership = _ownerships[currentTokenId]; if (!ownership.burned && ownership.addr != address(0)) { latestOwnerAddress = ownership.addr; } if (latestOwnerAddress == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function resetFinalMaxSupply() public onlyOwner { finalMaxSupply = currentMaxSupply; } function getCurrentFreeSupply() external view onlyOwner returns (uint256) { return currentFreeSupply; } function setCurrentMaxSupply(uint256 _supply) public onlyOwner { require(_supply <= finalMaxSupply && _supply >= totalSupply()); currentMaxSupply = _supply; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function withdraw() external onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetFinalMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setCurrentMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600d90816200002491906200060c565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90816200006b91906200060c565b506115b360115560006014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506000601560026101000a81548160ff021916908315150217905550348015620000d557600080fd5b50604051620046ad380380620046ad8339818101604052810190620000fb919062000892565b858581600290816200010e91906200060c565b5080600390816200012091906200060c565b5062000131620001a760201b60201c565b6000819055505050620001596200014d620001b060201b60201c565b620001b860201b60201c565b600160098190555062000172846200027e60201b60201c565b826012819055506200018a826200029860201b60201c565b6200019b81620002b260201b60201c565b50505050505062000a0e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028e620002d760201b60201c565b8060108190555050565b620002a8620002d760201b60201c565b8060138190555050565b620002c2620002d760201b60201c565b80600f9081620002d391906200060c565b5050565b620002e7620001b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030d6200036860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000366576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035d90620009ec565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200041457607f821691505b6020821081036200042a5762000429620003cc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000455565b620004a0868362000455565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004ed620004e7620004e184620004b8565b620004c2565b620004b8565b9050919050565b6000819050919050565b6200050983620004cc565b620005216200051882620004f4565b84845462000462565b825550505050565b600090565b6200053862000529565b62000545818484620004fe565b505050565b5b818110156200056d57620005616000826200052e565b6001810190506200054b565b5050565b601f821115620005bc57620005868162000430565b620005918462000445565b81016020851015620005a1578190505b620005b9620005b08562000445565b8301826200054a565b50505b505050565b600082821c905092915050565b6000620005e160001984600802620005c1565b1980831691505092915050565b6000620005fc8383620005ce565b9150826002028217905092915050565b620006178262000392565b67ffffffffffffffff8111156200063357620006326200039d565b5b6200063f8254620003fb565b6200064c82828562000571565b600060209050601f8311600181146200068457600084156200066f578287015190505b6200067b8582620005ee565b865550620006eb565b601f198416620006948662000430565b60005b82811015620006be5784890151825560018201915060208501945060208101905062000697565b86831015620006de5784890151620006da601f891682620005ce565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200072d8262000711565b810181811067ffffffffffffffff821117156200074f576200074e6200039d565b5b80604052505050565b600062000764620006f3565b905062000772828262000722565b919050565b600067ffffffffffffffff8211156200079557620007946200039d565b5b620007a08262000711565b9050602081019050919050565b60005b83811015620007cd578082015181840152602081019050620007b0565b83811115620007dd576000848401525b50505050565b6000620007fa620007f48462000777565b62000758565b9050828152602081018484840111156200081957620008186200070c565b5b62000826848285620007ad565b509392505050565b600082601f83011262000846576200084562000707565b5b815162000858848260208601620007e3565b91505092915050565b6200086c81620004b8565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b60008060008060008060c08789031215620008b257620008b1620006fd565b5b600087015167ffffffffffffffff811115620008d357620008d262000702565b5b620008e189828a016200082e565b965050602087015167ffffffffffffffff81111562000905576200090462000702565b5b6200091389828a016200082e565b95505060406200092689828a016200087b565b94505060606200093989828a016200087b565b93505060806200094c89828a016200087b565b92505060a087015167ffffffffffffffff81111562000970576200096f62000702565b5b6200097e89828a016200082e565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009d46020836200098b565b9150620009e1826200099c565b602082019050919050565b6000602082019050818103600083015262000a0781620009c5565b9050919050565b613c8f8062000a1e6000396000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd1461092d578063c884ef831461096a578063e0a80853146109a7578063e985e9c5146109d0578063efbd73f414610a0d578063f2fde38b14610a365761027d565b8063a0712d6814610842578063a22cb4651461085e578063a45ba8e714610887578063b071401b146108b2578063b767a098146108db578063b88d4fde146109045761027d565b80637cb4d751116101135780637cb4d751146107445780637cb647591461076f5780637ec4a659146107985780638da5cb5b146107c157806394354fd0146107ec57806395d89b41146108175761027d565b80636352211e1461065f5780636caede3d1461069c57806370a08231146106c7578063715018a614610704578063730220111461071b5761027d565b806330090b54116101f35780634fdd43cb116101ac5780634fdd43cb14610573578063518302271461059c5780635503a0e8146105c7578063569b75f8146105f25780635c975abb1461060957806362b99ad4146106345761027d565b806330090b54146104775780633ccfd60b146104a257806342842e0e146104b9578063438b6300146104e257806344a0d68a1461051f5780634ad66811146105485761027d565b806313faede61161024557806313faede61461037b57806316ba10e0146103a657806316c38b3c146103cf57806318160ddd146103f857806323b872dd146104235780632eb4a7ab1461044c5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b314610327578063104aeef814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190612980565b610a5f565b6040516102b691906129c8565b60405180910390f35b3480156102cb57600080fd5b506102d4610af1565b6040516102e19190612a7c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190612ad4565b610b83565b60405161031e9190612b42565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190612b89565b610bff565b005b34801561035c57600080fd5b50610365610d40565b6040516103729190612bd8565b60405180910390f35b34801561038757600080fd5b50610390610d46565b60405161039d9190612bd8565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190612d28565b610d4c565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612d9d565b610d67565b005b34801561040457600080fd5b5061040d610d8c565b60405161041a9190612bd8565b60405180910390f35b34801561042f57600080fd5b5061044a60048036038101906104459190612dca565b610da3565b005b34801561045857600080fd5b506104616110c5565b60405161046e9190612e36565b60405180910390f35b34801561048357600080fd5b5061048c6110cb565b6040516104999190612bd8565b60405180910390f35b3480156104ae57600080fd5b506104b76110d1565b005b3480156104c557600080fd5b506104e060048036038101906104db9190612dca565b6111ae565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612e51565b6111ce565b6040516105169190612f3c565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ad4565b61140b565b005b34801561055457600080fd5b5061055d61141d565b60405161056a9190612bd8565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190612d28565b611423565b005b3480156105a857600080fd5b506105b161143e565b6040516105be91906129c8565b60405180910390f35b3480156105d357600080fd5b506105dc611451565b6040516105e99190612a7c565b60405180910390f35b3480156105fe57600080fd5b506106076114df565b005b34801561061557600080fd5b5061061e6114f2565b60405161062b91906129c8565b60405180910390f35b34801561064057600080fd5b50610649611505565b6040516106569190612a7c565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612ad4565b611593565b6040516106939190612b42565b60405180910390f35b3480156106a857600080fd5b506106b16115a5565b6040516106be91906129c8565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612e51565b6115b8565b6040516106fb9190612bd8565b60405180910390f35b34801561071057600080fd5b50610719611670565b005b34801561072757600080fd5b50610742600480360381019061073d9190612ad4565b611684565b005b34801561075057600080fd5b506107596116b8565b6040516107669190612bd8565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190612f8a565b6116ca565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190612d28565b6116dc565b005b3480156107cd57600080fd5b506107d66116f7565b6040516107e39190612b42565b60405180910390f35b3480156107f857600080fd5b50610801611721565b60405161080e9190612bd8565b60405180910390f35b34801561082357600080fd5b5061082c611727565b6040516108399190612a7c565b60405180910390f35b61085c60048036038101906108579190612ad4565b6117b9565b005b34801561086a57600080fd5b5061088560048036038101906108809190612fb7565b611a0f565b005b34801561089357600080fd5b5061089c611b86565b6040516108a99190612a7c565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190612ad4565b611c14565b005b3480156108e757600080fd5b5061090260048036038101906108fd9190612d9d565b611c26565b005b34801561091057600080fd5b5061092b60048036038101906109269190613098565b611c4b565b005b34801561093957600080fd5b50610954600480360381019061094f9190612ad4565b611cbe565b6040516109619190612a7c565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c9190612e51565b611e16565b60405161099e91906129c8565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190612d9d565b611e36565b005b3480156109dc57600080fd5b506109f760048036038101906109f2919061311b565b611e5b565b604051610a0491906129c8565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061315b565b611eef565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190612e51565b611f5c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aba57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aea5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b00906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2c906131ca565b8015610b795780601f10610b4e57610100808354040283529160200191610b79565b820191906000526020600020905b815481529060010190602001808311610b5c57829003601f168201915b5050505050905090565b6000610b8e82611fdf565b610bc4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0a82611593565b90508073ffffffffffffffffffffffffffffffffffffffff16610c2b61203e565b73ffffffffffffffffffffffffffffffffffffffff1614610c8e57610c5781610c5261203e565b611e5b565b610c8d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60125481565b60105481565b610d54612046565b80600e9081610d6391906133a7565b5050565b610d6f612046565b80601560006101000a81548160ff02191690831515021790555050565b6000610d966120c4565b6001546000540303905090565b6000610dae826120cd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e15576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e2184612199565b91509150610e378187610e3261203e565b6121bb565b610e8357610e4c86610e4761203e565b611e5b565b610e82576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef686868660016121ff565b8015610f0157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fcf85610fab888887612205565b7c02000000000000000000000000000000000000000000000000000000001761222d565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110555760006001850190506000600460008381526020019081526020016000205403611053576000548114611052578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110bd8686866001612258565b505050505050565b600a5481565b60145481565b6110d9612046565b60026009540361111e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611115906134c5565b60405180910390fd5b600260098190555060006111306116f7565b73ffffffffffffffffffffffffffffffffffffffff164760405161115390613516565b60006040518083038185875af1925050503d8060008114611190576040519150601f19603f3d011682016040523d82523d6000602084013e611195565b606091505b50509050806111a357600080fd5b506001600981905550565b6111c983838360405180602001604052806000815250611c4b565b505050565b606060006111db836115b8565b905060008167ffffffffffffffff8111156111f9576111f8612bfd565b5b6040519080825280602002602001820160405280156112275781602001602082028036833780820191505090505b50905060006112346120c4565b90506000805b848210801561124b57506012548311155b156113fe576000600c60008581526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815260200160008201601d9054906101000a900462ffffff1662ffffff1662ffffff16815250509050806040015115801561137b5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b1561138857806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113ea57838584815181106113cf576113ce61352b565b5b60200260200101818152505082806113e690613589565b9350505b83806113f590613589565b9450505061123a565b8395505050505050919050565b611413612046565b8060108190555050565b60115481565b61142b612046565b80600f908161143a91906133a7565b5050565b601560029054906101000a900460ff1681565b600e805461145e906131ca565b80601f016020809104026020016040519081016040528092919081815260200182805461148a906131ca565b80156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b505050505081565b6114e7612046565b601254601181905550565b601560009054906101000a900460ff1681565b600d8054611512906131ca565b80601f016020809104026020016040519081016040528092919081815260200182805461153e906131ca565b801561158b5780601f106115605761010080835404028352916020019161158b565b820191906000526020600020905b81548152906001019060200180831161156e57829003601f168201915b505050505081565b600061159e826120cd565b9050919050565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361161f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611678612046565b611682600061225e565b565b61168c612046565b60115481111580156116a557506116a1610d8c565b8110155b6116ae57600080fd5b8060128190555050565b60006116c2612046565b601454905090565b6116d2612046565b80600a8190555050565b6116e4612046565b80600d90816116f391906133a7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b606060038054611736906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611762906131ca565b80156117af5780601f10611784576101008083540402835291602001916117af565b820191906000526020600020905b81548152906001019060200180831161179257829003601f168201915b5050505050905090565b601560009054906101000a900460ff1615611809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118009061361d565b60405180910390fd5b60008111801561181b57506013548111155b61185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613689565b60405180910390fd5b60125481611866610d8c565b61187091906136a9565b11156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061374b565b60405180910390fd5b6000600b60006118bf612324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061191557506101f4601454115b611920576001611923565b60005b60ff1690508082611934919061376b565b601054611941919061379f565b341015611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613845565b60405180910390fd5b6014600081548092919061199690613589565b91905055506001600b60006119a9612324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a0b611a05612324565b8361232c565b5050565b611a1761203e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a8861203e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b3561203e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7a91906129c8565b60405180910390a35050565b600f8054611b93906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf906131ca565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081565b611c1c612046565b8060138190555050565b611c2e612046565b80601560016101000a81548160ff02191690831515021790555050565b611c56848484610da3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cb857611c818484848461234a565b611cb7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611cc982611fdf565b611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff906138d7565b60405180910390fd5b60001515601560029054906101000a900460ff16151503611db557600f8054611d30906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5c906131ca565b8015611da95780601f10611d7e57610100808354040283529160200191611da9565b820191906000526020600020905b815481529060010190602001808311611d8c57829003601f168201915b50505050509050611e11565b6000611dbf61249a565b90506000815111611ddf5760405180602001604052806000815250611e0d565b80611de98461252c565b600e604051602001611dfd939291906139b6565b6040516020818303038152906040525b9150505b919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611e3e612046565b80601560026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ef7612046565b60125482611f03610d8c565b611f0d91906136a9565b1115611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061374b565b60405180910390fd5b611f58818361232c565b5050565b611f64612046565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90613a59565b60405180910390fd5b611fdc8161225e565b50565b600081611fea6120c4565b11158015611ff9575060005482105b8015612037575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61204e612324565b73ffffffffffffffffffffffffffffffffffffffff1661206c6116f7565b73ffffffffffffffffffffffffffffffffffffffff16146120c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b990613ac5565b60405180910390fd5b565b60006001905090565b600080829050806120dc6120c4565b11612162576000548110156121615760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361215f575b6000810361215557600460008360019003935083815260200190815260200160002054905061212b565b8092505050612194565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861221c86868461268c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b612346828260405180602001604052806000815250612695565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237061203e565b8786866040518563ffffffff1660e01b81526004016123929493929190613b3a565b6020604051808303816000875af19250505080156123ce57506040513d601f19601f820116820180604052508101906123cb9190613b9b565b60015b612447573d80600081146123fe576040519150601f19603f3d011682016040523d82523d6000602084013e612403565b606091505b50600081510361243f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546124a9906131ca565b80601f01602080910402602001604051908101604052809291908181526020018280546124d5906131ca565b80156125225780601f106124f757610100808354040283529160200191612522565b820191906000526020600020905b81548152906001019060200180831161250557829003601f168201915b5050505050905090565b606060008203612573576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612687565b600082905060005b600082146125a557808061258e90613589565b915050600a8261259e9190613bf7565b915061257b565b60008167ffffffffffffffff8111156125c1576125c0612bfd565b5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b5090505b600085146126805760018261260c919061376b565b9150600a8561261b9190613c28565b603061262791906136a9565b60f81b81838151811061263d5761263c61352b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126799190613bf7565b94506125f7565b8093505050505b919050565b60009392505050565b61269f8383612732565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461272d57600080549050600083820390505b6126df600086838060010194508661234a565b612715576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126cc57816000541461272a57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361279e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036127d8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e560008483856121ff565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061285c8361284d6000866000612205565b61285685612904565b1761222d565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612880578060008190555050506128ff6000848385612258565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61295d81612928565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b6000602082840312156129965761299561291e565b5b60006129a48482850161296b565b91505092915050565b60008115159050919050565b6129c2816129ad565b82525050565b60006020820190506129dd60008301846129b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a4e826129e3565b612a5881856129ee565b9350612a688185602086016129ff565b612a7181612a32565b840191505092915050565b60006020820190508181036000830152612a968184612a43565b905092915050565b6000819050919050565b612ab181612a9e565b8114612abc57600080fd5b50565b600081359050612ace81612aa8565b92915050565b600060208284031215612aea57612ae961291e565b5b6000612af884828501612abf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2c82612b01565b9050919050565b612b3c81612b21565b82525050565b6000602082019050612b576000830184612b33565b92915050565b612b6681612b21565b8114612b7157600080fd5b50565b600081359050612b8381612b5d565b92915050565b60008060408385031215612ba057612b9f61291e565b5b6000612bae85828601612b74565b9250506020612bbf85828601612abf565b9150509250929050565b612bd281612a9e565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3582612a32565b810181811067ffffffffffffffff82111715612c5457612c53612bfd565b5b80604052505050565b6000612c67612914565b9050612c738282612c2c565b919050565b600067ffffffffffffffff821115612c9357612c92612bfd565b5b612c9c82612a32565b9050602081019050919050565b82818337600083830152505050565b6000612ccb612cc684612c78565b612c5d565b905082815260208101848484011115612ce757612ce6612bf8565b5b612cf2848285612ca9565b509392505050565b600082601f830112612d0f57612d0e612bf3565b5b8135612d1f848260208601612cb8565b91505092915050565b600060208284031215612d3e57612d3d61291e565b5b600082013567ffffffffffffffff811115612d5c57612d5b612923565b5b612d6884828501612cfa565b91505092915050565b612d7a816129ad565b8114612d8557600080fd5b50565b600081359050612d9781612d71565b92915050565b600060208284031215612db357612db261291e565b5b6000612dc184828501612d88565b91505092915050565b600080600060608486031215612de357612de261291e565b5b6000612df186828701612b74565b9350506020612e0286828701612b74565b9250506040612e1386828701612abf565b9150509250925092565b6000819050919050565b612e3081612e1d565b82525050565b6000602082019050612e4b6000830184612e27565b92915050565b600060208284031215612e6757612e6661291e565b5b6000612e7584828501612b74565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612eb381612a9e565b82525050565b6000612ec58383612eaa565b60208301905092915050565b6000602082019050919050565b6000612ee982612e7e565b612ef38185612e89565b9350612efe83612e9a565b8060005b83811015612f2f578151612f168882612eb9565b9750612f2183612ed1565b925050600181019050612f02565b5085935050505092915050565b60006020820190508181036000830152612f568184612ede565b905092915050565b612f6781612e1d565b8114612f7257600080fd5b50565b600081359050612f8481612f5e565b92915050565b600060208284031215612fa057612f9f61291e565b5b6000612fae84828501612f75565b91505092915050565b60008060408385031215612fce57612fcd61291e565b5b6000612fdc85828601612b74565b9250506020612fed85828601612d88565b9150509250929050565b600067ffffffffffffffff82111561301257613011612bfd565b5b61301b82612a32565b9050602081019050919050565b600061303b61303684612ff7565b612c5d565b90508281526020810184848401111561305757613056612bf8565b5b613062848285612ca9565b509392505050565b600082601f83011261307f5761307e612bf3565b5b813561308f848260208601613028565b91505092915050565b600080600080608085870312156130b2576130b161291e565b5b60006130c087828801612b74565b94505060206130d187828801612b74565b93505060406130e287828801612abf565b925050606085013567ffffffffffffffff81111561310357613102612923565b5b61310f8782880161306a565b91505092959194509250565b600080604083850312156131325761313161291e565b5b600061314085828601612b74565b925050602061315185828601612b74565b9150509250929050565b600080604083850312156131725761317161291e565b5b600061318085828601612abf565b925050602061319185828601612b74565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131e257607f821691505b6020821081036131f5576131f461319b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261325d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613220565b6132678683613220565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132a461329f61329a84612a9e565b61327f565b612a9e565b9050919050565b6000819050919050565b6132be83613289565b6132d26132ca826132ab565b84845461322d565b825550505050565b600090565b6132e76132da565b6132f28184846132b5565b505050565b5b818110156133165761330b6000826132df565b6001810190506132f8565b5050565b601f82111561335b5761332c816131fb565b61333584613210565b81016020851015613344578190505b61335861335085613210565b8301826132f7565b50505b505050565b600082821c905092915050565b600061337e60001984600802613360565b1980831691505092915050565b6000613397838361336d565b9150826002028217905092915050565b6133b0826129e3565b67ffffffffffffffff8111156133c9576133c8612bfd565b5b6133d382546131ca565b6133de82828561331a565b600060209050601f83116001811461341157600084156133ff578287015190505b613409858261338b565b865550613471565b601f19841661341f866131fb565b60005b8281101561344757848901518255600182019150602085019450602081019050613422565b868310156134645784890151613460601f89168261336d565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134af601f836129ee565b91506134ba82613479565b602082019050919050565b600060208201905081810360008301526134de816134a2565b9050919050565b600081905092915050565b50565b60006135006000836134e5565b915061350b826134f0565b600082019050919050565b6000613521826134f3565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061359482612a9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135c6576135c561355a565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006136076017836129ee565b9150613612826135d1565b602082019050919050565b60006020820190508181036000830152613636816135fa565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006136736014836129ee565b915061367e8261363d565b602082019050919050565b600060208201905081810360008301526136a281613666565b9050919050565b60006136b482612a9e565b91506136bf83612a9e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f4576136f361355a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006137356014836129ee565b9150613740826136ff565b602082019050919050565b6000602082019050818103600083015261376481613728565b9050919050565b600061377682612a9e565b915061378183612a9e565b9250828210156137945761379361355a565b5b828203905092915050565b60006137aa82612a9e565b91506137b583612a9e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ee576137ed61355a565b5b828202905092915050565b7f5041594d454e543a20696e76616c69642076616c756500000000000000000000600082015250565b600061382f6016836129ee565b915061383a826137f9565b602082019050919050565b6000602082019050818103600083015261385e81613822565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138c1602f836129ee565b91506138cc82613865565b604082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b600081905092915050565b600061390d826129e3565b61391781856138f7565b93506139278185602086016129ff565b80840191505092915050565b60008154613940816131ca565b61394a81866138f7565b94506001821660008114613965576001811461397a576139ad565b60ff19831686528115158202860193506139ad565b613983856131fb565b60005b838110156139a557815481890152600182019150602081019050613986565b838801955050505b50505092915050565b60006139c28286613902565b91506139ce8285613902565b91506139da8284613933565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a436026836129ee565b9150613a4e826139e7565b604082019050919050565b60006020820190508181036000830152613a7281613a36565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613aaf6020836129ee565b9150613aba82613a79565b602082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b0c82613ae5565b613b168185613af0565b9350613b268185602086016129ff565b613b2f81612a32565b840191505092915050565b6000608082019050613b4f6000830187612b33565b613b5c6020830186612b33565b613b696040830185612bc9565b8181036060830152613b7b8184613b01565b905095945050505050565b600081519050613b9581612954565b92915050565b600060208284031215613bb157613bb061291e565b5b6000613bbf84828501613b86565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c0282612a9e565b9150613c0d83612a9e565b925082613c1d57613c1c613bc8565b5b828204905092915050565b6000613c3382612a9e565b9150613c3e83612a9e565b925082613c4e57613c4d613bc8565b5b82820690509291505056fea2646970667358221220d8eb383f72d9a292ddc1f23e45b54743468ff0527c2ccfa7a7201b0c936f548a64736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015b300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b4379626572536175646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b43796265725361756469730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5a614e314231576945595a756955524578754a7356756670364a476d536b795877484a4a6d567a4a6f634d692f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80636352211e1161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd1461092d578063c884ef831461096a578063e0a80853146109a7578063e985e9c5146109d0578063efbd73f414610a0d578063f2fde38b14610a365761027d565b8063a0712d6814610842578063a22cb4651461085e578063a45ba8e714610887578063b071401b146108b2578063b767a098146108db578063b88d4fde146109045761027d565b80637cb4d751116101135780637cb4d751146107445780637cb647591461076f5780637ec4a659146107985780638da5cb5b146107c157806394354fd0146107ec57806395d89b41146108175761027d565b80636352211e1461065f5780636caede3d1461069c57806370a08231146106c7578063715018a614610704578063730220111461071b5761027d565b806330090b54116101f35780634fdd43cb116101ac5780634fdd43cb14610573578063518302271461059c5780635503a0e8146105c7578063569b75f8146105f25780635c975abb1461060957806362b99ad4146106345761027d565b806330090b54146104775780633ccfd60b146104a257806342842e0e146104b9578063438b6300146104e257806344a0d68a1461051f5780634ad66811146105485761027d565b806313faede61161024557806313faede61461037b57806316ba10e0146103a657806316c38b3c146103cf57806318160ddd146103f857806323b872dd146104235780632eb4a7ab1461044c5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b314610327578063104aeef814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190612980565b610a5f565b6040516102b691906129c8565b60405180910390f35b3480156102cb57600080fd5b506102d4610af1565b6040516102e19190612a7c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190612ad4565b610b83565b60405161031e9190612b42565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190612b89565b610bff565b005b34801561035c57600080fd5b50610365610d40565b6040516103729190612bd8565b60405180910390f35b34801561038757600080fd5b50610390610d46565b60405161039d9190612bd8565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190612d28565b610d4c565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612d9d565b610d67565b005b34801561040457600080fd5b5061040d610d8c565b60405161041a9190612bd8565b60405180910390f35b34801561042f57600080fd5b5061044a60048036038101906104459190612dca565b610da3565b005b34801561045857600080fd5b506104616110c5565b60405161046e9190612e36565b60405180910390f35b34801561048357600080fd5b5061048c6110cb565b6040516104999190612bd8565b60405180910390f35b3480156104ae57600080fd5b506104b76110d1565b005b3480156104c557600080fd5b506104e060048036038101906104db9190612dca565b6111ae565b005b3480156104ee57600080fd5b5061050960048036038101906105049190612e51565b6111ce565b6040516105169190612f3c565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ad4565b61140b565b005b34801561055457600080fd5b5061055d61141d565b60405161056a9190612bd8565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190612d28565b611423565b005b3480156105a857600080fd5b506105b161143e565b6040516105be91906129c8565b60405180910390f35b3480156105d357600080fd5b506105dc611451565b6040516105e99190612a7c565b60405180910390f35b3480156105fe57600080fd5b506106076114df565b005b34801561061557600080fd5b5061061e6114f2565b60405161062b91906129c8565b60405180910390f35b34801561064057600080fd5b50610649611505565b6040516106569190612a7c565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612ad4565b611593565b6040516106939190612b42565b60405180910390f35b3480156106a857600080fd5b506106b16115a5565b6040516106be91906129c8565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612e51565b6115b8565b6040516106fb9190612bd8565b60405180910390f35b34801561071057600080fd5b50610719611670565b005b34801561072757600080fd5b50610742600480360381019061073d9190612ad4565b611684565b005b34801561075057600080fd5b506107596116b8565b6040516107669190612bd8565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190612f8a565b6116ca565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190612d28565b6116dc565b005b3480156107cd57600080fd5b506107d66116f7565b6040516107e39190612b42565b60405180910390f35b3480156107f857600080fd5b50610801611721565b60405161080e9190612bd8565b60405180910390f35b34801561082357600080fd5b5061082c611727565b6040516108399190612a7c565b60405180910390f35b61085c60048036038101906108579190612ad4565b6117b9565b005b34801561086a57600080fd5b5061088560048036038101906108809190612fb7565b611a0f565b005b34801561089357600080fd5b5061089c611b86565b6040516108a99190612a7c565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190612ad4565b611c14565b005b3480156108e757600080fd5b5061090260048036038101906108fd9190612d9d565b611c26565b005b34801561091057600080fd5b5061092b60048036038101906109269190613098565b611c4b565b005b34801561093957600080fd5b50610954600480360381019061094f9190612ad4565b611cbe565b6040516109619190612a7c565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c9190612e51565b611e16565b60405161099e91906129c8565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190612d9d565b611e36565b005b3480156109dc57600080fd5b506109f760048036038101906109f2919061311b565b611e5b565b604051610a0491906129c8565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061315b565b611eef565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190612e51565b611f5c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aba57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aea5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b00906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2c906131ca565b8015610b795780601f10610b4e57610100808354040283529160200191610b79565b820191906000526020600020905b815481529060010190602001808311610b5c57829003601f168201915b5050505050905090565b6000610b8e82611fdf565b610bc4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c0a82611593565b90508073ffffffffffffffffffffffffffffffffffffffff16610c2b61203e565b73ffffffffffffffffffffffffffffffffffffffff1614610c8e57610c5781610c5261203e565b611e5b565b610c8d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60125481565b60105481565b610d54612046565b80600e9081610d6391906133a7565b5050565b610d6f612046565b80601560006101000a81548160ff02191690831515021790555050565b6000610d966120c4565b6001546000540303905090565b6000610dae826120cd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e15576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e2184612199565b91509150610e378187610e3261203e565b6121bb565b610e8357610e4c86610e4761203e565b611e5b565b610e82576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ee9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef686868660016121ff565b8015610f0157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fcf85610fab888887612205565b7c02000000000000000000000000000000000000000000000000000000001761222d565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110555760006001850190506000600460008381526020019081526020016000205403611053576000548114611052578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110bd8686866001612258565b505050505050565b600a5481565b60145481565b6110d9612046565b60026009540361111e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611115906134c5565b60405180910390fd5b600260098190555060006111306116f7565b73ffffffffffffffffffffffffffffffffffffffff164760405161115390613516565b60006040518083038185875af1925050503d8060008114611190576040519150601f19603f3d011682016040523d82523d6000602084013e611195565b606091505b50509050806111a357600080fd5b506001600981905550565b6111c983838360405180602001604052806000815250611c4b565b505050565b606060006111db836115b8565b905060008167ffffffffffffffff8111156111f9576111f8612bfd565b5b6040519080825280602002602001820160405280156112275781602001602082028036833780820191505090505b50905060006112346120c4565b90506000805b848210801561124b57506012548311155b156113fe576000600c60008581526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815260200160008201601d9054906101000a900462ffffff1662ffffff1662ffffff16815250509050806040015115801561137b5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b1561138857806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113ea57838584815181106113cf576113ce61352b565b5b60200260200101818152505082806113e690613589565b9350505b83806113f590613589565b9450505061123a565b8395505050505050919050565b611413612046565b8060108190555050565b60115481565b61142b612046565b80600f908161143a91906133a7565b5050565b601560029054906101000a900460ff1681565b600e805461145e906131ca565b80601f016020809104026020016040519081016040528092919081815260200182805461148a906131ca565b80156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b505050505081565b6114e7612046565b601254601181905550565b601560009054906101000a900460ff1681565b600d8054611512906131ca565b80601f016020809104026020016040519081016040528092919081815260200182805461153e906131ca565b801561158b5780601f106115605761010080835404028352916020019161158b565b820191906000526020600020905b81548152906001019060200180831161156e57829003601f168201915b505050505081565b600061159e826120cd565b9050919050565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361161f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611678612046565b611682600061225e565b565b61168c612046565b60115481111580156116a557506116a1610d8c565b8110155b6116ae57600080fd5b8060128190555050565b60006116c2612046565b601454905090565b6116d2612046565b80600a8190555050565b6116e4612046565b80600d90816116f391906133a7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b606060038054611736906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611762906131ca565b80156117af5780601f10611784576101008083540402835291602001916117af565b820191906000526020600020905b81548152906001019060200180831161179257829003601f168201915b5050505050905090565b601560009054906101000a900460ff1615611809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118009061361d565b60405180910390fd5b60008111801561181b57506013548111155b61185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613689565b60405180910390fd5b60125481611866610d8c565b61187091906136a9565b11156118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a89061374b565b60405180910390fd5b6000600b60006118bf612324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061191557506101f4601454115b611920576001611923565b60005b60ff1690508082611934919061376b565b601054611941919061379f565b341015611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613845565b60405180910390fd5b6014600081548092919061199690613589565b91905055506001600b60006119a9612324565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a0b611a05612324565b8361232c565b5050565b611a1761203e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a8861203e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b3561203e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7a91906129c8565b60405180910390a35050565b600f8054611b93906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf906131ca565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081565b611c1c612046565b8060138190555050565b611c2e612046565b80601560016101000a81548160ff02191690831515021790555050565b611c56848484610da3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cb857611c818484848461234a565b611cb7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611cc982611fdf565b611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff906138d7565b60405180910390fd5b60001515601560029054906101000a900460ff16151503611db557600f8054611d30906131ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5c906131ca565b8015611da95780601f10611d7e57610100808354040283529160200191611da9565b820191906000526020600020905b815481529060010190602001808311611d8c57829003601f168201915b50505050509050611e11565b6000611dbf61249a565b90506000815111611ddf5760405180602001604052806000815250611e0d565b80611de98461252c565b600e604051602001611dfd939291906139b6565b6040516020818303038152906040525b9150505b919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611e3e612046565b80601560026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ef7612046565b60125482611f03610d8c565b611f0d91906136a9565b1115611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061374b565b60405180910390fd5b611f58818361232c565b5050565b611f64612046565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90613a59565b60405180910390fd5b611fdc8161225e565b50565b600081611fea6120c4565b11158015611ff9575060005482105b8015612037575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b61204e612324565b73ffffffffffffffffffffffffffffffffffffffff1661206c6116f7565b73ffffffffffffffffffffffffffffffffffffffff16146120c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b990613ac5565b60405180910390fd5b565b60006001905090565b600080829050806120dc6120c4565b11612162576000548110156121615760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361215f575b6000810361215557600460008360019003935083815260200190815260200160002054905061212b565b8092505050612194565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861221c86868461268c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b612346828260405180602001604052806000815250612695565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237061203e565b8786866040518563ffffffff1660e01b81526004016123929493929190613b3a565b6020604051808303816000875af19250505080156123ce57506040513d601f19601f820116820180604052508101906123cb9190613b9b565b60015b612447573d80600081146123fe576040519150601f19603f3d011682016040523d82523d6000602084013e612403565b606091505b50600081510361243f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546124a9906131ca565b80601f01602080910402602001604051908101604052809291908181526020018280546124d5906131ca565b80156125225780601f106124f757610100808354040283529160200191612522565b820191906000526020600020905b81548152906001019060200180831161250557829003601f168201915b5050505050905090565b606060008203612573576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612687565b600082905060005b600082146125a557808061258e90613589565b915050600a8261259e9190613bf7565b915061257b565b60008167ffffffffffffffff8111156125c1576125c0612bfd565b5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b5090505b600085146126805760018261260c919061376b565b9150600a8561261b9190613c28565b603061262791906136a9565b60f81b81838151811061263d5761263c61352b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126799190613bf7565b94506125f7565b8093505050505b919050565b60009392505050565b61269f8383612732565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461272d57600080549050600083820390505b6126df600086838060010194508661234a565b612715576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126cc57816000541461272a57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361279e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036127d8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e560008483856121ff565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061285c8361284d6000866000612205565b61285685612904565b1761222d565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612880578060008190555050506128ff6000848385612258565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61295d81612928565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b6000602082840312156129965761299561291e565b5b60006129a48482850161296b565b91505092915050565b60008115159050919050565b6129c2816129ad565b82525050565b60006020820190506129dd60008301846129b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a4e826129e3565b612a5881856129ee565b9350612a688185602086016129ff565b612a7181612a32565b840191505092915050565b60006020820190508181036000830152612a968184612a43565b905092915050565b6000819050919050565b612ab181612a9e565b8114612abc57600080fd5b50565b600081359050612ace81612aa8565b92915050565b600060208284031215612aea57612ae961291e565b5b6000612af884828501612abf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2c82612b01565b9050919050565b612b3c81612b21565b82525050565b6000602082019050612b576000830184612b33565b92915050565b612b6681612b21565b8114612b7157600080fd5b50565b600081359050612b8381612b5d565b92915050565b60008060408385031215612ba057612b9f61291e565b5b6000612bae85828601612b74565b9250506020612bbf85828601612abf565b9150509250929050565b612bd281612a9e565b82525050565b6000602082019050612bed6000830184612bc9565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3582612a32565b810181811067ffffffffffffffff82111715612c5457612c53612bfd565b5b80604052505050565b6000612c67612914565b9050612c738282612c2c565b919050565b600067ffffffffffffffff821115612c9357612c92612bfd565b5b612c9c82612a32565b9050602081019050919050565b82818337600083830152505050565b6000612ccb612cc684612c78565b612c5d565b905082815260208101848484011115612ce757612ce6612bf8565b5b612cf2848285612ca9565b509392505050565b600082601f830112612d0f57612d0e612bf3565b5b8135612d1f848260208601612cb8565b91505092915050565b600060208284031215612d3e57612d3d61291e565b5b600082013567ffffffffffffffff811115612d5c57612d5b612923565b5b612d6884828501612cfa565b91505092915050565b612d7a816129ad565b8114612d8557600080fd5b50565b600081359050612d9781612d71565b92915050565b600060208284031215612db357612db261291e565b5b6000612dc184828501612d88565b91505092915050565b600080600060608486031215612de357612de261291e565b5b6000612df186828701612b74565b9350506020612e0286828701612b74565b9250506040612e1386828701612abf565b9150509250925092565b6000819050919050565b612e3081612e1d565b82525050565b6000602082019050612e4b6000830184612e27565b92915050565b600060208284031215612e6757612e6661291e565b5b6000612e7584828501612b74565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612eb381612a9e565b82525050565b6000612ec58383612eaa565b60208301905092915050565b6000602082019050919050565b6000612ee982612e7e565b612ef38185612e89565b9350612efe83612e9a565b8060005b83811015612f2f578151612f168882612eb9565b9750612f2183612ed1565b925050600181019050612f02565b5085935050505092915050565b60006020820190508181036000830152612f568184612ede565b905092915050565b612f6781612e1d565b8114612f7257600080fd5b50565b600081359050612f8481612f5e565b92915050565b600060208284031215612fa057612f9f61291e565b5b6000612fae84828501612f75565b91505092915050565b60008060408385031215612fce57612fcd61291e565b5b6000612fdc85828601612b74565b9250506020612fed85828601612d88565b9150509250929050565b600067ffffffffffffffff82111561301257613011612bfd565b5b61301b82612a32565b9050602081019050919050565b600061303b61303684612ff7565b612c5d565b90508281526020810184848401111561305757613056612bf8565b5b613062848285612ca9565b509392505050565b600082601f83011261307f5761307e612bf3565b5b813561308f848260208601613028565b91505092915050565b600080600080608085870312156130b2576130b161291e565b5b60006130c087828801612b74565b94505060206130d187828801612b74565b93505060406130e287828801612abf565b925050606085013567ffffffffffffffff81111561310357613102612923565b5b61310f8782880161306a565b91505092959194509250565b600080604083850312156131325761313161291e565b5b600061314085828601612b74565b925050602061315185828601612b74565b9150509250929050565b600080604083850312156131725761317161291e565b5b600061318085828601612abf565b925050602061319185828601612b74565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131e257607f821691505b6020821081036131f5576131f461319b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261325d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613220565b6132678683613220565b95508019841693508086168417925050509392505050565b6000819050919050565b60006132a461329f61329a84612a9e565b61327f565b612a9e565b9050919050565b6000819050919050565b6132be83613289565b6132d26132ca826132ab565b84845461322d565b825550505050565b600090565b6132e76132da565b6132f28184846132b5565b505050565b5b818110156133165761330b6000826132df565b6001810190506132f8565b5050565b601f82111561335b5761332c816131fb565b61333584613210565b81016020851015613344578190505b61335861335085613210565b8301826132f7565b50505b505050565b600082821c905092915050565b600061337e60001984600802613360565b1980831691505092915050565b6000613397838361336d565b9150826002028217905092915050565b6133b0826129e3565b67ffffffffffffffff8111156133c9576133c8612bfd565b5b6133d382546131ca565b6133de82828561331a565b600060209050601f83116001811461341157600084156133ff578287015190505b613409858261338b565b865550613471565b601f19841661341f866131fb565b60005b8281101561344757848901518255600182019150602085019450602081019050613422565b868310156134645784890151613460601f89168261336d565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134af601f836129ee565b91506134ba82613479565b602082019050919050565b600060208201905081810360008301526134de816134a2565b9050919050565b600081905092915050565b50565b60006135006000836134e5565b915061350b826134f0565b600082019050919050565b6000613521826134f3565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061359482612a9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135c6576135c561355a565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006136076017836129ee565b9150613612826135d1565b602082019050919050565b60006020820190508181036000830152613636816135fa565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006136736014836129ee565b915061367e8261363d565b602082019050919050565b600060208201905081810360008301526136a281613666565b9050919050565b60006136b482612a9e565b91506136bf83612a9e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f4576136f361355a565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006137356014836129ee565b9150613740826136ff565b602082019050919050565b6000602082019050818103600083015261376481613728565b9050919050565b600061377682612a9e565b915061378183612a9e565b9250828210156137945761379361355a565b5b828203905092915050565b60006137aa82612a9e565b91506137b583612a9e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ee576137ed61355a565b5b828202905092915050565b7f5041594d454e543a20696e76616c69642076616c756500000000000000000000600082015250565b600061382f6016836129ee565b915061383a826137f9565b602082019050919050565b6000602082019050818103600083015261385e81613822565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138c1602f836129ee565b91506138cc82613865565b604082019050919050565b600060208201905081810360008301526138f0816138b4565b9050919050565b600081905092915050565b600061390d826129e3565b61391781856138f7565b93506139278185602086016129ff565b80840191505092915050565b60008154613940816131ca565b61394a81866138f7565b94506001821660008114613965576001811461397a576139ad565b60ff19831686528115158202860193506139ad565b613983856131fb565b60005b838110156139a557815481890152600182019150602081019050613986565b838801955050505b50505092915050565b60006139c28286613902565b91506139ce8285613902565b91506139da8284613933565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613a436026836129ee565b9150613a4e826139e7565b604082019050919050565b60006020820190508181036000830152613a7281613a36565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613aaf6020836129ee565b9150613aba82613a79565b602082019050919050565b60006020820190508181036000830152613ade81613aa2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b0c82613ae5565b613b168185613af0565b9350613b268185602086016129ff565b613b2f81612a32565b840191505092915050565b6000608082019050613b4f6000830187612b33565b613b5c6020830186612b33565b613b696040830185612bc9565b8181036060830152613b7b8184613b01565b905095945050505050565b600081519050613b9581612954565b92915050565b600060208284031215613bb157613bb061291e565b5b6000613bbf84828501613b86565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c0282612a9e565b9150613c0d83612a9e565b925082613c1d57613c1c613bc8565b5b828204905092915050565b6000613c3382612a9e565b9150613c3e83612a9e565b925082613c4e57613c4d613bc8565b5b82820690509291505056fea2646970667358221220d8eb383f72d9a292ddc1f23e45b54743468ff0527c2ccfa7a7201b0c936f548a64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015b300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b4379626572536175646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b43796265725361756469730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5a614e314231576945595a756955524578754a7356756670364a476d536b795877484a4a6d567a4a6f634d692f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): CyberSaudis
Arg [1] : _tokenSymbol (string): CyberSaudis
Arg [2] : _cost (uint256): 0
Arg [3] : _maxSupply (uint256): 5555
Arg [4] : _maxMintAmountPerTx (uint256): 3
Arg [5] : _hiddenMetadataUri (string): ipfs://QmZaN1B1WiEYZuiURExuJsVufp6JGmSkyXwHJJmVzJocMi/hidden.json
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000015b3
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 4379626572536175646973000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 4379626572536175646973000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [11] : 697066733a2f2f516d5a614e314231576945595a756955524578754a73567566
Arg [12] : 70364a476d536b795877484a4a6d567a4a6f634d692f68696464656e2e6a736f
Arg [13] : 6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65250:4796:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35045:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40692:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42638:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42186:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65659:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65594:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69377:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69483:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34099:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51903:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65347:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65733:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69781:152;;;;;;;;;;;;;:::i;:::-;;43528:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67069:809;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68917:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65618:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69133:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65852:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65516:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68523:94;;;;;;;;;;;;;:::i;:::-;;65776:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65483:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40481:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65807:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35724:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16757:103;;;;;;;;;;;;;:::i;:::-;;68740:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68623:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69566:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69271:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65695:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40861:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66285:554;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42914:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65554:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68997:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69670:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43784:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67985:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65377:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68436:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43293:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66847:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35045:615;35130:4;35445:10;35430:25;;:11;:25;;;;:102;;;;35522:10;35507:25;;:11;:25;;;;35430:102;:179;;;;35599:10;35584:25;;:11;:25;;;;35430:179;35410:199;;35045:615;;;:::o;40692:100::-;40746:13;40779:5;40772:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40692:100;:::o;42638:204::-;42706:7;42731:16;42739:7;42731;:16::i;:::-;42726:64;;42756:34;;;;;;;;;;;;;;42726:64;42810:15;:24;42826:7;42810:24;;;;;;;;;;;;;;;;;;;;;42803:31;;42638:204;;;:::o;42186:386::-;42259:13;42275:16;42283:7;42275;:16::i;:::-;42259:32;;42331:5;42308:28;;:19;:17;:19::i;:::-;:28;;;42304:175;;42356:44;42373:5;42380:19;:17;:19::i;:::-;42356:16;:44::i;:::-;42351:128;;42428:35;;;;;;;;;;;;;;42351:128;42304:175;42518:2;42491:15;:24;42507:7;42491:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42556:7;42552:2;42536:28;;42545:5;42536:28;;;;;;;;;;;;42248:324;42186:386;;:::o;65659:31::-;;;;:::o;65594:19::-;;;;:::o;69377:100::-;15995:13;:11;:13::i;:::-;69461:10:::1;69449:9;:22;;;;;;:::i;:::-;;69377:100:::0;:::o;69483:77::-;15995:13;:11;:13::i;:::-;69548:6:::1;69539;;:15;;;;;;;;;;;;;;;;;;69483:77:::0;:::o;34099:315::-;34152:7;34380:15;:13;:15::i;:::-;34365:12;;34349:13;;:28;:46;34342:53;;34099:315;:::o;51903:2800::-;52037:27;52067;52086:7;52067:18;:27::i;:::-;52037:57;;52152:4;52111:45;;52127:19;52111:45;;;52107:86;;52165:28;;;;;;;;;;;;;;52107:86;52207:27;52236:23;52263:28;52283:7;52263:19;:28::i;:::-;52206:85;;;;52391:62;52410:15;52427:4;52433:19;:17;:19::i;:::-;52391:18;:62::i;:::-;52386:174;;52473:43;52490:4;52496:19;:17;:19::i;:::-;52473:16;:43::i;:::-;52468:92;;52525:35;;;;;;;;;;;;;;52468:92;52386:174;52591:1;52577:16;;:2;:16;;;52573:52;;52602:23;;;;;;;;;;;;;;52573:52;52638:43;52660:4;52666:2;52670:7;52679:1;52638:21;:43::i;:::-;52774:15;52771:160;;;52914:1;52893:19;52886:30;52771:160;53309:18;:24;53328:4;53309:24;;;;;;;;;;;;;;;;53307:26;;;;;;;;;;;;53378:18;:22;53397:2;53378:22;;;;;;;;;;;;;;;;53376:24;;;;;;;;;;;53700:145;53737:2;53785:45;53800:4;53806:2;53810:19;53785:14;:45::i;:::-;31327:8;53758:72;53700:18;:145::i;:::-;53671:17;:26;53689:7;53671:26;;;;;;;;;;;:174;;;;54015:1;31327:8;53965:19;:46;:51;53961:626;;54037:19;54069:1;54059:7;:11;54037:33;;54226:1;54192:17;:30;54210:11;54192:30;;;;;;;;;;;;:35;54188:384;;54330:13;;54315:11;:28;54311:242;;54510:19;54477:17;:30;54495:11;54477:30;;;;;;;;;;;:52;;;;54311:242;54188:384;54018:569;53961:626;54634:7;54630:2;54615:27;;54624:4;54615:27;;;;;;;;;;;;54653:42;54674:4;54680:2;54684:7;54693:1;54653:20;:42::i;:::-;52026:2677;;;51903:2800;;;:::o;65347:25::-;;;;:::o;65733:36::-;;;;:::o;69781:152::-;15995:13;:11;:13::i;:::-;4309:1:::1;4907:7;;:19:::0;4899:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;69841:7:::2;69862;:5;:7::i;:::-;69854:21;;69883;69854:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69840:69;;;69924:2;69916:11;;;::::0;::::2;;69833:100;4265:1:::1;5219:7;:22;;;;69781:152::o:0;43528:185::-;43666:39;43683:4;43689:2;43693:7;43666:39;;;;;;;;;;;;:16;:39::i;:::-;43528:185;;;:::o;67069:809::-;67129:16;67154:23;67180:17;67190:6;67180:9;:17::i;:::-;67154:43;;67204:30;67251:15;67237:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67204:63;;67274:22;67299:15;:13;:15::i;:::-;67274:40;;67321:23;67355:26;67394:450;67419:15;67401;:33;:71;;;;;67456:16;;67438:14;:34;;67401:71;67394:450;;;67485:31;67519:11;:27;67531:14;67519:27;;;;;;;;;;;67485:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67562:9;:16;;;67561:17;:49;;;;;67608:1;67582:28;;:9;:14;;;:28;;;;67561:49;67557:111;;;67644:9;:14;;;67623:35;;67557:111;67704:6;67682:28;;:18;:28;;;67678:132;;67756:14;67723:13;67737:15;67723:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;67783:17;;;;;:::i;:::-;;;;67678:132;67820:16;;;;;:::i;:::-;;;;67474:370;67394:450;;;67859:13;67852:20;;;;;;;67069:809;;;:::o;68917:74::-;15995:13;:11;:13::i;:::-;68980:5:::1;68973:4;:12;;;;68917:74:::0;:::o;65618:36::-;;;;:::o;69133:132::-;15995:13;:11;:13::i;:::-;69241:18:::1;69221:17;:38;;;;;;:::i;:::-;;69133:132:::0;:::o;65852:28::-;;;;;;;;;;;;;:::o;65516:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68523:94::-;15995:13;:11;:13::i;:::-;68595:16:::1;;68578:14;:33;;;;68523:94::o:0;65776:26::-;;;;;;;;;;;;;:::o;65483:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40481:144::-;40545:7;40588:27;40607:7;40588:18;:27::i;:::-;40565:52;;40481:144;;;:::o;65807:40::-;;;;;;;;;;;;;:::o;35724:224::-;35788:7;35829:1;35812:19;;:5;:19;;;35808:60;;35840:28;;;;;;;;;;;;;;35808:60;30279:13;35886:18;:25;35905:5;35886:25;;;;;;;;;;;;;;;;:54;35879:61;;35724:224;;;:::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;68740:171::-;15995:13;:11;:13::i;:::-;68829:14:::1;;68818:7;:25;;:53;;;;;68858:13;:11;:13::i;:::-;68847:7;:24;;68818:53;68810:62;;;::::0;::::1;;68898:7;68879:16;:26;;;;68740:171:::0;:::o;68623:111::-;68688:7;15995:13;:11;:13::i;:::-;68711:17:::1;;68704:24;;68623:111:::0;:::o;69566:98::-;15995:13;:11;:13::i;:::-;69647:11:::1;69634:10;:24;;;;69566:98:::0;:::o;69271:100::-;15995:13;:11;:13::i;:::-;69355:10:::1;69343:9;:22;;;;;;:::i;:::-;;69271:100:::0;:::o;16109:87::-;16155:7;16182:6;;;;;;;;;;;16175:13;;16109:87;:::o;65695:33::-;;;;:::o;40861:104::-;40917:13;40950:7;40943:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40861:104;:::o;66285:554::-;66353:6;;;;;;;;;;;66352:7;66344:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66416:1;66402:11;:15;:52;;;;;66436:18;;66421:11;:33;;66402:52;66394:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66525:16;;66510:11;66494:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:47;;66486:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;66573:9;66586:7;:21;66594:12;:10;:12::i;:::-;66586:21;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;66631:3;66611:17;;:23;66586:48;66585:58;;66642:1;66585:58;;;66638:1;66585:58;66573:70;;;;66693:4;66679:11;:18;;;;:::i;:::-;66671:4;;:27;;;;:::i;:::-;66658:9;:40;;66650:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66734:17;;:19;;;;;;;;;:::i;:::-;;;;;;66784:4;66760:7;:21;66768:12;:10;:12::i;:::-;66760:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;66797:36;66807:12;:10;:12::i;:::-;66821:11;66797:9;:36::i;:::-;66337:502;66285:554;:::o;42914:308::-;43025:19;:17;:19::i;:::-;43013:31;;:8;:31;;;43009:61;;43053:17;;;;;;;;;;;;;;43009:61;43135:8;43083:18;:39;43102:19;:17;:19::i;:::-;43083:39;;;;;;;;;;;;;;;:49;43123:8;43083:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;43195:8;43159:55;;43174:19;:17;:19::i;:::-;43159:55;;;43205:8;43159:55;;;;;;:::i;:::-;;;;;;;;42914:308;;:::o;65554:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68997:130::-;15995:13;:11;:13::i;:::-;69102:19:::1;69081:18;:40;;;;68997:130:::0;:::o;69670:105::-;15995:13;:11;:13::i;:::-;69763:6:::1;69740:20;;:29;;;;;;;;;;;;;;;;;;69670:105:::0;:::o;43784:399::-;43951:31;43964:4;43970:2;43974:7;43951:12;:31::i;:::-;44015:1;43997:2;:14;;;:19;43993:183;;44036:56;44067:4;44073:2;44077:7;44086:5;44036:30;:56::i;:::-;44031:145;;44120:40;;;;;;;;;;;;;;44031:145;43993:183;43784:399;;;;:::o;67985:445::-;68059:13;68089:17;68097:8;68089:7;:17::i;:::-;68081:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68183:5;68171:17;;:8;;;;;;;;;;;:17;;;68167:64;;68206:17;68199:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68167:64;68239:28;68270:10;:8;:10::i;:::-;68239:41;;68325:1;68300:14;68294:28;:32;:130;;;;;;;;;;;;;;;;;68362:14;68378:19;:8;:17;:19::i;:::-;68399:9;68345:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68294:130;68287:137;;;67985:445;;;;:::o;65377:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;68436:81::-;15995:13;:11;:13::i;:::-;68505:6:::1;68494:8;;:17;;;;;;;;;;;;;;;;;;68436:81:::0;:::o;43293:164::-;43390:4;43414:18;:25;43433:5;43414:25;;;;;;;;;;;;;;;:35;43440:8;43414:35;;;;;;;;;;;;;;;;;;;;;;;;;43407:42;;43293:164;;;;:::o;66847:216::-;15995:13;:11;:13::i;:::-;66976:16:::1;;66961:11;66945:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:47;;66937:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;67024:33;67034:9;67045:11;67024:9;:33::i;:::-;66847:216:::0;;:::o;17015:201::-;15995:13;:11;:13::i;:::-;17124:1:::1;17104:22;;:8;:22;;::::0;17096:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;44438:273::-;44495:4;44551:7;44532:15;:13;:15::i;:::-;:26;;:66;;;;;44585:13;;44575:7;:23;44532:66;:152;;;;;44683:1;31049:8;44636:17;:26;44654:7;44636:26;;;;;;;;;;;;:43;:48;44532:152;44512:172;;44438:273;;;:::o;62999:105::-;63059:7;63086:10;63079:17;;62999:105;:::o;16274:132::-;16349:12;:10;:12::i;:::-;16338:23;;:7;:5;:7::i;:::-;:23;;;16330:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:132::o;67884:95::-;67949:7;67972:1;67965:8;;67884:95;:::o;37398:1129::-;37465:7;37485:12;37500:7;37485:22;;37568:4;37549:15;:13;:15::i;:::-;:23;37545:915;;37602:13;;37595:4;:20;37591:869;;;37640:14;37657:17;:23;37675:4;37657:23;;;;;;;;;;;;37640:40;;37773:1;31049:8;37746:6;:23;:28;37742:699;;38265:113;38282:1;38272:6;:11;38265:113;;38325:17;:25;38343:6;;;;;;;38325:25;;;;;;;;;;;;38316:34;;38265:113;;;38411:6;38404:13;;;;;;37742:699;37617:843;37591:869;37545:915;38488:31;;;;;;;;;;;;;;37398:1129;;;;:::o;50239:652::-;50334:27;50363:23;50404:53;50460:15;50404:71;;50646:7;50640:4;50633:21;50681:22;50675:4;50668:36;50757:4;50751;50741:21;50718:44;;50853:19;50847:26;50828:45;;50584:300;50239:652;;;:::o;51004:645::-;51146:11;51308:15;51302:4;51298:26;51290:34;;51467:15;51456:9;51452:31;51439:44;;51614:15;51603:9;51600:30;51593:4;51582:9;51579:19;51576:55;51566:65;;51004:645;;;;;:::o;61832:159::-;;;;;:::o;60144:309::-;60279:7;60299:16;31450:3;60325:19;:40;;60299:67;;31450:3;60392:31;60403:4;60409:2;60413:9;60392:10;:31::i;:::-;60384:40;;:61;;60377:68;;;60144:309;;;;;:::o;39972:447::-;40052:14;40220:15;40213:5;40209:27;40200:36;;40394:5;40380:11;40356:22;40352:40;40349:51;40342:5;40339:62;40329:72;;39972:447;;;;:::o;62650:158::-;;;;;:::o;17376:191::-;17450:16;17469:6;;;;;;;;;;;17450:25;;17495:8;17486:6;;:17;;;;;;;;;;;;;;;;;;17550:8;17519:40;;17540:8;17519:40;;;;;;;;;;;;17439:128;17376:191;:::o;14660:98::-;14713:7;14740:10;14733:17;;14660:98;:::o;44795:104::-;44864:27;44874:2;44878:8;44864:27;;;;;;;;;;;;:9;:27::i;:::-;44795:104;;:::o;58654:716::-;58817:4;58863:2;58838:45;;;58884:19;:17;:19::i;:::-;58905:4;58911:7;58920:5;58838:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58834:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59138:1;59121:6;:13;:18;59117:235;;59167:40;;;;;;;;;;;;;;59117:235;59310:6;59304:13;59295:6;59291:2;59287:15;59280:38;58834:529;59007:54;;;58997:64;;;:6;:64;;;;58990:71;;;58654:716;;;;;;:::o;69939:104::-;69999:13;70028:9;70021:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69939:104;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;61029:147::-;61166:6;61029:147;;;;;:::o;45315:681::-;45438:19;45444:2;45448:8;45438:5;:19::i;:::-;45517:1;45499:2;:14;;;:19;45495:483;;45539:11;45553:13;;45539:27;;45585:13;45607:8;45601:3;:14;45585:30;;45634:233;45665:62;45704:1;45708:2;45712:7;;;;;;45721:5;45665:30;:62::i;:::-;45660:167;;45763:40;;;;;;;;;;;;;;45660:167;45862:3;45854:5;:11;45634:233;;45949:3;45932:13;;:20;45928:34;;45954:8;;;45928:34;45520:458;;45495:483;45315:681;;;:::o;46269:1529::-;46334:20;46357:13;;46334:36;;46399:1;46385:16;;:2;:16;;;46381:48;;46410:19;;;;;;;;;;;;;;46381:48;46456:1;46444:8;:13;46440:44;;46466:18;;;;;;;;;;;;;;46440:44;46497:61;46527:1;46531:2;46535:12;46549:8;46497:21;:61::i;:::-;47040:1;30416:2;47011:1;:25;;47010:31;46998:8;:44;46972:18;:22;46991:2;46972:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;47319:139;47356:2;47410:33;47433:1;47437:2;47441:1;47410:14;:33::i;:::-;47377:30;47398:8;47377:20;:30::i;:::-;:66;47319:18;:139::i;:::-;47285:17;:31;47303:12;47285:31;;;;;;;;;;;:173;;;;47475:15;47493:12;47475:30;;47520:11;47549:8;47534:12;:23;47520:37;;47572:101;47624:9;;;;;;47620:2;47599:35;;47616:1;47599:35;;;;;;;;;;;;47668:3;47658:7;:13;47572:101;;47705:3;47689:13;:19;;;;46746:974;;47730:60;47759:1;47763:2;47767:12;47781:8;47730:20;:60::i;:::-;46323:1475;46269:1529;;:::o;41802:322::-;41872:14;42103:1;42093:8;42090:15;42065:23;42061:45;42051:55;;41802:322;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:77::-;9163:7;9192:5;9181:16;;9126:77;;;:::o;9209:118::-;9296:24;9314:5;9296:24;:::i;:::-;9291:3;9284:37;9209:118;;:::o;9333:222::-;9426:4;9464:2;9453:9;9449:18;9441:26;;9477:71;9545:1;9534:9;9530:17;9521:6;9477:71;:::i;:::-;9333:222;;;;:::o;9561:329::-;9620:6;9669:2;9657:9;9648:7;9644:23;9640:32;9637:119;;;9675:79;;:::i;:::-;9637:119;9795:1;9820:53;9865:7;9856:6;9845:9;9841:22;9820:53;:::i;:::-;9810:63;;9766:117;9561:329;;;;:::o;9896:114::-;9963:6;9997:5;9991:12;9981:22;;9896:114;;;:::o;10016:184::-;10115:11;10149:6;10144:3;10137:19;10189:4;10184:3;10180:14;10165:29;;10016:184;;;;:::o;10206:132::-;10273:4;10296:3;10288:11;;10326:4;10321:3;10317:14;10309:22;;10206:132;;;:::o;10344:108::-;10421:24;10439:5;10421:24;:::i;:::-;10416:3;10409:37;10344:108;;:::o;10458:179::-;10527:10;10548:46;10590:3;10582:6;10548:46;:::i;:::-;10626:4;10621:3;10617:14;10603:28;;10458:179;;;;:::o;10643:113::-;10713:4;10745;10740:3;10736:14;10728:22;;10643:113;;;:::o;10792:732::-;10911:3;10940:54;10988:5;10940:54;:::i;:::-;11010:86;11089:6;11084:3;11010:86;:::i;:::-;11003:93;;11120:56;11170:5;11120:56;:::i;:::-;11199:7;11230:1;11215:284;11240:6;11237:1;11234:13;11215:284;;;11316:6;11310:13;11343:63;11402:3;11387:13;11343:63;:::i;:::-;11336:70;;11429:60;11482:6;11429:60;:::i;:::-;11419:70;;11275:224;11262:1;11259;11255:9;11250:14;;11215:284;;;11219:14;11515:3;11508:10;;10916:608;;;10792:732;;;;:::o;11530:373::-;11673:4;11711:2;11700:9;11696:18;11688:26;;11760:9;11754:4;11750:20;11746:1;11735:9;11731:17;11724:47;11788:108;11891:4;11882:6;11788:108;:::i;:::-;11780:116;;11530:373;;;;:::o;11909:122::-;11982:24;12000:5;11982:24;:::i;:::-;11975:5;11972:35;11962:63;;12021:1;12018;12011:12;11962:63;11909:122;:::o;12037:139::-;12083:5;12121:6;12108:20;12099:29;;12137:33;12164:5;12137:33;:::i;:::-;12037:139;;;;:::o;12182:329::-;12241:6;12290:2;12278:9;12269:7;12265:23;12261:32;12258:119;;;12296:79;;:::i;:::-;12258:119;12416:1;12441:53;12486:7;12477:6;12466:9;12462:22;12441:53;:::i;:::-;12431:63;;12387:117;12182:329;;;;:::o;12517:468::-;12582:6;12590;12639:2;12627:9;12618:7;12614:23;12610:32;12607:119;;;12645:79;;:::i;:::-;12607:119;12765:1;12790:53;12835:7;12826:6;12815:9;12811:22;12790:53;:::i;:::-;12780:63;;12736:117;12892:2;12918:50;12960:7;12951:6;12940:9;12936:22;12918:50;:::i;:::-;12908:60;;12863:115;12517:468;;;;;:::o;12991:307::-;13052:4;13142:18;13134:6;13131:30;13128:56;;;13164:18;;:::i;:::-;13128:56;13202:29;13224:6;13202:29;:::i;:::-;13194:37;;13286:4;13280;13276:15;13268:23;;12991:307;;;:::o;13304:410::-;13381:5;13406:65;13422:48;13463:6;13422:48;:::i;:::-;13406:65;:::i;:::-;13397:74;;13494:6;13487:5;13480:21;13532:4;13525:5;13521:16;13570:3;13561:6;13556:3;13552:16;13549:25;13546:112;;;13577:79;;:::i;:::-;13546:112;13667:41;13701:6;13696:3;13691;13667:41;:::i;:::-;13387:327;13304:410;;;;;:::o;13733:338::-;13788:5;13837:3;13830:4;13822:6;13818:17;13814:27;13804:122;;13845:79;;:::i;:::-;13804:122;13962:6;13949:20;13987:78;14061:3;14053:6;14046:4;14038:6;14034:17;13987:78;:::i;:::-;13978:87;;13794:277;13733:338;;;;:::o;14077:943::-;14172:6;14180;14188;14196;14245:3;14233:9;14224:7;14220:23;14216:33;14213:120;;;14252:79;;:::i;:::-;14213:120;14372:1;14397:53;14442:7;14433:6;14422:9;14418:22;14397:53;:::i;:::-;14387:63;;14343:117;14499:2;14525:53;14570:7;14561:6;14550:9;14546:22;14525:53;:::i;:::-;14515:63;;14470:118;14627:2;14653:53;14698:7;14689:6;14678:9;14674:22;14653:53;:::i;:::-;14643:63;;14598:118;14783:2;14772:9;14768:18;14755:32;14814:18;14806:6;14803:30;14800:117;;;14836:79;;:::i;:::-;14800:117;14941:62;14995:7;14986:6;14975:9;14971:22;14941:62;:::i;:::-;14931:72;;14726:287;14077:943;;;;;;;:::o;15026:474::-;15094:6;15102;15151:2;15139:9;15130:7;15126:23;15122:32;15119:119;;;15157:79;;:::i;:::-;15119:119;15277:1;15302:53;15347:7;15338:6;15327:9;15323:22;15302:53;:::i;:::-;15292:63;;15248:117;15404:2;15430:53;15475:7;15466:6;15455:9;15451:22;15430:53;:::i;:::-;15420:63;;15375:118;15026:474;;;;;:::o;15506:::-;15574:6;15582;15631:2;15619:9;15610:7;15606:23;15602:32;15599:119;;;15637:79;;:::i;:::-;15599:119;15757:1;15782:53;15827:7;15818:6;15807:9;15803:22;15782:53;:::i;:::-;15772:63;;15728:117;15884:2;15910:53;15955:7;15946:6;15935:9;15931:22;15910:53;:::i;:::-;15900:63;;15855:118;15506:474;;;;;:::o;15986:180::-;16034:77;16031:1;16024:88;16131:4;16128:1;16121:15;16155:4;16152:1;16145:15;16172:320;16216:6;16253:1;16247:4;16243:12;16233:22;;16300:1;16294:4;16290:12;16321:18;16311:81;;16377:4;16369:6;16365:17;16355:27;;16311:81;16439:2;16431:6;16428:14;16408:18;16405:38;16402:84;;16458:18;;:::i;:::-;16402:84;16223:269;16172:320;;;:::o;16498:141::-;16547:4;16570:3;16562:11;;16593:3;16590:1;16583:14;16627:4;16624:1;16614:18;16606:26;;16498:141;;;:::o;16645:93::-;16682:6;16729:2;16724;16717:5;16713:14;16709:23;16699:33;;16645:93;;;:::o;16744:107::-;16788:8;16838:5;16832:4;16828:16;16807:37;;16744:107;;;;:::o;16857:393::-;16926:6;16976:1;16964:10;16960:18;16999:97;17029:66;17018:9;16999:97;:::i;:::-;17117:39;17147:8;17136:9;17117:39;:::i;:::-;17105:51;;17189:4;17185:9;17178:5;17174:21;17165:30;;17238:4;17228:8;17224:19;17217:5;17214:30;17204:40;;16933:317;;16857:393;;;;;:::o;17256:60::-;17284:3;17305:5;17298:12;;17256:60;;;:::o;17322:142::-;17372:9;17405:53;17423:34;17432:24;17450:5;17432:24;:::i;:::-;17423:34;:::i;:::-;17405:53;:::i;:::-;17392:66;;17322:142;;;:::o;17470:75::-;17513:3;17534:5;17527:12;;17470:75;;;:::o;17551:269::-;17661:39;17692:7;17661:39;:::i;:::-;17722:91;17771:41;17795:16;17771:41;:::i;:::-;17763:6;17756:4;17750:11;17722:91;:::i;:::-;17716:4;17709:105;17627:193;17551:269;;;:::o;17826:73::-;17871:3;17826:73;:::o;17905:189::-;17982:32;;:::i;:::-;18023:65;18081:6;18073;18067:4;18023:65;:::i;:::-;17958:136;17905:189;;:::o;18100:186::-;18160:120;18177:3;18170:5;18167:14;18160:120;;;18231:39;18268:1;18261:5;18231:39;:::i;:::-;18204:1;18197:5;18193:13;18184:22;;18160:120;;;18100:186;;:::o;18292:543::-;18393:2;18388:3;18385:11;18382:446;;;18427:38;18459:5;18427:38;:::i;:::-;18511:29;18529:10;18511:29;:::i;:::-;18501:8;18497:44;18694:2;18682:10;18679:18;18676:49;;;18715:8;18700:23;;18676:49;18738:80;18794:22;18812:3;18794:22;:::i;:::-;18784:8;18780:37;18767:11;18738:80;:::i;:::-;18397:431;;18382:446;18292:543;;;:::o;18841:117::-;18895:8;18945:5;18939:4;18935:16;18914:37;;18841:117;;;;:::o;18964:169::-;19008:6;19041:51;19089:1;19085:6;19077:5;19074:1;19070:13;19041:51;:::i;:::-;19037:56;19122:4;19116;19112:15;19102:25;;19015:118;18964:169;;;;:::o;19138:295::-;19214:4;19360:29;19385:3;19379:4;19360:29;:::i;:::-;19352:37;;19422:3;19419:1;19415:11;19409:4;19406:21;19398:29;;19138:295;;;;:::o;19438:1395::-;19555:37;19588:3;19555:37;:::i;:::-;19657:18;19649:6;19646:30;19643:56;;;19679:18;;:::i;:::-;19643:56;19723:38;19755:4;19749:11;19723:38;:::i;:::-;19808:67;19868:6;19860;19854:4;19808:67;:::i;:::-;19902:1;19926:4;19913:17;;19958:2;19950:6;19947:14;19975:1;19970:618;;;;20632:1;20649:6;20646:77;;;20698:9;20693:3;20689:19;20683:26;20674:35;;20646:77;20749:67;20809:6;20802:5;20749:67;:::i;:::-;20743:4;20736:81;20605:222;19940:887;;19970:618;20022:4;20018:9;20010:6;20006:22;20056:37;20088:4;20056:37;:::i;:::-;20115:1;20129:208;20143:7;20140:1;20137:14;20129:208;;;20222:9;20217:3;20213:19;20207:26;20199:6;20192:42;20273:1;20265:6;20261:14;20251:24;;20320:2;20309:9;20305:18;20292:31;;20166:4;20163:1;20159:12;20154:17;;20129:208;;;20365:6;20356:7;20353:19;20350:179;;;20423:9;20418:3;20414:19;20408:26;20466:48;20508:4;20500:6;20496:17;20485:9;20466:48;:::i;:::-;20458:6;20451:64;20373:156;20350:179;20575:1;20571;20563:6;20559:14;20555:22;20549:4;20542:36;19977:611;;;19940:887;;19530:1303;;;19438:1395;;:::o;20839:181::-;20979:33;20975:1;20967:6;20963:14;20956:57;20839:181;:::o;21026:366::-;21168:3;21189:67;21253:2;21248:3;21189:67;:::i;:::-;21182:74;;21265:93;21354:3;21265:93;:::i;:::-;21383:2;21378:3;21374:12;21367:19;;21026:366;;;:::o;21398:419::-;21564:4;21602:2;21591:9;21587:18;21579:26;;21651:9;21645:4;21641:20;21637:1;21626:9;21622:17;21615:47;21679:131;21805:4;21679:131;:::i;:::-;21671:139;;21398:419;;;:::o;21823:147::-;21924:11;21961:3;21946:18;;21823:147;;;;:::o;21976:114::-;;:::o;22096:398::-;22255:3;22276:83;22357:1;22352:3;22276:83;:::i;:::-;22269:90;;22368:93;22457:3;22368:93;:::i;:::-;22486:1;22481:3;22477:11;22470:18;;22096:398;;;:::o;22500:379::-;22684:3;22706:147;22849:3;22706:147;:::i;:::-;22699:154;;22870:3;22863:10;;22500:379;;;:::o;22885:180::-;22933:77;22930:1;22923:88;23030:4;23027:1;23020:15;23054:4;23051:1;23044:15;23071:180;23119:77;23116:1;23109:88;23216:4;23213:1;23206:15;23240:4;23237:1;23230:15;23257:233;23296:3;23319:24;23337:5;23319:24;:::i;:::-;23310:33;;23365:66;23358:5;23355:77;23352:103;;23435:18;;:::i;:::-;23352:103;23482:1;23475:5;23471:13;23464:20;;23257:233;;;:::o;23496:173::-;23636:25;23632:1;23624:6;23620:14;23613:49;23496:173;:::o;23675:366::-;23817:3;23838:67;23902:2;23897:3;23838:67;:::i;:::-;23831:74;;23914:93;24003:3;23914:93;:::i;:::-;24032:2;24027:3;24023:12;24016:19;;23675:366;;;:::o;24047:419::-;24213:4;24251:2;24240:9;24236:18;24228:26;;24300:9;24294:4;24290:20;24286:1;24275:9;24271:17;24264:47;24328:131;24454:4;24328:131;:::i;:::-;24320:139;;24047:419;;;:::o;24472:170::-;24612:22;24608:1;24600:6;24596:14;24589:46;24472:170;:::o;24648:366::-;24790:3;24811:67;24875:2;24870:3;24811:67;:::i;:::-;24804:74;;24887:93;24976:3;24887:93;:::i;:::-;25005:2;25000:3;24996:12;24989:19;;24648:366;;;:::o;25020:419::-;25186:4;25224:2;25213:9;25209:18;25201:26;;25273:9;25267:4;25263:20;25259:1;25248:9;25244:17;25237:47;25301:131;25427:4;25301:131;:::i;:::-;25293:139;;25020:419;;;:::o;25445:305::-;25485:3;25504:20;25522:1;25504:20;:::i;:::-;25499:25;;25538:20;25556:1;25538:20;:::i;:::-;25533:25;;25692:1;25624:66;25620:74;25617:1;25614:81;25611:107;;;25698:18;;:::i;:::-;25611:107;25742:1;25739;25735:9;25728:16;;25445:305;;;;:::o;25756:170::-;25896:22;25892:1;25884:6;25880:14;25873:46;25756:170;:::o;25932:366::-;26074:3;26095:67;26159:2;26154:3;26095:67;:::i;:::-;26088:74;;26171:93;26260:3;26171:93;:::i;:::-;26289:2;26284:3;26280:12;26273:19;;25932:366;;;:::o;26304:419::-;26470:4;26508:2;26497:9;26493:18;26485:26;;26557:9;26551:4;26547:20;26543:1;26532:9;26528:17;26521:47;26585:131;26711:4;26585:131;:::i;:::-;26577:139;;26304:419;;;:::o;26729:191::-;26769:4;26789:20;26807:1;26789:20;:::i;:::-;26784:25;;26823:20;26841:1;26823:20;:::i;:::-;26818:25;;26862:1;26859;26856:8;26853:34;;;26867:18;;:::i;:::-;26853:34;26912:1;26909;26905:9;26897:17;;26729:191;;;;:::o;26926:348::-;26966:7;26989:20;27007:1;26989:20;:::i;:::-;26984:25;;27023:20;27041:1;27023:20;:::i;:::-;27018:25;;27211:1;27143:66;27139:74;27136:1;27133:81;27128:1;27121:9;27114:17;27110:105;27107:131;;;27218:18;;:::i;:::-;27107:131;27266:1;27263;27259:9;27248:20;;26926:348;;;;:::o;27280:172::-;27420:24;27416:1;27408:6;27404:14;27397:48;27280:172;:::o;27458:366::-;27600:3;27621:67;27685:2;27680:3;27621:67;:::i;:::-;27614:74;;27697:93;27786:3;27697:93;:::i;:::-;27815:2;27810:3;27806:12;27799:19;;27458:366;;;:::o;27830:419::-;27996:4;28034:2;28023:9;28019:18;28011:26;;28083:9;28077:4;28073:20;28069:1;28058:9;28054:17;28047:47;28111:131;28237:4;28111:131;:::i;:::-;28103:139;;27830:419;;;:::o;28255:234::-;28395:34;28391:1;28383:6;28379:14;28372:58;28464:17;28459:2;28451:6;28447:15;28440:42;28255:234;:::o;28495:366::-;28637:3;28658:67;28722:2;28717:3;28658:67;:::i;:::-;28651:74;;28734:93;28823:3;28734:93;:::i;:::-;28852:2;28847:3;28843:12;28836:19;;28495:366;;;:::o;28867:419::-;29033:4;29071:2;29060:9;29056:18;29048:26;;29120:9;29114:4;29110:20;29106:1;29095:9;29091:17;29084:47;29148:131;29274:4;29148:131;:::i;:::-;29140:139;;28867:419;;;:::o;29292:148::-;29394:11;29431:3;29416:18;;29292:148;;;;:::o;29446:377::-;29552:3;29580:39;29613:5;29580:39;:::i;:::-;29635:89;29717:6;29712:3;29635:89;:::i;:::-;29628:96;;29733:52;29778:6;29773:3;29766:4;29759:5;29755:16;29733:52;:::i;:::-;29810:6;29805:3;29801:16;29794:23;;29556:267;29446:377;;;;:::o;29853:874::-;29956:3;29993:5;29987:12;30022:36;30048:9;30022:36;:::i;:::-;30074:89;30156:6;30151:3;30074:89;:::i;:::-;30067:96;;30194:1;30183:9;30179:17;30210:1;30205:166;;;;30385:1;30380:341;;;;30172:549;;30205:166;30289:4;30285:9;30274;30270:25;30265:3;30258:38;30351:6;30344:14;30337:22;30329:6;30325:35;30320:3;30316:45;30309:52;;30205:166;;30380:341;30447:38;30479:5;30447:38;:::i;:::-;30507:1;30521:154;30535:6;30532:1;30529:13;30521:154;;;30609:7;30603:14;30599:1;30594:3;30590:11;30583:35;30659:1;30650:7;30646:15;30635:26;;30557:4;30554:1;30550:12;30545:17;;30521:154;;;30704:6;30699:3;30695:16;30688:23;;30387:334;;30172:549;;29960:767;;29853:874;;;;:::o;30733:589::-;30958:3;30980:95;31071:3;31062:6;30980:95;:::i;:::-;30973:102;;31092:95;31183:3;31174:6;31092:95;:::i;:::-;31085:102;;31204:92;31292:3;31283:6;31204:92;:::i;:::-;31197:99;;31313:3;31306:10;;30733:589;;;;;;:::o;31328:225::-;31468:34;31464:1;31456:6;31452:14;31445:58;31537:8;31532:2;31524:6;31520:15;31513:33;31328:225;:::o;31559:366::-;31701:3;31722:67;31786:2;31781:3;31722:67;:::i;:::-;31715:74;;31798:93;31887:3;31798:93;:::i;:::-;31916:2;31911:3;31907:12;31900:19;;31559:366;;;:::o;31931:419::-;32097:4;32135:2;32124:9;32120:18;32112:26;;32184:9;32178:4;32174:20;32170:1;32159:9;32155:17;32148:47;32212:131;32338:4;32212:131;:::i;:::-;32204:139;;31931:419;;;:::o;32356:182::-;32496:34;32492:1;32484:6;32480:14;32473:58;32356:182;:::o;32544:366::-;32686:3;32707:67;32771:2;32766:3;32707:67;:::i;:::-;32700:74;;32783:93;32872:3;32783:93;:::i;:::-;32901:2;32896:3;32892:12;32885:19;;32544:366;;;:::o;32916:419::-;33082:4;33120:2;33109:9;33105:18;33097:26;;33169:9;33163:4;33159:20;33155:1;33144:9;33140:17;33133:47;33197:131;33323:4;33197:131;:::i;:::-;33189:139;;32916:419;;;:::o;33341:98::-;33392:6;33426:5;33420:12;33410:22;;33341:98;;;:::o;33445:168::-;33528:11;33562:6;33557:3;33550:19;33602:4;33597:3;33593:14;33578:29;;33445:168;;;;:::o;33619:360::-;33705:3;33733:38;33765:5;33733:38;:::i;:::-;33787:70;33850:6;33845:3;33787:70;:::i;:::-;33780:77;;33866:52;33911:6;33906:3;33899:4;33892:5;33888:16;33866:52;:::i;:::-;33943:29;33965:6;33943:29;:::i;:::-;33938:3;33934:39;33927:46;;33709:270;33619:360;;;;:::o;33985:640::-;34180:4;34218:3;34207:9;34203:19;34195:27;;34232:71;34300:1;34289:9;34285:17;34276:6;34232:71;:::i;:::-;34313:72;34381:2;34370:9;34366:18;34357:6;34313:72;:::i;:::-;34395;34463:2;34452:9;34448:18;34439:6;34395:72;:::i;:::-;34514:9;34508:4;34504:20;34499:2;34488:9;34484:18;34477:48;34542:76;34613:4;34604:6;34542:76;:::i;:::-;34534:84;;33985:640;;;;;;;:::o;34631:141::-;34687:5;34718:6;34712:13;34703:22;;34734:32;34760:5;34734:32;:::i;:::-;34631:141;;;;:::o;34778:349::-;34847:6;34896:2;34884:9;34875:7;34871:23;34867:32;34864:119;;;34902:79;;:::i;:::-;34864:119;35022:1;35047:63;35102:7;35093:6;35082:9;35078:22;35047:63;:::i;:::-;35037:73;;34993:127;34778:349;;;;:::o;35133:180::-;35181:77;35178:1;35171:88;35278:4;35275:1;35268:15;35302:4;35299:1;35292:15;35319:185;35359:1;35376:20;35394:1;35376:20;:::i;:::-;35371:25;;35410:20;35428:1;35410:20;:::i;:::-;35405:25;;35449:1;35439:35;;35454:18;;:::i;:::-;35439:35;35496:1;35493;35489:9;35484:14;;35319:185;;;;:::o;35510:176::-;35542:1;35559:20;35577:1;35559:20;:::i;:::-;35554:25;;35593:20;35611:1;35593:20;:::i;:::-;35588:25;;35632:1;35622:35;;35637:18;;:::i;:::-;35622:35;35678:1;35675;35671:9;35666:14;;35510:176;;;;:::o
Swarm Source
ipfs://d8eb383f72d9a292ddc1f23e45b54743468ff0527c2ccfa7a7201b0c936f548a
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.