Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Pass
Overview
Max Total Supply
4,260 INFG
Holders
890
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 INFGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-08 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.14; 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); } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } 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); } 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract NFT is ERC721, ReentrancyGuard, Ownable { using Address for address; using Strings for uint256; struct TokenInfo { uint8 rarity; // 0 - community, 1 - ultimate } mapping(uint256 => TokenInfo) public tokenInfo; address private sys; uint256 private supply; uint256 private community_supply; uint256 private ultimate_supply; uint256 private reserveUltimateMinted; uint256 private reserveCommunityMinted; uint256 private immutable MAX_SUPPLY = 4500; uint256 private immutable MAX_COMMUNITY = 4000; uint256 private immutable MAX_ULTIMATE = 500; uint256 private immutable MAX_SALE_COMMUNITY = 3800; uint256 private immutable MAX_SALE_ULTIMATE = 475; uint256 private immutable MAX_MINT_PRIVATE = 1900; uint256 private immutable community_price = 0.05 ether; uint256 private immutable ultimate_price = 1 ether; uint256 public unlimited_pass_mint_start = 1654790400; uint256 public unlimited_pass_mint_end = 1655049600; uint256 public private_mint_start = 1654876800; uint256 public private_mint_end = 1655049600; uint256 public public_mint_start = 1655067600; uint256 public public_mint_nex = 1655154000; mapping(address => uint256) private publicMintCount; mapping(address => uint256) private privateMintCount; mapping(address => bool) private ultimateMinted; bool private uriForEach; string private baseURI_; string private baseExtension_; string private communityURI; string private ultimateURI; constructor(address _sys, string memory commURI, string memory ultiURI) ERC721("InfiniGods", "INFG") { sys = _sys; communityURI = commURI; ultimateURI = ultiURI; } /// @dev View Functions function totalSupply() external view virtual returns (uint256) { return supply; } function communitySupply() external view virtual returns (uint256) { return community_supply; } function ultimateSupply() external view virtual returns (uint256) { return ultimate_supply; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (uriForEach) { string memory baseURI = _baseURI(); string memory baseExtension = _baseExtension(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), baseExtension)) : ""; } else { if (tokenInfo[tokenId].rarity == 1) { return ultimateURI; } else { return communityURI; } } } function hasMintedUltimate(address wallet) external view returns (bool) { return ultimateMinted[wallet]; } function hasMintedPrivate(address wallet) external view returns (bool) { return privateMintCount[wallet] == 1; } function canMintPublic(address wallet) external view returns (uint256) { if (block.timestamp < public_mint_start) { return 0; } else if (block.timestamp >= public_mint_start && block.timestamp < public_mint_nex) { return 1 - publicMintCount[wallet]; } else if (block.timestamp >= public_mint_nex) { uint256 can = 5 - publicMintCount[wallet]; if (can > MAX_SALE_COMMUNITY - community_supply) { return MAX_SALE_COMMUNITY - community_supply; } else { return can; } } } function getTokenRarity(uint256 tokenId) external view virtual returns (uint8) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return tokenInfo[tokenId].rarity; } function getLeftForCurrentRound() external view virtual returns (uint256 _ultimate, uint256 _private, uint256 _public, uint256 _totalCommunity) { if (block.timestamp <= unlimited_pass_mint_end) { _ultimate = MAX_SALE_ULTIMATE - ultimate_supply; } if (block.timestamp <= private_mint_end) { _private = MAX_MINT_PRIVATE - community_supply; } if (block.timestamp >= public_mint_start) { _public = MAX_SALE_COMMUNITY - community_supply; } _totalCommunity = MAX_SALE_COMMUNITY - community_supply; } /// @dev Public Functions function mintUltimate(bytes memory sig) external payable nonReentrant { require(block.timestamp >= unlimited_pass_mint_start, "Minting has not yet started (Unlim)"); require(block.timestamp <= unlimited_pass_mint_end, "Minting has finished (Unlim)"); require(verify(_msgSender(), 1, sig), "Verification failed!"); require(ultimate_price <= msg.value, "Not enough payed"); require(ultimate_supply + 1 <= MAX_SALE_ULTIMATE, "Supply would be exceeded. Try minting less"); require(!ultimateMinted[_msgSender()], "You have already minted in this round"); ultimateMinted[_msgSender()] = true; ultimate_supply += 1; supply += 1; _safeMint(_msgSender(), supply); tokenInfo[supply].rarity = 1; if (msg.value > ultimate_price) { payable(_msgSender()).transfer(msg.value - ultimate_price); } } function mintCommunity(uint256 amount, bytes memory sig) external payable nonReentrant { require(amount != 0); require(block.timestamp >= private_mint_start, "Minting has not started (Comm)"); require(msg.value >= community_price * amount, "Not enough payed!"); if (block.timestamp > private_mint_end) { // Public Mint require(block.timestamp >= public_mint_start, "Minting is not active"); require(community_supply + amount <= MAX_SALE_COMMUNITY, "Community supply would be exceeded"); if (block.timestamp < public_mint_nex) { require(publicMintCount[_msgSender()] == 0, "You have already minted your limit, please come back later"); _mintPublic(1, _msgSender()); if (msg.value > community_price) { payable(_msgSender()).transfer(msg.value - community_price); } } else { require(publicMintCount[_msgSender()] + amount <= 5, "Limit reached!"); _mintPublic(amount, _msgSender()); if (msg.value > community_price * amount) { payable(_msgSender()).transfer(msg.value - community_price); } } } else { // Private Mint require(verify(_msgSender(), 2, sig), "Access denied!"); require(privateMintCount[_msgSender()] == 0, "Only one NFT per wallet during private mint"); require(community_supply + 1 <= MAX_MINT_PRIVATE, "Total of 1900 NFTs has been minted!"); _mintPrivate(_msgSender()); if (msg.value > community_price) { payable(_msgSender()).transfer(msg.value - community_price); } } } /// @dev OnlyOwner Functions function changeStdUri(string memory commUri, string memory ultiUri) external onlyOwner { communityURI = commUri; ultimateURI = ultiUri; } function changeURIForAll(bool value) external onlyOwner { uriForEach = value; } function withdraw() external onlyOwner { payable(owner()).transfer(address(this).balance); } function freeMintUltimate(uint256 amount) external onlyOwner { if (block.timestamp <= unlimited_pass_mint_end) { require(reserveUltimateMinted + amount <= MAX_ULTIMATE - MAX_SALE_ULTIMATE); } else { uint256 available = (MAX_ULTIMATE - reserveUltimateMinted - ultimate_supply); require(amount <= available); } reserveUltimateMinted += amount; for (uint256 i; i < amount; i++) { supply ++; _safeMint(owner(), supply); tokenInfo[supply].rarity = 1; } } function freeMintStandard(uint256 amount) external onlyOwner { require(reserveCommunityMinted + amount <= MAX_COMMUNITY - MAX_SALE_COMMUNITY); reserveCommunityMinted += amount; for (uint256 i; i < amount; i++) { supply ++; _safeMint(owner(), supply); } } function setBaseURI(string memory _newURI) external onlyOwner { baseURI_ = _newURI; } function setBaseExtension(string memory _newExtension) external onlyOwner { baseExtension_ = _newExtension; } function changeSys(address _sys) external onlyOwner { sys = _sys; } /// @dev Internal Functions function _baseURI() internal view virtual override returns (string memory) { return baseURI_; } function _baseExtension() internal view virtual returns (string memory) { return baseExtension_; } function _mintPrivate(address user) internal { privateMintCount[user] = 1; community_supply += 1; supply += 1; _safeMint(user, supply); } function _mintPublic(uint256 amount, address user) internal { publicMintCount[user] += amount; community_supply += amount; for (uint256 i; i < amount; i++) { supply += 1; _safeMint(user, supply); } } function verify(address user, uint256 round, bytes memory sig) internal view returns (bool) { bytes32 messageHash = getMessageHash(user, round); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, sig) == sys; } function getMessageHash(address user, uint256 round) public pure returns (bytes32) { return keccak256(abi.encodePacked(user, round)); } function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)); } function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v) { require(sig.length == 65, "invalid signature length"); assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_sys","type":"address"},{"internalType":"string","name":"commURI","type":"string"},{"internalType":"string","name":"ultiURI","type":"string"}],"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":"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":[{"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":"address","name":"wallet","type":"address"}],"name":"canMintPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"commUri","type":"string"},{"internalType":"string","name":"ultiUri","type":"string"}],"name":"changeStdUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sys","type":"address"}],"name":"changeSys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeURIForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communitySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMintStandard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMintUltimate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeftForCurrentRound","outputs":[{"internalType":"uint256","name":"_ultimate","type":"uint256"},{"internalType":"uint256","name":"_private","type":"uint256"},{"internalType":"uint256","name":"_public","type":"uint256"},{"internalType":"uint256","name":"_totalCommunity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"round","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"hasMintedPrivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"hasMintedUltimate","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"mintCommunity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"mintUltimate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"private_mint_end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"private_mint_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_nex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"uint8","name":"rarity","type":"uint8"}],"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":"ultimateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlimited_pass_mint_end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlimited_pass_mint_start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610180604052611194608052610fa060a0526101f460c052610ed860e0526101db6101005261076c6101205266b1a2bc2ec5000061014052670de0b6b3a7640000610160526362a21900600f556362a60d8060108190556362a36a806011556012556362a653d06013556362a7a5506014553480156200007e57600080fd5b506040516200347e3803806200347e833981016040819052620000a1916200032d565b604080518082018252600a815269496e66696e69476f647360b01b602080830191825283518085019094526004845263494e464760e01b908401528151919291620000ef91600091620001ba565b50805162000105906001906020840190620001ba565b5050600160065550620001183362000168565b600980546001600160a01b0319166001600160a01b03851617905581516200014890601b906020850190620001ba565b5080516200015e90601c906020840190620001ba565b50505050620003f3565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001c890620003b7565b90600052602060002090601f016020900481019282620001ec576000855562000237565b82601f106200020757805160ff191683800117855562000237565b8280016001018555821562000237579182015b82811115620002375782518255916020019190600101906200021a565b506200024592915062000249565b5090565b5b808211156200024557600081556001016200024a565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200028857600080fd5b81516001600160401b0380821115620002a557620002a562000260565b604051601f8301601f19908116603f01168101908282118183101715620002d057620002d062000260565b81604052838152602092508683858801011115620002ed57600080fd5b600091505b83821015620003115785820183015181830184015290820190620002f2565b83821115620003235760008385830101525b9695505050505050565b6000806000606084860312156200034357600080fd5b83516001600160a01b03811681146200035b57600080fd5b60208501519093506001600160401b03808211156200037957600080fd5b620003878783880162000276565b935060408601519150808211156200039e57600080fd5b50620003ad8682870162000276565b9150509250925092565b600181811c90821680620003cc57607f821691505b602082108103620003ed57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516101405161016051612fb8620004c660003960008181610be601528181610dc00152610def01526000818161156301528181611740015281816117790152818161183a015281816119ba01526119e90152600081816112020152611927015260008181610c4801528181610eff01526111c901526000818161123b0152818161126b015281816113cf0152818161162001528181611c660152611c9f015260008181610f200152610f6c015260006113f0015260005050612fb86000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063c2a83654116100b6578063da3ef23f1161007a578063da3ef23f146106f5578063e080890d14610715578063e5d2c7211461072b578063e985e9c51461074b578063f2fde38b14610794578063fcceea26146107b457600080fd5b8063c2a8365414610659578063c87b56dd1461066f578063cc33c8751461068f578063d58f025d146106bf578063d761372d146106d557600080fd5b806395d89b41116100fd57806395d89b41146105dc578063a22cb465146105f1578063a698b29d14610611578063b15e5e7414610624578063b88d4fde1461063957600080fd5b806370a0823114610553578063715018a614610573578063785a00421461058857806383a93cdc146105a85780638da5cb5b146105be57600080fd5b80634e2a5394116101d2578063587d65c211610196578063587d65c2146104795780635ad0b67e146104b25780636352211e146104c857806364c6aed9146104e85780636711e0841461051d578063699847301461053d57600080fd5b80634e2a5394146103ae578063512c91df146103e757806354db11e514610407578063555ec78b1461042757806355f804b31461045957600080fd5b806323b872dd1161021957806323b872dd146103265780633bd73513146103465780633ccfd60b1461035957806342842e0e1461036e5780634c04b54f1461038e57600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e557806318160ddd14610307575b600080fd5b34801561026257600080fd5b50610276610271366004612917565b6107c9565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a061081b565b604051610282919061298c565b3480156102b957600080fd5b506102cd6102c836600461299f565b6108ad565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b506103056103003660046129cf565b610947565b005b34801561031357600080fd5b50600a545b604051908152602001610282565b34801561033257600080fd5b506103056103413660046129f9565b610a5c565b610305610354366004612ad8565b610a8d565b34801561036557600080fd5b50610305610e46565b34801561037a57600080fd5b506103056103893660046129f9565b610eac565b34801561039a57600080fd5b506103056103a936600461299f565b610ec7565b3480156103ba57600080fd5b506102766103c9366004612b0d565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156103f357600080fd5b506103186104023660046129cf565b61102f565b34801561041357600080fd5b50610305610422366004612b38565b611076565b34801561043357600080fd5b5061044761044236600461299f565b6110b3565b60405160ff9091168152602001610282565b34801561046557600080fd5b50610305610474366004612ad8565b6110fd565b34801561048557600080fd5b50610276610494366004612b0d565b6001600160a01b031660009081526016602052604090205460011490565b3480156104be57600080fd5b5061031860115481565b3480156104d457600080fd5b506102cd6104e336600461299f565b61113a565b3480156104f457600080fd5b506104fd6111b1565b604080519485526020850193909352918301526060820152608001610282565b34801561052957600080fd5b50610305610538366004612b0d565b611297565b34801561054957600080fd5b5061031860135481565b34801561055f57600080fd5b5061031861056e366004612b0d565b6112e3565b34801561057f57600080fd5b5061030561136a565b34801561059457600080fd5b506103056105a336600461299f565b6113a0565b3480156105b457600080fd5b5061031860105481565b3480156105ca57600080fd5b506007546001600160a01b03166102cd565b3480156105e857600080fd5b506102a061148c565b3480156105fd57600080fd5b5061030561060c366004612b53565b61149b565b61030561061f366004612b86565b6114a6565b34801561063057600080fd5b50600c54610318565b34801561064557600080fd5b50610305610654366004612bcd565b611a40565b34801561066557600080fd5b50610318600f5481565b34801561067b57600080fd5b506102a061068a36600461299f565b611a78565b34801561069b57600080fd5b506104476106aa36600461299f565b60086020526000908152604090205460ff1681565b3480156106cb57600080fd5b5061031860125481565b3480156106e157600080fd5b506103186106f0366004612b0d565b611be2565b34801561070157600080fd5b50610305610710366004612ad8565b611cd0565b34801561072157600080fd5b5061031860145481565b34801561073757600080fd5b50610305610746366004612c35565b611d0d565b34801561075757600080fd5b50610276610766366004612c8f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a057600080fd5b506103056107af366004612b0d565b611d5e565b3480156107c057600080fd5b50600b54610318565b60006001600160e01b031982166380ac58cd60e01b14806107fa57506001600160e01b03198216635b5e139f60e01b145b8061081557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461082a90612cb9565b80601f016020809104026020016040519081016040528092919081815260200182805461085690612cb9565b80156108a35780601f10610878576101008083540402835291602001916108a3565b820191906000526020600020905b81548152906001019060200180831161088657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661092b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109528261113a565b9050806001600160a01b0316836001600160a01b0316036109bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610922565b336001600160a01b03821614806109db57506109db8133610766565b610a4d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610922565b610a578383611df6565b505050565b610a663382611e64565b610a825760405162461bcd60e51b815260040161092290612ced565b610a57838383611f5a565b600260065403610adf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610922565b6002600655600f54421015610b425760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e6720686173206e6f742079657420737461727465642028556e6c604482015262696d2960e81b6064820152608401610922565b601054421115610b945760405162461bcd60e51b815260206004820152601c60248201527f4d696e74696e67206861732066696e69736865642028556e6c696d29000000006044820152606401610922565b610ba0336001836120f6565b610be35760405162461bcd60e51b8152602060048201526014602482015273566572696669636174696f6e206661696c65642160601b6044820152606401610922565b347f00000000000000000000000000000000000000000000000000000000000000001115610c465760405162461bcd60e51b815260206004820152601060248201526f139bdd08195b9bdd59da081c185e595960821b6044820152606401610922565b7f0000000000000000000000000000000000000000000000000000000000000000600c546001610c769190612d54565b1115610cd75760405162461bcd60e51b815260206004820152602a60248201527f537570706c7920776f756c642062652065786365656465642e20547279206d696044820152696e74696e67206c65737360b01b6064820152608401610922565b3360009081526017602052604090205460ff1615610d455760405162461bcd60e51b815260206004820152602560248201527f596f75206861766520616c7265616479206d696e74656420696e2074686973206044820152641c9bdd5b9960da1b6064820152608401610922565b336000908152601760205260408120805460ff19166001908117909155600c805491929091610d75908490612d54565b925050819055506001600a6000828254610d8f9190612d54565b90915550610da29050335b600a5461218b565b600a546000908152600860205260409020805460ff191660011790557f0000000000000000000000000000000000000000000000000000000000000000341115610e3e57336108fc610e147f000000000000000000000000000000000000000000000000000000000000000034612d6c565b6040518115909202916000818181858888f19350505050158015610e3c573d6000803e3d6000fd5b505b506001600655565b6007546001600160a01b03163314610e705760405162461bcd60e51b815260040161092290612d83565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610ea9573d6000803e3d6000fd5b50565b610a5783838360405180602001604052806000815250611a40565b6007546001600160a01b03163314610ef15760405162461bcd60e51b815260040161092290612d83565b6010544211610f6257610f447f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d6c565b81600d54610f529190612d54565b1115610f5d57600080fd5b610fb0565b6000600c54600d547f0000000000000000000000000000000000000000000000000000000000000000610f959190612d6c565b610f9f9190612d6c565b905080821115610fae57600080fd5b505b80600d6000828254610fc29190612d54565b90915550600090505b8181101561102b57600a8054906000610fe383612db8565b9190505550610ffd610d9a6007546001600160a01b031690565b600a546000908152600860205260409020805460ff191660011790558061102381612db8565b915050610fcb565b5050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6007546001600160a01b031633146110a05760405162461bcd60e51b815260040161092290612d83565b6018805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b03166110e75760405162461bcd60e51b815260040161092290612dd1565b5060009081526008602052604090205460ff1690565b6007546001600160a01b031633146111275760405162461bcd60e51b815260040161092290612d83565b805161102b906019906020840190612868565b6000818152600260205260408120546001600160a01b0316806108155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610922565b60008060008060105442116111f057600c546111ed907f0000000000000000000000000000000000000000000000000000000000000000612d6c565b93505b601254421161122957600b54611226907f0000000000000000000000000000000000000000000000000000000000000000612d6c565b92505b601354421061126257600b5461125f907f0000000000000000000000000000000000000000000000000000000000000000612d6c565b91505b600b5461128f907f0000000000000000000000000000000000000000000000000000000000000000612d6c565b905090919293565b6007546001600160a01b031633146112c15760405162461bcd60e51b815260040161092290612d83565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b03821661134e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610922565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146113945760405162461bcd60e51b815260040161092290612d83565b61139e60006121a5565b565b6007546001600160a01b031633146113ca5760405162461bcd60e51b815260040161092290612d83565b6114147f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d6c565b81600e546114229190612d54565b111561142d57600080fd5b80600e600082825461143f9190612d54565b90915550600090505b8181101561102b57600a805490600061146083612db8565b919050555061147a610d9a6007546001600160a01b031690565b8061148481612db8565b915050611448565b60606001805461082a90612cb9565b61102b3383836121f7565b6002600654036114f85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610922565b6002600655600082900361150b57600080fd5b60115442101561155d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720686173206e6f7420737461727465642028436f6d6d2900006044820152606401610922565b611587827f0000000000000000000000000000000000000000000000000000000000000000612e20565b3410156115ca5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617965642160781b6044820152606401610922565b60125442111561186b5760135442101561161e5760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b6044820152606401610922565b7f000000000000000000000000000000000000000000000000000000000000000082600b5461164d9190612d54565b11156116a65760405162461bcd60e51b815260206004820152602260248201527f436f6d6d756e69747920737570706c7920776f756c6420626520657863656564604482015261195960f21b6064820152608401610922565b6014544210156117cd5733600090815260156020526040902054156117335760405162461bcd60e51b815260206004820152603a60248201527f596f75206861766520616c7265616479206d696e74656420796f7572206c696d60448201527f69742c20706c6561736520636f6d65206261636b206c617465720000000000006064820152608401610922565b61173e6001336122c5565b7f00000000000000000000000000000000000000000000000000000000000000003411156117c857335b6001600160a01b03166108fc61179e7f000000000000000000000000000000000000000000000000000000000000000034612d6c565b6040518115909202916000818181858888f193505050501580156117c6573d6000803e3d6000fd5b505b610e3c565b336000908152601560205260409020546005906117eb908490612d54565b111561182a5760405162461bcd60e51b815260206004820152600e60248201526d4c696d697420726561636865642160901b6044820152606401610922565b61183482336122c5565b61185e827f0000000000000000000000000000000000000000000000000000000000000000612e20565b3411156117c85733611768565b611877336002836120f6565b6118b45760405162461bcd60e51b815260206004820152600e60248201526d4163636573732064656e6965642160901b6044820152606401610922565b33600090815260166020526040902054156119255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c79206f6e65204e4654207065722077616c6c657420647572696e67207060448201526a1c9a5d985d19481b5a5b9d60aa1b6064820152608401610922565b7f0000000000000000000000000000000000000000000000000000000000000000600b5460016119559190612d54565b11156119af5760405162461bcd60e51b815260206004820152602360248201527f546f74616c206f662031393030204e46547320686173206265656e206d696e7460448201526265642160e81b6064820152608401610922565b6119b83361234f565b7f0000000000000000000000000000000000000000000000000000000000000000341115610e3c57336108fc611a0e7f000000000000000000000000000000000000000000000000000000000000000034612d6c565b6040518115909202916000818181858888f19350505050158015611a36573d6000803e3d6000fd5b5050506001600655565b611a4a3383611e64565b611a665760405162461bcd60e51b815260040161092290612ced565b611a72848484846123ad565b50505050565b6000818152600260205260409020546060906001600160a01b0316611aaf5760405162461bcd60e51b815260040161092290612dd1565b60185460ff1615611b25576000611ac46123e0565b90506000611ad06123ef565b90506000825111611af05760405180602001604052806000815250611b1d565b81611afa856123fe565b82604051602001611b0d93929190612e3f565b6040516020818303038152906040525b949350505050565b60008281526008602052604090205460ff16600103611bd057601c8054611b4b90612cb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7790612cb9565b8015611bc45780601f10611b9957610100808354040283529160200191611bc4565b820191906000526020600020905b815481529060010190602001808311611ba757829003601f168201915b50505050509050919050565b601b8054611b4b90612cb9565b919050565b6000601354421015611bf657506000919050565b6013544210158015611c09575060145442105b15611c32576001600160a01b038216600090815260156020526040902054610815906001612d6c565b6014544210611bdd576001600160a01b038216600090815260156020526040812054611c5f906005612d6c565b9050600b547f0000000000000000000000000000000000000000000000000000000000000000611c8f9190612d6c565b81111561081557600b54611cc3907f0000000000000000000000000000000000000000000000000000000000000000612d6c565b9392505050565b50919050565b6007546001600160a01b03163314611cfa5760405162461bcd60e51b815260040161092290612d83565b805161102b90601a906020840190612868565b6007546001600160a01b03163314611d375760405162461bcd60e51b815260040161092290612d83565b8151611d4a90601b906020850190612868565b508051610a5790601c906020840190612868565b6007546001600160a01b03163314611d885760405162461bcd60e51b815260040161092290612d83565b6001600160a01b038116611ded5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610922565b610ea9816121a5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e2b8261113a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611edd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610922565b6000611ee88361113a565b9050806001600160a01b0316846001600160a01b03161480611f2f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b1d5750836001600160a01b0316611f48846108ad565b6001600160a01b031614949350505050565b826001600160a01b0316611f6d8261113a565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610922565b6001600160a01b0382166120335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610922565b61203e600082611df6565b6001600160a01b0383166000908152600360205260408120805460019290612067908490612d6c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612095908490612d54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612103858561102f565b9050600061215e826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6009549091506001600160a01b031661217782866124ff565b6001600160a01b0316149695505050505050565b61102b82826040518060200160405280600081525061257e565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036122585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610922565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038116600090815260156020526040812080548492906122ed908490612d54565b9250508190555081600b60008282546123069190612d54565b90915550600090505b82811015610a57576001600a600082825461232a9190612d54565b9250508190555061233d82600a5461218b565b8061234781612db8565b91505061230f565b6001600160a01b0381166000908152601660205260408120600190819055600b805491929091612380908490612d54565b925050819055506001600a600082825461239a9190612d54565b92505081905550610ea981600a5461218b565b6123b8848484611f5a565b6123c4848484846125b1565b611a725760405162461bcd60e51b815260040161092290612e82565b60606019805461082a90612cb9565b6060601a805461082a90612cb9565b6060816000036124255750506040805180820190915260018152600360fc1b602082015290565b8160005b811561244f578061243981612db8565b91506124489050600a83612eea565b9150612429565b60008167ffffffffffffffff81111561246a5761246a612a35565b6040519080825280601f01601f191660200182016040528015612494576020820181803683370190505b5090505b8415611b1d576124a9600183612d6c565b91506124b6600a86612efe565b6124c1906030612d54565b60f81b8183815181106124d6576124d6612f12565b60200101906001600160f81b031916908160001a9053506124f8600a86612eea565b9450612498565b60008060008061250e856126b2565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015612569573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6125888383612726565b61259560008484846125b1565b610a575760405162461bcd60e51b815260040161092290612e82565b60006001600160a01b0384163b156126a757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125f5903390899088908890600401612f28565b6020604051808303816000875af1925050508015612630575060408051601f3d908101601f1916820190925261262d91810190612f65565b60015b61268d573d80801561265e576040519150601f19603f3d011682016040523d82523d6000602084013e612663565b606091505b5080516000036126855760405162461bcd60e51b815260040161092290612e82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b1d565b506001949350505050565b600080600083516041146127085760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610922565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b03821661277c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610922565b6000818152600260205260409020546001600160a01b0316156127e15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610922565b6001600160a01b038216600090815260036020526040812080546001929061280a908490612d54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461287490612cb9565b90600052602060002090601f01602090048101928261289657600085556128dc565b82601f106128af57805160ff19168380011785556128dc565b828001600101855582156128dc579182015b828111156128dc5782518255916020019190600101906128c1565b506128e89291506128ec565b5090565b5b808211156128e857600081556001016128ed565b6001600160e01b031981168114610ea957600080fd5b60006020828403121561292957600080fd5b8135611cc381612901565b60005b8381101561294f578181015183820152602001612937565b83811115611a725750506000910152565b60008151808452612978816020860160208601612934565b601f01601f19169290920160200192915050565b602081526000611cc36020830184612960565b6000602082840312156129b157600080fd5b5035919050565b80356001600160a01b0381168114611bdd57600080fd5b600080604083850312156129e257600080fd5b6129eb836129b8565b946020939093013593505050565b600080600060608486031215612a0e57600080fd5b612a17846129b8565b9250612a25602085016129b8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612a5c57600080fd5b813567ffffffffffffffff80821115612a7757612a77612a35565b604051601f8301601f19908116603f01168101908282118183101715612a9f57612a9f612a35565b81604052838152866020858801011115612ab857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612aea57600080fd5b813567ffffffffffffffff811115612b0157600080fd5b611b1d84828501612a4b565b600060208284031215612b1f57600080fd5b611cc3826129b8565b80358015158114611bdd57600080fd5b600060208284031215612b4a57600080fd5b611cc382612b28565b60008060408385031215612b6657600080fd5b612b6f836129b8565b9150612b7d60208401612b28565b90509250929050565b60008060408385031215612b9957600080fd5b82359150602083013567ffffffffffffffff811115612bb757600080fd5b612bc385828601612a4b565b9150509250929050565b60008060008060808587031215612be357600080fd5b612bec856129b8565b9350612bfa602086016129b8565b925060408501359150606085013567ffffffffffffffff811115612c1d57600080fd5b612c2987828801612a4b565b91505092959194509250565b60008060408385031215612c4857600080fd5b823567ffffffffffffffff80821115612c6057600080fd5b612c6c86838701612a4b565b93506020850135915080821115612c8257600080fd5b50612bc385828601612a4b565b60008060408385031215612ca257600080fd5b612cab836129b8565b9150612b7d602084016129b8565b600181811c90821680612ccd57607f821691505b602082108103611cca57634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612d6757612d67612d3e565b500190565b600082821015612d7e57612d7e612d3e565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612dca57612dca612d3e565b5060010190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6000816000190483118215151615612e3a57612e3a612d3e565b500290565b60008451612e51818460208901612934565b845190830190612e65818360208901612934565b8451910190612e78818360208801612934565b0195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612ef957612ef9612ed4565b500490565b600082612f0d57612f0d612ed4565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5b90830184612960565b9695505050505050565b600060208284031215612f7757600080fd5b8151611cc38161290156fea26469706673582212204da384a52474e7eb3ae70006ce38a30f4423ed7dd33c7c55413832b9280602fe64736f6c634300080e0033000000000000000000000000470f6e8bbe1db5267bf8cebbb6a933c3518800000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c806370a0823111610139578063c2a83654116100b6578063da3ef23f1161007a578063da3ef23f146106f5578063e080890d14610715578063e5d2c7211461072b578063e985e9c51461074b578063f2fde38b14610794578063fcceea26146107b457600080fd5b8063c2a8365414610659578063c87b56dd1461066f578063cc33c8751461068f578063d58f025d146106bf578063d761372d146106d557600080fd5b806395d89b41116100fd57806395d89b41146105dc578063a22cb465146105f1578063a698b29d14610611578063b15e5e7414610624578063b88d4fde1461063957600080fd5b806370a0823114610553578063715018a614610573578063785a00421461058857806383a93cdc146105a85780638da5cb5b146105be57600080fd5b80634e2a5394116101d2578063587d65c211610196578063587d65c2146104795780635ad0b67e146104b25780636352211e146104c857806364c6aed9146104e85780636711e0841461051d578063699847301461053d57600080fd5b80634e2a5394146103ae578063512c91df146103e757806354db11e514610407578063555ec78b1461042757806355f804b31461045957600080fd5b806323b872dd1161021957806323b872dd146103265780633bd73513146103465780633ccfd60b1461035957806342842e0e1461036e5780634c04b54f1461038e57600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e557806318160ddd14610307575b600080fd5b34801561026257600080fd5b50610276610271366004612917565b6107c9565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a061081b565b604051610282919061298c565b3480156102b957600080fd5b506102cd6102c836600461299f565b6108ad565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b506103056103003660046129cf565b610947565b005b34801561031357600080fd5b50600a545b604051908152602001610282565b34801561033257600080fd5b506103056103413660046129f9565b610a5c565b610305610354366004612ad8565b610a8d565b34801561036557600080fd5b50610305610e46565b34801561037a57600080fd5b506103056103893660046129f9565b610eac565b34801561039a57600080fd5b506103056103a936600461299f565b610ec7565b3480156103ba57600080fd5b506102766103c9366004612b0d565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156103f357600080fd5b506103186104023660046129cf565b61102f565b34801561041357600080fd5b50610305610422366004612b38565b611076565b34801561043357600080fd5b5061044761044236600461299f565b6110b3565b60405160ff9091168152602001610282565b34801561046557600080fd5b50610305610474366004612ad8565b6110fd565b34801561048557600080fd5b50610276610494366004612b0d565b6001600160a01b031660009081526016602052604090205460011490565b3480156104be57600080fd5b5061031860115481565b3480156104d457600080fd5b506102cd6104e336600461299f565b61113a565b3480156104f457600080fd5b506104fd6111b1565b604080519485526020850193909352918301526060820152608001610282565b34801561052957600080fd5b50610305610538366004612b0d565b611297565b34801561054957600080fd5b5061031860135481565b34801561055f57600080fd5b5061031861056e366004612b0d565b6112e3565b34801561057f57600080fd5b5061030561136a565b34801561059457600080fd5b506103056105a336600461299f565b6113a0565b3480156105b457600080fd5b5061031860105481565b3480156105ca57600080fd5b506007546001600160a01b03166102cd565b3480156105e857600080fd5b506102a061148c565b3480156105fd57600080fd5b5061030561060c366004612b53565b61149b565b61030561061f366004612b86565b6114a6565b34801561063057600080fd5b50600c54610318565b34801561064557600080fd5b50610305610654366004612bcd565b611a40565b34801561066557600080fd5b50610318600f5481565b34801561067b57600080fd5b506102a061068a36600461299f565b611a78565b34801561069b57600080fd5b506104476106aa36600461299f565b60086020526000908152604090205460ff1681565b3480156106cb57600080fd5b5061031860125481565b3480156106e157600080fd5b506103186106f0366004612b0d565b611be2565b34801561070157600080fd5b50610305610710366004612ad8565b611cd0565b34801561072157600080fd5b5061031860145481565b34801561073757600080fd5b50610305610746366004612c35565b611d0d565b34801561075757600080fd5b50610276610766366004612c8f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a057600080fd5b506103056107af366004612b0d565b611d5e565b3480156107c057600080fd5b50600b54610318565b60006001600160e01b031982166380ac58cd60e01b14806107fa57506001600160e01b03198216635b5e139f60e01b145b8061081557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461082a90612cb9565b80601f016020809104026020016040519081016040528092919081815260200182805461085690612cb9565b80156108a35780601f10610878576101008083540402835291602001916108a3565b820191906000526020600020905b81548152906001019060200180831161088657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661092b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109528261113a565b9050806001600160a01b0316836001600160a01b0316036109bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610922565b336001600160a01b03821614806109db57506109db8133610766565b610a4d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610922565b610a578383611df6565b505050565b610a663382611e64565b610a825760405162461bcd60e51b815260040161092290612ced565b610a57838383611f5a565b600260065403610adf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610922565b6002600655600f54421015610b425760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e6720686173206e6f742079657420737461727465642028556e6c604482015262696d2960e81b6064820152608401610922565b601054421115610b945760405162461bcd60e51b815260206004820152601c60248201527f4d696e74696e67206861732066696e69736865642028556e6c696d29000000006044820152606401610922565b610ba0336001836120f6565b610be35760405162461bcd60e51b8152602060048201526014602482015273566572696669636174696f6e206661696c65642160601b6044820152606401610922565b347f0000000000000000000000000000000000000000000000000de0b6b3a76400001115610c465760405162461bcd60e51b815260206004820152601060248201526f139bdd08195b9bdd59da081c185e595960821b6044820152606401610922565b7f00000000000000000000000000000000000000000000000000000000000001db600c546001610c769190612d54565b1115610cd75760405162461bcd60e51b815260206004820152602a60248201527f537570706c7920776f756c642062652065786365656465642e20547279206d696044820152696e74696e67206c65737360b01b6064820152608401610922565b3360009081526017602052604090205460ff1615610d455760405162461bcd60e51b815260206004820152602560248201527f596f75206861766520616c7265616479206d696e74656420696e2074686973206044820152641c9bdd5b9960da1b6064820152608401610922565b336000908152601760205260408120805460ff19166001908117909155600c805491929091610d75908490612d54565b925050819055506001600a6000828254610d8f9190612d54565b90915550610da29050335b600a5461218b565b600a546000908152600860205260409020805460ff191660011790557f0000000000000000000000000000000000000000000000000de0b6b3a7640000341115610e3e57336108fc610e147f0000000000000000000000000000000000000000000000000de0b6b3a764000034612d6c565b6040518115909202916000818181858888f19350505050158015610e3c573d6000803e3d6000fd5b505b506001600655565b6007546001600160a01b03163314610e705760405162461bcd60e51b815260040161092290612d83565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610ea9573d6000803e3d6000fd5b50565b610a5783838360405180602001604052806000815250611a40565b6007546001600160a01b03163314610ef15760405162461bcd60e51b815260040161092290612d83565b6010544211610f6257610f447f00000000000000000000000000000000000000000000000000000000000001db7f00000000000000000000000000000000000000000000000000000000000001f4612d6c565b81600d54610f529190612d54565b1115610f5d57600080fd5b610fb0565b6000600c54600d547f00000000000000000000000000000000000000000000000000000000000001f4610f959190612d6c565b610f9f9190612d6c565b905080821115610fae57600080fd5b505b80600d6000828254610fc29190612d54565b90915550600090505b8181101561102b57600a8054906000610fe383612db8565b9190505550610ffd610d9a6007546001600160a01b031690565b600a546000908152600860205260409020805460ff191660011790558061102381612db8565b915050610fcb565b5050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6007546001600160a01b031633146110a05760405162461bcd60e51b815260040161092290612d83565b6018805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b03166110e75760405162461bcd60e51b815260040161092290612dd1565b5060009081526008602052604090205460ff1690565b6007546001600160a01b031633146111275760405162461bcd60e51b815260040161092290612d83565b805161102b906019906020840190612868565b6000818152600260205260408120546001600160a01b0316806108155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610922565b60008060008060105442116111f057600c546111ed907f00000000000000000000000000000000000000000000000000000000000001db612d6c565b93505b601254421161122957600b54611226907f000000000000000000000000000000000000000000000000000000000000076c612d6c565b92505b601354421061126257600b5461125f907f0000000000000000000000000000000000000000000000000000000000000ed8612d6c565b91505b600b5461128f907f0000000000000000000000000000000000000000000000000000000000000ed8612d6c565b905090919293565b6007546001600160a01b031633146112c15760405162461bcd60e51b815260040161092290612d83565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b03821661134e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610922565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146113945760405162461bcd60e51b815260040161092290612d83565b61139e60006121a5565b565b6007546001600160a01b031633146113ca5760405162461bcd60e51b815260040161092290612d83565b6114147f0000000000000000000000000000000000000000000000000000000000000ed87f0000000000000000000000000000000000000000000000000000000000000fa0612d6c565b81600e546114229190612d54565b111561142d57600080fd5b80600e600082825461143f9190612d54565b90915550600090505b8181101561102b57600a805490600061146083612db8565b919050555061147a610d9a6007546001600160a01b031690565b8061148481612db8565b915050611448565b60606001805461082a90612cb9565b61102b3383836121f7565b6002600654036114f85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610922565b6002600655600082900361150b57600080fd5b60115442101561155d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720686173206e6f7420737461727465642028436f6d6d2900006044820152606401610922565b611587827f00000000000000000000000000000000000000000000000000b1a2bc2ec50000612e20565b3410156115ca5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f7567682070617965642160781b6044820152606401610922565b60125442111561186b5760135442101561161e5760405162461bcd60e51b81526020600482015260156024820152744d696e74696e67206973206e6f742061637469766560581b6044820152606401610922565b7f0000000000000000000000000000000000000000000000000000000000000ed882600b5461164d9190612d54565b11156116a65760405162461bcd60e51b815260206004820152602260248201527f436f6d6d756e69747920737570706c7920776f756c6420626520657863656564604482015261195960f21b6064820152608401610922565b6014544210156117cd5733600090815260156020526040902054156117335760405162461bcd60e51b815260206004820152603a60248201527f596f75206861766520616c7265616479206d696e74656420796f7572206c696d60448201527f69742c20706c6561736520636f6d65206261636b206c617465720000000000006064820152608401610922565b61173e6001336122c5565b7f00000000000000000000000000000000000000000000000000b1a2bc2ec500003411156117c857335b6001600160a01b03166108fc61179e7f00000000000000000000000000000000000000000000000000b1a2bc2ec5000034612d6c565b6040518115909202916000818181858888f193505050501580156117c6573d6000803e3d6000fd5b505b610e3c565b336000908152601560205260409020546005906117eb908490612d54565b111561182a5760405162461bcd60e51b815260206004820152600e60248201526d4c696d697420726561636865642160901b6044820152606401610922565b61183482336122c5565b61185e827f00000000000000000000000000000000000000000000000000b1a2bc2ec50000612e20565b3411156117c85733611768565b611877336002836120f6565b6118b45760405162461bcd60e51b815260206004820152600e60248201526d4163636573732064656e6965642160901b6044820152606401610922565b33600090815260166020526040902054156119255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c79206f6e65204e4654207065722077616c6c657420647572696e67207060448201526a1c9a5d985d19481b5a5b9d60aa1b6064820152608401610922565b7f000000000000000000000000000000000000000000000000000000000000076c600b5460016119559190612d54565b11156119af5760405162461bcd60e51b815260206004820152602360248201527f546f74616c206f662031393030204e46547320686173206265656e206d696e7460448201526265642160e81b6064820152608401610922565b6119b83361234f565b7f00000000000000000000000000000000000000000000000000b1a2bc2ec50000341115610e3c57336108fc611a0e7f00000000000000000000000000000000000000000000000000b1a2bc2ec5000034612d6c565b6040518115909202916000818181858888f19350505050158015611a36573d6000803e3d6000fd5b5050506001600655565b611a4a3383611e64565b611a665760405162461bcd60e51b815260040161092290612ced565b611a72848484846123ad565b50505050565b6000818152600260205260409020546060906001600160a01b0316611aaf5760405162461bcd60e51b815260040161092290612dd1565b60185460ff1615611b25576000611ac46123e0565b90506000611ad06123ef565b90506000825111611af05760405180602001604052806000815250611b1d565b81611afa856123fe565b82604051602001611b0d93929190612e3f565b6040516020818303038152906040525b949350505050565b60008281526008602052604090205460ff16600103611bd057601c8054611b4b90612cb9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7790612cb9565b8015611bc45780601f10611b9957610100808354040283529160200191611bc4565b820191906000526020600020905b815481529060010190602001808311611ba757829003601f168201915b50505050509050919050565b601b8054611b4b90612cb9565b919050565b6000601354421015611bf657506000919050565b6013544210158015611c09575060145442105b15611c32576001600160a01b038216600090815260156020526040902054610815906001612d6c565b6014544210611bdd576001600160a01b038216600090815260156020526040812054611c5f906005612d6c565b9050600b547f0000000000000000000000000000000000000000000000000000000000000ed8611c8f9190612d6c565b81111561081557600b54611cc3907f0000000000000000000000000000000000000000000000000000000000000ed8612d6c565b9392505050565b50919050565b6007546001600160a01b03163314611cfa5760405162461bcd60e51b815260040161092290612d83565b805161102b90601a906020840190612868565b6007546001600160a01b03163314611d375760405162461bcd60e51b815260040161092290612d83565b8151611d4a90601b906020850190612868565b508051610a5790601c906020840190612868565b6007546001600160a01b03163314611d885760405162461bcd60e51b815260040161092290612d83565b6001600160a01b038116611ded5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610922565b610ea9816121a5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e2b8261113a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611edd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610922565b6000611ee88361113a565b9050806001600160a01b0316846001600160a01b03161480611f2f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b1d5750836001600160a01b0316611f48846108ad565b6001600160a01b031614949350505050565b826001600160a01b0316611f6d8261113a565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610922565b6001600160a01b0382166120335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610922565b61203e600082611df6565b6001600160a01b0383166000908152600360205260408120805460019290612067908490612d6c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612095908490612d54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612103858561102f565b9050600061215e826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6009549091506001600160a01b031661217782866124ff565b6001600160a01b0316149695505050505050565b61102b82826040518060200160405280600081525061257e565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036122585760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610922565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038116600090815260156020526040812080548492906122ed908490612d54565b9250508190555081600b60008282546123069190612d54565b90915550600090505b82811015610a57576001600a600082825461232a9190612d54565b9250508190555061233d82600a5461218b565b8061234781612db8565b91505061230f565b6001600160a01b0381166000908152601660205260408120600190819055600b805491929091612380908490612d54565b925050819055506001600a600082825461239a9190612d54565b92505081905550610ea981600a5461218b565b6123b8848484611f5a565b6123c4848484846125b1565b611a725760405162461bcd60e51b815260040161092290612e82565b60606019805461082a90612cb9565b6060601a805461082a90612cb9565b6060816000036124255750506040805180820190915260018152600360fc1b602082015290565b8160005b811561244f578061243981612db8565b91506124489050600a83612eea565b9150612429565b60008167ffffffffffffffff81111561246a5761246a612a35565b6040519080825280601f01601f191660200182016040528015612494576020820181803683370190505b5090505b8415611b1d576124a9600183612d6c565b91506124b6600a86612efe565b6124c1906030612d54565b60f81b8183815181106124d6576124d6612f12565b60200101906001600160f81b031916908160001a9053506124f8600a86612eea565b9450612498565b60008060008061250e856126b2565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015612569573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6125888383612726565b61259560008484846125b1565b610a575760405162461bcd60e51b815260040161092290612e82565b60006001600160a01b0384163b156126a757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125f5903390899088908890600401612f28565b6020604051808303816000875af1925050508015612630575060408051601f3d908101601f1916820190925261262d91810190612f65565b60015b61268d573d80801561265e576040519150601f19603f3d011682016040523d82523d6000602084013e612663565b606091505b5080516000036126855760405162461bcd60e51b815260040161092290612e82565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b1d565b506001949350505050565b600080600083516041146127085760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610922565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b03821661277c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610922565b6000818152600260205260409020546001600160a01b0316156127e15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610922565b6001600160a01b038216600090815260036020526040812080546001929061280a908490612d54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461287490612cb9565b90600052602060002090601f01602090048101928261289657600085556128dc565b82601f106128af57805160ff19168380011785556128dc565b828001600101855582156128dc579182015b828111156128dc5782518255916020019190600101906128c1565b506128e89291506128ec565b5090565b5b808211156128e857600081556001016128ed565b6001600160e01b031981168114610ea957600080fd5b60006020828403121561292957600080fd5b8135611cc381612901565b60005b8381101561294f578181015183820152602001612937565b83811115611a725750506000910152565b60008151808452612978816020860160208601612934565b601f01601f19169290920160200192915050565b602081526000611cc36020830184612960565b6000602082840312156129b157600080fd5b5035919050565b80356001600160a01b0381168114611bdd57600080fd5b600080604083850312156129e257600080fd5b6129eb836129b8565b946020939093013593505050565b600080600060608486031215612a0e57600080fd5b612a17846129b8565b9250612a25602085016129b8565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612a5c57600080fd5b813567ffffffffffffffff80821115612a7757612a77612a35565b604051601f8301601f19908116603f01168101908282118183101715612a9f57612a9f612a35565b81604052838152866020858801011115612ab857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612aea57600080fd5b813567ffffffffffffffff811115612b0157600080fd5b611b1d84828501612a4b565b600060208284031215612b1f57600080fd5b611cc3826129b8565b80358015158114611bdd57600080fd5b600060208284031215612b4a57600080fd5b611cc382612b28565b60008060408385031215612b6657600080fd5b612b6f836129b8565b9150612b7d60208401612b28565b90509250929050565b60008060408385031215612b9957600080fd5b82359150602083013567ffffffffffffffff811115612bb757600080fd5b612bc385828601612a4b565b9150509250929050565b60008060008060808587031215612be357600080fd5b612bec856129b8565b9350612bfa602086016129b8565b925060408501359150606085013567ffffffffffffffff811115612c1d57600080fd5b612c2987828801612a4b565b91505092959194509250565b60008060408385031215612c4857600080fd5b823567ffffffffffffffff80821115612c6057600080fd5b612c6c86838701612a4b565b93506020850135915080821115612c8257600080fd5b50612bc385828601612a4b565b60008060408385031215612ca257600080fd5b612cab836129b8565b9150612b7d602084016129b8565b600181811c90821680612ccd57607f821691505b602082108103611cca57634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612d6757612d67612d3e565b500190565b600082821015612d7e57612d7e612d3e565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612dca57612dca612d3e565b5060010190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6000816000190483118215151615612e3a57612e3a612d3e565b500290565b60008451612e51818460208901612934565b845190830190612e65818360208901612934565b8451910190612e78818360208801612934565b0195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612ef957612ef9612ed4565b500490565b600082612f0d57612f0d612ed4565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5b90830184612960565b9695505050505050565b600060208284031215612f7757600080fd5b8151611cc38161290156fea26469706673582212204da384a52474e7eb3ae70006ce38a30f4423ed7dd33c7c55413832b9280602fe64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000470f6e8bbe1db5267bf8cebbb6a933c3518800000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _sys (address): 0x470f6E8bbe1Db5267bF8cEbBb6A933c351880000
Arg [1] : commURI (string):
Arg [2] : ultiURI (string):
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000470f6e8bbe1db5267bf8cebbb6a933c351880000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
34895:10943:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19949:305;;;;;;;;;;-1:-1:-1;19949:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;19949:305:0;;;;;;;;20894:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22454:221::-;;;;;;;;;;-1:-1:-1;22454:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;22454:221:0;1528:203:1;21977:411:0;;;;;;;;;;-1:-1:-1;21977:411:0;;;;;:::i;:::-;;:::i;:::-;;36732:95;;;;;;;;;;-1:-1:-1;36813:6:0;;36732:95;;;2319:25:1;;;2307:2;2292:18;36732:95:0;2173:177:1;23204:339:0;;;;;;;;;;-1:-1:-1;23204:339:0;;;;;:::i;:::-;;:::i;39474:917::-;;;;;;:::i;:::-;;:::i;42492:106::-;;;;;;;;;;;;;:::i;23614:185::-;;;;;;;;;;-1:-1:-1;23614:185:0;;;;;:::i;:::-;;:::i;42606:586::-;;;;;;;;;;-1:-1:-1;42606:586:0;;;;;:::i;:::-;;:::i;37720:120::-;;;;;;;;;;-1:-1:-1;37720:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;37810:22:0;37786:4;37810:22;;;:14;:22;;;;;;;;;37720:120;44899:149;;;;;;;;;;-1:-1:-1;44899:149:0;;;;;:::i;:::-;;:::i;42391:93::-;;;;;;;;;;-1:-1:-1;42391:93:0;;;;;:::i;:::-;;:::i;38608:217::-;;;;;;;;;;-1:-1:-1;38608:217:0;;;;;:::i;:::-;;:::i;:::-;;;4763:4:1;4751:17;;;4733:36;;4721:2;4706:18;38608:217:0;4591:184:1;43529:99:0;;;;;;;;;;-1:-1:-1;43529:99:0;;;;;:::i;:::-;;:::i;37848:126::-;;;;;;;;;;-1:-1:-1;37848:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;37937:24:0;37913:4;37937:24;;;:16;:24;;;;;;37965:1;37937:29;;37848:126;35950:46;;;;;;;;;;;;;;;;20588:239;;;;;;;;;;-1:-1:-1;20588:239:0;;;;;:::i;:::-;;:::i;38833:600::-;;;;;;;;;;;;;:::i;:::-;;;;5337:25:1;;;5393:2;5378:18;;5371:34;;;;5421:18;;;5414:34;5479:2;5464:18;;5457:34;5324:3;5309:19;38833:600:0;5106:391:1;43767:81:0;;;;;;;;;;-1:-1:-1;43767:81:0;;;;;:::i;:::-;;:::i;36056:45::-;;;;;;;;;;;;;;;;20318:208;;;;;;;;;;-1:-1:-1;20318:208:0;;;;;:::i;:::-;;:::i;11595:103::-;;;;;;;;;;;;;:::i;43200:321::-;;;;;;;;;;-1:-1:-1;43200:321:0;;;;;:::i;:::-;;:::i;35890:51::-;;;;;;;;;;;;;;;;10944:87;;;;;;;;;;-1:-1:-1;11017:6:0;;-1:-1:-1;;;;;11017:6:0;10944:87;;21063:104;;;;;;;;;;;;;:::i;22747:155::-;;;;;;;;;;-1:-1:-1;22747:155:0;;;;;:::i;:::-;;:::i;40400:1779::-;;;;;;:::i;:::-;;:::i;36952:107::-;;;;;;;;;;-1:-1:-1;37036:15:0;;36952:107;;23870:328;;;;;;;;;;-1:-1:-1;23870:328:0;;;;;:::i;:::-;;:::i;35830:53::-;;;;;;;;;;;;;;;;37067:645;;;;;;;;;;-1:-1:-1;37067:645:0;;;;;:::i;:::-;;:::i;35104:46::-;;;;;;;;;;-1:-1:-1;35104:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36003:44;;;;;;;;;;;;;;;;37982:618;;;;;;;;;;-1:-1:-1;37982:618:0;;;;;:::i;:::-;;:::i;43636:123::-;;;;;;;;;;-1:-1:-1;43636:123:0;;;;;:::i;:::-;;:::i;36108:43::-;;;;;;;;;;;;;;;;42223:160;;;;;;;;;;-1:-1:-1;42223:160:0;;;;;:::i;:::-;;:::i;22973:164::-;;;;;;;;;;-1:-1:-1;22973:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23094:25:0;;;23070:4;23094:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22973:164;11853:201;;;;;;;;;;-1:-1:-1;11853:201:0;;;;;:::i;:::-;;:::i;36835:109::-;;;;;;;;;;-1:-1:-1;36920:16:0;;36835:109;;19949:305;20051:4;-1:-1:-1;;;;;;20088:40:0;;-1:-1:-1;;;20088:40:0;;:105;;-1:-1:-1;;;;;;;20145:48:0;;-1:-1:-1;;;20145:48:0;20088:105;:158;;;-1:-1:-1;;;;;;;;;;13801:40:0;;;20210:36;20068:178;19949:305;-1:-1:-1;;19949:305:0:o;20894:100::-;20948:13;20981:5;20974:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20894:100;:::o;22454:221::-;22530:7;25797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25797:16:0;22550:73;;;;-1:-1:-1;;;22550:73:0;;8094:2:1;22550:73:0;;;8076:21:1;8133:2;8113:18;;;8106:30;8172:34;8152:18;;;8145:62;-1:-1:-1;;;8223:18:1;;;8216:42;8275:19;;22550:73:0;;;;;;;;;-1:-1:-1;22643:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22643:24:0;;22454:221::o;21977:411::-;22058:13;22074:23;22089:7;22074:14;:23::i;:::-;22058:39;;22122:5;-1:-1:-1;;;;;22116:11:0;:2;-1:-1:-1;;;;;22116:11:0;;22108:57;;;;-1:-1:-1;;;22108:57:0;;8507:2:1;22108:57:0;;;8489:21:1;8546:2;8526:18;;;8519:30;8585:34;8565:18;;;8558:62;-1:-1:-1;;;8636:18:1;;;8629:31;8677:19;;22108:57:0;8305:397:1;22108:57:0;2120:10;-1:-1:-1;;;;;22200:21:0;;;;:62;;-1:-1:-1;22225:37:0;22242:5;2120:10;22973:164;:::i;22225:37::-;22178:168;;;;-1:-1:-1;;;22178:168:0;;8909:2:1;22178:168:0;;;8891:21:1;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;9058:26;9038:18;;;9031:54;9102:19;;22178:168:0;8707:420:1;22178:168:0;22359:21;22368:2;22372:7;22359:8;:21::i;:::-;22047:341;21977:411;;:::o;23204:339::-;23399:41;2120:10;23432:7;23399:18;:41::i;:::-;23391:103;;;;-1:-1:-1;;;23391:103:0;;;;;;;:::i;:::-;23507:28;23517:4;23523:2;23527:7;23507:9;:28::i;39474:917::-;33948:1;34546:7;;:19;34538:63;;;;-1:-1:-1;;;34538:63:0;;9752:2:1;34538:63:0;;;9734:21:1;9791:2;9771:18;;;9764:30;9830:33;9810:18;;;9803:61;9881:18;;34538:63:0;9550:355:1;34538:63:0;33948:1;34679:7;:18;39582:25:::1;::::0;39563:15:::1;:44;;39555:92;;;::::0;-1:-1:-1;;;39555:92:0;;10112:2:1;39555:92:0::1;::::0;::::1;10094:21:1::0;10151:2;10131:18;;;10124:30;10190:34;10170:18;;;10163:62;-1:-1:-1;;;10241:18:1;;;10234:33;10284:19;;39555:92:0::1;9910:399:1::0;39555:92:0::1;39685:23;;39666:15;:42;;39658:83;;;::::0;-1:-1:-1;;;39658:83:0;;10516:2:1;39658:83:0::1;::::0;::::1;10498:21:1::0;10555:2;10535:18;;;10528:30;10594;10574:18;;;10567:58;10642:18;;39658:83:0::1;10314:352:1::0;39658:83:0::1;39760:28;2120:10:::0;39781:1:::1;39784:3;39760:6;:28::i;:::-;39752:61;;;::::0;-1:-1:-1;;;39752:61:0;;10873:2:1;39752:61:0::1;::::0;::::1;10855:21:1::0;10912:2;10892:18;;;10885:30;-1:-1:-1;;;10931:18:1;;;10924:50;10991:18;;39752:61:0::1;10671:344:1::0;39752:61:0::1;39850:9;39832:14;:27;;39824:56;;;::::0;-1:-1:-1;;;39824:56:0;;11222:2:1;39824:56:0::1;::::0;::::1;11204:21:1::0;11261:2;11241:18;;;11234:30;-1:-1:-1;;;11280:18:1;;;11273:46;11336:18;;39824:56:0::1;11020:340:1::0;39824:56:0::1;39922:17;39899:15;;39917:1;39899:19;;;;:::i;:::-;:40;;39891:95;;;::::0;-1:-1:-1;;;39891:95:0;;11832:2:1;39891:95:0::1;::::0;::::1;11814:21:1::0;11871:2;11851:18;;;11844:30;11910:34;11890:18;;;11883:62;-1:-1:-1;;;11961:18:1;;;11954:40;12011:19;;39891:95:0::1;11630:406:1::0;39891:95:0::1;2120:10:::0;40006:28:::1;::::0;;;:14:::1;:28;::::0;;;;;::::1;;40005:29;39997:79;;;::::0;-1:-1:-1;;;39997:79:0;;12243:2:1;39997:79:0::1;::::0;::::1;12225:21:1::0;12282:2;12262:18;;;12255:30;12321:34;12301:18;;;12294:62;-1:-1:-1;;;12372:18:1;;;12365:35;12417:19;;39997:79:0::1;12041:401:1::0;39997:79:0::1;2120:10:::0;40087:28:::1;::::0;;;:14:::1;:28;::::0;;;;:35;;-1:-1:-1;;40087:35:0::1;40118:4;40087:35:::0;;::::1;::::0;;;40133:15:::1;:20:::0;;40118:4;;40133:15;;:20:::1;::::0;40118:4;;40133:20:::1;:::i;:::-;;;;;;;;40174:1;40164:6;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;40186:31:0::1;::::0;-1:-1:-1;2120:10:0;40196:12:::1;40210:6;;40186:9;:31::i;:::-;40238:6;::::0;40228:17:::1;::::0;;;:9:::1;:17;::::0;;;;:28;;-1:-1:-1;;40228:28:0::1;40255:1;40228:28;::::0;;40283:14:::1;40271:9;:26;40267:117;;;2120:10:::0;40314:58:::1;40345:26;40357:14;40345:9;:26;:::i;:::-;40314:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;40267:117;-1:-1:-1::0;33904:1:0;34858:7;:22;39474:917::o;42492:106::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;11017:6;;42542:48:::1;::::0;-1:-1:-1;;;;;11017:6:0;;;;42568:21:::1;42542:48:::0;::::1;;;::::0;::::1;::::0;;;42568:21;11017:6;42542:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42492:106::o:0;23614:185::-;23752:39;23769:4;23775:2;23779:7;23752:39;;;;;;;;;;;;:16;:39::i;42606:586::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42701:23:::1;;42682:15;:42;42678:302;;42783:32;42798:17;42783:12;:32;:::i;:::-;42773:6;42749:21;;:30;;;;:::i;:::-;:66;;42741:75;;;::::0;::::1;;42678:302;;;42849:17;42909:15;;42885:21;;42870:12;:36;;;;:::i;:::-;:54;;;;:::i;:::-;42849:76;;42958:9;42948:6;:19;;42940:28;;;::::0;::::1;;42834:146;42678:302;43015:6;42990:21;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;43037:9:0::1;::::0;-1:-1:-1;43032:153:0::1;43052:6;43048:1;:10;43032:153;;;43080:6;:9:::0;;;:6:::1;:9;::::0;::::1;:::i;:::-;;;;;;43104:26;43114:7;11017:6:::0;;-1:-1:-1;;;;;11017:6:0;;10944:87;43104:26:::1;43155:6;::::0;43145:17:::1;::::0;;;:9:::1;:17;::::0;;;;:28;;-1:-1:-1;;43145:28:0::1;43172:1;43145:28;::::0;;43060:3;::::1;::::0;::::1;:::i;:::-;;;;43032:153;;;;42606:586:::0;:::o;44899:149::-;45010:29;;-1:-1:-1;;13255:2:1;13251:15;;;13247:53;45010:29:0;;;13235:66:1;13317:12;;;13310:28;;;44973:7:0;;13354:12:1;;45010:29:0;;;;;;;;;;;;45000:40;;;;;;44993:47;;44899:149;;;;:::o;42391:93::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42458:10:::1;:18:::0;;-1:-1:-1;;42458:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42391:93::o;38608:217::-;38680:5;25797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25797:16:0;38698:76;;;;-1:-1:-1;;;38698:76:0;;;;;;;:::i;:::-;-1:-1:-1;38792:18:0;;;;:9;:18;;;;;:25;;;;38608:217::o;43529:99::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;43602:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;20588:239::-:0;20660:7;20696:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20696:16:0;;20723:73;;;;-1:-1:-1;;;20723:73:0;;13995:2:1;20723:73:0;;;13977:21:1;14034:2;14014:18;;;14007:30;14073:34;14053:18;;;14046:62;-1:-1:-1;;;14124:18:1;;;14117:39;14173:19;;20723:73:0;13793:405:1;38833:600:0;38898:17;38917:16;38935:15;38952:23;39011;;38992:15;:42;38988:122;;39083:15;;39063:35;;:17;:35;:::i;:::-;39051:47;;38988:122;39143:16;;39124:15;:35;39120:114;;39206:16;;39187:35;;:16;:35;:::i;:::-;39176:46;;39120:114;39267:17;;39248:15;:36;39244:116;;39332:16;;39311:37;;:18;:37;:::i;:::-;39301:47;;39244:116;39409:16;;39388:37;;:18;:37;:::i;:::-;39370:55;;38833:600;;;;:::o;43767:81::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;43830:3:::1;:10:::0;;-1:-1:-1;;;;;;43830:10:0::1;-1:-1:-1::0;;;;;43830:10:0;;;::::1;::::0;;;::::1;::::0;;43767:81::o;20318:208::-;20390:7;-1:-1:-1;;;;;20418:19:0;;20410:74;;;;-1:-1:-1;;;20410:74:0;;14405:2:1;20410:74:0;;;14387:21:1;14444:2;14424:18;;;14417:30;14483:34;14463:18;;;14456:62;-1:-1:-1;;;14534:18:1;;;14527:40;14584:19;;20410:74:0;14203:406:1;20410:74:0;-1:-1:-1;;;;;;20502:16:0;;;;;:9;:16;;;;;;;20318:208::o;11595:103::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;11660:30:::1;11687:1;11660:18;:30::i;:::-;11595:103::o:0;43200:321::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;43315:34:::1;43331:18;43315:13;:34;:::i;:::-;43305:6;43280:22;;:31;;;;:::i;:::-;:69;;43272:78;;;::::0;::::1;;43387:6;43361:22;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;43409:9:0::1;::::0;-1:-1:-1;43404:110:0::1;43424:6;43420:1;:10;43404:110;;;43452:6;:9:::0;;;:6:::1;:9;::::0;::::1;:::i;:::-;;;;;;43476:26;43486:7;11017:6:::0;;-1:-1:-1;;;;;11017:6:0;;10944:87;43476:26:::1;43432:3:::0;::::1;::::0;::::1;:::i;:::-;;;;43404:110;;21063:104:::0;21119:13;21152:7;21145:14;;;;;:::i;22747:155::-;22842:52;2120:10;22875:8;22885;22842:18;:52::i;40400:1779::-;33948:1;34546:7;;:19;34538:63;;;;-1:-1:-1;;;34538:63:0;;9752:2:1;34538:63:0;;;9734:21:1;9791:2;9771:18;;;9764:30;9830:33;9810:18;;;9803:61;9881:18;;34538:63:0;9550:355:1;34538:63:0;33948:1;34679:7;:18;40516:1:::1;40506:11:::0;;;40498:20:::1;;;::::0;::::1;;40556:18;;40537:15;:37;;40529:80;;;::::0;-1:-1:-1;;;40529:80:0;;14816:2:1;40529:80:0::1;::::0;::::1;14798:21:1::0;14855:2;14835:18;;;14828:30;14894:32;14874:18;;;14867:60;14944:18;;40529:80:0::1;14614:354:1::0;40529:80:0::1;40641:24;40659:6:::0;40641:15:::1;:24;:::i;:::-;40628:9;:37;;40620:67;;;::::0;-1:-1:-1;;;40620:67:0;;15348:2:1;40620:67:0::1;::::0;::::1;15330:21:1::0;15387:2;15367:18;;;15360:30;-1:-1:-1;;;15406:18:1;;;15399:47;15463:18;;40620:67:0::1;15146:341:1::0;40620:67:0::1;40720:16;;40702:15;:34;40698:1474;;;40795:17;;40776:15;:36;;40768:70;;;::::0;-1:-1:-1;;;40768:70:0;;15694:2:1;40768:70:0::1;::::0;::::1;15676:21:1::0;15733:2;15713:18;;;15706:30;-1:-1:-1;;;15752:18:1;;;15745:51;15813:18;;40768:70:0::1;15492:345:1::0;40768:70:0::1;40890:18;40880:6;40861:16;;:25;;;;:::i;:::-;:47;;40853:94;;;::::0;-1:-1:-1;;;40853:94:0;;16044:2:1;40853:94:0::1;::::0;::::1;16026:21:1::0;16083:2;16063:18;;;16056:30;16122:34;16102:18;;;16095:62;-1:-1:-1;;;16173:18:1;;;16166:32;16215:19;;40853:94:0::1;15842:398:1::0;40853:94:0::1;40984:15;;40966;:33;40962:704;;;2120:10:::0;41028:29:::1;::::0;;;:15:::1;:29;::::0;;;;;:34;41020:105:::1;;;::::0;-1:-1:-1;;;41020:105:0;;16447:2:1;41020:105:0::1;::::0;::::1;16429:21:1::0;16486:2;16466:18;;;16459:30;16525:34;16505:18;;;16498:62;16596:28;16576:18;;;16569:56;16642:19;;41020:105:0::1;16245:422:1::0;41020:105:0::1;41144:28;41156:1;2120:10:::0;41144:11:::1;:28::i;:::-;41207:15;41195:9;:27;41191:135;;;2120:10:::0;41255:12:::1;-1:-1:-1::0;;;;;41247:30:0::1;:59;41278:27;41290:15;41278:9;:27;:::i;:::-;41247:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41191:135;40698:1474;;40962:704;2120:10:::0;41374:29:::1;::::0;;;:15:::1;:29;::::0;;;;;41416:1:::1;::::0;41374:38:::1;::::0;41406:6;;41374:38:::1;:::i;:::-;:43;;41366:70;;;::::0;-1:-1:-1;;;41366:70:0;;16874:2:1;41366:70:0::1;::::0;::::1;16856:21:1::0;16913:2;16893:18;;;16886:30;-1:-1:-1;;;16932:18:1;;;16925:44;16986:18;;41366:70:0::1;16672:338:1::0;41366:70:0::1;41455:33;41467:6:::0;2120:10;41144:11:::1;:28::i;41455:33::-;41523:24;41541:6:::0;41523:15:::1;:24;:::i;:::-;41511:9;:36;41507:144;;;2120:10:::0;41580:12:::1;2040:98:::0;40698:1474:::1;41722:28;2120:10:::0;41743:1:::1;41746:3;41722:6;:28::i;:::-;41714:55;;;::::0;-1:-1:-1;;;41714:55:0;;17217:2:1;41714:55:0::1;::::0;::::1;17199:21:1::0;17256:2;17236:18;;;17229:30;-1:-1:-1;;;17275:18:1;;;17268:44;17329:18;;41714:55:0::1;17015:338:1::0;41714:55:0::1;2120:10:::0;41792:30:::1;::::0;;;:16:::1;:30;::::0;;;;;:35;41784:91:::1;;;::::0;-1:-1:-1;;;41784:91:0;;17560:2:1;41784:91:0::1;::::0;::::1;17542:21:1::0;17599:2;17579:18;;;17572:30;17638:34;17618:18;;;17611:62;-1:-1:-1;;;17689:18:1;;;17682:41;17740:19;;41784:91:0::1;17358:407:1::0;41784:91:0::1;41922:16;41898;;41917:1;41898:20;;;;:::i;:::-;:40;;41890:88;;;::::0;-1:-1:-1;;;41890:88:0;;17972:2:1;41890:88:0::1;::::0;::::1;17954:21:1::0;18011:2;17991:18;;;17984:30;18050:34;18030:18;;;18023:62;-1:-1:-1;;;18101:18:1;;;18094:33;18144:19;;41890:88:0::1;17770:399:1::0;41890:88:0::1;41993:26;2120:10:::0;41993:12:::1;:26::i;:::-;42050:15;42038:9;:27;42034:127;;;2120:10:::0;42086:59:::1;42117:27;42129:15;42117:9;:27;:::i;:::-;42086:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;-1:-1:-1::0;;33904:1:0;34858:7;:22;40400:1779::o;23870:328::-;24045:41;2120:10;24078:7;24045:18;:41::i;:::-;24037:103;;;;-1:-1:-1;;;24037:103:0;;;;;;;:::i;:::-;24151:39;24165:4;24171:2;24175:7;24184:5;24151:13;:39::i;:::-;23870:328;;;;:::o;37067:645::-;25773:4;25797:16;;;:7;:16;;;;;;37140:13;;-1:-1:-1;;;;;25797:16:0;37166:76;;;;-1:-1:-1;;;37166:76:0;;;;;;;:::i;:::-;37257:10;;;;37253:442;;;37284:21;37308:10;:8;:10::i;:::-;37284:34;;37333:27;37363:16;:14;:16::i;:::-;37333:46;;37425:1;37407:7;37401:21;:25;:101;;;;;;;;;;;;;;;;;37453:7;37462:18;:7;:16;:18::i;:::-;37482:13;37436:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37401:101;37394:108;37067:645;-1:-1:-1;;;;37067:645:0:o;37253:442::-;37539:18;;;;:9;:18;;;;;:25;;;;:30;37535:149;;37597:11;37590:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37067:645;;;:::o;37535:149::-;37656:12;37649:19;;;;;:::i;37535:149::-;37067:645;;;:::o;37982:618::-;38044:7;38086:17;;38068:15;:35;38064:529;;;-1:-1:-1;38127:1:0;;37982:618;-1:-1:-1;37982:618:0:o;38064:529::-;38169:17;;38150:15;:36;;:73;;;;;38208:15;;38190;:33;38150:73;38146:447;;;-1:-1:-1;;;;;38251:23:0;;;;;;:15;:23;;;;;;38247:27;;:1;:27;:::i;38146:447::-;38315:15;;38296;:34;38292:301;;-1:-1:-1;;;;;38365:23:0;;38347:11;38365:23;;;:15;:23;;;;;;38361:27;;:1;:27;:::i;:::-;38347:41;;38434:16;;38413:18;:37;;;;:::i;:::-;38407:3;:43;38403:179;;;38499:16;;38478:37;;:18;:37;:::i;:::-;38471:44;37982:618;-1:-1:-1;;;37982:618:0:o;38403:179::-;38332:261;37982:618;;;:::o;43636:123::-;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;43721:30;;::::1;::::0;:14:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;42223:160::-:0;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;42321:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;42354:21:0;;::::1;::::0;:11:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;11853:201::-:0;11017:6;;-1:-1:-1;;;;;11017:6:0;2120:10;11164:23;11156:68;;;;-1:-1:-1;;;11156:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11942:22:0;::::1;11934:73;;;::::0;-1:-1:-1;;;11934:73:0;;19045:2:1;11934:73:0::1;::::0;::::1;19027:21:1::0;19084:2;19064:18;;;19057:30;19123:34;19103:18;;;19096:62;-1:-1:-1;;;19174:18:1;;;19167:36;19220:19;;11934:73:0::1;18843:402:1::0;11934:73:0::1;12018:28;12037:8;12018:18;:28::i;29854:174::-:0;29929:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29929:29:0;-1:-1:-1;;;;;29929:29:0;;;;;;;;:24;;29983:23;29929:24;29983:14;:23::i;:::-;-1:-1:-1;;;;;29974:46:0;;;;;;;;;;;29854:174;;:::o;26002:348::-;26095:4;25797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25797:16:0;26112:73;;;;-1:-1:-1;;;26112:73:0;;19452:2:1;26112:73:0;;;19434:21:1;19491:2;19471:18;;;19464:30;19530:34;19510:18;;;19503:62;-1:-1:-1;;;19581:18:1;;;19574:42;19633:19;;26112:73:0;19250:408:1;26112:73:0;26196:13;26212:23;26227:7;26212:14;:23::i;:::-;26196:39;;26265:5;-1:-1:-1;;;;;26254:16:0;:7;-1:-1:-1;;;;;26254:16:0;;:52;;;-1:-1:-1;;;;;;23094:25:0;;;23070:4;23094:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26274:32;26254:87;;;;26334:7;-1:-1:-1;;;;;26310:31:0;:20;26322:7;26310:11;:20::i;:::-;-1:-1:-1;;;;;26310:31:0;;26246:96;26002:348;-1:-1:-1;;;;26002:348:0:o;29111:625::-;29270:4;-1:-1:-1;;;;;29243:31:0;:23;29258:7;29243:14;:23::i;:::-;-1:-1:-1;;;;;29243:31:0;;29235:81;;;;-1:-1:-1;;;29235:81:0;;19865:2:1;29235:81:0;;;19847:21:1;19904:2;19884:18;;;19877:30;19943:34;19923:18;;;19916:62;-1:-1:-1;;;19994:18:1;;;19987:35;20039:19;;29235:81:0;19663:401:1;29235:81:0;-1:-1:-1;;;;;29335:16:0;;29327:65;;;;-1:-1:-1;;;29327:65:0;;20271:2:1;29327:65:0;;;20253:21:1;20310:2;20290:18;;;20283:30;20349:34;20329:18;;;20322:62;-1:-1:-1;;;20400:18:1;;;20393:34;20444:19;;29327:65:0;20069:400:1;29327:65:0;29509:29;29526:1;29530:7;29509:8;:29::i;:::-;-1:-1:-1;;;;;29551:15:0;;;;;;:9;:15;;;;;:20;;29570:1;;29551:15;:20;;29570:1;;29551:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29582:13:0;;;;;;:9;:13;;;;;:18;;29599:1;;29582:13;:18;;29599:1;;29582:18;:::i;:::-;;;;-1:-1:-1;;29611:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29611:21:0;-1:-1:-1;;;;;29611:21:0;;;;;;;;;29650:27;;29611:16;;29650:27;;;;;;;22047:341;21977:411;;:::o;44588:303::-;44674:4;44691:19;44713:27;44728:4;44734:5;44713:14;:27::i;:::-;44691:49;;44751:28;44782:36;44806:11;45171:66;;21995::1;45171::0;;;21983:79:1;22078:12;;;22071:28;;;45134:7:0;;22115:12:1;;45171:66:0;;;;;;;;;;;;45161:77;;;;;;45154:84;;45056:190;;;;44782:36;44880:3;;44751:67;;-1:-1:-1;;;;;;44880:3:0;44836:40;44751:67;44872:3;44836:13;:40::i;:::-;-1:-1:-1;;;;;44836:47:0;;;44588:303;-1:-1:-1;;;;;;44588:303:0:o;26692:110::-;26768:26;26778:2;26782:7;26768:26;;;;;;;;;;;;:9;:26::i;12214:191::-;12307:6;;;-1:-1:-1;;;;;12324:17:0;;;-1:-1:-1;;;;;;12324:17:0;;;;;;;12357:40;;12307:6;;;12324:17;12307:6;;12357:40;;12288:16;;12357:40;12277:128;12214:191;:::o;30170:315::-;30325:8;-1:-1:-1;;;;;30316:17:0;:5;-1:-1:-1;;;;;30316:17:0;;30308:55;;;;-1:-1:-1;;;30308:55:0;;20676:2:1;30308:55:0;;;20658:21:1;20715:2;20695:18;;;20688:30;20754:27;20734:18;;;20727:55;20799:18;;30308:55:0;20474:349:1;30308:55:0;-1:-1:-1;;;;;30374:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30374:46:0;;;;;;;;;;30436:41;;540::1;;;30436::0;;513:18:1;30436:41:0;;;;;;;30170:315;;;:::o;44314:266::-;-1:-1:-1;;;;;44385:21:0;;;;;;:15;:21;;;;;:31;;44410:6;;44385:21;:31;;44410:6;;44385:31;:::i;:::-;;;;;;;;44447:6;44427:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;44469:9:0;;-1:-1:-1;44464:109:0;44484:6;44480:1;:10;44464:109;;;44522:1;44512:6;;:11;;;;;;;:::i;:::-;;;;;;;;44538:23;44548:4;44554:6;;44538:9;:23::i;:::-;44492:3;;;;:::i;:::-;;;;44464:109;;44128:178;-1:-1:-1;;;;;44184:22:0;;;;;;:16;:22;;;;;44209:1;44184:26;;;;44221:16;:21;;44209:1;;44221:16;;:21;;44209:1;;44221:21;:::i;:::-;;;;;;;;44263:1;44253:6;;:11;;;;;;;:::i;:::-;;;;;;;;44275:23;44285:4;44291:6;;44275:9;:23::i;25080:315::-;25237:28;25247:4;25253:2;25257:7;25237:9;:28::i;:::-;25284:48;25307:4;25313:2;25317:7;25326:5;25284:22;:48::i;:::-;25276:111;;;;-1:-1:-1;;;25276:111:0;;;;;;;:::i;43891:109::-;43951:13;43984:8;43977:15;;;;;:::i;44008:112::-;44065:13;44098:14;44091:21;;;;;:::i;248:723::-;304:13;525:5;534:1;525:10;521:53;;-1:-1:-1;;552:10:0;;;;;;;;;;;;-1:-1:-1;;;552:10:0;;;;;248:723::o;521:53::-;599:5;584:12;640:78;647:9;;640:78;;673:8;;;;:::i;:::-;;-1:-1:-1;696:10:0;;-1:-1:-1;704:2:0;696:10;;:::i;:::-;;;640:78;;;728:19;760:6;750:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;750:17:0;;728:39;;778:154;785:10;;778:154;;812:11;822:1;812:11;;:::i;:::-;;-1:-1:-1;881:10:0;889:2;881:5;:10;:::i;:::-;868:24;;:2;:24;:::i;:::-;855:39;;838:6;845;838:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;838:56:0;;;;;;;;-1:-1:-1;909:11:0;918:2;909:11;;:::i;:::-;;;778:154;;45254:249;45356:7;45377:9;45388;45399:7;45410:26;45425:10;45410:14;:26::i;:::-;45454:41;;;;;;;;;;;;22365:25:1;;;22438:4;22426:17;;22406:18;;;22399:45;;;;22460:18;;;22453:34;;;22503:18;;;22496:34;;;45376:60:0;;-1:-1:-1;45376:60:0;;-1:-1:-1;45376:60:0;-1:-1:-1;45454:41:0;;22337:19:1;;45454:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45454:41:0;;-1:-1:-1;;45454:41:0;;;45254:249;-1:-1:-1;;;;;;;45254:249:0:o;27029:321::-;27159:18;27165:2;27169:7;27159:5;:18::i;:::-;27210:54;27241:1;27245:2;27249:7;27258:5;27210:22;:54::i;:::-;27188:154;;;;-1:-1:-1;;;27188:154:0;;;;;;;:::i;31050:799::-;31205:4;-1:-1:-1;;;;;31226:13:0;;3557:19;:23;31222:620;;31262:72;;-1:-1:-1;;;31262:72:0;;-1:-1:-1;;;;;31262:36:0;;;;;:72;;2120:10;;31313:4;;31319:7;;31328:5;;31262:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31262:72:0;;;;;;;;-1:-1:-1;;31262:72:0;;;;;;;;;;;;:::i;:::-;;;31258:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31504:6;:13;31521:1;31504:18;31500:272;;31547:60;;-1:-1:-1;;;31547:60:0;;;;;;;:::i;31500:272::-;31722:6;31716:13;31707:6;31703:2;31699:15;31692:38;31258:529;-1:-1:-1;;;;;;31385:51:0;-1:-1:-1;;;31385:51:0;;-1:-1:-1;31378:58:0;;31222:620;-1:-1:-1;31826:4:0;31050:799;;;;;;:::o;45511:322::-;45576:9;45587;45598:7;45626:3;:10;45640:2;45626:16;45618:53;;;;-1:-1:-1;;;45618:53:0;;23491:2:1;45618:53:0;;;23473:21:1;23530:2;23510:18;;;23503:30;23569:26;23549:18;;;23542:54;23613:18;;45618:53:0;23289:348:1;45618:53:0;-1:-1:-1;;;45726:2:0;45717:12;;45711:19;45764:2;45755:12;;45749:19;45810:2;45801:12;;;45795:19;45711;;45792:1;45787:28;;;;;45511:322::o;27686:439::-;-1:-1:-1;;;;;27766:16:0;;27758:61;;;;-1:-1:-1;;;27758:61:0;;23844:2:1;27758:61:0;;;23826:21:1;;;23863:18;;;23856:30;23922:34;23902:18;;;23895:62;23974:18;;27758:61:0;23642:356:1;27758:61:0;25773:4;25797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25797:16:0;:30;27830:58;;;;-1:-1:-1;;;27830:58:0;;24205:2:1;27830:58:0;;;24187:21:1;24244:2;24224:18;;;24217:30;24283;24263:18;;;24256:58;24331:18;;27830:58:0;24003:352:1;27830:58:0;-1:-1:-1;;;;;27959:13:0;;;;;;:9;:13;;;;;:18;;27976:1;;27959:13;:18;;27976:1;;27959:18;:::i;:::-;;;;-1:-1:-1;;27988:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27988:21:0;-1:-1:-1;;;;;27988:21:0;;;;;;;;28027:33;;27988:16;;;28027:33;;27988:16;;28027:33;43032:153:::1;42606:586:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:127::-;2749:10;2744:3;2740:20;2737:1;2730:31;2780:4;2777:1;2770:15;2804:4;2801:1;2794:15;2820:718;2862:5;2915:3;2908:4;2900:6;2896:17;2892:27;2882:55;;2933:1;2930;2923:12;2882:55;2969:6;2956:20;2995:18;3032:2;3028;3025:10;3022:36;;;3038:18;;:::i;:::-;3113:2;3107:9;3081:2;3167:13;;-1:-1:-1;;3163:22:1;;;3187:2;3159:31;3155:40;3143:53;;;3211:18;;;3231:22;;;3208:46;3205:72;;;3257:18;;:::i;:::-;3297:10;3293:2;3286:22;3332:2;3324:6;3317:18;3378:3;3371:4;3366:2;3358:6;3354:15;3350:26;3347:35;3344:55;;;3395:1;3392;3385:12;3344:55;3459:2;3452:4;3444:6;3440:17;3433:4;3425:6;3421:17;3408:54;3506:1;3499:4;3494:2;3486:6;3482:15;3478:26;3471:37;3526:6;3517:15;;;;;;2820:718;;;;:::o;3543:320::-;3611:6;3664:2;3652:9;3643:7;3639:23;3635:32;3632:52;;;3680:1;3677;3670:12;3632:52;3720:9;3707:23;3753:18;3745:6;3742:30;3739:50;;;3785:1;3782;3775:12;3739:50;3808:49;3849:7;3840:6;3829:9;3825:22;3808:49;:::i;3868:186::-;3927:6;3980:2;3968:9;3959:7;3955:23;3951:32;3948:52;;;3996:1;3993;3986:12;3948:52;4019:29;4038:9;4019:29;:::i;4241:160::-;4306:20;;4362:13;;4355:21;4345:32;;4335:60;;4391:1;4388;4381:12;4406:180;4462:6;4515:2;4503:9;4494:7;4490:23;4486:32;4483:52;;;4531:1;4528;4521:12;4483:52;4554:26;4570:9;4554:26;:::i;5502:254::-;5567:6;5575;5628:2;5616:9;5607:7;5603:23;5599:32;5596:52;;;5644:1;5641;5634:12;5596:52;5667:29;5686:9;5667:29;:::i;:::-;5657:39;;5715:35;5746:2;5735:9;5731:18;5715:35;:::i;:::-;5705:45;;5502:254;;;;;:::o;5761:388::-;5838:6;5846;5899:2;5887:9;5878:7;5874:23;5870:32;5867:52;;;5915:1;5912;5905:12;5867:52;5951:9;5938:23;5928:33;;6012:2;6001:9;5997:18;5984:32;6039:18;6031:6;6028:30;6025:50;;;6071:1;6068;6061:12;6025:50;6094:49;6135:7;6126:6;6115:9;6111:22;6094:49;:::i;:::-;6084:59;;;5761:388;;;;;:::o;6154:537::-;6249:6;6257;6265;6273;6326:3;6314:9;6305:7;6301:23;6297:33;6294:53;;;6343:1;6340;6333:12;6294:53;6366:29;6385:9;6366:29;:::i;:::-;6356:39;;6414:38;6448:2;6437:9;6433:18;6414:38;:::i;:::-;6404:48;;6499:2;6488:9;6484:18;6471:32;6461:42;;6554:2;6543:9;6539:18;6526:32;6581:18;6573:6;6570:30;6567:50;;;6613:1;6610;6603:12;6567:50;6636:49;6677:7;6668:6;6657:9;6653:22;6636:49;:::i;:::-;6626:59;;;6154:537;;;;;;;:::o;6696:541::-;6784:6;6792;6845:2;6833:9;6824:7;6820:23;6816:32;6813:52;;;6861:1;6858;6851:12;6813:52;6901:9;6888:23;6930:18;6971:2;6963:6;6960:14;6957:34;;;6987:1;6984;6977:12;6957:34;7010:49;7051:7;7042:6;7031:9;7027:22;7010:49;:::i;:::-;7000:59;;7112:2;7101:9;7097:18;7084:32;7068:48;;7141:2;7131:8;7128:16;7125:36;;;7157:1;7154;7147:12;7125:36;;7180:51;7223:7;7212:8;7201:9;7197:24;7180:51;:::i;7242:260::-;7310:6;7318;7371:2;7359:9;7350:7;7346:23;7342:32;7339:52;;;7387:1;7384;7377:12;7339:52;7410:29;7429:9;7410:29;:::i;:::-;7400:39;;7458:38;7492:2;7481:9;7477:18;7458:38;:::i;7507:380::-;7586:1;7582:12;;;;7629;;;7650:61;;7704:4;7696:6;7692:17;7682:27;;7650:61;7757:2;7749:6;7746:14;7726:18;7723:38;7720:161;;7803:10;7798:3;7794:20;7791:1;7784:31;7838:4;7835:1;7828:15;7866:4;7863:1;7856:15;9132:413;9334:2;9316:21;;;9373:2;9353:18;;;9346:30;9412:34;9407:2;9392:18;;9385:62;-1:-1:-1;;;9478:2:1;9463:18;;9456:47;9535:3;9520:19;;9132:413::o;11365:127::-;11426:10;11421:3;11417:20;11414:1;11407:31;11457:4;11454:1;11447:15;11481:4;11478:1;11471:15;11497:128;11537:3;11568:1;11564:6;11561:1;11558:13;11555:39;;;11574:18;;:::i;:::-;-1:-1:-1;11610:9:1;;11497:128::o;12447:125::-;12487:4;12515:1;12512;12509:8;12506:34;;;12520:18;;:::i;:::-;-1:-1:-1;12557:9:1;;12447:125::o;12577:356::-;12779:2;12761:21;;;12798:18;;;12791:30;12857:34;12852:2;12837:18;;12830:62;12924:2;12909:18;;12577:356::o;12938:135::-;12977:3;12998:17;;;12995:43;;13018:18;;:::i;:::-;-1:-1:-1;13065:1:1;13054:13;;12938:135::o;13377:411::-;13579:2;13561:21;;;13618:2;13598:18;;;13591:30;13657:34;13652:2;13637:18;;13630:62;-1:-1:-1;;;13723:2:1;13708:18;;13701:45;13778:3;13763:19;;13377:411::o;14973:168::-;15013:7;15079:1;15075;15071:6;15067:14;15064:1;15061:21;15056:1;15049:9;15042:17;15038:45;15035:71;;;15086:18;;:::i;:::-;-1:-1:-1;15126:9:1;;14973:168::o;18174:664::-;18401:3;18439:6;18433:13;18455:53;18501:6;18496:3;18489:4;18481:6;18477:17;18455:53;:::i;:::-;18571:13;;18530:16;;;;18593:57;18571:13;18530:16;18627:4;18615:17;;18593:57;:::i;:::-;18717:13;;18672:20;;;18739:57;18717:13;18672:20;18773:4;18761:17;;18739:57;:::i;:::-;18812:20;;18174:664;-1:-1:-1;;;;;18174:664:1:o;20828:414::-;21030:2;21012:21;;;21069:2;21049:18;;;21042:30;21108:34;21103:2;21088:18;;21081:62;-1:-1:-1;;;21174:2:1;21159:18;;21152:48;21232:3;21217:19;;20828:414::o;21247:127::-;21308:10;21303:3;21299:20;21296:1;21289:31;21339:4;21336:1;21329:15;21363:4;21360:1;21353:15;21379:120;21419:1;21445;21435:35;;21450:18;;:::i;:::-;-1:-1:-1;21484:9:1;;21379:120::o;21504:112::-;21536:1;21562;21552:35;;21567:18;;:::i;:::-;-1:-1:-1;21601:9:1;;21504:112::o;21621:127::-;21682:10;21677:3;21673:20;21670:1;21663:31;21713:4;21710:1;21703:15;21737:4;21734:1;21727:15;22541:489;-1:-1:-1;;;;;22810:15:1;;;22792:34;;22862:15;;22857:2;22842:18;;22835:43;22909:2;22894:18;;22887:34;;;22957:3;22952:2;22937:18;;22930:31;;;22735:4;;22978:46;;23004:19;;22996:6;22978:46;:::i;:::-;22970:54;22541:489;-1:-1:-1;;;;;;22541:489:1:o;23035:249::-;23104:6;23157:2;23145:9;23136:7;23132:23;23128:32;23125:52;;;23173:1;23170;23163:12;23125:52;23205:9;23199:16;23224:30;23248:5;23224:30;:::i
Swarm Source
ipfs://4da384a52474e7eb3ae70006ce38a30f4423ed7dd33c7c55413832b9280602fe
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.