ERC-721
Overview
Max Total Supply
999 METANAUTS
Holders
614
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 METANAUTSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Metanauts
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-15 */ // 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/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // 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/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/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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/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: @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/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/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: @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/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/NFT.sol pragma solidity ^0.8.4; contract Metanauts is ERC721Enumerable, Ownable, ReentrancyGuard, PaymentSplitter { using Strings for uint256; using Counters for Counters.Counter; struct PresaleConfig { uint256 startTime; uint256 duration; uint256 maxCount; } struct SaleConfig { uint256 startTime; uint256 maxCount; } uint16 public maxSupply = 9999; uint16 public maxSaleSupply = 9999; uint16 public maxPresaleSupply = 2000; uint16 public maxGiftSupply = 100; uint256 public presalePrice = 200000000000000000; //0.2 ETH uint256 public publicPrice = 250000000000000000; //0.25 ETH uint16 public giftCount; uint16 public presaleCount; uint16 public totalNFT; string public baseURI; string public notRevealedUri; string public baseExtension = ".json"; bool public isBurnEnabled; bool public paused = false; bool public revealed = false; PresaleConfig public presaleConfig; SaleConfig public saleConfig; Counters.Counter private _tokenIds; uint256[] private _teamShares = [25, 25, 25, 25]; address[] private _team = [ 0x18916B6C95f70eBa01691f8c0E012A25D10D88FD, 0xdaAa999893d6f960EDa2a9Fef41eb837aeFbCd8D, 0x9b9a030FEB6ed824b2139FCAea41cB7E9E24aD03, 0x1493802B39D454f62Aa400dFfBF4838eE9b92AE1 ]; mapping(address => bool) private _presaleList; mapping(address => uint256) public _presaleClaimed; mapping(address => uint256) public _giftClaimed; mapping(address => uint256) public _saleClaimed; mapping(address => uint256) public _totalClaimed; enum WorkflowStatus { CheckOnPresale, Presale, Sale, SoldOut } WorkflowStatus public workflow; event ChangePresaleConfig( uint256 _startTime, uint256 _duration, uint256 _maxCount ); event ChangeSaleConfig(uint256 _startTime, uint256 _maxCount); event ChangeIsBurnEnabled(bool _isBurnEnabled); event ChangeBaseURI(string _baseURI); event GiftMint(address indexed _recipient, uint256 _amount); event PresaleMint(address indexed _minter, uint256 _amount, uint256 _price); event SaleMint(address indexed _minter, uint256 _amount, uint256 _price); event WorkflowStatusChange( WorkflowStatus previousStatus, WorkflowStatus newStatus ); constructor() ERC721("Metanauts", "METANAUTS") PaymentSplitter(_team, _teamShares) ReentrancyGuard() {} function changePauseState() public onlyOwner { paused = !paused; } function setBaseURI(string calldata _tokenBaseURI) external onlyOwner { baseURI = _tokenBaseURI; emit ChangeBaseURI(_tokenBaseURI); } function _baseURI() internal view override returns (string memory) { return baseURI; } function reveal() public onlyOwner { revealed = true; } function addToPresaleList(address[] calldata _addresses) external onlyOwner { for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Metanauts: Can't add a zero address" ); if (_presaleList[_addresses[ind]] == false) { _presaleList[_addresses[ind]] = true; } } } function isOnPresaleList(address _address) external view returns (bool) { return _presaleList[_address]; } function removeFromPresaleList(address[] calldata _addresses) external onlyOwner { for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Metanauts: Can't remove a zero address" ); if (_presaleList[_addresses[ind]] == true) { _presaleList[_addresses[ind]] = false; } } } function setUpPresale(uint256 _duration) external onlyOwner { require( workflow == WorkflowStatus.CheckOnPresale, "Metanauts: Unauthorized Transaction" ); uint256 _startTime = block.timestamp; uint256 _maxCount = 2; presaleConfig = PresaleConfig(_startTime, _duration, _maxCount); emit ChangePresaleConfig(_startTime, _duration, _maxCount); workflow = WorkflowStatus.Presale; emit WorkflowStatusChange( WorkflowStatus.CheckOnPresale, WorkflowStatus.Presale ); } function setUpSale() external onlyOwner { require( workflow == WorkflowStatus.Presale, "Metanauts: Unauthorized Transaction" ); PresaleConfig memory _presaleConfig = presaleConfig; uint256 _presaleEndTime = _presaleConfig.startTime + _presaleConfig.duration; require( block.timestamp > _presaleEndTime, "Metanauts: Sale not started" ); uint256 _startTime = block.timestamp; uint256 _maxCount = 100; saleConfig = SaleConfig(_startTime, _maxCount); emit ChangeSaleConfig(_startTime, _maxCount); workflow = WorkflowStatus.Sale; emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale); } function setIsBurnEnabled(bool _isBurnEnabled) external onlyOwner { isBurnEnabled = _isBurnEnabled; emit ChangeIsBurnEnabled(_isBurnEnabled); } function giftMint(address[] calldata _addresses) external onlyOwner { require( totalNFT + _addresses.length <= maxSupply, "Metanauts: max total supply exceeded" ); require( giftCount + _addresses.length <= maxGiftSupply, "Metanauts: max gift supply exceeded" ); uint256 _newItemId; for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Metanauts: recepient is the null address" ); _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(_addresses[ind], _newItemId); _giftClaimed[_addresses[ind]] = _giftClaimed[_addresses[ind]] + 1; _totalClaimed[_addresses[ind]] = _totalClaimed[_addresses[ind]] + 1; totalNFT = totalNFT + 1; giftCount = giftCount + 1; } } function presaleMint(uint256 _amount) external payable nonReentrant { PresaleConfig memory _presaleConfig = presaleConfig; require( _amount <= 2, "Metanauts: You can't mint so much tokens" ); require( _presaleClaimed[msg.sender] + _amount <= 2, "Metanauts: You can't mint so much tokens" ); require( _presaleList[msg.sender] == true, " Metanauts: Caller is not on the presale list" ); require( _presaleConfig.startTime > 0, "Metanauts: Presale must be active to mint a NFT" ); require( block.timestamp >= _presaleConfig.startTime, "Metanauts: Presale not started" ); require( block.timestamp <= _presaleConfig.startTime + _presaleConfig.duration, "Metanauts: Presale is ended" ); require( totalNFT + _amount <= maxPresaleSupply, "Metanauts: max presale supply exceeded" ); require( totalNFT + _amount <= maxSupply, "Metanauts: max supply exceeded" ); require( presalePrice * _amount <= msg.value, "Metanauts: Ether value sent is not correct" ); require(!paused, "Metanauts: contract is paused"); uint256 _newItemId; for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(msg.sender, _newItemId); _presaleClaimed[msg.sender] = _presaleClaimed[msg.sender] + 1; _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + 1; totalNFT = totalNFT + 1; presaleCount = presaleCount + 1; } emit PresaleMint(msg.sender, _amount, presalePrice); } function saleMint(uint256 _amount) external payable nonReentrant { SaleConfig memory _saleConfig = saleConfig; require(_amount > 0, "Metanauts: zero amount"); require( _saleConfig.startTime > 0, "Metanauts: sale is not active" ); require( block.timestamp >= _saleConfig.startTime, "Metanauts: sale not started" ); require( totalNFT + _amount <= maxSupply, "Metanauts: max supply exceeded" ); require( totalNFT + _amount <= maxSaleSupply, "Metanauts: max supply exceeded" ); require( publicPrice * _amount <= msg.value, "Metanauts: Ether value sent is not correct" ); require(!paused, "Metanauts: contract is paused"); uint256 _newItemId; for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(msg.sender, _newItemId); _saleClaimed[msg.sender] = _saleClaimed[msg.sender] + 1; _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + 1; totalNFT = totalNFT + 1; } emit SaleMint(msg.sender, _amount, publicPrice); if (totalNFT + _amount == maxSupply) { workflow = WorkflowStatus.SoldOut; emit WorkflowStatusChange( WorkflowStatus.Sale, WorkflowStatus.SoldOut ); } } function getWorkflowStatus() public view returns (uint256) { uint256 _status; if (workflow == WorkflowStatus.CheckOnPresale) { _status = 1; } if (workflow == WorkflowStatus.Presale) { _status = 2; } if (workflow == WorkflowStatus.Sale) { _status = 3; } if (workflow == WorkflowStatus.SoldOut) { _status = 4; } return _status; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function changeTotalSupply(uint16 _newSupply) public onlyOwner { maxSupply = _newSupply; } function changeSaleSupply(uint16 _newSaleSupply) public onlyOwner { maxSaleSupply = _newSaleSupply; } function burn(uint256 tokenId) external { require(isBurnEnabled, "Metanauts: burning disabled"); require( _isApprovedOrOwner(msg.sender, tokenId), "Metanauts: burn caller is not owner nor approved" ); _burn(tokenId); totalNFT = totalNFT - 1; } function changePublicPrice(uint16 _newPublicPrice) public onlyOwner { publicPrice = _newPublicPrice; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"string","name":"_baseURI","type":"string"}],"name":"ChangeBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"ChangeIsBurnEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangePresaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangeSaleConfig","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":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"GiftMint","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":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"SaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum Metanauts.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum Metanauts.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_giftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_presaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_saleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToPresaleList","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newPublicPrice","type":"uint16"}],"name":"changePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newSaleSupply","type":"uint16"}],"name":"changeSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newSupply","type":"uint16"}],"name":"changeTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWorkflowStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isOnPresaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiftSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setIsBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[],"name":"workflow","outputs":[{"internalType":"enum Metanauts.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
601380546001600160401b031916666407d0270f270f1790556702c68af0bb1400006014556703782dace9d9000060155560c06040526005608081905264173539b7b760d91b60a090815262000059916019919062000605565b50601a805462ffff00191690556040805160808101825260198082526020820181905291810182905260608101919091526200009a90602190600462000694565b50604080516080810182527318916b6c95f70eba01691f8c0e012a25d10d88fd815273daaa999893d6f960eda2a9fef41eb837aefbcd8d6020820152739b9a030feb6ed824b2139fcaea41cb7e9e24ad0391810191909152731493802b39d454f62aa400dffbf4838ee9b92ae160608201526200011c906022906004620006d7565b503480156200012a57600080fd5b5060228054806020026020016040519081016040528092919081815260200182805480156200018357602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000164575b50505050506021805480602002602001604051908101604052809291908181526020018280548015620001d657602002820191906000526020600020905b815481526020019060010190808311620001c1575b5050505050604051806040016040528060098152602001684d6574616e6175747360b81b815250604051806040016040528060098152602001684d4554414e4155545360b81b81525081600090805190602001906200023792919062000605565b5080516200024d90600190602084019062000605565b5050506200026a62000264620003c160201b60201c565b620003c5565b6001600b558051825114620002e15760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003345760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620002d8565b60005b8251811015620003b857620003a38382815181106200036657634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106200038f57634e487b7160e01b600052603260045260246000fd5b60200260200101516200041760201b60201c565b80620003af816200079e565b91505062000337565b505050620007d2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004845760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620002d8565b60008111620004d65760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620002d8565b6001600160a01b0382166000908152600e602052604090205415620005525760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620002d8565b60108054600181019091557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b0384169081179091556000908152600e60205260409020819055600c54620005bc90829062000746565b600c55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620006139062000761565b90600052602060002090601f01602090048101928262000637576000855562000682565b82601f106200065257805160ff191683800117855562000682565b8280016001018555821562000682579182015b828111156200068257825182559160200191906001019062000665565b50620006909291506200072f565b5090565b82805482825590600052602060002090810192821562000682579160200282015b8281111562000682578251829060ff16905591602001919060010190620006b5565b82805482825590600052602060002090810192821562000682579160200282015b828111156200068257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620006f8565b5b8082111562000690576000815560010162000730565b600082198211156200075c576200075c620007bc565b500190565b600181811c908216806200077657607f821691505b602082108114156200079857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620007b557620007b5620007bc565b5060010190565b634e487b7160e01b600052601160045260246000fd5b614b0180620007e26000396000f3fe6080604052600436106103fc5760003560e01c80637204a3c911610213578063b88d4fde11610123578063da3ef23f116100ab578063ed7003741161007a578063ed70037414610ce7578063f2c4ce1e14610d02578063f2fde38b14610d22578063f75d64a614610d42578063fd88fa6914610d5757600080fd5b8063da3ef23f14610c30578063de00a68b14610c50578063e33b7de314610c89578063e985e9c514610c9e57600080fd5b8063c9b298f1116100f2578063c9b298f114610b75578063cde27a3514610b88578063ce7c2ac214610ba9578063d5abeb0114610bdf578063d79779b214610bfa57600080fd5b8063b88d4fde14610b00578063c668286214610b20578063c7b3743314610b35578063c87b56dd14610b5557600080fd5b80639852595c116101a6578063a584e4c811610175578063a584e4c814610a69578063a5fd7bec14610a89578063a945bf8014610aa9578063b179e06014610abf578063b29418d514610adf57600080fd5b80639852595c146109d7578063a22cb46514610a0d578063a334412514610a2d578063a475b5dd14610a5457600080fd5b80638cc4de19116101e25780638cc4de19146109475780638da5cb5b1461097457806390aa0b0f1461099257806395d89b41146109c257600080fd5b80637204a3c9146108c75780637f674f48146108e75780638b83209b146109145780638ca887ca1461093457600080fd5b806342842e0e1161030e57806355f804b3116102a15780636c0360eb116102705780636c0360eb1461083d5780636e0e5b191461085257806370a0823114610872578063710e132d14610892578063715018a6146108b257600080fd5b806355f804b3146107b95780635c975abb146107d95780635edbc28c146107f85780636352211e1461081d57600080fd5b80634bb721e6116102dd5780634bb721e61461072c5780634f6ccce71461074c578063518302271461076c57806352d728d91461078c57600080fd5b806342842e0e146106b757806342966c68146106d757806346e79ffc146106f757806348b750441461070c57600080fd5b806309c3fbb71161039157806321bdb26e1161036057806321bdb26e146105fa57806323b872dd1461061c5780632f745c591461063c5780633a98ef391461065c578063406072a91461067157600080fd5b806309c3fbb71461058357806318160ddd146105b057806319165587146105c55780631f2898c3146105e557600080fd5b806307ebec27116103cd57806307ebec27146104fa578063081812fc14610514578063081c8c441461054c578063095ea7b31461056157600080fd5b80620e7fa81461044a5780624563791461047357806301ffc9a7146104a857806306fdde03146104d857600080fd5b36610445577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561045657600080fd5b5061046060145481565b6040519081526020015b60405180910390f35b34801561047f57600080fd5b5060165461049590600160201b900461ffff1681565b60405161ffff909116815260200161046a565b3480156104b457600080fd5b506104c86104c3366004614389565b610d91565b604051901515815260200161046a565b3480156104e457600080fd5b506104ed610dbc565b60405161046a9190614687565b34801561050657600080fd5b50601a546104c89060ff1681565b34801561052057600080fd5b5061053461052f366004614496565b610e4e565b6040516001600160a01b03909116815260200161046a565b34801561055857600080fd5b506104ed610ee8565b34801561056d57600080fd5b5061058161057c3660046142b6565b610f76565b005b34801561058f57600080fd5b5061046061059e366004614178565b60266020526000908152604090205481565b3480156105bc57600080fd5b50600854610460565b3480156105d157600080fd5b506105816105e0366004614178565b61108c565b3480156105f157600080fd5b506105816111bb565b34801561060657600080fd5b5060135461049590600160201b900461ffff1681565b34801561062857600080fd5b506105816106373660046141cc565b611358565b34801561064857600080fd5b506104606106573660046142b6565b611389565b34801561066857600080fd5b50600c54610460565b34801561067d57600080fd5b5061046061068c3660046143c1565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b3480156106c357600080fd5b506105816106d23660046141cc565b61141f565b3480156106e357600080fd5b506105816106f2366004614496565b61143a565b34801561070357600080fd5b5061058161153d565b34801561071857600080fd5b506105816107273660046143c1565b611584565b34801561073857600080fd5b50610581610747366004614474565b61176c565b34801561075857600080fd5b50610460610767366004614496565b6117b6565b34801561077857600080fd5b50601a546104c89062010000900460ff1681565b34801561079857600080fd5b506104606107a7366004614178565b60256020526000908152604090205481565b3480156107c557600080fd5b506105816107d43660046143d3565b611857565b3480156107e557600080fd5b50601a546104c890610100900460ff1681565b34801561080457600080fd5b50601354610495906601000000000000900461ffff1681565b34801561082957600080fd5b50610534610838366004614496565b6118cb565b34801561084957600080fd5b506104ed611942565b34801561085e57600080fd5b5061058161086d366004614351565b61194f565b34801561087e57600080fd5b5061046061088d366004614178565b6119c0565b34801561089e57600080fd5b506105816108ad366004614496565b611a47565b3480156108be57600080fd5b50610581611b62565b3480156108d357600080fd5b506105816108e23660046142e1565b611b98565b3480156108f357600080fd5b50610460610902366004614178565b60276020526000908152604090205481565b34801561092057600080fd5b5061053461092f366004614496565b611d37565b610581610942366004614496565b611d75565b34801561095357600080fd5b50610460610962366004614178565b60246020526000908152604090205481565b34801561098057600080fd5b50600a546001600160a01b0316610534565b34801561099e57600080fd5b50601e54601f546109ad919082565b6040805192835260208301919091520161046a565b3480156109ce57600080fd5b506104ed61215b565b3480156109e357600080fd5b506104606109f2366004614178565b6001600160a01b03166000908152600f602052604090205490565b348015610a1957600080fd5b50610581610a28366004614289565b61216a565b348015610a3957600080fd5b50602854610a479060ff1681565b60405161046a919061462f565b348015610a6057600080fd5b50610581612179565b348015610a7557600080fd5b50610581610a84366004614474565b6121b6565b348015610a9557600080fd5b50610581610aa43660046142e1565b6121e9565b348015610ab557600080fd5b5061046060155481565b348015610acb57600080fd5b50610581610ada3660046142e1565b6125ea565b348015610aeb57600080fd5b506013546104959062010000900461ffff1681565b348015610b0c57600080fd5b50610581610b1b36600461420c565b612792565b348015610b2c57600080fd5b506104ed6127c4565b348015610b4157600080fd5b50610581610b50366004614474565b6127d1565b348015610b6157600080fd5b506104ed610b70366004614496565b612813565b610581610b83366004614496565b612993565b348015610b9457600080fd5b506016546104959062010000900461ffff1681565b348015610bb557600080fd5b50610460610bc4366004614178565b6001600160a01b03166000908152600e602052604090205490565b348015610beb57600080fd5b506013546104959061ffff1681565b348015610c0657600080fd5b50610460610c15366004614178565b6001600160a01b031660009081526011602052604090205490565b348015610c3c57600080fd5b50610581610c4b36600461442e565b612e85565b348015610c5c57600080fd5b506104c8610c6b366004614178565b6001600160a01b031660009081526023602052604090205460ff1690565b348015610c9557600080fd5b50600d54610460565b348015610caa57600080fd5b506104c8610cb9366004614194565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cf357600080fd5b506016546104959061ffff1681565b348015610d0e57600080fd5b50610581610d1d36600461442e565b612ec2565b348015610d2e57600080fd5b50610581610d3d366004614178565b612eff565b348015610d4e57600080fd5b50610460612f9a565b348015610d6357600080fd5b50601b54601c54601d54610d7692919083565b6040805193845260208401929092529082015260600161046a565b60006001600160e01b0319821663780e9d6360e01b1480610db65750610db682613065565b92915050565b606060008054610dcb906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df7906149e6565b8015610e445780601f10610e1957610100808354040283529160200191610e44565b820191906000526020600020905b815481529060010190602001808311610e2757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ecc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60188054610ef5906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f21906149e6565b8015610f6e5780601f10610f4357610100808354040283529160200191610f6e565b820191906000526020600020905b815481529060010190602001808311610f5157829003601f168201915b505050505081565b6000610f81826118cb565b9050806001600160a01b0316836001600160a01b03161415610fef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ec3565b336001600160a01b038216148061100b575061100b8133610cb9565b61107d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ec3565b61108783836130b5565b505050565b6001600160a01b0381166000908152600e60205260409020546110c15760405162461bcd60e51b8152600401610ec3906146ec565b60006110cc600d5490565b6110d69047614935565b9050600061110383836110fe866001600160a01b03166000908152600f602052604090205490565b613123565b9050806111225760405162461bcd60e51b8152600401610ec39061477c565b6001600160a01b0383166000908152600f60205260408120805483929061114a908490614935565b9250508190555080600d60008282546111639190614935565b9091555061117390508382613169565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b031633146111e55760405162461bcd60e51b8152600401610ec3906147c7565b600160285460ff16600381111561120c57634e487b7160e01b600052602160045260246000fd5b146112295760405162461bcd60e51b8152600401610ec3906147fc565b60408051606081018252601b54808252601c5460208301819052601d5493830193909352909160009161125c9190614935565b90508042116112ad5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2053616c65206e6f74207374617274656400000000006044820152606401610ec3565b6040805180820182524280825260646020928301819052601e829055601f8190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a16028805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f9161134a916001919061463d565b60405180910390a150505050565b6113623382613282565b61137e5760405162461bcd60e51b8152600401610ec39061483f565b611087838383613378565b6000611394836119c0565b82106113f65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ec3565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61108783838360405180602001604052806000815250612792565b601a5460ff1661148c5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a206275726e696e672064697361626c656400000000006044820152606401610ec3565b6114963382613282565b6114fb5760405162461bcd60e51b815260206004820152603060248201527f4d6574616e617574733a206275726e2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610ec3565b61150481613523565b60165461151e90600190600160201b900461ffff16614980565b601660046101000a81548161ffff021916908361ffff16021790555050565b600a546001600160a01b031633146115675760405162461bcd60e51b8152600401610ec3906147c7565b601a805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0381166000908152600e60205260409020546115b95760405162461bcd60e51b8152600401610ec3906146ec565b6001600160a01b0382166000908152601160205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561161157600080fd5b505afa158015611625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164991906144ae565b6116539190614935565b9050600061168c83836110fe87876001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b9050806116ab5760405162461bcd60e51b8152600401610ec39061477c565b6001600160a01b038085166000908152601260209081526040808320938716835292905290812080548392906116e2908490614935565b90915550506001600160a01b0384166000908152601160205260408120805483929061170f908490614935565b9091555061172090508484836135ca565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600a546001600160a01b031633146117965760405162461bcd60e51b8152600401610ec3906147c7565b6013805461ffff909216620100000263ffff000019909216919091179055565b60006117c160085490565b82106118245760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ec3565b6008828154811061184557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146118815760405162461bcd60e51b8152600401610ec3906147c7565b61188d60178383613ff5565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516118bf929190614658565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610db65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ec3565b60178054610ef5906149e6565b600a546001600160a01b031633146119795760405162461bcd60e51b8152600401610ec3906147c7565b601a805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f39060200160405180910390a150565b60006001600160a01b038216611a2b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ec3565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611a715760405162461bcd60e51b8152600401610ec3906147c7565b600060285460ff166003811115611a9857634e487b7160e01b600052602160045260246000fd5b14611ab55760405162461bcd60e51b8152600401610ec3906147fc565b60408051606080820183524280835260208084018690526002938501849052601b829055601c869055601d8490558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a16028805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916111ae916000919061463d565b600a546001600160a01b03163314611b8c5760405162461bcd60e51b8152600401610ec3906147c7565b611b96600061361c565b565b600a546001600160a01b03163314611bc25760405162461bcd60e51b8152600401610ec3906147c7565b60005b81811015611087576000838383818110611bef57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c049190614178565b6001600160a01b03161415611c675760405162461bcd60e51b815260206004820152602360248201527f4d6574616e617574733a2043616e2774206164642061207a65726f206164647260448201526265737360e81b6064820152608401610ec3565b60236000848484818110611c8b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ca09190614178565b6001600160a01b0316815260208101919091526040016000205460ff16611d2557600160236000858585818110611ce757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cfc9190614178565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611d2f81614a21565b915050611bc5565b600060108281548110611d5a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b541415611dc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ec3565b6002600b5560408051808201909152601e548152601f54602082015281611e2a5760405162461bcd60e51b815260206004820152601660248201527513595d185b985d5d1cce881e995c9bc8185b5bdd5b9d60521b6044820152606401610ec3565b8051611e785760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a2073616c65206973206e6f74206163746976650000006044820152606401610ec3565b8051421015611ec95760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2073616c65206e6f74207374617274656400000000006044820152606401610ec3565b60135460165461ffff91821691611eea918591600160201b90910416614935565b1115611f085760405162461bcd60e51b8152600401610ec390614890565b60135460165461ffff62010000909204821691611f2f918591600160201b90910416614935565b1115611f4d5760405162461bcd60e51b8152600401610ec390614890565b3482601554611f5c9190614961565b1115611f7a5760405162461bcd60e51b8152600401610ec390614732565b601a54610100900460ff1615611fd25760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a20636f6e7472616374206973207061757365640000006044820152606401610ec3565b6000805b8381101561209a57611fec602080546001019055565b6020549150611ffb338361366e565b33600090815260266020526040902054612016906001614935565b3360009081526026602090815260408083209390935560279052205461203d906001614935565b3360009081526027602052604090205560165461206690600160201b900461ffff16600161490f565b6016805461ffff92909216600160201b0265ffff00000000199092169190911790558061209281614a21565b915050611fd6565b5060155460405133917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20916120d791878252602082015260400190565b60405180910390a260135460165461ffff91821691612100918691600160201b90910416614935565b1415612151576028805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f91612148916002919061463d565b60405180910390a15b50506001600b5550565b606060018054610dcb906149e6565b612175338383613688565b5050565b600a546001600160a01b031633146121a35760405162461bcd60e51b8152600401610ec3906147c7565b601a805462ff0000191662010000179055565b600a546001600160a01b031633146121e05760405162461bcd60e51b8152600401610ec3906147c7565b61ffff16601555565b600a546001600160a01b031633146122135760405162461bcd60e51b8152600401610ec3906147c7565b60135460165461ffff91821691612234918491600160201b90910416614935565b111561228e5760405162461bcd60e51b8152602060048201526024808201527f4d6574616e617574733a206d617820746f74616c20737570706c7920657863656044820152631959195960e21b6064820152608401610ec3565b60135460165461ffff66010000000000009092048216916122b191849116614935565b111561230b5760405162461bcd60e51b815260206004820152602360248201527f4d6574616e617574733a206d6178206769667420737570706c7920657863656560448201526219195960ea1b6064820152608401610ec3565b6000805b828110156125e457600084848381811061233957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061234e9190614178565b6001600160a01b031614156123b65760405162461bcd60e51b815260206004820152602860248201527f4d6574616e617574733a20726563657069656e7420697320746865206e756c6c604482015267206164647265737360c01b6064820152608401610ec3565b6123c4602080546001019055565b60205491506124078484838181106123ec57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124019190614178565b8361366e565b6025600085858481811061242b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124409190614178565b6001600160a01b03168152602081019190915260400160002054612465906001614935565b6025600086868581811061248957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061249e9190614178565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602760008585848181106124e657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124fb9190614178565b6001600160a01b03168152602081019190915260400160002054612520906001614935565b6027600086868581811061254457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906125599190614178565b6001600160a01b0316815260208101919091526040016000205560165461258c90600160201b900461ffff16600161490f565b6016805461ffff928316600160201b0265ffff0000000019821681179092556125bc92918216911617600161490f565b6016805461ffff191661ffff92909216919091179055806125dc81614a21565b91505061230f565b50505050565b600a546001600160a01b031633146126145760405162461bcd60e51b8152600401610ec3906147c7565b60005b8181101561108757600083838381811061264157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126569190614178565b6001600160a01b031614156126bc5760405162461bcd60e51b815260206004820152602660248201527f4d6574616e617574733a2043616e27742072656d6f76652061207a65726f206160448201526564647265737360d01b6064820152608401610ec3565b602360008484848181106126e057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126f59190614178565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156127805760006023600085858581811061274257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906127579190614178565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061278a81614a21565b915050612617565b61279c3383613282565b6127b85760405162461bcd60e51b8152600401610ec39061483f565b6125e484848484613757565b60198054610ef5906149e6565b600a546001600160a01b031633146127fb5760405162461bcd60e51b8152600401610ec3906147c7565b6013805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166128925760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ec3565b601a5462010000900460ff1661293457601880546128af906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546128db906149e6565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b50505050509050919050565b600061293e61378a565b9050600081511161295e576040518060200160405280600081525061298c565b8061296884613799565b601960405160200161297c93929190614530565b6040516020818303038152906040525b9392505050565b6002600b5414156129e65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ec3565b6002600b81905560408051606081018252601b548152601c546020820152601d549181019190915290821115612a2e5760405162461bcd60e51b8152600401610ec3906148c7565b33600090815260246020526040902054600290612a4c908490614935565b1115612a6a5760405162461bcd60e51b8152600401610ec3906148c7565b3360009081526023602052604090205460ff161515600114612ae45760405162461bcd60e51b815260206004820152602d60248201527f204d6574616e617574733a2043616c6c6572206973206e6f74206f6e2074686560448201526c081c1c995cd85b19481b1a5cdd609a1b6064820152608401610ec3565b8051612b4a5760405162461bcd60e51b815260206004820152602f60248201527f4d6574616e617574733a2050726573616c65206d75737420626520616374697660448201526e19481d1bc81b5a5b9d081848139195608a1b6064820152608401610ec3565b8051421015612b9b5760405162461bcd60e51b815260206004820152601e60248201527f4d6574616e617574733a2050726573616c65206e6f74207374617274656400006044820152606401610ec3565b60208101518151612bac9190614935565b421115612bfb5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2050726573616c6520697320656e64656400000000006044820152606401610ec3565b60135460165461ffff600160201b92839004811692612c1f92869291900416614935565b1115612c7c5760405162461bcd60e51b815260206004820152602660248201527f4d6574616e617574733a206d61782070726573616c6520737570706c7920657860448201526518d95959195960d21b6064820152608401610ec3565b60135460165461ffff91821691612c9d918591600160201b90910416614935565b1115612cbb5760405162461bcd60e51b8152600401610ec390614890565b3482601454612cca9190614961565b1115612ce85760405162461bcd60e51b8152600401610ec390614732565b601a54610100900460ff1615612d405760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a20636f6e7472616374206973207061757365640000006044820152606401610ec3565b6000805b83811015612e3657612d5a602080546001019055565b6020549150612d69338361366e565b33600090815260246020526040902054612d84906001614935565b33600090815260246020908152604080832093909355602790522054612dab906001614935565b33600090815260276020526040902055601654612dd490600160201b900461ffff16600161490f565b6016805465ffff000000001916600160201b61ffff938416021790819055612e05916201000090910416600161490f565b6016805461ffff92909216620100000263ffff00001990921691909117905580612e2e81614a21565b915050612d44565b5060145460405133917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e091612e7391878252602082015260400190565b60405180910390a250506001600b5550565b600a546001600160a01b03163314612eaf5760405162461bcd60e51b8152600401610ec3906147c7565b8051612175906019906020840190614079565b600a546001600160a01b03163314612eec5760405162461bcd60e51b8152600401610ec3906147c7565b8051612175906018906020840190614079565b600a546001600160a01b03163314612f295760405162461bcd60e51b8152600401610ec3906147c7565b6001600160a01b038116612f8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ec3565b612f978161361c565b50565b6000808060285460ff166003811115612fc357634e487b7160e01b600052602160045260246000fd5b1415612fcd575060015b600160285460ff166003811115612ff457634e487b7160e01b600052602160045260246000fd5b1415612ffe575060025b600260285460ff16600381111561302557634e487b7160e01b600052602160045260246000fd5b141561302f575060035b600360285460ff16600381111561305657634e487b7160e01b600052602160045260246000fd5b1415613060575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061309657506001600160e01b03198216635b5e139f60e01b145b80610db657506301ffc9a760e01b6001600160e01b0319831614610db6565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130ea826118cb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0384166000908152600e60205260408120549091839161314d9086614961565b613157919061494d565b61316191906149a3565b949350505050565b804710156131b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ec3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613206576040519150601f19603f3d011682016040523d82523d6000602084013e61320b565b606091505b50509050806110875760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ec3565b6000818152600260205260408120546001600160a01b03166132fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ec3565b6000613306836118cb565b9050806001600160a01b0316846001600160a01b031614806133415750836001600160a01b031661333684610e4e565b6001600160a01b0316145b8061316157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b031661338b826118cb565b6001600160a01b0316146133f35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ec3565b6001600160a01b0382166134555760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ec3565b6134608383836138b3565b61346b6000826130b5565b6001600160a01b03831660009081526003602052604081208054600192906134949084906149a3565b90915550506001600160a01b03821660009081526003602052604081208054600192906134c2908490614935565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061352e826118cb565b905061353c816000846138b3565b6135476000836130b5565b6001600160a01b03811660009081526003602052604081208054600192906135709084906149a3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261108790849061396b565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612175828260405180602001604052806000815250613a3d565b816001600160a01b0316836001600160a01b031614156136ea5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ec3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613762848484613378565b61376e84848484613a70565b6125e45760405162461bcd60e51b8152600401610ec39061469a565b606060178054610dcb906149e6565b6060816137bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156137e757806137d181614a21565b91506137e09050600a8361494d565b91506137c1565b60008167ffffffffffffffff81111561381057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561383a576020820181803683370190505b5090505b84156131615761384f6001836149a3565b915061385c600a86614a3c565b613867906030614935565b60f81b81838151811061388a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506138ac600a8661494d565b945061383e565b6001600160a01b03831661390e5761390981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613931565b816001600160a01b0316836001600160a01b031614613931576139318382613b7d565b6001600160a01b0382166139485761108781613c1a565b826001600160a01b0316826001600160a01b031614611087576110878282613cf3565b60006139c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d379092919063ffffffff16565b80519091501561108757808060200190518101906139de919061436d565b6110875760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ec3565b613a478383613d46565b613a546000848484613a70565b6110875760405162461bcd60e51b8152600401610ec39061469a565b60006001600160a01b0384163b15613b7257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ab49033908990889088906004016145f2565b602060405180830381600087803b158015613ace57600080fd5b505af1925050508015613afe575060408051601f3d908101601f19168201909252613afb918101906143a5565b60015b613b58573d808015613b2c576040519150601f19603f3d011682016040523d82523d6000602084013e613b31565b606091505b508051613b505760405162461bcd60e51b8152600401610ec39061469a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613161565b506001949350505050565b60006001613b8a846119c0565b613b9491906149a3565b600083815260076020526040902054909150808214613be7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613c2c906001906149a3565b60008381526009602052604081205460088054939450909284908110613c6257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110613c9157634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613cd757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613cfe836119c0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606131618484600085613e94565b6001600160a01b038216613d9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ec3565b6000818152600260205260409020546001600160a01b031615613e015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ec3565b613e0d600083836138b3565b6001600160a01b0382166000908152600360205260408120805460019290613e36908490614935565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613ef55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ec3565b843b613f435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec3565b600080866001600160a01b03168587604051613f5f9190614514565b60006040518083038185875af1925050503d8060008114613f9c576040519150601f19603f3d011682016040523d82523d6000602084013e613fa1565b606091505b5091509150613fb1828286613fbc565b979650505050505050565b60608315613fcb57508161298c565b825115613fdb5782518084602001fd5b8160405162461bcd60e51b8152600401610ec39190614687565b828054614001906149e6565b90600052602060002090601f0160209004810192826140235760008555614069565b82601f1061403c5782800160ff19823516178555614069565b82800160010185558215614069579182015b8281111561406957823582559160200191906001019061404e565b506140759291506140ed565b5090565b828054614085906149e6565b90600052602060002090601f0160209004810192826140a75760008555614069565b82601f106140c057805160ff1916838001178555614069565b82800160010185558215614069579182015b828111156140695782518255916020019190600101906140d2565b5b8082111561407557600081556001016140ee565b600067ffffffffffffffff8084111561411d5761411d614a7c565b604051601f8501601f19908116603f0116810190828211818310171561414557614145614a7c565b8160405280935085815286868601111561415e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215614189578081fd5b813561298c81614a92565b600080604083850312156141a6578081fd5b82356141b181614a92565b915060208301356141c181614a92565b809150509250929050565b6000806000606084860312156141e0578081fd5b83356141eb81614a92565b925060208401356141fb81614a92565b929592945050506040919091013590565b60008060008060808587031215614221578081fd5b843561422c81614a92565b9350602085013561423c81614a92565b925060408501359150606085013567ffffffffffffffff81111561425e578182fd5b8501601f8101871361426e578182fd5b61427d87823560208401614102565b91505092959194509250565b6000806040838503121561429b578182fd5b82356142a681614a92565b915060208301356141c181614aa7565b600080604083850312156142c8578182fd5b82356142d381614a92565b946020939093013593505050565b600080602083850312156142f3578182fd5b823567ffffffffffffffff8082111561430a578384fd5b818501915085601f83011261431d578384fd5b81358181111561432b578485fd5b8660208260051b850101111561433f578485fd5b60209290920196919550909350505050565b600060208284031215614362578081fd5b813561298c81614aa7565b60006020828403121561437e578081fd5b815161298c81614aa7565b60006020828403121561439a578081fd5b813561298c81614ab5565b6000602082840312156143b6578081fd5b815161298c81614ab5565b600080604083850312156141a6578182fd5b600080602083850312156143e5578182fd5b823567ffffffffffffffff808211156143fc578384fd5b818501915085601f83011261440f578384fd5b81358181111561441d578485fd5b86602082850101111561433f578485fd5b60006020828403121561443f578081fd5b813567ffffffffffffffff811115614455578182fd5b8201601f81018413614465578182fd5b61316184823560208401614102565b600060208284031215614485578081fd5b813561ffff8116811461298c578182fd5b6000602082840312156144a7578081fd5b5035919050565b6000602082840312156144bf578081fd5b5051919050565b600081518084526144de8160208601602086016149ba565b601f01601f19169290920160200192915050565b6004811061451057634e487b7160e01b600052602160045260246000fd5b9052565b600082516145268184602087016149ba565b9190910192915050565b6000845160206145438285838a016149ba565b8551918401916145568184848a016149ba565b85549201918390600181811c908083168061457257607f831692505b85831081141561459057634e487b7160e01b88526022600452602488fd5b8080156145a457600181146145b5576145e1565b60ff198516885283880195506145e1565b60008b815260209020895b858110156145d95781548a8201529084019088016145c0565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614625908301846144c6565b9695505050505050565b60208101610db682846144f2565b6040810161464b82856144f2565b61298c60208301846144f2565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061298c60208301846144c6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602a908201527f4d6574616e617574733a2045746865722076616c75652073656e74206973206e6040820152691bdd0818dbdc9c9958dd60b21b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f4d6574616e617574733a20556e617574686f72697a6564205472616e7361637460408201526234b7b760e91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f4d6574616e617574733a206d617820737570706c792065786365656465640000604082015260600190565b60208082526028908201527f4d6574616e617574733a20596f752063616e2774206d696e7420736f206d75636040820152676820746f6b656e7360c01b606082015260800190565b600061ffff80831681851680830382111561492c5761492c614a50565b01949350505050565b6000821982111561494857614948614a50565b500190565b60008261495c5761495c614a66565b500490565b600081600019048311821515161561497b5761497b614a50565b500290565b600061ffff8381169083168181101561499b5761499b614a50565b039392505050565b6000828210156149b5576149b5614a50565b500390565b60005b838110156149d55781810151838201526020016149bd565b838111156125e45750506000910152565b600181811c908216806149fa57607f821691505b60208210811415614a1b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614a3557614a35614a50565b5060010190565b600082614a4b57614a4b614a66565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612f9757600080fd5b8015158114612f9757600080fd5b6001600160e01b031981168114612f9757600080fdfea26469706673582212205741bf2afd5e87fbf5c7718b0c8ccb327744966fe99518fcc64ff72a4a3b9c8164736f6c63430008040033
Deployed Bytecode
0x6080604052600436106103fc5760003560e01c80637204a3c911610213578063b88d4fde11610123578063da3ef23f116100ab578063ed7003741161007a578063ed70037414610ce7578063f2c4ce1e14610d02578063f2fde38b14610d22578063f75d64a614610d42578063fd88fa6914610d5757600080fd5b8063da3ef23f14610c30578063de00a68b14610c50578063e33b7de314610c89578063e985e9c514610c9e57600080fd5b8063c9b298f1116100f2578063c9b298f114610b75578063cde27a3514610b88578063ce7c2ac214610ba9578063d5abeb0114610bdf578063d79779b214610bfa57600080fd5b8063b88d4fde14610b00578063c668286214610b20578063c7b3743314610b35578063c87b56dd14610b5557600080fd5b80639852595c116101a6578063a584e4c811610175578063a584e4c814610a69578063a5fd7bec14610a89578063a945bf8014610aa9578063b179e06014610abf578063b29418d514610adf57600080fd5b80639852595c146109d7578063a22cb46514610a0d578063a334412514610a2d578063a475b5dd14610a5457600080fd5b80638cc4de19116101e25780638cc4de19146109475780638da5cb5b1461097457806390aa0b0f1461099257806395d89b41146109c257600080fd5b80637204a3c9146108c75780637f674f48146108e75780638b83209b146109145780638ca887ca1461093457600080fd5b806342842e0e1161030e57806355f804b3116102a15780636c0360eb116102705780636c0360eb1461083d5780636e0e5b191461085257806370a0823114610872578063710e132d14610892578063715018a6146108b257600080fd5b806355f804b3146107b95780635c975abb146107d95780635edbc28c146107f85780636352211e1461081d57600080fd5b80634bb721e6116102dd5780634bb721e61461072c5780634f6ccce71461074c578063518302271461076c57806352d728d91461078c57600080fd5b806342842e0e146106b757806342966c68146106d757806346e79ffc146106f757806348b750441461070c57600080fd5b806309c3fbb71161039157806321bdb26e1161036057806321bdb26e146105fa57806323b872dd1461061c5780632f745c591461063c5780633a98ef391461065c578063406072a91461067157600080fd5b806309c3fbb71461058357806318160ddd146105b057806319165587146105c55780631f2898c3146105e557600080fd5b806307ebec27116103cd57806307ebec27146104fa578063081812fc14610514578063081c8c441461054c578063095ea7b31461056157600080fd5b80620e7fa81461044a5780624563791461047357806301ffc9a7146104a857806306fdde03146104d857600080fd5b36610445577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561045657600080fd5b5061046060145481565b6040519081526020015b60405180910390f35b34801561047f57600080fd5b5060165461049590600160201b900461ffff1681565b60405161ffff909116815260200161046a565b3480156104b457600080fd5b506104c86104c3366004614389565b610d91565b604051901515815260200161046a565b3480156104e457600080fd5b506104ed610dbc565b60405161046a9190614687565b34801561050657600080fd5b50601a546104c89060ff1681565b34801561052057600080fd5b5061053461052f366004614496565b610e4e565b6040516001600160a01b03909116815260200161046a565b34801561055857600080fd5b506104ed610ee8565b34801561056d57600080fd5b5061058161057c3660046142b6565b610f76565b005b34801561058f57600080fd5b5061046061059e366004614178565b60266020526000908152604090205481565b3480156105bc57600080fd5b50600854610460565b3480156105d157600080fd5b506105816105e0366004614178565b61108c565b3480156105f157600080fd5b506105816111bb565b34801561060657600080fd5b5060135461049590600160201b900461ffff1681565b34801561062857600080fd5b506105816106373660046141cc565b611358565b34801561064857600080fd5b506104606106573660046142b6565b611389565b34801561066857600080fd5b50600c54610460565b34801561067d57600080fd5b5061046061068c3660046143c1565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b3480156106c357600080fd5b506105816106d23660046141cc565b61141f565b3480156106e357600080fd5b506105816106f2366004614496565b61143a565b34801561070357600080fd5b5061058161153d565b34801561071857600080fd5b506105816107273660046143c1565b611584565b34801561073857600080fd5b50610581610747366004614474565b61176c565b34801561075857600080fd5b50610460610767366004614496565b6117b6565b34801561077857600080fd5b50601a546104c89062010000900460ff1681565b34801561079857600080fd5b506104606107a7366004614178565b60256020526000908152604090205481565b3480156107c557600080fd5b506105816107d43660046143d3565b611857565b3480156107e557600080fd5b50601a546104c890610100900460ff1681565b34801561080457600080fd5b50601354610495906601000000000000900461ffff1681565b34801561082957600080fd5b50610534610838366004614496565b6118cb565b34801561084957600080fd5b506104ed611942565b34801561085e57600080fd5b5061058161086d366004614351565b61194f565b34801561087e57600080fd5b5061046061088d366004614178565b6119c0565b34801561089e57600080fd5b506105816108ad366004614496565b611a47565b3480156108be57600080fd5b50610581611b62565b3480156108d357600080fd5b506105816108e23660046142e1565b611b98565b3480156108f357600080fd5b50610460610902366004614178565b60276020526000908152604090205481565b34801561092057600080fd5b5061053461092f366004614496565b611d37565b610581610942366004614496565b611d75565b34801561095357600080fd5b50610460610962366004614178565b60246020526000908152604090205481565b34801561098057600080fd5b50600a546001600160a01b0316610534565b34801561099e57600080fd5b50601e54601f546109ad919082565b6040805192835260208301919091520161046a565b3480156109ce57600080fd5b506104ed61215b565b3480156109e357600080fd5b506104606109f2366004614178565b6001600160a01b03166000908152600f602052604090205490565b348015610a1957600080fd5b50610581610a28366004614289565b61216a565b348015610a3957600080fd5b50602854610a479060ff1681565b60405161046a919061462f565b348015610a6057600080fd5b50610581612179565b348015610a7557600080fd5b50610581610a84366004614474565b6121b6565b348015610a9557600080fd5b50610581610aa43660046142e1565b6121e9565b348015610ab557600080fd5b5061046060155481565b348015610acb57600080fd5b50610581610ada3660046142e1565b6125ea565b348015610aeb57600080fd5b506013546104959062010000900461ffff1681565b348015610b0c57600080fd5b50610581610b1b36600461420c565b612792565b348015610b2c57600080fd5b506104ed6127c4565b348015610b4157600080fd5b50610581610b50366004614474565b6127d1565b348015610b6157600080fd5b506104ed610b70366004614496565b612813565b610581610b83366004614496565b612993565b348015610b9457600080fd5b506016546104959062010000900461ffff1681565b348015610bb557600080fd5b50610460610bc4366004614178565b6001600160a01b03166000908152600e602052604090205490565b348015610beb57600080fd5b506013546104959061ffff1681565b348015610c0657600080fd5b50610460610c15366004614178565b6001600160a01b031660009081526011602052604090205490565b348015610c3c57600080fd5b50610581610c4b36600461442e565b612e85565b348015610c5c57600080fd5b506104c8610c6b366004614178565b6001600160a01b031660009081526023602052604090205460ff1690565b348015610c9557600080fd5b50600d54610460565b348015610caa57600080fd5b506104c8610cb9366004614194565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610cf357600080fd5b506016546104959061ffff1681565b348015610d0e57600080fd5b50610581610d1d36600461442e565b612ec2565b348015610d2e57600080fd5b50610581610d3d366004614178565b612eff565b348015610d4e57600080fd5b50610460612f9a565b348015610d6357600080fd5b50601b54601c54601d54610d7692919083565b6040805193845260208401929092529082015260600161046a565b60006001600160e01b0319821663780e9d6360e01b1480610db65750610db682613065565b92915050565b606060008054610dcb906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df7906149e6565b8015610e445780601f10610e1957610100808354040283529160200191610e44565b820191906000526020600020905b815481529060010190602001808311610e2757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ecc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60188054610ef5906149e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f21906149e6565b8015610f6e5780601f10610f4357610100808354040283529160200191610f6e565b820191906000526020600020905b815481529060010190602001808311610f5157829003601f168201915b505050505081565b6000610f81826118cb565b9050806001600160a01b0316836001600160a01b03161415610fef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ec3565b336001600160a01b038216148061100b575061100b8133610cb9565b61107d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ec3565b61108783836130b5565b505050565b6001600160a01b0381166000908152600e60205260409020546110c15760405162461bcd60e51b8152600401610ec3906146ec565b60006110cc600d5490565b6110d69047614935565b9050600061110383836110fe866001600160a01b03166000908152600f602052604090205490565b613123565b9050806111225760405162461bcd60e51b8152600401610ec39061477c565b6001600160a01b0383166000908152600f60205260408120805483929061114a908490614935565b9250508190555080600d60008282546111639190614935565b9091555061117390508382613169565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b031633146111e55760405162461bcd60e51b8152600401610ec3906147c7565b600160285460ff16600381111561120c57634e487b7160e01b600052602160045260246000fd5b146112295760405162461bcd60e51b8152600401610ec3906147fc565b60408051606081018252601b54808252601c5460208301819052601d5493830193909352909160009161125c9190614935565b90508042116112ad5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2053616c65206e6f74207374617274656400000000006044820152606401610ec3565b6040805180820182524280825260646020928301819052601e829055601f8190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a16028805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f9161134a916001919061463d565b60405180910390a150505050565b6113623382613282565b61137e5760405162461bcd60e51b8152600401610ec39061483f565b611087838383613378565b6000611394836119c0565b82106113f65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ec3565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61108783838360405180602001604052806000815250612792565b601a5460ff1661148c5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a206275726e696e672064697361626c656400000000006044820152606401610ec3565b6114963382613282565b6114fb5760405162461bcd60e51b815260206004820152603060248201527f4d6574616e617574733a206275726e2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610ec3565b61150481613523565b60165461151e90600190600160201b900461ffff16614980565b601660046101000a81548161ffff021916908361ffff16021790555050565b600a546001600160a01b031633146115675760405162461bcd60e51b8152600401610ec3906147c7565b601a805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0381166000908152600e60205260409020546115b95760405162461bcd60e51b8152600401610ec3906146ec565b6001600160a01b0382166000908152601160205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561161157600080fd5b505afa158015611625573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164991906144ae565b6116539190614935565b9050600061168c83836110fe87876001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b9050806116ab5760405162461bcd60e51b8152600401610ec39061477c565b6001600160a01b038085166000908152601260209081526040808320938716835292905290812080548392906116e2908490614935565b90915550506001600160a01b0384166000908152601160205260408120805483929061170f908490614935565b9091555061172090508484836135ca565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600a546001600160a01b031633146117965760405162461bcd60e51b8152600401610ec3906147c7565b6013805461ffff909216620100000263ffff000019909216919091179055565b60006117c160085490565b82106118245760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ec3565b6008828154811061184557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146118815760405162461bcd60e51b8152600401610ec3906147c7565b61188d60178383613ff5565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516118bf929190614658565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610db65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ec3565b60178054610ef5906149e6565b600a546001600160a01b031633146119795760405162461bcd60e51b8152600401610ec3906147c7565b601a805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f39060200160405180910390a150565b60006001600160a01b038216611a2b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ec3565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611a715760405162461bcd60e51b8152600401610ec3906147c7565b600060285460ff166003811115611a9857634e487b7160e01b600052602160045260246000fd5b14611ab55760405162461bcd60e51b8152600401610ec3906147fc565b60408051606080820183524280835260208084018690526002938501849052601b829055601c869055601d8490558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a16028805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916111ae916000919061463d565b600a546001600160a01b03163314611b8c5760405162461bcd60e51b8152600401610ec3906147c7565b611b96600061361c565b565b600a546001600160a01b03163314611bc25760405162461bcd60e51b8152600401610ec3906147c7565b60005b81811015611087576000838383818110611bef57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c049190614178565b6001600160a01b03161415611c675760405162461bcd60e51b815260206004820152602360248201527f4d6574616e617574733a2043616e2774206164642061207a65726f206164647260448201526265737360e81b6064820152608401610ec3565b60236000848484818110611c8b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ca09190614178565b6001600160a01b0316815260208101919091526040016000205460ff16611d2557600160236000858585818110611ce757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cfc9190614178565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611d2f81614a21565b915050611bc5565b600060108281548110611d5a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b541415611dc85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ec3565b6002600b5560408051808201909152601e548152601f54602082015281611e2a5760405162461bcd60e51b815260206004820152601660248201527513595d185b985d5d1cce881e995c9bc8185b5bdd5b9d60521b6044820152606401610ec3565b8051611e785760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a2073616c65206973206e6f74206163746976650000006044820152606401610ec3565b8051421015611ec95760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2073616c65206e6f74207374617274656400000000006044820152606401610ec3565b60135460165461ffff91821691611eea918591600160201b90910416614935565b1115611f085760405162461bcd60e51b8152600401610ec390614890565b60135460165461ffff62010000909204821691611f2f918591600160201b90910416614935565b1115611f4d5760405162461bcd60e51b8152600401610ec390614890565b3482601554611f5c9190614961565b1115611f7a5760405162461bcd60e51b8152600401610ec390614732565b601a54610100900460ff1615611fd25760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a20636f6e7472616374206973207061757365640000006044820152606401610ec3565b6000805b8381101561209a57611fec602080546001019055565b6020549150611ffb338361366e565b33600090815260266020526040902054612016906001614935565b3360009081526026602090815260408083209390935560279052205461203d906001614935565b3360009081526027602052604090205560165461206690600160201b900461ffff16600161490f565b6016805461ffff92909216600160201b0265ffff00000000199092169190911790558061209281614a21565b915050611fd6565b5060155460405133917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20916120d791878252602082015260400190565b60405180910390a260135460165461ffff91821691612100918691600160201b90910416614935565b1415612151576028805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f91612148916002919061463d565b60405180910390a15b50506001600b5550565b606060018054610dcb906149e6565b612175338383613688565b5050565b600a546001600160a01b031633146121a35760405162461bcd60e51b8152600401610ec3906147c7565b601a805462ff0000191662010000179055565b600a546001600160a01b031633146121e05760405162461bcd60e51b8152600401610ec3906147c7565b61ffff16601555565b600a546001600160a01b031633146122135760405162461bcd60e51b8152600401610ec3906147c7565b60135460165461ffff91821691612234918491600160201b90910416614935565b111561228e5760405162461bcd60e51b8152602060048201526024808201527f4d6574616e617574733a206d617820746f74616c20737570706c7920657863656044820152631959195960e21b6064820152608401610ec3565b60135460165461ffff66010000000000009092048216916122b191849116614935565b111561230b5760405162461bcd60e51b815260206004820152602360248201527f4d6574616e617574733a206d6178206769667420737570706c7920657863656560448201526219195960ea1b6064820152608401610ec3565b6000805b828110156125e457600084848381811061233957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061234e9190614178565b6001600160a01b031614156123b65760405162461bcd60e51b815260206004820152602860248201527f4d6574616e617574733a20726563657069656e7420697320746865206e756c6c604482015267206164647265737360c01b6064820152608401610ec3565b6123c4602080546001019055565b60205491506124078484838181106123ec57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124019190614178565b8361366e565b6025600085858481811061242b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124409190614178565b6001600160a01b03168152602081019190915260400160002054612465906001614935565b6025600086868581811061248957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061249e9190614178565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602760008585848181106124e657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124fb9190614178565b6001600160a01b03168152602081019190915260400160002054612520906001614935565b6027600086868581811061254457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906125599190614178565b6001600160a01b0316815260208101919091526040016000205560165461258c90600160201b900461ffff16600161490f565b6016805461ffff928316600160201b0265ffff0000000019821681179092556125bc92918216911617600161490f565b6016805461ffff191661ffff92909216919091179055806125dc81614a21565b91505061230f565b50505050565b600a546001600160a01b031633146126145760405162461bcd60e51b8152600401610ec3906147c7565b60005b8181101561108757600083838381811061264157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126569190614178565b6001600160a01b031614156126bc5760405162461bcd60e51b815260206004820152602660248201527f4d6574616e617574733a2043616e27742072656d6f76652061207a65726f206160448201526564647265737360d01b6064820152608401610ec3565b602360008484848181106126e057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126f59190614178565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156127805760006023600085858581811061274257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906127579190614178565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061278a81614a21565b915050612617565b61279c3383613282565b6127b85760405162461bcd60e51b8152600401610ec39061483f565b6125e484848484613757565b60198054610ef5906149e6565b600a546001600160a01b031633146127fb5760405162461bcd60e51b8152600401610ec3906147c7565b6013805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166128925760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ec3565b601a5462010000900460ff1661293457601880546128af906149e6565b80601f01602080910402602001604051908101604052809291908181526020018280546128db906149e6565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b50505050509050919050565b600061293e61378a565b9050600081511161295e576040518060200160405280600081525061298c565b8061296884613799565b601960405160200161297c93929190614530565b6040516020818303038152906040525b9392505050565b6002600b5414156129e65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ec3565b6002600b81905560408051606081018252601b548152601c546020820152601d549181019190915290821115612a2e5760405162461bcd60e51b8152600401610ec3906148c7565b33600090815260246020526040902054600290612a4c908490614935565b1115612a6a5760405162461bcd60e51b8152600401610ec3906148c7565b3360009081526023602052604090205460ff161515600114612ae45760405162461bcd60e51b815260206004820152602d60248201527f204d6574616e617574733a2043616c6c6572206973206e6f74206f6e2074686560448201526c081c1c995cd85b19481b1a5cdd609a1b6064820152608401610ec3565b8051612b4a5760405162461bcd60e51b815260206004820152602f60248201527f4d6574616e617574733a2050726573616c65206d75737420626520616374697660448201526e19481d1bc81b5a5b9d081848139195608a1b6064820152608401610ec3565b8051421015612b9b5760405162461bcd60e51b815260206004820152601e60248201527f4d6574616e617574733a2050726573616c65206e6f74207374617274656400006044820152606401610ec3565b60208101518151612bac9190614935565b421115612bfb5760405162461bcd60e51b815260206004820152601b60248201527f4d6574616e617574733a2050726573616c6520697320656e64656400000000006044820152606401610ec3565b60135460165461ffff600160201b92839004811692612c1f92869291900416614935565b1115612c7c5760405162461bcd60e51b815260206004820152602660248201527f4d6574616e617574733a206d61782070726573616c6520737570706c7920657860448201526518d95959195960d21b6064820152608401610ec3565b60135460165461ffff91821691612c9d918591600160201b90910416614935565b1115612cbb5760405162461bcd60e51b8152600401610ec390614890565b3482601454612cca9190614961565b1115612ce85760405162461bcd60e51b8152600401610ec390614732565b601a54610100900460ff1615612d405760405162461bcd60e51b815260206004820152601d60248201527f4d6574616e617574733a20636f6e7472616374206973207061757365640000006044820152606401610ec3565b6000805b83811015612e3657612d5a602080546001019055565b6020549150612d69338361366e565b33600090815260246020526040902054612d84906001614935565b33600090815260246020908152604080832093909355602790522054612dab906001614935565b33600090815260276020526040902055601654612dd490600160201b900461ffff16600161490f565b6016805465ffff000000001916600160201b61ffff938416021790819055612e05916201000090910416600161490f565b6016805461ffff92909216620100000263ffff00001990921691909117905580612e2e81614a21565b915050612d44565b5060145460405133917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e091612e7391878252602082015260400190565b60405180910390a250506001600b5550565b600a546001600160a01b03163314612eaf5760405162461bcd60e51b8152600401610ec3906147c7565b8051612175906019906020840190614079565b600a546001600160a01b03163314612eec5760405162461bcd60e51b8152600401610ec3906147c7565b8051612175906018906020840190614079565b600a546001600160a01b03163314612f295760405162461bcd60e51b8152600401610ec3906147c7565b6001600160a01b038116612f8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ec3565b612f978161361c565b50565b6000808060285460ff166003811115612fc357634e487b7160e01b600052602160045260246000fd5b1415612fcd575060015b600160285460ff166003811115612ff457634e487b7160e01b600052602160045260246000fd5b1415612ffe575060025b600260285460ff16600381111561302557634e487b7160e01b600052602160045260246000fd5b141561302f575060035b600360285460ff16600381111561305657634e487b7160e01b600052602160045260246000fd5b1415613060575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061309657506001600160e01b03198216635b5e139f60e01b145b80610db657506301ffc9a760e01b6001600160e01b0319831614610db6565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130ea826118cb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0384166000908152600e60205260408120549091839161314d9086614961565b613157919061494d565b61316191906149a3565b949350505050565b804710156131b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ec3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613206576040519150601f19603f3d011682016040523d82523d6000602084013e61320b565b606091505b50509050806110875760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ec3565b6000818152600260205260408120546001600160a01b03166132fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ec3565b6000613306836118cb565b9050806001600160a01b0316846001600160a01b031614806133415750836001600160a01b031661333684610e4e565b6001600160a01b0316145b8061316157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b031661338b826118cb565b6001600160a01b0316146133f35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ec3565b6001600160a01b0382166134555760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ec3565b6134608383836138b3565b61346b6000826130b5565b6001600160a01b03831660009081526003602052604081208054600192906134949084906149a3565b90915550506001600160a01b03821660009081526003602052604081208054600192906134c2908490614935565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061352e826118cb565b905061353c816000846138b3565b6135476000836130b5565b6001600160a01b03811660009081526003602052604081208054600192906135709084906149a3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261108790849061396b565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612175828260405180602001604052806000815250613a3d565b816001600160a01b0316836001600160a01b031614156136ea5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ec3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613762848484613378565b61376e84848484613a70565b6125e45760405162461bcd60e51b8152600401610ec39061469a565b606060178054610dcb906149e6565b6060816137bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156137e757806137d181614a21565b91506137e09050600a8361494d565b91506137c1565b60008167ffffffffffffffff81111561381057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561383a576020820181803683370190505b5090505b84156131615761384f6001836149a3565b915061385c600a86614a3c565b613867906030614935565b60f81b81838151811061388a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506138ac600a8661494d565b945061383e565b6001600160a01b03831661390e5761390981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613931565b816001600160a01b0316836001600160a01b031614613931576139318382613b7d565b6001600160a01b0382166139485761108781613c1a565b826001600160a01b0316826001600160a01b031614611087576110878282613cf3565b60006139c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d379092919063ffffffff16565b80519091501561108757808060200190518101906139de919061436d565b6110875760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ec3565b613a478383613d46565b613a546000848484613a70565b6110875760405162461bcd60e51b8152600401610ec39061469a565b60006001600160a01b0384163b15613b7257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ab49033908990889088906004016145f2565b602060405180830381600087803b158015613ace57600080fd5b505af1925050508015613afe575060408051601f3d908101601f19168201909252613afb918101906143a5565b60015b613b58573d808015613b2c576040519150601f19603f3d011682016040523d82523d6000602084013e613b31565b606091505b508051613b505760405162461bcd60e51b8152600401610ec39061469a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613161565b506001949350505050565b60006001613b8a846119c0565b613b9491906149a3565b600083815260076020526040902054909150808214613be7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613c2c906001906149a3565b60008381526009602052604081205460088054939450909284908110613c6257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110613c9157634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613cd757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613cfe836119c0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60606131618484600085613e94565b6001600160a01b038216613d9c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ec3565b6000818152600260205260409020546001600160a01b031615613e015760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ec3565b613e0d600083836138b3565b6001600160a01b0382166000908152600360205260408120805460019290613e36908490614935565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613ef55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ec3565b843b613f435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ec3565b600080866001600160a01b03168587604051613f5f9190614514565b60006040518083038185875af1925050503d8060008114613f9c576040519150601f19603f3d011682016040523d82523d6000602084013e613fa1565b606091505b5091509150613fb1828286613fbc565b979650505050505050565b60608315613fcb57508161298c565b825115613fdb5782518084602001fd5b8160405162461bcd60e51b8152600401610ec39190614687565b828054614001906149e6565b90600052602060002090601f0160209004810192826140235760008555614069565b82601f1061403c5782800160ff19823516178555614069565b82800160010185558215614069579182015b8281111561406957823582559160200191906001019061404e565b506140759291506140ed565b5090565b828054614085906149e6565b90600052602060002090601f0160209004810192826140a75760008555614069565b82601f106140c057805160ff1916838001178555614069565b82800160010185558215614069579182015b828111156140695782518255916020019190600101906140d2565b5b8082111561407557600081556001016140ee565b600067ffffffffffffffff8084111561411d5761411d614a7c565b604051601f8501601f19908116603f0116810190828211818310171561414557614145614a7c565b8160405280935085815286868601111561415e57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215614189578081fd5b813561298c81614a92565b600080604083850312156141a6578081fd5b82356141b181614a92565b915060208301356141c181614a92565b809150509250929050565b6000806000606084860312156141e0578081fd5b83356141eb81614a92565b925060208401356141fb81614a92565b929592945050506040919091013590565b60008060008060808587031215614221578081fd5b843561422c81614a92565b9350602085013561423c81614a92565b925060408501359150606085013567ffffffffffffffff81111561425e578182fd5b8501601f8101871361426e578182fd5b61427d87823560208401614102565b91505092959194509250565b6000806040838503121561429b578182fd5b82356142a681614a92565b915060208301356141c181614aa7565b600080604083850312156142c8578182fd5b82356142d381614a92565b946020939093013593505050565b600080602083850312156142f3578182fd5b823567ffffffffffffffff8082111561430a578384fd5b818501915085601f83011261431d578384fd5b81358181111561432b578485fd5b8660208260051b850101111561433f578485fd5b60209290920196919550909350505050565b600060208284031215614362578081fd5b813561298c81614aa7565b60006020828403121561437e578081fd5b815161298c81614aa7565b60006020828403121561439a578081fd5b813561298c81614ab5565b6000602082840312156143b6578081fd5b815161298c81614ab5565b600080604083850312156141a6578182fd5b600080602083850312156143e5578182fd5b823567ffffffffffffffff808211156143fc578384fd5b818501915085601f83011261440f578384fd5b81358181111561441d578485fd5b86602082850101111561433f578485fd5b60006020828403121561443f578081fd5b813567ffffffffffffffff811115614455578182fd5b8201601f81018413614465578182fd5b61316184823560208401614102565b600060208284031215614485578081fd5b813561ffff8116811461298c578182fd5b6000602082840312156144a7578081fd5b5035919050565b6000602082840312156144bf578081fd5b5051919050565b600081518084526144de8160208601602086016149ba565b601f01601f19169290920160200192915050565b6004811061451057634e487b7160e01b600052602160045260246000fd5b9052565b600082516145268184602087016149ba565b9190910192915050565b6000845160206145438285838a016149ba565b8551918401916145568184848a016149ba565b85549201918390600181811c908083168061457257607f831692505b85831081141561459057634e487b7160e01b88526022600452602488fd5b8080156145a457600181146145b5576145e1565b60ff198516885283880195506145e1565b60008b815260209020895b858110156145d95781548a8201529084019088016145c0565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614625908301846144c6565b9695505050505050565b60208101610db682846144f2565b6040810161464b82856144f2565b61298c60208301846144f2565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061298c60208301846144c6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602a908201527f4d6574616e617574733a2045746865722076616c75652073656e74206973206e6040820152691bdd0818dbdc9c9958dd60b21b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f4d6574616e617574733a20556e617574686f72697a6564205472616e7361637460408201526234b7b760e91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f4d6574616e617574733a206d617820737570706c792065786365656465640000604082015260600190565b60208082526028908201527f4d6574616e617574733a20596f752063616e2774206d696e7420736f206d75636040820152676820746f6b656e7360c01b606082015260800190565b600061ffff80831681851680830382111561492c5761492c614a50565b01949350505050565b6000821982111561494857614948614a50565b500190565b60008261495c5761495c614a66565b500490565b600081600019048311821515161561497b5761497b614a50565b500290565b600061ffff8381169083168181101561499b5761499b614a50565b039392505050565b6000828210156149b5576149b5614a50565b500390565b60005b838110156149d55781810151838201526020016149bd565b838111156125e45750506000910152565b600181811c908216806149fa57607f821691505b60208210811415614a1b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614a3557614a35614a50565b5060010190565b600082614a4b57614a4b614a66565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612f9757600080fd5b8015158114612f9757600080fd5b6001600160e01b031981168114612f9757600080fdfea26469706673582212205741bf2afd5e87fbf5c7718b0c8ccb327744966fe99518fcc64ff72a4a3b9c8164736f6c63430008040033
Deployed Bytecode Sourcemap
63199:12395:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28055:40;10003:10;28055:40;;;-1:-1:-1;;;;;10780:32:1;;;10762:51;;28085:9:0;10844:2:1;10829:18;;10822:34;10735:18;28055:40:0;;;;;;;63199:12395;;;;;63753:48;;;;;;;;;;;;;;;;;;;31813:25:1;;;31801:2;31786:18;63753:48:0;;;;;;;;63946:22;;;;;;;;;;-1:-1:-1;63946:22:0;;;;-1:-1:-1;;;63946:22:0;;;;;;;;;31648:6:1;31636:19;;;31618:38;;31606:2;31591:18;63946:22:0;31573:89:1;56982:224:0;;;;;;;;;;-1:-1:-1;56982:224:0;;;;;:::i;:::-;;:::i;:::-;;;11804:14:1;;11797:22;11779:41;;11767:2;11752:18;56982:224:0;11734:92:1;44476:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64082:25::-;;;;;;;;;;-1:-1:-1;64082:25:0;;;;;;;;46035:221;;;;;;;;;;-1:-1:-1;46035:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10536:32:1;;;10518:51;;10506:2;10491:18;46035:221:0;10473:102:1;64003:28:0;;;;;;;;;;;;;:::i;45558:411::-;;;;;;;;;;-1:-1:-1;45558:411:0;;;;;:::i;:::-;;:::i;:::-;;64773:47;;;;;;;;;;-1:-1:-1;64773:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;57622:113;;;;;;;;;;-1:-1:-1;57710:10:0;:17;57622:113;;29841:566;;;;;;;;;;-1:-1:-1;29841:566:0;;;;;:::i;:::-;;:::i;67909:776::-;;;;;;;;;;;;;:::i;63669:37::-;;;;;;;;;;-1:-1:-1;63669:37:0;;;;-1:-1:-1;;;63669:37:0;;;;;;46785:339;;;;;;;;;;-1:-1:-1;46785:339:0;;;;;:::i;:::-;;:::i;57290:256::-;;;;;;;;;;-1:-1:-1;57290:256:0;;;;;:::i;:::-;;:::i;28186:91::-;;;;;;;;;;-1:-1:-1;28257:12:0;;28186:91;;29315:135;;;;;;;;;;-1:-1:-1;29315:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;29412:21:0;;;29385:7;29412:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;29315:135;47195:185;;;;;;;;;;-1:-1:-1;47195:185:0;;;;;:::i;:::-;;:::i;75148:319::-;;;;;;;;;;-1:-1:-1;75148:319:0;;;;;:::i;:::-;;:::i;65807:80::-;;;;;;;;;;;;;:::i;30675:641::-;;;;;;;;;;-1:-1:-1;30675:641:0;;;;;:::i;:::-;;:::i;75025:115::-;;;;;;;;;;-1:-1:-1;75025:115:0;;;;;:::i;:::-;;:::i;57812:233::-;;;;;;;;;;-1:-1:-1;57812:233:0;;;;;:::i;:::-;;:::i;64147:28::-;;;;;;;;;;-1:-1:-1;64147:28:0;;;;;;;;;;;64719:47;;;;;;;;;;-1:-1:-1;64719:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;65895:156;;;;;;;;;;-1:-1:-1;65895:156:0;;;;;:::i;:::-;;:::i;64114:26::-;;;;;;;;;;-1:-1:-1;64114:26:0;;;;;;;;;;;63713:33;;;;;;;;;;-1:-1:-1;63713:33:0;;;;;;;;;;;44170:239;;;;;;;;;;-1:-1:-1;44170:239:0;;;;;:::i;:::-;;:::i;63975:21::-;;;;;;;;;;;;;:::i;68693:166::-;;;;;;;;;;-1:-1:-1;68693:166:0;;;;;:::i;:::-;;:::i;43900:208::-;;;;;;;;;;-1:-1:-1;43900:208:0;;;;;:::i;:::-;;:::i;67302:599::-;;;;;;;;;;-1:-1:-1;67302:599:0;;;;;:::i;:::-;;:::i;11850:103::-;;;;;;;;;;;;;:::i;66244:453::-;;;;;;;;;;-1:-1:-1;66244:453:0;;;;;:::i;:::-;;:::i;64827:48::-;;;;;;;;;;-1:-1:-1;64827:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;29541:100;;;;;;;;;;-1:-1:-1;29541:100:0;;;;;:::i;:::-;;:::i;71823:1576::-;;;;;;:::i;:::-;;:::i;64662:50::-;;;;;;;;;;-1:-1:-1;64662:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;11199:87;;;;;;;;;;-1:-1:-1;11272:6:0;;-1:-1:-1;;;;;11272:6:0;11199:87;;64223:28;;;;;;;;;;-1:-1:-1;64223:28:0;;;;;;;;;;;;;32023:25:1;;;32079:2;32064:18;;32057:34;;;;31996:18;64223:28:0;31978:119:1;44645:104:0;;;;;;;;;;;;;:::i;29037:109::-;;;;;;;;;;-1:-1:-1;29037:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;29120:18:0;29093:7;29120:18;;;:9;:18;;;;;;;29037:109;46328:155;;;;;;;;;;-1:-1:-1;46328:155:0;;;;;:::i;:::-;;:::i;64993:30::-;;;;;;;;;;-1:-1:-1;64993:30:0;;;;;;;;;;;;;;;:::i;66167:69::-;;;;;;;;;;;;;:::i;75475:116::-;;;;;;;;;;-1:-1:-1;75475:116:0;;;;;:::i;:::-;;:::i;68867:987::-;;;;;;;;;;-1:-1:-1;68867:987:0;;;;;:::i;:::-;;:::i;63818:47::-;;;;;;;;;;;;;;;;66833:461;;;;;;;;;;-1:-1:-1;66833:461:0;;;;;:::i;:::-;;:::i;63628:34::-;;;;;;;;;;-1:-1:-1;63628:34:0;;;;;;;;;;;47451:328;;;;;;;;;;-1:-1:-1;47451:328:0;;;;;:::i;:::-;;:::i;64038:37::-;;;;;;;;;;;;;:::i;74913:104::-;;;;;;;;;;-1:-1:-1;74913:104:0;;;;;:::i;:::-;;:::i;73889:723::-;;;;;;;;;;-1:-1:-1;73889:723:0;;;;;:::i;:::-;;:::i;69862:1953::-;;;;;;:::i;:::-;;:::i;63913:26::-;;;;;;;;;;-1:-1:-1;63913:26:0;;;;;;;;;;;28833:105;;;;;;;;;;-1:-1:-1;28833:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;28914:16:0;28887:7;28914:16;;;:7;:16;;;;;;;28833:105;63591:30;;;;;;;;;;-1:-1:-1;63591:30:0;;;;;;;;28623:119;;;;;;;;;;-1:-1:-1;28623:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;28708:26:0;28681:7;28708:26;;;:19;:26;;;;;;;28623:119;74620:151;;;;;;;;;;-1:-1:-1;74620:151:0;;;;;:::i;:::-;;:::i;66705:120::-;;;;;;;;;;-1:-1:-1;66705:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;66795:22:0;66771:4;66795:22;;;:12;:22;;;;;;;;;66705:120;28371:95;;;;;;;;;;-1:-1:-1;28444:14:0;;28371:95;;46554:164;;;;;;;;;;-1:-1:-1;46554:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46675:25:0;;;46651:4;46675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46554:164;63883:23;;;;;;;;;;-1:-1:-1;63883:23:0;;;;;;;;74779:126;;;;;;;;;;-1:-1:-1;74779:126:0;;;;;:::i;:::-;;:::i;12108:201::-;;;;;;;;;;-1:-1:-1;12108:201:0;;;;;:::i;:::-;;:::i;73407:474::-;;;;;;;;;;;;;:::i;64182:34::-;;;;;;;;;;-1:-1:-1;64182:34:0;;;;;;;;;;;;;;;;32304:25:1;;;32360:2;32345:18;;32338:34;;;;32388:18;;;32381:34;32292:2;32277:18;64182:34:0;32259:162:1;56982:224:0;57084:4;-1:-1:-1;;;;;;57108:50:0;;-1:-1:-1;;;57108:50:0;;:90;;;57162:36;57186:11;57162:23;:36::i;:::-;57101:97;56982:224;-1:-1:-1;;56982:224:0:o;44476:100::-;44530:13;44563:5;44556:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44476:100;:::o;46035:221::-;46111:7;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;46131:73;;;;-1:-1:-1;;;46131:73:0;;25370:2:1;46131:73:0;;;25352:21:1;25409:2;25389:18;;;25382:30;25448:34;25428:18;;;25421:62;-1:-1:-1;;;25499:18:1;;;25492:42;25551:19;;46131:73:0;;;;;;;;;-1:-1:-1;46224:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46224:24:0;;46035:221::o;64003:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45558:411::-;45639:13;45655:23;45670:7;45655:14;:23::i;:::-;45639:39;;45703:5;-1:-1:-1;;;;;45697:11:0;:2;-1:-1:-1;;;;;45697:11:0;;;45689:57;;;;-1:-1:-1;;;45689:57:0;;28188:2:1;45689:57:0;;;28170:21:1;28227:2;28207:18;;;28200:30;28266:34;28246:18;;;28239:62;-1:-1:-1;;;28317:18:1;;;28310:31;28358:19;;45689:57:0;28160:223:1;45689:57:0;10003:10;-1:-1:-1;;;;;45781:21:0;;;;:62;;-1:-1:-1;45806:37:0;45823:5;10003:10;46554:164;:::i;45806:37::-;45759:168;;;;-1:-1:-1;;;45759:168:0;;22641:2:1;45759:168:0;;;22623:21:1;22680:2;22660:18;;;22653:30;22719:34;22699:18;;;22692:62;22790:26;22770:18;;;22763:54;22834:19;;45759:168:0;22613:246:1;45759:168:0;45940:21;45949:2;45953:7;45940:8;:21::i;:::-;45558:411;;;:::o;29841:566::-;-1:-1:-1;;;;;29917:16:0;;29936:1;29917:16;;;:7;:16;;;;;;29909:71;;;;-1:-1:-1;;;29909:71:0;;;;;;;:::i;:::-;29993:21;30041:15;28444:14;;;28371:95;30041:15;30017:39;;:21;:39;:::i;:::-;29993:63;;30067:15;30085:58;30101:7;30110:13;30125:17;30134:7;-1:-1:-1;;;;;29120:18:0;29093:7;29120:18;;;:9;:18;;;;;;;29037:109;30125:17;30085:15;:58::i;:::-;30067:76;-1:-1:-1;30164:12:0;30156:68;;;;-1:-1:-1;;;30156:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30237:18:0;;;;;;:9;:18;;;;;:29;;30259:7;;30237:18;:29;;30259:7;;30237:29;:::i;:::-;;;;;;;;30295:7;30277:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;30315:35:0;;-1:-1:-1;30333:7:0;30342;30315:17;:35::i;:::-;30366:33;;;-1:-1:-1;;;;;10780:32:1;;10762:51;;10844:2;10829:18;;10822:34;;;30366:33:0;;10735:18:1;30366:33:0;;;;;;;;29841:566;;;:::o;67909:776::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;67994:22:::1;67982:8;::::0;::::1;;:34;::::0;::::1;;;;-1:-1:-1::0;;;67982:34:0::1;;;;;;;;;;67960:119;;;;-1:-1:-1::0;;;67960:119:0::1;;;;;;;:::i;:::-;68090:51;::::0;;::::1;::::0;::::1;::::0;;68128:13:::1;68090:51:::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;:35:::1;::::0;68178:63:::1;::::0;68090:51;68178:63:::1;:::i;:::-;68152:89;;68292:15;68274;:33;68252:110;;;::::0;-1:-1:-1;;;68252:110:0;;22285:2:1;68252:110:0::1;::::0;::::1;22267:21:1::0;22324:2;22304:18;;;22297:30;22363:29;22343:18;;;22336:57;22410:18;;68252:110:0::1;22257:177:1::0;68252:110:0::1;68467:33;::::0;;;;::::1;::::0;;68394:15:::1;68467:33:::0;;;68440:3:::1;68467:33;::::0;;::::1;::::0;;;68454:10:::1;:46:::0;;;;;;;68516:39;;32023:25:1;;;32064:18;;;32057:34;;;68394:15:0;;68440:3;;68516:39:::1;::::0;31996:18:1;68516:39:0::1;;;;;;;68566:8;:30:::0;;-1:-1:-1;;68566:30:0::1;68577:19;68566:30:::0;;::::1;::::0;;;68612:65:::1;::::0;::::1;::::0;::::1;::::0;68566:30;;68577:19;68612:65:::1;:::i;:::-;;;;;;;;11490:1;;;;67909:776::o:0;46785:339::-;46980:41;10003:10;47013:7;46980:18;:41::i;:::-;46972:103;;;;-1:-1:-1;;;46972:103:0;;;;;;;:::i;:::-;47088:28;47098:4;47104:2;47108:7;47088:9;:28::i;57290:256::-;57387:7;57423:23;57440:5;57423:16;:23::i;:::-;57415:5;:31;57407:87;;;;-1:-1:-1;;;57407:87:0;;13980:2:1;57407:87:0;;;13962:21:1;14019:2;13999:18;;;13992:30;14058:34;14038:18;;;14031:62;-1:-1:-1;;;14109:18:1;;;14102:41;14160:19;;57407:87:0;13952:233:1;57407:87:0;-1:-1:-1;;;;;;57512:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;57290:256::o;47195:185::-;47333:39;47350:4;47356:2;47360:7;47333:39;;;;;;;;;;;;:16;:39::i;75148:319::-;75207:13;;;;75199:53;;;;-1:-1:-1;;;75199:53:0;;25014:2:1;75199:53:0;;;24996:21:1;25053:2;25033:18;;;25026:30;25092:29;25072:18;;;25065:57;25139:18;;75199:53:0;24986:177:1;75199:53:0;75285:39;75304:10;75316:7;75285:18;:39::i;:::-;75263:137;;;;-1:-1:-1;;;75263:137:0;;17956:2:1;75263:137:0;;;17938:21:1;17995:2;17975:18;;;17968:30;18034:34;18014:18;;;18007:62;-1:-1:-1;;;18085:18:1;;;18078:46;18141:19;;75263:137:0;17928:238:1;75263:137:0;75411:14;75417:7;75411:5;:14::i;:::-;75447:8;;:12;;75458:1;;-1:-1:-1;;;75447:8:0;;;;:12;:::i;:::-;75436:8;;:23;;;;;;;;;;;;;;;;;;75148:319;:::o;65807:80::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;65873:6:::1;::::0;;-1:-1:-1;;65863:16:0;::::1;65873:6;::::0;;;::::1;;;65872:7;65863:16:::0;;::::1;;::::0;;65807:80::o;30675:641::-;-1:-1:-1;;;;;30757:16:0;;30776:1;30757:16;;;:7;:16;;;;;;30749:71;;;;-1:-1:-1;;;30749:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28708:26:0;;30833:21;28708:26;;;:19;:26;;;;;;30857:30;;-1:-1:-1;;;30857:30:0;;30881:4;30857:30;;;10518:51:1;-1:-1:-1;;;;;30857:15:0;;;;;10491:18:1;;30857:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;30833:77;;30921:15;30939:65;30955:7;30964:13;30979:24;30988:5;30995:7;-1:-1:-1;;;;;29412:21:0;;;29385:7;29412:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;29315:135;30939:65;30921:83;-1:-1:-1;31025:12:0;31017:68;;;;-1:-1:-1;;;31017:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31098:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;31132:7;;31098:21;:41;;31132:7;;31098:41;:::i;:::-;;;;-1:-1:-1;;;;;;;31150:26:0;;;;;;:19;:26;;;;;:37;;31180:7;;31150:26;:37;;31180:7;;31150:37;:::i;:::-;;;;-1:-1:-1;31200:47:0;;-1:-1:-1;31223:5:0;31230:7;31239;31200:22;:47::i;:::-;31263:45;;;-1:-1:-1;;;;;10780:32:1;;;10762:51;;10844:2;10829:18;;10822:34;;;31263:45:0;;;;;10735:18:1;31263:45:0;;;;;;;30675:641;;;;:::o;75025:115::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;75102:13:::1;:30:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;75102:30:0;;::::1;::::0;;;::::1;::::0;;75025:115::o;57812:233::-;57887:7;57923:30;57710:10;:17;;57622:113;57923:30;57915:5;:38;57907:95;;;;-1:-1:-1;;;57907:95:0;;29366:2:1;57907:95:0;;;29348:21:1;29405:2;29385:18;;;29378:30;29444:34;29424:18;;;29417:62;-1:-1:-1;;;29495:18:1;;;29488:42;29547:19;;57907:95:0;29338:234:1;57907:95:0;58020:10;58031:5;58020:17;;;;;;-1:-1:-1;;;58020:17:0;;;;;;;;;;;;;;;;;58013:24;;57812:233;;;:::o;65895:156::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;65976:23:::1;:7;65986:13:::0;;65976:23:::1;:::i;:::-;;66015:28;66029:13;;66015:28;;;;;;;:::i;:::-;;;;;;;;65895:156:::0;;:::o;44170:239::-;44242:7;44278:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44278:16:0;44313:19;44305:73;;;;-1:-1:-1;;;44305:73:0;;23477:2:1;44305:73:0;;;23459:21:1;23516:2;23496:18;;;23489:30;23555:34;23535:18;;;23528:62;-1:-1:-1;;;23606:18:1;;;23599:39;23655:19;;44305:73:0;23449:231:1;63975:21:0;;;;;;;:::i;68693:166::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;68770:13:::1;:30:::0;;-1:-1:-1;;68770:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;68816:35:::1;::::0;11779:41:1;;;68816:35:0::1;::::0;11767:2:1;11752:18;68816:35:0::1;;;;;;;68693:166:::0;:::o;43900:208::-;43972:7;-1:-1:-1;;;;;44000:19:0;;43992:74;;;;-1:-1:-1;;;43992:74:0;;23066:2:1;43992:74:0;;;23048:21:1;23105:2;23085:18;;;23078:30;23144:34;23124:18;;;23117:62;-1:-1:-1;;;23195:18:1;;;23188:40;23245:19;;43992:74:0;23038:232:1;43992:74:0;-1:-1:-1;;;;;;44084:16:0;;;;;:9;:16;;;;;;;43900:208::o;67302:599::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;67407:29:::1;67395:8;::::0;::::1;;:41;::::0;::::1;;;;-1:-1:-1::0;;;67395:41:0::1;;;;;;;;;;67373:126;;;;-1:-1:-1::0;;;67373:126:0::1;;;;;;;:::i;:::-;67605:47;::::0;;::::1;::::0;;::::1;::::0;;67531:15:::1;67605:47:::0;;;::::1;::::0;;::::1;::::0;;;67577:1:::1;67605:47:::0;;;;;;67589:13:::1;:63:::0;;;;;;;;;;;67668:53;;32304:25:1;;;32345:18;;;32338:34;;;32388:18;;;32381:34;;;67531:15:0;67668:53:::1;::::0;32277:18:1;67668:53:0::1;;;;;;;67732:8;:33:::0;;-1:-1:-1;;67732:33:0::1;67743:22;67732:33:::0;;::::1;::::0;;;67781:112:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;67743:22:0;67781:112:::1;:::i;11850:103::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;11915:30:::1;11942:1;11915:18;:30::i;:::-;11850:103::o:0;66244:453::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66359:11:::1;66354:336;66376:23:::0;;::::1;66354:336;;;66476:1;66449:10:::0;;66460:3;66449:15;;::::1;;;-1:-1:-1::0;;;66449:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66449:29:0::1;;;66423:126;;;::::0;-1:-1:-1;;;66423:126:0;;15979:2:1;66423:126:0::1;::::0;::::1;15961:21:1::0;16018:2;15998:18;;;15991:30;16057:34;16037:18;;;16030:62;-1:-1:-1;;;16108:18:1;;;16101:33;16151:19;;66423:126:0::1;15951:225:1::0;66423:126:0::1;66568:12;:29;66581:10;;66592:3;66581:15;;;;;-1:-1:-1::0;;;66581:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66568:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66568:29:0;;::::1;;66564:115;;66659:4;66627:12;:29;66640:10;;66651:3;66640:15;;;;;-1:-1:-1::0;;;66640:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66627:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66627:29:0;:36;;-1:-1:-1;;66627:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66564:115:::1;66401:5:::0;::::1;::::0;::::1;:::i;:::-;;;;66354:336;;29541:100:::0;29592:7;29619;29627:5;29619:14;;;;;;-1:-1:-1;;;29619:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29619:14:0;;29541:100;-1:-1:-1;;29541:100:0:o;71823:1576::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;30958:2:1;2402:63:0;;;30940:21:1;30997:2;30977:18;;;30970:30;31036:33;31016:18;;;31009:61;31087:18;;2402:63:0;30930:181:1;2402:63:0;1812:1;2543:7;:18;71899:42:::1;::::0;;;;::::1;::::0;;;71931:10:::1;71899:42:::0;;;;;::::1;::::0;::::1;::::0;71960:11;71952:46:::1;;;::::0;-1:-1:-1;;;71952:46:0;;13629:2:1;71952:46:0::1;::::0;::::1;13611:21:1::0;13668:2;13648:18;;;13641:30;-1:-1:-1;;;13687:18:1;;;13680:52;13749:18;;71952:46:0::1;13601:172:1::0;71952:46:0::1;72031:21:::0;;72009:104:::1;;;::::0;-1:-1:-1;;;72009:104:0;;19140:2:1;72009:104:0::1;::::0;::::1;19122:21:1::0;19179:2;19159:18;;;19152:30;19218:31;19198:18;;;19191:59;19267:18;;72009:104:0::1;19112:179:1::0;72009:104:0::1;72165:21:::0;;72146:15:::1;:40;;72124:117;;;::::0;-1:-1:-1;;;72124:117:0;;18373:2:1;72124:117:0::1;::::0;::::1;18355:21:1::0;18412:2;18392:18;;;18385:30;18451:29;18431:18;;;18424:57;18498:18;;72124:117:0::1;18345:177:1::0;72124:117:0::1;72296:9;::::0;72274:8:::1;::::0;72296:9:::1;::::0;;::::1;::::0;72274:18:::1;::::0;72285:7;;-1:-1:-1;;;72274:8:0;;::::1;;:18;:::i;:::-;:31;;72252:111;;;;-1:-1:-1::0;;;72252:111:0::1;;;;;;;:::i;:::-;72418:13;::::0;72396:8:::1;::::0;72418:13:::1;::::0;;;::::1;::::0;::::1;::::0;72396:18:::1;::::0;72407:7;;-1:-1:-1;;;72396:8:0;;::::1;;:18;:::i;:::-;:35;;72374:115;;;;-1:-1:-1::0;;;72374:115:0::1;;;;;;;:::i;:::-;72547:9;72536:7;72522:11;;:21;;;;:::i;:::-;:34;;72500:126;;;;-1:-1:-1::0;;;72500:126:0::1;;;;;;;:::i;:::-;72646:6;::::0;::::1;::::0;::::1;;;72645:7;72637:49;;;::::0;-1:-1:-1;;;72637:49:0;;31318:2:1;72637:49:0::1;::::0;::::1;31300:21:1::0;31357:2;31337:18;;;31330:30;31396:31;31376:18;;;31369:59;31445:18;;72637:49:0::1;31290:179:1::0;72637:49:0::1;72697:18;::::0;72726:367:::1;72754:7;72748:3;:13;72726:367;;;72785:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;72785:21:::1;72834:9;6619:14:::0;72821:32:::1;;72868:33;72878:10;72890;72868:9;:33::i;:::-;72956:10;72943:24;::::0;;;:12:::1;:24;::::0;;;;;:28:::1;::::0;72970:1:::1;72943:28;:::i;:::-;72929:10;72916:24;::::0;;;:12:::1;:24;::::0;;;;;;;:55;;;;73014:13:::1;:25:::0;;;;:29:::1;::::0;73042:1:::1;73014:29;:::i;:::-;73000:10;72986:25;::::0;;;:13:::1;:25;::::0;;;;:57;73069:8:::1;::::0;:12:::1;::::0;-1:-1:-1;;;73069:8:0;::::1;;;73080:1;73069:12;:::i;:::-;73058:8;:23:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;73058:23:0::1;-1:-1:-1::0;;73058:23:0;;::::1;::::0;;;::::1;::::0;;72763:5;::::1;::::0;::::1;:::i;:::-;;;;72726:367;;;-1:-1:-1::0;73138:11:0::1;::::0;73108:42:::1;::::0;73117:10:::1;::::0;73108:42:::1;::::0;::::1;::::0;73129:7;32023:25:1;;32079:2;32064:18;;32057:34;32011:2;31996:18;;31978:119;73108:42:0::1;;;;;;;;73187:9;::::0;73165:8:::1;::::0;73187:9:::1;::::0;;::::1;::::0;73165:18:::1;::::0;73176:7;;-1:-1:-1;;;73165:8:0;;::::1;;:18;:::i;:::-;:31;73161:231;;;73213:8;:33:::0;;-1:-1:-1;;73213:33:0::1;73224:22;73213:33:::0;;::::1;::::0;;;73266:114:::1;::::0;::::1;::::0;::::1;::::0;73305:19:::1;::::0;73224:22;73266:114:::1;:::i;:::-;;;;;;;;73161:231;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;71823:1576:0:o;44645:104::-;44701:13;44734:7;44727:14;;;;;:::i;46328:155::-;46423:52;10003:10;46456:8;46466;46423:18;:52::i;:::-;46328:155;;:::o;66167:69::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66213:8:::1;:15:::0;;-1:-1:-1;;66213:15:0::1;::::0;::::1;::::0;;66167:69::o;75475:116::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;75554:29:::1;;:11;:29:::0;75475:116::o;68867:987::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;69000:9:::1;::::0;68968:8:::1;::::0;69000:9:::1;::::0;;::::1;::::0;68968:28:::1;::::0;68979:10;;-1:-1:-1;;;68968:8:0;;::::1;;:28;:::i;:::-;:41;;68946:127;;;::::0;-1:-1:-1;;;68946:127:0;;26553:2:1;68946:127:0::1;::::0;::::1;26535:21:1::0;26592:2;26572:18;;;26565:30;26631:34;26611:18;;;26604:62;-1:-1:-1;;;26682:18:1;;;26675:34;26726:19;;68946:127:0::1;26525:226:1::0;68946:127:0::1;69141:13;::::0;69108:9:::1;::::0;69141:13:::1;::::0;;;::::1;::::0;::::1;::::0;69108:29:::1;::::0;69120:10;;69108:9:::1;:29;:::i;:::-;:46;;69086:131;;;::::0;-1:-1:-1;;;69086:131:0;;15218:2:1;69086:131:0::1;::::0;::::1;15200:21:1::0;15257:2;15237:18;;;15230:30;15296:34;15276:18;;;15269:62;-1:-1:-1;;;15347:18:1;;;15340:33;15390:19;;69086:131:0::1;15190:225:1::0;69086:131:0::1;69230:18;::::0;69259:588:::1;69281:23:::0;;::::1;69259:588;;;69381:1;69354:10:::0;;69365:3;69354:15;;::::1;;;-1:-1:-1::0;;;69354:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69354:29:0::1;;;69328:131;;;::::0;-1:-1:-1;;;69328:131:0;;26144:2:1;69328:131:0::1;::::0;::::1;26126:21:1::0;26183:2;26163:18;;;26156:30;26222:34;26202:18;;;26195:62;-1:-1:-1;;;26273:18:1;;;26266:38;26321:19;;69328:131:0::1;26116:230:1::0;69328:131:0::1;69474:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;69474:21:::1;69523:9;6619:14:::0;69510:32:::1;;69557:38;69567:10;;69578:3;69567:15;;;;;-1:-1:-1::0;;;69567:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69584:10;69557:9;:38::i;:::-;69642:12;:29;69655:10;;69666:3;69655:15;;;;;-1:-1:-1::0;;;69655:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69642:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69642:29:0;;:33:::1;::::0;69674:1:::1;69642:33;:::i;:::-;69610:12;:29;69623:10;;69634:3;69623:15;;;;;-1:-1:-1::0;;;69623:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69610:29:0::1;-1:-1:-1::0;;;;;69610:29:0::1;;;;;;;;;;;;:65;;;;69723:13;:30;69737:10;;69748:3;69737:15;;;;;-1:-1:-1::0;;;69737:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69723:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69723:30:0;;:34:::1;::::0;69756:1:::1;69723:34;:::i;:::-;69690:13;:30;69704:10;;69715:3;69704:15;;;;;-1:-1:-1::0;;;69704:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69690:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69690:30:0;:67;69783:8:::1;::::0;:12:::1;::::0;-1:-1:-1;;;69783:8:0;::::1;;;69794:1;69783:12;:::i;:::-;69772:8;:23:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;69772:23:0::1;-1:-1:-1::0;;69772:23:0;::::1;::::0;::::1;::::0;;;69822:13:::1;::::0;:9;;;;;;-1:-1:-1;69822:13:0::1;:::i;:::-;69810:9;:25:::0;;-1:-1:-1;;69810:25:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;69306:5;::::1;::::0;::::1;:::i;:::-;;;;69259:588;;;;11490:1;68867:987:::0;;:::o;66833:461::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66953:11:::1;66948:339;66970:23:::0;;::::1;66948:339;;;67070:1;67043:10:::0;;67054:3;67043:15;;::::1;;;-1:-1:-1::0;;;67043:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67043:29:0::1;;;67017:129;;;::::0;-1:-1:-1;;;67017:129:0;;24246:2:1;67017:129:0::1;::::0;::::1;24228:21:1::0;24285:2;24265:18;;;24258:30;24324:34;24304:18;;;24297:62;-1:-1:-1;;;24375:18:1;;;24368:36;24421:19;;67017:129:0::1;24218:228:1::0;67017:129:0::1;67165:12;:29;67178:10;;67189:3;67178:15;;;;;-1:-1:-1::0;;;67178:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67165:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;67165:29:0;;::::1;;:37;;:29:::0;:37:::1;67161:115;;;67255:5;67223:12;:29;67236:10;;67247:3;67236:15;;;;;-1:-1:-1::0;;;67236:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67223:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;67223:29:0;:37;;-1:-1:-1;;67223:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67161:115:::1;66995:5:::0;::::1;::::0;::::1;:::i;:::-;;;;66948:339;;47451:328:::0;47626:41;10003:10;47659:7;47626:18;:41::i;:::-;47618:103;;;;-1:-1:-1;;;47618:103:0;;;;;;;:::i;:::-;47732:39;47746:4;47752:2;47756:7;47765:5;47732:13;:39::i;64038:37::-;;;;;;;:::i;74913:104::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;74987:9:::1;:22:::0;;-1:-1:-1;;74987:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;74913:104::o;73889:723::-;49354:4;49378:16;;;:7;:16;;;;;;74007:13;;-1:-1:-1;;;;;49378:16:0;74038:113;;;;-1:-1:-1;;;74038:113:0;;27368:2:1;74038:113:0;;;27350:21:1;27407:2;27387:18;;;27380:30;27446:34;27426:18;;;27419:62;-1:-1:-1;;;27497:18:1;;;27490:45;27552:19;;74038:113:0;27340:237:1;74038:113:0;74166:8;;;;;;;74162:71;;74207:14;74200:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73889:723;;;:::o;74162:71::-;74245:28;74276:10;:8;:10::i;:::-;74245:41;;74348:1;74323:14;74317:28;:32;:287;;;;;;;;;;;;;;;;;74441:14;74482:18;:7;:16;:18::i;:::-;74527:13;74398:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74317:287;74297:307;73889:723;-1:-1:-1;;;73889:723:0:o;69862:1953::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;30958:2:1;2402:63:0;;;30940:21:1;30997:2;30977:18;;;30970:30;31036:33;31016:18;;;31009:61;31087:18;;2402:63:0;30930:181:1;2402:63:0;1812:1;2543:7;:18;;;69941:51:::1;::::0;;::::1;::::0;::::1;::::0;;69979:13:::1;69941:51:::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;70025:12;::::1;;70003:102;;;;-1:-1:-1::0;;;70003:102:0::1;;;;;;;:::i;:::-;70154:10;70138:27;::::0;;;:15:::1;:27;::::0;;;;;70179:1:::1;::::0;70138:37:::1;::::0;70168:7;;70138:37:::1;:::i;:::-;:42;;70116:132;;;;-1:-1:-1::0;;;70116:132:0::1;;;;;;;:::i;:::-;70294:10;70281:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;:32;;:24:::0;:32:::1;70259:127;;;::::0;-1:-1:-1;;;70259:127:0;;21871:2:1;70259:127:0::1;::::0;::::1;21853:21:1::0;21910:2;21890:18;;;21883:30;21949:34;21929:18;;;21922:62;-1:-1:-1;;;22000:18:1;;;21993:43;22053:19;;70259:127:0::1;21843:235:1::0;70259:127:0::1;70419:24:::0;;70397:125:::1;;;::::0;-1:-1:-1;;;70397:125:0;;13213:2:1;70397:125:0::1;::::0;::::1;13195:21:1::0;13252:2;13232:18;;;13225:30;13291:34;13271:18;;;13264:62;-1:-1:-1;;;13342:18:1;;;13335:45;13397:19;;70397:125:0::1;13185:237:1::0;70397:125:0::1;70574:24:::0;;70555:15:::1;:43;;70533:123;;;::::0;-1:-1:-1;;;70533:123:0;;23887:2:1;70533:123:0::1;::::0;::::1;23869:21:1::0;23926:2;23906:18;;;23899:30;23965:32;23945:18;;;23938:60;24015:18;;70533:123:0::1;23859:180:1::0;70533:123:0::1;70752:23;::::0;::::1;::::0;70725:24;;:50:::1;::::0;70752:23;70725:50:::1;:::i;:::-;70689:15;:86;;70667:163;;;::::0;-1:-1:-1;;;70667:163:0;;19498:2:1;70667:163:0::1;::::0;::::1;19480:21:1::0;19537:2;19517:18;;;19510:30;19576:29;19556:18;;;19549:57;19623:18;;70667:163:0::1;19470:177:1::0;70667:163:0::1;70885:16;::::0;70863:8:::1;::::0;70885:16:::1;-1:-1:-1::0;;;70885:16:0;;;::::1;::::0;::::1;::::0;70863:18:::1;::::0;70874:7;;70863:8;;::::1;;:18;:::i;:::-;:38;;70841:126;;;::::0;-1:-1:-1;;;70841:126:0;;16383:2:1;70841:126:0::1;::::0;::::1;16365:21:1::0;16422:2;16402:18;;;16395:30;16461:34;16441:18;;;16434:62;-1:-1:-1;;;16512:18:1;;;16505:36;16558:19;;70841:126:0::1;16355:228:1::0;70841:126:0::1;71022:9;::::0;71000:8:::1;::::0;71022:9:::1;::::0;;::::1;::::0;71000:18:::1;::::0;71011:7;;-1:-1:-1;;;71000:8:0;;::::1;;:18;:::i;:::-;:31;;70978:111;;;;-1:-1:-1::0;;;70978:111:0::1;;;;;;;:::i;:::-;71148:9;71137:7;71122:12;;:22;;;;:::i;:::-;:35;;71100:127;;;;-1:-1:-1::0;;;71100:127:0::1;;;;;;;:::i;:::-;71247:6;::::0;::::1;::::0;::::1;;;71246:7;71238:49;;;::::0;-1:-1:-1;;;71238:49:0;;31318:2:1;71238:49:0::1;::::0;::::1;31300:21:1::0;31357:2;31337:18;;;31330:30;31396:31;31376:18;;;31369:59;31445:18;;71238:49:0::1;31290:179:1::0;71238:49:0::1;71298:18;::::0;71327:419:::1;71355:7;71349:3;:13;71327:419;;;71386:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;71386:21:::1;71435:9;6619:14:::0;71422:32:::1;;71469:33;71479:10;71491;71469:9;:33::i;:::-;71563:10;71547:27;::::0;;;:15:::1;:27;::::0;;;;;:31:::1;::::0;71577:1:::1;71547:31;:::i;:::-;71533:10;71517:27;::::0;;;:15:::1;:27;::::0;;;;;;;:61;;;;71621:13:::1;:25:::0;;;;:29:::1;::::0;71649:1:::1;71621:29;:::i;:::-;71607:10;71593:25;::::0;;;:13:::1;:25;::::0;;;;:57;71676:8:::1;::::0;:12:::1;::::0;-1:-1:-1;;;71676:8:0;::::1;;;71687:1;71676:12;:::i;:::-;71665:8;:23:::0;;-1:-1:-1;;71665:23:0::1;-1:-1:-1::0;;;71665:23:0::1;::::0;;::::1;;;::::0;;;;71718:16:::1;::::0;:12;;;::::1;;-1:-1:-1::0;71718:16:0::1;:::i;:::-;71703:12;:31:::0;;::::1;::::0;;;::::1;::::0;::::1;-1:-1:-1::0;;71703:31:0;;::::1;::::0;;;::::1;::::0;;71364:5;::::1;::::0;::::1;:::i;:::-;;;;71327:419;;;-1:-1:-1::0;71794:12:0::1;::::0;71761:46:::1;::::0;71773:10:::1;::::0;71761:46:::1;::::0;::::1;::::0;71785:7;32023:25:1;;32079:2;32064:18;;32057:34;32011:2;31996:18;;31978:119;71761:46:0::1;;;;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;69862:1953:0:o;74620:151::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;74730:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;74779:126::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;74865:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;12108:201::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12197:22:0;::::1;12189:73;;;::::0;-1:-1:-1;;;12189:73:0;;14811:2:1;12189:73:0::1;::::0;::::1;14793:21:1::0;14850:2;14830:18;;;14823:30;14889:34;14869:18;;;14862:62;-1:-1:-1;;;14940:18:1;;;14933:36;14986:19;;12189:73:0::1;14783:228:1::0;12189:73:0::1;12273:28;12292:8;12273:18;:28::i;:::-;12108:201:::0;:::o;73407:474::-;73457:7;;;73507:8;;;;:41;;;;;;-1:-1:-1;;;73507:41:0;;;;;;;;;;73503:85;;;-1:-1:-1;73575:1:0;73503:85;73614:22;73602:8;;;;:34;;;;;;-1:-1:-1;;;73602:34:0;;;;;;;;;;73598:78;;;-1:-1:-1;73663:1:0;73598:78;73702:19;73690:8;;;;:31;;;;;;-1:-1:-1;;;73690:31:0;;;;;;;;;;73686:75;;;-1:-1:-1;73748:1:0;73686:75;73787:22;73775:8;;;;:34;;;;;;-1:-1:-1;;;73775:34:0;;;;;;;;;;73771:78;;;-1:-1:-1;73836:1:0;73771:78;73866:7;73407:474;-1:-1:-1;73407:474:0:o;43531:305::-;43633:4;-1:-1:-1;;;;;;43670:40:0;;-1:-1:-1;;;43670:40:0;;:105;;-1:-1:-1;;;;;;;43727:48:0;;-1:-1:-1;;;43727:48:0;43670:105;:158;;;-1:-1:-1;;;;;;;;;;35336:40:0;;;43792:36;35227:157;53271:174;53346:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;53346:29:0;-1:-1:-1;;;;;53346:29:0;;;;;;;;:24;;53400:23;53346:24;53400:14;:23::i;:::-;-1:-1:-1;;;;;53391:46:0;;;;;;;;;;;53271:174;;:::o;31494:248::-;31704:12;;-1:-1:-1;;;;;31684:16:0;;31640:7;31684:16;;;:7;:16;;;;;;31640:7;;31719:15;;31668:32;;:13;:32;:::i;:::-;31667:49;;;;:::i;:::-;:67;;;;:::i;:::-;31660:74;31494:248;-1:-1:-1;;;;31494:248:0:o;14809:317::-;14924:6;14899:21;:31;;14891:73;;;;-1:-1:-1;;;14891:73:0;;20281:2:1;14891:73:0;;;20263:21:1;20320:2;20300:18;;;20293:30;20359:31;20339:18;;;20332:59;20408:18;;14891:73:0;20253:179:1;14891:73:0;14978:12;14996:9;-1:-1:-1;;;;;14996:14:0;15018:6;14996:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14977:52;;;15048:7;15040:78;;;;-1:-1:-1;;;15040:78:0;;19854:2:1;15040:78:0;;;19836:21:1;19893:2;19873:18;;;19866:30;19932:34;19912:18;;;19905:62;20003:28;19983:18;;;19976:56;20049:19;;15040:78:0;19826:248:1;49583:348:0;49676:4;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;49693:73;;;;-1:-1:-1;;;49693:73:0;;21046:2:1;49693:73:0;;;21028:21:1;21085:2;21065:18;;;21058:30;21124:34;21104:18;;;21097:62;-1:-1:-1;;;21175:18:1;;;21168:42;21227:19;;49693:73:0;21018:234:1;49693:73:0;49777:13;49793:23;49808:7;49793:14;:23::i;:::-;49777:39;;49846:5;-1:-1:-1;;;;;49835:16:0;:7;-1:-1:-1;;;;;49835:16:0;;:51;;;;49879:7;-1:-1:-1;;;;;49855:31:0;:20;49867:7;49855:11;:20::i;:::-;-1:-1:-1;;;;;49855:31:0;;49835:51;:87;;;-1:-1:-1;;;;;;46675:25:0;;;46651:4;46675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49827:96;49583:348;-1:-1:-1;;;;49583:348:0:o;52575:578::-;52734:4;-1:-1:-1;;;;;52707:31:0;:23;52722:7;52707:14;:23::i;:::-;-1:-1:-1;;;;;52707:31:0;;52699:85;;;;-1:-1:-1;;;52699:85:0;;26958:2:1;52699:85:0;;;26940:21:1;26997:2;26977:18;;;26970:30;27036:34;27016:18;;;27009:62;-1:-1:-1;;;27087:18:1;;;27080:39;27136:19;;52699:85:0;26930:231:1;52699:85:0;-1:-1:-1;;;;;52803:16:0;;52795:65;;;;-1:-1:-1;;;52795:65:0;;17197:2:1;52795:65:0;;;17179:21:1;17236:2;17216:18;;;17209:30;17275:34;17255:18;;;17248:62;-1:-1:-1;;;17326:18:1;;;17319:34;17370:19;;52795:65:0;17169:226:1;52795:65:0;52873:39;52894:4;52900:2;52904:7;52873:20;:39::i;:::-;52977:29;52994:1;52998:7;52977:8;:29::i;:::-;-1:-1:-1;;;;;53019:15:0;;;;;;:9;:15;;;;;:20;;53038:1;;53019:15;:20;;53038:1;;53019:20;:::i;:::-;;;;-1:-1:-1;;;;;;;53050:13:0;;;;;;:9;:13;;;;;:18;;53067:1;;53050:13;:18;;53067:1;;53050:18;:::i;:::-;;;;-1:-1:-1;;53079:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53079:21:0;-1:-1:-1;;;;;53079:21:0;;;;;;;;;53118:27;;53079:16;;53118:27;;;;;;;52575:578;;;:::o;51878:360::-;51938:13;51954:23;51969:7;51954:14;:23::i;:::-;51938:39;;51990:48;52011:5;52026:1;52030:7;51990:20;:48::i;:::-;52079:29;52096:1;52100:7;52079:8;:29::i;:::-;-1:-1:-1;;;;;52121:16:0;;;;;;:9;:16;;;;;:21;;52141:1;;52121:16;:21;;52141:1;;52121:21;:::i;:::-;;;;-1:-1:-1;;52160:16:0;;;;:7;:16;;;;;;52153:23;;-1:-1:-1;;;;;;52153:23:0;;;52194:36;52168:7;;52160:16;-1:-1:-1;;;;;52194:36:0;;;;;52160:16;;52194:36;51878:360;;:::o;21515:211::-;21659:58;;;-1:-1:-1;;;;;10780:32:1;;21659:58:0;;;10762:51:1;10829:18;;;;10822:34;;;21659:58:0;;;;;;;;;;10735:18:1;;;;21659:58:0;;;;;;;;-1:-1:-1;;;;;21659:58:0;-1:-1:-1;;;21659:58:0;;;21632:86;;21652:5;;21632:19;:86::i;12469:191::-;12562:6;;;-1:-1:-1;;;;;12579:17:0;;;-1:-1:-1;;;;;;12579:17:0;;;;;;;12612:40;;12562:6;;;12579:17;12562:6;;12612:40;;12543:16;;12612:40;12469:191;;:::o;50273:110::-;50349:26;50359:2;50363:7;50349:26;;;;;;;;;;;;:9;:26::i;53587:315::-;53742:8;-1:-1:-1;;;;;53733:17:0;:5;-1:-1:-1;;;;;53733:17:0;;;53725:55;;;;-1:-1:-1;;;53725:55:0;;17602:2:1;53725:55:0;;;17584:21:1;17641:2;17621:18;;;17614:30;17680:27;17660:18;;;17653:55;17725:18;;53725:55:0;17574:175:1;53725:55:0;-1:-1:-1;;;;;53791:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53791:46:0;;;;;;;;;;53853:41;;11779::1;;;53853::0;;11752:18:1;53853:41:0;;;;;;;53587:315;;;:::o;48661:::-;48818:28;48828:4;48834:2;48838:7;48818:9;:28::i;:::-;48865:48;48888:4;48894:2;48898:7;48907:5;48865:22;:48::i;:::-;48857:111;;;;-1:-1:-1;;;48857:111:0;;;;;;;:::i;66059:100::-;66111:13;66144:7;66137:14;;;;;:::i;7485:723::-;7541:13;7762:10;7758:53;;-1:-1:-1;;7789:10:0;;;;;;;;;;;;-1:-1:-1;;;7789:10:0;;;;;7485:723::o;7758:53::-;7836:5;7821:12;7877:78;7884:9;;7877:78;;7910:8;;;;:::i;:::-;;-1:-1:-1;7933:10:0;;-1:-1:-1;7941:2:0;7933:10;;:::i;:::-;;;7877:78;;;7965:19;7997:6;7987:17;;;;;;-1:-1:-1;;;7987:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7987:17:0;;7965:39;;8015:154;8022:10;;8015:154;;8049:11;8059:1;8049:11;;:::i;:::-;;-1:-1:-1;8118:10:0;8126:2;8118:5;:10;:::i;:::-;8105:24;;:2;:24;:::i;:::-;8092:39;;8075:6;8082;8075:14;;;;;;-1:-1:-1;;;8075:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;8075:56:0;;;;;;;;-1:-1:-1;8146:11:0;8155:2;8146:11;;:::i;:::-;;;8015:154;;58658:589;-1:-1:-1;;;;;58864:18:0;;58860:187;;58899:40;58931:7;60074:10;:17;;60047:24;;;;:15;:24;;;;;:44;;;60102:24;;;;;;;;;;;;59970:164;58899:40;58860:187;;;58969:2;-1:-1:-1;;;;;58961:10:0;:4;-1:-1:-1;;;;;58961:10:0;;58957:90;;58988:47;59021:4;59027:7;58988:32;:47::i;:::-;-1:-1:-1;;;;;59061:16:0;;59057:183;;59094:45;59131:7;59094:36;:45::i;59057:183::-;59167:4;-1:-1:-1;;;;;59161:10:0;:2;-1:-1:-1;;;;;59161:10:0;;59157:83;;59188:40;59216:2;59220:7;59188:27;:40::i;24088:716::-;24512:23;24538:69;24566:4;24538:69;;;;;;;;;;;;;;;;;24546:5;-1:-1:-1;;;;;24538:27:0;;;:69;;;;;:::i;:::-;24622:17;;24512:95;;-1:-1:-1;24622:21:0;24618:179;;24719:10;24708:30;;;;;;;;;;;;:::i;:::-;24700:85;;;;-1:-1:-1;;;24700:85:0;;30547:2:1;24700:85:0;;;30529:21:1;30586:2;30566:18;;;30559:30;30625:34;30605:18;;;30598:62;-1:-1:-1;;;30676:18:1;;;30669:40;30726:19;;24700:85:0;30519:232:1;50610:321:0;50740:18;50746:2;50750:7;50740:5;:18::i;:::-;50791:54;50822:1;50826:2;50830:7;50839:5;50791:22;:54::i;:::-;50769:154;;;;-1:-1:-1;;;50769:154:0;;;;;;;:::i;54467:799::-;54622:4;-1:-1:-1;;;;;54643:13:0;;13810:20;13858:8;54639:620;;54679:72;;-1:-1:-1;;;54679:72:0;;-1:-1:-1;;;;;54679:36:0;;;;;:72;;10003:10;;54730:4;;54736:7;;54745:5;;54679:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54679:72:0;;;;;;;;-1:-1:-1;;54679:72:0;;;;;;;;;;;;:::i;:::-;;;54675:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54921:13:0;;54917:272;;54964:60;;-1:-1:-1;;;54964:60:0;;;;;;;:::i;54917:272::-;55139:6;55133:13;55124:6;55120:2;55116:15;55109:38;54675:529;-1:-1:-1;;;;;;54802:51:0;-1:-1:-1;;;54802:51:0;;-1:-1:-1;54795:58:0;;54639:620;-1:-1:-1;55243:4:0;54467:799;;;;;;:::o;60761:988::-;61027:22;61077:1;61052:22;61069:4;61052:16;:22::i;:::-;:26;;;;:::i;:::-;61089:18;61110:26;;;:17;:26;;;;;;61027:51;;-1:-1:-1;61243:28:0;;;61239:328;;-1:-1:-1;;;;;61310:18:0;;61288:19;61310:18;;;:12;:18;;;;;;;;:34;;;;;;;;;61361:30;;;;;;:44;;;61478:30;;:17;:30;;;;;:43;;;61239:328;-1:-1:-1;61663:26:0;;;;:17;:26;;;;;;;;61656:33;;;-1:-1:-1;;;;;61707:18:0;;;;;:12;:18;;;;;:34;;;;;;;61700:41;60761:988::o;62044:1079::-;62322:10;:17;62297:22;;62322:21;;62342:1;;62322:21;:::i;:::-;62354:18;62375:24;;;:15;:24;;;;;;62748:10;:26;;62297:46;;-1:-1:-1;62375:24:0;;62297:46;;62748:26;;;;-1:-1:-1;;;62748:26:0;;;;;;;;;;;;;;;;;62726:48;;62812:11;62787:10;62798;62787:22;;;;;;-1:-1:-1;;;62787:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;62892:28;;;:15;:28;;;;;;;:41;;;63064:24;;;;;63057:31;63099:10;:16;;;;;-1:-1:-1;;;63099:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;62044:1079;;;;:::o;59548:221::-;59633:14;59650:20;59667:2;59650:16;:20::i;:::-;-1:-1:-1;;;;;59681:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;59726:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;59548:221:0:o;16293:229::-;16430:12;16462:52;16484:6;16492:4;16498:1;16501:12;16462:21;:52::i;51267:382::-;-1:-1:-1;;;;;51347:16:0;;51339:61;;;;-1:-1:-1;;;51339:61:0;;24653:2:1;51339:61:0;;;24635:21:1;;;24672:18;;;24665:30;24731:34;24711:18;;;24704:62;24783:18;;51339:61:0;24625:182:1;51339:61:0;49354:4;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;:30;51411:58;;;;-1:-1:-1;;;51411:58:0;;15622:2:1;51411:58:0;;;15604:21:1;15661:2;15641:18;;;15634:30;15700;15680:18;;;15673:58;15748:18;;51411:58:0;15594:178:1;51411:58:0;51482:45;51511:1;51515:2;51519:7;51482:20;:45::i;:::-;-1:-1:-1;;;;;51540:13:0;;;;;;:9;:13;;;;;:18;;51557:1;;51540:13;:18;;51557:1;;51540:18;:::i;:::-;;;;-1:-1:-1;;51569:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51569:21:0;-1:-1:-1;;;;;51569:21:0;;;;;;;;51608:33;;51569:16;;;51608:33;;51569:16;;51608:33;51267:382;;:::o;17413:510::-;17583:12;17641:5;17616:21;:30;;17608:81;;;;-1:-1:-1;;;17608:81:0;;20639:2:1;17608:81:0;;;20621:21:1;20678:2;20658:18;;;20651:30;20717:34;20697:18;;;20690:62;-1:-1:-1;;;20768:18:1;;;20761:36;20814:19;;17608:81:0;20611:228:1;17608:81:0;13810:20;;17700:60;;;;-1:-1:-1;;;17700:60:0;;29008:2:1;17700:60:0;;;28990:21:1;29047:2;29027:18;;;29020:30;29086:31;29066:18;;;29059:59;29135:18;;17700:60:0;28980:179:1;17700:60:0;17774:12;17788:23;17815:6;-1:-1:-1;;;;;17815:11:0;17834:5;17841:4;17815:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17773:73;;;;17864:51;17881:7;17890:10;17902:12;17864:16;:51::i;:::-;17857:58;17413:510;-1:-1:-1;;;;;;;17413:510:0:o;20099:712::-;20249:12;20278:7;20274:530;;;-1:-1:-1;20309:10:0;20302:17;;20274:530;20423:17;;:21;20419:374;;20621:10;20615:17;20682:15;20669:10;20665:2;20661:19;20654:44;20569:148;20764:12;20757:20;;-1:-1:-1;;;20757:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;709:6;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;1250:6;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;1662:6;1670;1678;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;2151:6;2159;2167;2175;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:392::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3215:30;3174:32;3215:30;:::i;3282:325::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3476:9;3463:23;3495:31;3520:5;3495:31;:::i;:::-;3545:5;3597:2;3582:18;;;;3569:32;;-1:-1:-1;;;3369:238:1:o;3612:665::-;3698:6;3706;3759:2;3747:9;3738:7;3734:23;3730:32;3727:2;;;3780:6;3772;3765:22;3727:2;3825:9;3812:23;3854:18;3895:2;3887:6;3884:14;3881:2;;;3916:6;3908;3901:22;3881:2;3959:6;3948:9;3944:22;3934:32;;4004:7;3997:4;3993:2;3989:13;3985:27;3975:2;;4031:6;4023;4016:22;3975:2;4076;4063:16;4102:2;4094:6;4091:14;4088:2;;;4123:6;4115;4108:22;4088:2;4181:7;4176:2;4166:6;4163:1;4159:14;4155:2;4151:23;4147:32;4144:45;4141:2;;;4207:6;4199;4192:22;4141:2;4243;4235:11;;;;;4265:6;;-1:-1:-1;3717:560:1;;-1:-1:-1;;;;3717:560:1:o;4282:251::-;4338:6;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;4412:6;4404;4397:22;4359:2;4456:9;4443:23;4475:28;4497:5;4475:28;:::i;4538:255::-;4605:6;4658:2;4646:9;4637:7;4633:23;4629:32;4626:2;;;4679:6;4671;4664:22;4626:2;4716:9;4710:16;4735:28;4757:5;4735:28;:::i;4798:255::-;4856:6;4909:2;4897:9;4888:7;4884:23;4880:32;4877:2;;;4930:6;4922;4915:22;4877:2;4974:9;4961:23;4993:30;5017:5;4993:30;:::i;5058:259::-;5127:6;5180:2;5168:9;5159:7;5155:23;5151:32;5148:2;;;5201:6;5193;5186:22;5148:2;5238:9;5232:16;5257:30;5281:5;5257:30;:::i;5598:412::-;5680:6;5688;5741:2;5729:9;5720:7;5716:23;5712:32;5709:2;;;5762:6;5754;5747:22;6015:642;6086:6;6094;6147:2;6135:9;6126:7;6122:23;6118:32;6115:2;;;6168:6;6160;6153:22;6115:2;6213:9;6200:23;6242:18;6283:2;6275:6;6272:14;6269:2;;;6304:6;6296;6289:22;6269:2;6347:6;6336:9;6332:22;6322:32;;6392:7;6385:4;6381:2;6377:13;6373:27;6363:2;;6419:6;6411;6404:22;6363:2;6464;6451:16;6490:2;6482:6;6479:14;6476:2;;;6511:6;6503;6496:22;6476:2;6561:7;6556:2;6547:6;6543:2;6539:15;6535:24;6532:37;6529:2;;;6587:6;6579;6572:22;6662:480;6731:6;6784:2;6772:9;6763:7;6759:23;6755:32;6752:2;;;6805:6;6797;6790:22;6752:2;6850:9;6837:23;6883:18;6875:6;6872:30;6869:2;;;6920:6;6912;6905:22;6869:2;6948:22;;7001:4;6993:13;;6989:27;-1:-1:-1;6979:2:1;;7035:6;7027;7020:22;6979:2;7063:73;7128:7;7123:2;7110:16;7105:2;7101;7097:11;7063:73;:::i;7147:292::-;7205:6;7258:2;7246:9;7237:7;7233:23;7229:32;7226:2;;;7279:6;7271;7264:22;7226:2;7323:9;7310:23;7373:6;7366:5;7362:18;7355:5;7352:29;7342:2;;7400:6;7392;7385:22;7444:190;7503:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:2;;;7577:6;7569;7562:22;7524:2;-1:-1:-1;7605:23:1;;7514:120;-1:-1:-1;7514:120:1:o;7639:194::-;7709:6;7762:2;7750:9;7741:7;7737:23;7733:32;7730:2;;;7783:6;7775;7768:22;7730:2;-1:-1:-1;7811:16:1;;7720:113;-1:-1:-1;7720:113:1:o;7838:257::-;7879:3;7917:5;7911:12;7944:6;7939:3;7932:19;7960:63;8016:6;8009:4;8004:3;8000:14;7993:4;7986:5;7982:16;7960:63;:::i;:::-;8077:2;8056:15;-1:-1:-1;;8052:29:1;8043:39;;;;8084:4;8039:50;;7887:208;-1:-1:-1;;7887:208:1:o;8100:242::-;8186:1;8179:5;8176:12;8166:2;;8231:10;8226:3;8222:20;8219:1;8212:31;8266:4;8263:1;8256:15;8294:4;8291:1;8284:15;8166:2;8318:18;;8156:186::o;8347:274::-;8476:3;8514:6;8508:13;8530:53;8576:6;8571:3;8564:4;8556:6;8552:17;8530:53;:::i;:::-;8599:16;;;;;8484:137;-1:-1:-1;;8484:137:1:o;8626:1531::-;8850:3;8888:6;8882:13;8914:4;8927:51;8971:6;8966:3;8961:2;8953:6;8949:15;8927:51;:::i;:::-;9041:13;;9000:16;;;;9063:55;9041:13;9000:16;9085:15;;;9063:55;:::i;:::-;9209:13;;9140:20;;;9180:3;;9269:1;9291:18;;;;9344;;;;9371:2;;9449:4;9439:8;9435:19;9423:31;;9371:2;9512;9502:8;9499:16;9479:18;9476:40;9473:2;;;-1:-1:-1;;;9539:33:1;;9595:4;9592:1;9585:15;9625:4;9546:3;9613:17;9473:2;9656:18;9683:110;;;;9807:1;9802:330;;;;9649:483;;9683:110;-1:-1:-1;;9718:24:1;;9704:39;;9763:20;;;;-1:-1:-1;9683:110:1;;9802:330;32473:4;32492:17;;;32542:4;32526:21;;9897:3;9913:169;9927:8;9924:1;9921:15;9913:169;;;10009:14;;9994:13;;;9987:37;10052:16;;;;9944:10;;9913:169;;;9917:3;;10113:8;10106:5;10102:20;10095:27;;9649:483;-1:-1:-1;10148:3:1;;8858:1299;-1:-1:-1;;;;;;;;;;;8858:1299:1:o;10867:488::-;-1:-1:-1;;;;;11136:15:1;;;11118:34;;11188:15;;11183:2;11168:18;;11161:43;11235:2;11220:18;;11213:34;;;11283:3;11278:2;11263:18;;11256:31;;;11061:4;;11304:45;;11329:19;;11321:6;11304:45;:::i;:::-;11296:53;11070:285;-1:-1:-1;;;;;;11070:285:1:o;11831:218::-;11982:2;11967:18;;11994:49;11971:9;12025:6;11994:49;:::i;12054:330::-;12250:2;12235:18;;12262:49;12239:9;12293:6;12262:49;:::i;:::-;12320:58;12374:2;12363:9;12359:18;12351:6;12320:58;:::i;12389:393::-;12548:2;12537:9;12530:21;12587:6;12582:2;12571:9;12567:18;12560:34;12644:6;12636;12631:2;12620:9;12616:18;12603:48;12511:4;12671:22;;;12695:2;12667:31;;;12660:45;;;;12766:2;12745:15;;;-1:-1:-1;;12741:29:1;12726:45;12722:54;;12520:262;-1:-1:-1;12520:262:1:o;12787:219::-;12936:2;12925:9;12918:21;12899:4;12956:44;12996:2;12985:9;12981:18;12973:6;12956:44;:::i;14190:414::-;14392:2;14374:21;;;14431:2;14411:18;;;14404:30;14470:34;14465:2;14450:18;;14443:62;-1:-1:-1;;;14536:2:1;14521:18;;14514:48;14594:3;14579:19;;14364:240::o;16588:402::-;16790:2;16772:21;;;16829:2;16809:18;;;16802:30;16868:34;16863:2;16848:18;;16841:62;-1:-1:-1;;;16934:2:1;16919:18;;16912:36;16980:3;16965:19;;16762:228::o;18527:406::-;18729:2;18711:21;;;18768:2;18748:18;;;18741:30;18807:34;18802:2;18787:18;;18780:62;-1:-1:-1;;;18873:2:1;18858:18;;18851:40;18923:3;18908:19;;18701:232::o;21257:407::-;21459:2;21441:21;;;21498:2;21478:18;;;21471:30;21537:34;21532:2;21517:18;;21510:62;-1:-1:-1;;;21603:2:1;21588:18;;21581:41;21654:3;21639:19;;21431:233::o;25581:356::-;25783:2;25765:21;;;25802:18;;;25795:30;25861:34;25856:2;25841:18;;25834:62;25928:2;25913:18;;25755:182::o;27582:399::-;27784:2;27766:21;;;27823:2;27803:18;;;27796:30;27862:34;27857:2;27842:18;;27835:62;-1:-1:-1;;;27928:2:1;27913:18;;27906:33;27971:3;27956:19;;27756:225::o;28388:413::-;28590:2;28572:21;;;28629:2;28609:18;;;28602:30;28668:34;28663:2;28648:18;;28641:62;-1:-1:-1;;;28734:2:1;28719:18;;28712:47;28791:3;28776:19;;28562:239::o;29577:354::-;29779:2;29761:21;;;29818:2;29798:18;;;29791:30;29857:32;29852:2;29837:18;;29830:60;29922:2;29907:18;;29751:180::o;29936:404::-;30138:2;30120:21;;;30177:2;30157:18;;;30150:30;30216:34;30211:2;30196:18;;30189:62;-1:-1:-1;;;30282:2:1;30267:18;;30260:38;30330:3;30315:19;;30110:230::o;32558:224::-;32597:3;32625:6;32658:2;32655:1;32651:10;32688:2;32685:1;32681:10;32719:3;32715:2;32711:12;32706:3;32703:21;32700:2;;;32727:18;;:::i;:::-;32763:13;;32605:177;-1:-1:-1;;;;32605:177:1:o;32787:128::-;32827:3;32858:1;32854:6;32851:1;32848:13;32845:2;;;32864:18;;:::i;:::-;-1:-1:-1;32900:9:1;;32835:80::o;32920:120::-;32960:1;32986;32976:2;;32991:18;;:::i;:::-;-1:-1:-1;33025:9:1;;32966:74::o;33045:168::-;33085:7;33151:1;33147;33143:6;33139:14;33136:1;33133:21;33128:1;33121:9;33114:17;33110:45;33107:2;;;33158:18;;:::i;:::-;-1:-1:-1;33198:9:1;;33097:116::o;33218:217::-;33257:4;33286:6;33342:10;;;;33312;;33364:12;;;33361:2;;;33379:18;;:::i;:::-;33416:13;;33266:169;-1:-1:-1;;;33266:169:1:o;33440:125::-;33480:4;33508:1;33505;33502:8;33499:2;;;33513:18;;:::i;:::-;-1:-1:-1;33550:9:1;;33489:76::o;33570:258::-;33642:1;33652:113;33666:6;33663:1;33660:13;33652:113;;;33742:11;;;33736:18;33723:11;;;33716:39;33688:2;33681:10;33652:113;;;33783:6;33780:1;33777:13;33774:2;;;-1:-1:-1;;33818:1:1;33800:16;;33793:27;33623:205::o;33833:380::-;33912:1;33908:12;;;;33955;;;33976:2;;34030:4;34022:6;34018:17;34008:27;;33976:2;34083;34075:6;34072:14;34052:18;34049:38;34046:2;;;34129:10;34124:3;34120:20;34117:1;34110:31;34164:4;34161:1;34154:15;34192:4;34189:1;34182:15;34046:2;;33888:325;;;:::o;34218:135::-;34257:3;-1:-1:-1;;34278:17:1;;34275:2;;;34298:18;;:::i;:::-;-1:-1:-1;34345:1:1;34334:13;;34265:88::o;34358:112::-;34390:1;34416;34406:2;;34421:18;;:::i;:::-;-1:-1:-1;34455:9:1;;34396:74::o;34475:127::-;34536:10;34531:3;34527:20;34524:1;34517:31;34567:4;34564:1;34557:15;34591:4;34588:1;34581:15;34607:127;34668:10;34663:3;34659:20;34656:1;34649:31;34699:4;34696:1;34689:15;34723:4;34720:1;34713:15;34739:127;34800:10;34795:3;34791:20;34788:1;34781:31;34831:4;34828:1;34821:15;34855:4;34852:1;34845:15;34871:131;-1:-1:-1;;;;;34946:31:1;;34936:42;;34926:2;;34992:1;34989;34982:12;35007:118;35093:5;35086:13;35079:21;35072:5;35069:32;35059:2;;35115:1;35112;35105:12;35130:131;-1:-1:-1;;;;;;35204:32:1;;35194:43;;35184:2;;35251:1;35248;35241:12
Swarm Source
ipfs://5741bf2afd5e87fbf5c7718b0c8ccb327744966fe99518fcc64ff72a4a3b9c81
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.