Overview
TokenID
200
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
iCAN
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-22 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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); } // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: skullcans.sol // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; 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 Returns the rebuilt hash obtained by traversing a Merklee 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++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } /** * @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: contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @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: contracts/skullcan.sol pragma solidity ^0.8.4; contract iCAN is ERC721A, Ownable { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public whitelistClaimed; mapping(address => uint256) public addressMintedBalance; string public baseURI; string public OScontractURI; string public baseExtension = ".json"; string public notRevealedUri; uint256 public cost = 0.00 ether; uint256 public newCost = 0.0069 ether; uint256 public maxSupply = 500; uint256 public maxMintAmount = 4; uint256 public nftPerAddressLimit = 2; bool public paused = true; bool public revealed = false; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initContractURI ) ERC721A(_name, _symbol) { setBaseURI(_initBaseURI); setContractURI(_initContractURI); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function updateCost(uint256 _cost) public onlyOwner{ newCost = _cost; } // owner mint function ownerMint(uint256 _mintAmount) public onlyOwner { uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); _safeMint(_msgSender(), _mintAmount); } // Allow List Mint function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable { // Verify whitelist requirements require(balanceOf(msg.sender)+ _mintAmount < nftPerAddressLimit, "max nft per wallet limit reached"); require(!whitelistClaimed[_msgSender()], "Address already claimed!"); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!"); whitelistClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } // public function mint(uint256 _mintAmount) public payable { require(!paused, "the contract is paused"); uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); require(_mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); require(msg.value >= newCost * _mintAmount, "insufficient funds"); _safeMint(_msgSender(), _mintAmount); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } // Reveal Art function reveal(bool _state) public onlyOwner { revealed = _state; } // Pause Contract function pause(bool _state) public onlyOwner { paused = _state; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setPublicCost(uint256 _newPrice) public onlyOwner { newCost = _newPrice; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setContractURI(string memory _newContractURI) public onlyOwner { OScontractURI = _newContractURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function setCost(uint256 _cost) external onlyOwner { cost = _cost; } //OpenSea metadata initialization function contractURI() public view returns (string memory) { return OScontractURI; } function withdraw() public onlyOwner { // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initContractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OScontractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"updateCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90816200004a9190620005b4565b5060006010556618838370f340006011556101f4601255600460135560026014556001601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff021916908315150217905550348015620000ae57600080fd5b506040516200484b3803806200484b8339818101604052810190620000d49190620007ff565b83838160029081620000e79190620005b4565b508060039081620000f99190620005b4565b506200010a6200015e60201b60201c565b600081905550505062000132620001266200016760201b60201c565b6200016f60201b60201c565b62000143826200023560201b60201c565b62000154816200025a60201b60201c565b5050505062000970565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002456200027f60201b60201c565b80600c9081620002569190620005b4565b5050565b6200026a6200027f60201b60201c565b80600d90816200027b9190620005b4565b5050565b6200028f6200016760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b56200031060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000305906200094e565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003bc57607f821691505b602082108103620003d257620003d162000374565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fd565b620004488683620003fd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004956200048f620004898462000460565b6200046a565b62000460565b9050919050565b6000819050919050565b620004b18362000474565b620004c9620004c0826200049c565b8484546200040a565b825550505050565b600090565b620004e0620004d1565b620004ed818484620004a6565b505050565b5b81811015620005155762000509600082620004d6565b600181019050620004f3565b5050565b601f82111562000564576200052e81620003d8565b6200053984620003ed565b8101602085101562000549578190505b620005616200055885620003ed565b830182620004f2565b50505b505050565b600082821c905092915050565b6000620005896000198460080262000569565b1980831691505092915050565b6000620005a4838362000576565b9150826002028217905092915050565b620005bf826200033a565b67ffffffffffffffff811115620005db57620005da62000345565b5b620005e78254620003a3565b620005f482828562000519565b600060209050601f8311600181146200062c576000841562000617578287015190505b62000623858262000596565b86555062000693565b601f1984166200063c86620003d8565b60005b8281101562000666578489015182556001820191506020850194506020810190506200063f565b8683101562000686578489015162000682601f89168262000576565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006d582620006b9565b810181811067ffffffffffffffff82111715620006f757620006f662000345565b5b80604052505050565b60006200070c6200069b565b90506200071a8282620006ca565b919050565b600067ffffffffffffffff8211156200073d576200073c62000345565b5b6200074882620006b9565b9050602081019050919050565b60005b838110156200077557808201518184015260208101905062000758565b60008484015250505050565b60006200079862000792846200071f565b62000700565b905082815260208101848484011115620007b757620007b6620006b4565b5b620007c484828562000755565b509392505050565b600082601f830112620007e457620007e3620006af565b5b8151620007f684826020860162000781565b91505092915050565b600080600080608085870312156200081c576200081b620006a5565b5b600085015167ffffffffffffffff8111156200083d576200083c620006aa565b5b6200084b87828801620007cc565b945050602085015167ffffffffffffffff8111156200086f576200086e620006aa565b5b6200087d87828801620007cc565b935050604085015167ffffffffffffffff811115620008a157620008a0620006aa565b5b620008af87828801620007cc565b925050606085015167ffffffffffffffff811115620008d357620008d2620006aa565b5b620008e187828801620007cc565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000936602083620008ed565b91506200094382620008fe565b602082019050919050565b60006020820190508181036000830152620009698162000927565b9050919050565b613ecb80620009806000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063c6682862116100c1578063da3ef23f1161007a578063da3ef23f14610978578063db4bec44146109a1578063e8a3d485146109de578063e985e9c514610a09578063f19e75d414610a46578063f2fde38b14610a6f57610288565b8063c668286214610875578063c87b56dd146108a0578063ce26995a146108dd578063d0eb26b014610908578063d2cab05614610931578063d5abeb011461094d57610288565b8063940cd05b11610113578063940cd05b1461078857806395d89b41146107b1578063a0712d68146107dc578063a22cb465146107f8578063b88d4fde14610821578063ba7d2c761461084a57610288565b8063715018a6146106a25780637cb64759146106b95780637f00c7a6146106e2578063811d24371461070b5780638da5cb5b14610734578063938e3d7b1461075f57610288565b806323c5a088116101fe57806355f804b3116101b757806355f804b31461057e5780635c975abb146105a75780635e440aa3146105d25780636352211e146105fd5780636c0360eb1461063a57806370a082311461066557610288565b806323c5a088146104965780632eb4a7ab146104bf5780633ccfd60b146104ea57806342842e0e1461050157806344a0d68a1461052a578063518302271461055357610288565b8063095ea7b311610250578063095ea7b31461038657806313faede6146103af57806318160ddd146103da57806318cae26914610405578063239c70ae1461044257806323b872dd1461046d57610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063081c8c441461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190612a26565b610a98565b6040516102c19190612a6e565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612ab5565b610b2a565b005b3480156102ff57600080fd5b50610308610b4f565b6040516103159190612b72565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612bca565b610be1565b6040516103529190612c38565b60405180910390f35b34801561036757600080fd5b50610370610c60565b60405161037d9190612b72565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612c7f565b610cee565b005b3480156103bb57600080fd5b506103c4610e32565b6040516103d19190612cce565b60405180910390f35b3480156103e657600080fd5b506103ef610e38565b6040516103fc9190612cce565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612ce9565b610e4f565b6040516104399190612cce565b60405180910390f35b34801561044e57600080fd5b50610457610e67565b6040516104649190612cce565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612d16565b610e6d565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612bca565b61118f565b005b3480156104cb57600080fd5b506104d46111a1565b6040516104e19190612d82565b60405180910390f35b3480156104f657600080fd5b506104ff6111a7565b005b34801561050d57600080fd5b5061052860048036038101906105239190612d16565b61122f565b005b34801561053657600080fd5b50610551600480360381019061054c9190612bca565b61124f565b005b34801561055f57600080fd5b50610568611261565b6040516105759190612a6e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612ed2565b611274565b005b3480156105b357600080fd5b506105bc61128f565b6040516105c99190612a6e565b60405180910390f35b3480156105de57600080fd5b506105e76112a2565b6040516105f49190612cce565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612bca565b6112a8565b6040516106319190612c38565b60405180910390f35b34801561064657600080fd5b5061064f6112ba565b60405161065c9190612b72565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190612ce9565b611348565b6040516106999190612cce565b60405180910390f35b3480156106ae57600080fd5b506106b7611400565b005b3480156106c557600080fd5b506106e060048036038101906106db9190612f47565b611414565b005b3480156106ee57600080fd5b5061070960048036038101906107049190612bca565b611426565b005b34801561071757600080fd5b50610732600480360381019061072d9190612bca565b611438565b005b34801561074057600080fd5b5061074961144a565b6040516107569190612c38565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612ed2565b611474565b005b34801561079457600080fd5b506107af60048036038101906107aa9190612ab5565b61148f565b005b3480156107bd57600080fd5b506107c66114b4565b6040516107d39190612b72565b60405180910390f35b6107f660048036038101906107f19190612bca565b611546565b005b34801561080457600080fd5b5061081f600480360381019061081a9190612f74565b611724565b005b34801561082d57600080fd5b5061084860048036038101906108439190613055565b61182f565b005b34801561085657600080fd5b5061085f6118a2565b60405161086c9190612cce565b60405180910390f35b34801561088157600080fd5b5061088a6118a8565b6040516108979190612b72565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190612bca565b611936565b6040516108d49190612b72565b60405180910390f35b3480156108e957600080fd5b506108f2611a8e565b6040516108ff9190612b72565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190612bca565b611b1c565b005b61094b60048036038101906109469190613138565b611b2e565b005b34801561095957600080fd5b50610962611d4e565b60405161096f9190612cce565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190612ed2565b611d54565b005b3480156109ad57600080fd5b506109c860048036038101906109c39190612ce9565b611d6f565b6040516109d59190612a6e565b60405180910390f35b3480156109ea57600080fd5b506109f3611d8f565b604051610a009190612b72565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190613198565b611e21565b604051610a3d9190612a6e565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190612bca565b611eb5565b005b348015610a7b57600080fd5b50610a966004803603810190610a919190612ce9565b611f71565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b235750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610b32611ff4565b80601560006101000a81548160ff02191690831515021790555050565b606060028054610b5e90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90613207565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b5050505050905090565b6000610bec82612072565b610c22576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610c6d90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9990613207565b8015610ce65780601f10610cbb57610100808354040283529160200191610ce6565b820191906000526020600020905b815481529060010190602001808311610cc957829003601f168201915b505050505081565b6000610cf9826112a8565b90508073ffffffffffffffffffffffffffffffffffffffff16610d1a6120d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d57610d4681610d416120d1565b611e21565b610d7c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60105481565b6000610e426120d9565b6001546000540303905090565b600b6020528060005260406000206000915090505481565b60135481565b6000610e78826120e2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610edf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eeb846121ae565b91509150610f018187610efc6120d1565b6121d5565b610f4d57610f1686610f116120d1565b611e21565b610f4c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610fb3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc08686866001612219565b8015610fcb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110998561107588888761221f565b7c020000000000000000000000000000000000000000000000000000000017612247565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361111f576000600185019050600060046000838152602001908152602001600020540361111d57600054811461111c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111878686866001612272565b505050505050565b611197611ff4565b8060118190555050565b60095481565b6111af611ff4565b60006111b961144a565b73ffffffffffffffffffffffffffffffffffffffff16476040516111dc90613269565b60006040518083038185875af1925050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b505090508061122c57600080fd5b50565b61124a8383836040518060200160405280600081525061182f565b505050565b611257611ff4565b8060108190555050565b601560019054906101000a900460ff1681565b61127c611ff4565b80600c908161128b919061342a565b5050565b601560009054906101000a900460ff1681565b60115481565b60006112b3826120e2565b9050919050565b600c80546112c790613207565b80601f01602080910402602001604051908101604052809291908181526020018280546112f390613207565b80156113405780601f1061131557610100808354040283529160200191611340565b820191906000526020600020905b81548152906001019060200180831161132357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113af576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611408611ff4565b6114126000612278565b565b61141c611ff4565b8060098190555050565b61142e611ff4565b8060138190555050565b611440611ff4565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147c611ff4565b80600d908161148b919061342a565b5050565b611497611ff4565b80601560016101000a81548160ff02191690831515021790555050565b6060600380546114c390613207565b80601f01602080910402602001604051908101604052809291908181526020018280546114ef90613207565b801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b5050505050905090565b601560009054906101000a900460ff1615611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613548565b60405180910390fd5b60006115a0610e38565b9050600082116115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc906135b4565b60405180910390fd5b60135482111561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613646565b60405180910390fd5b60125482826116399190613695565b111561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613715565b60405180910390fd5b6014548211156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690613781565b60405180910390fd5b816011546116cd91906137a1565b34101561170f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117069061382f565b60405180910390fd5b61172061171a61233e565b83612346565b5050565b80600760006117316120d1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117de6120d1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118239190612a6e565b60405180910390a35050565b61183a848484610e6d565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461189c5761186584848484612364565b61189b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60145481565b600e80546118b590613207565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190613207565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b606061194182612072565b611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906138c1565b60405180910390fd5b60001515601560019054906101000a900460ff16151503611a2d57600f80546119a890613207565b80601f01602080910402602001604051908101604052809291908181526020018280546119d490613207565b8015611a215780601f106119f657610100808354040283529160200191611a21565b820191906000526020600020905b815481529060010190602001808311611a0457829003601f168201915b50505050509050611a89565b6000611a376124b4565b90506000815111611a575760405180602001604052806000815250611a85565b80611a6184612546565b600e604051602001611a75939291906139a0565b6040516020818303038152906040525b9150505b919050565b600d8054611a9b90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac790613207565b8015611b145780601f10611ae957610100808354040283529160200191611b14565b820191906000526020600020905b815481529060010190602001808311611af757829003601f168201915b505050505081565b611b24611ff4565b8060148190555050565b60145483611b3b33611348565b611b459190613695565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613a1d565b60405180910390fd5b600a6000611b9161233e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090613a89565b60405180910390fd5b6000611c2361233e565b604051602001611c339190613af1565b604051602081830303815290604052805190602001209050611c99838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954836126a6565b611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613b58565b60405180910390fd5b6001600a6000611ce661233e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d48611d4261233e565b85612346565b50505050565b60125481565b611d5c611ff4565b80600e9081611d6b919061342a565b5050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060600d8054611d9e90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90613207565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ebd611ff4565b6000611ec7610e38565b905060008211611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906135b4565b60405180910390fd5b6012548282611f1b9190613695565b1115611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390613715565b60405180910390fd5b611f6d611f6761233e565b83612346565b5050565b611f79611ff4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdf90613bea565b60405180910390fd5b611ff181612278565b50565b611ffc61233e565b73ffffffffffffffffffffffffffffffffffffffff1661201a61144a565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790613c56565b60405180910390fd5b565b60008161207d6120d9565b1115801561208c575060005482105b80156120ca575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806120f16120d9565b11612177576000548110156121765760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612174575b6000810361216a576004600083600190039350838152602001908152602001600020549050612140565b80925050506121a9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122368686846126bd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6123608282604051806020016040528060008152506126c6565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238a6120d1565b8786866040518563ffffffff1660e01b81526004016123ac9493929190613ccb565b6020604051808303816000875af19250505080156123e857506040513d601f19601f820116820180604052508101906123e59190613d2c565b60015b612461573d8060008114612418576040519150601f19603f3d011682016040523d82523d6000602084013e61241d565b606091505b506000815103612459576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546124c390613207565b80601f01602080910402602001604051908101604052809291908181526020018280546124ef90613207565b801561253c5780601f106125115761010080835404028352916020019161253c565b820191906000526020600020905b81548152906001019060200180831161251f57829003601f168201915b5050505050905090565b60606000820361258d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126a1565b600082905060005b600082146125bf5780806125a890613d59565b915050600a826125b89190613dd0565b9150612595565b60008167ffffffffffffffff8111156125db576125da612da7565b5b6040519080825280601f01601f19166020018201604052801561260d5781602001600182028036833780820191505090505b5090505b6000851461269a576001826126269190613e01565b9150600a856126359190613e35565b60306126419190613695565b60f81b81838151811061265757612656613e66565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126939190613dd0565b9450612611565b8093505050505b919050565b6000826126b38584612763565b1490509392505050565b60009392505050565b6126d083836127d8565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461275e57600080549050600083820390505b6127106000868380600101945086612364565b612746576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126fd57816000541461275b57600080fd5b50505b505050565b60008082905060005b84518110156127cd57600085828151811061278a57612789613e66565b5b602002602001015190508083116127ac576127a58382612993565b92506127b9565b6127b68184612993565b92505b5080806127c590613d59565b91505061276c565b508091505092915050565b60008054905060008203612818576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128256000848385612219565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061289c8361288d600086600061221f565b612896856129aa565b17612247565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461293d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612902565b5060008203612978576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061298e6000848385612272565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a03816129ce565b8114612a0e57600080fd5b50565b600081359050612a20816129fa565b92915050565b600060208284031215612a3c57612a3b6129c4565b5b6000612a4a84828501612a11565b91505092915050565b60008115159050919050565b612a6881612a53565b82525050565b6000602082019050612a836000830184612a5f565b92915050565b612a9281612a53565b8114612a9d57600080fd5b50565b600081359050612aaf81612a89565b92915050565b600060208284031215612acb57612aca6129c4565b5b6000612ad984828501612aa0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b1c578082015181840152602081019050612b01565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b4482612ae2565b612b4e8185612aed565b9350612b5e818560208601612afe565b612b6781612b28565b840191505092915050565b60006020820190508181036000830152612b8c8184612b39565b905092915050565b6000819050919050565b612ba781612b94565b8114612bb257600080fd5b50565b600081359050612bc481612b9e565b92915050565b600060208284031215612be057612bdf6129c4565b5b6000612bee84828501612bb5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2282612bf7565b9050919050565b612c3281612c17565b82525050565b6000602082019050612c4d6000830184612c29565b92915050565b612c5c81612c17565b8114612c6757600080fd5b50565b600081359050612c7981612c53565b92915050565b60008060408385031215612c9657612c956129c4565b5b6000612ca485828601612c6a565b9250506020612cb585828601612bb5565b9150509250929050565b612cc881612b94565b82525050565b6000602082019050612ce36000830184612cbf565b92915050565b600060208284031215612cff57612cfe6129c4565b5b6000612d0d84828501612c6a565b91505092915050565b600080600060608486031215612d2f57612d2e6129c4565b5b6000612d3d86828701612c6a565b9350506020612d4e86828701612c6a565b9250506040612d5f86828701612bb5565b9150509250925092565b6000819050919050565b612d7c81612d69565b82525050565b6000602082019050612d976000830184612d73565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ddf82612b28565b810181811067ffffffffffffffff82111715612dfe57612dfd612da7565b5b80604052505050565b6000612e116129ba565b9050612e1d8282612dd6565b919050565b600067ffffffffffffffff821115612e3d57612e3c612da7565b5b612e4682612b28565b9050602081019050919050565b82818337600083830152505050565b6000612e75612e7084612e22565b612e07565b905082815260208101848484011115612e9157612e90612da2565b5b612e9c848285612e53565b509392505050565b600082601f830112612eb957612eb8612d9d565b5b8135612ec9848260208601612e62565b91505092915050565b600060208284031215612ee857612ee76129c4565b5b600082013567ffffffffffffffff811115612f0657612f056129c9565b5b612f1284828501612ea4565b91505092915050565b612f2481612d69565b8114612f2f57600080fd5b50565b600081359050612f4181612f1b565b92915050565b600060208284031215612f5d57612f5c6129c4565b5b6000612f6b84828501612f32565b91505092915050565b60008060408385031215612f8b57612f8a6129c4565b5b6000612f9985828601612c6a565b9250506020612faa85828601612aa0565b9150509250929050565b600067ffffffffffffffff821115612fcf57612fce612da7565b5b612fd882612b28565b9050602081019050919050565b6000612ff8612ff384612fb4565b612e07565b90508281526020810184848401111561301457613013612da2565b5b61301f848285612e53565b509392505050565b600082601f83011261303c5761303b612d9d565b5b813561304c848260208601612fe5565b91505092915050565b6000806000806080858703121561306f5761306e6129c4565b5b600061307d87828801612c6a565b945050602061308e87828801612c6a565b935050604061309f87828801612bb5565b925050606085013567ffffffffffffffff8111156130c0576130bf6129c9565b5b6130cc87828801613027565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126130f8576130f7612d9d565b5b8235905067ffffffffffffffff811115613115576131146130d8565b5b602083019150836020820283011115613131576131306130dd565b5b9250929050565b600080600060408486031215613151576131506129c4565b5b600061315f86828701612bb5565b935050602084013567ffffffffffffffff8111156131805761317f6129c9565b5b61318c868287016130e2565b92509250509250925092565b600080604083850312156131af576131ae6129c4565b5b60006131bd85828601612c6a565b92505060206131ce85828601612c6a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061321f57607f821691505b602082108103613232576132316131d8565b5b50919050565b600081905092915050565b50565b6000613253600083613238565b915061325e82613243565b600082019050919050565b600061327482613246565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132a3565b6132ea86836132a3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061332761332261331d84612b94565b613302565b612b94565b9050919050565b6000819050919050565b6133418361330c565b61335561334d8261332e565b8484546132b0565b825550505050565b600090565b61336a61335d565b613375818484613338565b505050565b5b818110156133995761338e600082613362565b60018101905061337b565b5050565b601f8211156133de576133af8161327e565b6133b884613293565b810160208510156133c7578190505b6133db6133d385613293565b83018261337a565b50505b505050565b600082821c905092915050565b6000613401600019846008026133e3565b1980831691505092915050565b600061341a83836133f0565b9150826002028217905092915050565b61343382612ae2565b67ffffffffffffffff81111561344c5761344b612da7565b5b6134568254613207565b61346182828561339d565b600060209050601f8311600181146134945760008415613482578287015190505b61348c858261340e565b8655506134f4565b601f1984166134a28661327e565b60005b828110156134ca578489015182556001820191506020850194506020810190506134a5565b868310156134e757848901516134e3601f8916826133f0565b8355505b6001600288020188555050505b505050505050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613532601683612aed565b915061353d826134fc565b602082019050919050565b6000602082019050818103600083015261356181613525565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061359e601b83612aed565b91506135a982613568565b602082019050919050565b600060208201905081810360008301526135cd81613591565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000613630602483612aed565b915061363b826135d4565b604082019050919050565b6000602082019050818103600083015261365f81613623565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136a082612b94565b91506136ab83612b94565b92508282019050808211156136c3576136c2613666565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006136ff601683612aed565b915061370a826136c9565b602082019050919050565b6000602082019050818103600083015261372e816136f2565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061376b601c83612aed565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b60006137ac82612b94565b91506137b783612b94565b92508282026137c581612b94565b915082820484148315176137dc576137db613666565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613819601283612aed565b9150613824826137e3565b602082019050919050565b600060208201905081810360008301526138488161380c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138ab602f83612aed565b91506138b68261384f565b604082019050919050565b600060208201905081810360008301526138da8161389e565b9050919050565b600081905092915050565b60006138f782612ae2565b61390181856138e1565b9350613911818560208601612afe565b80840191505092915050565b6000815461392a81613207565b61393481866138e1565b9450600182166000811461394f576001811461396457613997565b60ff1983168652811515820286019350613997565b61396d8561327e565b60005b8381101561398f57815481890152600182019150602081019050613970565b838801955050505b50505092915050565b60006139ac82866138ec565b91506139b882856138ec565b91506139c4828461391d565b9150819050949350505050565b7f6d6178206e6674207065722077616c6c6574206c696d69742072656163686564600082015250565b6000613a07602083612aed565b9150613a12826139d1565b602082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000613a73601883612aed565b9150613a7e82613a3d565b602082019050919050565b60006020820190508181036000830152613aa281613a66565b9050919050565b60008160601b9050919050565b6000613ac182613aa9565b9050919050565b6000613ad382613ab6565b9050919050565b613aeb613ae682612c17565b613ac8565b82525050565b6000613afd8284613ada565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000613b42600e83612aed565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bd4602683612aed565b9150613bdf82613b78565b604082019050919050565b60006020820190508181036000830152613c0381613bc7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c40602083612aed565b9150613c4b82613c0a565b602082019050919050565b60006020820190508181036000830152613c6f81613c33565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c9d82613c76565b613ca78185613c81565b9350613cb7818560208601612afe565b613cc081612b28565b840191505092915050565b6000608082019050613ce06000830187612c29565b613ced6020830186612c29565b613cfa6040830185612cbf565b8181036060830152613d0c8184613c92565b905095945050505050565b600081519050613d26816129fa565b92915050565b600060208284031215613d4257613d416129c4565b5b6000613d5084828501613d17565b91505092915050565b6000613d6482612b94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d9657613d95613666565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ddb82612b94565b9150613de683612b94565b925082613df657613df5613da1565b5b828204905092915050565b6000613e0c82612b94565b9150613e1783612b94565b9250828203905081811115613e2f57613e2e613666565b5b92915050565b6000613e4082612b94565b9150613e4b83612b94565b925082613e5b57613e5a613da1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220652974a75a3db0bd980a2af6d0cab982d539c4c849a5c6831cb0c63bc5243b4f64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000046943414e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046943414e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569666775666934617a716c67737a3437617033706a3262376265766a6936676a6370756466776a707a36337467696467736d7674652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c697066733a2f2f62616679626569666775666934617a716c67737a3437617033706a3262376265766a6936676a6370756466776a707a36337467696467736d7674652f6963616e2e6a736f6e0000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102885760003560e01c8063715018a61161015a578063c6682862116100c1578063da3ef23f1161007a578063da3ef23f14610978578063db4bec44146109a1578063e8a3d485146109de578063e985e9c514610a09578063f19e75d414610a46578063f2fde38b14610a6f57610288565b8063c668286214610875578063c87b56dd146108a0578063ce26995a146108dd578063d0eb26b014610908578063d2cab05614610931578063d5abeb011461094d57610288565b8063940cd05b11610113578063940cd05b1461078857806395d89b41146107b1578063a0712d68146107dc578063a22cb465146107f8578063b88d4fde14610821578063ba7d2c761461084a57610288565b8063715018a6146106a25780637cb64759146106b95780637f00c7a6146106e2578063811d24371461070b5780638da5cb5b14610734578063938e3d7b1461075f57610288565b806323c5a088116101fe57806355f804b3116101b757806355f804b31461057e5780635c975abb146105a75780635e440aa3146105d25780636352211e146105fd5780636c0360eb1461063a57806370a082311461066557610288565b806323c5a088146104965780632eb4a7ab146104bf5780633ccfd60b146104ea57806342842e0e1461050157806344a0d68a1461052a578063518302271461055357610288565b8063095ea7b311610250578063095ea7b31461038657806313faede6146103af57806318160ddd146103da57806318cae26914610405578063239c70ae1461044257806323b872dd1461046d57610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063081c8c441461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190612a26565b610a98565b6040516102c19190612a6e565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190612ab5565b610b2a565b005b3480156102ff57600080fd5b50610308610b4f565b6040516103159190612b72565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612bca565b610be1565b6040516103529190612c38565b60405180910390f35b34801561036757600080fd5b50610370610c60565b60405161037d9190612b72565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612c7f565b610cee565b005b3480156103bb57600080fd5b506103c4610e32565b6040516103d19190612cce565b60405180910390f35b3480156103e657600080fd5b506103ef610e38565b6040516103fc9190612cce565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612ce9565b610e4f565b6040516104399190612cce565b60405180910390f35b34801561044e57600080fd5b50610457610e67565b6040516104649190612cce565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612d16565b610e6d565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612bca565b61118f565b005b3480156104cb57600080fd5b506104d46111a1565b6040516104e19190612d82565b60405180910390f35b3480156104f657600080fd5b506104ff6111a7565b005b34801561050d57600080fd5b5061052860048036038101906105239190612d16565b61122f565b005b34801561053657600080fd5b50610551600480360381019061054c9190612bca565b61124f565b005b34801561055f57600080fd5b50610568611261565b6040516105759190612a6e565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190612ed2565b611274565b005b3480156105b357600080fd5b506105bc61128f565b6040516105c99190612a6e565b60405180910390f35b3480156105de57600080fd5b506105e76112a2565b6040516105f49190612cce565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612bca565b6112a8565b6040516106319190612c38565b60405180910390f35b34801561064657600080fd5b5061064f6112ba565b60405161065c9190612b72565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190612ce9565b611348565b6040516106999190612cce565b60405180910390f35b3480156106ae57600080fd5b506106b7611400565b005b3480156106c557600080fd5b506106e060048036038101906106db9190612f47565b611414565b005b3480156106ee57600080fd5b5061070960048036038101906107049190612bca565b611426565b005b34801561071757600080fd5b50610732600480360381019061072d9190612bca565b611438565b005b34801561074057600080fd5b5061074961144a565b6040516107569190612c38565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612ed2565b611474565b005b34801561079457600080fd5b506107af60048036038101906107aa9190612ab5565b61148f565b005b3480156107bd57600080fd5b506107c66114b4565b6040516107d39190612b72565b60405180910390f35b6107f660048036038101906107f19190612bca565b611546565b005b34801561080457600080fd5b5061081f600480360381019061081a9190612f74565b611724565b005b34801561082d57600080fd5b5061084860048036038101906108439190613055565b61182f565b005b34801561085657600080fd5b5061085f6118a2565b60405161086c9190612cce565b60405180910390f35b34801561088157600080fd5b5061088a6118a8565b6040516108979190612b72565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190612bca565b611936565b6040516108d49190612b72565b60405180910390f35b3480156108e957600080fd5b506108f2611a8e565b6040516108ff9190612b72565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190612bca565b611b1c565b005b61094b60048036038101906109469190613138565b611b2e565b005b34801561095957600080fd5b50610962611d4e565b60405161096f9190612cce565b60405180910390f35b34801561098457600080fd5b5061099f600480360381019061099a9190612ed2565b611d54565b005b3480156109ad57600080fd5b506109c860048036038101906109c39190612ce9565b611d6f565b6040516109d59190612a6e565b60405180910390f35b3480156109ea57600080fd5b506109f3611d8f565b604051610a009190612b72565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190613198565b611e21565b604051610a3d9190612a6e565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190612bca565b611eb5565b005b348015610a7b57600080fd5b50610a966004803603810190610a919190612ce9565b611f71565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b235750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610b32611ff4565b80601560006101000a81548160ff02191690831515021790555050565b606060028054610b5e90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90613207565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b5050505050905090565b6000610bec82612072565b610c22576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f8054610c6d90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9990613207565b8015610ce65780601f10610cbb57610100808354040283529160200191610ce6565b820191906000526020600020905b815481529060010190602001808311610cc957829003601f168201915b505050505081565b6000610cf9826112a8565b90508073ffffffffffffffffffffffffffffffffffffffff16610d1a6120d1565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d57610d4681610d416120d1565b611e21565b610d7c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60105481565b6000610e426120d9565b6001546000540303905090565b600b6020528060005260406000206000915090505481565b60135481565b6000610e78826120e2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610edf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eeb846121ae565b91509150610f018187610efc6120d1565b6121d5565b610f4d57610f1686610f116120d1565b611e21565b610f4c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610fb3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc08686866001612219565b8015610fcb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110998561107588888761221f565b7c020000000000000000000000000000000000000000000000000000000017612247565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361111f576000600185019050600060046000838152602001908152602001600020540361111d57600054811461111c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111878686866001612272565b505050505050565b611197611ff4565b8060118190555050565b60095481565b6111af611ff4565b60006111b961144a565b73ffffffffffffffffffffffffffffffffffffffff16476040516111dc90613269565b60006040518083038185875af1925050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b505090508061122c57600080fd5b50565b61124a8383836040518060200160405280600081525061182f565b505050565b611257611ff4565b8060108190555050565b601560019054906101000a900460ff1681565b61127c611ff4565b80600c908161128b919061342a565b5050565b601560009054906101000a900460ff1681565b60115481565b60006112b3826120e2565b9050919050565b600c80546112c790613207565b80601f01602080910402602001604051908101604052809291908181526020018280546112f390613207565b80156113405780601f1061131557610100808354040283529160200191611340565b820191906000526020600020905b81548152906001019060200180831161132357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113af576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611408611ff4565b6114126000612278565b565b61141c611ff4565b8060098190555050565b61142e611ff4565b8060138190555050565b611440611ff4565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147c611ff4565b80600d908161148b919061342a565b5050565b611497611ff4565b80601560016101000a81548160ff02191690831515021790555050565b6060600380546114c390613207565b80601f01602080910402602001604051908101604052809291908181526020018280546114ef90613207565b801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b5050505050905090565b601560009054906101000a900460ff1615611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613548565b60405180910390fd5b60006115a0610e38565b9050600082116115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc906135b4565b60405180910390fd5b60135482111561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613646565b60405180910390fd5b60125482826116399190613695565b111561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613715565b60405180910390fd5b6014548211156116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690613781565b60405180910390fd5b816011546116cd91906137a1565b34101561170f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117069061382f565b60405180910390fd5b61172061171a61233e565b83612346565b5050565b80600760006117316120d1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117de6120d1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118239190612a6e565b60405180910390a35050565b61183a848484610e6d565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461189c5761186584848484612364565b61189b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60145481565b600e80546118b590613207565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190613207565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b606061194182612072565b611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906138c1565b60405180910390fd5b60001515601560019054906101000a900460ff16151503611a2d57600f80546119a890613207565b80601f01602080910402602001604051908101604052809291908181526020018280546119d490613207565b8015611a215780601f106119f657610100808354040283529160200191611a21565b820191906000526020600020905b815481529060010190602001808311611a0457829003601f168201915b50505050509050611a89565b6000611a376124b4565b90506000815111611a575760405180602001604052806000815250611a85565b80611a6184612546565b600e604051602001611a75939291906139a0565b6040516020818303038152906040525b9150505b919050565b600d8054611a9b90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac790613207565b8015611b145780601f10611ae957610100808354040283529160200191611b14565b820191906000526020600020905b815481529060010190602001808311611af757829003601f168201915b505050505081565b611b24611ff4565b8060148190555050565b60145483611b3b33611348565b611b459190613695565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613a1d565b60405180910390fd5b600a6000611b9161233e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090613a89565b60405180910390fd5b6000611c2361233e565b604051602001611c339190613af1565b604051602081830303815290604052805190602001209050611c99838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954836126a6565b611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613b58565b60405180910390fd5b6001600a6000611ce661233e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611d48611d4261233e565b85612346565b50505050565b60125481565b611d5c611ff4565b80600e9081611d6b919061342a565b5050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060600d8054611d9e90613207565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90613207565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ebd611ff4565b6000611ec7610e38565b905060008211611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f03906135b4565b60405180910390fd5b6012548282611f1b9190613695565b1115611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390613715565b60405180910390fd5b611f6d611f6761233e565b83612346565b5050565b611f79611ff4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdf90613bea565b60405180910390fd5b611ff181612278565b50565b611ffc61233e565b73ffffffffffffffffffffffffffffffffffffffff1661201a61144a565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790613c56565b60405180910390fd5b565b60008161207d6120d9565b1115801561208c575060005482105b80156120ca575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806120f16120d9565b11612177576000548110156121765760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612174575b6000810361216a576004600083600190039350838152602001908152602001600020549050612140565b80925050506121a9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122368686846126bd565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6123608282604051806020016040528060008152506126c6565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238a6120d1565b8786866040518563ffffffff1660e01b81526004016123ac9493929190613ccb565b6020604051808303816000875af19250505080156123e857506040513d601f19601f820116820180604052508101906123e59190613d2c565b60015b612461573d8060008114612418576040519150601f19603f3d011682016040523d82523d6000602084013e61241d565b606091505b506000815103612459576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546124c390613207565b80601f01602080910402602001604051908101604052809291908181526020018280546124ef90613207565b801561253c5780601f106125115761010080835404028352916020019161253c565b820191906000526020600020905b81548152906001019060200180831161251f57829003601f168201915b5050505050905090565b60606000820361258d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126a1565b600082905060005b600082146125bf5780806125a890613d59565b915050600a826125b89190613dd0565b9150612595565b60008167ffffffffffffffff8111156125db576125da612da7565b5b6040519080825280601f01601f19166020018201604052801561260d5781602001600182028036833780820191505090505b5090505b6000851461269a576001826126269190613e01565b9150600a856126359190613e35565b60306126419190613695565b60f81b81838151811061265757612656613e66565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126939190613dd0565b9450612611565b8093505050505b919050565b6000826126b38584612763565b1490509392505050565b60009392505050565b6126d083836127d8565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461275e57600080549050600083820390505b6127106000868380600101945086612364565b612746576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126fd57816000541461275b57600080fd5b50505b505050565b60008082905060005b84518110156127cd57600085828151811061278a57612789613e66565b5b602002602001015190508083116127ac576127a58382612993565b92506127b9565b6127b68184612993565b92505b5080806127c590613d59565b91505061276c565b508091505092915050565b60008054905060008203612818576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128256000848385612219565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061289c8361288d600086600061221f565b612896856129aa565b17612247565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461293d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612902565b5060008203612978576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061298e6000848385612272565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a03816129ce565b8114612a0e57600080fd5b50565b600081359050612a20816129fa565b92915050565b600060208284031215612a3c57612a3b6129c4565b5b6000612a4a84828501612a11565b91505092915050565b60008115159050919050565b612a6881612a53565b82525050565b6000602082019050612a836000830184612a5f565b92915050565b612a9281612a53565b8114612a9d57600080fd5b50565b600081359050612aaf81612a89565b92915050565b600060208284031215612acb57612aca6129c4565b5b6000612ad984828501612aa0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b1c578082015181840152602081019050612b01565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b4482612ae2565b612b4e8185612aed565b9350612b5e818560208601612afe565b612b6781612b28565b840191505092915050565b60006020820190508181036000830152612b8c8184612b39565b905092915050565b6000819050919050565b612ba781612b94565b8114612bb257600080fd5b50565b600081359050612bc481612b9e565b92915050565b600060208284031215612be057612bdf6129c4565b5b6000612bee84828501612bb5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2282612bf7565b9050919050565b612c3281612c17565b82525050565b6000602082019050612c4d6000830184612c29565b92915050565b612c5c81612c17565b8114612c6757600080fd5b50565b600081359050612c7981612c53565b92915050565b60008060408385031215612c9657612c956129c4565b5b6000612ca485828601612c6a565b9250506020612cb585828601612bb5565b9150509250929050565b612cc881612b94565b82525050565b6000602082019050612ce36000830184612cbf565b92915050565b600060208284031215612cff57612cfe6129c4565b5b6000612d0d84828501612c6a565b91505092915050565b600080600060608486031215612d2f57612d2e6129c4565b5b6000612d3d86828701612c6a565b9350506020612d4e86828701612c6a565b9250506040612d5f86828701612bb5565b9150509250925092565b6000819050919050565b612d7c81612d69565b82525050565b6000602082019050612d976000830184612d73565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ddf82612b28565b810181811067ffffffffffffffff82111715612dfe57612dfd612da7565b5b80604052505050565b6000612e116129ba565b9050612e1d8282612dd6565b919050565b600067ffffffffffffffff821115612e3d57612e3c612da7565b5b612e4682612b28565b9050602081019050919050565b82818337600083830152505050565b6000612e75612e7084612e22565b612e07565b905082815260208101848484011115612e9157612e90612da2565b5b612e9c848285612e53565b509392505050565b600082601f830112612eb957612eb8612d9d565b5b8135612ec9848260208601612e62565b91505092915050565b600060208284031215612ee857612ee76129c4565b5b600082013567ffffffffffffffff811115612f0657612f056129c9565b5b612f1284828501612ea4565b91505092915050565b612f2481612d69565b8114612f2f57600080fd5b50565b600081359050612f4181612f1b565b92915050565b600060208284031215612f5d57612f5c6129c4565b5b6000612f6b84828501612f32565b91505092915050565b60008060408385031215612f8b57612f8a6129c4565b5b6000612f9985828601612c6a565b9250506020612faa85828601612aa0565b9150509250929050565b600067ffffffffffffffff821115612fcf57612fce612da7565b5b612fd882612b28565b9050602081019050919050565b6000612ff8612ff384612fb4565b612e07565b90508281526020810184848401111561301457613013612da2565b5b61301f848285612e53565b509392505050565b600082601f83011261303c5761303b612d9d565b5b813561304c848260208601612fe5565b91505092915050565b6000806000806080858703121561306f5761306e6129c4565b5b600061307d87828801612c6a565b945050602061308e87828801612c6a565b935050604061309f87828801612bb5565b925050606085013567ffffffffffffffff8111156130c0576130bf6129c9565b5b6130cc87828801613027565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126130f8576130f7612d9d565b5b8235905067ffffffffffffffff811115613115576131146130d8565b5b602083019150836020820283011115613131576131306130dd565b5b9250929050565b600080600060408486031215613151576131506129c4565b5b600061315f86828701612bb5565b935050602084013567ffffffffffffffff8111156131805761317f6129c9565b5b61318c868287016130e2565b92509250509250925092565b600080604083850312156131af576131ae6129c4565b5b60006131bd85828601612c6a565b92505060206131ce85828601612c6a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061321f57607f821691505b602082108103613232576132316131d8565b5b50919050565b600081905092915050565b50565b6000613253600083613238565b915061325e82613243565b600082019050919050565b600061327482613246565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132a3565b6132ea86836132a3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061332761332261331d84612b94565b613302565b612b94565b9050919050565b6000819050919050565b6133418361330c565b61335561334d8261332e565b8484546132b0565b825550505050565b600090565b61336a61335d565b613375818484613338565b505050565b5b818110156133995761338e600082613362565b60018101905061337b565b5050565b601f8211156133de576133af8161327e565b6133b884613293565b810160208510156133c7578190505b6133db6133d385613293565b83018261337a565b50505b505050565b600082821c905092915050565b6000613401600019846008026133e3565b1980831691505092915050565b600061341a83836133f0565b9150826002028217905092915050565b61343382612ae2565b67ffffffffffffffff81111561344c5761344b612da7565b5b6134568254613207565b61346182828561339d565b600060209050601f8311600181146134945760008415613482578287015190505b61348c858261340e565b8655506134f4565b601f1984166134a28661327e565b60005b828110156134ca578489015182556001820191506020850194506020810190506134a5565b868310156134e757848901516134e3601f8916826133f0565b8355505b6001600288020188555050505b505050505050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613532601683612aed565b915061353d826134fc565b602082019050919050565b6000602082019050818103600083015261356181613525565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b600061359e601b83612aed565b91506135a982613568565b602082019050919050565b600060208201905081810360008301526135cd81613591565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000613630602483612aed565b915061363b826135d4565b604082019050919050565b6000602082019050818103600083015261365f81613623565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136a082612b94565b91506136ab83612b94565b92508282019050808211156136c3576136c2613666565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006136ff601683612aed565b915061370a826136c9565b602082019050919050565b6000602082019050818103600083015261372e816136f2565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061376b601c83612aed565b915061377682613735565b602082019050919050565b6000602082019050818103600083015261379a8161375e565b9050919050565b60006137ac82612b94565b91506137b783612b94565b92508282026137c581612b94565b915082820484148315176137dc576137db613666565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613819601283612aed565b9150613824826137e3565b602082019050919050565b600060208201905081810360008301526138488161380c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006138ab602f83612aed565b91506138b68261384f565b604082019050919050565b600060208201905081810360008301526138da8161389e565b9050919050565b600081905092915050565b60006138f782612ae2565b61390181856138e1565b9350613911818560208601612afe565b80840191505092915050565b6000815461392a81613207565b61393481866138e1565b9450600182166000811461394f576001811461396457613997565b60ff1983168652811515820286019350613997565b61396d8561327e565b60005b8381101561398f57815481890152600182019150602081019050613970565b838801955050505b50505092915050565b60006139ac82866138ec565b91506139b882856138ec565b91506139c4828461391d565b9150819050949350505050565b7f6d6178206e6674207065722077616c6c6574206c696d69742072656163686564600082015250565b6000613a07602083612aed565b9150613a12826139d1565b602082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000613a73601883612aed565b9150613a7e82613a3d565b602082019050919050565b60006020820190508181036000830152613aa281613a66565b9050919050565b60008160601b9050919050565b6000613ac182613aa9565b9050919050565b6000613ad382613ab6565b9050919050565b613aeb613ae682612c17565b613ac8565b82525050565b6000613afd8284613ada565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000613b42600e83612aed565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bd4602683612aed565b9150613bdf82613b78565b604082019050919050565b60006020820190508181036000830152613c0381613bc7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c40602083612aed565b9150613c4b82613c0a565b602082019050919050565b60006020820190508181036000830152613c6f81613c33565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613c9d82613c76565b613ca78185613c81565b9350613cb7818560208601612afe565b613cc081612b28565b840191505092915050565b6000608082019050613ce06000830187612c29565b613ced6020830186612c29565b613cfa6040830185612cbf565b8181036060830152613d0c8184613c92565b905095945050505050565b600081519050613d26816129fa565b92915050565b600060208284031215613d4257613d416129c4565b5b6000613d5084828501613d17565b91505092915050565b6000613d6482612b94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d9657613d95613666565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ddb82612b94565b9150613de683612b94565b925082613df657613df5613da1565b5b828204905092915050565b6000613e0c82612b94565b9150613e1783612b94565b9250828203905081811115613e2f57613e2e613666565b5b92915050565b6000613e4082612b94565b9150613e4b83612b94565b925082613e5b57613e5a613da1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220652974a75a3db0bd980a2af6d0cab982d539c4c849a5c6831cb0c63bc5243b4f64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000046943414e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046943414e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569666775666934617a716c67737a3437617033706a3262376265766a6936676a6370756466776a707a36337467696467736d7674652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c697066733a2f2f62616679626569666775666934617a716c67737a3437617033706a3262376265766a6936676a6370756466776a707a36337467696467736d7674652f6963616e2e6a736f6e0000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): iCAN
Arg [1] : _symbol (string): iCAN
Arg [2] : _initBaseURI (string): ipfs://bafybeifgufi4azqlgsz47ap3pj2b7bevji6gjcpudfwjpz63tgidgsmvte/
Arg [3] : _initContractURI (string): ipfs://bafybeifgufi4azqlgsz47ap3pj2b7bevji6gjcpudfwjpz63tgidgsmvte/ican.json
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 6943414e00000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 6943414e00000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [9] : 697066733a2f2f62616679626569666775666934617a716c67737a3437617033
Arg [10] : 706a3262376265766a6936676a6370756466776a707a36337467696467736d76
Arg [11] : 74652f0000000000000000000000000000000000000000000000000000000000
Arg [12] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [13] : 697066733a2f2f62616679626569666775666934617a716c67737a3437617033
Arg [14] : 706a3262376265766a6936676a6370756466776a707a36337467696467736d76
Arg [15] : 74652f6963616e2e6a736f6e0000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
65210:4875:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28802:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68509:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29704:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36187:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65526:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35628:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65559:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25455:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65364:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65673:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39826:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66225:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65281:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69688:392;;;;;;;;;;;;;:::i;:::-;;42739:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69450:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65782:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68958:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65752:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65596:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31097:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65426:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26639:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64329:103;;;;;;;;;;;;;:::i;:::-;;69336:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68828:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68718:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63681:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69070:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68396:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29880:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67234:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36745:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43522:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65710:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65484;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67804:565;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65452:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68596:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66661:554;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65638:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69200:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65311:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69581:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37136:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66335:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64587:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28802:639;28887:4;29226:10;29211:25;;:11;:25;;;;:102;;;;29303:10;29288:25;;:11;:25;;;;29211:102;:179;;;;29380:10;29365:25;;:11;:25;;;;29211:179;29191:199;;28802:639;;;:::o;68509:79::-;63567:13;:11;:13::i;:::-;68574:6:::1;68565;;:15;;;;;;;;;;;;;;;;;;68509:79:::0;:::o;29704:100::-;29758:13;29791:5;29784:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29704:100;:::o;36187:218::-;36263:7;36288:16;36296:7;36288;:16::i;:::-;36283:64;;36313:34;;;;;;;;;;;;;;36283:64;36367:15;:24;36383:7;36367:24;;;;;;;;;;;:30;;;;;;;;;;;;36360:37;;36187:218;;;:::o;65526:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35628:400::-;35709:13;35725:16;35733:7;35725;:16::i;:::-;35709:32;;35781:5;35758:28;;:19;:17;:19::i;:::-;:28;;;35754:175;;35806:44;35823:5;35830:19;:17;:19::i;:::-;35806:16;:44::i;:::-;35801:128;;35878:35;;;;;;;;;;;;;;35801:128;35754:175;35974:2;35941:15;:24;35957:7;35941:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36012:7;36008:2;35992:28;;36001:5;35992:28;;;;;;;;;;;;35698:330;35628:400;;:::o;65559:32::-;;;;:::o;25455:323::-;25516:7;25744:15;:13;:15::i;:::-;25729:12;;25713:13;;:28;:46;25706:53;;25455:323;:::o;65364:55::-;;;;;;;;;;;;;;;;;:::o;65673:32::-;;;;:::o;39826:2817::-;39960:27;39990;40009:7;39990:18;:27::i;:::-;39960:57;;40075:4;40034:45;;40050:19;40034:45;;;40030:86;;40088:28;;;;;;;;;;;;;;40030:86;40130:27;40159:23;40186:35;40213:7;40186:26;:35::i;:::-;40129:92;;;;40321:68;40346:15;40363:4;40369:19;:17;:19::i;:::-;40321:24;:68::i;:::-;40316:180;;40409:43;40426:4;40432:19;:17;:19::i;:::-;40409:16;:43::i;:::-;40404:92;;40461:35;;;;;;;;;;;;;;40404:92;40316:180;40527:1;40513:16;;:2;:16;;;40509:52;;40538:23;;;;;;;;;;;;;;40509:52;40574:43;40596:4;40602:2;40606:7;40615:1;40574:21;:43::i;:::-;40710:15;40707:160;;;40850:1;40829:19;40822:30;40707:160;41247:18;:24;41266:4;41247:24;;;;;;;;;;;;;;;;41245:26;;;;;;;;;;;;41316:18;:22;41335:2;41316:22;;;;;;;;;;;;;;;;41314:24;;;;;;;;;;;41638:146;41675:2;41724:45;41739:4;41745:2;41749:19;41724:14;:45::i;:::-;21863:8;41696:73;41638:18;:146::i;:::-;41609:17;:26;41627:7;41609:26;;;;;;;;;;;:175;;;;41955:1;21863:8;41904:19;:47;:52;41900:627;;41977:19;42009:1;41999:7;:11;41977:33;;42166:1;42132:17;:30;42150:11;42132:30;;;;;;;;;;;;:35;42128:384;;42270:13;;42255:11;:28;42251:242;;42450:19;42417:17;:30;42435:11;42417:30;;;;;;;;;;;:52;;;;42251:242;42128:384;41958:569;41900:627;42574:7;42570:2;42555:27;;42564:4;42555:27;;;;;;;;;;;;42593:42;42614:4;42620:2;42624:7;42633:1;42593:20;:42::i;:::-;39949:2694;;;39826:2817;;;:::o;66225:85::-;63567:13;:11;:13::i;:::-;66297:5:::1;66287:7;:15;;;;66225:85:::0;:::o;65281:25::-;;;;:::o;69688:392::-;63567:13;:11;:13::i;:::-;69900:7:::1;69921;:5;:7::i;:::-;69913:21;;69942;69913:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69899:69;;;69983:2;69975:11;;;::::0;::::1;;69725:355;69688:392::o:0;42739:185::-;42877:39;42894:4;42900:2;42904:7;42877:39;;;;;;;;;;;;:16;:39::i;:::-;42739:185;;;:::o;69450:82::-;63567:13;:11;:13::i;:::-;69519:5:::1;69512:4;:12;;;;69450:82:::0;:::o;65782:28::-;;;;;;;;;;;;;:::o;68958:104::-;63567:13;:11;:13::i;:::-;69043:11:::1;69033:7;:21;;;;;;:::i;:::-;;68958:104:::0;:::o;65752:25::-;;;;;;;;;;;;;:::o;65596:37::-;;;;:::o;31097:152::-;31169:7;31212:27;31231:7;31212:18;:27::i;:::-;31189:52;;31097:152;;;:::o;65426:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26639:233::-;26711:7;26752:1;26735:19;;:5;:19;;;26731:60;;26763:28;;;;;;;;;;;;;;26731:60;20807:13;26809:18;:25;26828:5;26809:25;;;;;;;;;;;;;;;;:55;26802:62;;26639:233;;;:::o;64329:103::-;63567:13;:11;:13::i;:::-;64394:30:::1;64421:1;64394:18;:30::i;:::-;64329:103::o:0;69336:106::-;63567:13;:11;:13::i;:::-;69423:11:::1;69410:10;:24;;;;69336:106:::0;:::o;68828:122::-;63567:13;:11;:13::i;:::-;68925:17:::1;68909:13;:33;;;;68828:122:::0;:::o;68718:97::-;63567:13;:11;:13::i;:::-;68798:9:::1;68788:7;:19;;;;68718:97:::0;:::o;63681:87::-;63727:7;63754:6;;;;;;;;;;;63747:13;;63681:87;:::o;69070:122::-;63567:13;:11;:13::i;:::-;69169:15:::1;69153:13;:31;;;;;;:::i;:::-;;69070:122:::0;:::o;68396:82::-;63567:13;:11;:13::i;:::-;68464:6:::1;68453:8;;:17;;;;;;;;;;;;;;;;;;68396:82:::0;:::o;29880:104::-;29936:13;29969:7;29962:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29880:104;:::o;67234:561::-;67300:6;;;;;;;;;;;67299:7;67291:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;67340:14;67357:13;:11;:13::i;:::-;67340:30;;67399:1;67385:11;:15;67377:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;67462:13;;67447:11;:28;;67439:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67555:9;;67540:11;67531:6;:20;;;;:::i;:::-;:33;;67523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67621:18;;67606:11;:33;;67598:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;67712:11;67702:7;;:21;;;;:::i;:::-;67689:9;:34;;67681:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67753:36;67763:12;:10;:12::i;:::-;67777:11;67753:9;:36::i;:::-;67284:511;67234:561;:::o;36745:234::-;36892:8;36840:18;:39;36859:19;:17;:19::i;:::-;36840:39;;;;;;;;;;;;;;;:49;36880:8;36840:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;36952:8;36916:55;;36931:19;:17;:19::i;:::-;36916:55;;;36962:8;36916:55;;;;;;:::i;:::-;;;;;;;;36745:234;;:::o;43522:399::-;43689:31;43702:4;43708:2;43712:7;43689:12;:31::i;:::-;43753:1;43735:2;:14;;;:19;43731:183;;43774:56;43805:4;43811:2;43815:7;43824:5;43774:30;:56::i;:::-;43769:145;;43858:40;;;;;;;;;;;;;;43769:145;43731:183;43522:399;;;;:::o;65710:37::-;;;;:::o;65484:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67804:565::-;67922:13;67971:16;67979:7;67971;:16::i;:::-;67953:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;68094:5;68082:17;;:8;;;;;;;;;;;:17;;;68079:70;;68123:14;68116:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68079:70;68161:28;68192:10;:8;:10::i;:::-;68161:41;;68251:1;68226:14;68220:28;:32;:141;;;;;;;;;;;;;;;;;68292:14;68308:18;:7;:16;:18::i;:::-;68328:13;68275:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68220:141;68213:148;;;67804:565;;;;:::o;65452:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68596:110::-;63567:13;:11;:13::i;:::-;68692:6:::1;68671:18;:27;;;;68596:110:::0;:::o;66661:554::-;66843:18;;66829:11;66806:21;66816:10;66806:9;:21::i;:::-;:34;;;;:::i;:::-;:55;66798:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;66914:16;:30;66931:12;:10;:12::i;:::-;66914:30;;;;;;;;;;;;;;;;;;;;;;;;;66913:31;66905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66980:12;67022;:10;:12::i;:::-;67005:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;66995:41;;;;;;66980:56;;67051:50;67070:12;;67051:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67084:10;;67096:4;67051:18;:50::i;:::-;67043:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67162:4;67129:16;:30;67146:12;:10;:12::i;:::-;67129:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;67173:36;67183:12;:10;:12::i;:::-;67197:11;67173:9;:36::i;:::-;66753:462;66661:554;;;:::o;65638:30::-;;;;:::o;69200:128::-;63567:13;:11;:13::i;:::-;69303:17:::1;69287:13;:33;;;;;;:::i;:::-;;69200:128:::0;:::o;65311:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;69581:98::-;69625:13;69658;69651:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69581:98;:::o;37136:164::-;37233:4;37257:18;:25;37276:5;37257:25;;;;;;;;;;;;;;;:35;37283:8;37257:35;;;;;;;;;;;;;;;;;;;;;;;;;37250:42;;37136:164;;;;:::o;66335:298::-;63567:13;:11;:13::i;:::-;66403:14:::1;66420:13;:11;:13::i;:::-;66403:30;;66466:1;66452:11;:15;66444:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66542:9;;66527:11;66518:6;:20;;;;:::i;:::-;:33;;66510:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66589:36;66599:12;:10;:12::i;:::-;66613:11;66589:9;:36::i;:::-;66392:241;66335:298:::0;:::o;64587:201::-;63567:13;:11;:13::i;:::-;64696:1:::1;64676:22;;:8;:22;;::::0;64668:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64752:28;64771:8;64752:18;:28::i;:::-;64587:201:::0;:::o;63846:132::-;63921:12;:10;:12::i;:::-;63910:23;;:7;:5;:7::i;:::-;:23;;;63902:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63846:132::o;37558:282::-;37623:4;37679:7;37660:15;:13;:15::i;:::-;:26;;:66;;;;;37713:13;;37703:7;:23;37660:66;:153;;;;;37812:1;21583:8;37764:17;:26;37782:7;37764:26;;;;;;;;;;;;:44;:49;37660:153;37640:173;;37558:282;;;:::o;59596:105::-;59656:7;59683:10;59676:17;;59596:105;:::o;24971:92::-;25027:7;25054:1;25047:8;;24971:92;:::o;32252:1275::-;32319:7;32339:12;32354:7;32339:22;;32422:4;32403:15;:13;:15::i;:::-;:23;32399:1061;;32456:13;;32449:4;:20;32445:1015;;;32494:14;32511:17;:23;32529:4;32511:23;;;;;;;;;;;;32494:40;;32628:1;21583:8;32600:6;:24;:29;32596:845;;33265:113;33282:1;33272:6;:11;33265:113;;33325:17;:25;33343:6;;;;;;;33325:25;;;;;;;;;;;;33316:34;;33265:113;;;33411:6;33404:13;;;;;;32596:845;32471:989;32445:1015;32399:1061;33488:31;;;;;;;;;;;;;;32252:1275;;;;:::o;38721:485::-;38823:27;38852:23;38893:38;38934:15;:24;38950:7;38934:24;;;;;;;;;;;38893:65;;39111:18;39088:41;;39168:19;39162:26;39143:45;;39073:126;38721:485;;;:::o;37949:659::-;38098:11;38263:16;38256:5;38252:28;38243:37;;38423:16;38412:9;38408:32;38395:45;;38573:15;38562:9;38559:30;38551:5;38540:9;38537:20;38534:56;38524:66;;37949:659;;;;;:::o;44583:159::-;;;;;:::o;58905:311::-;59040:7;59060:16;21987:3;59086:19;:41;;59060:68;;21987:3;59154:31;59165:4;59171:2;59175:9;59154:10;:31::i;:::-;59146:40;;:62;;59139:69;;;58905:311;;;;;:::o;34075:450::-;34155:14;34323:16;34316:5;34312:28;34303:37;;34500:5;34486:11;34461:23;34457:41;34454:52;34447:5;34444:63;34434:73;;34075:450;;;;:::o;45407:158::-;;;;;:::o;64948:191::-;65022:16;65041:6;;;;;;;;;;;65022:25;;65067:8;65058:6;;:17;;;;;;;;;;;;;;;;;;65122:8;65091:40;;65112:8;65091:40;;;;;;;;;;;;65011:128;64948:191;:::o;62232:98::-;62285:7;62312:10;62305:17;;62232:98;:::o;53428:112::-;53505:27;53515:2;53519:8;53505:27;;;;;;;;;;;;:9;:27::i;:::-;53428:112;;:::o;46005:716::-;46168:4;46214:2;46189:45;;;46235:19;:17;:19::i;:::-;46256:4;46262:7;46271:5;46189:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46185:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46489:1;46472:6;:13;:18;46468:235;;46518:40;;;;;;;;;;;;;;46468:235;46661:6;46655:13;46646:6;46642:2;46638:15;46631:38;46185:529;46358:54;;;46348:64;;;:6;:64;;;;46341:71;;;46005:716;;;;;;:::o;66113:104::-;66173:13;66202:7;66195:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66113:104;:::o;8390:723::-;8446:13;8676:1;8667:5;:10;8663:53;;8694:10;;;;;;;;;;;;;;;;;;;;;8663:53;8726:12;8741:5;8726:20;;8757:14;8782:78;8797:1;8789:4;:9;8782:78;;8815:8;;;;;:::i;:::-;;;;8846:2;8838:10;;;;;:::i;:::-;;;8782:78;;;8870:19;8902:6;8892:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8870:39;;8920:154;8936:1;8927:5;:10;8920:154;;8964:1;8954:11;;;;;:::i;:::-;;;9031:2;9023:5;:10;;;;:::i;:::-;9010:2;:24;;;;:::i;:::-;8997:39;;8980:6;8987;8980:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9060:2;9051:11;;;;;:::i;:::-;;;8920:154;;;9098:6;9084:21;;;;;8390:723;;;;:::o;6646:190::-;6771:4;6824;6795:25;6808:5;6815:4;6795:12;:25::i;:::-;:33;6788:40;;6646:190;;;;;:::o;58606:147::-;58743:6;58606:147;;;;;:::o;52655:689::-;52786:19;52792:2;52796:8;52786:5;:19::i;:::-;52865:1;52847:2;:14;;;:19;52843:483;;52887:11;52901:13;;52887:27;;52933:13;52955:8;52949:3;:14;52933:30;;52982:233;53013:62;53052:1;53056:2;53060:7;;;;;;53069:5;53013:30;:62::i;:::-;53008:167;;53111:40;;;;;;;;;;;;;;53008:167;53210:3;53202:5;:11;52982:233;;53297:3;53280:13;;:20;53276:34;;53302:8;;;53276:34;52868:458;;52843:483;52655:689;;;:::o;7198:675::-;7281:7;7301:20;7324:4;7301:27;;7344:9;7339:497;7363:5;:12;7359:1;:16;7339:497;;;7397:20;7420:5;7426:1;7420:8;;;;;;;;:::i;:::-;;;;;;;;7397:31;;7463:12;7447;:28;7443:382;;7590:42;7605:12;7619;7590:14;:42::i;:::-;7575:57;;7443:382;;;7767:42;7782:12;7796;7767:14;:42::i;:::-;7752:57;;7443:382;7382:454;7377:3;;;;;:::i;:::-;;;;7339:497;;;;7853:12;7846:19;;;7198:675;;;;:::o;47183:2720::-;47256:20;47279:13;;47256:36;;47319:1;47307:8;:13;47303:44;;47329:18;;;;;;;;;;;;;;47303:44;47360:61;47390:1;47394:2;47398:12;47412:8;47360:21;:61::i;:::-;47904:1;20945:2;47874:1;:26;;47873:32;47861:8;:45;47835:18;:22;47854:2;47835:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;48183:139;48220:2;48274:33;48297:1;48301:2;48305:1;48274:14;:33::i;:::-;48241:30;48262:8;48241:20;:30::i;:::-;:66;48183:18;:139::i;:::-;48149:17;:31;48167:12;48149:31;;;;;;;;;;;:173;;;;48339:16;48370:11;48399:8;48384:12;:23;48370:37;;48920:16;48916:2;48912:25;48900:37;;49292:12;49252:8;49211:1;49149:25;49090:1;49029;49002:335;49417:1;49403:12;49399:20;49357:346;49458:3;49449:7;49446:16;49357:346;;49676:7;49666:8;49663:1;49636:25;49633:1;49630;49625:59;49511:1;49502:7;49498:15;49487:26;;49357:346;;;49361:77;49748:1;49736:8;:13;49732:45;;49758:19;;;;;;;;;;;;;;49732:45;49810:3;49794:13;:19;;;;47609:2216;;49835:60;49864:1;49868:2;49872:12;49886:8;49835:20;:60::i;:::-;47245:2658;47183:2720;;:::o;7881:224::-;7949:13;8012:1;8006:4;7999:15;8041:1;8035:4;8028:15;8082:4;8076;8066:21;8057:30;;7881:224;;;;:::o;34627:324::-;34697:14;34930:1;34920:8;34917:15;34891:24;34887:46;34877:56;;34627:324;;;:::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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:329::-;5891:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:119;;;5946:79;;:::i;:::-;5908:119;6066:1;6091:53;6136:7;6127:6;6116:9;6112:22;6091:53;:::i;:::-;6081:63;;6037:117;5832:329;;;;:::o;6167:619::-;6244:6;6252;6260;6309:2;6297:9;6288:7;6284:23;6280:32;6277:119;;;6315:79;;:::i;:::-;6277:119;6435:1;6460:53;6505:7;6496:6;6485:9;6481:22;6460:53;:::i;:::-;6450:63;;6406:117;6562:2;6588:53;6633:7;6624:6;6613:9;6609:22;6588:53;:::i;:::-;6578:63;;6533:118;6690:2;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6661:118;6167:619;;;;;:::o;6792:77::-;6829:7;6858:5;6847:16;;6792:77;;;:::o;6875:118::-;6962:24;6980:5;6962:24;:::i;:::-;6957:3;6950:37;6875:118;;:::o;6999:222::-;7092:4;7130:2;7119:9;7115:18;7107:26;;7143:71;7211:1;7200:9;7196:17;7187:6;7143:71;:::i;:::-;6999:222;;;;:::o;7227:117::-;7336:1;7333;7326:12;7350:117;7459:1;7456;7449:12;7473:180;7521:77;7518:1;7511:88;7618:4;7615:1;7608:15;7642:4;7639:1;7632:15;7659:281;7742:27;7764:4;7742:27;:::i;:::-;7734:6;7730:40;7872:6;7860:10;7857:22;7836:18;7824:10;7821:34;7818:62;7815:88;;;7883:18;;:::i;:::-;7815:88;7923:10;7919:2;7912:22;7702:238;7659:281;;:::o;7946:129::-;7980:6;8007:20;;:::i;:::-;7997:30;;8036:33;8064:4;8056:6;8036:33;:::i;:::-;7946:129;;;:::o;8081:308::-;8143:4;8233:18;8225:6;8222:30;8219:56;;;8255:18;;:::i;:::-;8219:56;8293:29;8315:6;8293:29;:::i;:::-;8285:37;;8377:4;8371;8367:15;8359:23;;8081:308;;;:::o;8395:146::-;8492:6;8487:3;8482;8469:30;8533:1;8524:6;8519:3;8515:16;8508:27;8395:146;;;:::o;8547:425::-;8625:5;8650:66;8666:49;8708:6;8666:49;:::i;:::-;8650:66;:::i;:::-;8641:75;;8739:6;8732:5;8725:21;8777:4;8770:5;8766:16;8815:3;8806:6;8801:3;8797:16;8794:25;8791:112;;;8822:79;;:::i;:::-;8791:112;8912:54;8959:6;8954:3;8949;8912:54;:::i;:::-;8631:341;8547:425;;;;;:::o;8992:340::-;9048:5;9097:3;9090:4;9082:6;9078:17;9074:27;9064:122;;9105:79;;:::i;:::-;9064:122;9222:6;9209:20;9247:79;9322:3;9314:6;9307:4;9299:6;9295:17;9247:79;:::i;:::-;9238:88;;9054:278;8992:340;;;;:::o;9338:509::-;9407:6;9456:2;9444:9;9435:7;9431:23;9427:32;9424:119;;;9462:79;;:::i;:::-;9424:119;9610:1;9599:9;9595:17;9582:31;9640:18;9632:6;9629:30;9626:117;;;9662:79;;:::i;:::-;9626:117;9767:63;9822:7;9813:6;9802:9;9798:22;9767:63;:::i;:::-;9757:73;;9553:287;9338:509;;;;:::o;9853:122::-;9926:24;9944:5;9926:24;:::i;:::-;9919:5;9916:35;9906:63;;9965:1;9962;9955:12;9906:63;9853:122;:::o;9981:139::-;10027:5;10065:6;10052:20;10043:29;;10081:33;10108:5;10081:33;:::i;:::-;9981:139;;;;:::o;10126:329::-;10185:6;10234:2;10222:9;10213:7;10209:23;10205:32;10202:119;;;10240:79;;:::i;:::-;10202:119;10360:1;10385:53;10430:7;10421:6;10410:9;10406:22;10385:53;:::i;:::-;10375:63;;10331:117;10126:329;;;;:::o;10461:468::-;10526:6;10534;10583:2;10571:9;10562:7;10558:23;10554:32;10551:119;;;10589:79;;:::i;:::-;10551:119;10709:1;10734:53;10779:7;10770:6;10759:9;10755:22;10734:53;:::i;:::-;10724:63;;10680:117;10836:2;10862:50;10904:7;10895:6;10884:9;10880:22;10862:50;:::i;:::-;10852:60;;10807:115;10461:468;;;;;:::o;10935:307::-;10996:4;11086:18;11078:6;11075:30;11072:56;;;11108:18;;:::i;:::-;11072:56;11146:29;11168:6;11146:29;:::i;:::-;11138:37;;11230:4;11224;11220:15;11212:23;;10935:307;;;:::o;11248:423::-;11325:5;11350:65;11366:48;11407:6;11366:48;:::i;:::-;11350:65;:::i;:::-;11341:74;;11438:6;11431:5;11424:21;11476:4;11469:5;11465:16;11514:3;11505:6;11500:3;11496:16;11493:25;11490:112;;;11521:79;;:::i;:::-;11490:112;11611:54;11658:6;11653:3;11648;11611:54;:::i;:::-;11331:340;11248:423;;;;;:::o;11690:338::-;11745:5;11794:3;11787:4;11779:6;11775:17;11771:27;11761:122;;11802:79;;:::i;:::-;11761:122;11919:6;11906:20;11944:78;12018:3;12010:6;12003:4;11995:6;11991:17;11944:78;:::i;:::-;11935:87;;11751:277;11690:338;;;;:::o;12034:943::-;12129:6;12137;12145;12153;12202:3;12190:9;12181:7;12177:23;12173:33;12170:120;;;12209:79;;:::i;:::-;12170:120;12329:1;12354:53;12399:7;12390:6;12379:9;12375:22;12354:53;:::i;:::-;12344:63;;12300:117;12456:2;12482:53;12527:7;12518:6;12507:9;12503:22;12482:53;:::i;:::-;12472:63;;12427:118;12584:2;12610:53;12655:7;12646:6;12635:9;12631:22;12610:53;:::i;:::-;12600:63;;12555:118;12740:2;12729:9;12725:18;12712:32;12771:18;12763:6;12760:30;12757:117;;;12793:79;;:::i;:::-;12757:117;12898:62;12952:7;12943:6;12932:9;12928:22;12898:62;:::i;:::-;12888:72;;12683:287;12034:943;;;;;;;:::o;12983:117::-;13092:1;13089;13082:12;13106:117;13215:1;13212;13205:12;13246:568;13319:8;13329:6;13379:3;13372:4;13364:6;13360:17;13356:27;13346:122;;13387:79;;:::i;:::-;13346:122;13500:6;13487:20;13477:30;;13530:18;13522:6;13519:30;13516:117;;;13552:79;;:::i;:::-;13516:117;13666:4;13658:6;13654:17;13642:29;;13720:3;13712:4;13704:6;13700:17;13690:8;13686:32;13683:41;13680:128;;;13727:79;;:::i;:::-;13680:128;13246:568;;;;;:::o;13820:704::-;13915:6;13923;13931;13980:2;13968:9;13959:7;13955:23;13951:32;13948:119;;;13986:79;;:::i;:::-;13948:119;14106:1;14131:53;14176:7;14167:6;14156:9;14152:22;14131:53;:::i;:::-;14121:63;;14077:117;14261:2;14250:9;14246:18;14233:32;14292:18;14284:6;14281:30;14278:117;;;14314:79;;:::i;:::-;14278:117;14427:80;14499:7;14490:6;14479:9;14475:22;14427:80;:::i;:::-;14409:98;;;;14204:313;13820:704;;;;;:::o;14530:474::-;14598:6;14606;14655:2;14643:9;14634:7;14630:23;14626:32;14623:119;;;14661:79;;:::i;:::-;14623:119;14781:1;14806:53;14851:7;14842:6;14831:9;14827:22;14806:53;:::i;:::-;14796:63;;14752:117;14908:2;14934:53;14979:7;14970:6;14959:9;14955:22;14934:53;:::i;:::-;14924:63;;14879:118;14530:474;;;;;:::o;15010:180::-;15058:77;15055:1;15048:88;15155:4;15152:1;15145:15;15179:4;15176:1;15169:15;15196:320;15240:6;15277:1;15271:4;15267:12;15257:22;;15324:1;15318:4;15314:12;15345:18;15335:81;;15401:4;15393:6;15389:17;15379:27;;15335:81;15463:2;15455:6;15452:14;15432:18;15429:38;15426:84;;15482:18;;:::i;:::-;15426:84;15247:269;15196:320;;;:::o;15522:147::-;15623:11;15660:3;15645:18;;15522:147;;;;:::o;15675:114::-;;:::o;15795:398::-;15954:3;15975:83;16056:1;16051:3;15975:83;:::i;:::-;15968:90;;16067:93;16156:3;16067:93;:::i;:::-;16185:1;16180:3;16176:11;16169:18;;15795:398;;;:::o;16199:379::-;16383:3;16405:147;16548:3;16405:147;:::i;:::-;16398:154;;16569:3;16562:10;;16199:379;;;:::o;16584:141::-;16633:4;16656:3;16648:11;;16679:3;16676:1;16669:14;16713:4;16710:1;16700:18;16692:26;;16584:141;;;:::o;16731:93::-;16768:6;16815:2;16810;16803:5;16799:14;16795:23;16785:33;;16731:93;;;:::o;16830:107::-;16874:8;16924:5;16918:4;16914:16;16893:37;;16830:107;;;;:::o;16943:393::-;17012:6;17062:1;17050:10;17046:18;17085:97;17115:66;17104:9;17085:97;:::i;:::-;17203:39;17233:8;17222:9;17203:39;:::i;:::-;17191:51;;17275:4;17271:9;17264:5;17260:21;17251:30;;17324:4;17314:8;17310:19;17303:5;17300:30;17290:40;;17019:317;;16943:393;;;;;:::o;17342:60::-;17370:3;17391:5;17384:12;;17342:60;;;:::o;17408:142::-;17458:9;17491:53;17509:34;17518:24;17536:5;17518:24;:::i;:::-;17509:34;:::i;:::-;17491:53;:::i;:::-;17478:66;;17408:142;;;:::o;17556:75::-;17599:3;17620:5;17613:12;;17556:75;;;:::o;17637:269::-;17747:39;17778:7;17747:39;:::i;:::-;17808:91;17857:41;17881:16;17857:41;:::i;:::-;17849:6;17842:4;17836:11;17808:91;:::i;:::-;17802:4;17795:105;17713:193;17637:269;;;:::o;17912:73::-;17957:3;17912:73;:::o;17991:189::-;18068:32;;:::i;:::-;18109:65;18167:6;18159;18153:4;18109:65;:::i;:::-;18044:136;17991:189;;:::o;18186:186::-;18246:120;18263:3;18256:5;18253:14;18246:120;;;18317:39;18354:1;18347:5;18317:39;:::i;:::-;18290:1;18283:5;18279:13;18270:22;;18246:120;;;18186:186;;:::o;18378:543::-;18479:2;18474:3;18471:11;18468:446;;;18513:38;18545:5;18513:38;:::i;:::-;18597:29;18615:10;18597:29;:::i;:::-;18587:8;18583:44;18780:2;18768:10;18765:18;18762:49;;;18801:8;18786:23;;18762:49;18824:80;18880:22;18898:3;18880:22;:::i;:::-;18870:8;18866:37;18853:11;18824:80;:::i;:::-;18483:431;;18468:446;18378:543;;;:::o;18927:117::-;18981:8;19031:5;19025:4;19021:16;19000:37;;18927:117;;;;:::o;19050:169::-;19094:6;19127:51;19175:1;19171:6;19163:5;19160:1;19156:13;19127:51;:::i;:::-;19123:56;19208:4;19202;19198:15;19188:25;;19101:118;19050:169;;;;:::o;19224:295::-;19300:4;19446:29;19471:3;19465:4;19446:29;:::i;:::-;19438:37;;19508:3;19505:1;19501:11;19495:4;19492:21;19484:29;;19224:295;;;;:::o;19524:1395::-;19641:37;19674:3;19641:37;:::i;:::-;19743:18;19735:6;19732:30;19729:56;;;19765:18;;:::i;:::-;19729:56;19809:38;19841:4;19835:11;19809:38;:::i;:::-;19894:67;19954:6;19946;19940:4;19894:67;:::i;:::-;19988:1;20012:4;19999:17;;20044:2;20036:6;20033:14;20061:1;20056:618;;;;20718:1;20735:6;20732:77;;;20784:9;20779:3;20775:19;20769:26;20760:35;;20732:77;20835:67;20895:6;20888:5;20835:67;:::i;:::-;20829:4;20822:81;20691:222;20026:887;;20056:618;20108:4;20104:9;20096:6;20092:22;20142:37;20174:4;20142:37;:::i;:::-;20201:1;20215:208;20229:7;20226:1;20223:14;20215:208;;;20308:9;20303:3;20299:19;20293:26;20285:6;20278:42;20359:1;20351:6;20347:14;20337:24;;20406:2;20395:9;20391:18;20378:31;;20252:4;20249:1;20245:12;20240:17;;20215:208;;;20451:6;20442:7;20439:19;20436:179;;;20509:9;20504:3;20500:19;20494:26;20552:48;20594:4;20586:6;20582:17;20571:9;20552:48;:::i;:::-;20544:6;20537:64;20459:156;20436:179;20661:1;20657;20649:6;20645:14;20641:22;20635:4;20628:36;20063:611;;;20026:887;;19616:1303;;;19524:1395;;:::o;20925:172::-;21065:24;21061:1;21053:6;21049:14;21042:48;20925:172;:::o;21103:366::-;21245:3;21266:67;21330:2;21325:3;21266:67;:::i;:::-;21259:74;;21342:93;21431:3;21342:93;:::i;:::-;21460:2;21455:3;21451:12;21444:19;;21103:366;;;:::o;21475:419::-;21641:4;21679:2;21668:9;21664:18;21656:26;;21728:9;21722:4;21718:20;21714:1;21703:9;21699:17;21692:47;21756:131;21882:4;21756:131;:::i;:::-;21748:139;;21475:419;;;:::o;21900:177::-;22040:29;22036:1;22028:6;22024:14;22017:53;21900:177;:::o;22083:366::-;22225:3;22246:67;22310:2;22305:3;22246:67;:::i;:::-;22239:74;;22322:93;22411:3;22322:93;:::i;:::-;22440:2;22435:3;22431:12;22424:19;;22083:366;;;:::o;22455:419::-;22621:4;22659:2;22648:9;22644:18;22636:26;;22708:9;22702:4;22698:20;22694:1;22683:9;22679:17;22672:47;22736:131;22862:4;22736:131;:::i;:::-;22728:139;;22455:419;;;:::o;22880:223::-;23020:34;23016:1;23008:6;23004:14;22997:58;23089:6;23084:2;23076:6;23072:15;23065:31;22880:223;:::o;23109:366::-;23251:3;23272:67;23336:2;23331:3;23272:67;:::i;:::-;23265:74;;23348:93;23437:3;23348:93;:::i;:::-;23466:2;23461:3;23457:12;23450:19;;23109:366;;;:::o;23481:419::-;23647:4;23685:2;23674:9;23670:18;23662:26;;23734:9;23728:4;23724:20;23720:1;23709:9;23705:17;23698:47;23762:131;23888:4;23762:131;:::i;:::-;23754:139;;23481:419;;;:::o;23906:180::-;23954:77;23951:1;23944:88;24051:4;24048:1;24041:15;24075:4;24072:1;24065:15;24092:191;24132:3;24151:20;24169:1;24151:20;:::i;:::-;24146:25;;24185:20;24203:1;24185:20;:::i;:::-;24180:25;;24228:1;24225;24221:9;24214:16;;24249:3;24246:1;24243:10;24240:36;;;24256:18;;:::i;:::-;24240:36;24092:191;;;;:::o;24289:172::-;24429:24;24425:1;24417:6;24413:14;24406:48;24289:172;:::o;24467:366::-;24609:3;24630:67;24694:2;24689:3;24630:67;:::i;:::-;24623:74;;24706:93;24795:3;24706:93;:::i;:::-;24824:2;24819:3;24815:12;24808:19;;24467:366;;;:::o;24839:419::-;25005:4;25043:2;25032:9;25028:18;25020:26;;25092:9;25086:4;25082:20;25078:1;25067:9;25063:17;25056:47;25120:131;25246:4;25120:131;:::i;:::-;25112:139;;24839:419;;;:::o;25264:178::-;25404:30;25400:1;25392:6;25388:14;25381:54;25264:178;:::o;25448:366::-;25590:3;25611:67;25675:2;25670:3;25611:67;:::i;:::-;25604:74;;25687:93;25776:3;25687:93;:::i;:::-;25805:2;25800:3;25796:12;25789:19;;25448:366;;;:::o;25820:419::-;25986:4;26024:2;26013:9;26009:18;26001:26;;26073:9;26067:4;26063:20;26059:1;26048:9;26044:17;26037:47;26101:131;26227:4;26101:131;:::i;:::-;26093:139;;25820:419;;;:::o;26245:410::-;26285:7;26308:20;26326:1;26308:20;:::i;:::-;26303:25;;26342:20;26360:1;26342:20;:::i;:::-;26337:25;;26397:1;26394;26390:9;26419:30;26437:11;26419:30;:::i;:::-;26408:41;;26598:1;26589:7;26585:15;26582:1;26579:22;26559:1;26552:9;26532:83;26509:139;;26628:18;;:::i;:::-;26509:139;26293:362;26245:410;;;;:::o;26661:168::-;26801:20;26797:1;26789:6;26785:14;26778:44;26661:168;:::o;26835:366::-;26977:3;26998:67;27062:2;27057:3;26998:67;:::i;:::-;26991:74;;27074:93;27163:3;27074:93;:::i;:::-;27192:2;27187:3;27183:12;27176:19;;26835:366;;;:::o;27207:419::-;27373:4;27411:2;27400:9;27396:18;27388:26;;27460:9;27454:4;27450:20;27446:1;27435:9;27431:17;27424:47;27488:131;27614:4;27488:131;:::i;:::-;27480:139;;27207:419;;;:::o;27632:234::-;27772:34;27768:1;27760:6;27756:14;27749:58;27841:17;27836:2;27828:6;27824:15;27817:42;27632:234;:::o;27872:366::-;28014:3;28035:67;28099:2;28094:3;28035:67;:::i;:::-;28028:74;;28111:93;28200:3;28111:93;:::i;:::-;28229:2;28224:3;28220:12;28213:19;;27872:366;;;:::o;28244:419::-;28410:4;28448:2;28437:9;28433:18;28425:26;;28497:9;28491:4;28487:20;28483:1;28472:9;28468:17;28461:47;28525:131;28651:4;28525:131;:::i;:::-;28517:139;;28244:419;;;:::o;28669:148::-;28771:11;28808:3;28793:18;;28669:148;;;;:::o;28823:390::-;28929:3;28957:39;28990:5;28957:39;:::i;:::-;29012:89;29094:6;29089:3;29012:89;:::i;:::-;29005:96;;29110:65;29168:6;29163:3;29156:4;29149:5;29145:16;29110:65;:::i;:::-;29200:6;29195:3;29191:16;29184:23;;28933:280;28823:390;;;;:::o;29243:874::-;29346:3;29383:5;29377:12;29412:36;29438:9;29412:36;:::i;:::-;29464:89;29546:6;29541:3;29464:89;:::i;:::-;29457:96;;29584:1;29573:9;29569:17;29600:1;29595:166;;;;29775:1;29770:341;;;;29562:549;;29595:166;29679:4;29675:9;29664;29660:25;29655:3;29648:38;29741:6;29734:14;29727:22;29719:6;29715:35;29710:3;29706:45;29699:52;;29595:166;;29770:341;29837:38;29869:5;29837:38;:::i;:::-;29897:1;29911:154;29925:6;29922:1;29919:13;29911:154;;;29999:7;29993:14;29989:1;29984:3;29980:11;29973:35;30049:1;30040:7;30036:15;30025:26;;29947:4;29944:1;29940:12;29935:17;;29911:154;;;30094:6;30089:3;30085:16;30078:23;;29777:334;;29562:549;;29350:767;;29243:874;;;;:::o;30123:589::-;30348:3;30370:95;30461:3;30452:6;30370:95;:::i;:::-;30363:102;;30482:95;30573:3;30564:6;30482:95;:::i;:::-;30475:102;;30594:92;30682:3;30673:6;30594:92;:::i;:::-;30587:99;;30703:3;30696:10;;30123:589;;;;;;:::o;30718:182::-;30858:34;30854:1;30846:6;30842:14;30835:58;30718:182;:::o;30906:366::-;31048:3;31069:67;31133:2;31128:3;31069:67;:::i;:::-;31062:74;;31145:93;31234:3;31145:93;:::i;:::-;31263:2;31258:3;31254:12;31247:19;;30906:366;;;:::o;31278:419::-;31444:4;31482:2;31471:9;31467:18;31459:26;;31531:9;31525:4;31521:20;31517:1;31506:9;31502:17;31495:47;31559:131;31685:4;31559:131;:::i;:::-;31551:139;;31278:419;;;:::o;31703:174::-;31843:26;31839:1;31831:6;31827:14;31820:50;31703:174;:::o;31883:366::-;32025:3;32046:67;32110:2;32105:3;32046:67;:::i;:::-;32039:74;;32122:93;32211:3;32122:93;:::i;:::-;32240:2;32235:3;32231:12;32224:19;;31883:366;;;:::o;32255:419::-;32421:4;32459:2;32448:9;32444:18;32436:26;;32508:9;32502:4;32498:20;32494:1;32483:9;32479:17;32472:47;32536:131;32662:4;32536:131;:::i;:::-;32528:139;;32255:419;;;:::o;32680:94::-;32713:8;32761:5;32757:2;32753:14;32732:35;;32680:94;;;:::o;32780:::-;32819:7;32848:20;32862:5;32848:20;:::i;:::-;32837:31;;32780:94;;;:::o;32880:100::-;32919:7;32948:26;32968:5;32948:26;:::i;:::-;32937:37;;32880:100;;;:::o;32986:157::-;33091:45;33111:24;33129:5;33111:24;:::i;:::-;33091:45;:::i;:::-;33086:3;33079:58;32986:157;;:::o;33149:256::-;33261:3;33276:75;33347:3;33338:6;33276:75;:::i;:::-;33376:2;33371:3;33367:12;33360:19;;33396:3;33389:10;;33149:256;;;;:::o;33411:164::-;33551:16;33547:1;33539:6;33535:14;33528:40;33411:164;:::o;33581:366::-;33723:3;33744:67;33808:2;33803:3;33744:67;:::i;:::-;33737:74;;33820:93;33909:3;33820:93;:::i;:::-;33938:2;33933:3;33929:12;33922:19;;33581:366;;;:::o;33953:419::-;34119:4;34157:2;34146:9;34142:18;34134:26;;34206:9;34200:4;34196:20;34192:1;34181:9;34177:17;34170:47;34234:131;34360:4;34234:131;:::i;:::-;34226:139;;33953:419;;;:::o;34378:225::-;34518:34;34514:1;34506:6;34502:14;34495:58;34587:8;34582:2;34574:6;34570:15;34563:33;34378:225;:::o;34609:366::-;34751:3;34772:67;34836:2;34831:3;34772:67;:::i;:::-;34765:74;;34848:93;34937:3;34848:93;:::i;:::-;34966:2;34961:3;34957:12;34950:19;;34609:366;;;:::o;34981:419::-;35147:4;35185:2;35174:9;35170:18;35162:26;;35234:9;35228:4;35224:20;35220:1;35209:9;35205:17;35198:47;35262:131;35388:4;35262:131;:::i;:::-;35254:139;;34981:419;;;:::o;35406:182::-;35546:34;35542:1;35534:6;35530:14;35523:58;35406:182;:::o;35594:366::-;35736:3;35757:67;35821:2;35816:3;35757:67;:::i;:::-;35750:74;;35833:93;35922:3;35833:93;:::i;:::-;35951:2;35946:3;35942:12;35935:19;;35594:366;;;:::o;35966:419::-;36132:4;36170:2;36159:9;36155:18;36147:26;;36219:9;36213:4;36209:20;36205:1;36194:9;36190:17;36183:47;36247:131;36373:4;36247:131;:::i;:::-;36239:139;;35966:419;;;:::o;36391:98::-;36442:6;36476:5;36470:12;36460:22;;36391:98;;;:::o;36495:168::-;36578:11;36612:6;36607:3;36600:19;36652:4;36647:3;36643:14;36628:29;;36495:168;;;;:::o;36669:373::-;36755:3;36783:38;36815:5;36783:38;:::i;:::-;36837:70;36900:6;36895:3;36837:70;:::i;:::-;36830:77;;36916:65;36974:6;36969:3;36962:4;36955:5;36951:16;36916:65;:::i;:::-;37006:29;37028:6;37006:29;:::i;:::-;37001:3;36997:39;36990:46;;36759:283;36669:373;;;;:::o;37048:640::-;37243:4;37281:3;37270:9;37266:19;37258:27;;37295:71;37363:1;37352:9;37348:17;37339:6;37295:71;:::i;:::-;37376:72;37444:2;37433:9;37429:18;37420:6;37376:72;:::i;:::-;37458;37526:2;37515:9;37511:18;37502:6;37458:72;:::i;:::-;37577:9;37571:4;37567:20;37562:2;37551:9;37547:18;37540:48;37605:76;37676:4;37667:6;37605:76;:::i;:::-;37597:84;;37048:640;;;;;;;:::o;37694:141::-;37750:5;37781:6;37775:13;37766:22;;37797:32;37823:5;37797:32;:::i;:::-;37694:141;;;;:::o;37841:349::-;37910:6;37959:2;37947:9;37938:7;37934:23;37930:32;37927:119;;;37965:79;;:::i;:::-;37927:119;38085:1;38110:63;38165:7;38156:6;38145:9;38141:22;38110:63;:::i;:::-;38100:73;;38056:127;37841:349;;;;:::o;38196:233::-;38235:3;38258:24;38276:5;38258:24;:::i;:::-;38249:33;;38304:66;38297:5;38294:77;38291:103;;38374:18;;:::i;:::-;38291:103;38421:1;38414:5;38410:13;38403:20;;38196:233;;;:::o;38435:180::-;38483:77;38480:1;38473:88;38580:4;38577:1;38570:15;38604:4;38601:1;38594:15;38621:185;38661:1;38678:20;38696:1;38678:20;:::i;:::-;38673:25;;38712:20;38730:1;38712:20;:::i;:::-;38707:25;;38751:1;38741:35;;38756:18;;:::i;:::-;38741:35;38798:1;38795;38791:9;38786:14;;38621:185;;;;:::o;38812:194::-;38852:4;38872:20;38890:1;38872:20;:::i;:::-;38867:25;;38906:20;38924:1;38906:20;:::i;:::-;38901:25;;38950:1;38947;38943:9;38935:17;;38974:1;38968:4;38965:11;38962:37;;;38979:18;;:::i;:::-;38962:37;38812:194;;;;:::o;39012:176::-;39044:1;39061:20;39079:1;39061:20;:::i;:::-;39056:25;;39095:20;39113:1;39095:20;:::i;:::-;39090:25;;39134:1;39124:35;;39139:18;;:::i;:::-;39124:35;39180:1;39177;39173:9;39168:14;;39012:176;;;;:::o;39194:180::-;39242:77;39239:1;39232:88;39339:4;39336:1;39329:15;39363:4;39360:1;39353:15
Swarm Source
ipfs://652974a75a3db0bd980a2af6d0cab982d539c4c849a5c6831cb0c63bc5243b4f
Loading...
Loading
Loading...
Loading
[ 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.