More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 142 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17371522 | 563 days ago | IN | 0 ETH | 0.00162189 | ||||
Release | 15990656 | 757 days ago | IN | 0 ETH | 0.00141803 | ||||
Safe Transfer Fr... | 15968672 | 760 days ago | IN | 0 ETH | 0.0016114 | ||||
Add To Whitelist | 15820919 | 781 days ago | IN | 0 ETH | 0.00079198 | ||||
Safe Transfer Fr... | 15697545 | 798 days ago | IN | 0 ETH | 0.00124209 | ||||
Add To Whitelist | 15577068 | 815 days ago | IN | 0 ETH | 0.00078698 | ||||
Set Approval For... | 15533563 | 821 days ago | IN | 0 ETH | 0.00098799 | ||||
Safe Transfer Fr... | 15442105 | 836 days ago | IN | 0 ETH | 0.0034554 | ||||
Safe Transfer Fr... | 15442104 | 836 days ago | IN | 0 ETH | 0.00587321 | ||||
Mint IC | 15436207 | 837 days ago | IN | 0.2 ETH | 0.00155784 | ||||
Add To Whitelist | 15435796 | 837 days ago | IN | 0 ETH | 0.00075842 | ||||
Set Approval For... | 15429842 | 838 days ago | IN | 0 ETH | 0.00045971 | ||||
Safe Transfer Fr... | 15299828 | 858 days ago | IN | 0 ETH | 0.00068673 | ||||
Transfer From | 15277523 | 862 days ago | IN | 0 ETH | 0.00064984 | ||||
Mint IC | 15174247 | 878 days ago | IN | 0.1 ETH | 0.00323998 | ||||
Add To Whitelist | 15170007 | 879 days ago | IN | 0 ETH | 0.00194443 | ||||
Add To Whitelist | 15156205 | 881 days ago | IN | 0 ETH | 0.0012034 | ||||
Transfer From | 15059887 | 896 days ago | IN | 0 ETH | 0.00148693 | ||||
Set Approval For... | 15054082 | 897 days ago | IN | 0 ETH | 0.00115311 | ||||
Transfer From | 15044335 | 898 days ago | IN | 0 ETH | 0.00099183 | ||||
Transfer From | 15044330 | 898 days ago | IN | 0 ETH | 0.00159584 | ||||
Mint IC | 15034900 | 900 days ago | IN | 0.1 ETH | 0.00604358 | ||||
Add To Whitelist | 15030532 | 901 days ago | IN | 0 ETH | 0.00200019 | ||||
Add To Whitelist | 14964452 | 913 days ago | IN | 0 ETH | 0.00116219 | ||||
Add To Whitelist | 14919564 | 920 days ago | IN | 0 ETH | 0.00116137 |
Latest 13 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15990656 | 757 days ago | 0.72 ETH | ||||
14833212 | 935 days ago | 0.5775 ETH | ||||
14833212 | 935 days ago | 0.4725 ETH | ||||
14758269 | 947 days ago | 0.495 ETH | ||||
14756751 | 947 days ago | 0.18 ETH | ||||
14721994 | 952 days ago | 0.225 ETH | ||||
14701699 | 956 days ago | 0.44 ETH | ||||
14701661 | 956 days ago | 0.36 ETH | ||||
14674413 | 960 days ago | 2.585 ETH | ||||
14674408 | 960 days ago | 0.495 ETH | ||||
14655590 | 963 days ago | 2.9925 ETH | ||||
14634702 | 966 days ago | 1.595 ETH | ||||
14630763 | 967 days ago | 0.0825 ETH |
Loading...
Loading
Contract Name:
AventorsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-26 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary 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 { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is 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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: contracts/AventorsNFT.sol pragma solidity ^0.8.4; contract AventorsNFT is Ownable, ERC721A, ReentrancyGuard, PaymentSplitter { uint256 public maxSupply = 4000; uint256 public icPrice = 0.1 ether; uint256 public prePrice = 0.15 ether; uint256 public price = 0.2 ether; bool public _isActive = false; bool public _presaleActive = false; string private _baseTokenURI; mapping(address => bool) public whitelist; constructor(string memory name, string memory symbol, address[] memory _payees, uint256[] memory _shares) ERC721A(name, symbol) PaymentSplitter(_payees, _shares) payable {} modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function setActive(bool isActive) external onlyOwner { _isActive = isActive; } function presaleActive(bool isActive) external onlyOwner { _presaleActive = isActive; } function isWhitelisted(address owner) public view returns (bool) { return whitelist[owner]; } function addToWhitelist(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = true; } } function mintIC(uint256 quantity) external payable callerIsUser nonReentrant { require(_presaleActive, "Pre-sale is not active"); require(quantity > 0, "Must mint more than 0 tokens"); require(icPrice * quantity == msg.value, "Incorrect funds"); require(totalSupply() + quantity <= maxSupply, "Purchase would exceed max supply of Tokens"); require(whitelist[msg.sender], "This address is not on the whitelist"); _safeMint(msg.sender, quantity); } function mintPresale(uint256 quantity) external payable callerIsUser nonReentrant { require(_presaleActive, "Pre-sale is not active"); require(quantity > 0, "Must mint more than 0 tokens"); require(prePrice * quantity == msg.value, "Incorrect funds"); require(totalSupply() + quantity <= maxSupply, "Purchase would exceed max supply of Tokens"); _safeMint(msg.sender, quantity); } function publicMint(uint256 quantity) external payable callerIsUser nonReentrant { require(_isActive, "Public sale has not begun yet"); require(quantity > 0, "Must mint more than 0 tokens"); require(price * quantity == msg.value, "Incorrect funds"); require(totalSupply() + quantity <= maxSupply, "Purchase would exceed max supply of Tokens"); _safeMint(msg.sender, quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } }
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":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"icPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"owner","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintIC","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"presaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setActive","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052610fa060115567016345785d8a0000601255670214e8348c4f00006013556702c68af0bb1400006014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff021916908315150217905550604051620060c6380380620060c68339818101604052810190620000899190620007cc565b81818585620000ad620000a16200020960201b60201c565b6200021160201b60201c565b8160039080519060200190620000c592919062000514565b508060049080519060200190620000de92919062000514565b50620000ef620002d560201b60201c565b60018190555050506001600981905550805182511462000146576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013d90620009ee565b60405180910390fd5b60008251116200018d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001849062000a32565b60405180910390fd5b60005b8251811015620001fc57620001e6838281518110620001b457620001b362000d2d565b5b6020026020010151838381518110620001d257620001d162000d2d565b5b6020026020010151620002da60201b60201c565b8080620001f39062000c81565b91505062000190565b5050505050505062000f28565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200034d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034490620009cc565b60405180910390fd5b6000811162000393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038a9062000a54565b60405180910390fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000418576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040f9062000a10565b60405180910390fd5b600e829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a54620004cf919062000b44565b600a819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620005089291906200099f565b60405180910390a15050565b828054620005229062000c15565b90600052602060002090601f01602090048101928262000546576000855562000592565b82601f106200056157805160ff191683800117855562000592565b8280016001018555821562000592579182015b828111156200059157825182559160200191906001019062000574565b5b509050620005a19190620005a5565b5090565b5b80821115620005c0576000816000905550600101620005a6565b5090565b6000620005db620005d58462000a9f565b62000a76565b9050808382526020820190508285602086028201111562000601576200060062000d90565b5b60005b858110156200063557816200061a888262000705565b84526020840193506020830192505060018101905062000604565b5050509392505050565b600062000656620006508462000ace565b62000a76565b905080838252602082019050828560208602820111156200067c576200067b62000d90565b5b60005b85811015620006b05781620006958882620007b5565b8452602084019350602083019250506001810190506200067f565b5050509392505050565b6000620006d1620006cb8462000afd565b62000a76565b905082815260208101848484011115620006f057620006ef62000d95565b5b620006fd84828562000bdf565b509392505050565b600081519050620007168162000ef4565b92915050565b600082601f83011262000734576200073362000d8b565b5b815162000746848260208601620005c4565b91505092915050565b600082601f83011262000767576200076662000d8b565b5b8151620007798482602086016200063f565b91505092915050565b600082601f8301126200079a576200079962000d8b565b5b8151620007ac848260208601620006ba565b91505092915050565b600081519050620007c68162000f0e565b92915050565b60008060008060808587031215620007e957620007e862000d9f565b5b600085015167ffffffffffffffff8111156200080a576200080962000d9a565b5b620008188782880162000782565b945050602085015167ffffffffffffffff8111156200083c576200083b62000d9a565b5b6200084a8782880162000782565b935050604085015167ffffffffffffffff8111156200086e576200086d62000d9a565b5b6200087c878288016200071c565b925050606085015167ffffffffffffffff811115620008a0576200089f62000d9a565b5b620008ae878288016200074f565b91505092959194509250565b620008c58162000ba1565b82525050565b6000620008da602c8362000b33565b9150620008e78262000db5565b604082019050919050565b60006200090160328362000b33565b91506200090e8262000e04565b604082019050919050565b600062000928602b8362000b33565b9150620009358262000e53565b604082019050919050565b60006200094f601a8362000b33565b91506200095c8262000ea2565b602082019050919050565b600062000976601d8362000b33565b9150620009838262000ecb565b602082019050919050565b620009998162000bd5565b82525050565b6000604082019050620009b66000830185620008ba565b620009c560208301846200098e565b9392505050565b60006020820190508181036000830152620009e781620008cb565b9050919050565b6000602082019050818103600083015262000a0981620008f2565b9050919050565b6000602082019050818103600083015262000a2b8162000919565b9050919050565b6000602082019050818103600083015262000a4d8162000940565b9050919050565b6000602082019050818103600083015262000a6f8162000967565b9050919050565b600062000a8262000a95565b905062000a90828262000c4b565b919050565b6000604051905090565b600067ffffffffffffffff82111562000abd5762000abc62000d5c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000aec5762000aeb62000d5c565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000b1b5762000b1a62000d5c565b5b62000b268262000da4565b9050602081019050919050565b600082825260208201905092915050565b600062000b518262000bd5565b915062000b5e8362000bd5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b965762000b9562000ccf565b5b828201905092915050565b600062000bae8262000bb5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000bff57808201518184015260208101905062000be2565b8381111562000c0f576000848401525b50505050565b6000600282049050600182168062000c2e57607f821691505b6020821081141562000c455762000c4462000cfe565b5b50919050565b62000c568262000da4565b810181811067ffffffffffffffff8211171562000c785762000c7762000d5c565b5b80604052505050565b600062000c8e8262000bd5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000cc45762000cc362000ccf565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000eff8162000ba1565b811462000f0b57600080fd5b50565b62000f198162000bd5565b811462000f2557600080fd5b50565b61518e8062000f386000396000f3fe6080604052600436106102555760003560e01c80637f64978311610139578063b88d4fde116100b6578063dc33e6811161007a578063dc33e6811461093d578063e33b7de31461097a578063e567cad6146109a5578063e985e9c5146109d0578063f2fde38b14610a0d578063f759867a14610a365761029c565b8063b88d4fde14610832578063c87b56dd1461085b578063ce7c2ac214610898578063d5abeb01146108d5578063d79779b2146109005761029c565b80639852595c116100fd5780639852595c1461073b5780639b19251a14610778578063a035b1fe146107b5578063a22cb465146107e0578063acec338a146108095761029c565b80637f649783146106545780638b83209b1461067d5780638da5cb5b146106ba5780638ec89e4f146106e557806395d89b41146107105761029c565b80633af32abf116101d257806355f804b31161019657806355f804b3146105445780636352211e1461056d5780636b0a1176146105aa5780636bf00195146105d557806370a0823114610600578063715018a61461063d5761029c565b80633af32abf1461044f578063406072a91461048c57806342842e0e146104c957806347bf27f0146104f257806348b750441461051b5761029c565b80631916558711610219578063191655871461039a57806323b872dd146103c35780632d131107146103ec5780632db11544146104085780633a98ef39146104245761029c565b806301ffc9a7146102a157806306fdde03146102de578063081812fc14610309578063095ea7b31461034657806318160ddd1461036f5761029c565b3661029c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610283610a52565b34604051610292929190614550565b60405180910390a1005b600080fd5b3480156102ad57600080fd5b506102c860048036038101906102c39190613f80565b610a5a565b6040516102d59190614579565b60405180910390f35b3480156102ea57600080fd5b506102f3610b3c565b6040516103009190614594565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190614090565b610bce565b60405161033d91906144c0565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613e99565b610c4a565b005b34801561037b57600080fd5b50610384610d55565b60405161039191906147d6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d16565b610d6c565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613d83565b610f17565b005b61040660048036038101906104019190614090565b610f27565b005b610422600480360381019061041d9190614090565b6111bc565b005b34801561043057600080fd5b506104396113c5565b60405161044691906147d6565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190613ce9565b6113cf565b6040516104839190614579565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190614007565b611425565b6040516104c091906147d6565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190613d83565b6114ac565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613f26565b6114cc565b005b34801561052757600080fd5b50610542600480360381019061053d9190614007565b611565565b005b34801561055057600080fd5b5061056b60048036038101906105669190614047565b61182d565b005b34801561057957600080fd5b50610594600480360381019061058f9190614090565b6118c3565b6040516105a191906144c0565b60405180910390f35b3480156105b657600080fd5b506105bf6118d9565b6040516105cc9190614579565b60405180910390f35b3480156105e157600080fd5b506105ea6118ec565b6040516105f791906147d6565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613ce9565b6118f2565b60405161063491906147d6565b60405180910390f35b34801561064957600080fd5b506106526119c2565b005b34801561066057600080fd5b5061067b60048036038101906106769190613ed9565b611a4a565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614090565b611b6b565b6040516106b191906144c0565b60405180910390f35b3480156106c657600080fd5b506106cf611bb3565b6040516106dc91906144c0565b60405180910390f35b3480156106f157600080fd5b506106fa611bdc565b6040516107079190614579565b60405180910390f35b34801561071c57600080fd5b50610725611bef565b6040516107329190614594565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613ce9565b611c81565b60405161076f91906147d6565b60405180910390f35b34801561078457600080fd5b5061079f600480360381019061079a9190613ce9565b611cca565b6040516107ac9190614579565b60405180910390f35b3480156107c157600080fd5b506107ca611cea565b6040516107d791906147d6565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613e59565b611cf0565b005b34801561081557600080fd5b50610830600480360381019061082b9190613f26565b611e68565b005b34801561083e57600080fd5b5061085960048036038101906108549190613dd6565b611f01565b005b34801561086757600080fd5b50610882600480360381019061087d9190614090565b611f7d565b60405161088f9190614594565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613ce9565b61201c565b6040516108cc91906147d6565b60405180910390f35b3480156108e157600080fd5b506108ea612065565b6040516108f791906147d6565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613fda565b61206b565b60405161093491906147d6565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f9190613ce9565b6120b4565b60405161097191906147d6565b60405180910390f35b34801561098657600080fd5b5061098f6120c6565b60405161099c91906147d6565b60405180910390f35b3480156109b157600080fd5b506109ba6120d0565b6040516109c791906147d6565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613d43565b6120d6565b604051610a049190614579565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613ce9565b61216a565b005b610a506004803603810190610a4b9190614090565b612262565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b355750610b348261246b565b5b9050919050565b606060038054610b4b90614aeb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790614aeb565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b6000610bd9826124d5565b610c0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c55826118c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbd576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdc610a52565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d0e5750610d0c81610d07610a52565b6120d6565b155b15610d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d50838383612523565b505050565b6000610d5f6125d5565b6002546001540303905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614636565b60405180910390fd5b6000610df86120c6565b47610e0391906148c6565b90506000610e1a8383610e1586611c81565b6125da565b90506000811415610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e57906146b6565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eaf91906148c6565b9250508190555080600b6000828254610ec891906148c6565b92505081905550610ed98382612648565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f0a9291906144db565b60405180910390a1505050565b610f2283838361273c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c906146d6565b60405180910390fd5b60026009541415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd2906147b6565b60405180910390fd5b6002600981905550601560019054906101000a900460ff16611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614736565b60405180910390fd5b60008111611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906146f6565b60405180910390fd5b3481601254611084919061494d565b146110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90614756565b60405180910390fd5b601154816110d0610d55565b6110da91906148c6565b111561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290614616565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906145f6565b60405180910390fd5b6111b13382612bf2565b600160098190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906146d6565b60405180910390fd5b60026009541415611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906147b6565b60405180910390fd5b6002600981905550601560009054906101000a900460ff166112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be906145b6565b60405180910390fd5b6000811161130a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611301906146f6565b60405180910390fd5b3481601454611319919061494d565b14611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614756565b60405180910390fd5b60115481611365610d55565b61136f91906148c6565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790614616565b60405180910390fd5b6113ba3382612bf2565b600160098190555050565b6000600a54905090565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6114c783838360405180602001604052806000815250611f01565b505050565b6114d4610a52565b73ffffffffffffffffffffffffffffffffffffffff166114f2611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90614716565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614636565b60405180910390fd5b60006115f28361206b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161162b91906144c0565b60206040518083038186803b15801561164357600080fd5b505afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906140bd565b61168591906148c6565b9050600061169d83836116988787611425565b6125da565b905060008114156116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da906146b6565b60405180910390fd5b80601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461176f91906148c6565b9250508190555080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c591906148c6565b925050819055506117d7848483612c10565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161181f929190614550565b60405180910390a250505050565b611835610a52565b73ffffffffffffffffffffffffffffffffffffffff16611853611bb3565b73ffffffffffffffffffffffffffffffffffffffff16146118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090614716565b60405180910390fd5b80601690805190602001906118bf929190613a10565b5050565b60006118ce82612c96565b600001519050919050565b601560019054906101000a900460ff1681565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119ca610a52565b73ffffffffffffffffffffffffffffffffffffffff166119e8611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614716565b60405180910390fd5b611a486000612f25565b565b611a52610a52565b73ffffffffffffffffffffffffffffffffffffffff16611a70611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614716565b60405180910390fd5b60005b82829050811015611b6657600160176000858585818110611aed57611aec614c55565b5b9050602002016020810190611b029190613ce9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b5e90614b4e565b915050611ac9565b505050565b6000600e8281548110611b8157611b80614c55565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900460ff1681565b606060048054611bfe90614aeb565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2a90614aeb565b8015611c775780601f10611c4c57610100808354040283529160200191611c77565b820191906000526020600020905b815481529060010190602001808311611c5a57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60176020528060005260406000206000915054906101000a900460ff1681565b60145481565b611cf8610a52565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611d6a610a52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e17610a52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e5c9190614579565b60405180910390a35050565b611e70610a52565b73ffffffffffffffffffffffffffffffffffffffff16611e8e611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614716565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b611f0c84848461273c565b611f2b8373ffffffffffffffffffffffffffffffffffffffff16612fe9565b8015611f405750611f3e8484848461300c565b155b15611f77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611f88826124d5565b611fbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fc861316c565b9050600081511415611fe95760405180602001604052806000815250612014565b80611ff3846131fe565b604051602001612004929190614487565b6040516020818303038152906040525b915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006120bf8261335f565b9050919050565b6000600b54905090565b60135481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612172610a52565b73ffffffffffffffffffffffffffffffffffffffff16612190611bb3565b73ffffffffffffffffffffffffffffffffffffffff16146121e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dd90614716565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d906145d6565b60405180910390fd5b61225f81612f25565b50565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c7906146d6565b60405180910390fd5b60026009541415612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d906147b6565b60405180910390fd5b6002600981905550601560019054906101000a900460ff1661236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614736565b60405180910390fd5b600081116123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a7906146f6565b60405180910390fd5b34816013546123bf919061494d565b146123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f690614756565b60405180910390fd5b6011548161240b610d55565b61241591906148c6565b1115612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90614616565b60405180910390fd5b6124603382612bf2565b600160098190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124e06125d5565b111580156124ef575060015482105b801561251c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600a54600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561262b919061494d565b612635919061491c565b61263f91906149a7565b90509392505050565b8047101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614676565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126b1906144ab565b60006040518083038185875af1925050503d80600081146126ee576040519150601f19603f3d011682016040523d82523d6000602084013e6126f3565b606091505b5050905080612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e90614656565b60405180910390fd5b505050565b600061274782612c96565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127b2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127d3610a52565b73ffffffffffffffffffffffffffffffffffffffff1614806128025750612801856127fc610a52565b6120d6565b5b806128475750612810610a52565b73ffffffffffffffffffffffffffffffffffffffff1661282f84610bce565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612880576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128e7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f485858560016133c9565b61290060008487612523565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b80576001548214612b7f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612beb85858560016133cf565b5050505050565b612c0c8282604051806020016040528060008152506133d5565b5050565b612c918363a9059cbb60e01b8484604051602401612c2f929190614550565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e7565b505050565b612c9e613a96565b600082905080612cac6125d5565b11158015612cbb575060015481105b15612eee576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eec57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612dd0578092505050612f20565b5b600115612eeb57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ee6578092505050612f20565b612dd1565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613032610a52565b8786866040518563ffffffff1660e01b81526004016130549493929190614504565b602060405180830381600087803b15801561306e57600080fd5b505af192505050801561309f57506040513d601f19601f8201168201806040525081019061309c9190613fad565b60015b613119573d80600081146130cf576040519150601f19603f3d011682016040523d82523d6000602084013e6130d4565b606091505b50600081511415613111576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606016805461317b90614aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546131a790614aeb565b80156131f45780601f106131c9576101008083540402835291602001916131f4565b820191906000526020600020905b8154815290600101906020018083116131d757829003601f168201915b5050505050905090565b60606000821415613246576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061335a565b600082905060005b6000821461327857808061326190614b4e565b915050600a82613271919061491c565b915061324e565b60008167ffffffffffffffff81111561329457613293614c84565b5b6040519080825280601f01601f1916602001820160405280156132c65781602001600182028036833780820191505090505b5090505b60008514613353576001826132df91906149a7565b9150600a856132ee9190614b97565b60306132fa91906148c6565b60f81b8183815181106133105761330f614c55565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334c919061491c565b94506132ca565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6133e283838360016134ae565b505050565b6000613449826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661387d9092919063ffffffff16565b90506000815111156134a957808060200190518101906134699190613f53565b6134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614796565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561351c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613557576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61356460008683876133c9565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561372e575061372d8773ffffffffffffffffffffffffffffffffffffffff16612fe9565b5b156137f4575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a3600088848060010195508861300c565b6137d9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156137345782600154146137ef57600080fd5b613860565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137f5575b81600181905550505061387660008683876133cf565b5050505050565b606061388c8484600085613895565b90509392505050565b6060824710156138da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d190614696565b60405180910390fd5b6138e385612fe9565b613922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391990614776565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161394b9190614470565b60006040518083038185875af1925050503d8060008114613988576040519150601f19603f3d011682016040523d82523d6000602084013e61398d565b606091505b509150915061399d8282866139a9565b92505050949350505050565b606083156139b957829050613a09565b6000835111156139cc5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a009190614594565b60405180910390fd5b9392505050565b828054613a1c90614aeb565b90600052602060002090601f016020900481019282613a3e5760008555613a85565b82601f10613a5757805160ff1916838001178555613a85565b82800160010185558215613a85579182015b82811115613a84578251825591602001919060010190613a69565b5b509050613a929190613ad9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613af2576000816000905550600101613ada565b5090565b6000613b09613b0484614816565b6147f1565b905082815260208101848484011115613b2557613b24614cc2565b5b613b30848285614aa9565b509392505050565b6000613b4b613b4684614847565b6147f1565b905082815260208101848484011115613b6757613b66614cc2565b5b613b72848285614aa9565b509392505050565b600081359050613b89816150ce565b92915050565b600081359050613b9e816150e5565b92915050565b60008083601f840112613bba57613bb9614cb8565b5b8235905067ffffffffffffffff811115613bd757613bd6614cb3565b5b602083019150836020820283011115613bf357613bf2614cbd565b5b9250929050565b600081359050613c09816150fc565b92915050565b600081519050613c1e816150fc565b92915050565b600081359050613c3381615113565b92915050565b600081519050613c4881615113565b92915050565b600082601f830112613c6357613c62614cb8565b5b8135613c73848260208601613af6565b91505092915050565b600081359050613c8b8161512a565b92915050565b600082601f830112613ca657613ca5614cb8565b5b8135613cb6848260208601613b38565b91505092915050565b600081359050613cce81615141565b92915050565b600081519050613ce381615141565b92915050565b600060208284031215613cff57613cfe614ccc565b5b6000613d0d84828501613b7a565b91505092915050565b600060208284031215613d2c57613d2b614ccc565b5b6000613d3a84828501613b8f565b91505092915050565b60008060408385031215613d5a57613d59614ccc565b5b6000613d6885828601613b7a565b9250506020613d7985828601613b7a565b9150509250929050565b600080600060608486031215613d9c57613d9b614ccc565b5b6000613daa86828701613b7a565b9350506020613dbb86828701613b7a565b9250506040613dcc86828701613cbf565b9150509250925092565b60008060008060808587031215613df057613def614ccc565b5b6000613dfe87828801613b7a565b9450506020613e0f87828801613b7a565b9350506040613e2087828801613cbf565b925050606085013567ffffffffffffffff811115613e4157613e40614cc7565b5b613e4d87828801613c4e565b91505092959194509250565b60008060408385031215613e7057613e6f614ccc565b5b6000613e7e85828601613b7a565b9250506020613e8f85828601613bfa565b9150509250929050565b60008060408385031215613eb057613eaf614ccc565b5b6000613ebe85828601613b7a565b9250506020613ecf85828601613cbf565b9150509250929050565b60008060208385031215613ef057613eef614ccc565b5b600083013567ffffffffffffffff811115613f0e57613f0d614cc7565b5b613f1a85828601613ba4565b92509250509250929050565b600060208284031215613f3c57613f3b614ccc565b5b6000613f4a84828501613bfa565b91505092915050565b600060208284031215613f6957613f68614ccc565b5b6000613f7784828501613c0f565b91505092915050565b600060208284031215613f9657613f95614ccc565b5b6000613fa484828501613c24565b91505092915050565b600060208284031215613fc357613fc2614ccc565b5b6000613fd184828501613c39565b91505092915050565b600060208284031215613ff057613fef614ccc565b5b6000613ffe84828501613c7c565b91505092915050565b6000806040838503121561401e5761401d614ccc565b5b600061402c85828601613c7c565b925050602061403d85828601613b7a565b9150509250929050565b60006020828403121561405d5761405c614ccc565b5b600082013567ffffffffffffffff81111561407b5761407a614cc7565b5b61408784828501613c91565b91505092915050565b6000602082840312156140a6576140a5614ccc565b5b60006140b484828501613cbf565b91505092915050565b6000602082840312156140d3576140d2614ccc565b5b60006140e184828501613cd4565b91505092915050565b6140f381614a73565b82525050565b614102816149db565b82525050565b614111816149ff565b82525050565b600061412282614878565b61412c818561488e565b935061413c818560208601614ab8565b61414581614cd1565b840191505092915050565b600061415b82614878565b614165818561489f565b9350614175818560208601614ab8565b80840191505092915050565b600061418c82614883565b61419681856148aa565b93506141a6818560208601614ab8565b6141af81614cd1565b840191505092915050565b60006141c582614883565b6141cf81856148bb565b93506141df818560208601614ab8565b80840191505092915050565b60006141f8601d836148aa565b915061420382614ce2565b602082019050919050565b600061421b6026836148aa565b915061422682614d0b565b604082019050919050565b600061423e6024836148aa565b915061424982614d5a565b604082019050919050565b6000614261602a836148aa565b915061426c82614da9565b604082019050919050565b60006142846026836148aa565b915061428f82614df8565b604082019050919050565b60006142a7603a836148aa565b91506142b282614e47565b604082019050919050565b60006142ca601d836148aa565b91506142d582614e96565b602082019050919050565b60006142ed6026836148aa565b91506142f882614ebf565b604082019050919050565b6000614310602b836148aa565b915061431b82614f0e565b604082019050919050565b6000614333601e836148aa565b915061433e82614f5d565b602082019050919050565b6000614356601c836148aa565b915061436182614f86565b602082019050919050565b60006143796020836148aa565b915061438482614faf565b602082019050919050565b600061439c6016836148aa565b91506143a782614fd8565b602082019050919050565b60006143bf60008361489f565b91506143ca82615001565b600082019050919050565b60006143e2600f836148aa565b91506143ed82615004565b602082019050919050565b6000614405601d836148aa565b91506144108261502d565b602082019050919050565b6000614428602a836148aa565b915061443382615056565b604082019050919050565b600061444b601f836148aa565b9150614456826150a5565b602082019050919050565b61446a81614a69565b82525050565b600061447c8284614150565b915081905092915050565b600061449382856141ba565b915061449f82846141ba565b91508190509392505050565b60006144b6826143b2565b9150819050919050565b60006020820190506144d560008301846140f9565b92915050565b60006040820190506144f060008301856140ea565b6144fd6020830184614461565b9392505050565b600060808201905061451960008301876140f9565b61452660208301866140f9565b6145336040830185614461565b81810360608301526145458184614117565b905095945050505050565b600060408201905061456560008301856140f9565b6145726020830184614461565b9392505050565b600060208201905061458e6000830184614108565b92915050565b600060208201905081810360008301526145ae8184614181565b905092915050565b600060208201905081810360008301526145cf816141eb565b9050919050565b600060208201905081810360008301526145ef8161420e565b9050919050565b6000602082019050818103600083015261460f81614231565b9050919050565b6000602082019050818103600083015261462f81614254565b9050919050565b6000602082019050818103600083015261464f81614277565b9050919050565b6000602082019050818103600083015261466f8161429a565b9050919050565b6000602082019050818103600083015261468f816142bd565b9050919050565b600060208201905081810360008301526146af816142e0565b9050919050565b600060208201905081810360008301526146cf81614303565b9050919050565b600060208201905081810360008301526146ef81614326565b9050919050565b6000602082019050818103600083015261470f81614349565b9050919050565b6000602082019050818103600083015261472f8161436c565b9050919050565b6000602082019050818103600083015261474f8161438f565b9050919050565b6000602082019050818103600083015261476f816143d5565b9050919050565b6000602082019050818103600083015261478f816143f8565b9050919050565b600060208201905081810360008301526147af8161441b565b9050919050565b600060208201905081810360008301526147cf8161443e565b9050919050565b60006020820190506147eb6000830184614461565b92915050565b60006147fb61480c565b90506148078282614b1d565b919050565b6000604051905090565b600067ffffffffffffffff82111561483157614830614c84565b5b61483a82614cd1565b9050602081019050919050565b600067ffffffffffffffff82111561486257614861614c84565b5b61486b82614cd1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148d182614a69565b91506148dc83614a69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561491157614910614bc8565b5b828201905092915050565b600061492782614a69565b915061493283614a69565b92508261494257614941614bf7565b5b828204905092915050565b600061495882614a69565b915061496383614a69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561499c5761499b614bc8565b5b828202905092915050565b60006149b282614a69565b91506149bd83614a69565b9250828210156149d0576149cf614bc8565b5b828203905092915050565b60006149e682614a49565b9050919050565b60006149f882614a49565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614a42826149db565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614a7e82614a85565b9050919050565b6000614a9082614a97565b9050919050565b6000614aa282614a49565b9050919050565b82818337600083830152505050565b60005b83811015614ad6578082015181840152602081019050614abb565b83811115614ae5576000848401525b50505050565b60006002820490506001821680614b0357607f821691505b60208210811415614b1757614b16614c26565b5b50919050565b614b2682614cd1565b810181811067ffffffffffffffff82111715614b4557614b44614c84565b5b80604052505050565b6000614b5982614a69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b8c57614b8b614bc8565b5b600182019050919050565b6000614ba282614a69565b9150614bad83614a69565b925082614bbd57614bbc614bf7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f74206f6e2074686520776869746560008201527f6c69737400000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620546f6b656e7300000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4d757374206d696e74206d6f7265207468616e203020746f6b656e7300000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652d73616c65206973206e6f742061637469766500000000000000000000600082015250565b50565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6150d7816149db565b81146150e257600080fd5b50565b6150ee816149ed565b81146150f957600080fd5b50565b615105816149ff565b811461511057600080fd5b50565b61511c81614a0b565b811461512757600080fd5b50565b61513381614a37565b811461513e57600080fd5b50565b61514a81614a69565b811461515557600080fd5b5056fea26469706673582212206f181c7840dff94341ddb18eed92862cf8d6ebfd9dc25f6b8110229a78f4991264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000084176656e746f7273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f4bd3fde01875aa8c85dfa2d3b8b8fac053f8def0000000000000000000000003a0f65a56ebaf5656252ed840862c4dae6781e8e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000037
Deployed Bytecode
0x6080604052600436106102555760003560e01c80637f64978311610139578063b88d4fde116100b6578063dc33e6811161007a578063dc33e6811461093d578063e33b7de31461097a578063e567cad6146109a5578063e985e9c5146109d0578063f2fde38b14610a0d578063f759867a14610a365761029c565b8063b88d4fde14610832578063c87b56dd1461085b578063ce7c2ac214610898578063d5abeb01146108d5578063d79779b2146109005761029c565b80639852595c116100fd5780639852595c1461073b5780639b19251a14610778578063a035b1fe146107b5578063a22cb465146107e0578063acec338a146108095761029c565b80637f649783146106545780638b83209b1461067d5780638da5cb5b146106ba5780638ec89e4f146106e557806395d89b41146107105761029c565b80633af32abf116101d257806355f804b31161019657806355f804b3146105445780636352211e1461056d5780636b0a1176146105aa5780636bf00195146105d557806370a0823114610600578063715018a61461063d5761029c565b80633af32abf1461044f578063406072a91461048c57806342842e0e146104c957806347bf27f0146104f257806348b750441461051b5761029c565b80631916558711610219578063191655871461039a57806323b872dd146103c35780632d131107146103ec5780632db11544146104085780633a98ef39146104245761029c565b806301ffc9a7146102a157806306fdde03146102de578063081812fc14610309578063095ea7b31461034657806318160ddd1461036f5761029c565b3661029c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610283610a52565b34604051610292929190614550565b60405180910390a1005b600080fd5b3480156102ad57600080fd5b506102c860048036038101906102c39190613f80565b610a5a565b6040516102d59190614579565b60405180910390f35b3480156102ea57600080fd5b506102f3610b3c565b6040516103009190614594565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190614090565b610bce565b60405161033d91906144c0565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613e99565b610c4a565b005b34801561037b57600080fd5b50610384610d55565b60405161039191906147d6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d16565b610d6c565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613d83565b610f17565b005b61040660048036038101906104019190614090565b610f27565b005b610422600480360381019061041d9190614090565b6111bc565b005b34801561043057600080fd5b506104396113c5565b60405161044691906147d6565b60405180910390f35b34801561045b57600080fd5b5061047660048036038101906104719190613ce9565b6113cf565b6040516104839190614579565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190614007565b611425565b6040516104c091906147d6565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190613d83565b6114ac565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613f26565b6114cc565b005b34801561052757600080fd5b50610542600480360381019061053d9190614007565b611565565b005b34801561055057600080fd5b5061056b60048036038101906105669190614047565b61182d565b005b34801561057957600080fd5b50610594600480360381019061058f9190614090565b6118c3565b6040516105a191906144c0565b60405180910390f35b3480156105b657600080fd5b506105bf6118d9565b6040516105cc9190614579565b60405180910390f35b3480156105e157600080fd5b506105ea6118ec565b6040516105f791906147d6565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613ce9565b6118f2565b60405161063491906147d6565b60405180910390f35b34801561064957600080fd5b506106526119c2565b005b34801561066057600080fd5b5061067b60048036038101906106769190613ed9565b611a4a565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614090565b611b6b565b6040516106b191906144c0565b60405180910390f35b3480156106c657600080fd5b506106cf611bb3565b6040516106dc91906144c0565b60405180910390f35b3480156106f157600080fd5b506106fa611bdc565b6040516107079190614579565b60405180910390f35b34801561071c57600080fd5b50610725611bef565b6040516107329190614594565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613ce9565b611c81565b60405161076f91906147d6565b60405180910390f35b34801561078457600080fd5b5061079f600480360381019061079a9190613ce9565b611cca565b6040516107ac9190614579565b60405180910390f35b3480156107c157600080fd5b506107ca611cea565b6040516107d791906147d6565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613e59565b611cf0565b005b34801561081557600080fd5b50610830600480360381019061082b9190613f26565b611e68565b005b34801561083e57600080fd5b5061085960048036038101906108549190613dd6565b611f01565b005b34801561086757600080fd5b50610882600480360381019061087d9190614090565b611f7d565b60405161088f9190614594565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190613ce9565b61201c565b6040516108cc91906147d6565b60405180910390f35b3480156108e157600080fd5b506108ea612065565b6040516108f791906147d6565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613fda565b61206b565b60405161093491906147d6565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f9190613ce9565b6120b4565b60405161097191906147d6565b60405180910390f35b34801561098657600080fd5b5061098f6120c6565b60405161099c91906147d6565b60405180910390f35b3480156109b157600080fd5b506109ba6120d0565b6040516109c791906147d6565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613d43565b6120d6565b604051610a049190614579565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f9190613ce9565b61216a565b005b610a506004803603810190610a4b9190614090565b612262565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b355750610b348261246b565b5b9050919050565b606060038054610b4b90614aeb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790614aeb565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b6000610bd9826124d5565b610c0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c55826118c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbd576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdc610a52565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d0e5750610d0c81610d07610a52565b6120d6565b155b15610d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d50838383612523565b505050565b6000610d5f6125d5565b6002546001540303905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de590614636565b60405180910390fd5b6000610df86120c6565b47610e0391906148c6565b90506000610e1a8383610e1586611c81565b6125da565b90506000811415610e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e57906146b6565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eaf91906148c6565b9250508190555080600b6000828254610ec891906148c6565b92505081905550610ed98382612648565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610f0a9291906144db565b60405180910390a1505050565b610f2283838361273c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c906146d6565b60405180910390fd5b60026009541415610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd2906147b6565b60405180910390fd5b6002600981905550601560019054906101000a900460ff16611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990614736565b60405180910390fd5b60008111611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906146f6565b60405180910390fd5b3481601254611084919061494d565b146110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90614756565b60405180910390fd5b601154816110d0610d55565b6110da91906148c6565b111561111b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111290614616565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906145f6565b60405180910390fd5b6111b13382612bf2565b600160098190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906146d6565b60405180910390fd5b60026009541415611270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611267906147b6565b60405180910390fd5b6002600981905550601560009054906101000a900460ff166112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be906145b6565b60405180910390fd5b6000811161130a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611301906146f6565b60405180910390fd5b3481601454611319919061494d565b14611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614756565b60405180910390fd5b60115481611365610d55565b61136f91906148c6565b11156113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790614616565b60405180910390fd5b6113ba3382612bf2565b600160098190555050565b6000600a54905090565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6114c783838360405180602001604052806000815250611f01565b505050565b6114d4610a52565b73ffffffffffffffffffffffffffffffffffffffff166114f2611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f90614716565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614636565b60405180910390fd5b60006115f28361206b565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161162b91906144c0565b60206040518083038186803b15801561164357600080fd5b505afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906140bd565b61168591906148c6565b9050600061169d83836116988787611425565b6125da565b905060008114156116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da906146b6565b60405180910390fd5b80601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461176f91906148c6565b9250508190555080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c591906148c6565b925050819055506117d7848483612c10565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a848360405161181f929190614550565b60405180910390a250505050565b611835610a52565b73ffffffffffffffffffffffffffffffffffffffff16611853611bb3565b73ffffffffffffffffffffffffffffffffffffffff16146118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090614716565b60405180910390fd5b80601690805190602001906118bf929190613a10565b5050565b60006118ce82612c96565b600001519050919050565b601560019054906101000a900460ff1681565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119ca610a52565b73ffffffffffffffffffffffffffffffffffffffff166119e8611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614716565b60405180910390fd5b611a486000612f25565b565b611a52610a52565b73ffffffffffffffffffffffffffffffffffffffff16611a70611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd90614716565b60405180910390fd5b60005b82829050811015611b6657600160176000858585818110611aed57611aec614c55565b5b9050602002016020810190611b029190613ce9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b5e90614b4e565b915050611ac9565b505050565b6000600e8281548110611b8157611b80614c55565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900460ff1681565b606060048054611bfe90614aeb565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2a90614aeb565b8015611c775780601f10611c4c57610100808354040283529160200191611c77565b820191906000526020600020905b815481529060010190602001808311611c5a57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60176020528060005260406000206000915054906101000a900460ff1681565b60145481565b611cf8610a52565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611d6a610a52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e17610a52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e5c9190614579565b60405180910390a35050565b611e70610a52565b73ffffffffffffffffffffffffffffffffffffffff16611e8e611bb3565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90614716565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b611f0c84848461273c565b611f2b8373ffffffffffffffffffffffffffffffffffffffff16612fe9565b8015611f405750611f3e8484848461300c565b155b15611f77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611f88826124d5565b611fbe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fc861316c565b9050600081511415611fe95760405180602001604052806000815250612014565b80611ff3846131fe565b604051602001612004929190614487565b6040516020818303038152906040525b915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006120bf8261335f565b9050919050565b6000600b54905090565b60135481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612172610a52565b73ffffffffffffffffffffffffffffffffffffffff16612190611bb3565b73ffffffffffffffffffffffffffffffffffffffff16146121e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dd90614716565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d906145d6565b60405180910390fd5b61225f81612f25565b50565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c7906146d6565b60405180910390fd5b60026009541415612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d906147b6565b60405180910390fd5b6002600981905550601560019054906101000a900460ff1661236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614736565b60405180910390fd5b600081116123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a7906146f6565b60405180910390fd5b34816013546123bf919061494d565b146123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f690614756565b60405180910390fd5b6011548161240b610d55565b61241591906148c6565b1115612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90614616565b60405180910390fd5b6124603382612bf2565b600160098190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816124e06125d5565b111580156124ef575060015482105b801561251c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600081600a54600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561262b919061494d565b612635919061491c565b61263f91906149a7565b90509392505050565b8047101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614676565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126b1906144ab565b60006040518083038185875af1925050503d80600081146126ee576040519150601f19603f3d011682016040523d82523d6000602084013e6126f3565b606091505b5050905080612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e90614656565b60405180910390fd5b505050565b600061274782612c96565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127b2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127d3610a52565b73ffffffffffffffffffffffffffffffffffffffff1614806128025750612801856127fc610a52565b6120d6565b5b806128475750612810610a52565b73ffffffffffffffffffffffffffffffffffffffff1661282f84610bce565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612880576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128e7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128f485858560016133c9565b61290060008487612523565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b80576001548214612b7f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612beb85858560016133cf565b5050505050565b612c0c8282604051806020016040528060008152506133d5565b5050565b612c918363a9059cbb60e01b8484604051602401612c2f929190614550565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133e7565b505050565b612c9e613a96565b600082905080612cac6125d5565b11158015612cbb575060015481105b15612eee576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eec57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612dd0578092505050612f20565b5b600115612eeb57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ee6578092505050612f20565b612dd1565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613032610a52565b8786866040518563ffffffff1660e01b81526004016130549493929190614504565b602060405180830381600087803b15801561306e57600080fd5b505af192505050801561309f57506040513d601f19601f8201168201806040525081019061309c9190613fad565b60015b613119573d80600081146130cf576040519150601f19603f3d011682016040523d82523d6000602084013e6130d4565b606091505b50600081511415613111576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606016805461317b90614aeb565b80601f01602080910402602001604051908101604052809291908181526020018280546131a790614aeb565b80156131f45780601f106131c9576101008083540402835291602001916131f4565b820191906000526020600020905b8154815290600101906020018083116131d757829003601f168201915b5050505050905090565b60606000821415613246576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061335a565b600082905060005b6000821461327857808061326190614b4e565b915050600a82613271919061491c565b915061324e565b60008167ffffffffffffffff81111561329457613293614c84565b5b6040519080825280601f01601f1916602001820160405280156132c65781602001600182028036833780820191505090505b5090505b60008514613353576001826132df91906149a7565b9150600a856132ee9190614b97565b60306132fa91906148c6565b60f81b8183815181106133105761330f614c55565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334c919061491c565b94506132ca565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6133e283838360016134ae565b505050565b6000613449826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661387d9092919063ffffffff16565b90506000815111156134a957808060200190518101906134699190613f53565b6134a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349f90614796565b60405180910390fd5b5b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561351c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613557576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61356460008683876133c9565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561372e575061372d8773ffffffffffffffffffffffffffffffffffffffff16612fe9565b5b156137f4575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a3600088848060010195508861300c565b6137d9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156137345782600154146137ef57600080fd5b613860565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137f5575b81600181905550505061387660008683876133cf565b5050505050565b606061388c8484600085613895565b90509392505050565b6060824710156138da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d190614696565b60405180910390fd5b6138e385612fe9565b613922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391990614776565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161394b9190614470565b60006040518083038185875af1925050503d8060008114613988576040519150601f19603f3d011682016040523d82523d6000602084013e61398d565b606091505b509150915061399d8282866139a9565b92505050949350505050565b606083156139b957829050613a09565b6000835111156139cc5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a009190614594565b60405180910390fd5b9392505050565b828054613a1c90614aeb565b90600052602060002090601f016020900481019282613a3e5760008555613a85565b82601f10613a5757805160ff1916838001178555613a85565b82800160010185558215613a85579182015b82811115613a84578251825591602001919060010190613a69565b5b509050613a929190613ad9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613af2576000816000905550600101613ada565b5090565b6000613b09613b0484614816565b6147f1565b905082815260208101848484011115613b2557613b24614cc2565b5b613b30848285614aa9565b509392505050565b6000613b4b613b4684614847565b6147f1565b905082815260208101848484011115613b6757613b66614cc2565b5b613b72848285614aa9565b509392505050565b600081359050613b89816150ce565b92915050565b600081359050613b9e816150e5565b92915050565b60008083601f840112613bba57613bb9614cb8565b5b8235905067ffffffffffffffff811115613bd757613bd6614cb3565b5b602083019150836020820283011115613bf357613bf2614cbd565b5b9250929050565b600081359050613c09816150fc565b92915050565b600081519050613c1e816150fc565b92915050565b600081359050613c3381615113565b92915050565b600081519050613c4881615113565b92915050565b600082601f830112613c6357613c62614cb8565b5b8135613c73848260208601613af6565b91505092915050565b600081359050613c8b8161512a565b92915050565b600082601f830112613ca657613ca5614cb8565b5b8135613cb6848260208601613b38565b91505092915050565b600081359050613cce81615141565b92915050565b600081519050613ce381615141565b92915050565b600060208284031215613cff57613cfe614ccc565b5b6000613d0d84828501613b7a565b91505092915050565b600060208284031215613d2c57613d2b614ccc565b5b6000613d3a84828501613b8f565b91505092915050565b60008060408385031215613d5a57613d59614ccc565b5b6000613d6885828601613b7a565b9250506020613d7985828601613b7a565b9150509250929050565b600080600060608486031215613d9c57613d9b614ccc565b5b6000613daa86828701613b7a565b9350506020613dbb86828701613b7a565b9250506040613dcc86828701613cbf565b9150509250925092565b60008060008060808587031215613df057613def614ccc565b5b6000613dfe87828801613b7a565b9450506020613e0f87828801613b7a565b9350506040613e2087828801613cbf565b925050606085013567ffffffffffffffff811115613e4157613e40614cc7565b5b613e4d87828801613c4e565b91505092959194509250565b60008060408385031215613e7057613e6f614ccc565b5b6000613e7e85828601613b7a565b9250506020613e8f85828601613bfa565b9150509250929050565b60008060408385031215613eb057613eaf614ccc565b5b6000613ebe85828601613b7a565b9250506020613ecf85828601613cbf565b9150509250929050565b60008060208385031215613ef057613eef614ccc565b5b600083013567ffffffffffffffff811115613f0e57613f0d614cc7565b5b613f1a85828601613ba4565b92509250509250929050565b600060208284031215613f3c57613f3b614ccc565b5b6000613f4a84828501613bfa565b91505092915050565b600060208284031215613f6957613f68614ccc565b5b6000613f7784828501613c0f565b91505092915050565b600060208284031215613f9657613f95614ccc565b5b6000613fa484828501613c24565b91505092915050565b600060208284031215613fc357613fc2614ccc565b5b6000613fd184828501613c39565b91505092915050565b600060208284031215613ff057613fef614ccc565b5b6000613ffe84828501613c7c565b91505092915050565b6000806040838503121561401e5761401d614ccc565b5b600061402c85828601613c7c565b925050602061403d85828601613b7a565b9150509250929050565b60006020828403121561405d5761405c614ccc565b5b600082013567ffffffffffffffff81111561407b5761407a614cc7565b5b61408784828501613c91565b91505092915050565b6000602082840312156140a6576140a5614ccc565b5b60006140b484828501613cbf565b91505092915050565b6000602082840312156140d3576140d2614ccc565b5b60006140e184828501613cd4565b91505092915050565b6140f381614a73565b82525050565b614102816149db565b82525050565b614111816149ff565b82525050565b600061412282614878565b61412c818561488e565b935061413c818560208601614ab8565b61414581614cd1565b840191505092915050565b600061415b82614878565b614165818561489f565b9350614175818560208601614ab8565b80840191505092915050565b600061418c82614883565b61419681856148aa565b93506141a6818560208601614ab8565b6141af81614cd1565b840191505092915050565b60006141c582614883565b6141cf81856148bb565b93506141df818560208601614ab8565b80840191505092915050565b60006141f8601d836148aa565b915061420382614ce2565b602082019050919050565b600061421b6026836148aa565b915061422682614d0b565b604082019050919050565b600061423e6024836148aa565b915061424982614d5a565b604082019050919050565b6000614261602a836148aa565b915061426c82614da9565b604082019050919050565b60006142846026836148aa565b915061428f82614df8565b604082019050919050565b60006142a7603a836148aa565b91506142b282614e47565b604082019050919050565b60006142ca601d836148aa565b91506142d582614e96565b602082019050919050565b60006142ed6026836148aa565b91506142f882614ebf565b604082019050919050565b6000614310602b836148aa565b915061431b82614f0e565b604082019050919050565b6000614333601e836148aa565b915061433e82614f5d565b602082019050919050565b6000614356601c836148aa565b915061436182614f86565b602082019050919050565b60006143796020836148aa565b915061438482614faf565b602082019050919050565b600061439c6016836148aa565b91506143a782614fd8565b602082019050919050565b60006143bf60008361489f565b91506143ca82615001565b600082019050919050565b60006143e2600f836148aa565b91506143ed82615004565b602082019050919050565b6000614405601d836148aa565b91506144108261502d565b602082019050919050565b6000614428602a836148aa565b915061443382615056565b604082019050919050565b600061444b601f836148aa565b9150614456826150a5565b602082019050919050565b61446a81614a69565b82525050565b600061447c8284614150565b915081905092915050565b600061449382856141ba565b915061449f82846141ba565b91508190509392505050565b60006144b6826143b2565b9150819050919050565b60006020820190506144d560008301846140f9565b92915050565b60006040820190506144f060008301856140ea565b6144fd6020830184614461565b9392505050565b600060808201905061451960008301876140f9565b61452660208301866140f9565b6145336040830185614461565b81810360608301526145458184614117565b905095945050505050565b600060408201905061456560008301856140f9565b6145726020830184614461565b9392505050565b600060208201905061458e6000830184614108565b92915050565b600060208201905081810360008301526145ae8184614181565b905092915050565b600060208201905081810360008301526145cf816141eb565b9050919050565b600060208201905081810360008301526145ef8161420e565b9050919050565b6000602082019050818103600083015261460f81614231565b9050919050565b6000602082019050818103600083015261462f81614254565b9050919050565b6000602082019050818103600083015261464f81614277565b9050919050565b6000602082019050818103600083015261466f8161429a565b9050919050565b6000602082019050818103600083015261468f816142bd565b9050919050565b600060208201905081810360008301526146af816142e0565b9050919050565b600060208201905081810360008301526146cf81614303565b9050919050565b600060208201905081810360008301526146ef81614326565b9050919050565b6000602082019050818103600083015261470f81614349565b9050919050565b6000602082019050818103600083015261472f8161436c565b9050919050565b6000602082019050818103600083015261474f8161438f565b9050919050565b6000602082019050818103600083015261476f816143d5565b9050919050565b6000602082019050818103600083015261478f816143f8565b9050919050565b600060208201905081810360008301526147af8161441b565b9050919050565b600060208201905081810360008301526147cf8161443e565b9050919050565b60006020820190506147eb6000830184614461565b92915050565b60006147fb61480c565b90506148078282614b1d565b919050565b6000604051905090565b600067ffffffffffffffff82111561483157614830614c84565b5b61483a82614cd1565b9050602081019050919050565b600067ffffffffffffffff82111561486257614861614c84565b5b61486b82614cd1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148d182614a69565b91506148dc83614a69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561491157614910614bc8565b5b828201905092915050565b600061492782614a69565b915061493283614a69565b92508261494257614941614bf7565b5b828204905092915050565b600061495882614a69565b915061496383614a69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561499c5761499b614bc8565b5b828202905092915050565b60006149b282614a69565b91506149bd83614a69565b9250828210156149d0576149cf614bc8565b5b828203905092915050565b60006149e682614a49565b9050919050565b60006149f882614a49565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614a42826149db565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614a7e82614a85565b9050919050565b6000614a9082614a97565b9050919050565b6000614aa282614a49565b9050919050565b82818337600083830152505050565b60005b83811015614ad6578082015181840152602081019050614abb565b83811115614ae5576000848401525b50505050565b60006002820490506001821680614b0357607f821691505b60208210811415614b1757614b16614c26565b5b50919050565b614b2682614cd1565b810181811067ffffffffffffffff82111715614b4557614b44614c84565b5b80604052505050565b6000614b5982614a69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b8c57614b8b614bc8565b5b600182019050919050565b6000614ba282614a69565b9150614bad83614a69565b925082614bbd57614bbc614bf7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f74206f6e2074686520776869746560008201527f6c69737400000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620546f6b656e7300000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4d757374206d696e74206d6f7265207468616e203020746f6b656e7300000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5072652d73616c65206973206e6f742061637469766500000000000000000000600082015250565b50565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6150d7816149db565b81146150e257600080fd5b50565b6150ee816149ed565b81146150f957600080fd5b50565b615105816149ff565b811461511057600080fd5b50565b61511c81614a0b565b811461512757600080fd5b50565b61513381614a37565b811461513e57600080fd5b50565b61514a81614a69565b811461515557600080fd5b5056fea26469706673582212206f181c7840dff94341ddb18eed92862cf8d6ebfd9dc25f6b8110229a78f4991264736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000084176656e746f7273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f4bd3fde01875aa8c85dfa2d3b8b8fac053f8def0000000000000000000000003a0f65a56ebaf5656252ed840862c4dae6781e8e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000037
-----Decoded View---------------
Arg [0] : name (string): Aventors
Arg [1] : symbol (string): AV
Arg [2] : _payees (address[]): 0xf4bd3fDe01875aA8C85DFA2D3b8B8FAC053F8dEf,0x3a0F65A56eBaF5656252Ed840862C4dAE6781e8E
Arg [3] : _shares (uint256[]): 45,55
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 4176656e746f7273000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 4156000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 000000000000000000000000f4bd3fde01875aa8c85dfa2d3b8b8fac053f8def
Arg [10] : 0000000000000000000000003a0f65a56ebaf5656252ed840862c4dae6781e8e
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000037
Deployed Bytecode Sourcemap
62071:2992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57637:40;57653:12;:10;:12::i;:::-;57667:9;57637:40;;;;;;;:::i;:::-;;;;;;;;62071:2992;;;;;29774:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32887:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34390:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33953:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29023:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59423:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35255:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63554:507;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64509:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57768:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63236:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58897:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35496:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63127:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60257:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62917:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32695:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62354:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62193;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30143:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2639:103;;;;;;;;;;;;;:::i;:::-;;63351:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59123:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1988:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62318:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33056:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58619:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62432:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62277:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34666:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63027:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35752:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33231:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58415:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62153:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58205:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64947:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57953:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62234:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35024:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2897:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64069:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;712:98;765:7;792:10;785:17;;712:98;:::o;29774:305::-;29876:4;29928:25;29913:40;;;:11;:40;;;;:105;;;;29985:33;29970:48;;;:11;:48;;;;29913:105;:158;;;;30035:36;30059:11;30035:23;:36::i;:::-;29913:158;29893:178;;29774:305;;;:::o;32887:100::-;32941:13;32974:5;32967:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32887:100;:::o;34390:204::-;34458:7;34483:16;34491:7;34483;:16::i;:::-;34478:64;;34508:34;;;;;;;;;;;;;;34478:64;34562:15;:24;34578:7;34562:24;;;;;;;;;;;;;;;;;;;;;34555:31;;34390:204;;;:::o;33953:371::-;34026:13;34042:24;34058:7;34042:15;:24::i;:::-;34026:40;;34087:5;34081:11;;:2;:11;;;34077:48;;;34101:24;;;;;;;;;;;;;;34077:48;34158:5;34142:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34168:37;34185:5;34192:12;:10;:12::i;:::-;34168:16;:37::i;:::-;34167:38;34142:63;34138:138;;;34229:35;;;;;;;;;;;;;;34138:138;34288:28;34297:2;34301:7;34310:5;34288:8;:28::i;:::-;34015:309;33953:371;;:::o;29023:303::-;29067:7;29292:15;:13;:15::i;:::-;29277:12;;29261:13;;:28;:46;29254:53;;29023:303;:::o;59423:566::-;59518:1;59499:7;:16;59507:7;59499:16;;;;;;;;;;;;;;;;:20;59491:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59575:21;59623:15;:13;:15::i;:::-;59599:21;:39;;;;:::i;:::-;59575:63;;59649:15;59667:58;59683:7;59692:13;59707:17;59716:7;59707:8;:17::i;:::-;59667:15;:58::i;:::-;59649:76;;59757:1;59746:7;:12;;59738:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59841:7;59819:9;:18;59829:7;59819:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;59877:7;59859:14;;:25;;;;;;;:::i;:::-;;;;;;;;59897:35;59915:7;59924;59897:17;:35::i;:::-;59948:33;59964:7;59973;59948:33;;;;;;;:::i;:::-;;;;;;;;59480:509;;59423:566;:::o;35255:170::-;35389:28;35399:4;35405:2;35409:7;35389:9;:28::i;:::-;35255:170;;;:::o;63554:507::-;62722:10;62709:23;;:9;:23;;;62701:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1:::1;5868:7;;:19;;5860:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1;6001:7;:18;;;;63650:14:::2;;;;;;;;;;;63642:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;63721:1;63710:8;:12;63702:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;63796:9;63784:8;63774:7;;:18;;;;:::i;:::-;:31;63766:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63872:9;;63860:8;63844:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;63836:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;63947:9;:21;63957:10;63947:21;;;;;;;;;;;;;;;;;;;;;;;;;63939:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;64022:31;64032:10;64044:8;64022:9;:31::i;:::-;5226:1:::1;6180:7;:22;;;;63554:507:::0;:::o;64509:430::-;62722:10;62709:23;;:9;:23;;;62701:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1:::1;5868:7;;:19;;5860:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1;6001:7;:18;;;;64609:9:::2;;;;;;;;;;;64601:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;64682:1;64671:8;:12;64663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;64755:9;64743:8;64735:5;;:16;;;;:::i;:::-;:29;64727:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64831:9;;64819:8;64803:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;64795:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64900:31;64910:10;64922:8;64900:9;:31::i;:::-;5226:1:::1;6180:7;:22;;;;64509:430:::0;:::o;57768:91::-;57812:7;57839:12;;57832:19;;57768:91;:::o;63236:107::-;63295:4;63319:9;:16;63329:5;63319:16;;;;;;;;;;;;;;;;;;;;;;;;;63312:23;;63236:107;;;:::o;58897:135::-;58967:7;58994:14;:21;59009:5;58994:21;;;;;;;;;;;;;;;:30;59016:7;58994:30;;;;;;;;;;;;;;;;58987:37;;58897:135;;;;:::o;35496:185::-;35634:39;35651:4;35657:2;35661:7;35634:39;;;;;;;;;;;;:16;:39::i;:::-;35496:185;;;:::o;63127:101::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63212:8:::1;63195:14;;:25;;;;;;;;;;;;;;;;;;63127:101:::0;:::o;60257:641::-;60358:1;60339:7;:16;60347:7;60339:16;;;;;;;;;;;;;;;;:20;60331:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60415:21;60472:20;60486:5;60472:13;:20::i;:::-;60439:5;:15;;;60463:4;60439:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;60415:77;;60503:15;60521:65;60537:7;60546:13;60561:24;60570:5;60577:7;60561:8;:24::i;:::-;60521:15;:65::i;:::-;60503:83;;60618:1;60607:7;:12;;60599:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60714:7;60680:14;:21;60695:5;60680:21;;;;;;;;;;;;;;;:30;60702:7;60680:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;60762:7;60732:19;:26;60752:5;60732:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;60782:47;60805:5;60812:7;60821;60782:22;:47::i;:::-;60866:5;60845:45;;;60873:7;60882;60845:45;;;;;;;:::i;:::-;;;;;;;;60320:578;;60257:641;;:::o;62917:102::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63004:7:::1;62988:13;:23;;;;;;;;;;;;:::i;:::-;;62917:102:::0;:::o;32695:125::-;32759:7;32786:21;32799:7;32786:12;:21::i;:::-;:26;;;32779:33;;32695:125;;;:::o;62354:34::-;;;;;;;;;;;;;:::o;62193:::-;;;;:::o;30143:206::-;30207:7;30248:1;30231:19;;:5;:19;;;30227:60;;;30259:28;;;;;;;;;;;;;;30227:60;30313:12;:19;30326:5;30313:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30305:36;;30298:43;;30143:206;;;:::o;2639:103::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2704:30:::1;2731:1;2704:18;:30::i;:::-;2639:103::o:0;63351:195::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63440:9:::1;63435:104;63459:9;;:16;;63455:1;:20;63435:104;;;63523:4;63497:9;:23;63507:9;;63517:1;63507:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;63497:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;63477:3;;;;;:::i;:::-;;;;63435:104;;;;63351:195:::0;;:::o;59123:100::-;59174:7;59201;59209:5;59201:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59194:21;;59123:100;;;:::o;1988:87::-;2034:7;2061:6;;;;;;;;;;;2054:13;;1988:87;:::o;62318:29::-;;;;;;;;;;;;;:::o;33056:104::-;33112:13;33145:7;33138:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33056:104;:::o;58619:109::-;58675:7;58702:9;:18;58712:7;58702:18;;;;;;;;;;;;;;;;58695:25;;58619:109;;;:::o;62432:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;62277:32::-;;;;:::o;34666:287::-;34777:12;:10;:12::i;:::-;34765:24;;:8;:24;;;34761:54;;;34798:17;;;;;;;;;;;;;;34761:54;34873:8;34828:18;:32;34847:12;:10;:12::i;:::-;34828:32;;;;;;;;;;;;;;;:42;34861:8;34828:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34926:8;34897:48;;34912:12;:10;:12::i;:::-;34897:48;;;34936:8;34897:48;;;;;;:::i;:::-;;;;;;;;34666:287;;:::o;63027:92::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63103:8:::1;63091:9;;:20;;;;;;;;;;;;;;;;;;63027:92:::0;:::o;35752:369::-;35919:28;35929:4;35935:2;35939:7;35919:9;:28::i;:::-;35962:15;:2;:13;;;:15::i;:::-;:76;;;;;35982:56;36013:4;36019:2;36023:7;36032:5;35982:30;:56::i;:::-;35981:57;35962:76;35958:156;;;36062:40;;;;;;;;;;;;;;35958:156;35752:369;;;;:::o;33231:318::-;33304:13;33335:16;33343:7;33335;:16::i;:::-;33330:59;;33360:29;;;;;;;;;;;;;;33330:59;33402:21;33426:10;:8;:10::i;:::-;33402:34;;33479:1;33460:7;33454:21;:26;;:87;;;;;;;;;;;;;;;;;33507:7;33516:18;:7;:16;:18::i;:::-;33490:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33454:87;33447:94;;;33231:318;;;:::o;58415:105::-;58469:7;58496;:16;58504:7;58496:16;;;;;;;;;;;;;;;;58489:23;;58415:105;;;:::o;62153:31::-;;;;:::o;58205:119::-;58263:7;58290:19;:26;58310:5;58290:26;;;;;;;;;;;;;;;;58283:33;;58205:119;;;:::o;64947:113::-;65005:7;65032:20;65046:5;65032:13;:20::i;:::-;65025:27;;64947:113;;;:::o;57953:95::-;57999:7;58026:14;;58019:21;;57953:95;:::o;62234:36::-;;;;:::o;35024:164::-;35121:4;35145:18;:25;35164:5;35145:25;;;;;;;;;;;;;;;:35;35171:8;35145:35;;;;;;;;;;;;;;;;;;;;;;;;;35138:42;;35024:164;;;;:::o;2897:201::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3006:1:::1;2986:22;;:8;:22;;;;2978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3062:28;3081:8;3062:18;:28::i;:::-;2897:201:::0;:::o;64069:432::-;62722:10;62709:23;;:9;:23;;;62701:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1:::1;5868:7;;:19;;5860:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5270:1;6001:7;:18;;;;64170:14:::2;;;;;;;;;;;64162:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64241:1;64230:8;:12;64222:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;64317:9;64305:8;64294;;:19;;;;:::i;:::-;:32;64286:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64393:9;;64381:8;64365:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;64357:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64462:31;64472:10;64484:8;64462:9;:31::i;:::-;5226:1:::1;6180:7;:22;;;;64069:432:::0;:::o;25340:157::-;25425:4;25464:25;25449:40;;;:11;:40;;;;25442:47;;25340:157;;;:::o;36376:174::-;36433:4;36476:7;36457:15;:13;:15::i;:::-;:26;;:53;;;;;36497:13;;36487:7;:23;36457:53;:85;;;;;36515:11;:20;36527:7;36515:20;;;;;;;;;;;:27;;;;;;;;;;;;36514:28;36457:85;36450:92;;36376:174;;;:::o;44533:196::-;44675:2;44648:15;:24;44664:7;44648:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44713:7;44709:2;44693:28;;44702:5;44693:28;;;;;;;;;;;;44533:196;;;:::o;28797:92::-;28853:7;28797:92;:::o;61076:248::-;61222:7;61301:15;61286:12;;61266:7;:16;61274:7;61266:16;;;;;;;;;;;;;;;;61250:13;:32;;;;:::i;:::-;61249:49;;;;:::i;:::-;:67;;;;:::i;:::-;61242:74;;61076:248;;;;;:::o;16340:317::-;16455:6;16430:21;:31;;16422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16509:12;16527:9;:14;;16549:6;16527:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16508:52;;;16579:7;16571:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;16411:246;16340:317;;:::o;39476:2130::-;39591:35;39629:21;39642:7;39629:12;:21::i;:::-;39591:59;;39689:4;39667:26;;:13;:18;;;:26;;;39663:67;;39702:28;;;;;;;;;;;;;;39663:67;39743:22;39785:4;39769:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39806:36;39823:4;39829:12;:10;:12::i;:::-;39806:16;:36::i;:::-;39769:73;:126;;;;39883:12;:10;:12::i;:::-;39859:36;;:20;39871:7;39859:11;:20::i;:::-;:36;;;39769:126;39743:153;;39914:17;39909:66;;39940:35;;;;;;;;;;;;;;39909:66;40004:1;39990:16;;:2;:16;;;39986:52;;;40015:23;;;;;;;;;;;;;;39986:52;40051:43;40073:4;40079:2;40083:7;40092:1;40051:21;:43::i;:::-;40159:35;40176:1;40180:7;40189:4;40159:8;:35::i;:::-;40520:1;40490:12;:18;40503:4;40490:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40564:1;40536:12;:16;40549:2;40536:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40582:31;40616:11;:20;40628:7;40616:20;;;;;;;;;;;40582:54;;40667:2;40651:8;:13;;;:18;;;;;;;;;;;;;;;;;;40717:15;40684:8;:23;;;:49;;;;;;;;;;;;;;;;;;40985:19;41017:1;41007:7;:11;40985:33;;41033:31;41067:11;:24;41079:11;41067:24;;;;;;;;;;;41033:58;;41135:1;41110:27;;:8;:13;;;;;;;;;;;;:27;;;41106:384;;;41320:13;;41305:11;:28;41301:174;;41374:4;41358:8;:13;;;:20;;;;;;;;;;;;;;;;;;41427:13;:28;;;41401:8;:23;;;:54;;;;;;;;;;;;;;;;;;41301:174;41106:384;40465:1036;;;41537:7;41533:2;41518:27;;41527:4;41518:27;;;;;;;;;;;;41556:42;41577:4;41583:2;41587:7;41596:1;41556:20;:42::i;:::-;39580:2026;;39476:2130;;;:::o;36558:104::-;36627:27;36637:2;36641:8;36627:27;;;;;;;;;;;;:9;:27::i;:::-;36558:104;;:::o;51097:211::-;51214:86;51234:5;51264:23;;;51289:2;51293:5;51241:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51214:19;:86::i;:::-;51097:211;;;:::o;31524:1109::-;31586:21;;:::i;:::-;31620:12;31635:7;31620:22;;31703:4;31684:15;:13;:15::i;:::-;:23;;:47;;;;;31718:13;;31711:4;:20;31684:47;31680:886;;;31752:31;31786:11;:17;31798:4;31786:17;;;;;;;;;;;31752:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31827:9;:16;;;31822:729;;31898:1;31872:28;;:9;:14;;;:28;;;31868:101;;31936:9;31929:16;;;;;;31868:101;32271:261;32278:4;32271:261;;;32311:6;;;;;;;;32356:11;:17;32368:4;32356:17;;;;;;;;;;;32344:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32430:1;32404:28;;:9;:14;;;:28;;;32400:109;;32472:9;32465:16;;;;;;32400:109;32271:261;;;31822:729;31733:833;31680:886;32594:31;;;;;;;;;;;;;;31524:1109;;;;:::o;3258:191::-;3332:16;3351:6;;;;;;;;;;;3332:25;;3377:8;3368:6;;:17;;;;;;;;;;;;;;;;;;3432:8;3401:40;;3422:8;3401:40;;;;;;;;;;;;3321:128;3258:191;:::o;15079:326::-;15139:4;15396:1;15374:7;:19;;;:23;15367:30;;15079:326;;;:::o;45221:667::-;45384:4;45421:2;45405:36;;;45442:12;:10;:12::i;:::-;45456:4;45462:7;45471:5;45405:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45401:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45656:1;45639:6;:13;:18;45635:235;;;45685:40;;;;;;;;;;;;;;45635:235;45828:6;45822:13;45813:6;45809:2;45805:15;45798:38;45401:480;45534:45;;;45524:55;;;:6;:55;;;;45517:62;;;45221:667;;;;;;:::o;62795:114::-;62855:13;62888;62881:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62795:114;:::o;22716:723::-;22772:13;23002:1;22993:5;:10;22989:53;;;23020:10;;;;;;;;;;;;;;;;;;;;;22989:53;23052:12;23067:5;23052:20;;23083:14;23108:78;23123:1;23115:4;:9;23108:78;;23141:8;;;;;:::i;:::-;;;;23172:2;23164:10;;;;;:::i;:::-;;;23108:78;;;23196:19;23228:6;23218:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23196:39;;23246:154;23262:1;23253:5;:10;23246:154;;23290:1;23280:11;;;;;:::i;:::-;;;23357:2;23349:5;:10;;;;:::i;:::-;23336:2;:24;;;;:::i;:::-;23323:39;;23306:6;23313;23306:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23386:2;23377:11;;;;;:::i;:::-;;;23246:154;;;23424:6;23410:21;;;;;22716:723;;;;:::o;30431:137::-;30492:7;30527:12;:19;30540:5;30527:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30519:41;;30512:48;;30431:137;;;:::o;46536:159::-;;;;;:::o;47354:158::-;;;;;:::o;37025:163::-;37148:32;37154:2;37158:8;37168:5;37175:4;37148:5;:32::i;:::-;37025:163;;;:::o;53670:716::-;54094:23;54120:69;54148:4;54120:69;;;;;;;;;;;;;;;;;54128:5;54120:27;;;;:69;;;;;:::i;:::-;54094:95;;54224:1;54204:10;:17;:21;54200:179;;;54301:10;54290:30;;;;;;;;;;;;:::i;:::-;54282:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54200:179;53740:646;53670:716;;:::o;37447:1775::-;37586:20;37609:13;;37586:36;;37651:1;37637:16;;:2;:16;;;37633:48;;;37662:19;;;;;;;;;;;;;;37633:48;37708:1;37696:8;:13;37692:44;;;37718:18;;;;;;;;;;;;;;37692:44;37749:61;37779:1;37783:2;37787:12;37801:8;37749:21;:61::i;:::-;38122:8;38087:12;:16;38100:2;38087:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38186:8;38146:12;:16;38159:2;38146:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38245:2;38212:11;:25;38224:12;38212:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38312:15;38262:11;:25;38274:12;38262:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38345:20;38368:12;38345:35;;38395:11;38424:8;38409:12;:23;38395:37;;38453:4;:23;;;;;38461:15;:2;:13;;;:15::i;:::-;38453:23;38449:641;;;38497:314;38553:12;38549:2;38528:38;;38545:1;38528:38;;;;;;;;;;;;38594:69;38633:1;38637:2;38641:14;;;;;;38657:5;38594:30;:69::i;:::-;38589:174;;38699:40;;;;;;;;;;;;;;38589:174;38806:3;38790:12;:19;;38497:314;;38892:12;38875:13;;:29;38871:43;;38906:8;;;38871:43;38449:641;;;38955:120;39011:14;;;;;;39007:2;38986:40;;39003:1;38986:40;;;;;;;;;;;;39070:3;39054:12;:19;;38955:120;;38449:641;39120:12;39104:13;:28;;;;38062:1082;;39154:60;39183:1;39187:2;39191:12;39205:8;39154:20;:60::i;:::-;37575:1647;37447:1775;;;;:::o;17824:229::-;17961:12;17993:52;18015:6;18023:4;18029:1;18032:12;17993:21;:52::i;:::-;17986:59;;17824:229;;;;;:::o;18944:510::-;19114:12;19172:5;19147:21;:30;;19139:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;19239:18;19250:6;19239:10;:18::i;:::-;19231:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19305:12;19319:23;19346:6;:11;;19365:5;19372:4;19346:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19304:73;;;;19395:51;19412:7;19421:10;19433:12;19395:16;:51::i;:::-;19388:58;;;;18944:510;;;;;;:::o;21630:712::-;21780:12;21809:7;21805:530;;;21840:10;21833:17;;;;21805:530;21974:1;21954:10;:17;:21;21950:374;;;22152:10;22146:17;22213:15;22200:10;22196:2;22192:19;22185:44;21950:374;22295:12;22288:20;;;;;;;;;;;:::i;:::-;;;;;;;;21630:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:122;;1305:79;;:::i;:::-;1264:122;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:117;;;1470:79;;:::i;:::-;1434:117;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:128;;;1645:79;;:::i;:::-;1598:128;1164:568;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1738:133;;;;:::o;1877:137::-;1931:5;1962:6;1956:13;1947:22;;1978:30;2002:5;1978:30;:::i;:::-;1877:137;;;;:::o;2020:::-;2065:5;2103:6;2090:20;2081:29;;2119:32;2145:5;2119:32;:::i;:::-;2020:137;;;;:::o;2163:141::-;2219:5;2250:6;2244:13;2235:22;;2266:32;2292:5;2266:32;:::i;:::-;2163:141;;;;:::o;2323:338::-;2378:5;2427:3;2420:4;2412:6;2408:17;2404:27;2394:122;;2435:79;;:::i;:::-;2394:122;2552:6;2539:20;2577:78;2651:3;2643:6;2636:4;2628:6;2624:17;2577:78;:::i;:::-;2568:87;;2384:277;2323:338;;;;:::o;2667:169::-;2728:5;2766:6;2753:20;2744:29;;2782:48;2824:5;2782:48;:::i;:::-;2667:169;;;;:::o;2856:340::-;2912:5;2961:3;2954:4;2946:6;2942:17;2938:27;2928:122;;2969:79;;:::i;:::-;2928:122;3086:6;3073:20;3111:79;3186:3;3178:6;3171:4;3163:6;3159:17;3111:79;:::i;:::-;3102:88;;2918:278;2856:340;;;;:::o;3202:139::-;3248:5;3286:6;3273:20;3264:29;;3302:33;3329:5;3302:33;:::i;:::-;3202:139;;;;:::o;3347:143::-;3404:5;3435:6;3429:13;3420:22;;3451:33;3478:5;3451:33;:::i;:::-;3347:143;;;;:::o;3496:329::-;3555:6;3604:2;3592:9;3583:7;3579:23;3575:32;3572:119;;;3610:79;;:::i;:::-;3572:119;3730:1;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3701:117;3496:329;;;;:::o;3831:345::-;3898:6;3947:2;3935:9;3926:7;3922:23;3918:32;3915:119;;;3953:79;;:::i;:::-;3915:119;4073:1;4098:61;4151:7;4142:6;4131:9;4127:22;4098:61;:::i;:::-;4088:71;;4044:125;3831:345;;;;:::o;4182:474::-;4250:6;4258;4307:2;4295:9;4286:7;4282:23;4278:32;4275:119;;;4313:79;;:::i;:::-;4275:119;4433:1;4458:53;4503:7;4494:6;4483:9;4479:22;4458:53;:::i;:::-;4448:63;;4404:117;4560:2;4586:53;4631:7;4622:6;4611:9;4607:22;4586:53;:::i;:::-;4576:63;;4531:118;4182:474;;;;;:::o;4662:619::-;4739:6;4747;4755;4804:2;4792:9;4783:7;4779:23;4775:32;4772:119;;;4810:79;;:::i;:::-;4772:119;4930:1;4955:53;5000:7;4991:6;4980:9;4976:22;4955:53;:::i;:::-;4945:63;;4901:117;5057:2;5083:53;5128:7;5119:6;5108:9;5104:22;5083:53;:::i;:::-;5073:63;;5028:118;5185:2;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5156:118;4662:619;;;;;:::o;5287:943::-;5382:6;5390;5398;5406;5455:3;5443:9;5434:7;5430:23;5426:33;5423:120;;;5462:79;;:::i;:::-;5423:120;5582:1;5607:53;5652:7;5643:6;5632:9;5628:22;5607:53;:::i;:::-;5597:63;;5553:117;5709:2;5735:53;5780:7;5771:6;5760:9;5756:22;5735:53;:::i;:::-;5725:63;;5680:118;5837:2;5863:53;5908:7;5899:6;5888:9;5884:22;5863:53;:::i;:::-;5853:63;;5808:118;5993:2;5982:9;5978:18;5965:32;6024:18;6016:6;6013:30;6010:117;;;6046:79;;:::i;:::-;6010:117;6151:62;6205:7;6196:6;6185:9;6181:22;6151:62;:::i;:::-;6141:72;;5936:287;5287:943;;;;;;;:::o;6236:468::-;6301:6;6309;6358:2;6346:9;6337:7;6333:23;6329:32;6326:119;;;6364:79;;:::i;:::-;6326:119;6484:1;6509:53;6554:7;6545:6;6534:9;6530:22;6509:53;:::i;:::-;6499:63;;6455:117;6611:2;6637:50;6679:7;6670:6;6659:9;6655:22;6637:50;:::i;:::-;6627:60;;6582:115;6236:468;;;;;:::o;6710:474::-;6778:6;6786;6835:2;6823:9;6814:7;6810:23;6806:32;6803:119;;;6841:79;;:::i;:::-;6803:119;6961:1;6986:53;7031:7;7022:6;7011:9;7007:22;6986:53;:::i;:::-;6976:63;;6932:117;7088:2;7114:53;7159:7;7150:6;7139:9;7135:22;7114:53;:::i;:::-;7104:63;;7059:118;6710:474;;;;;:::o;7190:559::-;7276:6;7284;7333:2;7321:9;7312:7;7308:23;7304:32;7301:119;;;7339:79;;:::i;:::-;7301:119;7487:1;7476:9;7472:17;7459:31;7517:18;7509:6;7506:30;7503:117;;;7539:79;;:::i;:::-;7503:117;7652:80;7724:7;7715:6;7704:9;7700:22;7652:80;:::i;:::-;7634:98;;;;7430:312;7190:559;;;;;:::o;7755:323::-;7811:6;7860:2;7848:9;7839:7;7835:23;7831:32;7828:119;;;7866:79;;:::i;:::-;7828:119;7986:1;8011:50;8053:7;8044:6;8033:9;8029:22;8011:50;:::i;:::-;8001:60;;7957:114;7755:323;;;;:::o;8084:345::-;8151:6;8200:2;8188:9;8179:7;8175:23;8171:32;8168:119;;;8206:79;;:::i;:::-;8168:119;8326:1;8351:61;8404:7;8395:6;8384:9;8380:22;8351:61;:::i;:::-;8341:71;;8297:125;8084:345;;;;:::o;8435:327::-;8493:6;8542:2;8530:9;8521:7;8517:23;8513:32;8510:119;;;8548:79;;:::i;:::-;8510:119;8668:1;8693:52;8737:7;8728:6;8717:9;8713:22;8693:52;:::i;:::-;8683:62;;8639:116;8435:327;;;;:::o;8768:349::-;8837:6;8886:2;8874:9;8865:7;8861:23;8857:32;8854:119;;;8892:79;;:::i;:::-;8854:119;9012:1;9037:63;9092:7;9083:6;9072:9;9068:22;9037:63;:::i;:::-;9027:73;;8983:127;8768:349;;;;:::o;9123:359::-;9197:6;9246:2;9234:9;9225:7;9221:23;9217:32;9214:119;;;9252:79;;:::i;:::-;9214:119;9372:1;9397:68;9457:7;9448:6;9437:9;9433:22;9397:68;:::i;:::-;9387:78;;9343:132;9123:359;;;;:::o;9488:504::-;9571:6;9579;9628:2;9616:9;9607:7;9603:23;9599:32;9596:119;;;9634:79;;:::i;:::-;9596:119;9754:1;9779:68;9839:7;9830:6;9819:9;9815:22;9779:68;:::i;:::-;9769:78;;9725:132;9896:2;9922:53;9967:7;9958:6;9947:9;9943:22;9922:53;:::i;:::-;9912:63;;9867:118;9488:504;;;;;:::o;9998:509::-;10067:6;10116:2;10104:9;10095:7;10091:23;10087:32;10084:119;;;10122:79;;:::i;:::-;10084:119;10270:1;10259:9;10255:17;10242:31;10300:18;10292:6;10289:30;10286:117;;;10322:79;;:::i;:::-;10286:117;10427:63;10482:7;10473:6;10462:9;10458:22;10427:63;:::i;:::-;10417:73;;10213:287;9998:509;;;;:::o;10513:329::-;10572:6;10621:2;10609:9;10600:7;10596:23;10592:32;10589:119;;;10627:79;;:::i;:::-;10589:119;10747:1;10772:53;10817:7;10808:6;10797:9;10793:22;10772:53;:::i;:::-;10762:63;;10718:117;10513:329;;;;:::o;10848:351::-;10918:6;10967:2;10955:9;10946:7;10942:23;10938:32;10935:119;;;10973:79;;:::i;:::-;10935:119;11093:1;11118:64;11174:7;11165:6;11154:9;11150:22;11118:64;:::i;:::-;11108:74;;11064:128;10848:351;;;;:::o;11205:147::-;11300:45;11339:5;11300:45;:::i;:::-;11295:3;11288:58;11205:147;;:::o;11358:118::-;11445:24;11463:5;11445:24;:::i;:::-;11440:3;11433:37;11358:118;;:::o;11482:109::-;11563:21;11578:5;11563:21;:::i;:::-;11558:3;11551:34;11482:109;;:::o;11597:360::-;11683:3;11711:38;11743:5;11711:38;:::i;:::-;11765:70;11828:6;11823:3;11765:70;:::i;:::-;11758:77;;11844:52;11889:6;11884:3;11877:4;11870:5;11866:16;11844:52;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11687:270;11597:360;;;;:::o;11963:373::-;12067:3;12095:38;12127:5;12095:38;:::i;:::-;12149:88;12230:6;12225:3;12149:88;:::i;:::-;12142:95;;12246:52;12291:6;12286:3;12279:4;12272:5;12268:16;12246:52;:::i;:::-;12323:6;12318:3;12314:16;12307:23;;12071:265;11963:373;;;;:::o;12342:364::-;12430:3;12458:39;12491:5;12458:39;:::i;:::-;12513:71;12577:6;12572:3;12513:71;:::i;:::-;12506:78;;12593:52;12638:6;12633:3;12626:4;12619:5;12615:16;12593:52;:::i;:::-;12670:29;12692:6;12670:29;:::i;:::-;12665:3;12661:39;12654:46;;12434:272;12342:364;;;;:::o;12712:377::-;12818:3;12846:39;12879:5;12846:39;:::i;:::-;12901:89;12983:6;12978:3;12901:89;:::i;:::-;12894:96;;12999:52;13044:6;13039:3;13032:4;13025:5;13021:16;12999:52;:::i;:::-;13076:6;13071:3;13067:16;13060:23;;12822:267;12712:377;;;;:::o;13095:366::-;13237:3;13258:67;13322:2;13317:3;13258:67;:::i;:::-;13251:74;;13334:93;13423:3;13334:93;:::i;:::-;13452:2;13447:3;13443:12;13436:19;;13095:366;;;:::o;13467:::-;13609:3;13630:67;13694:2;13689:3;13630:67;:::i;:::-;13623:74;;13706:93;13795:3;13706:93;:::i;:::-;13824:2;13819:3;13815:12;13808:19;;13467:366;;;:::o;13839:::-;13981:3;14002:67;14066:2;14061:3;14002:67;:::i;:::-;13995:74;;14078:93;14167:3;14078:93;:::i;:::-;14196:2;14191:3;14187:12;14180:19;;13839:366;;;:::o;14211:::-;14353:3;14374:67;14438:2;14433:3;14374:67;:::i;:::-;14367:74;;14450:93;14539:3;14450:93;:::i;:::-;14568:2;14563:3;14559:12;14552:19;;14211:366;;;:::o;14583:::-;14725:3;14746:67;14810:2;14805:3;14746:67;:::i;:::-;14739:74;;14822:93;14911:3;14822:93;:::i;:::-;14940:2;14935:3;14931:12;14924:19;;14583:366;;;:::o;14955:::-;15097:3;15118:67;15182:2;15177:3;15118:67;:::i;:::-;15111:74;;15194:93;15283:3;15194:93;:::i;:::-;15312:2;15307:3;15303:12;15296:19;;14955:366;;;:::o;15327:::-;15469:3;15490:67;15554:2;15549:3;15490:67;:::i;:::-;15483:74;;15566:93;15655:3;15566:93;:::i;:::-;15684:2;15679:3;15675:12;15668:19;;15327:366;;;:::o;15699:::-;15841:3;15862:67;15926:2;15921:3;15862:67;:::i;:::-;15855:74;;15938:93;16027:3;15938:93;:::i;:::-;16056:2;16051:3;16047:12;16040:19;;15699:366;;;:::o;16071:::-;16213:3;16234:67;16298:2;16293:3;16234:67;:::i;:::-;16227:74;;16310:93;16399:3;16310:93;:::i;:::-;16428:2;16423:3;16419:12;16412:19;;16071:366;;;:::o;16443:::-;16585:3;16606:67;16670:2;16665:3;16606:67;:::i;:::-;16599:74;;16682:93;16771:3;16682:93;:::i;:::-;16800:2;16795:3;16791:12;16784:19;;16443:366;;;:::o;16815:::-;16957:3;16978:67;17042:2;17037:3;16978:67;:::i;:::-;16971:74;;17054:93;17143:3;17054:93;:::i;:::-;17172:2;17167:3;17163:12;17156:19;;16815:366;;;:::o;17187:::-;17329:3;17350:67;17414:2;17409:3;17350:67;:::i;:::-;17343:74;;17426:93;17515:3;17426:93;:::i;:::-;17544:2;17539:3;17535:12;17528:19;;17187:366;;;:::o;17559:::-;17701:3;17722:67;17786:2;17781:3;17722:67;:::i;:::-;17715:74;;17798:93;17887:3;17798:93;:::i;:::-;17916:2;17911:3;17907:12;17900:19;;17559:366;;;:::o;17931:398::-;18090:3;18111:83;18192:1;18187:3;18111:83;:::i;:::-;18104:90;;18203:93;18292:3;18203:93;:::i;:::-;18321:1;18316:3;18312:11;18305:18;;17931:398;;;:::o;18335:366::-;18477:3;18498:67;18562:2;18557:3;18498:67;:::i;:::-;18491:74;;18574:93;18663:3;18574:93;:::i;:::-;18692:2;18687:3;18683:12;18676:19;;18335:366;;;:::o;18707:::-;18849:3;18870:67;18934:2;18929:3;18870:67;:::i;:::-;18863:74;;18946:93;19035:3;18946:93;:::i;:::-;19064:2;19059:3;19055:12;19048:19;;18707:366;;;:::o;19079:::-;19221:3;19242:67;19306:2;19301:3;19242:67;:::i;:::-;19235:74;;19318:93;19407:3;19318:93;:::i;:::-;19436:2;19431:3;19427:12;19420:19;;19079:366;;;:::o;19451:::-;19593:3;19614:67;19678:2;19673:3;19614:67;:::i;:::-;19607:74;;19690:93;19779:3;19690:93;:::i;:::-;19808:2;19803:3;19799:12;19792:19;;19451:366;;;:::o;19823:118::-;19910:24;19928:5;19910:24;:::i;:::-;19905:3;19898:37;19823:118;;:::o;19947:271::-;20077:3;20099:93;20188:3;20179:6;20099:93;:::i;:::-;20092:100;;20209:3;20202:10;;19947:271;;;;:::o;20224:435::-;20404:3;20426:95;20517:3;20508:6;20426:95;:::i;:::-;20419:102;;20538:95;20629:3;20620:6;20538:95;:::i;:::-;20531:102;;20650:3;20643:10;;20224:435;;;;;:::o;20665:379::-;20849:3;20871:147;21014:3;20871:147;:::i;:::-;20864:154;;21035:3;21028:10;;20665:379;;;:::o;21050:222::-;21143:4;21181:2;21170:9;21166:18;21158:26;;21194:71;21262:1;21251:9;21247:17;21238:6;21194:71;:::i;:::-;21050:222;;;;:::o;21278:348::-;21407:4;21445:2;21434:9;21430:18;21422:26;;21458:79;21534:1;21523:9;21519:17;21510:6;21458:79;:::i;:::-;21547:72;21615:2;21604:9;21600:18;21591:6;21547:72;:::i;:::-;21278:348;;;;;:::o;21632:640::-;21827:4;21865:3;21854:9;21850:19;21842:27;;21879:71;21947:1;21936:9;21932:17;21923:6;21879:71;:::i;:::-;21960:72;22028:2;22017:9;22013:18;22004:6;21960:72;:::i;:::-;22042;22110:2;22099:9;22095:18;22086:6;22042:72;:::i;:::-;22161:9;22155:4;22151:20;22146:2;22135:9;22131:18;22124:48;22189:76;22260:4;22251:6;22189:76;:::i;:::-;22181:84;;21632:640;;;;;;;:::o;22278:332::-;22399:4;22437:2;22426:9;22422:18;22414:26;;22450:71;22518:1;22507:9;22503:17;22494:6;22450:71;:::i;:::-;22531:72;22599:2;22588:9;22584:18;22575:6;22531:72;:::i;:::-;22278:332;;;;;:::o;22616:210::-;22703:4;22741:2;22730:9;22726:18;22718:26;;22754:65;22816:1;22805:9;22801:17;22792:6;22754:65;:::i;:::-;22616:210;;;;:::o;22832:313::-;22945:4;22983:2;22972:9;22968:18;22960:26;;23032:9;23026:4;23022:20;23018:1;23007:9;23003:17;22996:47;23060:78;23133:4;23124:6;23060:78;:::i;:::-;23052:86;;22832:313;;;;:::o;23151:419::-;23317:4;23355:2;23344:9;23340:18;23332:26;;23404:9;23398:4;23394:20;23390:1;23379:9;23375:17;23368:47;23432:131;23558:4;23432:131;:::i;:::-;23424:139;;23151:419;;;:::o;23576:::-;23742:4;23780:2;23769:9;23765:18;23757:26;;23829:9;23823:4;23819:20;23815:1;23804:9;23800:17;23793:47;23857:131;23983:4;23857:131;:::i;:::-;23849:139;;23576:419;;;:::o;24001:::-;24167:4;24205:2;24194:9;24190:18;24182:26;;24254:9;24248:4;24244:20;24240:1;24229:9;24225:17;24218:47;24282:131;24408:4;24282:131;:::i;:::-;24274:139;;24001:419;;;:::o;24426:::-;24592:4;24630:2;24619:9;24615:18;24607:26;;24679:9;24673:4;24669:20;24665:1;24654:9;24650:17;24643:47;24707:131;24833:4;24707:131;:::i;:::-;24699:139;;24426:419;;;:::o;24851:::-;25017:4;25055:2;25044:9;25040:18;25032:26;;25104:9;25098:4;25094:20;25090:1;25079:9;25075:17;25068:47;25132:131;25258:4;25132:131;:::i;:::-;25124:139;;24851:419;;;:::o;25276:::-;25442:4;25480:2;25469:9;25465:18;25457:26;;25529:9;25523:4;25519:20;25515:1;25504:9;25500:17;25493:47;25557:131;25683:4;25557:131;:::i;:::-;25549:139;;25276:419;;;:::o;25701:::-;25867:4;25905:2;25894:9;25890:18;25882:26;;25954:9;25948:4;25944:20;25940:1;25929:9;25925:17;25918:47;25982:131;26108:4;25982:131;:::i;:::-;25974:139;;25701:419;;;:::o;26126:::-;26292:4;26330:2;26319:9;26315:18;26307:26;;26379:9;26373:4;26369:20;26365:1;26354:9;26350:17;26343:47;26407:131;26533:4;26407:131;:::i;:::-;26399:139;;26126:419;;;:::o;26551:::-;26717:4;26755:2;26744:9;26740:18;26732:26;;26804:9;26798:4;26794:20;26790:1;26779:9;26775:17;26768:47;26832:131;26958:4;26832:131;:::i;:::-;26824:139;;26551:419;;;:::o;26976:::-;27142:4;27180:2;27169:9;27165:18;27157:26;;27229:9;27223:4;27219:20;27215:1;27204:9;27200:17;27193:47;27257:131;27383:4;27257:131;:::i;:::-;27249:139;;26976:419;;;:::o;27401:::-;27567:4;27605:2;27594:9;27590:18;27582:26;;27654:9;27648:4;27644:20;27640:1;27629:9;27625:17;27618:47;27682:131;27808:4;27682:131;:::i;:::-;27674:139;;27401:419;;;:::o;27826:::-;27992:4;28030:2;28019:9;28015:18;28007:26;;28079:9;28073:4;28069:20;28065:1;28054:9;28050:17;28043:47;28107:131;28233:4;28107:131;:::i;:::-;28099:139;;27826:419;;;:::o;28251:::-;28417:4;28455:2;28444:9;28440:18;28432:26;;28504:9;28498:4;28494:20;28490:1;28479:9;28475:17;28468:47;28532:131;28658:4;28532:131;:::i;:::-;28524:139;;28251:419;;;:::o;28676:::-;28842:4;28880:2;28869:9;28865:18;28857:26;;28929:9;28923:4;28919:20;28915:1;28904:9;28900:17;28893:47;28957:131;29083:4;28957:131;:::i;:::-;28949:139;;28676:419;;;:::o;29101:::-;29267:4;29305:2;29294:9;29290:18;29282:26;;29354:9;29348:4;29344:20;29340:1;29329:9;29325:17;29318:47;29382:131;29508:4;29382:131;:::i;:::-;29374:139;;29101:419;;;:::o;29526:::-;29692:4;29730:2;29719:9;29715:18;29707:26;;29779:9;29773:4;29769:20;29765:1;29754:9;29750:17;29743:47;29807:131;29933:4;29807:131;:::i;:::-;29799:139;;29526:419;;;:::o;29951:::-;30117:4;30155:2;30144:9;30140:18;30132:26;;30204:9;30198:4;30194:20;30190:1;30179:9;30175:17;30168:47;30232:131;30358:4;30232:131;:::i;:::-;30224:139;;29951:419;;;:::o;30376:222::-;30469:4;30507:2;30496:9;30492:18;30484:26;;30520:71;30588:1;30577:9;30573:17;30564:6;30520:71;:::i;:::-;30376:222;;;;:::o;30604:129::-;30638:6;30665:20;;:::i;:::-;30655:30;;30694:33;30722:4;30714:6;30694:33;:::i;:::-;30604:129;;;:::o;30739:75::-;30772:6;30805:2;30799:9;30789:19;;30739:75;:::o;30820:307::-;30881:4;30971:18;30963:6;30960:30;30957:56;;;30993:18;;:::i;:::-;30957:56;31031:29;31053:6;31031:29;:::i;:::-;31023:37;;31115:4;31109;31105:15;31097:23;;30820:307;;;:::o;31133:308::-;31195:4;31285:18;31277:6;31274:30;31271:56;;;31307:18;;:::i;:::-;31271:56;31345:29;31367:6;31345:29;:::i;:::-;31337:37;;31429:4;31423;31419:15;31411:23;;31133:308;;;:::o;31447:98::-;31498:6;31532:5;31526:12;31516:22;;31447:98;;;:::o;31551:99::-;31603:6;31637:5;31631:12;31621:22;;31551:99;;;:::o;31656:168::-;31739:11;31773:6;31768:3;31761:19;31813:4;31808:3;31804:14;31789:29;;31656:168;;;;:::o;31830:147::-;31931:11;31968:3;31953:18;;31830:147;;;;:::o;31983:169::-;32067:11;32101:6;32096:3;32089:19;32141:4;32136:3;32132:14;32117:29;;31983:169;;;;:::o;32158:148::-;32260:11;32297:3;32282:18;;32158:148;;;;:::o;32312:305::-;32352:3;32371:20;32389:1;32371:20;:::i;:::-;32366:25;;32405:20;32423:1;32405:20;:::i;:::-;32400:25;;32559:1;32491:66;32487:74;32484:1;32481:81;32478:107;;;32565:18;;:::i;:::-;32478:107;32609:1;32606;32602:9;32595:16;;32312:305;;;;:::o;32623:185::-;32663:1;32680:20;32698:1;32680:20;:::i;:::-;32675:25;;32714:20;32732:1;32714:20;:::i;:::-;32709:25;;32753:1;32743:35;;32758:18;;:::i;:::-;32743:35;32800:1;32797;32793:9;32788:14;;32623:185;;;;:::o;32814:348::-;32854:7;32877:20;32895:1;32877:20;:::i;:::-;32872:25;;32911:20;32929:1;32911:20;:::i;:::-;32906:25;;33099:1;33031:66;33027:74;33024:1;33021:81;33016:1;33009:9;33002:17;32998:105;32995:131;;;33106:18;;:::i;:::-;32995:131;33154:1;33151;33147:9;33136:20;;32814:348;;;;:::o;33168:191::-;33208:4;33228:20;33246:1;33228:20;:::i;:::-;33223:25;;33262:20;33280:1;33262:20;:::i;:::-;33257:25;;33301:1;33298;33295:8;33292:34;;;33306:18;;:::i;:::-;33292:34;33351:1;33348;33344:9;33336:17;;33168:191;;;;:::o;33365:96::-;33402:7;33431:24;33449:5;33431:24;:::i;:::-;33420:35;;33365:96;;;:::o;33467:104::-;33512:7;33541:24;33559:5;33541:24;:::i;:::-;33530:35;;33467:104;;;:::o;33577:90::-;33611:7;33654:5;33647:13;33640:21;33629:32;;33577:90;;;:::o;33673:149::-;33709:7;33749:66;33742:5;33738:78;33727:89;;33673:149;;;:::o;33828:111::-;33880:7;33909:24;33927:5;33909:24;:::i;:::-;33898:35;;33828:111;;;:::o;33945:126::-;33982:7;34022:42;34015:5;34011:54;34000:65;;33945:126;;;:::o;34077:77::-;34114:7;34143:5;34132:16;;34077:77;;;:::o;34160:134::-;34218:9;34251:37;34282:5;34251:37;:::i;:::-;34238:50;;34160:134;;;:::o;34300:126::-;34350:9;34383:37;34414:5;34383:37;:::i;:::-;34370:50;;34300:126;;;:::o;34432:113::-;34482:9;34515:24;34533:5;34515:24;:::i;:::-;34502:37;;34432:113;;;:::o;34551:154::-;34635:6;34630:3;34625;34612:30;34697:1;34688:6;34683:3;34679:16;34672:27;34551:154;;;:::o;34711:307::-;34779:1;34789:113;34803:6;34800:1;34797:13;34789:113;;;34888:1;34883:3;34879:11;34873:18;34869:1;34864:3;34860:11;34853:39;34825:2;34822:1;34818:10;34813:15;;34789:113;;;34920:6;34917:1;34914:13;34911:101;;;35000:1;34991:6;34986:3;34982:16;34975:27;34911:101;34760:258;34711:307;;;:::o;35024:320::-;35068:6;35105:1;35099:4;35095:12;35085:22;;35152:1;35146:4;35142:12;35173:18;35163:81;;35229:4;35221:6;35217:17;35207:27;;35163:81;35291:2;35283:6;35280:14;35260:18;35257:38;35254:84;;;35310:18;;:::i;:::-;35254:84;35075:269;35024:320;;;:::o;35350:281::-;35433:27;35455:4;35433:27;:::i;:::-;35425:6;35421:40;35563:6;35551:10;35548:22;35527:18;35515:10;35512:34;35509:62;35506:88;;;35574:18;;:::i;:::-;35506:88;35614:10;35610:2;35603:22;35393:238;35350:281;;:::o;35637:233::-;35676:3;35699:24;35717:5;35699:24;:::i;:::-;35690:33;;35745:66;35738:5;35735:77;35732:103;;;35815:18;;:::i;:::-;35732:103;35862:1;35855:5;35851:13;35844:20;;35637:233;;;:::o;35876:176::-;35908:1;35925:20;35943:1;35925:20;:::i;:::-;35920:25;;35959:20;35977:1;35959:20;:::i;:::-;35954:25;;35998:1;35988:35;;36003:18;;:::i;:::-;35988:35;36044:1;36041;36037:9;36032:14;;35876:176;;;;:::o;36058:180::-;36106:77;36103:1;36096:88;36203:4;36200:1;36193:15;36227:4;36224:1;36217:15;36244:180;36292:77;36289:1;36282:88;36389:4;36386:1;36379:15;36413:4;36410:1;36403:15;36430:180;36478:77;36475:1;36468:88;36575:4;36572:1;36565:15;36599:4;36596:1;36589:15;36616:180;36664:77;36661:1;36654:88;36761:4;36758:1;36751:15;36785:4;36782:1;36775:15;36802:180;36850:77;36847:1;36840:88;36947:4;36944:1;36937:15;36971:4;36968:1;36961:15;36988:117;37097:1;37094;37087:12;37111:117;37220:1;37217;37210:12;37234:117;37343:1;37340;37333:12;37357:117;37466:1;37463;37456:12;37480:117;37589:1;37586;37579:12;37603:117;37712:1;37709;37702:12;37726:102;37767:6;37818:2;37814:7;37809:2;37802:5;37798:14;37794:28;37784:38;;37726:102;;;:::o;37834:179::-;37974:31;37970:1;37962:6;37958:14;37951:55;37834:179;:::o;38019:225::-;38159:34;38155:1;38147:6;38143:14;38136:58;38228:8;38223:2;38215:6;38211:15;38204:33;38019:225;:::o;38250:223::-;38390:34;38386:1;38378:6;38374:14;38367:58;38459:6;38454:2;38446:6;38442:15;38435:31;38250:223;:::o;38479:229::-;38619:34;38615:1;38607:6;38603:14;38596:58;38688:12;38683:2;38675:6;38671:15;38664:37;38479:229;:::o;38714:225::-;38854:34;38850:1;38842:6;38838:14;38831:58;38923:8;38918:2;38910:6;38906:15;38899:33;38714:225;:::o;38945:245::-;39085:34;39081:1;39073:6;39069:14;39062:58;39154:28;39149:2;39141:6;39137:15;39130:53;38945:245;:::o;39196:179::-;39336:31;39332:1;39324:6;39320:14;39313:55;39196:179;:::o;39381:225::-;39521:34;39517:1;39509:6;39505:14;39498:58;39590:8;39585:2;39577:6;39573:15;39566:33;39381:225;:::o;39612:230::-;39752:34;39748:1;39740:6;39736:14;39729:58;39821:13;39816:2;39808:6;39804:15;39797:38;39612:230;:::o;39848:180::-;39988:32;39984:1;39976:6;39972:14;39965:56;39848:180;:::o;40034:178::-;40174:30;40170:1;40162:6;40158:14;40151:54;40034:178;:::o;40218:182::-;40358:34;40354:1;40346:6;40342:14;40335:58;40218:182;:::o;40406:172::-;40546:24;40542:1;40534:6;40530:14;40523:48;40406:172;:::o;40584:114::-;;:::o;40704:165::-;40844:17;40840:1;40832:6;40828:14;40821:41;40704:165;:::o;40875:179::-;41015:31;41011:1;41003:6;40999:14;40992:55;40875:179;:::o;41060:229::-;41200:34;41196:1;41188:6;41184:14;41177:58;41269:12;41264:2;41256:6;41252:15;41245:37;41060:229;:::o;41295:181::-;41435:33;41431:1;41423:6;41419:14;41412:57;41295:181;:::o;41482:122::-;41555:24;41573:5;41555:24;:::i;:::-;41548:5;41545:35;41535:63;;41594:1;41591;41584:12;41535:63;41482:122;:::o;41610:138::-;41691:32;41717:5;41691:32;:::i;:::-;41684:5;41681:43;41671:71;;41738:1;41735;41728:12;41671:71;41610:138;:::o;41754:116::-;41824:21;41839:5;41824:21;:::i;:::-;41817:5;41814:32;41804:60;;41860:1;41857;41850:12;41804:60;41754:116;:::o;41876:120::-;41948:23;41965:5;41948:23;:::i;:::-;41941:5;41938:34;41928:62;;41986:1;41983;41976:12;41928:62;41876:120;:::o;42002:152::-;42090:39;42123:5;42090:39;:::i;:::-;42083:5;42080:50;42070:78;;42144:1;42141;42134:12;42070:78;42002:152;:::o;42160:122::-;42233:24;42251:5;42233:24;:::i;:::-;42226:5;42223:35;42213:63;;42272:1;42269;42262:12;42213:63;42160:122;:::o
Swarm Source
ipfs://6f181c7840dff94341ddb18eed92862cf8d6ebfd9dc25f6b8110229a78f49912
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,912.77 | 0.88 | $3,443.24 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.