Overview
GLMR Balance
GLMR Value
$161.62 (@ $0.08/GLMR)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 3,219 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 8138059 | 172 days ago | IN | 0 GLMR | 0.031074 | ||||
Set Approval For... | 5730347 | 403 days ago | IN | 0 GLMR | 0.0187471 | ||||
Set Approval For... | 4802764 | 534 days ago | IN | 0 GLMR | 0.00788135 | ||||
Set Approval For... | 3192343 | 762 days ago | IN | 0 GLMR | 0.00246188 | ||||
Set Approval For... | 3069234 | 781 days ago | IN | 0 GLMR | 0.00470626 | ||||
Set Approval For... | 2984345 | 793 days ago | IN | 0 GLMR | 0.00247255 | ||||
Set Approval For... | 2417499 | 873 days ago | IN | 0 GLMR | 0.0024255 | ||||
Set Approval For... | 2410862 | 874 days ago | IN | 0 GLMR | 0.00246188 | ||||
Set Approval For... | 2410768 | 874 days ago | IN | 0 GLMR | 0.00266077 | ||||
Set Approval For... | 2245973 | 897 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 2216707 | 901 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1875058 | 950 days ago | IN | 0 GLMR | 0.00475194 | ||||
Set Approval For... | 1823746 | 957 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1811103 | 959 days ago | IN | 0 GLMR | 0.00473211 | ||||
Set Approval For... | 1810938 | 959 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1785399 | 963 days ago | IN | 0 GLMR | 0.0021319 | ||||
Set Approval For... | 1764421 | 966 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1753136 | 968 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1664030 | 980 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1652243 | 982 days ago | IN | 0 GLMR | 0.00473211 | ||||
Set Approval For... | 1638148 | 984 days ago | IN | 0 GLMR | 0.00473211 | ||||
Set Approval For... | 1627986 | 986 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1604629 | 989 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1514538 | 1002 days ago | IN | 0 GLMR | 0.00468595 | ||||
Set Approval For... | 1473448 | 1008 days ago | IN | 0 GLMR | 0.00468595 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
637519 | 1130 days ago | 9,061.5001 GLMR |
Loading...
Loading
Contract Name:
DomainChainNetwork
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-02-10 */ // SPDX-License-Identifier: MIT 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; } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } 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); } 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; } } 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; } } 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); } } 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); } } } } 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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; } 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); } 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); } 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //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 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 {} } pragma solidity ^0.8.0; 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(); } } 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); } library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract AdminControl is Ownable { using Roles for Roles.Role; Roles.Role private _controllerRoles; modifier onlyMinterController() { require ( hasRole(msg.sender), "AdminControl: sender must has minting role" ); _; } modifier onlyMinter() { require ( hasRole(msg.sender), "AdminControl: sender must has minting role" ); _; } constructor() { _grantRole(msg.sender); } function grantMinterRole (address account) public onlyOwner { _grantRole(account); } function revokeMinterRole (address account) public onlyOwner { _revokeRole(account); } function hasRole(address account) public view returns (bool) { return _controllerRoles.has(account); } function _grantRole (address account) internal { _controllerRoles.add(account); } function _revokeRole (address account) internal { _controllerRoles.remove(account); } } library StringUtil { /** * @dev Return the count of the dot "." in a string */ function dotCount(string memory s) internal pure returns (uint) { s; // Don't warn about unused variables // Starting here means the LSB will be the byte we care about uint ptr; uint end; assembly { ptr := add(s, 1) end := add(mload(s), ptr) } uint num = 0; uint len = 0; for (len; ptr < end; len++) { uint8 b; assembly { b := and(mload(ptr), 0xFF) } if (b == 0x2e) { num += 1; } ptr += 1; } return num; } function toLower(string memory str) internal pure returns (string memory) { bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character... if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { // So we add 32 to make it lowercase bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } function toHash(string memory _s) internal pure returns (bytes32) { return keccak256(abi.encode(_s)); } function isEmpty(string memory _s) internal pure returns (bool) { return bytes(_s).length == 0; } function compare(string memory _a, string memory _b) internal pure returns (int) { bytes memory a = bytes(_a); bytes memory b = bytes(_b); uint minLength = a.length; if (b.length < minLength) minLength = b.length; //@todo unroll the loop into increments of 32 and do full 32 byte comparisons for (uint i = 0; i < minLength; i ++) if (a[i] < b[i]) return -1; else if (a[i] > b[i]) return 1; if (a.length < b.length) return -1; else if (a.length > b.length) return 1; else return 0; } /// @dev Compares two strings and returns true iff they are equal. function equal(string memory _a, string memory _b) internal pure returns (bool) { return compare(_a, _b) == 0; } /// @dev Finds the index of the first occurrence of _needle in _haystack function indexOf(string memory _haystack, string memory _needle) internal pure returns (int) { bytes memory h = bytes(_haystack); bytes memory n = bytes(_needle); if(h.length < 1 || n.length < 1 || (n.length > h.length)) return -1; else if(h.length > (2**128 -1)) // since we have to be able to return -1 (if the char isn't found or input error), this function must return an "int" type with a max length of (2^128 - 1) return -1; else { uint subindex = 0; for (uint i = 0; i < h.length; i ++) { if (h[i] == n[0]) // found the first char of b { subindex = 1; while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) // search until the chars don't match or until we reach the end of a or b { subindex++; } if(subindex == n.length) return int(i); } } return -1; } } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } pragma solidity ^0.8.0; contract DomainChainNetwork is ERC721, ERC721Enumerable, AdminControl { using SafeMath for uint256; using EnumerableSet for EnumerableSet.UintSet; event NewURI(uint256 indexed tokenId, string tokenUri); event NewRouter(uint256 indexed tokenId, address indexed router); event NewResolver(uint256 indexed tokenId, address indexed resolver); mapping (uint256 => EnumerableSet.UintSet) private _subTokens; mapping (uint256 => string) public _tokenURIs; mapping (uint256 => address) internal _tokenResolvers; string private _nftBaseURI = ""; string private _TLD = ""; bool public _saleIsActive = true; uint256 private _price = 3 ether; uint256 private _3chartimes = 10; uint256 private _4chartimes = 5; modifier onlyApprovedOrOwner(uint256 tokenId) { require( _isApprovedOrOwner(_msgSender(), tokenId) ); _; } constructor() ERC721("Moonbeam Name Service (.moon)", "MBNS") { } function getPrice() public view returns (uint256) { return _price; } function getPrice3Char() public view returns (uint256) { return getPrice().mul(_3chartimes); } function getPrice4Char() public view returns (uint256) { return getPrice().mul(_4chartimes); } function getTLD() public view returns (string memory) { return _TLD; } function get3charTimes() public view returns (uint256) { return _3chartimes; } function get4charTimes() public view returns (uint256) { return _4chartimes; } function setTimes(uint256 __3chartime, uint256 __4chartime) public onlyOwner { _3chartimes = __3chartime; _4chartimes = __4chartime; } function setPrice(uint256 price) public onlyOwner { _price = price; } function setTLD(string memory _tld) public onlyOwner { _TLD = _tld; } function setSaleState() public onlyOwner { _saleIsActive = !_saleIsActive; } function _baseURI() internal view override returns (string memory) { return _nftBaseURI; } function setBaseURI(string memory _uri) external onlyOwner { _nftBaseURI = _uri; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. string memory baseURI = _baseURI(); if (bytes(baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(baseURI, tokenId)); } function getOwner(string memory domain) external view returns (address) { string memory _domain = StringUtil.toLower(domain); uint256 tokenId = uint256(keccak256(abi.encodePacked(_domain))); return ownerOf(tokenId); } function buyDomain(string memory domain) external payable { require(_saleIsActive, "Sale must be active to buy"); require(bytes(_TLD).length != 0, "Top level domain must be non-empty"); uint256 _length = bytes(domain).length; require(_length != 0, "Domain must be non-empty"); require(_length >= 3, "Domain requires at least 3 characters"); if (_length == 3) { require(msg.value >= getPrice().mul(_3chartimes), "Insufficient Token or Token value sent is not correct"); } if (_length == 4) { require(msg.value >= getPrice().mul(_4chartimes), "Insufficient Token or Token value sent is not correct"); } if (_length >= 5) { require(msg.value >= getPrice(), "Insufficient Token or Token value sent is not correct"); } string memory _domain = StringUtil.toLower(domain); uint256 count = StringUtil.dotCount(_domain); if (count > 1) { require(count <= 1, "Domain not support"); } if (count == 0) { int index = StringUtil.indexOf(_domain, _TLD); if (index == -1) { _domain = string(abi.encodePacked(_domain, _TLD)); } } uint256 tokenId = uint256(keccak256(abi.encodePacked(_domain))); require (!_exists(tokenId), "Domain already exists"); _safeMint(msg.sender, tokenId); _setTokenURI(tokenId, _domain); emit NewURI(tokenId, _domain); } function registerDomain(address to, string memory domain) external onlyOwner { require(to != address(0), "To address is null"); require(bytes(_TLD).length != 0, "Top level domain must be non-empty"); require(bytes(domain).length != 0, "Domain must be non-empty"); require(bytes(domain).length >= 3, "Domain requires at least 3 characters"); string memory _domain = StringUtil.toLower(domain); uint256 count = StringUtil.dotCount(_domain); if (count > 1) { require(count <= 1, "Domain not support"); } if (count == 0) { int index = StringUtil.indexOf(_domain, _TLD); if (index == -1) { _domain = string(abi.encodePacked(_domain, _TLD)); } } uint256 tokenId = uint256(keccak256(abi.encodePacked(_domain))); require (!_exists(tokenId), "Domain already exists"); _safeMint(to, tokenId); _setTokenURI(tokenId, _domain); emit NewURI(tokenId, _domain); } function registerSubDomain(address to, uint256 tokenId, string memory sub) external onlyApprovedOrOwner(tokenId) { _safeMintSubDomain(to, tokenId, sub, ""); } function burn(uint256 tokenId) public virtual { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } if (_tokenResolvers[tokenId] != address(0)) { delete _tokenResolvers[tokenId]; } _burn(tokenId); } function isApprovedOrOwner(address account, uint256 tokenId) external view returns(bool) { return _isApprovedOrOwner(account, tokenId); } function setOwner(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) { _transfer(ownerOf(tokenId), to, tokenId); } function exists(uint256 tokenId) external view returns (bool) { return _exists(tokenId); } function setResolver(uint256 tokenId, address resolver) external onlyApprovedOrOwner(tokenId) { _setResolver(tokenId, resolver); } function resolverOf(uint256 tokenId) external view returns (address) { address resolver = _tokenResolvers[tokenId]; require (resolver != address(0)); return resolver; } function burnSubDomain(uint256 tokenId, string memory sub) external onlyApprovedOrOwner(tokenId) { _burnSubDomain(tokenId, sub); } function genTokenId(string memory label) public pure returns(uint256) { require (bytes(label).length != 0); return uint256(keccak256(abi.encodePacked(label))); } function subTokenIdCount(uint256 tokenId) public view returns (uint256) { require (_exists(tokenId)); return _subTokens[tokenId].length(); } function subTokenIdByIndex(uint256 tokenId, uint256 index) public view returns (uint256) { require (subTokenIdCount(tokenId) > index); return _subTokens[tokenId].at(index); } function withdraw() external payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function _safeMintSubDomain(address to, uint256 tokenId, string memory sub, bytes memory _data) internal { require(to != address(0)); require (bytes(sub).length != 0); require (StringUtil.dotCount(sub) == 0); require (_exists(tokenId)); string memory _sub = StringUtil.toLower(sub); bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]); uint256 _newTokenId = genTokenId(string(_newUri)); uint256 count = StringUtil.dotCount(_tokenURIs[tokenId]); if (count == 1) { _subTokens[tokenId].add(_newTokenId); } if (bytes(_data).length != 0) { _safeMint(to, _newTokenId, _data); } else { _safeMint(to, _newTokenId); } _setTokenURI(_newTokenId, string(_newUri)); emit NewURI(_newTokenId, string(_newUri)); } function _burnSubDomain(uint256 tokenId, string memory sub) internal { string memory _sub = StringUtil.toLower(sub); bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]); uint256 _newTokenId = genTokenId(string(_newUri)); // remove sub tokenIds itself _subTokens[tokenId].remove(_newTokenId); if (_tokenResolvers[tokenId] != address(0)) { delete _tokenResolvers[tokenId]; } if (bytes(_tokenURIs[_newTokenId]).length != 0) { delete _tokenURIs[_newTokenId]; } super._burn(_newTokenId); } function _setResolver(uint256 tokenId, address resolver) internal { require (_exists(tokenId)); _tokenResolvers[tokenId] = resolver; emit NewResolver(tokenId, resolver); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"NewRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"}],"name":"NewURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"burnSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"buyDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"}],"name":"genTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"get3charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get4charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice3Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice4Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTLD","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"domain","type":"string"}],"name":"registerDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resolverOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"setTLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__3chartime","type":"uint256"},{"internalType":"uint256","name":"__4chartime","type":"uint256"}],"name":"setTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subTokenIdByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"subTokenIdCount","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":"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600f9162000290565b506040805160208101918290526000908190526200003c9160109162000290565b506011805460ff191660011790556729a2241af62c0000601255600a60135560056014553480156200006d57600080fd5b50604080518082018252601d81527f4d6f6f6e6265616d204e616d65205365727669636520282e6d6f6f6e290000006020808301918252835180850190945260048452634d424e5360e01b908401528151919291620000cf9160009162000290565b508051620000e590600190602084019062000290565b50505062000102620000fc6200011360201b60201c565b62000117565b6200010d3362000169565b62000373565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200018481600b6200018760201b62001bfc1790919060201c565b50565b6200019382826200020b565b15620001e65760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620002705760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401620001dd565b506001600160a01b03166000908152602091909152604090205460ff1690565b8280546200029e9062000336565b90600052602060002090601f016020900481019282620002c257600085556200030d565b82601f10620002dd57805160ff19168380011785556200030d565b828001600101855582156200030d579182015b828111156200030d578251825591602001919060010190620002f0565b506200031b9291506200031f565b5090565b5b808211156200031b576000815560010162000320565b600181811c908216806200034b57607f821691505b602082108114156200036d57634e487b7160e01b600052602260045260246000fd5b50919050565b61398980620003836000396000f3fe6080604052600436106102c95760003560e01c80635d893ba01161017557806398d5fdca116100dc578063bc7b6d6211610095578063c87b56dd1161006f578063c87b56dd14610839578063d231563014610859578063e985e9c51461086e578063f2fde38b146108b757600080fd5b8063bc7b6d62146107e4578063c479a80414610804578063c6438cb81461082457600080fd5b806398d5fdca1461072f578063a22cb46514610744578063ab3b87fe14610764578063ad59e22614610784578063b3f9e4cb146107a4578063b88d4fde146107c457600080fd5b80637ef09bca1161012e5780637ef09bca146106875780638da5cb5b146106a75780638f55ee79146106c557806391b7f5ed146106da57806395d89b41146106fa57806398a602431461070f57600080fd5b80635d893ba0146105d85780636352211e146105f257806369e2f0fb1461061257806370a0823114610632578063715018a61461065257806376f909ae1461066757600080fd5b8063358deb1c116102345780634aaf4a12116101ed5780634f6ccce7116101c75780634f6ccce7146105585780635040ddf21461057857806350b3a1441461059857806355f804b3146105b857600080fd5b80634aaf4a12146105035780634cd637b5146105235780634f558e791461053857600080fd5b8063358deb1c146104665780633ccfd60b1461047b5780633dd1eb611461048357806342842e0e146104a357806342966c68146104c3578063430c2081146104e357600080fd5b80631c3b028e116102865780631c3b028e146103be5780631ed40559146103d157806322434836146103e657806323b872dd146104065780632dc50d9a146104265780632f745c591461044657600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063095ea7b31461035d5780630bb78ec11461037f57806318160ddd1461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461336a565b6108d7565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108e8565b6040516102fa9190613629565b34801561033157600080fd5b506103456103403660046133d9565b61097a565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037d6103783660046132e9565b610a07565b005b34801561038b57600080fd5b5061031861039a3660046133d9565b610b1d565b3480156103ab57600080fd5b506008545b6040519081526020016102fa565b61037d6103cc3660046133a4565b610bb7565b3480156103dd57600080fd5b5061037d610f46565b3480156103f257600080fd5b5061037d610401366004613446565b610f84565b34801561041257600080fd5b5061037d6104213660046131a7565b610fb9565b34801561043257600080fd5b506103b0610441366004613446565b610feb565b34801561045257600080fd5b506103b06104613660046132e9565b611020565b34801561047257600080fd5b506013546103b0565b61037d6110b6565b34801561048f57600080fd5b5061037d61049e366004613159565b611106565b3480156104af57600080fd5b5061037d6104be3660046131a7565b61113c565b3480156104cf57600080fd5b5061037d6104de3660046133d9565b611157565b3480156104ef57600080fd5b506102ee6104fe3660046132e9565b61123f565b34801561050f57600080fd5b5061034561051e3660046133a4565b61124b565b34801561052f57600080fd5b506103b0611298565b34801561054457600080fd5b506102ee6105533660046133d9565b6112ae565b34801561056457600080fd5b506103b06105733660046133d9565b6112b9565b34801561058457600080fd5b5061037d61059336600461329b565b61134c565b3480156105a457600080fd5b506103b06105b33660046133a4565b611594565b3480156105c457600080fd5b5061037d6105d33660046133a4565b6115d4565b3480156105e457600080fd5b506011546102ee9060ff1681565b3480156105fe57600080fd5b5061034561060d3660046133d9565b611615565b34801561061e57600080fd5b5061037d61062d366004613159565b61168c565b34801561063e57600080fd5b506103b061064d366004613159565b6116bf565b34801561065e57600080fd5b5061037d611746565b34801561067357600080fd5b506103b06106823660046133d9565b61177a565b34801561069357600080fd5b506102ee6106a2366004613159565b6117a5565b3480156106b357600080fd5b50600a546001600160a01b0316610345565b3480156106d157600080fd5b506103186117b2565b3480156106e657600080fd5b5061037d6106f53660046133d9565b6117c1565b34801561070657600080fd5b506103186117f0565b34801561071b57600080fd5b5061037d61072a366004613313565b6117ff565b34801561073b57600080fd5b506012546103b0565b34801561075057600080fd5b5061037d61075f36600461325f565b611833565b34801561077057600080fd5b5061037d61077f3660046132e9565b6118f8565b34801561079057600080fd5b5061037d61079f3660046133a4565b61191e565b3480156107b057600080fd5b506103456107bf3660046133d9565b61195b565b3480156107d057600080fd5b5061037d6107df3660046131e3565b61197d565b3480156107f057600080fd5b5061037d6107ff3660046133f2565b6119af565b34801561081057600080fd5b5061037d61081f366004613415565b6119cc565b34801561083057600080fd5b506103b06119e9565b34801561084557600080fd5b506103186108543660046133d9565b6119fa565b34801561086557600080fd5b506014546103b0565b34801561087a57600080fd5b506102ee610889366004613174565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c357600080fd5b5061037d6108d2366004613159565b611b64565b60006108e282611c78565b92915050565b6060600080546108f79061388f565b80601f01602080910402602001604051908101604052809291908181526020018280546109239061388f565b80156109705780601f1061094557610100808354040283529160200191610970565b820191906000526020600020905b81548152906001019060200180831161095357829003601f168201915b5050505050905090565b600061098582611c9d565b6109eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1282611615565b9050806001600160a01b0316836001600160a01b03161415610a805760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e2565b336001600160a01b0382161480610a9c5750610a9c8133610889565b610b0e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e2565b610b188383611cba565b505050565b600d6020526000908152604090208054610b369061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b629061388f565b8015610baf5780601f10610b8457610100808354040283529160200191610baf565b820191906000526020600020905b815481529060010190602001808311610b9257829003601f168201915b505050505081565b60115460ff16610c095760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f2062757900000000000060448201526064016109e2565b60108054610c169061388f565b15159050610c365760405162461bcd60e51b81526004016109e2906137ae565b805180610c805760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b60448201526064016109e2565b6003811015610ca15760405162461bcd60e51b81526004016109e29061368e565b8060031415610cde57610cbf601354610cb960125490565b90611d28565b341015610cde5760405162461bcd60e51b81526004016109e2906136d3565b8060041415610d1557610cf6601454610cb960125490565b341015610d155760405162461bcd60e51b81526004016109e2906136d3565b60058110610d3f57601254341015610d3f5760405162461bcd60e51b81526004016109e2906136d3565b6000610d4a83611d34565b90506000610d5782611e97565b90506001811115610da8576001811115610da85760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b60448201526064016109e2565b80610e77576000610e438360108054610dc09061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054610dec9061388f565b8015610e395780601f10610e0e57610100808354040283529160200191610e39565b820191906000526020600020905b815481529060010190602001808311610e1c57829003601f168201915b5050505050611ef6565b9050806000191415610e7557826010604051602001610e63929190613579565b60405160208183030381529060405292505b505b600082604051602001610e8a919061352e565b6040516020818303038152906040528051906020012060001c9050610eae81611c9d565b15610ef35760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b60448201526064016109e2565b610efd3382612069565b610f078184612083565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c395284604051610f379190613629565b60405180910390a25050505050565b600a546001600160a01b03163314610f705760405162461bcd60e51b81526004016109e290613728565b6011805460ff19811660ff90911615179055565b600a546001600160a01b03163314610fae5760405162461bcd60e51b81526004016109e290613728565b601391909155601455565b610fc4335b8261210c565b610fe05760405162461bcd60e51b81526004016109e29061375d565b610b188383836121f2565b600081610ff78461177a565b1161100157600080fd5b6000838152600c60205260409020611019908361239d565b9392505050565b600061102b836116bf565b821061108d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109e2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146110e05760405162461bcd60e51b81526004016109e290613728565b60405133904780156108fc02916000818181858888f1935050505061110457600080fd5b565b600a546001600160a01b031633146111305760405162461bcd60e51b81526004016109e290613728565b611139816123a9565b50565b610b188383836040518060200160405280600081525061197d565b61116033610fbe565b6111c55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016109e2565b6000818152600d6020526040902080546111de9061388f565b1590506111fc576000818152600d602052604081206111fc91612fd4565b6000818152600e60205260409020546001600160a01b031615611236576000818152600e6020526040902080546001600160a01b03191690555b611139816123b4565b6000611019838361210c565b60008061125783611d34565b905060008160405160200161126c919061352e565b6040516020818303038152906040528051906020012060001c905061129081611615565b949350505050565b60006112a9601454610cb960125490565b905090565b60006108e282611c9d565b60006112c460085490565b82106113275760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109e2565b6008828154811061133a5761133a613911565b90600052602060002001549050919050565b600a546001600160a01b031633146113765760405162461bcd60e51b81526004016109e290613728565b6001600160a01b0382166113c15760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b60448201526064016109e2565b601080546113ce9061388f565b151590506113ee5760405162461bcd60e51b81526004016109e2906137ae565b80516114375760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b60448201526064016109e2565b6003815110156114595760405162461bcd60e51b81526004016109e29061368e565b600061146482611d34565b9050600061147182611e97565b905060018111156114c25760018111156114c25760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b60448201526064016109e2565b8061150e5760006114da8360108054610dc09061388f565b905080600019141561150c578260106040516020016114fa929190613579565b60405160208183030381529060405292505b505b600082604051602001611521919061352e565b6040516020818303038152906040528051906020012060001c905061154581611c9d565b1561158a5760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b60448201526064016109e2565b610efd8582612069565b60008151600014156115a557600080fd5b816040516020016115b6919061352e565b60408051601f19818403018152919052805160209091012092915050565b600a546001600160a01b031633146115fe5760405162461bcd60e51b81526004016109e290613728565b805161161190600f90602084019061300e565b5050565b6000818152600260205260408120546001600160a01b0316806108e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e2565b600a546001600160a01b031633146116b65760405162461bcd60e51b81526004016109e290613728565b6111398161245b565b60006001600160a01b03821661172a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e2565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117705760405162461bcd60e51b81526004016109e290613728565b6111046000612466565b600061178582611c9d565b61178e57600080fd5b6000828152600c602052604090206108e2906124b8565b60006108e2600b836124c2565b6060601080546108f79061388f565b600a546001600160a01b031633146117eb5760405162461bcd60e51b81526004016109e290613728565b601255565b6060600180546108f79061388f565b8161180933610fbe565b61181257600080fd5b61182d84848460405180602001604052806000815250612545565b50505050565b6001600160a01b03821633141561188c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e2565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b8061190233610fbe565b61190b57600080fd5b610b1861191783611615565b84846121f2565b600a546001600160a01b031633146119485760405162461bcd60e51b81526004016109e290613728565b805161161190601090602084019061300e565b6000818152600e60205260408120546001600160a01b0316806108e257600080fd5b611987338361210c565b6119a35760405162461bcd60e51b81526004016109e29061375d565b61182d84848484612712565b816119b933610fbe565b6119c257600080fd5b610b188383612745565b816119d633610fbe565b6119df57600080fd5b610b1883836127b0565b60006112a9601354610cb960125490565b6060611a0582611c9d565b611a695760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e2565b6000828152600d602052604081208054611a829061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054611aae9061388f565b8015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b505050505090506000611b0c61289d565b9050805160001415611b1f575092915050565b815115611b51578082604051602001611b3992919061354a565b60405160208183030381529060405292505050919050565b8084604051602001611b399291906135ca565b600a546001600160a01b03163314611b8e5760405162461bcd60e51b81526004016109e290613728565b6001600160a01b038116611bf35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e2565b61113981612466565b611c0682826124c2565b15611c535760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064016109e2565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b14806108e257506108e2826128ac565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cef82611615565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611019828461382d565b606060008290506000815167ffffffffffffffff811115611d5757611d57613927565b6040519080825280601f01601f191660200182016040528015611d81576020820181803683370190505b50905060005b8251811015611e8f576041838281518110611da457611da4613911565b016020015160f81c10801590611dd45750605a838281518110611dc957611dc9613911565b016020015160f81c11155b15611e3657828181518110611deb57611deb613911565b602001015160f81c60f81b60f81c6020611e059190613808565b60f81b828281518110611e1a57611e1a613911565b60200101906001600160f81b031916908160001a905350611e7d565b828181518110611e4857611e48613911565b602001015160f81c60f81b828281518110611e6557611e65613911565b60200101906001600160f81b031916908160001a9053505b80611e87816138ca565b915050611d87565b509392505050565b805160009060018381019184010182805b82841015611eed57835160ff16602e811415611ecc57611ec96001846137f0565b92505b611ed76001866137f0565b9450508080611ee5906138ca565b915050611ea8565b50949350505050565b81516000908390839060011180611f0e575060018151105b80611f1a575081518151115b15611f2b57600019925050506108e2565b6fffffffffffffffffffffffffffffffff82511115611f5057600019925050506108e2565b6000805b835181101561205b5782600081518110611f7057611f70613911565b602001015160f81c60f81b6001600160f81b031916848281518110611f9757611f97613911565b01602001516001600160f81b031916141561204957600191505b825182108015611fca57508351611fc883836137f0565b105b801561201e5750828281518110611fe357611fe3613911565b01602001516001600160f81b03191684611ffd84846137f0565b8151811061200d5761200d613911565b01602001516001600160f81b031916145b15612035578161202d816138ca565b925050611fb1565b82518214156120495793506108e292505050565b80612053816138ca565b915050611f54565b5060001993505050506108e2565b6116118282604051806020016040528060008152506128fc565b61208c82611c9d565b6120ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e2565b6000828152600d602090815260409091208251610b189284019061300e565b600061211782611c9d565b6121785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e2565b600061218383611615565b9050806001600160a01b0316846001600160a01b031614806121be5750836001600160a01b03166121b38461097a565b6001600160a01b0316145b8061129057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611290565b826001600160a01b031661220582611615565b6001600160a01b03161461226d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e2565b6001600160a01b0382166122cf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e2565b6122da83838361292f565b6122e5600082611cba565b6001600160a01b038316600090815260036020526040812080546001929061230e90849061384c565b90915550506001600160a01b038216600090815260036020526040812080546001929061233c9084906137f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611019838361293a565b611139600b82611bfc565b60006123bf82611615565b90506123cd8160008461292f565b6123d8600083611cba565b6001600160a01b038116600090815260036020526040812080546001929061240190849061384c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611139600b82612964565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006108e2825490565b60006001600160a01b0382166125255760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b60648201526084016109e2565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03841661255857600080fd5b815161256357600080fd5b61256c82611e97565b1561257657600080fd5b61257f83611c9d565b61258857600080fd5b600061259383611d34565b9050600081600d60008781526020019081526020016000206040516020016125bc9291906135a0565b604051602081830303815290604052905060006125d882611594565b90506000612680600d600089815260200190815260200160002080546125fd9061388f565b80601f01602080910402602001604051908101604052809291908181526020018280546126299061388f565b80156126765780601f1061264b57610100808354040283529160200191612676565b820191906000526020600020905b81548152906001019060200180831161265957829003601f168201915b5050505050611e97565b905080600114156126a5576000878152600c602052604090206126a390836129e6565b505b8451156126bc576126b78883876128fc565b6126c6565b6126c68883612069565b6126d08284612083565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516127009190613629565b60405180910390a25050505050505050565b61271d8484846121f2565b612729848484846129f2565b61182d5760405162461bcd60e51b81526004016109e29061363c565b61274e82611c9d565b61275757600080fd5b6000828152600e602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917fcbae0978f0621ebb4707a96540f8d3a937104526ceef2cdf1cf07b25c5e48cd49190a35050565b60006127bb82611d34565b9050600081600d60008681526020019081526020016000206040516020016127e49291906135a0565b6040516020818303038152906040529050600061280082611594565b6000868152600c6020526040902090915061281b9082612aff565b506000858152600e60205260409020546001600160a01b031615612856576000858152600e6020526040902080546001600160a01b03191690555b6000818152600d60205260409020805461286f9061388f565b15905061288d576000818152600d6020526040812061288d91612fd4565b612896816123b4565b5050505050565b6060600f80546108f79061388f565b60006001600160e01b031982166380ac58cd60e01b14806128dd57506001600160e01b03198216635b5e139f60e01b145b806108e257506301ffc9a760e01b6001600160e01b03198316146108e2565b6129068383612b0b565b61291360008484846129f2565b610b185760405162461bcd60e51b81526004016109e29061363c565b610b18838383612c4a565b600082600001828154811061295157612951613911565b9060005260206000200154905092915050565b61296e82826124c2565b6129c45760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b60648201526084016109e2565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006110198383612d02565b60006001600160a01b0384163b15612af457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a369033908990889088906004016135ec565b602060405180830381600087803b158015612a5057600080fd5b505af1925050508015612a80575060408051601f3d908101601f19168201909252612a7d91810190613387565b60015b612ada573d808015612aae576040519150601f19603f3d011682016040523d82523d6000602084013e612ab3565b606091505b508051612ad25760405162461bcd60e51b81526004016109e29061363c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611290565b506001949350505050565b60006110198383612d51565b6001600160a01b038216612b615760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e2565b612b6a81611c9d565b15612bb75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e2565b612bc36000838361292f565b6001600160a01b0382166000908152600360205260408120805460019290612bec9084906137f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612ca557612ca081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612cc8565b816001600160a01b0316836001600160a01b031614612cc857612cc88382612e44565b6001600160a01b038216612cdf57610b1881612ee1565b826001600160a01b0316826001600160a01b031614610b1857610b188282612f90565b6000818152600183016020526040812054612d49575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e2565b5060006108e2565b60008181526001830160205260408120548015612e3a576000612d7560018361384c565b8554909150600090612d899060019061384c565b9050818114612dee576000866000018281548110612da957612da9613911565b9060005260206000200154905080876000018481548110612dcc57612dcc613911565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dff57612dff6138fb565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e2565b60009150506108e2565b60006001612e51846116bf565b612e5b919061384c565b600083815260076020526040902054909150808214612eae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ef39060019061384c565b60008381526009602052604081205460088054939450909284908110612f1b57612f1b613911565b906000526020600020015490508060088381548110612f3c57612f3c613911565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7457612f746138fb565b6001900381819060005260206000200160009055905550505050565b6000612f9b836116bf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054612fe09061388f565b6000825580601f10612ff0575050565b601f0160209004906000526020600020908101906111399190613092565b82805461301a9061388f565b90600052602060002090601f01602090048101928261303c5760008555613082565b82601f1061305557805160ff1916838001178555613082565b82800160010185558215613082579182015b82811115613082578251825591602001919060010190613067565b5061308e929150613092565b5090565b5b8082111561308e5760008155600101613093565b600067ffffffffffffffff808411156130c2576130c2613927565b604051601f8501601f19908116603f011681019082821181831017156130ea576130ea613927565b8160405280935085815286868601111561310357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461313457600080fd5b919050565b600082601f83011261314a57600080fd5b611019838335602085016130a7565b60006020828403121561316b57600080fd5b6110198261311d565b6000806040838503121561318757600080fd5b6131908361311d565b915061319e6020840161311d565b90509250929050565b6000806000606084860312156131bc57600080fd5b6131c58461311d565b92506131d36020850161311d565b9150604084013590509250925092565b600080600080608085870312156131f957600080fd5b6132028561311d565b93506132106020860161311d565b925060408501359150606085013567ffffffffffffffff81111561323357600080fd5b8501601f8101871361324457600080fd5b613253878235602084016130a7565b91505092959194509250565b6000806040838503121561327257600080fd5b61327b8361311d565b91506020830135801515811461329057600080fd5b809150509250929050565b600080604083850312156132ae57600080fd5b6132b78361311d565b9150602083013567ffffffffffffffff8111156132d357600080fd5b6132df85828601613139565b9150509250929050565b600080604083850312156132fc57600080fd5b6133058361311d565b946020939093013593505050565b60008060006060848603121561332857600080fd5b6133318461311d565b925060208401359150604084013567ffffffffffffffff81111561335457600080fd5b61336086828701613139565b9150509250925092565b60006020828403121561337c57600080fd5b81356110198161393d565b60006020828403121561339957600080fd5b81516110198161393d565b6000602082840312156133b657600080fd5b813567ffffffffffffffff8111156133cd57600080fd5b61129084828501613139565b6000602082840312156133eb57600080fd5b5035919050565b6000806040838503121561340557600080fd5b8235915061319e6020840161311d565b6000806040838503121561342857600080fd5b82359150602083013567ffffffffffffffff8111156132d357600080fd5b6000806040838503121561345957600080fd5b50508035926020909101359150565b60008151808452613480816020860160208601613863565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806134ae57607f831692505b60208084108214156134d057634e487b7160e01b600052602260045260246000fd5b8180156134e457600181146134f557613522565b60ff19861689528489019650613522565b60008881526020902060005b8681101561351a5781548b820152908501908301613501565b505084890196505b50505050505092915050565b60008251613540818460208701613863565b9190910192915050565b6000835161355c818460208801613863565b835190830190613570818360208801613863565b01949350505050565b6000835161358b818460208801613863565b61359781840185613494565b95945050505050565b600083516135b2818460208801613863565b601760f91b9083019081526135976001820185613494565b600083516135dc818460208801613863565b9190910191825250602001919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361f90830184613468565b9695505050505050565b6020815260006110196020830184613468565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f446f6d61696e207265717569726573206174206c656173742033206368617261604082015264637465727360d81b606082015260800190565b60208082526035908201527f496e73756666696369656e7420546f6b656e206f7220546f6b656e2076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f546f70206c6576656c20646f6d61696e206d757374206265206e6f6e2d656d70604082015261747960f01b606082015260800190565b60008219821115613803576138036138e5565b500190565b600060ff821660ff84168060ff03821115613825576138256138e5565b019392505050565b6000816000190483118215151615613847576138476138e5565b500290565b60008282101561385e5761385e6138e5565b500390565b60005b8381101561387e578181015183820152602001613866565b8381111561182d5750506000910152565b600181811c908216806138a357607f821691505b602082108114156138c457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138de576138de6138e5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461113957600080fdfea26469706673582212207513065d88b1b511ad0fc657a5f8a5a8d4eded1c1390f063ba59950f8942ebe764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102c95760003560e01c80635d893ba01161017557806398d5fdca116100dc578063bc7b6d6211610095578063c87b56dd1161006f578063c87b56dd14610839578063d231563014610859578063e985e9c51461086e578063f2fde38b146108b757600080fd5b8063bc7b6d62146107e4578063c479a80414610804578063c6438cb81461082457600080fd5b806398d5fdca1461072f578063a22cb46514610744578063ab3b87fe14610764578063ad59e22614610784578063b3f9e4cb146107a4578063b88d4fde146107c457600080fd5b80637ef09bca1161012e5780637ef09bca146106875780638da5cb5b146106a75780638f55ee79146106c557806391b7f5ed146106da57806395d89b41146106fa57806398a602431461070f57600080fd5b80635d893ba0146105d85780636352211e146105f257806369e2f0fb1461061257806370a0823114610632578063715018a61461065257806376f909ae1461066757600080fd5b8063358deb1c116102345780634aaf4a12116101ed5780634f6ccce7116101c75780634f6ccce7146105585780635040ddf21461057857806350b3a1441461059857806355f804b3146105b857600080fd5b80634aaf4a12146105035780634cd637b5146105235780634f558e791461053857600080fd5b8063358deb1c146104665780633ccfd60b1461047b5780633dd1eb611461048357806342842e0e146104a357806342966c68146104c3578063430c2081146104e357600080fd5b80631c3b028e116102865780631c3b028e146103be5780631ed40559146103d157806322434836146103e657806323b872dd146104065780632dc50d9a146104265780632f745c591461044657600080fd5b806301ffc9a7146102ce57806306fdde0314610303578063081812fc14610325578063095ea7b31461035d5780630bb78ec11461037f57806318160ddd1461039f575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461336a565b6108d7565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186108e8565b6040516102fa9190613629565b34801561033157600080fd5b506103456103403660046133d9565b61097a565b6040516001600160a01b0390911681526020016102fa565b34801561036957600080fd5b5061037d6103783660046132e9565b610a07565b005b34801561038b57600080fd5b5061031861039a3660046133d9565b610b1d565b3480156103ab57600080fd5b506008545b6040519081526020016102fa565b61037d6103cc3660046133a4565b610bb7565b3480156103dd57600080fd5b5061037d610f46565b3480156103f257600080fd5b5061037d610401366004613446565b610f84565b34801561041257600080fd5b5061037d6104213660046131a7565b610fb9565b34801561043257600080fd5b506103b0610441366004613446565b610feb565b34801561045257600080fd5b506103b06104613660046132e9565b611020565b34801561047257600080fd5b506013546103b0565b61037d6110b6565b34801561048f57600080fd5b5061037d61049e366004613159565b611106565b3480156104af57600080fd5b5061037d6104be3660046131a7565b61113c565b3480156104cf57600080fd5b5061037d6104de3660046133d9565b611157565b3480156104ef57600080fd5b506102ee6104fe3660046132e9565b61123f565b34801561050f57600080fd5b5061034561051e3660046133a4565b61124b565b34801561052f57600080fd5b506103b0611298565b34801561054457600080fd5b506102ee6105533660046133d9565b6112ae565b34801561056457600080fd5b506103b06105733660046133d9565b6112b9565b34801561058457600080fd5b5061037d61059336600461329b565b61134c565b3480156105a457600080fd5b506103b06105b33660046133a4565b611594565b3480156105c457600080fd5b5061037d6105d33660046133a4565b6115d4565b3480156105e457600080fd5b506011546102ee9060ff1681565b3480156105fe57600080fd5b5061034561060d3660046133d9565b611615565b34801561061e57600080fd5b5061037d61062d366004613159565b61168c565b34801561063e57600080fd5b506103b061064d366004613159565b6116bf565b34801561065e57600080fd5b5061037d611746565b34801561067357600080fd5b506103b06106823660046133d9565b61177a565b34801561069357600080fd5b506102ee6106a2366004613159565b6117a5565b3480156106b357600080fd5b50600a546001600160a01b0316610345565b3480156106d157600080fd5b506103186117b2565b3480156106e657600080fd5b5061037d6106f53660046133d9565b6117c1565b34801561070657600080fd5b506103186117f0565b34801561071b57600080fd5b5061037d61072a366004613313565b6117ff565b34801561073b57600080fd5b506012546103b0565b34801561075057600080fd5b5061037d61075f36600461325f565b611833565b34801561077057600080fd5b5061037d61077f3660046132e9565b6118f8565b34801561079057600080fd5b5061037d61079f3660046133a4565b61191e565b3480156107b057600080fd5b506103456107bf3660046133d9565b61195b565b3480156107d057600080fd5b5061037d6107df3660046131e3565b61197d565b3480156107f057600080fd5b5061037d6107ff3660046133f2565b6119af565b34801561081057600080fd5b5061037d61081f366004613415565b6119cc565b34801561083057600080fd5b506103b06119e9565b34801561084557600080fd5b506103186108543660046133d9565b6119fa565b34801561086557600080fd5b506014546103b0565b34801561087a57600080fd5b506102ee610889366004613174565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108c357600080fd5b5061037d6108d2366004613159565b611b64565b60006108e282611c78565b92915050565b6060600080546108f79061388f565b80601f01602080910402602001604051908101604052809291908181526020018280546109239061388f565b80156109705780601f1061094557610100808354040283529160200191610970565b820191906000526020600020905b81548152906001019060200180831161095357829003601f168201915b5050505050905090565b600061098582611c9d565b6109eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1282611615565b9050806001600160a01b0316836001600160a01b03161415610a805760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e2565b336001600160a01b0382161480610a9c5750610a9c8133610889565b610b0e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e2565b610b188383611cba565b505050565b600d6020526000908152604090208054610b369061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b629061388f565b8015610baf5780601f10610b8457610100808354040283529160200191610baf565b820191906000526020600020905b815481529060010190602001808311610b9257829003601f168201915b505050505081565b60115460ff16610c095760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f2062757900000000000060448201526064016109e2565b60108054610c169061388f565b15159050610c365760405162461bcd60e51b81526004016109e2906137ae565b805180610c805760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b60448201526064016109e2565b6003811015610ca15760405162461bcd60e51b81526004016109e29061368e565b8060031415610cde57610cbf601354610cb960125490565b90611d28565b341015610cde5760405162461bcd60e51b81526004016109e2906136d3565b8060041415610d1557610cf6601454610cb960125490565b341015610d155760405162461bcd60e51b81526004016109e2906136d3565b60058110610d3f57601254341015610d3f5760405162461bcd60e51b81526004016109e2906136d3565b6000610d4a83611d34565b90506000610d5782611e97565b90506001811115610da8576001811115610da85760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b60448201526064016109e2565b80610e77576000610e438360108054610dc09061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054610dec9061388f565b8015610e395780601f10610e0e57610100808354040283529160200191610e39565b820191906000526020600020905b815481529060010190602001808311610e1c57829003601f168201915b5050505050611ef6565b9050806000191415610e7557826010604051602001610e63929190613579565b60405160208183030381529060405292505b505b600082604051602001610e8a919061352e565b6040516020818303038152906040528051906020012060001c9050610eae81611c9d565b15610ef35760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b60448201526064016109e2565b610efd3382612069565b610f078184612083565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c395284604051610f379190613629565b60405180910390a25050505050565b600a546001600160a01b03163314610f705760405162461bcd60e51b81526004016109e290613728565b6011805460ff19811660ff90911615179055565b600a546001600160a01b03163314610fae5760405162461bcd60e51b81526004016109e290613728565b601391909155601455565b610fc4335b8261210c565b610fe05760405162461bcd60e51b81526004016109e29061375d565b610b188383836121f2565b600081610ff78461177a565b1161100157600080fd5b6000838152600c60205260409020611019908361239d565b9392505050565b600061102b836116bf565b821061108d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109e2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146110e05760405162461bcd60e51b81526004016109e290613728565b60405133904780156108fc02916000818181858888f1935050505061110457600080fd5b565b600a546001600160a01b031633146111305760405162461bcd60e51b81526004016109e290613728565b611139816123a9565b50565b610b188383836040518060200160405280600081525061197d565b61116033610fbe565b6111c55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016109e2565b6000818152600d6020526040902080546111de9061388f565b1590506111fc576000818152600d602052604081206111fc91612fd4565b6000818152600e60205260409020546001600160a01b031615611236576000818152600e6020526040902080546001600160a01b03191690555b611139816123b4565b6000611019838361210c565b60008061125783611d34565b905060008160405160200161126c919061352e565b6040516020818303038152906040528051906020012060001c905061129081611615565b949350505050565b60006112a9601454610cb960125490565b905090565b60006108e282611c9d565b60006112c460085490565b82106113275760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109e2565b6008828154811061133a5761133a613911565b90600052602060002001549050919050565b600a546001600160a01b031633146113765760405162461bcd60e51b81526004016109e290613728565b6001600160a01b0382166113c15760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b60448201526064016109e2565b601080546113ce9061388f565b151590506113ee5760405162461bcd60e51b81526004016109e2906137ae565b80516114375760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b60448201526064016109e2565b6003815110156114595760405162461bcd60e51b81526004016109e29061368e565b600061146482611d34565b9050600061147182611e97565b905060018111156114c25760018111156114c25760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b60448201526064016109e2565b8061150e5760006114da8360108054610dc09061388f565b905080600019141561150c578260106040516020016114fa929190613579565b60405160208183030381529060405292505b505b600082604051602001611521919061352e565b6040516020818303038152906040528051906020012060001c905061154581611c9d565b1561158a5760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b60448201526064016109e2565b610efd8582612069565b60008151600014156115a557600080fd5b816040516020016115b6919061352e565b60408051601f19818403018152919052805160209091012092915050565b600a546001600160a01b031633146115fe5760405162461bcd60e51b81526004016109e290613728565b805161161190600f90602084019061300e565b5050565b6000818152600260205260408120546001600160a01b0316806108e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e2565b600a546001600160a01b031633146116b65760405162461bcd60e51b81526004016109e290613728565b6111398161245b565b60006001600160a01b03821661172a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e2565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117705760405162461bcd60e51b81526004016109e290613728565b6111046000612466565b600061178582611c9d565b61178e57600080fd5b6000828152600c602052604090206108e2906124b8565b60006108e2600b836124c2565b6060601080546108f79061388f565b600a546001600160a01b031633146117eb5760405162461bcd60e51b81526004016109e290613728565b601255565b6060600180546108f79061388f565b8161180933610fbe565b61181257600080fd5b61182d84848460405180602001604052806000815250612545565b50505050565b6001600160a01b03821633141561188c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e2565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b8061190233610fbe565b61190b57600080fd5b610b1861191783611615565b84846121f2565b600a546001600160a01b031633146119485760405162461bcd60e51b81526004016109e290613728565b805161161190601090602084019061300e565b6000818152600e60205260408120546001600160a01b0316806108e257600080fd5b611987338361210c565b6119a35760405162461bcd60e51b81526004016109e29061375d565b61182d84848484612712565b816119b933610fbe565b6119c257600080fd5b610b188383612745565b816119d633610fbe565b6119df57600080fd5b610b1883836127b0565b60006112a9601354610cb960125490565b6060611a0582611c9d565b611a695760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e2565b6000828152600d602052604081208054611a829061388f565b80601f0160208091040260200160405190810160405280929190818152602001828054611aae9061388f565b8015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b505050505090506000611b0c61289d565b9050805160001415611b1f575092915050565b815115611b51578082604051602001611b3992919061354a565b60405160208183030381529060405292505050919050565b8084604051602001611b399291906135ca565b600a546001600160a01b03163314611b8e5760405162461bcd60e51b81526004016109e290613728565b6001600160a01b038116611bf35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e2565b61113981612466565b611c0682826124c2565b15611c535760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064016109e2565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b14806108e257506108e2826128ac565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cef82611615565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611019828461382d565b606060008290506000815167ffffffffffffffff811115611d5757611d57613927565b6040519080825280601f01601f191660200182016040528015611d81576020820181803683370190505b50905060005b8251811015611e8f576041838281518110611da457611da4613911565b016020015160f81c10801590611dd45750605a838281518110611dc957611dc9613911565b016020015160f81c11155b15611e3657828181518110611deb57611deb613911565b602001015160f81c60f81b60f81c6020611e059190613808565b60f81b828281518110611e1a57611e1a613911565b60200101906001600160f81b031916908160001a905350611e7d565b828181518110611e4857611e48613911565b602001015160f81c60f81b828281518110611e6557611e65613911565b60200101906001600160f81b031916908160001a9053505b80611e87816138ca565b915050611d87565b509392505050565b805160009060018381019184010182805b82841015611eed57835160ff16602e811415611ecc57611ec96001846137f0565b92505b611ed76001866137f0565b9450508080611ee5906138ca565b915050611ea8565b50949350505050565b81516000908390839060011180611f0e575060018151105b80611f1a575081518151115b15611f2b57600019925050506108e2565b6fffffffffffffffffffffffffffffffff82511115611f5057600019925050506108e2565b6000805b835181101561205b5782600081518110611f7057611f70613911565b602001015160f81c60f81b6001600160f81b031916848281518110611f9757611f97613911565b01602001516001600160f81b031916141561204957600191505b825182108015611fca57508351611fc883836137f0565b105b801561201e5750828281518110611fe357611fe3613911565b01602001516001600160f81b03191684611ffd84846137f0565b8151811061200d5761200d613911565b01602001516001600160f81b031916145b15612035578161202d816138ca565b925050611fb1565b82518214156120495793506108e292505050565b80612053816138ca565b915050611f54565b5060001993505050506108e2565b6116118282604051806020016040528060008152506128fc565b61208c82611c9d565b6120ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e2565b6000828152600d602090815260409091208251610b189284019061300e565b600061211782611c9d565b6121785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e2565b600061218383611615565b9050806001600160a01b0316846001600160a01b031614806121be5750836001600160a01b03166121b38461097a565b6001600160a01b0316145b8061129057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611290565b826001600160a01b031661220582611615565b6001600160a01b03161461226d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e2565b6001600160a01b0382166122cf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e2565b6122da83838361292f565b6122e5600082611cba565b6001600160a01b038316600090815260036020526040812080546001929061230e90849061384c565b90915550506001600160a01b038216600090815260036020526040812080546001929061233c9084906137f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611019838361293a565b611139600b82611bfc565b60006123bf82611615565b90506123cd8160008461292f565b6123d8600083611cba565b6001600160a01b038116600090815260036020526040812080546001929061240190849061384c565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611139600b82612964565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006108e2825490565b60006001600160a01b0382166125255760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b60648201526084016109e2565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03841661255857600080fd5b815161256357600080fd5b61256c82611e97565b1561257657600080fd5b61257f83611c9d565b61258857600080fd5b600061259383611d34565b9050600081600d60008781526020019081526020016000206040516020016125bc9291906135a0565b604051602081830303815290604052905060006125d882611594565b90506000612680600d600089815260200190815260200160002080546125fd9061388f565b80601f01602080910402602001604051908101604052809291908181526020018280546126299061388f565b80156126765780601f1061264b57610100808354040283529160200191612676565b820191906000526020600020905b81548152906001019060200180831161265957829003601f168201915b5050505050611e97565b905080600114156126a5576000878152600c602052604090206126a390836129e6565b505b8451156126bc576126b78883876128fc565b6126c6565b6126c68883612069565b6126d08284612083565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516127009190613629565b60405180910390a25050505050505050565b61271d8484846121f2565b612729848484846129f2565b61182d5760405162461bcd60e51b81526004016109e29061363c565b61274e82611c9d565b61275757600080fd5b6000828152600e602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917fcbae0978f0621ebb4707a96540f8d3a937104526ceef2cdf1cf07b25c5e48cd49190a35050565b60006127bb82611d34565b9050600081600d60008681526020019081526020016000206040516020016127e49291906135a0565b6040516020818303038152906040529050600061280082611594565b6000868152600c6020526040902090915061281b9082612aff565b506000858152600e60205260409020546001600160a01b031615612856576000858152600e6020526040902080546001600160a01b03191690555b6000818152600d60205260409020805461286f9061388f565b15905061288d576000818152600d6020526040812061288d91612fd4565b612896816123b4565b5050505050565b6060600f80546108f79061388f565b60006001600160e01b031982166380ac58cd60e01b14806128dd57506001600160e01b03198216635b5e139f60e01b145b806108e257506301ffc9a760e01b6001600160e01b03198316146108e2565b6129068383612b0b565b61291360008484846129f2565b610b185760405162461bcd60e51b81526004016109e29061363c565b610b18838383612c4a565b600082600001828154811061295157612951613911565b9060005260206000200154905092915050565b61296e82826124c2565b6129c45760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b60648201526084016109e2565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006110198383612d02565b60006001600160a01b0384163b15612af457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a369033908990889088906004016135ec565b602060405180830381600087803b158015612a5057600080fd5b505af1925050508015612a80575060408051601f3d908101601f19168201909252612a7d91810190613387565b60015b612ada573d808015612aae576040519150601f19603f3d011682016040523d82523d6000602084013e612ab3565b606091505b508051612ad25760405162461bcd60e51b81526004016109e29061363c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611290565b506001949350505050565b60006110198383612d51565b6001600160a01b038216612b615760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e2565b612b6a81611c9d565b15612bb75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e2565b612bc36000838361292f565b6001600160a01b0382166000908152600360205260408120805460019290612bec9084906137f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612ca557612ca081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612cc8565b816001600160a01b0316836001600160a01b031614612cc857612cc88382612e44565b6001600160a01b038216612cdf57610b1881612ee1565b826001600160a01b0316826001600160a01b031614610b1857610b188282612f90565b6000818152600183016020526040812054612d49575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108e2565b5060006108e2565b60008181526001830160205260408120548015612e3a576000612d7560018361384c565b8554909150600090612d899060019061384c565b9050818114612dee576000866000018281548110612da957612da9613911565b9060005260206000200154905080876000018481548110612dcc57612dcc613911565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612dff57612dff6138fb565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108e2565b60009150506108e2565b60006001612e51846116bf565b612e5b919061384c565b600083815260076020526040902054909150808214612eae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612ef39060019061384c565b60008381526009602052604081205460088054939450909284908110612f1b57612f1b613911565b906000526020600020015490508060088381548110612f3c57612f3c613911565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612f7457612f746138fb565b6001900381819060005260206000200160009055905550505050565b6000612f9b836116bf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054612fe09061388f565b6000825580601f10612ff0575050565b601f0160209004906000526020600020908101906111399190613092565b82805461301a9061388f565b90600052602060002090601f01602090048101928261303c5760008555613082565b82601f1061305557805160ff1916838001178555613082565b82800160010185558215613082579182015b82811115613082578251825591602001919060010190613067565b5061308e929150613092565b5090565b5b8082111561308e5760008155600101613093565b600067ffffffffffffffff808411156130c2576130c2613927565b604051601f8501601f19908116603f011681019082821181831017156130ea576130ea613927565b8160405280935085815286868601111561310357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461313457600080fd5b919050565b600082601f83011261314a57600080fd5b611019838335602085016130a7565b60006020828403121561316b57600080fd5b6110198261311d565b6000806040838503121561318757600080fd5b6131908361311d565b915061319e6020840161311d565b90509250929050565b6000806000606084860312156131bc57600080fd5b6131c58461311d565b92506131d36020850161311d565b9150604084013590509250925092565b600080600080608085870312156131f957600080fd5b6132028561311d565b93506132106020860161311d565b925060408501359150606085013567ffffffffffffffff81111561323357600080fd5b8501601f8101871361324457600080fd5b613253878235602084016130a7565b91505092959194509250565b6000806040838503121561327257600080fd5b61327b8361311d565b91506020830135801515811461329057600080fd5b809150509250929050565b600080604083850312156132ae57600080fd5b6132b78361311d565b9150602083013567ffffffffffffffff8111156132d357600080fd5b6132df85828601613139565b9150509250929050565b600080604083850312156132fc57600080fd5b6133058361311d565b946020939093013593505050565b60008060006060848603121561332857600080fd5b6133318461311d565b925060208401359150604084013567ffffffffffffffff81111561335457600080fd5b61336086828701613139565b9150509250925092565b60006020828403121561337c57600080fd5b81356110198161393d565b60006020828403121561339957600080fd5b81516110198161393d565b6000602082840312156133b657600080fd5b813567ffffffffffffffff8111156133cd57600080fd5b61129084828501613139565b6000602082840312156133eb57600080fd5b5035919050565b6000806040838503121561340557600080fd5b8235915061319e6020840161311d565b6000806040838503121561342857600080fd5b82359150602083013567ffffffffffffffff8111156132d357600080fd5b6000806040838503121561345957600080fd5b50508035926020909101359150565b60008151808452613480816020860160208601613863565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806134ae57607f831692505b60208084108214156134d057634e487b7160e01b600052602260045260246000fd5b8180156134e457600181146134f557613522565b60ff19861689528489019650613522565b60008881526020902060005b8681101561351a5781548b820152908501908301613501565b505084890196505b50505050505092915050565b60008251613540818460208701613863565b9190910192915050565b6000835161355c818460208801613863565b835190830190613570818360208801613863565b01949350505050565b6000835161358b818460208801613863565b61359781840185613494565b95945050505050565b600083516135b2818460208801613863565b601760f91b9083019081526135976001820185613494565b600083516135dc818460208801613863565b9190910191825250602001919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061361f90830184613468565b9695505050505050565b6020815260006110196020830184613468565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f446f6d61696e207265717569726573206174206c656173742033206368617261604082015264637465727360d81b606082015260800190565b60208082526035908201527f496e73756666696369656e7420546f6b656e206f7220546f6b656e2076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f546f70206c6576656c20646f6d61696e206d757374206265206e6f6e2d656d70604082015261747960f01b606082015260800190565b60008219821115613803576138036138e5565b500190565b600060ff821660ff84168060ff03821115613825576138256138e5565b019392505050565b6000816000190483118215151615613847576138476138e5565b500290565b60008282101561385e5761385e6138e5565b500390565b60005b8381101561387e578181015183820152602001613866565b8381111561182d5750506000910152565b600181811c908216806138a357607f821691505b602082108114156138c457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138de576138de6138e5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461113957600080fdfea26469706673582212207513065d88b1b511ad0fc657a5f8a5a8d4eded1c1390f063ba59950f8942ebe764736f6c63430008070033
Deployed Bytecode Sourcemap
69744:10328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79907:162;;;;;;;;;;-1:-1:-1;79907:162:0;;;;;:::i;:::-;;:::i;:::-;;;10042:14:1;;10035:22;10017:41;;10005:2;9990:18;79907:162:0;;;;;;;;33689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35248:221::-;;;;;;;;;;-1:-1:-1;35248:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9340:32:1;;;9322:51;;9310:2;9295:18;35248:221:0;9176:203:1;34771:411:0;;;;;;;;;;-1:-1:-1;34771:411:0;;;;;:::i;:::-;;:::i;:::-;;70188:45;;;;;;;;;;-1:-1:-1;70188:45:0;;;;;:::i;:::-;;:::i;46143:113::-;;;;;;;;;;-1:-1:-1;46231:10:0;:17;46143:113;;;22624:25:1;;;22612:2;22597:18;46143:113:0;22478:177:1;73045:1435:0;;;;;;:::i;:::-;;:::i;71699:90::-;;;;;;;;;;;;;:::i;71364:151::-;;;;;;;;;;-1:-1:-1;71364:151:0;;;;;:::i;:::-;;:::i;36138:339::-;;;;;;;;;;-1:-1:-1;36138:339:0;;;;;:::i;:::-;;:::i;77402:197::-;;;;;;;;;;-1:-1:-1;77402:197:0;;;;;:::i;:::-;;:::i;45811:256::-;;;;;;;;;;-1:-1:-1;45811:256:0;;;;;:::i;:::-;;:::i;71168:92::-;;;;;;;;;;-1:-1:-1;71241:11:0;;71168:92;;77608:122;;;:::i;53962:97::-;;;;;;;;;;-1:-1:-1;53962:97:0;;;;;:::i;:::-;;:::i;36548:185::-;;;;;;;;;;-1:-1:-1;36548:185:0;;;;;:::i;:::-;;:::i;75682:411::-;;;;;;;;;;-1:-1:-1;75682:411:0;;;;;:::i;:::-;;:::i;76103:152::-;;;;;;;;;;-1:-1:-1;76103:152:0;;;;;:::i;:::-;;:::i;72798:241::-;;;;;;;;;;-1:-1:-1;72798:241:0;;;;;:::i;:::-;;:::i;70964:108::-;;;;;;;;;;;;;:::i;76413:104::-;;;;;;;;;;-1:-1:-1;76413:104:0;;;;;:::i;:::-;;:::i;46333:233::-;;;;;;;;;;-1:-1:-1;46333:233:0;;;;;:::i;:::-;;:::i;74485:993::-;;;;;;;;;;-1:-1:-1;74485:993:0;;;;;:::i;:::-;;:::i;77041:185::-;;;;;;;;;;-1:-1:-1;77041:185:0;;;;;:::i;:::-;;:::i;71911:96::-;;;;;;;;;;-1:-1:-1;71911:96:0;;;;;:::i;:::-;;:::i;70370:32::-;;;;;;;;;;-1:-1:-1;70370:32:0;;;;;;;;33383:239;;;;;;;;;;-1:-1:-1;33383:239:0;;;;;:::i;:::-;;:::i;54067:99::-;;;;;;;;;;-1:-1:-1;54067:99:0;;;;;:::i;:::-;;:::i;33113:208::-;;;;;;;;;;-1:-1:-1;33113:208:0;;;;;:::i;:::-;;:::i;24573:94::-;;;;;;;;;;;;;:::i;77233:163::-;;;;;;;;;;-1:-1:-1;77233:163:0;;;;;:::i;:::-;;:::i;54174:114::-;;;;;;;;;;-1:-1:-1;54174:114:0;;;;;:::i;:::-;;:::i;23922:87::-;;;;;;;;;;-1:-1:-1;23995:6:0;;-1:-1:-1;;;;;23995:6:0;23922:87;;71078:84;;;;;;;;;;;;;:::i;71521:83::-;;;;;;;;;;-1:-1:-1;71521:83:0;;;;;:::i;:::-;;:::i;33858:104::-;;;;;;;;;;;;;:::i;75487:188::-;;;;;;;;;;-1:-1:-1;75487:188:0;;;;;:::i;:::-;;:::i;70762:82::-;;;;;;;;;;-1:-1:-1;70830:6:0;;70762:82;;35541:295;;;;;;;;;;-1:-1:-1;35541:295:0;;;;;:::i;:::-;;:::i;76263:144::-;;;;;;;;;;-1:-1:-1;76263:144:0;;;;;:::i;:::-;;:::i;71610:83::-;;;;;;;;;;-1:-1:-1;71610:83:0;;;;;:::i;:::-;;:::i;76677:200::-;;;;;;;;;;-1:-1:-1;76677:200:0;;;;;:::i;:::-;;:::i;36804:328::-;;;;;;;;;;-1:-1:-1;36804:328:0;;;;;:::i;:::-;;:::i;76525:144::-;;;;;;;;;;-1:-1:-1;76525:144:0;;;;;:::i;:::-;;:::i;76889:::-;;;;;;;;;;-1:-1:-1;76889:144:0;;;;;:::i;:::-;;:::i;70850:108::-;;;;;;;;;;;;;:::i;72013:780::-;;;;;;;;;;-1:-1:-1;72013:780:0;;;;;:::i;:::-;;:::i;71266:92::-;;;;;;;;;;-1:-1:-1;71339:11:0;;71266:92;;35907:164;;;;;;;;;;-1:-1:-1;35907:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36028:25:0;;;36004:4;36028:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35907:164;24822:192;;;;;;;;;;-1:-1:-1;24822:192:0;;;;;:::i;:::-;;:::i;79907:162::-;80010:4;80028:36;80052:11;80028:23;:36::i;:::-;80021:43;79907:162;-1:-1:-1;;79907:162:0:o;33689:100::-;33743:13;33776:5;33769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33689:100;:::o;35248:221::-;35324:7;35352:16;35360:7;35352;:16::i;:::-;35344:73;;;;-1:-1:-1;;;35344:73:0;;17514:2:1;35344:73:0;;;17496:21:1;17553:2;17533:18;;;17526:30;17592:34;17572:18;;;17565:62;-1:-1:-1;;;17643:18:1;;;17636:42;17695:19;;35344:73:0;;;;;;;;;-1:-1:-1;35437:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35437:24:0;;35248:221::o;34771:411::-;34852:13;34868:23;34883:7;34868:14;:23::i;:::-;34852:39;;34916:5;-1:-1:-1;;;;;34910:11:0;:2;-1:-1:-1;;;;;34910:11:0;;;34902:57;;;;-1:-1:-1;;;34902:57:0;;20280:2:1;34902:57:0;;;20262:21:1;20319:2;20299:18;;;20292:30;20358:34;20338:18;;;20331:62;-1:-1:-1;;;20409:18:1;;;20402:31;20450:19;;34902:57:0;20078:397:1;34902:57:0;682:10;-1:-1:-1;;;;;34994:21:0;;;;:62;;-1:-1:-1;35019:37:0;35036:5;682:10;35907:164;:::i;35019:37::-;34972:168;;;;-1:-1:-1;;;34972:168:0;;15150:2:1;34972:168:0;;;15132:21:1;15189:2;15169:18;;;15162:30;15228:34;15208:18;;;15201:62;15299:26;15279:18;;;15272:54;15343:19;;34972:168:0;14948:420:1;34972:168:0;35153:21;35162:2;35166:7;35153:8;:21::i;:::-;34841:341;34771:411;;:::o;70188:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73045:1435::-;73119:13;;;;73111:52;;;;-1:-1:-1;;;73111:52:0;;15575:2:1;73111:52:0;;;15557:21:1;15614:2;15594:18;;;15587:30;15653:28;15633:18;;;15626:56;15699:18;;73111:52:0;15373:350:1;73111:52:0;73186:4;73180:18;;;;;:::i;:::-;:23;;;-1:-1:-1;73172:70:0;;;;-1:-1:-1;;;73172:70:0;;;;;;;:::i;:::-;73269:20;;73306:12;73298:49;;;;-1:-1:-1;;;73298:49:0;;12450:2:1;73298:49:0;;;12432:21:1;12489:2;12469:18;;;12462:30;-1:-1:-1;;;12508:18:1;;;12501:54;12572:18;;73298:49:0;12248:348:1;73298:49:0;73376:1;73365:7;:12;;73357:62;;;;-1:-1:-1;;;73357:62:0;;;;;;;:::i;:::-;73432:7;73443:1;73432:12;73428:139;;;73476:27;73491:11;;73476:10;70830:6;;;70762:82;73476:10;:14;;:27::i;:::-;73463:9;:40;;73455:106;;;;-1:-1:-1;;;73455:106:0;;;;;;;:::i;:::-;73579:7;73590:1;73579:12;73575:139;;;73623:27;73638:11;;73623:10;70830:6;;;70762:82;73623:27;73610:9;:40;;73602:106;;;;-1:-1:-1;;;73602:106:0;;;;;;;:::i;:::-;73737:1;73726:7;:12;73722:122;;70830:6;;73757:9;:23;;73749:89;;;;-1:-1:-1;;;73749:89:0;;;;;;;:::i;:::-;73852:21;73876:26;73895:6;73876:18;:26::i;:::-;73852:50;;73911:13;73927:28;73947:7;73927:19;:28::i;:::-;73911:44;;73976:1;73968:5;:9;73964:72;;;74005:1;73996:5;:10;;73988:41;;;;-1:-1:-1;;;73988:41:0;;13209:2:1;73988:41:0;;;13191:21:1;13248:2;13228:18;;;13221:30;-1:-1:-1;;;13267:18:1;;;13260:48;13325:18;;73988:41:0;13007:342:1;73988:41:0;74048:10;74044:170;;74069:9;74081:33;74100:7;74109:4;74081:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:33::i;:::-;74069:45;;74129:5;-1:-1:-1;;74129:11:0;74125:84;;;74187:7;74196:4;74170:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74153:49;;74125:84;74063:151;74044:170;74222:15;74275:7;74258:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;74248:36;;;;;;74240:45;;74222:63;;74304:16;74312:7;74304;:16::i;:::-;74303:17;74294:52;;;;-1:-1:-1;;;74294:52:0;;19930:2:1;74294:52:0;;;19912:21:1;19969:2;19949:18;;;19942:30;-1:-1:-1;;;19988:18:1;;;19981:51;20049:18;;74294:52:0;19728:345:1;74294:52:0;74357:30;74367:10;74379:7;74357:9;:30::i;:::-;74400;74413:7;74422;74400:12;:30::i;:::-;74455:7;74448:24;74464:7;74448:24;;;;;;:::i;:::-;;;;;;;;73106:1374;;;;73045:1435;:::o;71699:90::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;71768:13:::1;::::0;;-1:-1:-1;;71751:30:0;::::1;71768:13;::::0;;::::1;71767:14;71751:30;::::0;;71699:90::o;71364:151::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;71452:11:::1;:25:::0;;;;71482:11:::1;:25:::0;71364:151::o;36138:339::-;36333:41;682:10;36352:12;36366:7;36333:18;:41::i;:::-;36325:103;;;;-1:-1:-1;;;36325:103:0;;;;;;;:::i;:::-;36441:28;36451:4;36457:2;36461:7;36441:9;:28::i;77402:197::-;77482:7;77538:5;77511:24;77527:7;77511:15;:24::i;:::-;:32;77502:42;;;;;;77562:19;;;;:10;:19;;;;;:29;;77585:5;77562:22;:29::i;:::-;77555:36;77402:197;-1:-1:-1;;;77402:197:0:o;45811:256::-;45908:7;45944:23;45961:5;45944:16;:23::i;:::-;45936:5;:31;45928:87;;;;-1:-1:-1;;;45928:87:0;;10855:2:1;45928:87:0;;;10837:21:1;10894:2;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;-1:-1:-1;;;10984:18:1;;;10977:41;11035:19;;45928:87:0;10653:407:1;45928:87:0;-1:-1:-1;;;;;;46033:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;45811:256::o;77608:122::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;77674:47:::1;::::0;77682:10:::1;::::0;77699:21:::1;77674:47:::0;::::1;;;::::0;::::1;::::0;;;77699:21;77682:10;77674:47;::::1;;;;;;77666:56;;;::::0;::::1;;77608:122::o:0;53962:97::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;54032:19:::1;54043:7;54032:10;:19::i;:::-;53962:97:::0;:::o;36548:185::-;36686:39;36703:4;36709:2;36713:7;36686:39;;;;;;;;;;;;:16;:39::i;75682:411::-;75747:41;682:10;75766:12;602:98;75747:41;75739:102;;;;-1:-1:-1;;;75739:102:0;;22263:2:1;75739:102:0;;;22245:21:1;22302:2;22282:18;;;22275:30;22341:34;22321:18;;;22314:62;-1:-1:-1;;;22392:18:1;;;22385:46;22448:19;;75739:102:0;22061:412:1;75739:102:0;75860:19;;;;:10;:19;;;;;75854:33;;;;;:::i;:::-;:38;;-1:-1:-1;75850:97:0;;75916:19;;;;:10;:19;;;;;75909:26;;;:::i;:::-;75995:1;75959:24;;;:15;:24;;;;;;-1:-1:-1;;;;;75959:24:0;:38;75955:102;;76021:24;;;;:15;:24;;;;;76014:31;;-1:-1:-1;;;;;;76014:31:0;;;75955:102;76071:14;76077:7;76071:5;:14::i;76103:152::-;76186:4;76211:36;76230:7;76239;76211:18;:36::i;72798:241::-;72861:7;72876:21;72900:26;72919:6;72900:18;:26::i;:::-;72876:50;;72934:15;72987:7;72970:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;72960:36;;;;;;72952:45;;72934:63;;73015:16;73023:7;73015;:16::i;:::-;73008:23;72798:241;-1:-1:-1;;;;72798:241:0:o;70964:108::-;71010:7;71037:27;71052:11;;71037:10;70830:6;;;70762:82;71037:27;71030:34;;70964:108;:::o;76413:104::-;76469:4;76493:16;76501:7;76493;:16::i;46333:233::-;46408:7;46444:30;46231:10;:17;;46143:113;46444:30;46436:5;:38;46428:95;;;;-1:-1:-1;;;46428:95:0;;21100:2:1;46428:95:0;;;21082:21:1;21139:2;21119:18;;;21112:30;21178:34;21158:18;;;21151:62;-1:-1:-1;;;21229:18:1;;;21222:42;21281:19;;46428:95:0;20898:408:1;46428:95:0;46541:10;46552:5;46541:17;;;;;;;;:::i;:::-;;;;;;;;;46534:24;;46333:233;;;:::o;74485:993::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74575:16:0;::::1;74567:47;;;::::0;-1:-1:-1;;;74567:47:0;;21916:2:1;74567:47:0::1;::::0;::::1;21898:21:1::0;21955:2;21935:18;;;21928:30;-1:-1:-1;;;21974:18:1;;;21967:48;22032:18;;74567:47:0::1;21714:342:1::0;74567:47:0::1;74637:4;74631:18;;;;;:::i;:::-;:23:::0;::::1;::::0;-1:-1:-1;74623:70:0::1;;;;-1:-1:-1::0;;;74623:70:0::1;;;;;;;:::i;:::-;74710:20:::0;;74702:62:::1;;;::::0;-1:-1:-1;;;74702:62:0;;12450:2:1;74702:62:0::1;::::0;::::1;12432:21:1::0;12489:2;12469:18;;;12462:30;-1:-1:-1;;;12508:18:1;;;12501:54;12572:18;;74702:62:0::1;12248:348:1::0;74702:62:0::1;74806:1;74788:6;74782:20;:25;;74774:75;;;;-1:-1:-1::0;;;74774:75:0::1;;;;;;;:::i;:::-;74857:21;74881:26;74900:6;74881:18;:26::i;:::-;74857:50;;74916:13;74932:28;74952:7;74932:19;:28::i;:::-;74916:44;;74981:1;74973:5;:9;74969:72;;;75010:1;75001:5;:10;;74993:41;;;::::0;-1:-1:-1;;;74993:41:0;;13209:2:1;74993:41:0::1;::::0;::::1;13191:21:1::0;13248:2;13228:18;;;13221:30;-1:-1:-1;;;13267:18:1;;;13260:48;13325:18;;74993:41:0::1;13007:342:1::0;74993:41:0::1;75053:10:::0;75049:170:::1;;75074:9;75086:33;75105:7;75114:4;75086:33;;;;;:::i;:::-;75074:45;;75134:5;-1:-1:-1::0;;75134:11:0::1;75130:84;;;75192:7;75201:4;75175:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75158:49;;75130:84;75068:151;75049:170;75225:15;75278:7;75261:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;75251:36;;;;;;75243:45;;75225:63;;75307:16;75315:7;75307;:16::i;:::-;75306:17;75297:52;;;::::0;-1:-1:-1;;;75297:52:0;;19930:2:1;75297:52:0::1;::::0;::::1;19912:21:1::0;19969:2;19949:18;;;19942:30;-1:-1:-1;;;19988:18:1;;;19981:51;20049:18;;75297:52:0::1;19728:345:1::0;75297:52:0::1;75363:22;75373:2;75377:7;75363:9;:22::i;77041:185::-:0;77102:7;77138:5;77132:19;77155:1;77132:24;;77123:34;;;;;;77210:5;77193:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77193:23:0;;;;;;;;;77183:34;;77193:23;77183:34;;;;;77041:185;-1:-1:-1;;77041:185:0:o;71911:96::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;71981:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;71911:96:::0;:::o;33383:239::-;33455:7;33491:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33491:16:0;33526:19;33518:73;;;;-1:-1:-1;;;33518:73:0;;16341:2:1;33518:73:0;;;16323:21:1;16380:2;16360:18;;;16353:30;16419:34;16399:18;;;16392:62;-1:-1:-1;;;16470:18:1;;;16463:39;16519:19;;33518:73:0;16139:405:1;54067:99:0;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;54138:20:::1;54150:7;54138:11;:20::i;33113:208::-:0;33185:7;-1:-1:-1;;;;;33213:19:0;;33205:74;;;;-1:-1:-1;;;33205:74:0;;15930:2:1;33205:74:0;;;15912:21:1;15969:2;15949:18;;;15942:30;16008:34;15988:18;;;15981:62;-1:-1:-1;;;16059:18:1;;;16052:40;16109:19;;33205:74:0;15728:406:1;33205:74:0;-1:-1:-1;;;;;;33297:16:0;;;;;:9;:16;;;;;;;33113:208::o;24573:94::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;24638:21:::1;24656:1;24638:9;:21::i;77233:163::-:0;77296:7;77325:16;77333:7;77325;:16::i;:::-;77316:26;;;;;;77360:19;;;;:10;:19;;;;;:28;;:26;:28::i;54174:114::-;54229:4;54251:29;:16;54272:7;54251:20;:29::i;71078:84::-;71117:13;71150:4;71143:11;;;;;:::i;71521:83::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;71582:6:::1;:14:::0;71521:83::o;33858:104::-;33914:13;33947:7;33940:14;;;;;:::i;75487:188::-;75601:7;70606:41;682:10;70625:12;602:98;70606:41;70584:74;;;;;;75627:40:::1;75646:2;75650:7;75659:3;75627:40;;;;;;;;;;;::::0;:18:::1;:40::i;:::-;75487:188:::0;;;;:::o;35541:295::-;-1:-1:-1;;;;;35644:24:0;;682:10;35644:24;;35636:62;;;;-1:-1:-1;;;35636:62:0;;14383:2:1;35636:62:0;;;14365:21:1;14422:2;14402:18;;;14395:30;14461:27;14441:18;;;14434:55;14506:18;;35636:62:0;14181:349:1;35636:62:0;682:10;35711:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;35711:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;35711:53:0;;;;;;;;;;35780:48;;10017:41:1;;;35711:42:0;;682:10;35780:48;;9990:18:1;35780:48:0;;;;;;;35541:295;;:::o;76263:144::-;76339:7;70606:41;682:10;70625:12;602:98;70606:41;70584:74;;;;;;76359:40:::1;76369:16;76377:7;76369;:16::i;:::-;76387:2;76391:7;76359:9;:40::i;71610:83::-:0;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;71674:11;;::::1;::::0;:4:::1;::::0;:11:::1;::::0;::::1;::::0;::::1;:::i;76677:200::-:0;76737:7;76776:24;;;:15;:24;;;;;;-1:-1:-1;;;;;76776:24:0;76820:22;76811:32;;;;;36804:328;36979:41;682:10;37012:7;36979:18;:41::i;:::-;36971:103;;;;-1:-1:-1;;;36971:103:0;;;;;;;:::i;:::-;37085:39;37099:4;37105:2;37109:7;37118:5;37085:13;:39::i;76525:144::-;76610:7;70606:41;682:10;70625:12;602:98;70606:41;70584:74;;;;;;76630:31:::1;76643:7;76652:8;76630:12;:31::i;76889:144::-:0;76977:7;70606:41;682:10;70625:12;602:98;70606:41;70584:74;;;;;;76997:28:::1;77012:7;77021:3;76997:14;:28::i;70850:108::-:0;70896:7;70923:27;70938:11;;70923:10;70830:6;;;70762:82;72013:780;72078:13;72112:16;72120:7;72112;:16::i;:::-;72104:76;;;;-1:-1:-1;;;72104:76:0;;19514:2:1;72104:76:0;;;19496:21:1;19553:2;19533:18;;;19526:30;19592:34;19572:18;;;19565:62;-1:-1:-1;;;19643:18:1;;;19636:45;19698:19;;72104:76:0;19312:411:1;72104:76:0;72193:23;72219:19;;;:10;:19;;;;;72193:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72304:21;72328:10;:8;:10::i;:::-;72304:34;;72359:7;72353:21;72378:1;72353:26;72349:75;;;-1:-1:-1;72403:9:0;72013:780;-1:-1:-1;;72013:780:0:o;72349:75::-;72528:23;;:27;72524:111;;72603:7;72612:9;72586:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72572:51;;;;72013:780;;;:::o;72524:111::-;72767:7;72776;72750:34;;;;;;;;;:::i;24822:192::-;23995:6;;-1:-1:-1;;;;;23995:6:0;682:10;24142:23;24134:68;;;;-1:-1:-1;;;24134:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24911:22:0;::::1;24903:73;;;::::0;-1:-1:-1;;;24903:73:0;;11686:2:1;24903:73:0::1;::::0;::::1;11668:21:1::0;11725:2;11705:18;;;11698:30;11764:34;11744:18;;;11737:62;-1:-1:-1;;;11815:18:1;;;11808:36;11861:19;;24903:73:0::1;11484:402:1::0;24903:73:0::1;24987:19;24997:8;24987:9;:19::i;52702:178::-:0;52780:18;52784:4;52790:7;52780:3;:18::i;:::-;52779:19;52771:63;;;;-1:-1:-1;;;52771:63:0;;10495:2:1;52771:63:0;;;10477:21:1;10534:2;10514:18;;;10507:30;10573:33;10553:18;;;10546:61;10624:18;;52771:63:0;10293:355:1;52771:63:0;-1:-1:-1;;;;;52845:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;52845:27:0;52868:4;52845:27;;;52702:178::o;45503:224::-;45605:4;-1:-1:-1;;;;;;45629:50:0;;-1:-1:-1;;;45629:50:0;;:90;;;45683:36;45707:11;45683:23;:36::i;38642:127::-;38707:4;38731:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38731:16:0;:30;;;38642:127::o;42624:174::-;42699:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42699:29:0;-1:-1:-1;;;;;42699:29:0;;;;;;;;:24;;42753:23;42699:24;42753:14;:23::i;:::-;-1:-1:-1;;;;;42744:46:0;;;;;;;;;;;42624:174;;:::o;6480:98::-;6538:7;6565:5;6569:1;6565;:5;:::i;55236:566::-;55295:13;55321:17;55347:3;55321:30;;55362:19;55394:4;:11;55384:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55384:22:0;;55362:44;;55422:6;55417:346;55438:4;:11;55434:1;:15;55417:346;;;55533:2;55521:4;55526:1;55521:7;;;;;;;;:::i;:::-;;;;;;;55515:20;;;;55514:48;;;55559:2;55547:4;55552:1;55547:7;;;;;;;;:::i;:::-;;;;;;;55541:20;;55514:48;55510:242;;;55662:4;55667:1;55662:7;;;;;;;;:::i;:::-;;;;;;;;;55656:14;;55673:2;55656:19;;;;:::i;:::-;55649:27;;55637:6;55644:1;55637:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;55637:39:0;;;;;;;;;55510:242;;;55729:4;55734:1;55729:7;;;;;;;;:::i;:::-;;;;;;;;;55717:6;55724:1;55717:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;55717:19:0;;;;;;;;;55510:242;55451:3;;;;:::i;:::-;;;;55417:346;;;-1:-1:-1;55787:6:0;55236:566;-1:-1:-1;;;55236:566:0:o;54613:617::-;54911:8;;54671:4;;54884:1;54877:9;;;;54907:18;;;54671:4;;54992:210;55008:3;55002;:9;54992:210;;;55077:10;;55089:4;55073:21;55119:4;55114:9;;55110:58;;;55144:8;55151:1;55144:8;;:::i;:::-;;;55110:58;55182:8;55189:1;55182:8;;:::i;:::-;;;55020:182;55013:5;;;;;:::i;:::-;;;;54992:210;;;-1:-1:-1;55219:3:0;54613:617;-1:-1:-1;;;;54613:617:0:o;57006:999::-;57195:8;;57094:3;;57135:9;;57176:7;;57206:1;-1:-1:-1;57195:12:0;:28;;;57222:1;57211;:8;:12;57195:28;:53;;;;57239:1;:8;57228:1;:8;:19;57195:53;57192:805;;;-1:-1:-1;;57258:9:0;;;;;;57192:805;57295:9;57283:1;:8;:22;57280:717;;;-1:-1:-1;;57470:9:0;;;;;;57280:717;57516:13;57547:6;57542:429;57563:1;:8;57559:1;:12;57542:429;;;57608:1;57610;57608:4;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;57600:12:0;;:1;57602;57600:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;57600:4:0;:12;57596:366;;;57673:1;57662:12;;57685:207;57702:1;:8;57691;:19;:48;;;;-1:-1:-1;57731:8:0;;57715:12;57719:8;57715:1;:12;:::i;:::-;57714:25;57691:48;:82;;;;;57762:1;57764:8;57762:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;57762:11:0;57743:1;57745:12;57749:8;57745:1;:12;:::i;:::-;57743:15;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;57743:15:0;:30;57691:82;57685:207;;;57870:10;;;;:::i;:::-;;;;57685:207;;;57918:1;:8;57906;:20;57903:48;;;57949:1;-1:-1:-1;57938:13:0;;-1:-1:-1;;;57938:13:0;57903:48;57573:4;;;;:::i;:::-;;;;57542:429;;;;-1:-1:-1;;57979:9:0;;;;;;;39626:110;39702:26;39712:2;39716:7;39702:26;;;;;;;;;;;;:9;:26::i;79509:215::-;79609:16;79617:7;79609;:16::i;:::-;79601:73;;;;-1:-1:-1;;;79601:73:0;;17927:2:1;79601:73:0;;;17909:21:1;17966:2;17946:18;;;17939:30;18005:34;17985:18;;;17978:62;-1:-1:-1;;;18056:18:1;;;18049:42;18108:19;;79601:73:0;17725:408:1;79601:73:0;79685:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;38936:348::-;39029:4;39054:16;39062:7;39054;:16::i;:::-;39046:73;;;;-1:-1:-1;;;39046:73:0;;14737:2:1;39046:73:0;;;14719:21:1;14776:2;14756:18;;;14749:30;14815:34;14795:18;;;14788:62;-1:-1:-1;;;14866:18:1;;;14859:42;14918:19;;39046:73:0;14535:408:1;39046:73:0;39130:13;39146:23;39161:7;39146:14;:23::i;:::-;39130:39;;39199:5;-1:-1:-1;;;;;39188:16:0;:7;-1:-1:-1;;;;;39188:16:0;;:51;;;;39232:7;-1:-1:-1;;;;;39208:31:0;:20;39220:7;39208:11;:20::i;:::-;-1:-1:-1;;;;;39208:31:0;;39188:51;:87;;;-1:-1:-1;;;;;;36028:25:0;;;36004:4;36028:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39243:32;35907:164;41928:578;42087:4;-1:-1:-1;;;;;42060:31:0;:23;42075:7;42060:14;:23::i;:::-;-1:-1:-1;;;;;42060:31:0;;42052:85;;;;-1:-1:-1;;;42052:85:0;;19104:2:1;42052:85:0;;;19086:21:1;19143:2;19123:18;;;19116:30;19182:34;19162:18;;;19155:62;-1:-1:-1;;;19233:18:1;;;19226:39;19282:19;;42052:85:0;18902:405:1;42052:85:0;-1:-1:-1;;;;;42156:16:0;;42148:65;;;;-1:-1:-1;;;42148:65:0;;13978:2:1;42148:65:0;;;13960:21:1;14017:2;13997:18;;;13990:30;14056:34;14036:18;;;14029:62;-1:-1:-1;;;14107:18:1;;;14100:34;14151:19;;42148:65:0;13776:400:1;42148:65:0;42226:39;42247:4;42253:2;42257:7;42226:20;:39::i;:::-;42330:29;42347:1;42351:7;42330:8;:29::i;:::-;-1:-1:-1;;;;;42372:15:0;;;;;;:9;:15;;;;;:20;;42391:1;;42372:15;:20;;42391:1;;42372:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42403:13:0;;;;;;:9;:13;;;;;:18;;42420:1;;42403:13;:18;;42420:1;;42403:18;:::i;:::-;;;;-1:-1:-1;;42432:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42432:21:0;-1:-1:-1;;;;;42432:21:0;;;;;;;;;42471:27;;42432:16;;42471:27;;;;;;;41928:578;;;:::o;68760:137::-;68831:7;68866:22;68870:3;68882:5;68866:3;:22::i;54300:93::-;54356:29;:16;54377:7;54356:20;:29::i;41231:360::-;41291:13;41307:23;41322:7;41307:14;:23::i;:::-;41291:39;;41343:48;41364:5;41379:1;41383:7;41343:20;:48::i;:::-;41432:29;41449:1;41453:7;41432:8;:29::i;:::-;-1:-1:-1;;;;;41474:16:0;;;;;;:9;:16;;;;;:21;;41494:1;;41474:16;:21;;41494:1;;41474:21;:::i;:::-;;;;-1:-1:-1;;41513:16:0;;;;:7;:16;;;;;;41506:23;;-1:-1:-1;;;;;;41506:23:0;;;41547:36;41521:7;;41513:16;-1:-1:-1;;;;;41547:36:0;;;;;41513:16;;41547:36;41280:311;41231:360;:::o;54401:97::-;54458:32;:16;54482:7;54458:23;:32::i;25022:173::-;25097:6;;;-1:-1:-1;;;;;25114:17:0;;;-1:-1:-1;;;;;;25114:17:0;;;;;;;25147:40;;25097:6;;;25114:17;25097:6;;25147:40;;25078:16;;25147:40;25067:128;25022:173;:::o;68292:114::-;68352:7;68379:19;68387:3;61321:18;;61238:109;53238:203;53310:4;-1:-1:-1;;;;;53335:21:0;;53327:68;;;;-1:-1:-1;;;53327:68:0;;18701:2:1;53327:68:0;;;18683:21:1;18740:2;18720:18;;;18713:30;18779:34;18759:18;;;18752:62;-1:-1:-1;;;18830:18:1;;;18823:32;18872:19;;53327:68:0;18499:398:1;53327:68:0;-1:-1:-1;;;;;;53413:20:0;:11;:20;;;;;;;;;;;;;;;53238:203::o;77739:914::-;-1:-1:-1;;;;;77857:16:0;;77849:25;;;;;;77894:17;;77885:32;;;;;;77937:24;77957:3;77937:19;:24::i;:::-;:29;77928:39;;;;;;77987:16;77995:7;77987;:16::i;:::-;77978:26;;;;;;78013:18;78034:23;78053:3;78034:18;:23::i;:::-;78013:44;;78072:20;78112:4;78123:10;:19;78134:7;78123:19;;;;;;;;;;;78095:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78072:71;;78152:19;78174:27;78192:7;78174:10;:27::i;:::-;78152:49;;78214:13;78230:40;78250:10;:19;78261:7;78250:19;;;;;;;;;;;78230:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:40::i;:::-;78214:56;;78289:5;78298:1;78289:10;78285:83;;;78320:19;;;;:10;:19;;;;;:36;;78344:11;78320:23;:36::i;:::-;;78285:83;78384:19;;:24;78380:149;;78425:33;78435:2;78439:11;78452:5;78425:9;:33::i;:::-;78380:149;;;78491:26;78501:2;78505:11;78491:9;:26::i;:::-;78549:42;78562:11;78582:7;78549:12;:42::i;:::-;78616:11;78609:36;78636:7;78609:36;;;;;;:::i;:::-;;;;;;;;77844:809;;;;77739:914;;;;:::o;38014:315::-;38171:28;38181:4;38187:2;38191:7;38171:9;:28::i;:::-;38218:48;38241:4;38247:2;38251:7;38260:5;38218:22;:48::i;:::-;38210:111;;;;-1:-1:-1;;;38210:111:0;;;;;;;:::i;79300:203::-;79386:16;79394:7;79386;:16::i;:::-;79377:26;;;;;;79414:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;79414:35:0;-1:-1:-1;;;;;79414:35:0;;;;;;;;79465:30;;79414:35;;:24;;79465:30;;79414:24;79465:30;79300:203;;:::o;78661:631::-;78741:18;78762:23;78781:3;78762:18;:23::i;:::-;78741:44;;78800:20;78840:4;78851:10;:19;78862:7;78851:19;;;;;;;;;;;78823:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78800:71;;78880:19;78902:27;78920:7;78902:10;:27::i;:::-;78979:19;;;;:10;:19;;;;;78880:49;;-1:-1:-1;78979:39:0;;78880:49;78979:26;:39::i;:::-;-1:-1:-1;79071:1:0;79035:24;;;:15;:24;;;;;;-1:-1:-1;;;;;79035:24:0;:38;79031:102;;79097:24;;;;:15;:24;;;;;79090:31;;-1:-1:-1;;;;;;79090:31:0;;;79031:102;79151:23;;;;:10;:23;;;;;79145:37;;;;;:::i;:::-;:42;;-1:-1:-1;79141:105:0;;79211:23;;;;:10;:23;;;;;79204:30;;;:::i;:::-;79260:24;79272:11;79260;:24::i;:::-;78730:562;;;78661:631;;:::o;71795:104::-;71847:13;71880:11;71873:18;;;;;:::i;32744:305::-;32846:4;-1:-1:-1;;;;;;32883:40:0;;-1:-1:-1;;;32883:40:0;;:105;;-1:-1:-1;;;;;;;32940:48:0;;-1:-1:-1;;;32940:48:0;32883:105;:158;;;-1:-1:-1;;;;;;;;;;11520:40:0;;;33005:36;11411:157;39963:321;40093:18;40099:2;40103:7;40093:5;:18::i;:::-;40144:54;40175:1;40179:2;40183:7;40192:5;40144:22;:54::i;:::-;40122:154;;;;-1:-1:-1;;;40122:154:0;;;;;;;:::i;79730:172::-;79852:45;79879:4;79885:2;79889:7;79852:26;:45::i;61701:120::-;61768:7;61795:3;:11;;61807:5;61795:18;;;;;;;;:::i;:::-;;;;;;;;;61788:25;;61701:120;;;;:::o;52960:183::-;53040:18;53044:4;53050:7;53040:3;:18::i;:::-;53032:64;;;;-1:-1:-1;;;53032:64:0;;16751:2:1;53032:64:0;;;16733:21:1;16790:2;16770:18;;;16763:30;16829:34;16809:18;;;16802:62;-1:-1:-1;;;16880:18:1;;;16873:31;16921:19;;53032:64:0;16549:397:1;53032:64:0;-1:-1:-1;;;;;53107:20:0;53130:5;53107:20;;;;;;;;;;;:28;;-1:-1:-1;;53107:28:0;;;52960:183::o;67530:131::-;67597:4;67621:32;67626:3;67646:5;67621:4;:32::i;43363:799::-;43518:4;-1:-1:-1;;;;;43539:13:0;;15975:20;16023:8;43535:620;;43575:72;;-1:-1:-1;;;43575:72:0;;-1:-1:-1;;;;;43575:36:0;;;;;:72;;682:10;;43626:4;;43632:7;;43641:5;;43575:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43575:72:0;;;;;;;;-1:-1:-1;;43575:72:0;;;;;;;;;;;;:::i;:::-;;;43571:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43817:13:0;;43813:272;;43860:60;;-1:-1:-1;;;43860:60:0;;;;;;;:::i;43813:272::-;44035:6;44029:13;44020:6;44016:2;44012:15;44005:38;43571:529;-1:-1:-1;;;;;;43698:51:0;-1:-1:-1;;;43698:51:0;;-1:-1:-1;43691:58:0;;43535:620;-1:-1:-1;44139:4:0;43363:799;;;;;;:::o;67837:137::-;67907:4;67931:35;67939:3;67959:5;67931:7;:35::i;40620:382::-;-1:-1:-1;;;;;40700:16:0;;40692:61;;;;-1:-1:-1;;;40692:61:0;;17153:2:1;40692:61:0;;;17135:21:1;;;17172:18;;;17165:30;17231:34;17211:18;;;17204:62;17283:18;;40692:61:0;16951:356:1;40692:61:0;40773:16;40781:7;40773;:16::i;:::-;40772:17;40764:58;;;;-1:-1:-1;;;40764:58:0;;12093:2:1;40764:58:0;;;12075:21:1;12132:2;12112:18;;;12105:30;12171;12151:18;;;12144:58;12219:18;;40764:58:0;11891:352:1;40764:58:0;40835:45;40864:1;40868:2;40872:7;40835:20;:45::i;:::-;-1:-1:-1;;;;;40893:13:0;;;;;;:9;:13;;;;;:18;;40910:1;;40893:13;:18;;40910:1;;40893:18;:::i;:::-;;;;-1:-1:-1;;40922:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40922:21:0;-1:-1:-1;;;;;40922:21:0;;;;;;;;40961:33;;40922:16;;;40961:33;;40922:16;;40961:33;40620:382;;:::o;47179:589::-;-1:-1:-1;;;;;47385:18:0;;47381:187;;47420:40;47452:7;48595:10;:17;;48568:24;;;;:15;:24;;;;;:44;;;48623:24;;;;;;;;;;;;48491:164;47420:40;47381:187;;;47490:2;-1:-1:-1;;;;;47482:10:0;:4;-1:-1:-1;;;;;47482:10:0;;47478:90;;47509:47;47542:4;47548:7;47509:32;:47::i;:::-;-1:-1:-1;;;;;47582:16:0;;47578:183;;47615:45;47652:7;47615:36;:45::i;47578:183::-;47688:4;-1:-1:-1;;;;;47682:10:0;:2;-1:-1:-1;;;;;47682:10:0;;47678:83;;47709:40;47737:2;47741:7;47709:27;:40::i;58927:414::-;58990:4;61120:19;;;:12;;;:19;;;;;;59007:327;;-1:-1:-1;59050:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;59233:18;;59211:19;;;:12;;;:19;;;;;;:40;;;;59266:11;;59007:327;-1:-1:-1;59317:5:0;59310:12;;59517:1420;59583:4;59722:19;;;:12;;;:19;;;;;;59758:15;;59754:1176;;60133:21;60157:14;60170:1;60157:10;:14;:::i;:::-;60206:18;;60133:38;;-1:-1:-1;60186:17:0;;60206:22;;60227:1;;60206:22;:::i;:::-;60186:42;;60262:13;60249:9;:26;60245:405;;60296:17;60316:3;:11;;60328:9;60316:22;;;;;;;;:::i;:::-;;;;;;;;;60296:42;;60470:9;60441:3;:11;;60453:13;60441:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;60555:23;;;:12;;;:23;;;;;:36;;;60245:405;60731:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;60826:3;:12;;:19;60839:5;60826:19;;;;;;;;;;;60819:26;;;60869:4;60862:11;;;;;;;59754:1176;60913:5;60906:12;;;;;49282:988;49548:22;49598:1;49573:22;49590:4;49573:16;:22::i;:::-;:26;;;;:::i;:::-;49610:18;49631:26;;;:17;:26;;;;;;49548:51;;-1:-1:-1;49764:28:0;;;49760:328;;-1:-1:-1;;;;;49831:18:0;;49809:19;49831:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49882:30;;;;;;:44;;;49999:30;;:17;:30;;;;;:43;;;49760:328;-1:-1:-1;50184:26:0;;;;:17;:26;;;;;;;;50177:33;;;-1:-1:-1;;;;;50228:18:0;;;;;:12;:18;;;;;:34;;;;;;;50221:41;49282:988::o;50565:1079::-;50843:10;:17;50818:22;;50843:21;;50863:1;;50843:21;:::i;:::-;50875:18;50896:24;;;:15;:24;;;;;;51269:10;:26;;50818:46;;-1:-1:-1;50896:24:0;;50818:46;;51269:26;;;;;;:::i;:::-;;;;;;;;;51247:48;;51333:11;51308:10;51319;51308:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51413:28;;;:15;:28;;;;;;;:41;;;51585:24;;;;;51578:31;51620:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50636:1008;;;50565:1079;:::o;48069:221::-;48154:14;48171:20;48188:2;48171:16;:20::i;:::-;-1:-1:-1;;;;;48202:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48247:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48069:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;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:72;;;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:45;;;532:1;529;522:12;491:45;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;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:221::-;871:5;924:3;917:4;909:6;905:17;901:27;891:55;;942:1;939;932:12;891:55;964:79;1039:3;1030:6;1017:20;1010:4;1002:6;998:17;964:79;:::i;1054:186::-;1113:6;1166:2;1154:9;1145:7;1141:23;1137:32;1134:52;;;1182:1;1179;1172:12;1134:52;1205:29;1224:9;1205:29;:::i;1245:260::-;1313:6;1321;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;1413:29;1432:9;1413:29;:::i;:::-;1403:39;;1461:38;1495:2;1484:9;1480:18;1461:38;:::i;:::-;1451:48;;1245:260;;;;;:::o;1510:328::-;1587:6;1595;1603;1656:2;1644:9;1635:7;1631:23;1627:32;1624:52;;;1672:1;1669;1662:12;1624:52;1695:29;1714:9;1695:29;:::i;:::-;1685:39;;1743:38;1777:2;1766:9;1762:18;1743:38;:::i;:::-;1733:48;;1828:2;1817:9;1813:18;1800:32;1790:42;;1510:328;;;;;:::o;1843:666::-;1938:6;1946;1954;1962;2015:3;2003:9;1994:7;1990:23;1986:33;1983:53;;;2032:1;2029;2022:12;1983:53;2055:29;2074:9;2055:29;:::i;:::-;2045:39;;2103:38;2137:2;2126:9;2122:18;2103:38;:::i;:::-;2093:48;;2188:2;2177:9;2173:18;2160:32;2150:42;;2243:2;2232:9;2228:18;2215:32;2270:18;2262:6;2259:30;2256:50;;;2302:1;2299;2292:12;2256:50;2325:22;;2378:4;2370:13;;2366:27;-1:-1:-1;2356:55:1;;2407:1;2404;2397:12;2356:55;2430:73;2495:7;2490:2;2477:16;2472:2;2468;2464:11;2430:73;:::i;:::-;2420:83;;;1843:666;;;;;;;:::o;2514:347::-;2579:6;2587;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2679:29;2698:9;2679:29;:::i;:::-;2669:39;;2758:2;2747:9;2743:18;2730:32;2805:5;2798:13;2791:21;2784:5;2781:32;2771:60;;2827:1;2824;2817:12;2771:60;2850:5;2840:15;;;2514:347;;;;;:::o;2866:396::-;2944:6;2952;3005:2;2993:9;2984:7;2980:23;2976:32;2973:52;;;3021:1;3018;3011:12;2973:52;3044:29;3063:9;3044:29;:::i;:::-;3034:39;;3124:2;3113:9;3109:18;3096:32;3151:18;3143:6;3140:30;3137:50;;;3183:1;3180;3173:12;3137:50;3206;3248:7;3239:6;3228:9;3224:22;3206:50;:::i;:::-;3196:60;;;2866:396;;;;;:::o;3267:254::-;3335:6;3343;3396:2;3384:9;3375:7;3371:23;3367:32;3364:52;;;3412:1;3409;3402:12;3364:52;3435:29;3454:9;3435:29;:::i;:::-;3425:39;3511:2;3496:18;;;;3483:32;;-1:-1:-1;;;3267:254:1:o;3526:464::-;3613:6;3621;3629;3682:2;3670:9;3661:7;3657:23;3653:32;3650:52;;;3698:1;3695;3688:12;3650:52;3721:29;3740:9;3721:29;:::i;:::-;3711:39;;3797:2;3786:9;3782:18;3769:32;3759:42;;3852:2;3841:9;3837:18;3824:32;3879:18;3871:6;3868:30;3865:50;;;3911:1;3908;3901:12;3865:50;3934;3976:7;3967:6;3956:9;3952:22;3934:50;:::i;:::-;3924:60;;;3526:464;;;;;:::o;3995:245::-;4053:6;4106:2;4094:9;4085:7;4081:23;4077:32;4074:52;;;4122:1;4119;4112:12;4074:52;4161:9;4148:23;4180:30;4204:5;4180:30;:::i;4245:249::-;4314:6;4367:2;4355:9;4346:7;4342:23;4338:32;4335:52;;;4383:1;4380;4373:12;4335:52;4415:9;4409:16;4434:30;4458:5;4434:30;:::i;4499:322::-;4568:6;4621:2;4609:9;4600:7;4596:23;4592:32;4589:52;;;4637:1;4634;4627:12;4589:52;4677:9;4664:23;4710:18;4702:6;4699:30;4696:50;;;4742:1;4739;4732:12;4696:50;4765;4807:7;4798:6;4787:9;4783:22;4765:50;:::i;4826:180::-;4885:6;4938:2;4926:9;4917:7;4913:23;4909:32;4906:52;;;4954:1;4951;4944:12;4906:52;-1:-1:-1;4977:23:1;;4826:180;-1:-1:-1;4826:180:1:o;5011:254::-;5079:6;5087;5140:2;5128:9;5119:7;5115:23;5111:32;5108:52;;;5156:1;5153;5146:12;5108:52;5192:9;5179:23;5169:33;;5221:38;5255:2;5244:9;5240:18;5221:38;:::i;5270:390::-;5348:6;5356;5409:2;5397:9;5388:7;5384:23;5380:32;5377:52;;;5425:1;5422;5415:12;5377:52;5461:9;5448:23;5438:33;;5522:2;5511:9;5507:18;5494:32;5549:18;5541:6;5538:30;5535:50;;;5581:1;5578;5571:12;5665:248;5733:6;5741;5794:2;5782:9;5773:7;5769:23;5765:32;5762:52;;;5810:1;5807;5800:12;5762:52;-1:-1:-1;;5833:23:1;;;5903:2;5888:18;;;5875:32;;-1:-1:-1;5665:248:1:o;5918:257::-;5959:3;5997:5;5991:12;6024:6;6019:3;6012:19;6040:63;6096:6;6089:4;6084:3;6080:14;6073:4;6066:5;6062:16;6040:63;:::i;:::-;6157:2;6136:15;-1:-1:-1;;6132:29:1;6123:39;;;;6164:4;6119:50;;5918:257;-1:-1:-1;;5918:257:1:o;6180:973::-;6265:12;;6230:3;;6320:1;6340:18;;;;6393;;;;6420:61;;6474:4;6466:6;6462:17;6452:27;;6420:61;6500:2;6548;6540:6;6537:14;6517:18;6514:38;6511:161;;;6594:10;6589:3;6585:20;6582:1;6575:31;6629:4;6626:1;6619:15;6657:4;6654:1;6647:15;6511:161;6688:18;6715:104;;;;6833:1;6828:319;;;;6681:466;;6715:104;-1:-1:-1;;6748:24:1;;6736:37;;6793:16;;;;-1:-1:-1;6715:104:1;;6828:319;22733:1;22726:14;;;22770:4;22757:18;;6922:1;6936:165;6950:6;6947:1;6944:13;6936:165;;;7028:14;;7015:11;;;7008:35;7071:16;;;;6965:10;;6936:165;;;6940:3;;7130:6;7125:3;7121:16;7114:23;;6681:466;;;;;;;6180:973;;;;:::o;7158:276::-;7289:3;7327:6;7321:13;7343:53;7389:6;7384:3;7377:4;7369:6;7365:17;7343:53;:::i;:::-;7412:16;;;;;7158:276;-1:-1:-1;;7158:276:1:o;7439:470::-;7618:3;7656:6;7650:13;7672:53;7718:6;7713:3;7706:4;7698:6;7694:17;7672:53;:::i;:::-;7788:13;;7747:16;;;;7810:57;7788:13;7747:16;7844:4;7832:17;;7810:57;:::i;:::-;7883:20;;7439:470;-1:-1:-1;;;;7439:470:1:o;7914:356::-;8090:3;8128:6;8122:13;8144:53;8190:6;8185:3;8178:4;8170:6;8166:17;8144:53;:::i;:::-;8213:51;8256:6;8251:3;8247:16;8239:6;8213:51;:::i;:::-;8206:58;7914:356;-1:-1:-1;;;;;7914:356:1:o;8275:519::-;8552:3;8590:6;8584:13;8606:53;8652:6;8647:3;8640:4;8632:6;8628:17;8606:53;:::i;:::-;-1:-1:-1;;;8681:16:1;;;8706:18;;;8740:48;8785:1;8774:13;;8766:6;8740:48;:::i;8799:372::-;8958:3;8996:6;8990:13;9012:53;9058:6;9053:3;9046:4;9038:6;9034:17;9012:53;:::i;:::-;9087:16;;;;9112:21;;;-1:-1:-1;9160:4:1;9149:16;;8799:372;-1:-1:-1;8799:372:1:o;9384:488::-;-1:-1:-1;;;;;9653:15:1;;;9635:34;;9705:15;;9700:2;9685:18;;9678:43;9752:2;9737:18;;9730:34;;;9800:3;9795:2;9780:18;;9773:31;;;9578:4;;9821:45;;9846:19;;9838:6;9821:45;:::i;:::-;9813:53;9384:488;-1:-1:-1;;;;;;9384:488:1:o;10069:219::-;10218:2;10207:9;10200:21;10181:4;10238:44;10278:2;10267:9;10263:18;10255:6;10238:44;:::i;11065:414::-;11267:2;11249:21;;;11306:2;11286:18;;;11279:30;11345:34;11340:2;11325:18;;11318:62;-1:-1:-1;;;11411:2:1;11396:18;;11389:48;11469:3;11454:19;;11065:414::o;12601:401::-;12803:2;12785:21;;;12842:2;12822:18;;;12815:30;12881:34;12876:2;12861:18;;12854:62;-1:-1:-1;;;12947:2:1;12932:18;;12925:35;12992:3;12977:19;;12601:401::o;13354:417::-;13556:2;13538:21;;;13595:2;13575:18;;;13568:30;13634:34;13629:2;13614:18;;13607:62;-1:-1:-1;;;13700:2:1;13685:18;;13678:51;13761:3;13746:19;;13354:417::o;18138:356::-;18340:2;18322:21;;;18359:18;;;18352:30;18418:34;18413:2;18398:18;;18391:62;18485:2;18470:18;;18138:356::o;20480:413::-;20682:2;20664:21;;;20721:2;20701:18;;;20694:30;20760:34;20755:2;20740:18;;20733:62;-1:-1:-1;;;20826:2:1;20811:18;;20804:47;20883:3;20868:19;;20480:413::o;21311:398::-;21513:2;21495:21;;;21552:2;21532:18;;;21525:30;21591:34;21586:2;21571:18;;21564:62;-1:-1:-1;;;21657:2:1;21642:18;;21635:32;21699:3;21684:19;;21311:398::o;22786:128::-;22826:3;22857:1;22853:6;22850:1;22847:13;22844:39;;;22863:18;;:::i;:::-;-1:-1:-1;22899:9:1;;22786:128::o;22919:204::-;22957:3;22993:4;22990:1;22986:12;23025:4;23022:1;23018:12;23060:3;23054:4;23050:14;23045:3;23042:23;23039:49;;;23068:18;;:::i;:::-;23104:13;;22919:204;-1:-1:-1;;;22919:204:1:o;23128:168::-;23168:7;23234:1;23230;23226:6;23222:14;23219:1;23216:21;23211:1;23204:9;23197:17;23193:45;23190:71;;;23241:18;;:::i;:::-;-1:-1:-1;23281:9:1;;23128:168::o;23301:125::-;23341:4;23369:1;23366;23363:8;23360:34;;;23374:18;;:::i;:::-;-1:-1:-1;23411:9:1;;23301:125::o;23431:258::-;23503:1;23513:113;23527:6;23524:1;23521:13;23513:113;;;23603:11;;;23597:18;23584:11;;;23577:39;23549:2;23542:10;23513:113;;;23644:6;23641:1;23638:13;23635:48;;;-1:-1:-1;;23679:1:1;23661:16;;23654:27;23431:258::o;23694:380::-;23773:1;23769:12;;;;23816;;;23837:61;;23891:4;23883:6;23879:17;23869:27;;23837:61;23944:2;23936:6;23933:14;23913:18;23910:38;23907:161;;;23990:10;23985:3;23981:20;23978:1;23971:31;24025:4;24022:1;24015:15;24053:4;24050:1;24043:15;23907:161;;23694:380;;;:::o;24079:135::-;24118:3;-1:-1:-1;;24139:17:1;;24136:43;;;24159:18;;:::i;:::-;-1:-1:-1;24206:1:1;24195:13;;24079:135::o;24219:127::-;24280:10;24275:3;24271:20;24268:1;24261:31;24311:4;24308:1;24301:15;24335:4;24332:1;24325:15;24351:127;24412:10;24407:3;24403:20;24400:1;24393:31;24443:4;24440:1;24433:15;24467:4;24464:1;24457:15;24483:127;24544:10;24539:3;24535:20;24532:1;24525:31;24575:4;24572:1;24565:15;24599:4;24596:1;24589:15;24615:127;24676:10;24671:3;24667:20;24664:1;24657:31;24707:4;24704:1;24697:15;24731:4;24728:1;24721:15;24747:131;-1:-1:-1;;;;;;24821:32:1;;24811:43;;24801:71;;24868:1;24865;24858:12
Swarm Source
ipfs://7513065d88b1b511ad0fc657a5f8a5a8d4eded1c1390f063ba59950f8942ebe7
Loading...
Loading
Loading...
Loading
OVERVIEW
NFT Domains - Own Your Blockchain Domain. No Renewal Fees Ever.Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
GLMR | 100.00% | $0.077411 | 2,090 | $161.79 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.