Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Change Mint Stat... | 650888 | 128 days ago | IN | 0 APE | 0.00117677 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Smilee_Beras
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-10-21 */ /** *Submitted for verification at Arbiscan.io on 2024-08-06 */ // SPDX-License-Identifier: UNLICENSED // File: IDelegateRegistry.sol pragma solidity >=0.8.13; /** * @title IDelegateRegistry * @custom:version 2.0 * @custom:author foobar (0xfoobar) * @notice A standalone immutable registry storing delegated permissions from one address to another */ interface IDelegateRegistry { /// @notice Delegation type, NONE is used when a delegation does not exist or is revoked enum DelegationType { NONE, ALL, CONTRACT, ERC721, ERC20, ERC1155 } /// @notice Struct for returning delegations struct Delegation { DelegationType type_; address to; address from; bytes32 rights; address contract_; uint256 tokenId; uint256 amount; } /// @notice Emitted when an address delegates or revokes rights for their entire wallet event DelegateAll(address indexed from, address indexed to, bytes32 rights, bool enable); /// @notice Emitted when an address delegates or revokes rights for a contract address event DelegateContract(address indexed from, address indexed to, address indexed contract_, bytes32 rights, bool enable); /// @notice Emitted when an address delegates or revokes rights for an ERC721 tokenId event DelegateERC721(address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, bool enable); /// @notice Emitted when an address delegates or revokes rights for an amount of ERC20 tokens event DelegateERC20(address indexed from, address indexed to, address indexed contract_, bytes32 rights, uint256 amount); /// @notice Emitted when an address delegates or revokes rights for an amount of an ERC1155 tokenId event DelegateERC1155(address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, uint256 amount); /// @notice Thrown if multicall calldata is malformed error MulticallFailed(); /** * ----------- WRITE ----------- */ /** * @notice Call multiple functions in the current contract and return the data from all of them if they all succeed * @param data The encoded function data for each of the calls to make to this contract * @return results The results from each of the calls passed in via data */ function multicall(bytes[] calldata data) external payable returns (bytes[] memory results); /** * @notice Allow the delegate to act on behalf of "msg.sender" for all contracts * @param to The address to act as delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateAll(address to, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of "msg.sender" for a specific contract * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateContract(address to, address contract_, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of "msg.sender" for a specific ERC721 token * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC721(address to, address contract_, uint256 tokenId, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of "msg.sender" for a specific amount of ERC20 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address for the fungible token contract * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC20(address to, address contract_, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of "msg.sender" for a specific amount of ERC1155 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address of the contract that holds the token * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount of that token id to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC1155(address to, address contract_, uint256 tokenId, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * ----------- CHECKS ----------- */ /** * @notice Check if "to" is a delegate of "from" for the entire wallet * @param to The potential delegate address * @param from The potential address who delegated rights * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on the from's behalf */ function checkDelegateForAll(address to, address from, bytes32 rights) external view returns (bool); /** * @notice Check if "to" is a delegate of "from" for the specified "contract_" or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet or that specific contract */ function checkDelegateForContract(address to, address from, address contract_, bytes32 rights) external view returns (bool); /** * @notice Check if "to" is a delegate of "from" for the specific "contract" and "tokenId", the entire "contract_", or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param tokenId The token id for the token to delegating * @param from The wallet that issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet, that contract, or that specific tokenId */ function checkDelegateForERC721(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (bool); /** * @notice Returns the amount of ERC20 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights) external view returns (uint256); /** * @notice Returns the amount of a ERC1155 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param tokenId The token id to check the delegated amount of * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC1155(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (uint256); /** * ----------- ENUMERATIONS ----------- */ /** * @notice Returns all enabled delegations a given delegate has received * @param to The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getIncomingDelegations(address to) external view returns (Delegation[] memory delegations); /** * @notice Returns all enabled delegations an address has given out * @param from The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getOutgoingDelegations(address from) external view returns (Delegation[] memory delegations); /** * @notice Returns all hashes associated with enabled delegations an address has received * @param to The address to retrieve incoming delegation hashes for * @return delegationHashes Array of delegation hashes */ function getIncomingDelegationHashes(address to) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns all hashes associated with enabled delegations an address has given out * @param from The address to retrieve outgoing delegation hashes for * @return delegationHashes Array of delegation hashes */ function getOutgoingDelegationHashes(address from) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns the delegations for a given array of delegation hashes * @param delegationHashes is an array of hashes that correspond to delegations * @return delegations Array of Delegation structs, return empty structs for nonexistent or revoked delegations */ function getDelegationsFromHashes(bytes32[] calldata delegationHashes) external view returns (Delegation[] memory delegations); /** * ----------- STORAGE ACCESS ----------- */ /** * @notice Allows external contracts to read arbitrary storage slots */ function readSlot(bytes32 location) external view returns (bytes32); /** * @notice Allows external contracts to read an arbitrary array of storage slots */ function readSlots(bytes32[] calldata locations) external view returns (bytes32[] memory); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when "value" tokens are moved from one account ("from") to * another ("to"). * * Note that "value" may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a "spender" for an "owner" is set by * a call to {approve}. "value" is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by "account". */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a "value" amount of tokens from the caller's account to "to". * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that "spender" will be * allowed to spend on behalf of "owner" through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a "value" amount of tokens as the allowance of "spender" over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a "value" amount of tokens from "from" to "to" using the * allowance mechanism. "value" is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * """solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * """ */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific "tokenId" is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for "tokenId" is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - "receiver" cannot be the zero address. * - "feeNumerator" cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - "receiver" cannot be the zero address. * - "feeNumerator" cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. "address(0)") */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * "onlyOwner" functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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: IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by "from". */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The "quantity" minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The "extraData" cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to "startTimestamp" that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * "interfaceId". See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when "tokenId" token is transferred from "from" to "to". */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when "owner" enables "approved" to manage the "tokenId" token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when "owner" enables or disables * ("approved") "operator" to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in "owner"'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the "tokenId" token. * * Requirements: * * - "tokenId" must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers "tokenId" token from "from" to "to", * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - "from" cannot be the zero address. * - "to" cannot be the zero address. * - "tokenId" token must exist and be owned by "from". * - If the caller is not "from", it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If "to" refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to "safeTransferFrom(from, to, tokenId, '')". */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers "tokenId" from "from" to "to". * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - "from" cannot be the zero address. * - "to" cannot be the zero address. * - "tokenId" token must be owned by "from". * - If the caller is not "from", it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to "to" to transfer "tokenId" token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - "tokenId" must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove "operator" as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The "operator" cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for "tokenId" token. * * Requirements: * * - "tokenId" must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the "operator" is allowed to manage all of the assets of "owner". * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for "tokenId" token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in "fromTokenId" to "toTokenId" * (inclusive) is transferred from "from" to "to", as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from "_startTokenId()". * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a "--via-ir" bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of "numberMinted" in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of "numberBurned" in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of "aux" in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for "aux". uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of "startTimestamp" in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the "burned" bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the "nextInitialized" bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the "nextInitialized" bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of "extraData" in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for "extraData". uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum "quantity" that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The "Transfer" event signature is given by: // "keccak256(bytes("Transfer(address,address,uint256)"))". bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] "addr" // - [160..223] "startTimestamp" // - [224] "burned" // - [225] "nextInitialized" // - [232..255] "extraData" mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] "balance" // - [64..127] "numberMinted" // - [128..191] "numberBurned" // - [192..255] "aux" mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than "_currentIndex - _startTokenId()" times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as "_currentIndex" does not decrement, // and it is initialized to "_startTokenId()". unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in "owner"'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by "owner". */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of "owner". */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for "owner". (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for "owner". (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast "aux" with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * "interfaceId". See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. "bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)") return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for "tokenId" token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the "baseURI" and the "tokenId". Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the "tokenId" token. * * Requirements: * * - "tokenId" must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked "TokenOwnership" struct at "index". */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at "index" for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of "tokenId". */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. "ownership.addr != address(0) && ownership.burned == false") // before an unintialized ownership slot // (i.e. "ownership.addr == address(0) && ownership.burned == false") // Hence, "curr" will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked "TokenOwnership" struct from "packed". */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask "owner" to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // "owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags". result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the "nextInitialized" flag set if "quantity" equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the "nextInitialized" flag. assembly { // "(quantity == 1) << _BITPOS_NEXT_INITIALIZED". result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to "to" to transfer "tokenId" token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - "tokenId" must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for "tokenId" token. * * Requirements: * * - "tokenId" must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove "operator" as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The "operator" cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the "operator" is allowed to manage all of the assets of "owner". * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether "tokenId" exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether "msgSender" is equal to "approvedAddress" or "owner". */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask "owner" to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask "msgSender" to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // "msgSender == owner || msgSender == approvedAddress". result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of "tokenId". */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to "approvedAddress = _tokenApprovals[tokenId].value". assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers "tokenId" from "from" to "to". * * Requirements: * * - "from" cannot be the zero address. * - "to" cannot be the zero address. * - "tokenId" token must be owned by "from". * - If the caller is not "from", it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to "delete _tokenApprovals[tokenId]". sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as "tokenId" would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: "balance -= 1". ++_packedAddressData[to]; // Updates: "balance += 1". // Updates: // - "address" to the next owner. // - "startTimestamp" to the timestamp of transfering. // - "burned" to "false". // - "nextInitialized" to "true". _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. "nextInitialized == false") . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for "ownerOf(tokenId + 1)". _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to "safeTransferFrom(from, to, tokenId, '')". */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers "tokenId" token from "from" to "to". * * Requirements: * * - "from" cannot be the zero address. * - "to" cannot be the zero address. * - "tokenId" token must exist and be owned by "from". * - If the caller is not "from", it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If "to" refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * "startTokenId" - the first token ID to be transferred. * "quantity" - the amount to be transferred. * * Calling conditions: * * - When "from" and "to" are both non-zero, "from"'s "tokenId" will be * transferred to "to". * - When "from" is zero, "tokenId" will be minted for "to". * - When "to" is zero, "tokenId" will be burned by "from". * - "from" and "to" are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * "startTokenId" - the first token ID to be transferred. * "quantity" - the amount to be transferred. * * Calling conditions: * * - When "from" and "to" are both non-zero, "from"'s "tokenId" has been * transferred to "to". * - When "from" is zero, "tokenId" has been minted for "to". * - When "to" is zero, "tokenId" has been burned by "from". * - "from" and "to" are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * "from" - Previous owner of the given token ID. * "to" - Target address that will receive the token. * "tokenId" - Token ID to be transferred. * "_data" - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints "quantity" tokens and transfers them to "to". * * Requirements: * * - "to" cannot be the zero address. * - "quantity" must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // "balance" and "numberMinted" have a maximum limit of 2**64. // "tokenId" has a maximum limit of 2**256. unchecked { // Updates: // - "balance += quantity". // - "numberMinted += quantity". // // We can directly add to the "balance" and "numberMinted". _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - "address" to the owner. // - "startTimestamp" to the timestamp of minting. // - "burned" to "false". // - "nextInitialized" to "quantity == 1". _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the "Transfer" event for gas savings. // The duplicated "log4" removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask "to" to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the "Transfer" event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // "address(0)". toMasked, // "to". startTokenId // "tokenId". ) // The "iszero(eq(,))" check ensures that large values of "quantity" // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the "iszero" away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the "Transfer" event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints "quantity" tokens and transfers them to "to". * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - "to" cannot be the zero address. * - "quantity" must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for "quantity" to be below the limit. unchecked { // Updates: // - "balance += quantity". // - "numberMinted += quantity". // // We can directly add to the "balance" and "numberMinted". _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - "address" to the owner. // - "startTimestamp" to the timestamp of minting. // - "burned" to "false". // - "nextInitialized" to "quantity == 1". _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints "quantity" tokens and transfers them to "to". * * Requirements: * * - If "to" refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - "quantity" must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to "_safeMint(to, quantity, '')". */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to "_burn(tokenId, false)". */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys "tokenId". * The approval is cleared when the token is burned. * * Requirements: * * - "tokenId" must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to "delete _tokenApprovals[tokenId]". sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as "tokenId" would have to be 2**256. unchecked { // Updates: // - "balance -= 1". // - "numberBurned += 1". // // We can directly decrement the balance, and increment the number burned. // This is equivalent to "packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;". _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - "address" to the last owner. // - "startTimestamp" to the timestamp of burning. // - "burned" to "true". // - "nextInitialized" to "true". _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. "nextInitialized == false") . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for "ownerOf(tokenId + 1)". _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data "index". */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast "extraData" with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit "extraData" field. * Intended to be overridden by the cosumer contract. * * "previousExtraData" - the value of "extraData" before transfer. * * Calling conditions: * * - When "from" and "to" are both non-zero, "from"'s "tokenId" will be * transferred to "to". * - When "from" is zero, "tokenId" will be minted for "to". * - When "to" is zero, "tokenId" will be burned by "from". * - "from" and "to" are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to "msg.sender"). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the "str" to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing "temp" until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: MasterV2.sol pragma solidity ^0.8.24; // Define custom errors at the contract level error MintInactive(); error Unauthorized(address caller); error InvalidOperation(string reason); error ExceedsMaxSupply(uint256 requested, uint256 available); error InsufficientEther(uint256 required, uint256 provided); error ExceedsMaxPerWallet(uint256 requested, uint256 allowed); error ExceedsMaxMintGroupSupply(uint256 requested, uint256 available); // Remove when allowlist is off error PresaleInactive(uint256 mintId); // Remove when allowlist is off error NotInPresale(address caller, uint256 mintId); // Remove when allowlist is off error MintGroupDoesNotExist(uint256 mintId); // Remove when allowlist is off error ArrayLengthMismatch(); // Remove when allowlist is off contract Smilee_Beras is ERC721A, Ownable , ERC2981 { event BatchMetadataUpdate( uint256 indexed fromTokenId, uint256 indexed toTokenId ); event TokensMinted( address indexed recipient, uint256 amount, uint256 mintId , address affiliate ); event TokensDelegateMinted( address indexed vault, address indexed hotWallet, uint256 amount, uint256 mintId , address affiliate ); event SalePriceChanged(uint256 indexed mintId, uint256 newPrice); //Base variables mapping(address => uint256) private pendingBalances; uint256 public maxSupply; uint256 public threeDollarsEth; bool public mintLive = false; string public baseURI; address public feeAddress; address public ownerPayoutAddress; //Affiliates variables uint256 public affiliatePercentage; //Map pairings. mapping(uint256 => uint256) public maxMintPerWallet; mapping(uint256 => uint256) public mintPrice; mapping(uint256 => uint256) public maxSupplyPerMintGroup; mapping(uint256 => uint256) public mintGroupMints; mapping(uint256 => mapping(address => bool)) public presale; mapping(uint256 => bool) public presaleActive; uint256 public presaleCount = 0; //Counter to get total whitelists. Remove when allowlist is off uint256[] public activeMintGroups; //Array to get all active mint groups. Remove when allowlist is off constructor( //Base variables string memory name, string memory symbol, address _ownerPayoutAddress, string memory _initialBaseURI, uint256 _maxSupply, uint256 _threeDollarsEth, //Allowlist variables uint256[] memory _maxMintPerWallet, // Turn into uint256 if allowlist is off uint256[] memory _maxSupplyPerMintGroup, // Remove if allowlist is off uint256[] memory _mintPrice // Turn into uint256 if allowlist is off //Royalties variables ,uint96 _royaltyPercentage // Remove if royalties is off ) ERC721A(name, symbol) Ownable(msg.sender) { //Error handler to check if map pairs each other. Remove if allowlist is off if ( _maxMintPerWallet.length != _maxSupplyPerMintGroup.length && _maxMintPerWallet.length != _mintPrice.length ) { revert ArrayLengthMismatch(); } //Remove if allowlist is off uint256 totalMaxSupplyPerMintGroup = 0; for (uint256 i = 0; i < _maxSupplyPerMintGroup.length; i++) { totalMaxSupplyPerMintGroup += _maxSupplyPerMintGroup[i]; maxSupplyPerMintGroup[i] = _maxSupplyPerMintGroup[i]; maxMintPerWallet[i] = _maxMintPerWallet[i]; mintPrice[i] = _mintPrice[i]; mintGroupMints[i] = 0; activeMintGroups.push(i); } //Checker if max supply per mint group exceeds total max supply. Remove if allowlist is off if (totalMaxSupplyPerMintGroup > _maxSupply) { revert InvalidOperation({ reason: "Max supply per mint group exceeds total max supply" }); } //Base variables maxSupply = _maxSupply; threeDollarsEth = _threeDollarsEth; baseURI = _initialBaseURI; ownerPayoutAddress = _ownerPayoutAddress; feeAddress = 0x428Deb81A93BeD820068724eb1fCc7503d71e417; // Setting up royalties and affiliate percentage _setDefaultRoyalty(_ownerPayoutAddress, _royaltyPercentage); affiliatePercentage = 0; // Adjusting this calculation as needed } //===================================START Allowlist Functions===================================// // Initializer for new mint groups for all maps function initializeNewMintGroup(uint256 mintId) internal { mintPrice[mintId] = 0; maxMintPerWallet[mintId] = 0; maxSupplyPerMintGroup[mintId] = 0; mintGroupMints[mintId] = 0; activeMintGroups.push(mintId); } function isMintGroupActive(uint256 mintId) private view returns (bool) { for (uint256 i = 0; i < activeMintGroups.length; i++) { if (activeMintGroups[i] == mintId) { return true; } } return false; } // Changes the max mint per mint group. Only the contract owner can call this function. Remove this function if allowlist is off function setNewMaxPerMintGroup(uint256 mintId, uint256 newMax) public onlyOwner { //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups if (!isMintGroupActive(mintId)) { initializeNewMintGroup(mintId); } // Checker if new max exceeds total supply uint256 totalMaxMintPerMG = 0; for (uint256 i = 0; i < activeMintGroups.length; i++) { if (activeMintGroups[i] == mintId) { totalMaxMintPerMG += newMax; // Use the new max for the specified mintId } else { totalMaxMintPerMG += maxSupplyPerMintGroup[activeMintGroups[i]]; } } if (totalMaxMintPerMG > maxSupply) { revert InvalidOperation({ reason: "New supply per mint group exceeds total supply." }); } maxSupplyPerMintGroup[mintId] = newMax; } // Add to presale function addTopresale(address[] memory newPresale, uint256 mintId) external onlyOwner { //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups if (!isMintGroupActive(mintId)) { initializeNewMintGroup(mintId); } for (uint256 i = 0; i < newPresale.length; i++) { presale[mintId][newPresale[i]] = true; presaleCount = presaleCount + 1; } } // Remove from presale function removeFrompresale(address[] memory removePresale, uint256 mintId) external onlyOwner { //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups if (!isMintGroupActive(mintId)) { initializeNewMintGroup(mintId); } for (uint256 i = 0; i < removePresale.length; i++) { presale[mintId][removePresale[i]] = false; if (presaleCount > 0) { presaleCount = presaleCount - 1; } } } // Control the presale status function stopOrStartpresaleMint(bool presaleStatus, uint256 mintId) public onlyOwner { //Checks if mintId already exists inside activeMintGroups. if (!isMintGroupActive(mintId)) { revert MintGroupDoesNotExist({mintId: mintId}); } presaleActive[mintId] = presaleStatus; } //===================================END Allowlist Functions===================================// // Sets the maximum number of tokens that can be minted in a batch. Only the contract owner can call this function. function setMaxMintPerWallet( uint256 newMaxMintPerWallet, uint256 mintGroupId ) public onlyOwner { maxMintPerWallet[mintGroupId] = newMaxMintPerWallet; } // Changes the price to mint a token. Only the contract owner can call this function. function changeSalePrice(uint256 newMintPrice, uint256 mintId) public onlyOwner { //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups if (!isMintGroupActive(mintId)) { initializeNewMintGroup(mintId); } mintPrice[mintId] = newMintPrice; emit SalePriceChanged(mintId, newMintPrice); } //===================================START Airdrop Functions===================================// // Modified airdrop function to charge the owner threeDollarsEth per mint function airdropNFTs(address[] memory recipients, uint256[] memory amounts) external payable onlyOwner { if (recipients.length != amounts.length) { revert InvalidOperation({ reason: "Mismatch between recipients and amounts" }); } uint256 totalCharge = 0; uint256 totalNFTToMint = 0; for (uint256 i = 0; i < amounts.length; i++) { totalCharge += ((threeDollarsEth * 11) / 100) * amounts[i]; // Calculate total charge for the airdrop totalNFTToMint += amounts[i]; // Calculate total NFTs to mint } if (msg.value < totalCharge) { revert InvalidOperation({ reason: "Not enough Ether sent for the airdrop charge" }); } if (totalSupply() + totalNFTToMint > maxSupply) { revert InvalidOperation({reason: "Airdrop exceeds max supply"}); } pendingBalances[feeAddress] += totalCharge; // Fee goes to the fee address for (uint256 j = 0; j < recipients.length; j++) { _safeMint(recipients[j], amounts[j]); // Mint NFTs to recipients } // Refund excess Ether, if any uint256 excess = msg.value - totalCharge; if (excess > 0) { payable(msg.sender).transfer(excess); } } //===================================END Airdrop Functions===================================// //===================================START Affiliate Functions===================================// // Changes the affiliate percentage. Only the contract owner can call this function. Note: 1000% = 10% function setAffiliatePercentage(uint256 _percentageOfMint) public onlyOwner { affiliatePercentage = _percentageOfMint; } // Allows the affiliate to withdraw their portion of the mint funds in ETH. function withdrawAffiliateMintFunds() public { uint256 affiliateBalance = pendingBalances[msg.sender]; if (affiliateBalance < 0) { revert InvalidOperation({reason: "No funds to withdraw"}); } // Reset the pending balance for the affiliate to zero pendingBalances[msg.sender] = 0; // Transfer the funds (bool success, ) = payable(msg.sender).call{value: affiliateBalance}( "" ); if (!success) { revert InvalidOperation({reason: "Withdraw Transfer Failed"}); } } //===================================END Affiliate Functions===================================// //===================================START Mint Functions===================================// // Cleaner and more efficient batchMint function function batchMint( uint256 amount, uint256 mintId // Remove if allowlist is off , address affiliate // Remove if affilaites is off ) external payable { // Pre-conditions checks if (!mintLive) { revert MintInactive(); } if (mintLive && !presaleActive[mintId]) { revert PresaleInactive({mintId: mintId}); } if (mintId != 0) { if (presale[mintId][msg.sender] == false) { revert NotInPresale({caller: msg.sender, mintId: mintId}); } if ( mintGroupMints[mintId] + amount > maxSupplyPerMintGroup[mintId] ) { revert ExceedsMaxMintGroupSupply({ requested: amount, available: maxSupplyPerMintGroup[mintId] - mintGroupMints[mintId] }); } } if (amount + _numberMinted(msg.sender) > maxMintPerWallet[mintId]) { revert ExceedsMaxPerWallet({ requested: amount, allowed: maxMintPerWallet[mintId] - _numberMinted(msg.sender) }); } if (totalSupply() + amount > maxSupply) { revert ExceedsMaxSupply({ requested: amount, available: maxSupply - totalSupply() }); } // Adjusted for a 3% fee uint256 totalCost = mintPrice[mintId] * amount; uint256 feeAmount = ((totalCost * 3) / 100) + (threeDollarsEth * amount); // 3% + 3$ fee uint256 totalCostWithFee = totalCost + feeAmount; if (msg.value < totalCostWithFee) { revert InsufficientEther({ required: totalCostWithFee, provided: msg.value }); } // Affiliate handling if (affiliate != address(0) && affiliate != msg.sender) { uint256 affiliateAmount = (totalCost * affiliatePercentage) / 100; pendingBalances[affiliate] += affiliateAmount; totalCost -= affiliateAmount; // Adjust total cost after affiliate share } // Update balances pendingBalances[ownerPayoutAddress] += totalCost; // To owner pendingBalances[feeAddress] += feeAmount; // Fee portion // Finalize minting mintGroupMints[mintId] += amount; _safeMint(msg.sender, amount); emit TokensMinted(msg.sender, amount, mintId, affiliate); // Refund excess Ether, if any uint256 excess = msg.value - totalCostWithFee; if (excess > 0) { payable(msg.sender).transfer(excess); } } //==================START Delegate Functions==================// address constant DELEGATE_REGISTRY = 0x00000000000000447e69651d841bD8D104Bed493; mapping(address => uint256) private delegatedContractMints; function delegatedMint( uint256 amount, uint256 mintId , address affiliate , address vault ) external payable { if ( !IDelegateRegistry(DELEGATE_REGISTRY).checkDelegateForContract( msg.sender, vault, address(this), "" ) ) { revert Unauthorized(vault); } // Pre-conditions checks if (!mintLive) { revert MintInactive(); } if (mintLive && !presaleActive[mintId]) { revert PresaleInactive({mintId: mintId}); } if (mintId != 0) { if (presale[mintId][vault] == false) { revert NotInPresale({caller: vault, mintId: mintId}); } if ( mintGroupMints[mintId] + amount > maxSupplyPerMintGroup[mintId] ) { revert ExceedsMaxMintGroupSupply({ requested: amount, available: maxSupplyPerMintGroup[mintId] - mintGroupMints[mintId] }); } } // Checker for connected wallet if (amount + _numberMinted(msg.sender) > maxMintPerWallet[mintId]) { revert ExceedsMaxPerWallet({ requested: amount, allowed: maxMintPerWallet[mintId] - _numberMinted(msg.sender) }); } // Checker for vault wallet if (amount + delegatedContractMints[vault] > maxMintPerWallet[mintId]) { revert ExceedsMaxPerWallet({ requested: amount, allowed: maxMintPerWallet[mintId] - delegatedContractMints[vault] }); } if (totalSupply() + amount > maxSupply) { revert ExceedsMaxSupply({ requested: amount, available: maxSupply - totalSupply() }); } // Adjusted for a 3% fee uint256 totalCost = mintPrice[mintId] * amount; uint256 feeAmount = ((totalCost * 3) / 100) + (threeDollarsEth * amount); // 3% + 3$ fee uint256 totalCostWithFee = totalCost + feeAmount; if (msg.value < totalCostWithFee) { revert InsufficientEther({ required: totalCostWithFee, provided: msg.value }); } // Affiliate handling if (affiliate != address(0) && affiliate != msg.sender && affiliate != vault) { uint256 affiliateAmount = (totalCost * affiliatePercentage) / 100; pendingBalances[affiliate] += affiliateAmount; totalCost -= affiliateAmount; // Adjust total cost after affiliate share } // Update balances pendingBalances[ownerPayoutAddress] += totalCost; // To owner pendingBalances[feeAddress] += feeAmount; // Fee portion // Finalize minting mintGroupMints[mintId] += amount; delegatedContractMints[vault] += amount; _safeMint(msg.sender, amount); emit TokensDelegateMinted(vault, msg.sender, amount, mintId, affiliate); // Refund excess Ether, if any uint256 excess = msg.value - totalCostWithFee; if (excess > 0) { payable(msg.sender).transfer(excess); } } //==================END Delegate Functions==================// //===================================END Mint Functions===================================// //===================================START Base Functions===================================// // Changes the minting status. Only the contract owner can call this function. function changeMintStatus(bool status) public onlyOwner { if (mintLive == status) { revert InvalidOperation({ reason: "Mint status is already the one you entered" }); } mintLive = status; } // Sets the base URI for the token metadata. Only the contract owner can call this function. function setBaseURI(string memory newBaseURI) public onlyOwner { baseURI = newBaseURI; emit BatchMetadataUpdate(1, type(uint256).max); // Signal that all token metadata has been updated } // Allows the contract owner to withdraw the funds that have been paid into the contract. function withdrawMintFunds() public onlyOwner { if (pendingBalances[ownerPayoutAddress] <= 0) { revert InvalidOperation({reason: "There is nothing to withdraw"}); } uint256 ownerPayout = pendingBalances[ownerPayoutAddress]; uint256 fee = pendingBalances[feeAddress]; pendingBalances[ownerPayoutAddress] = 0; pendingBalances[feeAddress] = 0; (bool success1, ) = payable(ownerPayoutAddress).call{ value: ownerPayout }(""); (bool success2, ) = payable(feeAddress).call{value: fee}(""); if (!success1 && !success2) { revert InvalidOperation({reason: "Withdraw Transfer Failed"}); } } // Allows the fee address to withdraw their portion of the funds. function withdrawFeeFunds() public { if (msg.sender != feeAddress) { revert Unauthorized({caller: msg.sender}); } if (pendingBalances[feeAddress] <= 0) { revert InvalidOperation({reason: "There is nothing to withdraw"}); } uint256 fee = pendingBalances[feeAddress]; pendingBalances[feeAddress] = 0; (bool success, ) = payable(feeAddress).call{value: fee}(""); if (!success) { revert InvalidOperation({reason: "Withdraw Transfer Failed"}); } } // Returns the base URI for the token metadata. function _baseURI() internal view override returns (string memory) { return baseURI; } // Checks the balance pending withdrawal for the sender. function checkPendingBalance() public view returns (uint256) { return pendingBalances[msg.sender]; } // Overrides the start token ID function from the ERC721A contract. function _startTokenId() internal view virtual override returns (uint256) { return 1; } // Overrides the supports interface function to add support for the ERC721A interface. function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } //===================================END Base Functions===================================// }
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":"address","name":"_ownerPayoutAddress","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_threeDollarsEth","type":"uint256"},{"internalType":"uint256[]","name":"_maxMintPerWallet","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxSupplyPerMintGroup","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintPrice","type":"uint256[]"},{"internalType":"uint96","name":"_royaltyPercentage","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"ExceedsMaxMintGroupSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"ExceedsMaxPerWallet","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"ExceedsMaxSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"InsufficientEther","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"InvalidOperation","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"MintGroupDoesNotExist","type":"error"},{"inputs":[],"name":"MintInactive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"NotInPresale","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"PresaleInactive","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"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"Unauthorized","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":true,"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","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":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SalePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"hotWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"address","name":"affiliate","type":"address"}],"name":"TokensDelegateMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"address","name":"affiliate","type":"address"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeMintGroups","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newPresale","type":"address[]"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"addTopresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"affiliatePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"changeSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPendingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"name":"delegatedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyPerMintGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintGroupMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerPayoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"removePresale","type":"address[]"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"removeFrompresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentageOfMint","type":"uint256"}],"name":"setAffiliatePercentage","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintPerWallet","type":"uint256"},{"internalType":"uint256","name":"mintGroupId","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setNewMaxPerMintGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleStatus","type":"bool"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"stopOrStartpresaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeDollarsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAffiliateMintFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMintFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040525f600e5f6101000a81548160ff0219169083151502179055505f6019553480156200002d575f80fd5b50604051620066863803806200668683398181016040528101906200005391906200095d565b338a8a816002908162000067919062000d35565b50806003908162000079919062000d35565b506200008a620003a560201b60201c565b5f8190555050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000104575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000fb919062000e2a565b60405180910390fd5b6200011581620003ad60201b60201c565b5082518451141580156200012b57508151845114155b1562000163576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8451811015620002805784818151811062000186576200018562000e45565b5b6020026020010151826200019b919062000e9f565b9150848181518110620001b357620001b262000e45565b5b602002602001015160155f8381526020019081526020015f2081905550858181518110620001e657620001e562000e45565b5b602002602001015160135f8381526020019081526020015f208190555083818151811062000219576200021862000e45565b5b602002602001015160145f8381526020019081526020015f20819055505f60165f8381526020019081526020015f2081905550601a81908060018154018082558091505060019003905f5260205f20015f9091909190915055808060010191505062000166565b5086811115620002c7576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401620002be9062000f5d565b60405180910390fd5b86600c8190555085600d8190555087600f9081620002e6919062000d35565b508860115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073428deb81a93bed820068724eb1fcc7503d71e41760105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200038d89836200047060201b60201c565b5f601281905550505050505050505050505062000ff1565b5f6001905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f620004816200061960201b60201c565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff161115620004e95781816040517f6f483d09000000000000000000000000000000000000000000000000000000008152600401620004e092919062000fc6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200055c575f6040517fb6d9900a00000000000000000000000000000000000000000000000000000000815260040162000553919062000e2a565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060095f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b5f612710905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000683826200063b565b810181811067ffffffffffffffff82111715620006a557620006a46200064b565b5b80604052505050565b5f620006b962000622565b9050620006c7828262000678565b919050565b5f67ffffffffffffffff821115620006e957620006e86200064b565b5b620006f4826200063b565b9050602081019050919050565b5f5b838110156200072057808201518184015260208101905062000703565b5f8484015250505050565b5f620007416200073b84620006cc565b620006ae565b90508281526020810184848401111562000760576200075f62000637565b5b6200076d84828562000701565b509392505050565b5f82601f8301126200078c576200078b62000633565b5b81516200079e8482602086016200072b565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d282620007a7565b9050919050565b620007e481620007c6565b8114620007ef575f80fd5b50565b5f815190506200080281620007d9565b92915050565b5f819050919050565b6200081c8162000808565b811462000827575f80fd5b50565b5f815190506200083a8162000811565b92915050565b5f67ffffffffffffffff8211156200085d576200085c6200064b565b5b602082029050602081019050919050565b5f80fd5b5f62000888620008828462000840565b620006ae565b90508083825260208201905060208402830185811115620008ae57620008ad6200086e565b5b835b81811015620008db5780620008c688826200082a565b845260208401935050602081019050620008b0565b5050509392505050565b5f82601f830112620008fc57620008fb62000633565b5b81516200090e84826020860162000872565b91505092915050565b5f6bffffffffffffffffffffffff82169050919050565b620009398162000917565b811462000944575f80fd5b50565b5f8151905062000957816200092e565b92915050565b5f805f805f805f805f806101408b8d0312156200097f576200097e6200062b565b5b5f8b015167ffffffffffffffff8111156200099f576200099e6200062f565b5b620009ad8d828e0162000775565b9a505060208b015167ffffffffffffffff811115620009d157620009d06200062f565b5b620009df8d828e0162000775565b9950506040620009f28d828e01620007f2565b98505060608b015167ffffffffffffffff81111562000a165762000a156200062f565b5b62000a248d828e0162000775565b975050608062000a378d828e016200082a565b96505060a062000a4a8d828e016200082a565b95505060c08b015167ffffffffffffffff81111562000a6e5762000a6d6200062f565b5b62000a7c8d828e01620008e5565b94505060e08b015167ffffffffffffffff81111562000aa05762000a9f6200062f565b5b62000aae8d828e01620008e5565b9350506101008b015167ffffffffffffffff81111562000ad35762000ad26200062f565b5b62000ae18d828e01620008e5565b92505061012062000af58d828e0162000947565b9150509295989b9194979a5092959850565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000b5657607f821691505b60208210810362000b6c5762000b6b62000b11565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000bd07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b93565b62000bdc868362000b93565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000c1d62000c1762000c118462000808565b62000bf4565b62000808565b9050919050565b5f819050919050565b62000c388362000bfd565b62000c5062000c478262000c24565b84845462000b9f565b825550505050565b5f90565b62000c6662000c58565b62000c7381848462000c2d565b505050565b5b8181101562000c9a5762000c8e5f8262000c5c565b60018101905062000c79565b5050565b601f82111562000ce95762000cb38162000b72565b62000cbe8462000b84565b8101602085101562000cce578190505b62000ce662000cdd8562000b84565b83018262000c78565b50505b505050565b5f82821c905092915050565b5f62000d0b5f198460080262000cee565b1980831691505092915050565b5f62000d25838362000cfa565b9150826002028217905092915050565b62000d408262000b07565b67ffffffffffffffff81111562000d5c5762000d5b6200064b565b5b62000d68825462000b3e565b62000d7582828562000c9e565b5f60209050601f83116001811462000dab575f841562000d96578287015190505b62000da2858262000d18565b86555062000e11565b601f19841662000dbb8662000b72565b5f5b8281101562000de45784890151825560018201915060208501945060208101905062000dbd565b8683101562000e04578489015162000e00601f89168262000cfa565b8355505b6001600288020188555050505b505050505050565b62000e2481620007c6565b82525050565b5f60208201905062000e3f5f83018462000e19565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000eab8262000808565b915062000eb88362000808565b925082820190508082111562000ed35762000ed262000e72565b5b92915050565b5f82825260208201905092915050565b7f4d617820737570706c7920706572206d696e742067726f7570206578636565645f8201527f7320746f74616c206d617820737570706c790000000000000000000000000000602082015250565b5f62000f4560328362000ed9565b915062000f528262000ee9565b604082019050919050565b5f6020820190508181035f83015262000f768162000f37565b9050919050565b5f62000f9d62000f9762000f918462000917565b62000bf4565b62000808565b9050919050565b62000faf8162000f7d565b82525050565b62000fc08162000808565b82525050565b5f60408201905062000fdb5f83018562000fa4565b62000fea602083018462000fb5565b9392505050565b6156878062000fff5f395ff3fe6080604052600436106102ad575f3560e01c80638da5cb5b11610174578063c82e474b116100db578063e5fd114511610094578063e985e9c51161006e578063e985e9c514610a3a578063f2fde38b14610a76578063fac5dbc614610a9e578063fea414b614610ac6576102ad565b8063e5fd114514610998578063e6a72acf146109d4578063e8656fcc14610a10576102ad565b8063c82e474b1461089a578063c87b56dd146108c2578063cde27a35146108fe578063ce55c66a14610928578063d5abeb0114610952578063e213b5f61461097c576102ad565b8063a75c3ad91161012d578063a75c3ad9146107d8578063a8ddf8f6146107ee578063ae4e494214610816578063b3978a8614610840578063b88d4fde14610868578063c20f388f14610884576102ad565b80638da5cb5b14610700578063905d7b331461072a57806391a575441461074057806395d89b411461076a578063a22cb46514610794578063a2835b55146107bc576102ad565b80633ef009ef116102185780636352211e116101d15780636352211e146105e45780636c0360eb1461062057806370a082311461064a578063715018a6146106865780637bd4f0711461069c5780637c2003e3146106c4576102ad565b80633ef009ef146104e257806341275358146104fe57806342842e0e14610528578063483f0a82146105445780634a5bd2fd1461058057806355f804b3146105bc576102ad565b806318160ddd1161026a57806318160ddd146103d357806320704c5a146103fd57806321af27f61461042557806323b872dd1461044d57806324a663c3146104695780632a55205a146104a5576102ad565b806301ffc9a7146102b157806306fdde03146102ed578063081812fc14610317578063095ea7b31461035357806311f7acb91461036f57806316da3bc614610397575b5f80fd5b3480156102bc575f80fd5b506102d760048036038101906102d291906141e3565b610af0565b6040516102e49190614228565b60405180910390f35b3480156102f8575f80fd5b50610301610b01565b60405161030e91906142cb565b60405180910390f35b348015610322575f80fd5b5061033d6004803603810190610338919061431e565b610b91565b60405161034a9190614388565b60405180910390f35b61036d600480360381019061036891906143cb565b610c0b565b005b34801561037a575f80fd5b5061039560048036038101906103909190614409565b610d4a565b005b3480156103a2575f80fd5b506103bd60048036038101906103b8919061431e565b610e59565b6040516103ca9190614456565b60405180910390f35b3480156103de575f80fd5b506103e7610e6e565b6040516103f49190614456565b60405180910390f35b348015610408575f80fd5b50610423600480360381019061041e91906145af565b610e83565b005b348015610430575f80fd5b5061044b600480360381019061044691906145af565b610f52565b005b61046760048036038101906104629190614609565b61102b565b005b348015610474575f80fd5b5061048f600480360381019061048a919061431e565b611339565b60405161049c9190614456565b60405180910390f35b3480156104b0575f80fd5b506104cb60048036038101906104c69190614409565b61134e565b6040516104d9929190614659565b60405180910390f35b6104fc60048036038101906104f79190614680565b61152a565b005b348015610509575f80fd5b50610512611b97565b60405161051f9190614388565b60405180910390f35b610542600480360381019061053d9190614609565b611bbc565b005b34801561054f575f80fd5b5061056a6004803603810190610565919061431e565b611bdb565b6040516105779190614456565b60405180910390f35b34801561058b575f80fd5b506105a660048036038101906105a1919061431e565b611bfb565b6040516105b39190614228565b60405180910390f35b3480156105c7575f80fd5b506105e260048036038101906105dd9190614780565b611c18565b005b3480156105ef575f80fd5b5061060a6004803603810190610605919061431e565b611c82565b6040516106179190614388565b60405180910390f35b34801561062b575f80fd5b50610634611c93565b60405161064191906142cb565b60405180910390f35b348015610655575f80fd5b50610670600480360381019061066b91906147c7565b611d1f565b60405161067d9190614456565b60405180910390f35b348015610691575f80fd5b5061069a611dd4565b005b3480156106a7575f80fd5b506106c260048036038101906106bd9190614409565b611de7565b005b3480156106cf575f80fd5b506106ea60048036038101906106e591906147f2565b611e09565b6040516106f79190614228565b60405180910390f35b34801561070b575f80fd5b50610714611e33565b6040516107219190614388565b60405180910390f35b348015610735575f80fd5b5061073e611e5b565b005b34801561074b575f80fd5b506107546121f1565b6040516107619190614456565b60405180910390f35b348015610775575f80fd5b5061077e6121f7565b60405161078b91906142cb565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b5919061485a565b612287565b005b6107d660048036038101906107d19190614898565b61238d565b005b3480156107e3575f80fd5b506107ec612c60565b005b3480156107f9575f80fd5b50610814600480360381019061080f91906148fc565b612f23565b005b348015610821575f80fd5b5061082a612f9b565b6040516108379190614388565b60405180910390f35b34801561084b575f80fd5b5061086660048036038101906108619190614927565b612fc0565b005b610882600480360381019061087d9190614a03565b61303e565b005b34801561088f575f80fd5b506108986130b0565b005b3480156108a5575f80fd5b506108c060048036038101906108bb9190614409565b613222565b005b3480156108cd575f80fd5b506108e860048036038101906108e3919061431e565b613293565b6040516108f591906142cb565b60405180910390f35b348015610909575f80fd5b5061091261332e565b60405161091f9190614456565b60405180910390f35b348015610933575f80fd5b5061093c613334565b6040516109499190614456565b60405180910390f35b34801561095d575f80fd5b5061096661333a565b6040516109739190614456565b60405180910390f35b61099660048036038101906109919190614b43565b613340565b005b3480156109a3575f80fd5b506109be60048036038101906109b9919061431e565b6135e4565b6040516109cb9190614456565b60405180910390f35b3480156109df575f80fd5b506109fa60048036038101906109f5919061431e565b6135f9565b604051610a079190614456565b60405180910390f35b348015610a1b575f80fd5b50610a2461360e565b604051610a319190614228565b60405180910390f35b348015610a45575f80fd5b50610a606004803603810190610a5b9190614bb9565b613620565b604051610a6d9190614228565b60405180910390f35b348015610a81575f80fd5b50610a9c6004803603810190610a9791906147c7565b6136ae565b005b348015610aa9575f80fd5b50610ac46004803603810190610abf919061431e565b613732565b005b348015610ad1575f80fd5b50610ada613744565b604051610ae79190614456565b60405180910390f35b5f610afa82613788565b9050919050565b606060028054610b1090614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3c90614c24565b8015610b875780601f10610b5e57610100808354040283529160200191610b87565b820191905f5260205f20905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b5f610b9b82613801565b610bd1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610c1582611c82565b90508073ffffffffffffffffffffffffffffffffffffffff16610c3661385b565b73ffffffffffffffffffffffffffffffffffffffff1614610c9957610c6281610c5d61385b565b613620565b610c98576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d52613862565b610d5b826138e9565b610d6957610d6882613940565b5b5f805b601a80549050811015610df85783601a8281548110610d8e57610d8d614c54565b5b905f5260205f20015403610daf578282610da89190614cae565b9150610deb565b60155f601a8381548110610dc657610dc5614c54565b5b905f5260205f20015481526020019081526020015f205482610de89190614cae565b91505b8080600101915050610d6c565b50600c54811115610e3e576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401610e3590614d51565b60405180910390fd5b8160155f8581526020019081526020015f2081905550505050565b6013602052805f5260405f205f915090505481565b5f610e776139c1565b6001545f540303905090565b610e8b613862565b610e94816138e9565b610ea257610ea181613940565b5b5f5b8251811015610f4d57600160175f8481526020019081526020015f205f858481518110610ed457610ed3614c54565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601954610f3a9190614cae565b6019819055508080600101915050610ea4565b505050565b610f5a613862565b610f63816138e9565b610f7157610f7081613940565b5b5f5b8251811015611026575f60175f8481526020019081526020015f205f858481518110610fa257610fa1614c54565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60195411156110195760016019546110129190614d6f565b6019819055505b8080600101915050610f73565b505050565b5f611035826139c9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461109c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806110a784613a8c565b915091506110bd81876110b861385b565b613aaf565b611109576110d2866110cd61385b565b613620565b611108576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361116e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117b8686866001613af2565b8015611185575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061124d85611229888887613af8565b7c020000000000000000000000000000000000000000000000000000000017613b1f565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036112c9575f6001850190505f60045f8381526020019081526020015f2054036112c7575f5481146112c6578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113318686866001613b49565b505050505050565b6015602052805f5260405f205f915090505481565b5f805f600a5f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036114d75760096040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6114e0613b4f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661150c9190614da2565b6115169190614e10565b9050815f0151819350935050509250929050565b600e5f9054906101000a900460ff1661156f576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f9054906101000a900460ff1680156115a5575060185f8381526020019081526020015f205f9054906101000a900460ff16155b156115e757816040517f1435260a0000000000000000000000000000000000000000000000000000000081526004016115de9190614456565b60405180910390fd5b5f8214611732575f151560175f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036116905733826040517f10cdd37c000000000000000000000000000000000000000000000000000000008152600401611687929190614659565b60405180910390fd5b60155f8381526020019081526020015f20548360165f8581526020019081526020015f20546116bf9190614cae565b1115611731578260165f8481526020019081526020015f205460155f8581526020019081526020015f20546116f49190614d6f565b6040517fcc3f2f1b000000000000000000000000000000000000000000000000000000008152600401611728929190614e40565b60405180910390fd5b5b60135f8381526020019081526020015f205461174d33613b58565b846117589190614cae565b11156117c1578261176833613b58565b60135f8581526020019081526020015f20546117849190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016117b8929190614e40565b60405180910390fd5b600c54836117cd610e6e565b6117d79190614cae565b111561183057826117e6610e6e565b600c546117f39190614d6f565b6040517fadc3cee5000000000000000000000000000000000000000000000000000000008152600401611827929190614e40565b60405180910390fd5b5f8360145f8581526020019081526020015f205461184e9190614da2565b90505f84600d5461185f9190614da2565b606460038461186e9190614da2565b6118789190614e10565b6118829190614cae565b90505f81836118919190614cae565b9050803410156118da5780346040517fc10842230000000000000000000000000000000000000000000000000000000081526004016118d1929190614e40565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561194257503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156119c7575f6064601254856119589190614da2565b6119629190614e10565b905080600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546119b09190614cae565b9250508190555080846119c39190614d6f565b9350505b82600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611a349190614cae565b9250508190555081600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611aa89190614cae565b925050819055508560165f8781526020019081526020015f205f828254611acf9190614cae565b92505081905550611ae03387613bac565b3373ffffffffffffffffffffffffffffffffffffffff167f264808566929c0a2c98376a25f69f0faa85b1ce885be5fc7eee7cd639f9c0c26878787604051611b2a93929190614e67565b60405180910390a25f8134611b3f9190614d6f565b90505f811115611b8e573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611b8c573d5f803e3d5ffd5b505b50505050505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bd683838360405180602001604052805f81525061303e565b505050565b601a8181548110611bea575f80fd5b905f5260205f20015f915090505481565b6018602052805f5260405f205f915054906101000a900460ff1681565b611c20613862565b80600f9081611c2f9190615039565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60017f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c60405160405180910390a350565b5f611c8c826139c9565b9050919050565b600f8054611ca090614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054611ccc90614c24565b8015611d175780601f10611cee57610100808354040283529160200191611d17565b820191905f5260205f20905b815481529060010190602001808311611cfa57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d85576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611ddc613862565b611de55f613bc9565b565b611def613862565b8160135f8381526020019081526020015f20819055505050565b6017602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e63613862565b5f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411611f03576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401611efa90615152565b60405180910390fd5b5f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516120d39061519d565b5f6040518083038185875af1925050503d805f811461210d576040519150601f19603f3d011682016040523d82523d5f602084013e612112565b606091505b505090505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161215c9061519d565b5f6040518083038185875af1925050503d805f8114612196576040519150601f19603f3d011682016040523d82523d5f602084013e61219b565b606091505b50509050811580156121ab575080155b156121eb576040517fe066a8d70000000000000000000000000000000000000000000000000000000081526004016121e2906151fb565b60405180910390fd5b50505050565b60125481565b60606003805461220690614c24565b80601f016020809104026020016040519081016040528092919081815260200182805461223290614c24565b801561227d5780601f106122545761010080835404028352916020019161227d565b820191905f5260205f20905b81548152906001019060200180831161226057829003601f168201915b5050505050905090565b8060075f61229361385b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661233c61385b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123819190614228565b60405180910390a35050565b6c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff16638988eea93383306040518463ffffffff1660e01b81526004016123d79392919061521f565b602060405180830381865afa1580156123f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124169190615274565b61245757806040517f8e4a23d600000000000000000000000000000000000000000000000000000000815260040161244e9190614388565b60405180910390fd5b600e5f9054906101000a900460ff1661249c576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f9054906101000a900460ff1680156124d2575060185f8481526020019081526020015f205f9054906101000a900460ff16155b1561251457826040517f1435260a00000000000000000000000000000000000000000000000000000000815260040161250b9190614456565b60405180910390fd5b5f831461265f575f151560175f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036125bd5780836040517f10cdd37c0000000000000000000000000000000000000000000000000000000081526004016125b4929190614659565b60405180910390fd5b60155f8481526020019081526020015f20548460165f8681526020019081526020015f20546125ec9190614cae565b111561265e578360165f8581526020019081526020015f205460155f8681526020019081526020015f20546126219190614d6f565b6040517fcc3f2f1b000000000000000000000000000000000000000000000000000000008152600401612655929190614e40565b60405180910390fd5b5b60135f8481526020019081526020015f205461267a33613b58565b856126859190614cae565b11156126ee578361269533613b58565b60135f8681526020019081526020015f20546126b19190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016126e5929190614e40565b60405180910390fd5b60135f8481526020019081526020015f2054601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054856127499190614cae565b11156127e75783601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460135f8681526020019081526020015f20546127aa9190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016127de929190614e40565b60405180910390fd5b600c54846127f3610e6e565b6127fd9190614cae565b1115612856578361280c610e6e565b600c546128199190614d6f565b6040517fadc3cee500000000000000000000000000000000000000000000000000000000815260040161284d929190614e40565b60405180910390fd5b5f8460145f8681526020019081526020015f20546128749190614da2565b90505f85600d546128859190614da2565b60646003846128949190614da2565b61289e9190614e10565b6128a89190614cae565b90505f81836128b79190614cae565b9050803410156129005780346040517fc10842230000000000000000000000000000000000000000000000000000000081526004016128f7929190614e40565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561296857503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156129a057508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612a25575f6064601254856129b69190614da2565b6129c09190614e10565b905080600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612a0e9190614cae565b925050819055508084612a219190614d6f565b9350505b82600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612a929190614cae565b9250508190555081600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b069190614cae565b925050819055508660165f8881526020019081526020015f205f828254612b2d9190614cae565b9250508190555086601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b809190614cae565b92505081905550612b913388613bac565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f25b00d670ba83c43c9eff98f6123750afecfdefc10f98add0927ca70ebb24ad1898989604051612bf293929190614e67565b60405180910390a35f8134612c079190614d6f565b90505f811115612c56573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612c54573d5f803e3d5ffd5b505b5050505050505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cf157336040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152600401612ce89190614388565b60405180910390fd5b5f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411612d91576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612d8890615152565b60405180910390fd5b5f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612e9c9061519d565b5f6040518083038185875af1925050503d805f8114612ed6576040519150601f19603f3d011682016040523d82523d5f602084013e612edb565b606091505b5050905080612f1f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612f16906151fb565b60405180910390fd5b5050565b612f2b613862565b801515600e5f9054906101000a900460ff16151503612f7f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612f769061530f565b60405180910390fd5b80600e5f6101000a81548160ff02191690831515021790555050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612fc8613862565b612fd1816138e9565b61301257806040517f5831017d0000000000000000000000000000000000000000000000000000000081526004016130099190614456565b60405180910390fd5b8160185f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61304984848461102b565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146130aa5761307384848484613c8c565b6130a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f811015613134576040517fe066a8d700000000000000000000000000000000000000000000000000000000815260040161312b90615377565b60405180910390fd5b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161319b9061519d565b5f6040518083038185875af1925050503d805f81146131d5576040519150601f19603f3d011682016040523d82523d5f602084013e6131da565b606091505b505090508061321e576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401613215906151fb565b60405180910390fd5b5050565b61322a613862565b613233816138e9565b6132415761324081613940565b5b8160145f8381526020019081526020015f2081905550807fa7e52343431f792020e7cb8411a08014688ca11782fd5709fa2531b3d74ba457836040516132879190614456565b60405180910390a25050565b606061329e82613801565b6132d4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6132dd613dd7565b90505f8151036132fb5760405180602001604052805f815250613326565b8061330584613e67565b6040516020016133169291906153cf565b6040516020818303038152906040525b915050919050565b60195481565b600d5481565b600c5481565b613348613862565b805182511461338c576040517fe066a8d700000000000000000000000000000000000000000000000000000000815260040161338390615462565b60405180910390fd5b5f805f5b835181101561341b578381815181106133ac576133ab614c54565b5b60200260200101516064600b600d546133c59190614da2565b6133cf9190614e10565b6133d99190614da2565b836133e49190614cae565b92508381815181106133f9576133f8614c54565b5b60200260200101518261340c9190614cae565b91508080600101915050613390565b508134101561345f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401613456906154f0565b60405180910390fd5b600c548161346b610e6e565b6134759190614cae565b11156134b6576040517fe066a8d70000000000000000000000000000000000000000000000000000000081526004016134ad90615558565b60405180910390fd5b81600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135239190614cae565b925050819055505f5b84518110156135805761357385828151811061354b5761354a614c54565b5b602002602001015185838151811061356657613565614c54565b5b6020026020010151613bac565b808060010191505061352c565b505f823461358e9190614d6f565b90505f8111156135dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156135db573d5f803e3d5ffd5b505b5050505050565b6016602052805f5260405f205f915090505481565b6014602052805f5260405f205f915090505481565b600e5f9054906101000a900460ff1681565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6136b6613862565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613726575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161371d9190614388565b60405180910390fd5b61372f81613bc9565b50565b61373a613862565b8060128190555050565b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905090565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137fa57506137f982613eb6565b5b9050919050565b5f8161380b6139c1565b1115801561381957505f5482105b801561385457505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b61386a613f1f565b73ffffffffffffffffffffffffffffffffffffffff16613888611e33565b73ffffffffffffffffffffffffffffffffffffffff16146138e7576138ab613f1f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016138de9190614388565b60405180910390fd5b565b5f805f90505b601a805490508110156139365782601a828154811061391157613910614c54565b5b905f5260205f2001540361392957600191505061393b565b80806001019150506138ef565b505f90505b919050565b5f60145f8381526020019081526020015f20819055505f60135f8381526020019081526020015f20819055505f60155f8381526020019081526020015f20819055505f60165f8381526020019081526020015f2081905550601a81908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f6001905090565b5f80829050806139d76139c1565b11613a55575f54811015613a54575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613a52575b5f8103613a485760045f836001900393508381526020019081526020015f20549050613a21565b8092505050613a87565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613b0e868684613f26565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f612710905090565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b613bc5828260405180602001604052805f815250613f2e565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613cb161385b565b8786866040518563ffffffff1660e01b8152600401613cd394939291906155c8565b6020604051808303815f875af1925050508015613d0e57506040513d601f19601f82011682018060405250810190613d0b9190615626565b60015b613d84573d805f8114613d3c576040519150601f19603f3d011682016040523d82523d5f602084013e613d41565b606091505b505f815103613d7c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613de690614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054613e1290614c24565b8015613e5d5780601f10613e3457610100808354040283529160200191613e5d565b820191905f5260205f20905b815481529060010190602001808311613e4057829003601f168201915b5050505050905090565b606060a060405101806040526020810391505f825281835b600115613ea157600184039350600a81066030018453600a8104905080613e7f575b50828103602084039350808452505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f9392505050565b613f388383613fc5565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613fc0575f805490505f83820390505b613f745f868380600101945086613c8c565b613faa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613f6257815f5414613fbd575f80fd5b50505b505050565b5f805490505f8203614003576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61400f5f848385613af2565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550614081836140725f865f613af8565b61407b8561416e565b17613b1f565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b81811461411b5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506140e2565b505f8203614155576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506141695f848385613b49565b505050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c28161418e565b81146141cc575f80fd5b50565b5f813590506141dd816141b9565b92915050565b5f602082840312156141f8576141f7614186565b5b5f614205848285016141cf565b91505092915050565b5f8115159050919050565b6142228161420e565b82525050565b5f60208201905061423b5f830184614219565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561427857808201518184015260208101905061425d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61429d82614241565b6142a7818561424b565b93506142b781856020860161425b565b6142c081614283565b840191505092915050565b5f6020820190508181035f8301526142e38184614293565b905092915050565b5f819050919050565b6142fd816142eb565b8114614307575f80fd5b50565b5f81359050614318816142f4565b92915050565b5f6020828403121561433357614332614186565b5b5f6143408482850161430a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61437282614349565b9050919050565b61438281614368565b82525050565b5f60208201905061439b5f830184614379565b92915050565b6143aa81614368565b81146143b4575f80fd5b50565b5f813590506143c5816143a1565b92915050565b5f80604083850312156143e1576143e0614186565b5b5f6143ee858286016143b7565b92505060206143ff8582860161430a565b9150509250929050565b5f806040838503121561441f5761441e614186565b5b5f61442c8582860161430a565b925050602061443d8582860161430a565b9150509250929050565b614450816142eb565b82525050565b5f6020820190506144695f830184614447565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144a982614283565b810181811067ffffffffffffffff821117156144c8576144c7614473565b5b80604052505050565b5f6144da61417d565b90506144e682826144a0565b919050565b5f67ffffffffffffffff82111561450557614504614473565b5b602082029050602081019050919050565b5f80fd5b5f61452c614527846144eb565b6144d1565b9050808382526020820190506020840283018581111561454f5761454e614516565b5b835b81811015614578578061456488826143b7565b845260208401935050602081019050614551565b5050509392505050565b5f82601f8301126145965761459561446f565b5b81356145a684826020860161451a565b91505092915050565b5f80604083850312156145c5576145c4614186565b5b5f83013567ffffffffffffffff8111156145e2576145e161418a565b5b6145ee85828601614582565b92505060206145ff8582860161430a565b9150509250929050565b5f805f606084860312156146205761461f614186565b5b5f61462d868287016143b7565b935050602061463e868287016143b7565b925050604061464f8682870161430a565b9150509250925092565b5f60408201905061466c5f830185614379565b6146796020830184614447565b9392505050565b5f805f6060848603121561469757614696614186565b5b5f6146a48682870161430a565b93505060206146b58682870161430a565b92505060406146c6868287016143b7565b9150509250925092565b5f80fd5b5f67ffffffffffffffff8211156146ee576146ed614473565b5b6146f782614283565b9050602081019050919050565b828183375f83830152505050565b5f61472461471f846146d4565b6144d1565b9050828152602081018484840111156147405761473f6146d0565b5b61474b848285614704565b509392505050565b5f82601f8301126147675761476661446f565b5b8135614777848260208601614712565b91505092915050565b5f6020828403121561479557614794614186565b5b5f82013567ffffffffffffffff8111156147b2576147b161418a565b5b6147be84828501614753565b91505092915050565b5f602082840312156147dc576147db614186565b5b5f6147e9848285016143b7565b91505092915050565b5f806040838503121561480857614807614186565b5b5f6148158582860161430a565b9250506020614826858286016143b7565b9150509250929050565b6148398161420e565b8114614843575f80fd5b50565b5f8135905061485481614830565b92915050565b5f80604083850312156148705761486f614186565b5b5f61487d858286016143b7565b925050602061488e85828601614846565b9150509250929050565b5f805f80608085870312156148b0576148af614186565b5b5f6148bd8782880161430a565b94505060206148ce8782880161430a565b93505060406148df878288016143b7565b92505060606148f0878288016143b7565b91505092959194509250565b5f6020828403121561491157614910614186565b5b5f61491e84828501614846565b91505092915050565b5f806040838503121561493d5761493c614186565b5b5f61494a85828601614846565b925050602061495b8582860161430a565b9150509250929050565b5f67ffffffffffffffff82111561497f5761497e614473565b5b61498882614283565b9050602081019050919050565b5f6149a76149a284614965565b6144d1565b9050828152602081018484840111156149c3576149c26146d0565b5b6149ce848285614704565b509392505050565b5f82601f8301126149ea576149e961446f565b5b81356149fa848260208601614995565b91505092915050565b5f805f8060808587031215614a1b57614a1a614186565b5b5f614a28878288016143b7565b9450506020614a39878288016143b7565b9350506040614a4a8782880161430a565b925050606085013567ffffffffffffffff811115614a6b57614a6a61418a565b5b614a77878288016149d6565b91505092959194509250565b5f67ffffffffffffffff821115614a9d57614a9c614473565b5b602082029050602081019050919050565b5f614ac0614abb84614a83565b6144d1565b90508083825260208201905060208402830185811115614ae357614ae2614516565b5b835b81811015614b0c5780614af8888261430a565b845260208401935050602081019050614ae5565b5050509392505050565b5f82601f830112614b2a57614b2961446f565b5b8135614b3a848260208601614aae565b91505092915050565b5f8060408385031215614b5957614b58614186565b5b5f83013567ffffffffffffffff811115614b7657614b7561418a565b5b614b8285828601614582565b925050602083013567ffffffffffffffff811115614ba357614ba261418a565b5b614baf85828601614b16565b9150509250929050565b5f8060408385031215614bcf57614bce614186565b5b5f614bdc858286016143b7565b9250506020614bed858286016143b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c3b57607f821691505b602082108103614c4e57614c4d614bf7565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cb8826142eb565b9150614cc3836142eb565b9250828201905080821115614cdb57614cda614c81565b5b92915050565b7f4e657720737570706c7920706572206d696e742067726f7570206578636565645f8201527f7320746f74616c20737570706c792e0000000000000000000000000000000000602082015250565b5f614d3b602f8361424b565b9150614d4682614ce1565b604082019050919050565b5f6020820190508181035f830152614d6881614d2f565b9050919050565b5f614d79826142eb565b9150614d84836142eb565b9250828203905081811115614d9c57614d9b614c81565b5b92915050565b5f614dac826142eb565b9150614db7836142eb565b9250828202614dc5816142eb565b91508282048414831517614ddc57614ddb614c81565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614e1a826142eb565b9150614e25836142eb565b925082614e3557614e34614de3565b5b828204905092915050565b5f604082019050614e535f830185614447565b614e606020830184614447565b9392505050565b5f606082019050614e7a5f830186614447565b614e876020830185614447565b614e946040830184614379565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614ef87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ebd565b614f028683614ebd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f3d614f38614f33846142eb565b614f1a565b6142eb565b9050919050565b5f819050919050565b614f5683614f23565b614f6a614f6282614f44565b848454614ec9565b825550505050565b5f90565b614f7e614f72565b614f89818484614f4d565b505050565b5b81811015614fac57614fa15f82614f76565b600181019050614f8f565b5050565b601f821115614ff157614fc281614e9c565b614fcb84614eae565b81016020851015614fda578190505b614fee614fe685614eae565b830182614f8e565b50505b505050565b5f82821c905092915050565b5f6150115f1984600802614ff6565b1980831691505092915050565b5f6150298383615002565b9150826002028217905092915050565b61504282614241565b67ffffffffffffffff81111561505b5761505a614473565b5b6150658254614c24565b615070828285614fb0565b5f60209050601f8311600181146150a1575f841561508f578287015190505b615099858261501e565b865550615100565b601f1984166150af86614e9c565b5f5b828110156150d6578489015182556001820191506020850194506020810190506150b1565b868310156150f357848901516150ef601f891682615002565b8355505b6001600288020188555050505b505050505050565b7f5468657265206973206e6f7468696e6720746f207769746864726177000000005f82015250565b5f61513c601c8361424b565b915061514782615108565b602082019050919050565b5f6020820190508181035f83015261516981615130565b9050919050565b5f81905092915050565b50565b5f6151885f83615170565b91506151938261517a565b5f82019050919050565b5f6151a78261517d565b9150819050919050565b7f5769746864726177205472616e73666572204661696c656400000000000000005f82015250565b5f6151e560188361424b565b91506151f0826151b1565b602082019050919050565b5f6020820190508181035f830152615212816151d9565b9050919050565b5f815250565b5f6080820190506152325f830186614379565b61523f6020830185614379565b61524c6040830184614379565b61525860608301615219565b949350505050565b5f8151905061526e81614830565b92915050565b5f6020828403121561528957615288614186565b5b5f61529684828501615260565b91505092915050565b7f4d696e742073746174757320697320616c726561647920746865206f6e6520795f8201527f6f7520656e746572656400000000000000000000000000000000000000000000602082015250565b5f6152f9602a8361424b565b91506153048261529f565b604082019050919050565b5f6020820190508181035f830152615326816152ed565b9050919050565b7f4e6f2066756e647320746f2077697468647261770000000000000000000000005f82015250565b5f61536160148361424b565b915061536c8261532d565b602082019050919050565b5f6020820190508181035f83015261538e81615355565b9050919050565b5f81905092915050565b5f6153a982614241565b6153b38185615395565b93506153c381856020860161425b565b80840191505092915050565b5f6153da828561539f565b91506153e6828461539f565b91508190509392505050565b7f4d69736d61746368206265747765656e20726563697069656e747320616e64205f8201527f616d6f756e747300000000000000000000000000000000000000000000000000602082015250565b5f61544c60278361424b565b9150615457826153f2565b604082019050919050565b5f6020820190508181035f83015261547981615440565b9050919050565b7f4e6f7420656e6f7567682045746865722073656e7420666f72207468652061695f8201527f7264726f70206368617267650000000000000000000000000000000000000000602082015250565b5f6154da602c8361424b565b91506154e582615480565b604082019050919050565b5f6020820190508181035f830152615507816154ce565b9050919050565b7f41697264726f702065786365656473206d617820737570706c790000000000005f82015250565b5f615542601a8361424b565b915061554d8261550e565b602082019050919050565b5f6020820190508181035f83015261556f81615536565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61559a82615576565b6155a48185615580565b93506155b481856020860161425b565b6155bd81614283565b840191505092915050565b5f6080820190506155db5f830187614379565b6155e86020830186614379565b6155f56040830185614447565b81810360608301526156078184615590565b905095945050505050565b5f81519050615620816141b9565b92915050565b5f6020828403121561563b5761563a614186565b5b5f61564884828501615612565b9150509291505056fea264697066735822122076429a93d38ec3c3f34e740c2dcb4ed29aca6eb8675795d0b0ff48b037c3b72264736f6c63430008180033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000b2fb629dfc125ffa033df3c895008b266a8fa3100000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026d6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026d6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696865643777657134646b34687468366273646b63347963357576627061636233376f356c707461676e6768767167356c677a72652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode
0x6080604052600436106102ad575f3560e01c80638da5cb5b11610174578063c82e474b116100db578063e5fd114511610094578063e985e9c51161006e578063e985e9c514610a3a578063f2fde38b14610a76578063fac5dbc614610a9e578063fea414b614610ac6576102ad565b8063e5fd114514610998578063e6a72acf146109d4578063e8656fcc14610a10576102ad565b8063c82e474b1461089a578063c87b56dd146108c2578063cde27a35146108fe578063ce55c66a14610928578063d5abeb0114610952578063e213b5f61461097c576102ad565b8063a75c3ad91161012d578063a75c3ad9146107d8578063a8ddf8f6146107ee578063ae4e494214610816578063b3978a8614610840578063b88d4fde14610868578063c20f388f14610884576102ad565b80638da5cb5b14610700578063905d7b331461072a57806391a575441461074057806395d89b411461076a578063a22cb46514610794578063a2835b55146107bc576102ad565b80633ef009ef116102185780636352211e116101d15780636352211e146105e45780636c0360eb1461062057806370a082311461064a578063715018a6146106865780637bd4f0711461069c5780637c2003e3146106c4576102ad565b80633ef009ef146104e257806341275358146104fe57806342842e0e14610528578063483f0a82146105445780634a5bd2fd1461058057806355f804b3146105bc576102ad565b806318160ddd1161026a57806318160ddd146103d357806320704c5a146103fd57806321af27f61461042557806323b872dd1461044d57806324a663c3146104695780632a55205a146104a5576102ad565b806301ffc9a7146102b157806306fdde03146102ed578063081812fc14610317578063095ea7b31461035357806311f7acb91461036f57806316da3bc614610397575b5f80fd5b3480156102bc575f80fd5b506102d760048036038101906102d291906141e3565b610af0565b6040516102e49190614228565b60405180910390f35b3480156102f8575f80fd5b50610301610b01565b60405161030e91906142cb565b60405180910390f35b348015610322575f80fd5b5061033d6004803603810190610338919061431e565b610b91565b60405161034a9190614388565b60405180910390f35b61036d600480360381019061036891906143cb565b610c0b565b005b34801561037a575f80fd5b5061039560048036038101906103909190614409565b610d4a565b005b3480156103a2575f80fd5b506103bd60048036038101906103b8919061431e565b610e59565b6040516103ca9190614456565b60405180910390f35b3480156103de575f80fd5b506103e7610e6e565b6040516103f49190614456565b60405180910390f35b348015610408575f80fd5b50610423600480360381019061041e91906145af565b610e83565b005b348015610430575f80fd5b5061044b600480360381019061044691906145af565b610f52565b005b61046760048036038101906104629190614609565b61102b565b005b348015610474575f80fd5b5061048f600480360381019061048a919061431e565b611339565b60405161049c9190614456565b60405180910390f35b3480156104b0575f80fd5b506104cb60048036038101906104c69190614409565b61134e565b6040516104d9929190614659565b60405180910390f35b6104fc60048036038101906104f79190614680565b61152a565b005b348015610509575f80fd5b50610512611b97565b60405161051f9190614388565b60405180910390f35b610542600480360381019061053d9190614609565b611bbc565b005b34801561054f575f80fd5b5061056a6004803603810190610565919061431e565b611bdb565b6040516105779190614456565b60405180910390f35b34801561058b575f80fd5b506105a660048036038101906105a1919061431e565b611bfb565b6040516105b39190614228565b60405180910390f35b3480156105c7575f80fd5b506105e260048036038101906105dd9190614780565b611c18565b005b3480156105ef575f80fd5b5061060a6004803603810190610605919061431e565b611c82565b6040516106179190614388565b60405180910390f35b34801561062b575f80fd5b50610634611c93565b60405161064191906142cb565b60405180910390f35b348015610655575f80fd5b50610670600480360381019061066b91906147c7565b611d1f565b60405161067d9190614456565b60405180910390f35b348015610691575f80fd5b5061069a611dd4565b005b3480156106a7575f80fd5b506106c260048036038101906106bd9190614409565b611de7565b005b3480156106cf575f80fd5b506106ea60048036038101906106e591906147f2565b611e09565b6040516106f79190614228565b60405180910390f35b34801561070b575f80fd5b50610714611e33565b6040516107219190614388565b60405180910390f35b348015610735575f80fd5b5061073e611e5b565b005b34801561074b575f80fd5b506107546121f1565b6040516107619190614456565b60405180910390f35b348015610775575f80fd5b5061077e6121f7565b60405161078b91906142cb565b60405180910390f35b34801561079f575f80fd5b506107ba60048036038101906107b5919061485a565b612287565b005b6107d660048036038101906107d19190614898565b61238d565b005b3480156107e3575f80fd5b506107ec612c60565b005b3480156107f9575f80fd5b50610814600480360381019061080f91906148fc565b612f23565b005b348015610821575f80fd5b5061082a612f9b565b6040516108379190614388565b60405180910390f35b34801561084b575f80fd5b5061086660048036038101906108619190614927565b612fc0565b005b610882600480360381019061087d9190614a03565b61303e565b005b34801561088f575f80fd5b506108986130b0565b005b3480156108a5575f80fd5b506108c060048036038101906108bb9190614409565b613222565b005b3480156108cd575f80fd5b506108e860048036038101906108e3919061431e565b613293565b6040516108f591906142cb565b60405180910390f35b348015610909575f80fd5b5061091261332e565b60405161091f9190614456565b60405180910390f35b348015610933575f80fd5b5061093c613334565b6040516109499190614456565b60405180910390f35b34801561095d575f80fd5b5061096661333a565b6040516109739190614456565b60405180910390f35b61099660048036038101906109919190614b43565b613340565b005b3480156109a3575f80fd5b506109be60048036038101906109b9919061431e565b6135e4565b6040516109cb9190614456565b60405180910390f35b3480156109df575f80fd5b506109fa60048036038101906109f5919061431e565b6135f9565b604051610a079190614456565b60405180910390f35b348015610a1b575f80fd5b50610a2461360e565b604051610a319190614228565b60405180910390f35b348015610a45575f80fd5b50610a606004803603810190610a5b9190614bb9565b613620565b604051610a6d9190614228565b60405180910390f35b348015610a81575f80fd5b50610a9c6004803603810190610a9791906147c7565b6136ae565b005b348015610aa9575f80fd5b50610ac46004803603810190610abf919061431e565b613732565b005b348015610ad1575f80fd5b50610ada613744565b604051610ae79190614456565b60405180910390f35b5f610afa82613788565b9050919050565b606060028054610b1090614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3c90614c24565b8015610b875780601f10610b5e57610100808354040283529160200191610b87565b820191905f5260205f20905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b5f610b9b82613801565b610bd1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610c1582611c82565b90508073ffffffffffffffffffffffffffffffffffffffff16610c3661385b565b73ffffffffffffffffffffffffffffffffffffffff1614610c9957610c6281610c5d61385b565b613620565b610c98576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610d52613862565b610d5b826138e9565b610d6957610d6882613940565b5b5f805b601a80549050811015610df85783601a8281548110610d8e57610d8d614c54565b5b905f5260205f20015403610daf578282610da89190614cae565b9150610deb565b60155f601a8381548110610dc657610dc5614c54565b5b905f5260205f20015481526020019081526020015f205482610de89190614cae565b91505b8080600101915050610d6c565b50600c54811115610e3e576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401610e3590614d51565b60405180910390fd5b8160155f8581526020019081526020015f2081905550505050565b6013602052805f5260405f205f915090505481565b5f610e776139c1565b6001545f540303905090565b610e8b613862565b610e94816138e9565b610ea257610ea181613940565b5b5f5b8251811015610f4d57600160175f8481526020019081526020015f205f858481518110610ed457610ed3614c54565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601954610f3a9190614cae565b6019819055508080600101915050610ea4565b505050565b610f5a613862565b610f63816138e9565b610f7157610f7081613940565b5b5f5b8251811015611026575f60175f8481526020019081526020015f205f858481518110610fa257610fa1614c54565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60195411156110195760016019546110129190614d6f565b6019819055505b8080600101915050610f73565b505050565b5f611035826139c9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461109c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806110a784613a8c565b915091506110bd81876110b861385b565b613aaf565b611109576110d2866110cd61385b565b613620565b611108576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361116e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117b8686866001613af2565b8015611185575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061124d85611229888887613af8565b7c020000000000000000000000000000000000000000000000000000000017613b1f565b60045f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036112c9575f6001850190505f60045f8381526020019081526020015f2054036112c7575f5481146112c6578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113318686866001613b49565b505050505050565b6015602052805f5260405f205f915090505481565b5f805f600a5f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036114d75760096040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f6114e0613b4f565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661150c9190614da2565b6115169190614e10565b9050815f0151819350935050509250929050565b600e5f9054906101000a900460ff1661156f576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f9054906101000a900460ff1680156115a5575060185f8381526020019081526020015f205f9054906101000a900460ff16155b156115e757816040517f1435260a0000000000000000000000000000000000000000000000000000000081526004016115de9190614456565b60405180910390fd5b5f8214611732575f151560175f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036116905733826040517f10cdd37c000000000000000000000000000000000000000000000000000000008152600401611687929190614659565b60405180910390fd5b60155f8381526020019081526020015f20548360165f8581526020019081526020015f20546116bf9190614cae565b1115611731578260165f8481526020019081526020015f205460155f8581526020019081526020015f20546116f49190614d6f565b6040517fcc3f2f1b000000000000000000000000000000000000000000000000000000008152600401611728929190614e40565b60405180910390fd5b5b60135f8381526020019081526020015f205461174d33613b58565b846117589190614cae565b11156117c1578261176833613b58565b60135f8581526020019081526020015f20546117849190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016117b8929190614e40565b60405180910390fd5b600c54836117cd610e6e565b6117d79190614cae565b111561183057826117e6610e6e565b600c546117f39190614d6f565b6040517fadc3cee5000000000000000000000000000000000000000000000000000000008152600401611827929190614e40565b60405180910390fd5b5f8360145f8581526020019081526020015f205461184e9190614da2565b90505f84600d5461185f9190614da2565b606460038461186e9190614da2565b6118789190614e10565b6118829190614cae565b90505f81836118919190614cae565b9050803410156118da5780346040517fc10842230000000000000000000000000000000000000000000000000000000081526004016118d1929190614e40565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561194257503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156119c7575f6064601254856119589190614da2565b6119629190614e10565b905080600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546119b09190614cae565b9250508190555080846119c39190614d6f565b9350505b82600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611a349190614cae565b9250508190555081600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611aa89190614cae565b925050819055508560165f8781526020019081526020015f205f828254611acf9190614cae565b92505081905550611ae03387613bac565b3373ffffffffffffffffffffffffffffffffffffffff167f264808566929c0a2c98376a25f69f0faa85b1ce885be5fc7eee7cd639f9c0c26878787604051611b2a93929190614e67565b60405180910390a25f8134611b3f9190614d6f565b90505f811115611b8e573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611b8c573d5f803e3d5ffd5b505b50505050505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bd683838360405180602001604052805f81525061303e565b505050565b601a8181548110611bea575f80fd5b905f5260205f20015f915090505481565b6018602052805f5260405f205f915054906101000a900460ff1681565b611c20613862565b80600f9081611c2f9190615039565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60017f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c60405160405180910390a350565b5f611c8c826139c9565b9050919050565b600f8054611ca090614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054611ccc90614c24565b8015611d175780601f10611cee57610100808354040283529160200191611d17565b820191905f5260205f20905b815481529060010190602001808311611cfa57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d85576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611ddc613862565b611de55f613bc9565b565b611def613862565b8160135f8381526020019081526020015f20819055505050565b6017602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e63613862565b5f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411611f03576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401611efa90615152565b60405180910390fd5b5f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516120d39061519d565b5f6040518083038185875af1925050503d805f811461210d576040519150601f19603f3d011682016040523d82523d5f602084013e612112565b606091505b505090505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161215c9061519d565b5f6040518083038185875af1925050503d805f8114612196576040519150601f19603f3d011682016040523d82523d5f602084013e61219b565b606091505b50509050811580156121ab575080155b156121eb576040517fe066a8d70000000000000000000000000000000000000000000000000000000081526004016121e2906151fb565b60405180910390fd5b50505050565b60125481565b60606003805461220690614c24565b80601f016020809104026020016040519081016040528092919081815260200182805461223290614c24565b801561227d5780601f106122545761010080835404028352916020019161227d565b820191905f5260205f20905b81548152906001019060200180831161226057829003601f168201915b5050505050905090565b8060075f61229361385b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661233c61385b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123819190614228565b60405180910390a35050565b6c447e69651d841bd8d104bed49373ffffffffffffffffffffffffffffffffffffffff16638988eea93383306040518463ffffffff1660e01b81526004016123d79392919061521f565b602060405180830381865afa1580156123f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124169190615274565b61245757806040517f8e4a23d600000000000000000000000000000000000000000000000000000000815260040161244e9190614388565b60405180910390fd5b600e5f9054906101000a900460ff1661249c576040517f343295c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f9054906101000a900460ff1680156124d2575060185f8481526020019081526020015f205f9054906101000a900460ff16155b1561251457826040517f1435260a00000000000000000000000000000000000000000000000000000000815260040161250b9190614456565b60405180910390fd5b5f831461265f575f151560175f8581526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036125bd5780836040517f10cdd37c0000000000000000000000000000000000000000000000000000000081526004016125b4929190614659565b60405180910390fd5b60155f8481526020019081526020015f20548460165f8681526020019081526020015f20546125ec9190614cae565b111561265e578360165f8581526020019081526020015f205460155f8681526020019081526020015f20546126219190614d6f565b6040517fcc3f2f1b000000000000000000000000000000000000000000000000000000008152600401612655929190614e40565b60405180910390fd5b5b60135f8481526020019081526020015f205461267a33613b58565b856126859190614cae565b11156126ee578361269533613b58565b60135f8681526020019081526020015f20546126b19190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016126e5929190614e40565b60405180910390fd5b60135f8481526020019081526020015f2054601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054856127499190614cae565b11156127e75783601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460135f8681526020019081526020015f20546127aa9190614d6f565b6040517f07cc6bf60000000000000000000000000000000000000000000000000000000081526004016127de929190614e40565b60405180910390fd5b600c54846127f3610e6e565b6127fd9190614cae565b1115612856578361280c610e6e565b600c546128199190614d6f565b6040517fadc3cee500000000000000000000000000000000000000000000000000000000815260040161284d929190614e40565b60405180910390fd5b5f8460145f8681526020019081526020015f20546128749190614da2565b90505f85600d546128859190614da2565b60646003846128949190614da2565b61289e9190614e10565b6128a89190614cae565b90505f81836128b79190614cae565b9050803410156129005780346040517fc10842230000000000000000000000000000000000000000000000000000000081526004016128f7929190614e40565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561296857503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156129a057508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612a25575f6064601254856129b69190614da2565b6129c09190614e10565b905080600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612a0e9190614cae565b925050819055508084612a219190614d6f565b9350505b82600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612a929190614cae565b9250508190555081600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b069190614cae565b925050819055508660165f8881526020019081526020015f205f828254612b2d9190614cae565b9250508190555086601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b809190614cae565b92505081905550612b913388613bac565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f25b00d670ba83c43c9eff98f6123750afecfdefc10f98add0927ca70ebb24ad1898989604051612bf293929190614e67565b60405180910390a35f8134612c079190614d6f565b90505f811115612c56573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612c54573d5f803e3d5ffd5b505b5050505050505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cf157336040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152600401612ce89190614388565b60405180910390fd5b5f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411612d91576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612d8890615152565b60405180910390fd5b5f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051612e9c9061519d565b5f6040518083038185875af1925050503d805f8114612ed6576040519150601f19603f3d011682016040523d82523d5f602084013e612edb565b606091505b5050905080612f1f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612f16906151fb565b60405180910390fd5b5050565b612f2b613862565b801515600e5f9054906101000a900460ff16151503612f7f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401612f769061530f565b60405180910390fd5b80600e5f6101000a81548160ff02191690831515021790555050565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612fc8613862565b612fd1816138e9565b61301257806040517f5831017d0000000000000000000000000000000000000000000000000000000081526004016130099190614456565b60405180910390fd5b8160185f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61304984848461102b565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146130aa5761307384848484613c8c565b6130a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f811015613134576040517fe066a8d700000000000000000000000000000000000000000000000000000000815260040161312b90615377565b60405180910390fd5b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f3373ffffffffffffffffffffffffffffffffffffffff168260405161319b9061519d565b5f6040518083038185875af1925050503d805f81146131d5576040519150601f19603f3d011682016040523d82523d5f602084013e6131da565b606091505b505090508061321e576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401613215906151fb565b60405180910390fd5b5050565b61322a613862565b613233816138e9565b6132415761324081613940565b5b8160145f8381526020019081526020015f2081905550807fa7e52343431f792020e7cb8411a08014688ca11782fd5709fa2531b3d74ba457836040516132879190614456565b60405180910390a25050565b606061329e82613801565b6132d4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6132dd613dd7565b90505f8151036132fb5760405180602001604052805f815250613326565b8061330584613e67565b6040516020016133169291906153cf565b6040516020818303038152906040525b915050919050565b60195481565b600d5481565b600c5481565b613348613862565b805182511461338c576040517fe066a8d700000000000000000000000000000000000000000000000000000000815260040161338390615462565b60405180910390fd5b5f805f5b835181101561341b578381815181106133ac576133ab614c54565b5b60200260200101516064600b600d546133c59190614da2565b6133cf9190614e10565b6133d99190614da2565b836133e49190614cae565b92508381815181106133f9576133f8614c54565b5b60200260200101518261340c9190614cae565b91508080600101915050613390565b508134101561345f576040517fe066a8d7000000000000000000000000000000000000000000000000000000008152600401613456906154f0565b60405180910390fd5b600c548161346b610e6e565b6134759190614cae565b11156134b6576040517fe066a8d70000000000000000000000000000000000000000000000000000000081526004016134ad90615558565b60405180910390fd5b81600b5f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546135239190614cae565b925050819055505f5b84518110156135805761357385828151811061354b5761354a614c54565b5b602002602001015185838151811061356657613565614c54565b5b6020026020010151613bac565b808060010191505061352c565b505f823461358e9190614d6f565b90505f8111156135dd573373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156135db573d5f803e3d5ffd5b505b5050505050565b6016602052805f5260405f205f915090505481565b6014602052805f5260405f205f915090505481565b600e5f9054906101000a900460ff1681565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6136b6613862565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613726575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161371d9190614388565b60405180910390fd5b61372f81613bc9565b50565b61373a613862565b8060128190555050565b5f600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905090565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137fa57506137f982613eb6565b5b9050919050565b5f8161380b6139c1565b1115801561381957505f5482105b801561385457505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b61386a613f1f565b73ffffffffffffffffffffffffffffffffffffffff16613888611e33565b73ffffffffffffffffffffffffffffffffffffffff16146138e7576138ab613f1f565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016138de9190614388565b60405180910390fd5b565b5f805f90505b601a805490508110156139365782601a828154811061391157613910614c54565b5b905f5260205f2001540361392957600191505061393b565b80806001019150506138ef565b505f90505b919050565b5f60145f8381526020019081526020015f20819055505f60135f8381526020019081526020015f20819055505f60155f8381526020019081526020015f20819055505f60165f8381526020019081526020015f2081905550601a81908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f6001905090565b5f80829050806139d76139c1565b11613a55575f54811015613a54575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613a52575b5f8103613a485760045f836001900393508381526020019081526020015f20549050613a21565b8092505050613a87565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613b0e868684613f26565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f612710905090565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b613bc5828260405180602001604052805f815250613f2e565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613cb161385b565b8786866040518563ffffffff1660e01b8152600401613cd394939291906155c8565b6020604051808303815f875af1925050508015613d0e57506040513d601f19601f82011682018060405250810190613d0b9190615626565b60015b613d84573d805f8114613d3c576040519150601f19603f3d011682016040523d82523d5f602084013e613d41565b606091505b505f815103613d7c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613de690614c24565b80601f0160208091040260200160405190810160405280929190818152602001828054613e1290614c24565b8015613e5d5780601f10613e3457610100808354040283529160200191613e5d565b820191905f5260205f20905b815481529060010190602001808311613e4057829003601f168201915b5050505050905090565b606060a060405101806040526020810391505f825281835b600115613ea157600184039350600a81066030018453600a8104905080613e7f575b50828103602084039350808452505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f9392505050565b613f388383613fc5565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613fc0575f805490505f83820390505b613f745f868380600101945086613c8c565b613faa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613f6257815f5414613fbd575f80fd5b50505b505050565b5f805490505f8203614003576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61400f5f848385613af2565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550614081836140725f865f613af8565b61407b8561416e565b17613b1f565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b81811461411b5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506140e2565b505f8203614155576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506141695f848385613b49565b505050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c28161418e565b81146141cc575f80fd5b50565b5f813590506141dd816141b9565b92915050565b5f602082840312156141f8576141f7614186565b5b5f614205848285016141cf565b91505092915050565b5f8115159050919050565b6142228161420e565b82525050565b5f60208201905061423b5f830184614219565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561427857808201518184015260208101905061425d565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61429d82614241565b6142a7818561424b565b93506142b781856020860161425b565b6142c081614283565b840191505092915050565b5f6020820190508181035f8301526142e38184614293565b905092915050565b5f819050919050565b6142fd816142eb565b8114614307575f80fd5b50565b5f81359050614318816142f4565b92915050565b5f6020828403121561433357614332614186565b5b5f6143408482850161430a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61437282614349565b9050919050565b61438281614368565b82525050565b5f60208201905061439b5f830184614379565b92915050565b6143aa81614368565b81146143b4575f80fd5b50565b5f813590506143c5816143a1565b92915050565b5f80604083850312156143e1576143e0614186565b5b5f6143ee858286016143b7565b92505060206143ff8582860161430a565b9150509250929050565b5f806040838503121561441f5761441e614186565b5b5f61442c8582860161430a565b925050602061443d8582860161430a565b9150509250929050565b614450816142eb565b82525050565b5f6020820190506144695f830184614447565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6144a982614283565b810181811067ffffffffffffffff821117156144c8576144c7614473565b5b80604052505050565b5f6144da61417d565b90506144e682826144a0565b919050565b5f67ffffffffffffffff82111561450557614504614473565b5b602082029050602081019050919050565b5f80fd5b5f61452c614527846144eb565b6144d1565b9050808382526020820190506020840283018581111561454f5761454e614516565b5b835b81811015614578578061456488826143b7565b845260208401935050602081019050614551565b5050509392505050565b5f82601f8301126145965761459561446f565b5b81356145a684826020860161451a565b91505092915050565b5f80604083850312156145c5576145c4614186565b5b5f83013567ffffffffffffffff8111156145e2576145e161418a565b5b6145ee85828601614582565b92505060206145ff8582860161430a565b9150509250929050565b5f805f606084860312156146205761461f614186565b5b5f61462d868287016143b7565b935050602061463e868287016143b7565b925050604061464f8682870161430a565b9150509250925092565b5f60408201905061466c5f830185614379565b6146796020830184614447565b9392505050565b5f805f6060848603121561469757614696614186565b5b5f6146a48682870161430a565b93505060206146b58682870161430a565b92505060406146c6868287016143b7565b9150509250925092565b5f80fd5b5f67ffffffffffffffff8211156146ee576146ed614473565b5b6146f782614283565b9050602081019050919050565b828183375f83830152505050565b5f61472461471f846146d4565b6144d1565b9050828152602081018484840111156147405761473f6146d0565b5b61474b848285614704565b509392505050565b5f82601f8301126147675761476661446f565b5b8135614777848260208601614712565b91505092915050565b5f6020828403121561479557614794614186565b5b5f82013567ffffffffffffffff8111156147b2576147b161418a565b5b6147be84828501614753565b91505092915050565b5f602082840312156147dc576147db614186565b5b5f6147e9848285016143b7565b91505092915050565b5f806040838503121561480857614807614186565b5b5f6148158582860161430a565b9250506020614826858286016143b7565b9150509250929050565b6148398161420e565b8114614843575f80fd5b50565b5f8135905061485481614830565b92915050565b5f80604083850312156148705761486f614186565b5b5f61487d858286016143b7565b925050602061488e85828601614846565b9150509250929050565b5f805f80608085870312156148b0576148af614186565b5b5f6148bd8782880161430a565b94505060206148ce8782880161430a565b93505060406148df878288016143b7565b92505060606148f0878288016143b7565b91505092959194509250565b5f6020828403121561491157614910614186565b5b5f61491e84828501614846565b91505092915050565b5f806040838503121561493d5761493c614186565b5b5f61494a85828601614846565b925050602061495b8582860161430a565b9150509250929050565b5f67ffffffffffffffff82111561497f5761497e614473565b5b61498882614283565b9050602081019050919050565b5f6149a76149a284614965565b6144d1565b9050828152602081018484840111156149c3576149c26146d0565b5b6149ce848285614704565b509392505050565b5f82601f8301126149ea576149e961446f565b5b81356149fa848260208601614995565b91505092915050565b5f805f8060808587031215614a1b57614a1a614186565b5b5f614a28878288016143b7565b9450506020614a39878288016143b7565b9350506040614a4a8782880161430a565b925050606085013567ffffffffffffffff811115614a6b57614a6a61418a565b5b614a77878288016149d6565b91505092959194509250565b5f67ffffffffffffffff821115614a9d57614a9c614473565b5b602082029050602081019050919050565b5f614ac0614abb84614a83565b6144d1565b90508083825260208201905060208402830185811115614ae357614ae2614516565b5b835b81811015614b0c5780614af8888261430a565b845260208401935050602081019050614ae5565b5050509392505050565b5f82601f830112614b2a57614b2961446f565b5b8135614b3a848260208601614aae565b91505092915050565b5f8060408385031215614b5957614b58614186565b5b5f83013567ffffffffffffffff811115614b7657614b7561418a565b5b614b8285828601614582565b925050602083013567ffffffffffffffff811115614ba357614ba261418a565b5b614baf85828601614b16565b9150509250929050565b5f8060408385031215614bcf57614bce614186565b5b5f614bdc858286016143b7565b9250506020614bed858286016143b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614c3b57607f821691505b602082108103614c4e57614c4d614bf7565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614cb8826142eb565b9150614cc3836142eb565b9250828201905080821115614cdb57614cda614c81565b5b92915050565b7f4e657720737570706c7920706572206d696e742067726f7570206578636565645f8201527f7320746f74616c20737570706c792e0000000000000000000000000000000000602082015250565b5f614d3b602f8361424b565b9150614d4682614ce1565b604082019050919050565b5f6020820190508181035f830152614d6881614d2f565b9050919050565b5f614d79826142eb565b9150614d84836142eb565b9250828203905081811115614d9c57614d9b614c81565b5b92915050565b5f614dac826142eb565b9150614db7836142eb565b9250828202614dc5816142eb565b91508282048414831517614ddc57614ddb614c81565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614e1a826142eb565b9150614e25836142eb565b925082614e3557614e34614de3565b5b828204905092915050565b5f604082019050614e535f830185614447565b614e606020830184614447565b9392505050565b5f606082019050614e7a5f830186614447565b614e876020830185614447565b614e946040830184614379565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614ef87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ebd565b614f028683614ebd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f3d614f38614f33846142eb565b614f1a565b6142eb565b9050919050565b5f819050919050565b614f5683614f23565b614f6a614f6282614f44565b848454614ec9565b825550505050565b5f90565b614f7e614f72565b614f89818484614f4d565b505050565b5b81811015614fac57614fa15f82614f76565b600181019050614f8f565b5050565b601f821115614ff157614fc281614e9c565b614fcb84614eae565b81016020851015614fda578190505b614fee614fe685614eae565b830182614f8e565b50505b505050565b5f82821c905092915050565b5f6150115f1984600802614ff6565b1980831691505092915050565b5f6150298383615002565b9150826002028217905092915050565b61504282614241565b67ffffffffffffffff81111561505b5761505a614473565b5b6150658254614c24565b615070828285614fb0565b5f60209050601f8311600181146150a1575f841561508f578287015190505b615099858261501e565b865550615100565b601f1984166150af86614e9c565b5f5b828110156150d6578489015182556001820191506020850194506020810190506150b1565b868310156150f357848901516150ef601f891682615002565b8355505b6001600288020188555050505b505050505050565b7f5468657265206973206e6f7468696e6720746f207769746864726177000000005f82015250565b5f61513c601c8361424b565b915061514782615108565b602082019050919050565b5f6020820190508181035f83015261516981615130565b9050919050565b5f81905092915050565b50565b5f6151885f83615170565b91506151938261517a565b5f82019050919050565b5f6151a78261517d565b9150819050919050565b7f5769746864726177205472616e73666572204661696c656400000000000000005f82015250565b5f6151e560188361424b565b91506151f0826151b1565b602082019050919050565b5f6020820190508181035f830152615212816151d9565b9050919050565b5f815250565b5f6080820190506152325f830186614379565b61523f6020830185614379565b61524c6040830184614379565b61525860608301615219565b949350505050565b5f8151905061526e81614830565b92915050565b5f6020828403121561528957615288614186565b5b5f61529684828501615260565b91505092915050565b7f4d696e742073746174757320697320616c726561647920746865206f6e6520795f8201527f6f7520656e746572656400000000000000000000000000000000000000000000602082015250565b5f6152f9602a8361424b565b91506153048261529f565b604082019050919050565b5f6020820190508181035f830152615326816152ed565b9050919050565b7f4e6f2066756e647320746f2077697468647261770000000000000000000000005f82015250565b5f61536160148361424b565b915061536c8261532d565b602082019050919050565b5f6020820190508181035f83015261538e81615355565b9050919050565b5f81905092915050565b5f6153a982614241565b6153b38185615395565b93506153c381856020860161425b565b80840191505092915050565b5f6153da828561539f565b91506153e6828461539f565b91508190509392505050565b7f4d69736d61746368206265747765656e20726563697069656e747320616e64205f8201527f616d6f756e747300000000000000000000000000000000000000000000000000602082015250565b5f61544c60278361424b565b9150615457826153f2565b604082019050919050565b5f6020820190508181035f83015261547981615440565b9050919050565b7f4e6f7420656e6f7567682045746865722073656e7420666f72207468652061695f8201527f7264726f70206368617267650000000000000000000000000000000000000000602082015250565b5f6154da602c8361424b565b91506154e582615480565b604082019050919050565b5f6020820190508181035f830152615507816154ce565b9050919050565b7f41697264726f702065786365656473206d617820737570706c790000000000005f82015250565b5f615542601a8361424b565b915061554d8261550e565b602082019050919050565b5f6020820190508181035f83015261556f81615536565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f61559a82615576565b6155a48185615580565b93506155b481856020860161425b565b6155bd81614283565b840191505092915050565b5f6080820190506155db5f830187614379565b6155e86020830186614379565b6155f56040830185614447565b81810360608301526156078184615590565b905095945050505050565b5f81519050615620816141b9565b92915050565b5f6020828403121561563b5761563a614186565b5b5f61564884828501615612565b9150509291505056fea264697066735822122076429a93d38ec3c3f34e740c2dcb4ed29aca6eb8675795d0b0ff48b037c3b72264736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000b2fb629dfc125ffa033df3c895008b266a8fa3100000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026d6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026d6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696865643777657134646b34687468366273646b63347963357576627061636233376f356c707461676e6768767167356c677a72652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000032
-----Decoded View---------------
Arg [0] : name (string): mm
Arg [1] : symbol (string): mm
Arg [2] : _ownerPayoutAddress (address): 0x0b2Fb629dFC125fFa033df3c895008b266a8FA31
Arg [3] : _initialBaseURI (string): ipfs://bafybeihed7weq4dk4hth6bsdkc4yc5uvbpacb37o5lptagnghvqg5lgzre/
Arg [4] : _maxSupply (uint256): 120
Arg [5] : _threeDollarsEth (uint256): 0
Arg [6] : _maxMintPerWallet (uint256[]): 50
Arg [7] : _maxSupplyPerMintGroup (uint256[]): 50
Arg [8] : _mintPrice (uint256[]): 50
Arg [9] : _royaltyPercentage (uint96): 0
-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000000b2fb629dfc125ffa033df3c895008b266a8fa31
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000078
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 6d6d000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 6d6d000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [15] : 697066733a2f2f626166796265696865643777657134646b3468746836627364
Arg [16] : 6b63347963357576627061636233376f356c707461676e6768767167356c677a
Arg [17] : 72652f0000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode Sourcemap
79167:21330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100192:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46237:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52728:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52161:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83915:1016;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80151:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41988:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84962:522;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85520:593;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56367:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80263:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19938:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;90507:2837;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79971:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59288:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80607:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80452:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97872:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47630:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79943:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43172:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26131:103;;;;;;;;;;;;;:::i;:::-;;86735:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80385:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25456:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98187:728;;;;;;;;;;;;;:::i;:::-;;80079:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46413:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53286:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93586:3550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98994:571;;;;;;;;;;;;;:::i;:::-;;97502:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80003:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86156:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60079:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89636:600;;;;;;;;;;;;;:::i;:::-;;87015:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46623:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80505:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79871:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79840:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87654:1408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80327:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80211:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79908:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53677:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26389:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89390:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99796:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100192:204;100323:4;100352:36;100376:11;100352:23;:36::i;:::-;100345:43;;100192:204;;;:::o;46237:100::-;46291:13;46324:5;46317:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46237:100;:::o;52728:218::-;52804:7;52829:16;52837:7;52829;:16::i;:::-;52824:64;;52854:34;;;;;;;;;;;;;;52824:64;52908:15;:24;52924:7;52908:24;;;;;;;;;;;:30;;;;;;;;;;;;52901:37;;52728:218;;;:::o;52161:408::-;52250:13;52266:16;52274:7;52266;:16::i;:::-;52250:32;;52322:5;52299:28;;:19;:17;:19::i;:::-;:28;;;52295:175;;52347:44;52364:5;52371:19;:17;:19::i;:::-;52347:16;:44::i;:::-;52342:128;;52419:35;;;;;;;;;;;;;;52342:128;52295:175;52515:2;52482:15;:24;52498:7;52482:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52553:7;52549:2;52533:28;;52542:5;52533:28;;;;;;;;;;;;52239:330;52161:408;;:::o;83915:1016::-;25342:13;:11;:13::i;:::-;84170:25:::1;84188:6;84170:17;:25::i;:::-;84165:89;;84212:30;84235:6;84212:22;:30::i;:::-;84165:89;84318:25;84363:9:::0;84358:325:::1;84382:16;:23;;;;84378:1;:27;84358:325;;;84454:6;84431:16;84448:1;84431:19;;;;;;;;:::i;:::-;;;;;;;;;;:29:::0;84427:245:::1;;84502:6;84481:27;;;;;:::i;:::-;;;84427:245;;;84614:21;:42;84636:16;84653:1;84636:19;;;;;;;;:::i;:::-;;;;;;;;;;84614:42;;;;;;;;;;;;84593:63;;;;;:::i;:::-;;;84427:245;84407:3;;;;;;;84358:325;;;;84719:9;;84699:17;:29;84695:178;;;84752:109;;;;;;;;;;:::i;:::-;;;;;;;;84695:178;84917:6;84885:21;:29;84907:6;84885:29;;;;;;;;;;;:38;;;;84018:913;83915:1016:::0;;:::o;80151:51::-;;;;;;;;;;;;;;;;;:::o;41988:323::-;42049:7;42277:15;:13;:15::i;:::-;42262:12;;42246:13;;:28;:46;42239:53;;41988:323;:::o;84962:522::-;25342:13;:11;:13::i;:::-;85223:25:::1;85241:6;85223:17;:25::i;:::-;85218:89;;85265:30;85288:6;85265:22;:30::i;:::-;85218:89;85324:9;85319:158;85343:10;:17;85339:1;:21;85319:158;;;85415:4;85382:7;:15;85390:6;85382:15;;;;;;;;;;;:30;85398:10;85409:1;85398:13;;;;;;;;:::i;:::-;;;;;;;;85382:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;85464:1;85449:12;;:16;;;;:::i;:::-;85434:12;:31;;;;85362:3;;;;;;;85319:158;;;;84962:522:::0;;:::o;85520:593::-;25342:13;:11;:13::i;:::-;85789:25:::1;85807:6;85789:17;:25::i;:::-;85784:89;;85831:30;85854:6;85831:22;:30::i;:::-;85784:89;85890:9;85885:221;85909:13;:20;85905:1;:24;85885:221;;;85987:5;85951:7;:15;85959:6;85951:15;;;;;;;;;;;:33;85967:13;85981:1;85967:16;;;;;;;;:::i;:::-;;;;;;;;85951:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;86026:1;86011:12;;:16;86007:88;;;86078:1;86063:12;;:16;;;;:::i;:::-;86048:12;:31;;;;86007:88;85931:3;;;;;;;85885:221;;;;85520:593:::0;;:::o;56367:2825::-;56509:27;56539;56558:7;56539:18;:27::i;:::-;56509:57;;56624:4;56583:45;;56599:19;56583:45;;;56579:86;;56637:28;;;;;;;;;;;;;;56579:86;56679:27;56708:23;56735:35;56762:7;56735:26;:35::i;:::-;56678:92;;;;56870:68;56895:15;56912:4;56918:19;:17;:19::i;:::-;56870:24;:68::i;:::-;56865:180;;56958:43;56975:4;56981:19;:17;:19::i;:::-;56958:16;:43::i;:::-;56953:92;;57010:35;;;;;;;;;;;;;;56953:92;56865:180;57076:1;57062:16;;:2;:16;;;57058:52;;57087:23;;;;;;;;;;;;;;57058:52;57123:43;57145:4;57151:2;57155:7;57164:1;57123:21;:43::i;:::-;57259:15;57256:160;;;57399:1;57378:19;57371:30;57256:160;57796:18;:24;57815:4;57796:24;;;;;;;;;;;;;;;;57794:26;;;;;;;;;;;;57865:18;:22;57884:2;57865:22;;;;;;;;;;;;;;;;57863:24;;;;;;;;;;;58187:146;58224:2;58273:45;58288:4;58294:2;58298:19;58273:14;:45::i;:::-;38387:8;58245:73;58187:18;:146::i;:::-;58158:17;:26;58176:7;58158:26;;;;;;;;;;;:175;;;;58504:1;38387:8;58453:19;:47;:52;58449:627;;58526:19;58558:1;58548:7;:11;58526:33;;58715:1;58681:17;:30;58699:11;58681:30;;;;;;;;;;;;:35;58677:384;;58819:13;;58804:11;:28;58800:242;;58999:19;58966:17;:30;58984:11;58966:30;;;;;;;;;;;:52;;;;58800:242;58677:384;58507:569;58449:627;59123:7;59119:2;59104:27;;59113:4;59104:27;;;;;;;;;;;;59142:42;59163:4;59169:2;59173:7;59182:1;59142:20;:42::i;:::-;56498:2694;;;56367:2825;;;:::o;80263:56::-;;;;;;;;;;;;;;;;;:::o;19938:429::-;20024:7;20033;20053:26;20082:17;:26;20100:7;20082:26;;;;;;;;;;;20053:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20153:1;20125:30;;:7;:16;;;:30;;;20121:92;;20182:19;20172:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20121:92;20225:21;20289:17;:15;:17::i;:::-;20249:57;;20262:7;:23;;;20250:35;;:9;:35;;;;:::i;:::-;20249:57;;;;:::i;:::-;20225:81;;20327:7;:16;;;20345:13;20319:40;;;;;;19938:429;;;;;:::o;90507:2837::-;90740:8;;;;;;;;;;;90735:63;;90772:14;;;;;;;;;;;;;;90735:63;90825:8;;;;;;;;;;;:34;;;;;90838:13;:21;90852:6;90838:21;;;;;;;;;;;;;;;;;;;;;90837:22;90825:34;90821:107;;;90908:6;90883:33;;;;;;;;;;;:::i;:::-;;;;;;;;90821:107;90962:1;90952:6;:11;90948:533;;91015:5;90984:36;;:7;:15;90992:6;90984:15;;;;;;;;;;;:27;91000:10;90984:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;90980:134;;91070:10;91090:6;91048:50;;;;;;;;;;;;:::i;:::-;;;;;;;;90980:134;91184:21;:29;91206:6;91184:29;;;;;;;;;;;;91175:6;91150:14;:22;91165:6;91150:22;;;;;;;;;;;;:31;;;;:::i;:::-;:63;91128:342;;;91315:6;91412:14;:22;91427:6;91412:22;;;;;;;;;;;;91355:21;:29;91377:6;91355:29;;;;;;;;;;;;:79;;;;:::i;:::-;91255:199;;;;;;;;;;;;:::i;:::-;;;;;;;;91128:342;90948:533;91543:16;:24;91560:6;91543:24;;;;;;;;;;;;91515:25;91529:10;91515:13;:25::i;:::-;91506:6;:34;;;;:::i;:::-;:61;91502:253;;;91641:6;91702:25;91716:10;91702:13;:25::i;:::-;91675:16;:24;91692:6;91675:24;;;;;;;;;;;;:52;;;;:::i;:::-;91591:152;;;;;;;;;;;;:::i;:::-;;;;;;;;91502:253;91796:9;;91787:6;91771:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;91767:198;;;91876:6;91924:13;:11;:13::i;:::-;91912:9;;:25;;;;:::i;:::-;91829:124;;;;;;;;;;;;:::i;:::-;;;;;;;;91767:198;92011:17;92051:6;92031:9;:17;92041:6;92031:17;;;;;;;;;;;;:26;;;;:::i;:::-;92011:46;;92068:17;92146:6;92128:15;;:24;;;;:::i;:::-;92107:3;92102:1;92090:9;:13;;;;:::i;:::-;92089:21;;;;:::i;:::-;92088:65;;;;:::i;:::-;92068:85;;92179:24;92218:9;92206;:21;;;;:::i;:::-;92179:48;;92256:16;92244:9;:28;92240:185;;;92343:16;92388:9;92296:117;;;;;;;;;;;;:::i;:::-;;;;;;;;92240:185;92511:1;92490:23;;:9;:23;;;;:50;;;;;92530:10;92517:23;;:9;:23;;;;92490:50;92486:294;;;92557:23;92619:3;92596:19;;92584:9;:31;;;;:::i;:::-;92583:39;;;;:::i;:::-;92557:65;;92667:15;92637;:26;92653:9;92637:26;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;92710:15;92697:28;;;;;:::i;:::-;;;92542:238;92486:294;92859:9;92820:15;:35;92836:18;;;;;;;;;;;92820:35;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;92922:9;92891:15;:27;92907:10;;;;;;;;;;;92891:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;93036:6;93010:14;:22;93025:6;93010:22;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;93053:29;93063:10;93075:6;93053:9;:29::i;:::-;93111:10;93098:51;;;93123:6;93131;93139:9;93098:51;;;;;;;;:::i;:::-;;;;;;;;93202:14;93231:16;93219:9;:28;;;;:::i;:::-;93202:45;;93271:1;93262:6;:10;93258:79;;;93297:10;93289:28;;:36;93318:6;93289:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93258:79;90690:2654;;;;90507:2837;;;:::o;79971:25::-;;;;;;;;;;;;;:::o;59288:193::-;59434:39;59451:4;59457:2;59461:7;59434:39;;;;;;;;;;;;:16;:39::i;:::-;59288:193;;;:::o;80607:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80452:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;97872:210::-;25342:13;:11;:13::i;:::-;97956:10:::1;97946:7;:20;;;;;;:::i;:::-;;98005:17;98002:1;97982:41;;;;;;;;;;97872:210:::0;:::o;47630:152::-;47702:7;47745:27;47764:7;47745:18;:27::i;:::-;47722:52;;47630:152;;;:::o;79943:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43172:233::-;43244:7;43285:1;43268:19;;:5;:19;;;43264:60;;43296:28;;;;;;;;;;;;;;43264:60;37331:13;43342:18;:25;43361:5;43342:25;;;;;;;;;;;;;;;;:55;43335:62;;43172:233;;;:::o;26131:103::-;25342:13;:11;:13::i;:::-;26196:30:::1;26223:1;26196:18;:30::i;:::-;26131:103::o:0;86735:181::-;25342:13;:11;:13::i;:::-;86889:19:::1;86857:16;:29;86874:11;86857:29;;;;;;;;;;;:51;;;;86735:181:::0;;:::o;80385:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25456:87::-;25502:7;25529:6;;;;;;;;;;;25522:13;;25456:87;:::o;98187:728::-;25342:13;:11;:13::i;:::-;98287:1:::1;98248:15;:35;98264:18;;;;;;;;;;;98248:35;;;;;;;;;;;;;;;;:40;98244:138;;98312:58;;;;;;;;;;:::i;:::-;;;;;;;;98244:138;98392:19;98414:15;:35;98430:18;;;;;;;;;;;98414:35;;;;;;;;;;;;;;;;98392:57;;98460:11;98474:15;:27;98490:10;;;;;;;;;;;98474:27;;;;;;;;;;;;;;;;98460:41;;98552:1;98514:15;:35;98530:18;;;;;;;;;;;98514:35;;;;;;;;;;;;;;;:39;;;;98594:1;98564:15;:27;98580:10;;;;;;;;;;;98564:27;;;;;;;;;;;;;;;:31;;;;98609:13;98636:18;;;;;;;;;;;98628:32;;98682:11;98628:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98608:100;;;98720:13;98747:10;;;;;;;;;;;98739:24;;98771:3;98739:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98719:60;;;98797:8;98796:9;:22;;;;;98810:8;98809:9;98796:22;98792:116;;;98842:54;;;;;;;;;;:::i;:::-;;;;;;;;98792:116;98233:682;;;;98187:728::o:0;80079:34::-;;;;:::o;46413:104::-;46469:13;46502:7;46495:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46413:104;:::o;53286:234::-;53433:8;53381:18;:39;53400:19;:17;:19::i;:::-;53381:39;;;;;;;;;;;;;;;:49;53421:8;53381:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;53493:8;53457:55;;53472:19;:17;:19::i;:::-;53457:55;;;53503:8;53457:55;;;;;;:::i;:::-;;;;;;;;53286:234;;:::o;93586:3550::-;93468:42;93765:61;;;93845:10;93874:5;93906:4;93765:182;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93746:266;;93994:5;93981:19;;;;;;;;;;;:::i;:::-;;;;;;;;93746:266;94063:8;;;;;;;;;;;94058:63;;94095:14;;;;;;;;;;;;;;94058:63;94151:8;;;;;;;;;;;:34;;;;;94164:13;:21;94178:6;94164:21;;;;;;;;;;;;;;;;;;;;;94163:22;94151:34;94147:107;;;94234:6;94209:33;;;;;;;;;;;:::i;:::-;;;;;;;;94147:107;94279:1;94269:6;:11;94265:523;;94327:5;94301:31;;:7;:15;94309:6;94301:15;;;;;;;;;;;:22;94317:5;94301:22;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;94297:124;;94382:5;94397:6;94360:45;;;;;;;;;;;;:::i;:::-;;;;;;;;94297:124;94491:21;:29;94513:6;94491:29;;;;;;;;;;;;94482:6;94457:14;:22;94472:6;94457:22;;;;;;;;;;;;:31;;;;:::i;:::-;:63;94435:342;;;94622:6;94719:14;:22;94734:6;94719:22;;;;;;;;;;;;94662:21;:29;94684:6;94662:29;;;;;;;;;;;;:79;;;;:::i;:::-;94562:199;;;;;;;;;;;;:::i;:::-;;;;;;;;94435:342;94265:523;94882:16;:24;94899:6;94882:24;;;;;;;;;;;;94854:25;94868:10;94854:13;:25::i;:::-;94845:6;:34;;;;:::i;:::-;:61;94841:253;;;94980:6;95041:25;95055:10;95041:13;:25::i;:::-;95014:16;:24;95031:6;95014:24;;;;;;;;;;;;:52;;;;:::i;:::-;94930:152;;;;;;;;;;;;:::i;:::-;;;;;;;;94841:253;95196:16;:24;95213:6;95196:24;;;;;;;;;;;;95164:22;:29;95187:5;95164:29;;;;;;;;;;;;;;;;95155:6;:38;;;;:::i;:::-;:65;95151:261;;;95294:6;95355:22;:29;95378:5;95355:29;;;;;;;;;;;;;;;;95328:16;:24;95345:6;95328:24;;;;;;;;;;;;:56;;;;:::i;:::-;95244:156;;;;;;;;;;;;:::i;:::-;;;;;;;;95151:261;95453:9;;95444:6;95428:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;95424:198;;;95533:6;95581:13;:11;:13::i;:::-;95569:9;;:25;;;;:::i;:::-;95486:124;;;;;;;;;;;;:::i;:::-;;;;;;;;95424:198;95669:17;95709:6;95689:9;:17;95699:6;95689:17;;;;;;;;;;;;:26;;;;:::i;:::-;95669:46;;95726:17;95804:6;95786:15;;:24;;;;:::i;:::-;95765:3;95760:1;95748:9;:13;;;;:::i;:::-;95747:21;;;;:::i;:::-;95746:65;;;;:::i;:::-;95726:85;;95837:24;95876:9;95864;:21;;;;:::i;:::-;95837:48;;95914:16;95902:9;:28;95898:185;;;96001:16;96046:9;95954:117;;;;;;;;;;;;:::i;:::-;;;;;;;;95898:185;96185:1;96164:23;;:9;:23;;;;:50;;;;;96204:10;96191:23;;:9;:23;;;;96164:50;:72;;;;;96231:5;96218:18;;:9;:18;;;;96164:72;96160:348;;;96261:23;96323:3;96300:19;;96288:9;:31;;;;:::i;:::-;96287:39;;;;:::i;:::-;96261:65;;96379:15;96349;:26;96365:9;96349:26;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;96430:15;96417:28;;;;;:::i;:::-;;;96238:270;96160:348;96588:9;96549:15;:35;96565:18;;;;;;;;;;;96549:35;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;96651:9;96620:15;:27;96636:10;;;;;;;;;;;96620:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;96763:6;96737:14;:22;96752:6;96737:22;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;96813:6;96780:22;:29;96803:5;96780:29;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;96830:29;96840:10;96852:6;96830:9;:29::i;:::-;96903:10;96875:66;;96896:5;96875:66;;;96915:6;96923;96931:9;96875:66;;;;;;;;:::i;:::-;;;;;;;;96994:14;97023:16;97011:9;:28;;;;:::i;:::-;96994:45;;97063:1;97054:6;:10;97050:79;;;97089:10;97081:28;;:36;97110:6;97081:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97050:79;93735:3401;;;;93586:3550;;;;:::o;98994:571::-;99058:10;;;;;;;;;;;99044:24;;:10;:24;;;99040:98;;99114:10;99092:34;;;;;;;;;;;:::i;:::-;;;;;;;;99040:98;99183:1;99152:15;:27;99168:10;;;;;;;;;;;99152:27;;;;;;;;;;;;;;;;:32;99148:130;;99208:58;;;;;;;;;;:::i;:::-;;;;;;;;99148:130;99290:11;99304:15;:27;99320:10;;;;;;;;;;;99304:27;;;;;;;;;;;;;;;;99290:41;;99372:1;99342:15;:27;99358:10;;;;;;;;;;;99342:27;;;;;;;;;;;;;;;:31;;;;99387:12;99413:10;;;;;;;;;;;99405:24;;99437:3;99405:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99386:59;;;99461:7;99456:102;;99492:54;;;;;;;;;;:::i;:::-;;;;;;;;99456:102;99029:536;;98994:571::o;97502:264::-;25342:13;:11;:13::i;:::-;97585:6:::1;97573:18;;:8;;;;;;;;;;;:18;;::::0;97569:162:::1;;97615:104;;;;;;;;;;:::i;:::-;;;;;;;;97569:162;97752:6;97741:8;;:17;;;;;;;;;;;;;;;;;;97502:264:::0;:::o;80003:33::-;;;;;;;;;;;;;:::o;86156:347::-;25342:13;:11;:13::i;:::-;86348:25:::1;86366:6;86348:17;:25::i;:::-;86343:105;;86428:6;86397:39;;;;;;;;;;;:::i;:::-;;;;;;;;86343:105;86482:13;86458;:21;86472:6;86458:21;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;86156:347:::0;;:::o;60079:407::-;60254:31;60267:4;60273:2;60277:7;60254:12;:31::i;:::-;60318:1;60300:2;:14;;;:19;60296:183;;60339:56;60370:4;60376:2;60380:7;60389:5;60339:30;:56::i;:::-;60334:145;;60423:40;;;;;;;;;;;;;;60334:145;60296:183;60079:407;;;;:::o;89636:600::-;89692:24;89719:15;:27;89735:10;89719:27;;;;;;;;;;;;;;;;89692:54;;89780:1;89761:16;:20;89757:110;;;89805:50;;;;;;;;;;:::i;:::-;;;;;;;;89757:110;89973:1;89943:15;:27;89959:10;89943:27;;;;;;;;;;;;;;;:31;;;;90019:12;90045:10;90037:24;;90069:16;90037:77;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90018:96;;;90132:7;90127:102;;90163:54;;;;;;;;;;:::i;:::-;;;;;;;;90127:102;89681:555;;89636:600::o;87015:443::-;25342:13;:11;:13::i;:::-;87270:25:::1;87288:6;87270:17;:25::i;:::-;87265:89;;87312:30;87335:6;87312:22;:30::i;:::-;87265:89;87384:12;87364:9;:17;87374:6;87364:17;;;;;;;;;;;:32;;;;87429:6;87412:38;87437:12;87412:38;;;;;;:::i;:::-;;;;;;;;87015:443:::0;;:::o;46623:318::-;46696:13;46727:16;46735:7;46727;:16::i;:::-;46722:59;;46752:29;;;;;;;;;;;;;;46722:59;46794:21;46818:10;:8;:10::i;:::-;46794:34;;46871:1;46852:7;46846:21;:26;:87;;;;;;;;;;;;;;;;;46899:7;46908:18;46918:7;46908:9;:18::i;:::-;46882:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46846:87;46839:94;;;46623:318;;;:::o;80505:31::-;;;;:::o;79871:30::-;;;;:::o;79840:24::-;;;;:::o;87654:1408::-;25342:13;:11;:13::i;:::-;87825:7:::1;:14;87804:10;:17;:35;87800:176;;87863:101;;;;;;;;;;:::i;:::-;;;;;;;;87800:176;87988:19;88022:22:::0;88064:9:::1;88059:247;88083:7;:14;88079:1;:18;88059:247;;;88167:7;88175:1;88167:10;;;;;;;;:::i;:::-;;;;;;;;88160:3;88154:2;88136:15;;:20;;;;:::i;:::-;88135:28;;;;:::i;:::-;88134:43;;;;:::i;:::-;88119:58;;;;;:::i;:::-;;;88252:7;88260:1;88252:10;;;;;;;;:::i;:::-;;;;;;;;88234:28;;;;;:::i;:::-;;;88099:3;;;;;;;88059:247;;;;88334:11;88322:9;:23;88318:169;;;88369:106;;;;;;;;;;:::i;:::-;;;;;;;;88318:169;88536:9;;88519:14;88503:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:42;88499:138;;;88569:56;;;;;;;;;;:::i;:::-;;;;;;;;88499:138;88680:11;88649:15;:27;88665:10;;;;;;;;;;;88649:27;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;88740:9;88735:138;88759:10;:17;88755:1;:21;88735:138;;;88798:36;88808:10;88819:1;88808:13;;;;;;;;:::i;:::-;;;;;;;;88823:7;88831:1;88823:10;;;;;;;;:::i;:::-;;;;;;;;88798:9;:36::i;:::-;88778:3;;;;;;;88735:138;;;;88925:14;88954:11;88942:9;:23;;;;:::i;:::-;88925:40;;88989:1;88980:6;:10;88976:79;;;89015:10;89007:28;;:36;89036:6;89007:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;88976:79;87789:1273;;;87654:1408:::0;;:::o;80327:49::-;;;;;;;;;;;;;;;;;:::o;80211:44::-;;;;;;;;;;;;;;;;;:::o;79908:28::-;;;;;;;;;;;;;:::o;53677:164::-;53774:4;53798:18;:25;53817:5;53798:25;;;;;;;;;;;;;;;:35;53824:8;53798:35;;;;;;;;;;;;;;;;;;;;;;;;;53791:42;;53677:164;;;;:::o;26389:220::-;25342:13;:11;:13::i;:::-;26494:1:::1;26474:22;;:8;:22;;::::0;26470:93:::1;;26548:1;26520:31;;;;;;;;;;;:::i;:::-;;;;;;;;26470:93;26573:28;26592:8;26573:18;:28::i;:::-;26389:220:::0;:::o;89390:157::-;25342:13;:11;:13::i;:::-;89522:17:::1;89500:19;:39;;;;89390:157:::0;:::o;99796:114::-;99848:7;99875:15;:27;99891:10;99875:27;;;;;;;;;;;;;;;;99868:34;;99796:114;:::o;19668:215::-;19770:4;19809:26;19794:41;;;:11;:41;;;;:81;;;;19839:36;19863:11;19839:23;:36::i;:::-;19794:81;19787:88;;19668:215;;;:::o;54099:282::-;54164:4;54220:7;54201:15;:13;:15::i;:::-;:26;;:66;;;;;54254:13;;54244:7;:23;54201:66;:153;;;;;54353:1;38107:8;54305:17;:26;54323:7;54305:26;;;;;;;;;;;;:44;:49;54201:153;54181:173;;54099:282;;;:::o;76407:105::-;76467:7;76494:10;76487:17;;76407:105;:::o;25621:166::-;25692:12;:10;:12::i;:::-;25681:23;;:7;:5;:7::i;:::-;:23;;;25677:103;;25755:12;:10;:12::i;:::-;25728:40;;;;;;;;;;;:::i;:::-;;;;;;;;25677:103;25621:166::o;83500:273::-;83565:4;83587:9;83599:1;83587:13;;83582:161;83606:16;:23;;;;83602:1;:27;83582:161;;;83678:6;83655:16;83672:1;83655:19;;;;;;;;:::i;:::-;;;;;;;;;;:29;83651:81;;83712:4;83705:11;;;;;83651:81;83631:3;;;;;;;83582:161;;;;83760:5;83753:12;;83500:273;;;;:::o;83225:267::-;83313:1;83293:9;:17;83303:6;83293:17;;;;;;;;;;;:21;;;;83352:1;83325:16;:24;83342:6;83325:24;;;;;;;;;;;:28;;;;83396:1;83364:21;:29;83386:6;83364:29;;;;;;;;;;;:33;;;;83433:1;83408:14;:22;83423:6;83408:22;;;;;;;;;;;:26;;;;83445:16;83467:6;83445:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83225:267;:::o;99991:101::-;100056:7;100083:1;100076:8;;99991:101;:::o;48785:1275::-;48852:7;48872:12;48887:7;48872:22;;48955:4;48936:15;:13;:15::i;:::-;:23;48932:1061;;48989:13;;48982:4;:20;48978:1015;;;49027:14;49044:17;:23;49062:4;49044:23;;;;;;;;;;;;49027:40;;49161:1;38107:8;49133:6;:24;:29;49129:845;;49798:113;49815:1;49805:6;:11;49798:113;;49858:17;:25;49876:6;;;;;;;49858:25;;;;;;;;;;;;49849:34;;49798:113;;;49944:6;49937:13;;;;;;49129:845;49004:989;48978:1015;48932:1061;50021:31;;;;;;;;;;;;;;48785:1275;;;;:::o;55262:485::-;55364:27;55393:23;55434:38;55475:15;:24;55491:7;55475:24;;;;;;;;;;;55434:65;;55652:18;55629:41;;55709:19;55703:26;55684:45;;55614:126;55262:485;;;:::o;54490:659::-;54639:11;54804:16;54797:5;54793:28;54784:37;;54964:16;54953:9;54949:32;54936:45;;55114:15;55103:9;55100:30;55092:5;55081:9;55078:20;55075:56;55065:66;;54490:659;;;;;:::o;61148:159::-;;;;;:::o;75716:311::-;75851:7;75871:16;38511:3;75897:19;:41;;75871:68;;38511:3;75965:31;75976:4;75982:2;75986:9;75965:10;:31::i;:::-;75957:40;;:62;;75950:69;;;75716:311;;;;;:::o;50608:450::-;50688:14;50856:16;50849:5;50845:28;50836:37;;51033:5;51019:11;50994:23;50990:41;50987:52;50980:5;50977:63;50967:73;;50608:450;;;;:::o;61972:158::-;;;;;:::o;20649:97::-;20707:6;20733:5;20726:12;;20649:97;:::o;43487:178::-;43548:7;37331:13;37469:2;43576:18;:25;43595:5;43576:25;;;;;;;;;;;;;;;;:50;;43575:82;43568:89;;43487:178;;;:::o;70239:112::-;70316:27;70326:2;70330:8;70316:27;;;;;;;;;;;;:9;:27::i;:::-;70239:112;;:::o;26769:191::-;26843:16;26862:6;;;;;;;;;;;26843:25;;26888:8;26879:6;;:17;;;;;;;;;;;;;;;;;;26943:8;26912:40;;26933:8;26912:40;;;;;;;;;;;;26832:128;26769:191;:::o;62570:716::-;62733:4;62779:2;62754:45;;;62800:19;:17;:19::i;:::-;62821:4;62827:7;62836:5;62754:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62750:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63054:1;63037:6;:13;:18;63033:235;;63083:40;;;;;;;;;;;;;;63033:235;63226:6;63220:13;63211:6;63207:2;63203:15;63196:38;62750:529;62923:54;;;62913:64;;;:6;:64;;;;62906:71;;;62570:716;;;;;;:::o;99626:100::-;99678:13;99711:7;99704:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99626:100;:::o;76614:1745::-;76679:17;77113:4;77106;77100:11;77096:22;77205:1;77199:4;77192:15;77280:4;77277:1;77273:12;77266:19;;77362:1;77357:3;77350:14;77466:3;77705:5;77687:428;77713:1;77687:428;;;77753:1;77748:3;77744:11;77737:18;;77924:2;77918:4;77914:13;77910:2;77906:22;77901:3;77893:36;78018:2;78012:4;78008:13;78000:21;;78085:4;77687:428;78075:25;77687:428;77691:21;78154:3;78149;78145:13;78269:4;78264:3;78260:14;78253:21;;78334:6;78329:3;78322:19;76718:1634;;;76614:1745;;;:::o;16577:148::-;16653:4;16692:25;16677:40;;;:11;:40;;;;16670:47;;16577:148;;;:::o;23465:98::-;23518:7;23545:10;23538:17;;23465:98;:::o;75417:147::-;75554:6;75417:147;;;;;:::o;69466:689::-;69597:19;69603:2;69607:8;69597:5;:19::i;:::-;69676:1;69658:2;:14;;;:19;69654:483;;69698:11;69712:13;;69698:27;;69744:13;69766:8;69760:3;:14;69744:30;;69793:233;69824:62;69863:1;69867:2;69871:7;;;;;;69880:5;69824:30;:62::i;:::-;69819:167;;69922:40;;;;;;;;;;;;;;69819:167;70021:3;70013:5;:11;69793:233;;70108:3;70091:13;;:20;70087:34;;70113:8;;;70087:34;69679:458;;69654:483;69466:689;;;:::o;63748:2966::-;63821:20;63844:13;;63821:36;;63884:1;63872:8;:13;63868:44;;63894:18;;;;;;;;;;;;;;63868:44;63925:61;63955:1;63959:2;63963:12;63977:8;63925:21;:61::i;:::-;64469:1;37469:2;64439:1;:26;;64438:32;64426:8;:45;64400:18;:22;64419:2;64400:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;64748:139;64785:2;64839:33;64862:1;64866:2;64870:1;64839:14;:33::i;:::-;64806:30;64827:8;64806:20;:30::i;:::-;:66;64748:18;:139::i;:::-;64714:17;:31;64732:12;64714:31;;;;;;;;;;;:173;;;;64904:16;64935:11;64964:8;64949:12;:23;64935:37;;65485:16;65481:2;65477:25;65465:37;;65857:12;65817:8;65776:1;65714:25;65655:1;65594;65567:335;66228:1;66214:12;66210:20;66168:346;66269:3;66260:7;66257:16;66168:346;;66487:7;66477:8;66474:1;66447:25;66444:1;66441;66436:59;66322:1;66313:7;66309:15;66298:26;;66168:346;;;66172:77;66559:1;66547:8;:13;66543:45;;66569:19;;;;;;;;;;;;;;66543:45;66621:3;66605:13;:19;;;;64174:2462;;66646:60;66675:1;66679:2;66683:12;66697:8;66646:20;:60::i;:::-;63810:2904;63748:2966;;:::o;51160:324::-;51230:14;51463:1;51453:8;51450:15;51424:24;51420:46;51410:56;;51160: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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:::-;4958:6;4966;5015:2;5003:9;4994:7;4990:23;4986:32;4983:119;;;5021:79;;:::i;:::-;4983:119;5141:1;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5112:117;5268:2;5294:53;5339:7;5330:6;5319:9;5315:22;5294:53;:::i;:::-;5284:63;;5239:118;4890:474;;;;;:::o;5370:118::-;5457:24;5475:5;5457:24;:::i;:::-;5452:3;5445:37;5370:118;;:::o;5494:222::-;5587:4;5625:2;5614:9;5610:18;5602:26;;5638:71;5706:1;5695:9;5691:17;5682:6;5638:71;:::i;:::-;5494:222;;;;:::o;5722:117::-;5831:1;5828;5821:12;5845:180;5893:77;5890:1;5883:88;5990:4;5987:1;5980:15;6014:4;6011:1;6004:15;6031:281;6114:27;6136:4;6114:27;:::i;:::-;6106:6;6102:40;6244:6;6232:10;6229:22;6208:18;6196:10;6193:34;6190:62;6187:88;;;6255:18;;:::i;:::-;6187:88;6295:10;6291:2;6284:22;6074:238;6031:281;;:::o;6318:129::-;6352:6;6379:20;;:::i;:::-;6369:30;;6408:33;6436:4;6428:6;6408:33;:::i;:::-;6318:129;;;:::o;6453:311::-;6530:4;6620:18;6612:6;6609:30;6606:56;;;6642:18;;:::i;:::-;6606:56;6692:4;6684:6;6680:17;6672:25;;6752:4;6746;6742:15;6734:23;;6453:311;;;:::o;6770:117::-;6879:1;6876;6869:12;6910:710;7006:5;7031:81;7047:64;7104:6;7047:64;:::i;:::-;7031:81;:::i;:::-;7022:90;;7132:5;7161:6;7154:5;7147:21;7195:4;7188:5;7184:16;7177:23;;7248:4;7240:6;7236:17;7228:6;7224:30;7277:3;7269:6;7266:15;7263:122;;;7296:79;;:::i;:::-;7263:122;7411:6;7394:220;7428:6;7423:3;7420:15;7394:220;;;7503:3;7532:37;7565:3;7553:10;7532:37;:::i;:::-;7527:3;7520:50;7599:4;7594:3;7590:14;7583:21;;7470:144;7454:4;7449:3;7445:14;7438:21;;7394:220;;;7398:21;7012:608;;6910:710;;;;;:::o;7643:370::-;7714:5;7763:3;7756:4;7748:6;7744:17;7740:27;7730:122;;7771:79;;:::i;:::-;7730:122;7888:6;7875:20;7913:94;8003:3;7995:6;7988:4;7980:6;7976:17;7913:94;:::i;:::-;7904:103;;7720:293;7643:370;;;;:::o;8019:684::-;8112:6;8120;8169:2;8157:9;8148:7;8144:23;8140:32;8137:119;;;8175:79;;:::i;:::-;8137:119;8323:1;8312:9;8308:17;8295:31;8353:18;8345:6;8342:30;8339:117;;;8375:79;;:::i;:::-;8339:117;8480:78;8550:7;8541:6;8530:9;8526:22;8480:78;:::i;:::-;8470:88;;8266:302;8607:2;8633:53;8678:7;8669:6;8658:9;8654:22;8633:53;:::i;:::-;8623:63;;8578:118;8019:684;;;;;:::o;8709:619::-;8786:6;8794;8802;8851:2;8839:9;8830:7;8826:23;8822:32;8819:119;;;8857:79;;:::i;:::-;8819:119;8977:1;9002:53;9047:7;9038:6;9027:9;9023:22;9002:53;:::i;:::-;8992:63;;8948:117;9104:2;9130:53;9175:7;9166:6;9155:9;9151:22;9130:53;:::i;:::-;9120:63;;9075:118;9232:2;9258:53;9303:7;9294:6;9283:9;9279:22;9258:53;:::i;:::-;9248:63;;9203:118;8709:619;;;;;:::o;9334:332::-;9455:4;9493:2;9482:9;9478:18;9470:26;;9506:71;9574:1;9563:9;9559:17;9550:6;9506:71;:::i;:::-;9587:72;9655:2;9644:9;9640:18;9631:6;9587:72;:::i;:::-;9334:332;;;;;:::o;9672:619::-;9749:6;9757;9765;9814:2;9802:9;9793:7;9789:23;9785:32;9782:119;;;9820:79;;:::i;:::-;9782:119;9940:1;9965:53;10010:7;10001:6;9990:9;9986:22;9965:53;:::i;:::-;9955:63;;9911:117;10067:2;10093:53;10138:7;10129:6;10118:9;10114:22;10093:53;:::i;:::-;10083:63;;10038:118;10195:2;10221:53;10266:7;10257:6;10246:9;10242:22;10221:53;:::i;:::-;10211:63;;10166:118;9672:619;;;;;:::o;10297:117::-;10406:1;10403;10396:12;10420:308;10482:4;10572:18;10564:6;10561:30;10558:56;;;10594:18;;:::i;:::-;10558:56;10632:29;10654:6;10632:29;:::i;:::-;10624:37;;10716:4;10710;10706:15;10698:23;;10420:308;;;:::o;10734:146::-;10831:6;10826:3;10821;10808:30;10872:1;10863:6;10858:3;10854:16;10847:27;10734:146;;;:::o;10886:425::-;10964:5;10989:66;11005:49;11047:6;11005:49;:::i;:::-;10989:66;:::i;:::-;10980:75;;11078:6;11071:5;11064:21;11116:4;11109:5;11105:16;11154:3;11145:6;11140:3;11136:16;11133:25;11130:112;;;11161:79;;:::i;:::-;11130:112;11251:54;11298:6;11293:3;11288;11251:54;:::i;:::-;10970:341;10886:425;;;;;:::o;11331:340::-;11387:5;11436:3;11429:4;11421:6;11417:17;11413:27;11403:122;;11444:79;;:::i;:::-;11403:122;11561:6;11548:20;11586:79;11661:3;11653:6;11646:4;11638:6;11634:17;11586:79;:::i;:::-;11577:88;;11393:278;11331:340;;;;:::o;11677:509::-;11746:6;11795:2;11783:9;11774:7;11770:23;11766:32;11763:119;;;11801:79;;:::i;:::-;11763:119;11949:1;11938:9;11934:17;11921:31;11979:18;11971:6;11968:30;11965:117;;;12001:79;;:::i;:::-;11965:117;12106:63;12161:7;12152:6;12141:9;12137:22;12106:63;:::i;:::-;12096:73;;11892:287;11677:509;;;;:::o;12192:329::-;12251:6;12300:2;12288:9;12279:7;12275:23;12271:32;12268:119;;;12306:79;;:::i;:::-;12268:119;12426:1;12451:53;12496:7;12487:6;12476:9;12472:22;12451:53;:::i;:::-;12441:63;;12397:117;12192:329;;;;:::o;12527:474::-;12595:6;12603;12652:2;12640:9;12631:7;12627:23;12623:32;12620:119;;;12658:79;;:::i;:::-;12620:119;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;12527:474;;;;;:::o;13007:116::-;13077:21;13092:5;13077:21;:::i;:::-;13070:5;13067:32;13057:60;;13113:1;13110;13103:12;13057:60;13007:116;:::o;13129:133::-;13172:5;13210:6;13197:20;13188:29;;13226:30;13250:5;13226:30;:::i;:::-;13129:133;;;;:::o;13268:468::-;13333:6;13341;13390:2;13378:9;13369:7;13365:23;13361:32;13358:119;;;13396:79;;:::i;:::-;13358:119;13516:1;13541:53;13586:7;13577:6;13566:9;13562:22;13541:53;:::i;:::-;13531:63;;13487:117;13643:2;13669:50;13711:7;13702:6;13691:9;13687:22;13669:50;:::i;:::-;13659:60;;13614:115;13268:468;;;;;:::o;13742:765::-;13828:6;13836;13844;13852;13901:3;13889:9;13880:7;13876:23;13872:33;13869:120;;;13908:79;;:::i;:::-;13869:120;14028:1;14053:53;14098:7;14089:6;14078:9;14074:22;14053:53;:::i;:::-;14043:63;;13999:117;14155:2;14181:53;14226:7;14217:6;14206:9;14202:22;14181:53;:::i;:::-;14171:63;;14126:118;14283:2;14309:53;14354:7;14345:6;14334:9;14330:22;14309:53;:::i;:::-;14299:63;;14254:118;14411:2;14437:53;14482:7;14473:6;14462:9;14458:22;14437:53;:::i;:::-;14427:63;;14382:118;13742:765;;;;;;;:::o;14513:323::-;14569:6;14618:2;14606:9;14597:7;14593:23;14589:32;14586:119;;;14624:79;;:::i;:::-;14586:119;14744:1;14769:50;14811:7;14802:6;14791:9;14787:22;14769:50;:::i;:::-;14759:60;;14715:114;14513:323;;;;:::o;14842:468::-;14907:6;14915;14964:2;14952:9;14943:7;14939:23;14935:32;14932:119;;;14970:79;;:::i;:::-;14932:119;15090:1;15115:50;15157:7;15148:6;15137:9;15133:22;15115:50;:::i;:::-;15105:60;;15061:114;15214:2;15240:53;15285:7;15276:6;15265:9;15261:22;15240:53;:::i;:::-;15230:63;;15185:118;14842:468;;;;;:::o;15316:307::-;15377:4;15467:18;15459:6;15456:30;15453:56;;;15489:18;;:::i;:::-;15453:56;15527:29;15549:6;15527:29;:::i;:::-;15519:37;;15611:4;15605;15601:15;15593:23;;15316:307;;;:::o;15629:423::-;15706:5;15731:65;15747:48;15788:6;15747:48;:::i;:::-;15731:65;:::i;:::-;15722:74;;15819:6;15812:5;15805:21;15857:4;15850:5;15846:16;15895:3;15886:6;15881:3;15877:16;15874:25;15871:112;;;15902:79;;:::i;:::-;15871:112;15992:54;16039:6;16034:3;16029;15992:54;:::i;:::-;15712:340;15629:423;;;;;:::o;16071:338::-;16126:5;16175:3;16168:4;16160:6;16156:17;16152:27;16142:122;;16183:79;;:::i;:::-;16142:122;16300:6;16287:20;16325:78;16399:3;16391:6;16384:4;16376:6;16372:17;16325:78;:::i;:::-;16316:87;;16132:277;16071:338;;;;:::o;16415:943::-;16510:6;16518;16526;16534;16583:3;16571:9;16562:7;16558:23;16554:33;16551:120;;;16590:79;;:::i;:::-;16551:120;16710:1;16735:53;16780:7;16771:6;16760:9;16756:22;16735:53;:::i;:::-;16725:63;;16681:117;16837:2;16863:53;16908:7;16899:6;16888:9;16884:22;16863:53;:::i;:::-;16853:63;;16808:118;16965:2;16991:53;17036:7;17027:6;17016:9;17012:22;16991:53;:::i;:::-;16981:63;;16936:118;17121:2;17110:9;17106:18;17093:32;17152:18;17144:6;17141:30;17138:117;;;17174:79;;:::i;:::-;17138:117;17279:62;17333:7;17324:6;17313:9;17309:22;17279:62;:::i;:::-;17269:72;;17064:287;16415:943;;;;;;;:::o;17364:311::-;17441:4;17531:18;17523:6;17520:30;17517:56;;;17553:18;;:::i;:::-;17517:56;17603:4;17595:6;17591:17;17583:25;;17663:4;17657;17653:15;17645:23;;17364:311;;;:::o;17698:710::-;17794:5;17819:81;17835:64;17892:6;17835:64;:::i;:::-;17819:81;:::i;:::-;17810:90;;17920:5;17949:6;17942:5;17935:21;17983:4;17976:5;17972:16;17965:23;;18036:4;18028:6;18024:17;18016:6;18012:30;18065:3;18057:6;18054:15;18051:122;;;18084:79;;:::i;:::-;18051:122;18199:6;18182:220;18216:6;18211:3;18208:15;18182:220;;;18291:3;18320:37;18353:3;18341:10;18320:37;:::i;:::-;18315:3;18308:50;18387:4;18382:3;18378:14;18371:21;;18258:144;18242:4;18237:3;18233:14;18226:21;;18182:220;;;18186:21;17800:608;;17698:710;;;;;:::o;18431:370::-;18502:5;18551:3;18544:4;18536:6;18532:17;18528:27;18518:122;;18559:79;;:::i;:::-;18518:122;18676:6;18663:20;18701:94;18791:3;18783:6;18776:4;18768:6;18764:17;18701:94;:::i;:::-;18692:103;;18508:293;18431:370;;;;:::o;18807:894::-;18925:6;18933;18982:2;18970:9;18961:7;18957:23;18953:32;18950:119;;;18988:79;;:::i;:::-;18950:119;19136:1;19125:9;19121:17;19108:31;19166:18;19158:6;19155:30;19152:117;;;19188:79;;:::i;:::-;19152:117;19293:78;19363:7;19354:6;19343:9;19339:22;19293:78;:::i;:::-;19283:88;;19079:302;19448:2;19437:9;19433:18;19420:32;19479:18;19471:6;19468:30;19465:117;;;19501:79;;:::i;:::-;19465:117;19606:78;19676:7;19667:6;19656:9;19652:22;19606:78;:::i;:::-;19596:88;;19391:303;18807:894;;;;;:::o;19707:474::-;19775:6;19783;19832:2;19820:9;19811:7;19807:23;19803:32;19800:119;;;19838:79;;:::i;:::-;19800:119;19958:1;19983:53;20028:7;20019:6;20008:9;20004:22;19983:53;:::i;:::-;19973:63;;19929:117;20085:2;20111:53;20156:7;20147:6;20136:9;20132:22;20111:53;:::i;:::-;20101:63;;20056:118;19707:474;;;;;:::o;20187:180::-;20235:77;20232:1;20225:88;20332:4;20329:1;20322:15;20356:4;20353:1;20346:15;20373:320;20417:6;20454:1;20448:4;20444:12;20434:22;;20501:1;20495:4;20491:12;20522:18;20512:81;;20578:4;20570:6;20566:17;20556:27;;20512:81;20640:2;20632:6;20629:14;20609:18;20606:38;20603:84;;20659:18;;:::i;:::-;20603:84;20424:269;20373:320;;;:::o;20699:180::-;20747:77;20744:1;20737:88;20844:4;20841:1;20834:15;20868:4;20865:1;20858:15;20885:180;20933:77;20930:1;20923:88;21030:4;21027:1;21020:15;21054:4;21051:1;21044:15;21071:191;21111:3;21130:20;21148:1;21130:20;:::i;:::-;21125:25;;21164:20;21182:1;21164:20;:::i;:::-;21159:25;;21207:1;21204;21200:9;21193:16;;21228:3;21225:1;21222:10;21219:36;;;21235:18;;:::i;:::-;21219:36;21071:191;;;;:::o;21268:234::-;21408:34;21404:1;21396:6;21392:14;21385:58;21477:17;21472:2;21464:6;21460:15;21453:42;21268:234;:::o;21508:366::-;21650:3;21671:67;21735:2;21730:3;21671:67;:::i;:::-;21664:74;;21747:93;21836:3;21747:93;:::i;:::-;21865:2;21860:3;21856:12;21849:19;;21508:366;;;:::o;21880:419::-;22046:4;22084:2;22073:9;22069:18;22061:26;;22133:9;22127:4;22123:20;22119:1;22108:9;22104:17;22097:47;22161:131;22287:4;22161:131;:::i;:::-;22153:139;;21880:419;;;:::o;22305:194::-;22345:4;22365:20;22383:1;22365:20;:::i;:::-;22360:25;;22399:20;22417:1;22399:20;:::i;:::-;22394:25;;22443:1;22440;22436:9;22428:17;;22467:1;22461:4;22458:11;22455:37;;;22472:18;;:::i;:::-;22455:37;22305:194;;;;:::o;22505:410::-;22545:7;22568:20;22586:1;22568:20;:::i;:::-;22563:25;;22602:20;22620:1;22602:20;:::i;:::-;22597:25;;22657:1;22654;22650:9;22679:30;22697:11;22679:30;:::i;:::-;22668:41;;22858:1;22849:7;22845:15;22842:1;22839:22;22819:1;22812:9;22792:83;22769:139;;22888:18;;:::i;:::-;22769:139;22553:362;22505:410;;;;:::o;22921:180::-;22969:77;22966:1;22959:88;23066:4;23063:1;23056:15;23090:4;23087:1;23080:15;23107:185;23147:1;23164:20;23182:1;23164:20;:::i;:::-;23159:25;;23198:20;23216:1;23198:20;:::i;:::-;23193:25;;23237:1;23227:35;;23242:18;;:::i;:::-;23227:35;23284:1;23281;23277:9;23272:14;;23107:185;;;;:::o;23298:332::-;23419:4;23457:2;23446:9;23442:18;23434:26;;23470:71;23538:1;23527:9;23523:17;23514:6;23470:71;:::i;:::-;23551:72;23619:2;23608:9;23604:18;23595:6;23551:72;:::i;:::-;23298:332;;;;;:::o;23636:442::-;23785:4;23823:2;23812:9;23808:18;23800:26;;23836:71;23904:1;23893:9;23889:17;23880:6;23836:71;:::i;:::-;23917:72;23985:2;23974:9;23970:18;23961:6;23917:72;:::i;:::-;23999;24067:2;24056:9;24052:18;24043:6;23999:72;:::i;:::-;23636:442;;;;;;:::o;24084:141::-;24133:4;24156:3;24148:11;;24179:3;24176:1;24169:14;24213:4;24210:1;24200:18;24192:26;;24084:141;;;:::o;24231:93::-;24268:6;24315:2;24310;24303:5;24299:14;24295:23;24285:33;;24231:93;;;:::o;24330:107::-;24374:8;24424:5;24418:4;24414:16;24393:37;;24330:107;;;;:::o;24443:393::-;24512:6;24562:1;24550:10;24546:18;24585:97;24615:66;24604:9;24585:97;:::i;:::-;24703:39;24733:8;24722:9;24703:39;:::i;:::-;24691:51;;24775:4;24771:9;24764:5;24760:21;24751:30;;24824:4;24814:8;24810:19;24803:5;24800:30;24790:40;;24519:317;;24443:393;;;;;:::o;24842:60::-;24870:3;24891:5;24884:12;;24842:60;;;:::o;24908:142::-;24958:9;24991:53;25009:34;25018:24;25036:5;25018:24;:::i;:::-;25009:34;:::i;:::-;24991:53;:::i;:::-;24978:66;;24908:142;;;:::o;25056:75::-;25099:3;25120:5;25113:12;;25056:75;;;:::o;25137:269::-;25247:39;25278:7;25247:39;:::i;:::-;25308:91;25357:41;25381:16;25357:41;:::i;:::-;25349:6;25342:4;25336:11;25308:91;:::i;:::-;25302:4;25295:105;25213:193;25137:269;;;:::o;25412:73::-;25457:3;25412:73;:::o;25491:189::-;25568:32;;:::i;:::-;25609:65;25667:6;25659;25653:4;25609:65;:::i;:::-;25544:136;25491:189;;:::o;25686:186::-;25746:120;25763:3;25756:5;25753:14;25746:120;;;25817:39;25854:1;25847:5;25817:39;:::i;:::-;25790:1;25783:5;25779:13;25770:22;;25746:120;;;25686:186;;:::o;25878:543::-;25979:2;25974:3;25971:11;25968:446;;;26013:38;26045:5;26013:38;:::i;:::-;26097:29;26115:10;26097:29;:::i;:::-;26087:8;26083:44;26280:2;26268:10;26265:18;26262:49;;;26301:8;26286:23;;26262:49;26324:80;26380:22;26398:3;26380:22;:::i;:::-;26370:8;26366:37;26353:11;26324:80;:::i;:::-;25983:431;;25968:446;25878:543;;;:::o;26427:117::-;26481:8;26531:5;26525:4;26521:16;26500:37;;26427:117;;;;:::o;26550:169::-;26594:6;26627:51;26675:1;26671:6;26663:5;26660:1;26656:13;26627:51;:::i;:::-;26623:56;26708:4;26702;26698:15;26688:25;;26601:118;26550:169;;;;:::o;26724:295::-;26800:4;26946:29;26971:3;26965:4;26946:29;:::i;:::-;26938:37;;27008:3;27005:1;27001:11;26995:4;26992:21;26984:29;;26724:295;;;;:::o;27024:1395::-;27141:37;27174:3;27141:37;:::i;:::-;27243:18;27235:6;27232:30;27229:56;;;27265:18;;:::i;:::-;27229:56;27309:38;27341:4;27335:11;27309:38;:::i;:::-;27394:67;27454:6;27446;27440:4;27394:67;:::i;:::-;27488:1;27512:4;27499:17;;27544:2;27536:6;27533:14;27561:1;27556:618;;;;28218:1;28235:6;28232:77;;;28284:9;28279:3;28275:19;28269:26;28260:35;;28232:77;28335:67;28395:6;28388:5;28335:67;:::i;:::-;28329:4;28322:81;28191:222;27526:887;;27556:618;27608:4;27604:9;27596:6;27592:22;27642:37;27674:4;27642:37;:::i;:::-;27701:1;27715:208;27729:7;27726:1;27723:14;27715:208;;;27808:9;27803:3;27799:19;27793:26;27785:6;27778:42;27859:1;27851:6;27847:14;27837:24;;27906:2;27895:9;27891:18;27878:31;;27752:4;27749:1;27745:12;27740:17;;27715:208;;;27951:6;27942:7;27939:19;27936:179;;;28009:9;28004:3;28000:19;27994:26;28052:48;28094:4;28086:6;28082:17;28071:9;28052:48;:::i;:::-;28044:6;28037:64;27959:156;27936:179;28161:1;28157;28149:6;28145:14;28141:22;28135:4;28128:36;27563:611;;;27526:887;;27116:1303;;;27024:1395;;:::o;28425:178::-;28565:30;28561:1;28553:6;28549:14;28542:54;28425:178;:::o;28609:366::-;28751:3;28772:67;28836:2;28831:3;28772:67;:::i;:::-;28765:74;;28848:93;28937:3;28848:93;:::i;:::-;28966:2;28961:3;28957:12;28950:19;;28609:366;;;:::o;28981:419::-;29147:4;29185:2;29174:9;29170:18;29162:26;;29234:9;29228:4;29224:20;29220:1;29209:9;29205:17;29198:47;29262:131;29388:4;29262:131;:::i;:::-;29254:139;;28981:419;;;:::o;29406:147::-;29507:11;29544:3;29529:18;;29406:147;;;;:::o;29559:114::-;;:::o;29679:398::-;29838:3;29859:83;29940:1;29935:3;29859:83;:::i;:::-;29852:90;;29951:93;30040:3;29951:93;:::i;:::-;30069:1;30064:3;30060:11;30053:18;;29679:398;;;:::o;30083:379::-;30267:3;30289:147;30432:3;30289:147;:::i;:::-;30282:154;;30453:3;30446:10;;30083:379;;;:::o;30468:174::-;30608:26;30604:1;30596:6;30592:14;30585:50;30468:174;:::o;30648:366::-;30790:3;30811:67;30875:2;30870:3;30811:67;:::i;:::-;30804:74;;30887:93;30976:3;30887:93;:::i;:::-;31005:2;31000:3;30996:12;30989:19;;30648:366;;;:::o;31020:419::-;31186:4;31224:2;31213:9;31209:18;31201:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31301:131;31427:4;31301:131;:::i;:::-;31293:139;;31020:419;;;:::o;31445:160::-;31596:2;31591:3;31584:15;31445:160;:::o;31611:679::-;31851:4;31889:3;31878:9;31874:19;31866:27;;31903:71;31971:1;31960:9;31956:17;31947:6;31903:71;:::i;:::-;31984:72;32052:2;32041:9;32037:18;32028:6;31984:72;:::i;:::-;32066;32134:2;32123:9;32119:18;32110:6;32066:72;:::i;:::-;32148:135;32279:2;32268:9;32264:18;32148:135;:::i;:::-;31611:679;;;;;;:::o;32296:137::-;32350:5;32381:6;32375:13;32366:22;;32397:30;32421:5;32397:30;:::i;:::-;32296:137;;;;:::o;32439:345::-;32506:6;32555:2;32543:9;32534:7;32530:23;32526:32;32523:119;;;32561:79;;:::i;:::-;32523:119;32681:1;32706:61;32759:7;32750:6;32739:9;32735:22;32706:61;:::i;:::-;32696:71;;32652:125;32439:345;;;;:::o;32790:229::-;32930:34;32926:1;32918:6;32914:14;32907:58;32999:12;32994:2;32986:6;32982:15;32975:37;32790:229;:::o;33025:366::-;33167:3;33188:67;33252:2;33247:3;33188:67;:::i;:::-;33181:74;;33264:93;33353:3;33264:93;:::i;:::-;33382:2;33377:3;33373:12;33366:19;;33025:366;;;:::o;33397:419::-;33563:4;33601:2;33590:9;33586:18;33578:26;;33650:9;33644:4;33640:20;33636:1;33625:9;33621:17;33614:47;33678:131;33804:4;33678:131;:::i;:::-;33670:139;;33397:419;;;:::o;33822:170::-;33962:22;33958:1;33950:6;33946:14;33939:46;33822:170;:::o;33998:366::-;34140:3;34161:67;34225:2;34220:3;34161:67;:::i;:::-;34154:74;;34237:93;34326:3;34237:93;:::i;:::-;34355:2;34350:3;34346:12;34339:19;;33998:366;;;:::o;34370:419::-;34536:4;34574:2;34563:9;34559:18;34551:26;;34623:9;34617:4;34613:20;34609:1;34598:9;34594:17;34587:47;34651:131;34777:4;34651:131;:::i;:::-;34643:139;;34370:419;;;:::o;34795:148::-;34897:11;34934:3;34919:18;;34795:148;;;;:::o;34949:390::-;35055:3;35083:39;35116:5;35083:39;:::i;:::-;35138:89;35220:6;35215:3;35138:89;:::i;:::-;35131:96;;35236:65;35294:6;35289:3;35282:4;35275:5;35271:16;35236:65;:::i;:::-;35326:6;35321:3;35317:16;35310:23;;35059:280;34949:390;;;;:::o;35345:435::-;35525:3;35547:95;35638:3;35629:6;35547:95;:::i;:::-;35540:102;;35659:95;35750:3;35741:6;35659:95;:::i;:::-;35652:102;;35771:3;35764:10;;35345:435;;;;;:::o;35786:226::-;35926:34;35922:1;35914:6;35910:14;35903:58;35995:9;35990:2;35982:6;35978:15;35971:34;35786:226;:::o;36018:366::-;36160:3;36181:67;36245:2;36240:3;36181:67;:::i;:::-;36174:74;;36257:93;36346:3;36257:93;:::i;:::-;36375:2;36370:3;36366:12;36359:19;;36018:366;;;:::o;36390:419::-;36556:4;36594:2;36583:9;36579:18;36571:26;;36643:9;36637:4;36633:20;36629:1;36618:9;36614:17;36607:47;36671:131;36797:4;36671:131;:::i;:::-;36663:139;;36390:419;;;:::o;36815:231::-;36955:34;36951:1;36943:6;36939:14;36932:58;37024:14;37019:2;37011:6;37007:15;37000:39;36815:231;:::o;37052:366::-;37194:3;37215:67;37279:2;37274:3;37215:67;:::i;:::-;37208:74;;37291:93;37380:3;37291:93;:::i;:::-;37409:2;37404:3;37400:12;37393:19;;37052:366;;;:::o;37424:419::-;37590:4;37628:2;37617:9;37613:18;37605:26;;37677:9;37671:4;37667:20;37663:1;37652:9;37648:17;37641:47;37705:131;37831:4;37705:131;:::i;:::-;37697:139;;37424:419;;;:::o;37849:176::-;37989:28;37985:1;37977:6;37973:14;37966:52;37849:176;:::o;38031:366::-;38173:3;38194:67;38258:2;38253:3;38194:67;:::i;:::-;38187:74;;38270:93;38359:3;38270:93;:::i;:::-;38388:2;38383:3;38379:12;38372:19;;38031:366;;;:::o;38403:419::-;38569:4;38607:2;38596:9;38592:18;38584:26;;38656:9;38650:4;38646:20;38642:1;38631:9;38627:17;38620:47;38684:131;38810:4;38684:131;:::i;:::-;38676:139;;38403:419;;;:::o;38828:98::-;38879:6;38913:5;38907:12;38897:22;;38828:98;;;:::o;38932:168::-;39015:11;39049:6;39044:3;39037:19;39089:4;39084:3;39080:14;39065:29;;38932:168;;;;:::o;39106:373::-;39192:3;39220:38;39252:5;39220:38;:::i;:::-;39274:70;39337:6;39332:3;39274:70;:::i;:::-;39267:77;;39353:65;39411:6;39406:3;39399:4;39392:5;39388:16;39353:65;:::i;:::-;39443:29;39465:6;39443:29;:::i;:::-;39438:3;39434:39;39427:46;;39196:283;39106:373;;;;:::o;39485:640::-;39680:4;39718:3;39707:9;39703:19;39695:27;;39732:71;39800:1;39789:9;39785:17;39776:6;39732:71;:::i;:::-;39813:72;39881:2;39870:9;39866:18;39857:6;39813:72;:::i;:::-;39895;39963:2;39952:9;39948:18;39939:6;39895:72;:::i;:::-;40014:9;40008:4;40004:20;39999:2;39988:9;39984:18;39977:48;40042:76;40113:4;40104:6;40042:76;:::i;:::-;40034:84;;39485:640;;;;;;;:::o;40131:141::-;40187:5;40218:6;40212:13;40203:22;;40234:32;40260:5;40234:32;:::i;:::-;40131:141;;;;:::o;40278:349::-;40347:6;40396:2;40384:9;40375:7;40371:23;40367:32;40364:119;;;40402:79;;:::i;:::-;40364:119;40522:1;40547:63;40602:7;40593:6;40582:9;40578:22;40547:63;:::i;:::-;40537:73;;40493:127;40278:349;;;;:::o
Swarm Source
ipfs://76429a93d38ec3c3f34e740c2dcb4ed29aca6eb8675795d0b0ff48b037c3b722
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.