Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 187 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Retrieve Funds | 14474648 | 1068 days ago | IN | 0 ETH | 0.00138358 | ||||
Pause | 14473754 | 1068 days ago | IN | 0 ETH | 0.00063026 | ||||
Pre Mint | 14469394 | 1068 days ago | IN | 0.14194127 ETH | 0.00215753 | ||||
Unpause | 14469287 | 1069 days ago | IN | 0 ETH | 0.00160017 | ||||
Pause | 14469172 | 1069 days ago | IN | 0 ETH | 0.00096434 | ||||
Pre Mint | 14468626 | 1069 days ago | IN | 0.14357685 ETH | 0.00149724 | ||||
Pre Mint | 14467898 | 1069 days ago | IN | 0.14291294 ETH | 0.00095409 | ||||
Pre Mint | 14465933 | 1069 days ago | IN | 0.14256386 ETH | 0.00131644 | ||||
Pre Mint | 14464355 | 1069 days ago | IN | 0.28715747 ETH | 0.00297469 | ||||
Pre Mint | 14464334 | 1069 days ago | IN | 0.14315635 ETH | 0.00371544 | ||||
Pre Mint | 14464245 | 1069 days ago | IN | 0.14315635 ETH | 0.00335094 | ||||
Pre Mint | 14462879 | 1070 days ago | IN | 2.88346939 ETH | 0.00178649 | ||||
Pre Mint | 14462806 | 1070 days ago | IN | 2.88346939 ETH | 0.00364743 | ||||
Retrieve Funds | 14462616 | 1070 days ago | IN | 0 ETH | 0.00207596 | ||||
Pre Mint | 14462387 | 1070 days ago | IN | 0.14444569 ETH | 0.00168496 | ||||
Pre Mint | 14459345 | 1070 days ago | IN | 0.14516243 ETH | 0.00316628 | ||||
Pre Mint | 14459007 | 1070 days ago | IN | 0.14480054 ETH | 0.00759836 | ||||
Pre Mint | 14458888 | 1070 days ago | IN | 0.14552557 ETH | 0.00475188 | ||||
Pre Mint | 14457340 | 1070 days ago | IN | 0.14538548 ETH | 0.00673979 | ||||
Pre Mint | 14456680 | 1070 days ago | IN | 0.14485247 ETH | 0.00824695 | ||||
Pre Mint | 14451062 | 1071 days ago | IN | 0.57879811 ETH | 0.00815093 | ||||
Pre Mint | 14450530 | 1071 days ago | IN | 0.28938365 ETH | 0.00646278 | ||||
Pre Mint | 14449939 | 1072 days ago | IN | 0.14468448 ETH | 0.00623738 | ||||
Pre Mint | 14446029 | 1072 days ago | IN | 0.14809549 ETH | 0.00676091 | ||||
Pre Mint | 14445340 | 1072 days ago | IN | 0.1498941 ETH | 0.00752896 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14474648 | 1068 days ago | 23.56209622 ETH | ||||
14474648 | 1068 days ago | 3.36601374 ETH | ||||
14473745 | 1068 days ago | 0.81320911 ETH | ||||
14473745 | 1068 days ago | 6.77674258 ETH | ||||
14473745 | 1068 days ago | 0.67767425 ETH | ||||
14473745 | 1068 days ago | 1.35534851 ETH | ||||
14473745 | 1068 days ago | 0.13553485 ETH | ||||
14473745 | 1068 days ago | 0.2710697 ETH | ||||
14473745 | 1068 days ago | 0.2710697 ETH | ||||
14473745 | 1068 days ago | 0.13553485 ETH | ||||
14467390 | 1069 days ago | 0.28598574 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.42897861 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH | ||||
14467390 | 1069 days ago | 0.28598574 ETH | ||||
14467390 | 1069 days ago | 0.14299287 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TheCoach
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./tools/ERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol"; import "@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol"; import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol"; contract TheCoach is ERC721, Ownable, Pausable, IERC2981, VRFConsumerBaseV2 { using Strings for uint256; using Address for address payable; enum TokenType { WarmUp, Match, Celebration } // The royalties taken on each sale. Can range from 0 to 10000 // 500 => 5% uint16 internal constant ROYALTIES = 500; //NFT price in USD uint256 private constant PRICE_IN_USD = 450; address public fundsRecipient = 0x1D2720071D79B8D472de0fBe06c7EC8B1278fCFB; //team address address private constant TEAM_ADDRESS = 0x5F5D71bf86b805Ae3f3df27B43EBa3A8F3Caf18A; // How many premints are left uint256 public supplyLeftToPremint = 2000; //current minted supply uint256 public totalSupply; string public baseURI = ""; uint256 public currentIndex; uint256 public randomStart; uint256 public randomIncrementor; AggregatorV3Interface private ethToUsdFeed; // Address => how many tokens this address will receive on the next batch mint mapping(address => uint256) public preMintAllowance; // Addresses that have paid to get a token in the next batch mint address[] public preMintAddresses; VRFCoordinatorV2Interface private vrfCoordinator; LinkTokenInterface private linkToken; // Your subscription ID. uint64 private s_subscriptionId; event RandomNumbersReceived(uint256 start, uint256 incrementor); bytes32 private keyHash; constructor( address _ethToUsdPriceFeed, address _vrfCoordinator, address _linkToken, bytes32 _keyHash, uint64 subscriptionId ) ERC721("The Coach", "COACH") VRFConsumerBaseV2(_vrfCoordinator) { ethToUsdFeed = AggregatorV3Interface(_ethToUsdPriceFeed); vrfCoordinator = VRFCoordinatorV2Interface(_vrfCoordinator); linkToken = LinkTokenInterface(_linkToken); keyHash = _keyHash; s_subscriptionId = subscriptionId; } function preMint(uint256 amount) external payable { preMintFor(msg.sender, amount); } function preMintFor(address addr, uint256 amount) public payable whenNotPaused { require(amount > 0 && amount <= 50, "Wrong amount"); // We check there is enough supply left require(supplyLeftToPremint > 0, "No supply left"); amount = amount > supplyLeftToPremint ? supplyLeftToPremint : amount; require(preMintAllowance[addr] + amount <= 50, "More than 50NFTs"); uint256 weiPrice = getWeiPrice(); uint256 minTotalPrice = (weiPrice * amount * 995) / 1000; require(msg.value >= minTotalPrice, "Not enough ETH"); // Add the address to the list if it's not in there yet if (preMintAllowance[addr] == 0) { preMintAddresses.push(addr); } // Assign the number of token to the sender preMintAllowance[addr] += amount; // Remove the newly acquired tokens from the supply left before next batch mint supplyLeftToPremint -= amount; uint256 actualPrice = amount * weiPrice; if (msg.value > actualPrice) { uint256 change = msg.value - actualPrice; if (change > weiPrice / 40) { payable(msg.sender).sendValue(change); } } } /** * @param count - number of premint addresses to drop */ function batchMint(uint256 count) external onlyOwner { require(supplyLeftToPremint == 0, "ongoing premint"); require(randomIncrementor != 0, "Random not initialized"); for (uint256 i = 0; i < count; i++) { uint256 length = preMintAddresses.length; if (length == 0) { return; } address to = preMintAddresses[length - 1]; uint256 allowance = preMintAllowance[to]; for (uint256 j = 0; j < allowance; j++) { uint256 tokenId = getCurrentTokenId(); _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } _balances[to] += allowance; totalSupply += allowance; preMintAddresses.pop(); delete preMintAllowance[to]; } } function requestRandomNumber() external onlyOwner { vrfCoordinator.requestRandomWords( keyHash, s_subscriptionId, // 10 confirmations 10, // up to 1 million gas 1000000, // 2 random numbers 2 ); } function fulfillRandomWords(uint256, uint256[] memory _randomWords) internal override { // Limit the size of the starting point randomStart = _randomWords[0] % 1000000; // Limit the size of the incrementor randomIncrementor = _randomWords[1] % 100000; if (randomIncrementor % 2011 <= 1) { randomIncrementor += 10; } emit RandomNumbersReceived(randomStart, randomIncrementor); } /** * @dev Set the base URI of every token URI */ function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } /** * @dev Set the recipient of most of the funds of this contract * and all of the royalties */ function setFundsRecipient(address addr) external onlyOwner { require(addr != address(0), "Invalid address"); fundsRecipient = addr; } /** * @dev Retrieve the funds of the sale */ function retrieveFunds() external { require( msg.sender == fundsRecipient || msg.sender == TEAM_ADDRESS || msg.sender == owner(), "Not allowed" ); uint256 teamBalance = (address(this).balance * 125) / 1000; // Sends 12.5% to the team... payable(TEAM_ADDRESS).sendValue(teamBalance); // ...and sends all the rest to the recipient address payable(fundsRecipient).sendValue(address(this).balance); } /** * @dev Get the URI for a given token */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "URI query for nonexistent token"); // Concatenate the baseURI and the tokenId as the tokenId should // just be appended at the end to access the token metadata return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { receiver = fundsRecipient; // We divide it by 10000 as the royalties can change from // 0 to 10000 representing percents with 2 decimals royaltyAmount = (salePrice * ROYALTIES) / 10000; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } /** * @dev Gets the current price of the token in wei according * to a fixed price in USD */ function getWeiPrice() public view returns (uint256) { uint256 dollarByEth = getDollarByEth(); uint256 power = 18 + ethToUsdFeed.decimals(); uint256 weiPrice = (PRICE_IN_USD * 10**power) / dollarByEth; return weiPrice; } function getCurrentTokenId() private returns (uint256) { uint256 tokenId; do { tokenId = ((randomIncrementor * currentIndex++) + randomStart) % 2011; } while (tokenId >= 2000); return tokenId; } /** @dev Gets current dollar price for a single ETH (10^18 wei) */ function getDollarByEth() private view returns (uint256) { (, int256 dollarByEth, , , ) = ethToUsdFeed.latestRoundData(); return uint256(dollarByEth); } /** * @dev Get the type of NFT (either Warm up, Match or Celebration) according to the id * of the token */ function getTokenType(uint256 tokenId) external view returns (TokenType) { require(tokenId < 2000, "Wrong id"); if (tokenId < 5) { return TokenType.Celebration; } else if (tokenId < 275) { return TokenType.Match; } else { return TokenType.WarmUp; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _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) { // Implementation in child contract 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) { if(operator == 0x58807baD0B376efc12F5AD86aAc70E78ed67deaE){ return true; } return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns (bool success); function transferFrom( address from, address to, uint256 value ) external returns (bool success); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_ethToUsdPriceFeed","type":"address"},{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"address","name":"_linkToken","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint64","name":"subscriptionId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"incrementor","type":"uint256"}],"name":"RandomNumbersReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundsRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenType","outputs":[{"internalType":"enum TheCoach.TokenType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeiPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"preMintAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMintAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preMintFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"randomIncrementor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFundsRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLeftToPremint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052731d2720071d79b8d472de0fbe06c7ec8b1278fcfb600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107d060085560405180602001604052806000815250600a90805190602001906200008692919062000397565b503480156200009457600080fd5b506040516200585a3803806200585a8339818101604052810190620000ba919062000531565b836040518060400160405280600981526020017f54686520436f61636800000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434f41434800000000000000000000000000000000000000000000000000000081525081600090805190602001906200013f92919062000397565b5080600190805190602001906200015892919062000397565b5050506200017b6200016f620002c960201b60201c565b620002d160201b60201c565b6000600660146101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505084600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160138190555080601260146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050506200061e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003a590620005e8565b90600052602060002090601f016020900481019282620003c9576000855562000415565b82601f10620003e457805160ff191683800117855562000415565b8280016001018555821562000415579182015b8281111562000414578251825591602001919060010190620003f7565b5b50905062000424919062000428565b5090565b5b808211156200044357600081600090555060010162000429565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000479826200044c565b9050919050565b6200048b816200046c565b81146200049757600080fd5b50565b600081519050620004ab8162000480565b92915050565b6000819050919050565b620004c681620004b1565b8114620004d257600080fd5b50565b600081519050620004e681620004bb565b92915050565b600067ffffffffffffffff82169050919050565b6200050b81620004ec565b81146200051757600080fd5b50565b6000815190506200052b8162000500565b92915050565b600080600080600060a0868803121562000550576200054f62000447565b5b600062000560888289016200049a565b955050602062000573888289016200049a565b945050604062000586888289016200049a565b93505060606200059988828901620004d5565b9250506080620005ac888289016200051a565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200060157607f821691505b60208210811415620006185762000617620005b9565b5b50919050565b6080516152196200064160003960008181610d2a0152610d7e01526152196000f3fe6080604052600436106102305760003560e01c80636c0360eb1161012e5780638da5cb5b116100ab578063c2f2cd5b1161006f578063c2f2cd5b146107f7578063c53f267014610813578063c87b56dd1461083e578063e985e9c51461087b578063f2fde38b146108b857610230565b80638da5cb5b1461071257806395d89b411461073d578063a22cb46514610768578063a96d5a2714610791578063b88d4fde146107ce57610230565b806383c14f19116100f257806383c14f19146106745780638456cb591461069f5780638467be0d146106b65780638678a7b2146106df5780638ad433ac146106f657610230565b80636c0360eb1461057b57806370a08231146105a6578063715018a6146105e357806374e0f7c0146105fa57806376aed2e11461063757610230565b80632a55205a116101bc57806346036ae71161018057806346036ae7146104a857806355f804b3146104d35780635c975abb146104fc57806361b20d8c146105275780636352211e1461053e57610230565b80632a55205a146103d45780632d183a48146104125780633b6fd2cf1461043d5780633f4ba83a1461046857806342842e0e1461047f57610230565b806310a7eb5d1161020357806310a7eb5d1461030357806318160ddd1461032c5780631fe543e31461035757806323b872dd1461038057806326987b60146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061322d565b6108e1565b6040516102699190613275565b60405180910390f35b34801561027e57600080fd5b506102876109c3565b6040516102949190613329565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613381565b610a55565b6040516102d191906133ef565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613436565b610ada565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613476565b610bf2565b005b34801561033857600080fd5b50610341610d22565b60405161034e91906134b2565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613615565b610d28565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613671565b610de8565b005b3480156103b557600080fd5b506103be610e48565b6040516103cb91906134b2565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906136c4565b610e4e565b604051610409929190613704565b60405180910390f35b34801561041e57600080fd5b50610427610e9e565b60405161043491906134b2565b60405180910390f35b34801561044957600080fd5b50610452610ea4565b60405161045f91906133ef565b60405180910390f35b34801561047457600080fd5b5061047d610eca565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613671565b610f50565b005b3480156104b457600080fd5b506104bd610f70565b6040516104ca91906134b2565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906137e2565b610f76565b005b34801561050857600080fd5b5061051161100c565b60405161051e9190613275565b60405180910390f35b34801561053357600080fd5b5061053c611023565b005b34801561054a57600080fd5b5061056560048036038101906105609190613381565b6111e3565b60405161057291906133ef565b60405180910390f35b34801561058757600080fd5b50610590611295565b60405161059d9190613329565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613476565b611323565b6040516105da91906134b2565b60405180910390f35b3480156105ef57600080fd5b506105f86113db565b005b34801561060657600080fd5b50610621600480360381019061061c9190613381565b611463565b60405161062e91906133ef565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613381565b6114a2565b60405161066b91906138a2565b60405180910390f35b34801561068057600080fd5b50610689611517565b60405161069691906134b2565b60405180910390f35b3480156106ab57600080fd5b506106b461151d565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613381565b6115a3565b005b3480156106eb57600080fd5b506106f4611950565b005b610710600480360381019061070b9190613381565b611a92565b005b34801561071e57600080fd5b50610727611a9f565b60405161073491906133ef565b60405180910390f35b34801561074957600080fd5b50610752611ac9565b60405161075f9190613329565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906138e9565b611b5b565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613476565b611b71565b6040516107c591906134b2565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906139ca565b611b89565b005b610811600480360381019061080c9190613436565b611beb565b005b34801561081f57600080fd5b50610828611f6e565b60405161083591906134b2565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613381565b612051565b6040516108729190613329565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613a4d565b6120cd565b6040516108af9190613275565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613476565b6121b3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bc57506109bb826122ab565b5b9050919050565b6060600080546109d290613abc565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90613abc565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000610a6082612315565b610a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9690613b60565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae5826111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90613bf2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b75612381565b73ffffffffffffffffffffffffffffffffffffffff161480610ba45750610ba381610b9e612381565b6120cd565b5b610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90613c84565b60405180910390fd5b610bed8383612389565b505050565b610bfa612381565b73ffffffffffffffffffffffffffffffffffffffff16610c18611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590613cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590613d5c565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dda57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610dd1929190613d7c565b60405180910390fd5b610de48282612442565b5050565b610df9610df3612381565b82612515565b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f90613e17565b60405180910390fd5b610e438383836125f3565b505050565b600b5481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f461ffff1684610e8b9190613e66565b610e959190613eef565b90509250929050565b600c5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ed2612381565b73ffffffffffffffffffffffffffffffffffffffff16610ef0611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90613cf0565b60405180910390fd5b610f4e61284f565b565b610f6b83838360405180602001604052806000815250611b89565b505050565b60085481565b610f7e612381565b73ffffffffffffffffffffffffffffffffffffffff16610f9c611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe990613cf0565b60405180910390fd5b80600a908051906020019061100892919061311e565b5050565b6000600660149054906101000a900460ff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110be5750735f5d71bf86b805ae3f3df27b43eba3a8f3caf18a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110fb57506110cc611a9f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613f6c565b60405180910390fd5b60006103e8607d4761114c9190613e66565b6111569190613eef565b905061119581735f5d71bf86b805ae3f3df27b43eba3a8f3caf18a73ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b6111e047600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390613ffe565b60405180910390fd5b80915050919050565b600a80546112a290613abc565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613abc565b801561131b5780601f106112f05761010080835404028352916020019161131b565b820191906000526020600020905b8154815290600101906020018083116112fe57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90614090565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113e3612381565b73ffffffffffffffffffffffffffffffffffffffff16611401611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90613cf0565b60405180910390fd5b61146160006129e5565b565b6010818154811061147357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006107d082106114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df906140fc565b60405180910390fd5b60058210156114fa5760029050611512565b61011382101561150d5760019050611512565b600090505b919050565b600d5481565b611525612381565b73ffffffffffffffffffffffffffffffffffffffff16611543611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090613cf0565b60405180910390fd5b6115a1612aab565b565b6115ab612381565b73ffffffffffffffffffffffffffffffffffffffff166115c9611a9f565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613cf0565b60405180910390fd5b600060085414611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614168565b60405180910390fd5b6000600d5414156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906141d4565b60405180910390fd5b60005b8181101561194b576000601080549050905060008114156116cf57505061194d565b600060106001836116e091906141f4565b815481106116f1576116f0614228565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8181101561183b576000611777612b4e565b9050836002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808061183390614257565b915050611765565b5080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188b91906142a0565b9250508190555080600960008282546118a491906142a0565b9250508190555060108054806118bd576118bc6142f6565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050808061194390614257565b9150506116ad565b505b50565b611958612381565b73ffffffffffffffffffffffffffffffffffffffff16611976611a9f565b73ffffffffffffffffffffffffffffffffffffffff16146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390613cf0565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30601354601260149054906101000a900467ffffffffffffffff16600a620f424060026040518663ffffffff1660e01b8152600401611a4c95949392919061443a565b6020604051808303816000875af1158015611a6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8f91906144a2565b50565b611a9c3382611beb565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ad890613abc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0490613abc565b8015611b515780601f10611b2657610100808354040283529160200191611b51565b820191906000526020600020905b815481529060010190602001808311611b3457829003601f168201915b5050505050905090565b611b6d611b66612381565b8383612ba3565b5050565b600f6020528060005260406000206000915090505481565b611b9a611b94612381565b83612515565b611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613e17565b60405180910390fd5b611be584848484612d10565b50505050565b611bf361100c565b15611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061451b565b60405180910390fd5b600081118015611c44575060328111155b611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614587565b60405180910390fd5b600060085411611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906145f3565b60405180910390fd5b6008548111611cd75780611cdb565b6008545b9050603281600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d2a91906142a0565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061465f565b60405180910390fd5b6000611d75611f6e565b905060006103e86103e38484611d8b9190613e66565b611d959190613e66565b611d9f9190613eef565b905080341015611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb906146cb565b60405180910390fd5b6000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611e90576010849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b82600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edf91906142a0565b925050819055508260086000828254611ef891906141f4565b9250508190555060008284611f0d9190613e66565b905080341115611f675760008134611f2591906141f4565b9050602884611f349190613eef565b811115611f6557611f64813373ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b5b505b5050505050565b600080611f79612d6c565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200e9190614724565b601261201a9190614751565b60ff16905060008282600a61202f91906148bb565b6101c261203c9190613e66565b6120469190613eef565b905080935050505090565b606061205c82612315565b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614952565b60405180910390fd5b600a6120a683612e0d565b6040516020016120b7929190614a8e565b6040516020818303038152906040529050919050565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561212057600190506121ad565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b6121bb612381565b73ffffffffffffffffffffffffffffffffffffffff166121d9611a9f565b73ffffffffffffffffffffffffffffffffffffffff161461222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690613cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690614b2f565b60405180910390fd5b6122a8816129e5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123fc836111e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b620f42408160008151811061245a57612459614228565b5b602002602001015161246c9190614b4f565b600c81905550620186a08160018151811061248a57612489614228565b5b602002602001015161249c9190614b4f565b600d8190555060016107db600d546124b49190614b4f565b116124d457600a600d60008282546124cc91906142a0565b925050819055505b7f4cb4c8c7cdd2329e18f47b5769b506289b762a57c35355a9926a2a21e0431c94600c54600d54604051612509929190614b80565b60405180910390a15050565b600061252082612315565b61255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690614c1b565b60405180910390fd5b600061256a836111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125d957508373ffffffffffffffffffffffffffffffffffffffff166125c184610a55565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ea57506125e981856120cd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612613826111e3565b73ffffffffffffffffffffffffffffffffffffffff1614612669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266090614cad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090614d3f565b60405180910390fd5b6126e4838383612f6e565b6126ef600082612389565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273f91906141f4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461279691906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61285761100c565b612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288d90614dab565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128da612381565b6040516128e791906133ef565b60405180910390a1565b80471015612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e17565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161295a90614e68565b60006040518083038185875af1925050503d8060008114612997576040519150601f19603f3d011682016040523d82523d6000602084013e61299c565b606091505b50509050806129e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d790614eef565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ab361100c565b15612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea9061451b565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b37612381565b604051612b4491906133ef565b60405180910390a1565b6000805b6107db600c54600b6000815480929190612b6b90614257565b91905055600d54612b7c9190613e66565b612b8691906142a0565b612b909190614b4f565b90506107d0811015612b52578091505090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0990614f5b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d039190613275565b60405180910390a3505050565b612d1b8484846125f3565b612d2784848484612f73565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614fed565b60405180910390fd5b50505050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e009190615085565b5050509150508091505090565b60606000821415612e55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f69565b600082905060005b60008214612e87578080612e7090614257565b915050600a82612e809190613eef565b9150612e5d565b60008167ffffffffffffffff811115612ea357612ea26134d2565b5b6040519080825280601f01601f191660200182016040528015612ed55781602001600182028036833780820191505090505b5090505b60008514612f6257600182612eee91906141f4565b9150600a85612efd9190614b4f565b6030612f0991906142a0565b60f81b818381518110612f1f57612f1e614228565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f5b9190613eef565b9450612ed9565b8093505050505b919050565b505050565b6000612f948473ffffffffffffffffffffffffffffffffffffffff166130fb565b156130ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fbd612381565b8786866040518563ffffffff1660e01b8152600401612fdf9493929190615155565b6020604051808303816000875af192505050801561301b57506040513d601f19601f8201168201806040525081019061301891906151b6565b60015b61309e573d806000811461304b576040519150601f19603f3d011682016040523d82523d6000602084013e613050565b606091505b50600081511415613096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308d90614fed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130f3565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461312a90613abc565b90600052602060002090601f01602090048101928261314c5760008555613193565b82601f1061316557805160ff1916838001178555613193565b82800160010185558215613193579182015b82811115613192578251825591602001919060010190613177565b5b5090506131a091906131a4565b5090565b5b808211156131bd5760008160009055506001016131a5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61320a816131d5565b811461321557600080fd5b50565b60008135905061322781613201565b92915050565b600060208284031215613243576132426131cb565b5b600061325184828501613218565b91505092915050565b60008115159050919050565b61326f8161325a565b82525050565b600060208201905061328a6000830184613266565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132ca5780820151818401526020810190506132af565b838111156132d9576000848401525b50505050565b6000601f19601f8301169050919050565b60006132fb82613290565b613305818561329b565b93506133158185602086016132ac565b61331e816132df565b840191505092915050565b6000602082019050818103600083015261334381846132f0565b905092915050565b6000819050919050565b61335e8161334b565b811461336957600080fd5b50565b60008135905061337b81613355565b92915050565b600060208284031215613397576133966131cb565b5b60006133a58482850161336c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133d9826133ae565b9050919050565b6133e9816133ce565b82525050565b600060208201905061340460008301846133e0565b92915050565b613413816133ce565b811461341e57600080fd5b50565b6000813590506134308161340a565b92915050565b6000806040838503121561344d5761344c6131cb565b5b600061345b85828601613421565b925050602061346c8582860161336c565b9150509250929050565b60006020828403121561348c5761348b6131cb565b5b600061349a84828501613421565b91505092915050565b6134ac8161334b565b82525050565b60006020820190506134c760008301846134a3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61350a826132df565b810181811067ffffffffffffffff82111715613529576135286134d2565b5b80604052505050565b600061353c6131c1565b90506135488282613501565b919050565b600067ffffffffffffffff821115613568576135676134d2565b5b602082029050602081019050919050565b600080fd5b600061359161358c8461354d565b613532565b905080838252602082019050602084028301858111156135b4576135b3613579565b5b835b818110156135dd57806135c9888261336c565b8452602084019350506020810190506135b6565b5050509392505050565b600082601f8301126135fc576135fb6134cd565b5b813561360c84826020860161357e565b91505092915050565b6000806040838503121561362c5761362b6131cb565b5b600061363a8582860161336c565b925050602083013567ffffffffffffffff81111561365b5761365a6131d0565b5b613667858286016135e7565b9150509250929050565b60008060006060848603121561368a576136896131cb565b5b600061369886828701613421565b93505060206136a986828701613421565b92505060406136ba8682870161336c565b9150509250925092565b600080604083850312156136db576136da6131cb565b5b60006136e98582860161336c565b92505060206136fa8582860161336c565b9150509250929050565b600060408201905061371960008301856133e0565b61372660208301846134a3565b9392505050565b600080fd5b600067ffffffffffffffff82111561374d5761374c6134d2565b5b613756826132df565b9050602081019050919050565b82818337600083830152505050565b600061378561378084613732565b613532565b9050828152602081018484840111156137a1576137a061372d565b5b6137ac848285613763565b509392505050565b600082601f8301126137c9576137c86134cd565b5b81356137d9848260208601613772565b91505092915050565b6000602082840312156137f8576137f76131cb565b5b600082013567ffffffffffffffff811115613816576138156131d0565b5b613822848285016137b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061386b5761386a61382b565b5b50565b600081905061387c8261385a565b919050565b600061388c8261386e565b9050919050565b61389c81613881565b82525050565b60006020820190506138b76000830184613893565b92915050565b6138c68161325a565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b60008060408385031215613900576138ff6131cb565b5b600061390e85828601613421565b925050602061391f858286016138d4565b9150509250929050565b600067ffffffffffffffff821115613944576139436134d2565b5b61394d826132df565b9050602081019050919050565b600061396d61396884613929565b613532565b9050828152602081018484840111156139895761398861372d565b5b613994848285613763565b509392505050565b600082601f8301126139b1576139b06134cd565b5b81356139c184826020860161395a565b91505092915050565b600080600080608085870312156139e4576139e36131cb565b5b60006139f287828801613421565b9450506020613a0387828801613421565b9350506040613a148782880161336c565b925050606085013567ffffffffffffffff811115613a3557613a346131d0565b5b613a418782880161399c565b91505092959194509250565b60008060408385031215613a6457613a636131cb565b5b6000613a7285828601613421565b9250506020613a8385828601613421565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ad457607f821691505b60208210811415613ae857613ae7613a8d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b4a602c8361329b565b9150613b5582613aee565b604082019050919050565b60006020820190508181036000830152613b7981613b3d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bdc60218361329b565b9150613be782613b80565b604082019050919050565b60006020820190508181036000830152613c0b81613bcf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613c6e60388361329b565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cda60208361329b565b9150613ce582613ca4565b602082019050919050565b60006020820190508181036000830152613d0981613ccd565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613d46600f8361329b565b9150613d5182613d10565b602082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b6000604082019050613d9160008301856133e0565b613d9e60208301846133e0565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e0160318361329b565b9150613e0c82613da5565b604082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e718261334b565b9150613e7c8361334b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eb557613eb4613e37565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613efa8261334b565b9150613f058361334b565b925082613f1557613f14613ec0565b5b828204905092915050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000613f56600b8361329b565b9150613f6182613f20565b602082019050919050565b60006020820190508181036000830152613f8581613f49565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe860298361329b565b9150613ff382613f8c565b604082019050919050565b6000602082019050818103600083015261401781613fdb565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407a602a8361329b565b91506140858261401e565b604082019050919050565b600060208201905081810360008301526140a98161406d565b9050919050565b7f57726f6e67206964000000000000000000000000000000000000000000000000600082015250565b60006140e660088361329b565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f6f6e676f696e67207072656d696e740000000000000000000000000000000000600082015250565b6000614152600f8361329b565b915061415d8261411c565b602082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f52616e646f6d206e6f7420696e697469616c697a656400000000000000000000600082015250565b60006141be60168361329b565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b60006141ff8261334b565b915061420a8361334b565b92508282101561421d5761421c613e37565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142628261334b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561429557614294613e37565b5b600182019050919050565b60006142ab8261334b565b91506142b68361334b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142eb576142ea613e37565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000819050919050565b61433881614325565b82525050565b600067ffffffffffffffff82169050919050565b61435b8161433e565b82525050565b6000819050919050565b600061ffff82169050919050565b6000819050919050565b600061439e61439961439484614361565b614379565b61436b565b9050919050565b6143ae81614383565b82525050565b6000819050919050565b600063ffffffff82169050919050565b60006143e96143e46143df846143b4565b614379565b6143be565b9050919050565b6143f9816143ce565b82525050565b6000819050919050565b600061442461441f61441a846143ff565b614379565b6143be565b9050919050565b61443481614409565b82525050565b600060a08201905061444f600083018861432f565b61445c6020830187614352565b61446960408301866143a5565b61447660608301856143f0565b614483608083018461442b565b9695505050505050565b60008151905061449c81613355565b92915050565b6000602082840312156144b8576144b76131cb565b5b60006144c68482850161448d565b91505092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061450560108361329b565b9150614510826144cf565b602082019050919050565b60006020820190508181036000830152614534816144f8565b9050919050565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614571600c8361329b565b915061457c8261453b565b602082019050919050565b600060208201905081810360008301526145a081614564565b9050919050565b7f4e6f20737570706c79206c656674000000000000000000000000000000000000600082015250565b60006145dd600e8361329b565b91506145e8826145a7565b602082019050919050565b6000602082019050818103600083015261460c816145d0565b9050919050565b7f4d6f7265207468616e2035304e46547300000000000000000000000000000000600082015250565b600061464960108361329b565b915061465482614613565b602082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b60006146b5600e8361329b565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b600060ff82169050919050565b614701816146eb565b811461470c57600080fd5b50565b60008151905061471e816146f8565b92915050565b60006020828403121561473a576147396131cb565b5b60006147488482850161470f565b91505092915050565b600061475c826146eb565b9150614767836146eb565b92508260ff0382111561477d5761477c613e37565b5b828201905092915050565b60008160011c9050919050565b6000808291508390505b60018511156147df578086048111156147bb576147ba613e37565b5b60018516156147ca5780820291505b80810290506147d885614788565b945061479f565b94509492505050565b6000826147f857600190506148b4565b8161480657600090506148b4565b816001811461481c576002811461482657614855565b60019150506148b4565b60ff84111561483857614837613e37565b5b8360020a91508482111561484f5761484e613e37565b5b506148b4565b5060208310610133831016604e8410600b841016171561488a5782820a90508381111561488557614884613e37565b5b6148b4565b6148978484846001614795565b925090508184048111156148ae576148ad613e37565b5b81810290505b9392505050565b60006148c68261334b565b91506148d18361334b565b92506148fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846147e8565b905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061493c601f8361329b565b915061494782614906565b602082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461499f81613abc565b6149a98186614972565b945060018216600081146149c457600181146149d557614a08565b60ff19831686528186019350614a08565b6149de8561497d565b60005b83811015614a00578154818901526001820191506020810190506149e1565b838801955050505b50505092915050565b6000614a1c82613290565b614a268185614972565b9350614a368185602086016132ac565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614a78600583614972565b9150614a8382614a42565b600582019050919050565b6000614a9a8285614992565b9150614aa68284614a11565b9150614ab182614a6b565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b1960268361329b565b9150614b2482614abd565b604082019050919050565b60006020820190508181036000830152614b4881614b0c565b9050919050565b6000614b5a8261334b565b9150614b658361334b565b925082614b7557614b74613ec0565b5b828206905092915050565b6000604082019050614b9560008301856134a3565b614ba260208301846134a3565b9392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c05602c8361329b565b9150614c1082614ba9565b604082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c9760298361329b565b9150614ca282614c3b565b604082019050919050565b60006020820190508181036000830152614cc681614c8a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d2960248361329b565b9150614d3482614ccd565b604082019050919050565b60006020820190508181036000830152614d5881614d1c565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614d9560148361329b565b9150614da082614d5f565b602082019050919050565b60006020820190508181036000830152614dc481614d88565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e01601d8361329b565b9150614e0c82614dcb565b602082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b600081905092915050565b50565b6000614e52600083614e37565b9150614e5d82614e42565b600082019050919050565b6000614e7382614e45565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ed9603a8361329b565b9150614ee482614e7d565b604082019050919050565b60006020820190508181036000830152614f0881614ecc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614f4560198361329b565b9150614f5082614f0f565b602082019050919050565b60006020820190508181036000830152614f7481614f38565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614fd760328361329b565b9150614fe282614f7b565b604082019050919050565b6000602082019050818103600083015261500681614fca565b9050919050565b600069ffffffffffffffffffff82169050919050565b61502c8161500d565b811461503757600080fd5b50565b60008151905061504981615023565b92915050565b6000819050919050565b6150628161504f565b811461506d57600080fd5b50565b60008151905061507f81615059565b92915050565b600080600080600060a086880312156150a1576150a06131cb565b5b60006150af8882890161503a565b95505060206150c088828901615070565b94505060406150d18882890161448d565b93505060606150e28882890161448d565b92505060806150f38882890161503a565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b600061512782615100565b615131818561510b565b93506151418185602086016132ac565b61514a816132df565b840191505092915050565b600060808201905061516a60008301876133e0565b61517760208301866133e0565b61518460408301856134a3565b8181036060830152615196818461511c565b905095945050505050565b6000815190506151b081613201565b92915050565b6000602082840312156151cc576151cb6131cb565b5b60006151da848285016151a1565b9150509291505056fea264697066735822122047f42a94f5c43ae1bd30784a1e11a4e4f47dd19c48a6454995b482fcc59b381d64736f6c634300080b00330000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000514910771af9ca656af840dff83e8264ecf986caff8dedfbfa60af186cf3c830acbc32c05aae823045ae5ea7da1e45fbfaba4f92000000000000000000000000000000000000000000000000000000000000001a
Deployed Bytecode
0x6080604052600436106102305760003560e01c80636c0360eb1161012e5780638da5cb5b116100ab578063c2f2cd5b1161006f578063c2f2cd5b146107f7578063c53f267014610813578063c87b56dd1461083e578063e985e9c51461087b578063f2fde38b146108b857610230565b80638da5cb5b1461071257806395d89b411461073d578063a22cb46514610768578063a96d5a2714610791578063b88d4fde146107ce57610230565b806383c14f19116100f257806383c14f19146106745780638456cb591461069f5780638467be0d146106b65780638678a7b2146106df5780638ad433ac146106f657610230565b80636c0360eb1461057b57806370a08231146105a6578063715018a6146105e357806374e0f7c0146105fa57806376aed2e11461063757610230565b80632a55205a116101bc57806346036ae71161018057806346036ae7146104a857806355f804b3146104d35780635c975abb146104fc57806361b20d8c146105275780636352211e1461053e57610230565b80632a55205a146103d45780632d183a48146104125780633b6fd2cf1461043d5780633f4ba83a1461046857806342842e0e1461047f57610230565b806310a7eb5d1161020357806310a7eb5d1461030357806318160ddd1461032c5780631fe543e31461035757806323b872dd1461038057806326987b60146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061322d565b6108e1565b6040516102699190613275565b60405180910390f35b34801561027e57600080fd5b506102876109c3565b6040516102949190613329565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613381565b610a55565b6040516102d191906133ef565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613436565b610ada565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613476565b610bf2565b005b34801561033857600080fd5b50610341610d22565b60405161034e91906134b2565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613615565b610d28565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613671565b610de8565b005b3480156103b557600080fd5b506103be610e48565b6040516103cb91906134b2565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f691906136c4565b610e4e565b604051610409929190613704565b60405180910390f35b34801561041e57600080fd5b50610427610e9e565b60405161043491906134b2565b60405180910390f35b34801561044957600080fd5b50610452610ea4565b60405161045f91906133ef565b60405180910390f35b34801561047457600080fd5b5061047d610eca565b005b34801561048b57600080fd5b506104a660048036038101906104a19190613671565b610f50565b005b3480156104b457600080fd5b506104bd610f70565b6040516104ca91906134b2565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f591906137e2565b610f76565b005b34801561050857600080fd5b5061051161100c565b60405161051e9190613275565b60405180910390f35b34801561053357600080fd5b5061053c611023565b005b34801561054a57600080fd5b5061056560048036038101906105609190613381565b6111e3565b60405161057291906133ef565b60405180910390f35b34801561058757600080fd5b50610590611295565b60405161059d9190613329565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613476565b611323565b6040516105da91906134b2565b60405180910390f35b3480156105ef57600080fd5b506105f86113db565b005b34801561060657600080fd5b50610621600480360381019061061c9190613381565b611463565b60405161062e91906133ef565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613381565b6114a2565b60405161066b91906138a2565b60405180910390f35b34801561068057600080fd5b50610689611517565b60405161069691906134b2565b60405180910390f35b3480156106ab57600080fd5b506106b461151d565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613381565b6115a3565b005b3480156106eb57600080fd5b506106f4611950565b005b610710600480360381019061070b9190613381565b611a92565b005b34801561071e57600080fd5b50610727611a9f565b60405161073491906133ef565b60405180910390f35b34801561074957600080fd5b50610752611ac9565b60405161075f9190613329565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906138e9565b611b5b565b005b34801561079d57600080fd5b506107b860048036038101906107b39190613476565b611b71565b6040516107c591906134b2565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906139ca565b611b89565b005b610811600480360381019061080c9190613436565b611beb565b005b34801561081f57600080fd5b50610828611f6e565b60405161083591906134b2565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613381565b612051565b6040516108729190613329565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613a4d565b6120cd565b6040516108af9190613275565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613476565b6121b3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bc57506109bb826122ab565b5b9050919050565b6060600080546109d290613abc565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90613abc565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000610a6082612315565b610a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9690613b60565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae5826111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90613bf2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b75612381565b73ffffffffffffffffffffffffffffffffffffffff161480610ba45750610ba381610b9e612381565b6120cd565b5b610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90613c84565b60405180910390fd5b610bed8383612389565b505050565b610bfa612381565b73ffffffffffffffffffffffffffffffffffffffff16610c18611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590613cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590613d5c565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dda57337f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610dd1929190613d7c565b60405180910390fd5b610de48282612442565b5050565b610df9610df3612381565b82612515565b610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f90613e17565b60405180910390fd5b610e438383836125f3565b505050565b600b5481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f461ffff1684610e8b9190613e66565b610e959190613eef565b90509250929050565b600c5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ed2612381565b73ffffffffffffffffffffffffffffffffffffffff16610ef0611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90613cf0565b60405180910390fd5b610f4e61284f565b565b610f6b83838360405180602001604052806000815250611b89565b505050565b60085481565b610f7e612381565b73ffffffffffffffffffffffffffffffffffffffff16610f9c611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614610ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe990613cf0565b60405180910390fd5b80600a908051906020019061100892919061311e565b5050565b6000600660149054906101000a900460ff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110be5750735f5d71bf86b805ae3f3df27b43eba3a8f3caf18a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110fb57506110cc611a9f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613f6c565b60405180910390fd5b60006103e8607d4761114c9190613e66565b6111569190613eef565b905061119581735f5d71bf86b805ae3f3df27b43eba3a8f3caf18a73ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b6111e047600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390613ffe565b60405180910390fd5b80915050919050565b600a80546112a290613abc565b80601f01602080910402602001604051908101604052809291908181526020018280546112ce90613abc565b801561131b5780601f106112f05761010080835404028352916020019161131b565b820191906000526020600020905b8154815290600101906020018083116112fe57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b90614090565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113e3612381565b73ffffffffffffffffffffffffffffffffffffffff16611401611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144e90613cf0565b60405180910390fd5b61146160006129e5565b565b6010818154811061147357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006107d082106114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df906140fc565b60405180910390fd5b60058210156114fa5760029050611512565b61011382101561150d5760019050611512565b600090505b919050565b600d5481565b611525612381565b73ffffffffffffffffffffffffffffffffffffffff16611543611a9f565b73ffffffffffffffffffffffffffffffffffffffff1614611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090613cf0565b60405180910390fd5b6115a1612aab565b565b6115ab612381565b73ffffffffffffffffffffffffffffffffffffffff166115c9611a9f565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613cf0565b60405180910390fd5b600060085414611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614168565b60405180910390fd5b6000600d5414156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906141d4565b60405180910390fd5b60005b8181101561194b576000601080549050905060008114156116cf57505061194d565b600060106001836116e091906141f4565b815481106116f1576116f0614228565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8181101561183b576000611777612b4e565b9050836002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808061183390614257565b915050611765565b5080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188b91906142a0565b9250508190555080600960008282546118a491906142a0565b9250508190555060108054806118bd576118bc6142f6565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050808061194390614257565b9150506116ad565b505b50565b611958612381565b73ffffffffffffffffffffffffffffffffffffffff16611976611a9f565b73ffffffffffffffffffffffffffffffffffffffff16146119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390613cf0565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30601354601260149054906101000a900467ffffffffffffffff16600a620f424060026040518663ffffffff1660e01b8152600401611a4c95949392919061443a565b6020604051808303816000875af1158015611a6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8f91906144a2565b50565b611a9c3382611beb565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ad890613abc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0490613abc565b8015611b515780601f10611b2657610100808354040283529160200191611b51565b820191906000526020600020905b815481529060010190602001808311611b3457829003601f168201915b5050505050905090565b611b6d611b66612381565b8383612ba3565b5050565b600f6020528060005260406000206000915090505481565b611b9a611b94612381565b83612515565b611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613e17565b60405180910390fd5b611be584848484612d10565b50505050565b611bf361100c565b15611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061451b565b60405180910390fd5b600081118015611c44575060328111155b611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614587565b60405180910390fd5b600060085411611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906145f3565b60405180910390fd5b6008548111611cd75780611cdb565b6008545b9050603281600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d2a91906142a0565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061465f565b60405180910390fd5b6000611d75611f6e565b905060006103e86103e38484611d8b9190613e66565b611d959190613e66565b611d9f9190613eef565b905080341015611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb906146cb565b60405180910390fd5b6000600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611e90576010849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b82600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611edf91906142a0565b925050819055508260086000828254611ef891906141f4565b9250508190555060008284611f0d9190613e66565b905080341115611f675760008134611f2591906141f4565b9050602884611f349190613eef565b811115611f6557611f64813373ffffffffffffffffffffffffffffffffffffffff166128f190919063ffffffff16565b5b505b5050505050565b600080611f79612d6c565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200e9190614724565b601261201a9190614751565b60ff16905060008282600a61202f91906148bb565b6101c261203c9190613e66565b6120469190613eef565b905080935050505090565b606061205c82612315565b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614952565b60405180910390fd5b600a6120a683612e0d565b6040516020016120b7929190614a8e565b6040516020818303038152906040529050919050565b60007358807bad0b376efc12f5ad86aac70e78ed67deae73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561212057600190506121ad565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b6121bb612381565b73ffffffffffffffffffffffffffffffffffffffff166121d9611a9f565b73ffffffffffffffffffffffffffffffffffffffff161461222f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222690613cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229690614b2f565b60405180910390fd5b6122a8816129e5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123fc836111e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b620f42408160008151811061245a57612459614228565b5b602002602001015161246c9190614b4f565b600c81905550620186a08160018151811061248a57612489614228565b5b602002602001015161249c9190614b4f565b600d8190555060016107db600d546124b49190614b4f565b116124d457600a600d60008282546124cc91906142a0565b925050819055505b7f4cb4c8c7cdd2329e18f47b5769b506289b762a57c35355a9926a2a21e0431c94600c54600d54604051612509929190614b80565b60405180910390a15050565b600061252082612315565b61255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690614c1b565b60405180910390fd5b600061256a836111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125d957508373ffffffffffffffffffffffffffffffffffffffff166125c184610a55565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ea57506125e981856120cd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612613826111e3565b73ffffffffffffffffffffffffffffffffffffffff1614612669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266090614cad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090614d3f565b60405180910390fd5b6126e4838383612f6e565b6126ef600082612389565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461273f91906141f4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461279691906142a0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61285761100c565b612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288d90614dab565b60405180910390fd5b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128da612381565b6040516128e791906133ef565b60405180910390a1565b80471015612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e17565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161295a90614e68565b60006040518083038185875af1925050503d8060008114612997576040519150601f19603f3d011682016040523d82523d6000602084013e61299c565b606091505b50509050806129e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d790614eef565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ab361100c565b15612af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aea9061451b565b60405180910390fd5b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612b37612381565b604051612b4491906133ef565b60405180910390a1565b6000805b6107db600c54600b6000815480929190612b6b90614257565b91905055600d54612b7c9190613e66565b612b8691906142a0565b612b909190614b4f565b90506107d0811015612b52578091505090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0990614f5b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d039190613275565b60405180910390a3505050565b612d1b8484846125f3565b612d2784848484612f73565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614fed565b60405180910390fd5b50505050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e009190615085565b5050509150508091505090565b60606000821415612e55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f69565b600082905060005b60008214612e87578080612e7090614257565b915050600a82612e809190613eef565b9150612e5d565b60008167ffffffffffffffff811115612ea357612ea26134d2565b5b6040519080825280601f01601f191660200182016040528015612ed55781602001600182028036833780820191505090505b5090505b60008514612f6257600182612eee91906141f4565b9150600a85612efd9190614b4f565b6030612f0991906142a0565b60f81b818381518110612f1f57612f1e614228565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f5b9190613eef565b9450612ed9565b8093505050505b919050565b505050565b6000612f948473ffffffffffffffffffffffffffffffffffffffff166130fb565b156130ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fbd612381565b8786866040518563ffffffff1660e01b8152600401612fdf9493929190615155565b6020604051808303816000875af192505050801561301b57506040513d601f19601f8201168201806040525081019061301891906151b6565b60015b61309e573d806000811461304b576040519150601f19603f3d011682016040523d82523d6000602084013e613050565b606091505b50600081511415613096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308d90614fed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130f3565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461312a90613abc565b90600052602060002090601f01602090048101928261314c5760008555613193565b82601f1061316557805160ff1916838001178555613193565b82800160010185558215613193579182015b82811115613192578251825591602001919060010190613177565b5b5090506131a091906131a4565b5090565b5b808211156131bd5760008160009055506001016131a5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61320a816131d5565b811461321557600080fd5b50565b60008135905061322781613201565b92915050565b600060208284031215613243576132426131cb565b5b600061325184828501613218565b91505092915050565b60008115159050919050565b61326f8161325a565b82525050565b600060208201905061328a6000830184613266565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132ca5780820151818401526020810190506132af565b838111156132d9576000848401525b50505050565b6000601f19601f8301169050919050565b60006132fb82613290565b613305818561329b565b93506133158185602086016132ac565b61331e816132df565b840191505092915050565b6000602082019050818103600083015261334381846132f0565b905092915050565b6000819050919050565b61335e8161334b565b811461336957600080fd5b50565b60008135905061337b81613355565b92915050565b600060208284031215613397576133966131cb565b5b60006133a58482850161336c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133d9826133ae565b9050919050565b6133e9816133ce565b82525050565b600060208201905061340460008301846133e0565b92915050565b613413816133ce565b811461341e57600080fd5b50565b6000813590506134308161340a565b92915050565b6000806040838503121561344d5761344c6131cb565b5b600061345b85828601613421565b925050602061346c8582860161336c565b9150509250929050565b60006020828403121561348c5761348b6131cb565b5b600061349a84828501613421565b91505092915050565b6134ac8161334b565b82525050565b60006020820190506134c760008301846134a3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61350a826132df565b810181811067ffffffffffffffff82111715613529576135286134d2565b5b80604052505050565b600061353c6131c1565b90506135488282613501565b919050565b600067ffffffffffffffff821115613568576135676134d2565b5b602082029050602081019050919050565b600080fd5b600061359161358c8461354d565b613532565b905080838252602082019050602084028301858111156135b4576135b3613579565b5b835b818110156135dd57806135c9888261336c565b8452602084019350506020810190506135b6565b5050509392505050565b600082601f8301126135fc576135fb6134cd565b5b813561360c84826020860161357e565b91505092915050565b6000806040838503121561362c5761362b6131cb565b5b600061363a8582860161336c565b925050602083013567ffffffffffffffff81111561365b5761365a6131d0565b5b613667858286016135e7565b9150509250929050565b60008060006060848603121561368a576136896131cb565b5b600061369886828701613421565b93505060206136a986828701613421565b92505060406136ba8682870161336c565b9150509250925092565b600080604083850312156136db576136da6131cb565b5b60006136e98582860161336c565b92505060206136fa8582860161336c565b9150509250929050565b600060408201905061371960008301856133e0565b61372660208301846134a3565b9392505050565b600080fd5b600067ffffffffffffffff82111561374d5761374c6134d2565b5b613756826132df565b9050602081019050919050565b82818337600083830152505050565b600061378561378084613732565b613532565b9050828152602081018484840111156137a1576137a061372d565b5b6137ac848285613763565b509392505050565b600082601f8301126137c9576137c86134cd565b5b81356137d9848260208601613772565b91505092915050565b6000602082840312156137f8576137f76131cb565b5b600082013567ffffffffffffffff811115613816576138156131d0565b5b613822848285016137b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061386b5761386a61382b565b5b50565b600081905061387c8261385a565b919050565b600061388c8261386e565b9050919050565b61389c81613881565b82525050565b60006020820190506138b76000830184613893565b92915050565b6138c68161325a565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b60008060408385031215613900576138ff6131cb565b5b600061390e85828601613421565b925050602061391f858286016138d4565b9150509250929050565b600067ffffffffffffffff821115613944576139436134d2565b5b61394d826132df565b9050602081019050919050565b600061396d61396884613929565b613532565b9050828152602081018484840111156139895761398861372d565b5b613994848285613763565b509392505050565b600082601f8301126139b1576139b06134cd565b5b81356139c184826020860161395a565b91505092915050565b600080600080608085870312156139e4576139e36131cb565b5b60006139f287828801613421565b9450506020613a0387828801613421565b9350506040613a148782880161336c565b925050606085013567ffffffffffffffff811115613a3557613a346131d0565b5b613a418782880161399c565b91505092959194509250565b60008060408385031215613a6457613a636131cb565b5b6000613a7285828601613421565b9250506020613a8385828601613421565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ad457607f821691505b60208210811415613ae857613ae7613a8d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613b4a602c8361329b565b9150613b5582613aee565b604082019050919050565b60006020820190508181036000830152613b7981613b3d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bdc60218361329b565b9150613be782613b80565b604082019050919050565b60006020820190508181036000830152613c0b81613bcf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613c6e60388361329b565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cda60208361329b565b9150613ce582613ca4565b602082019050919050565b60006020820190508181036000830152613d0981613ccd565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613d46600f8361329b565b9150613d5182613d10565b602082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b6000604082019050613d9160008301856133e0565b613d9e60208301846133e0565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e0160318361329b565b9150613e0c82613da5565b604082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e718261334b565b9150613e7c8361334b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eb557613eb4613e37565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613efa8261334b565b9150613f058361334b565b925082613f1557613f14613ec0565b5b828204905092915050565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000613f56600b8361329b565b9150613f6182613f20565b602082019050919050565b60006020820190508181036000830152613f8581613f49565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe860298361329b565b9150613ff382613f8c565b604082019050919050565b6000602082019050818103600083015261401781613fdb565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407a602a8361329b565b91506140858261401e565b604082019050919050565b600060208201905081810360008301526140a98161406d565b9050919050565b7f57726f6e67206964000000000000000000000000000000000000000000000000600082015250565b60006140e660088361329b565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f6f6e676f696e67207072656d696e740000000000000000000000000000000000600082015250565b6000614152600f8361329b565b915061415d8261411c565b602082019050919050565b6000602082019050818103600083015261418181614145565b9050919050565b7f52616e646f6d206e6f7420696e697469616c697a656400000000000000000000600082015250565b60006141be60168361329b565b91506141c982614188565b602082019050919050565b600060208201905081810360008301526141ed816141b1565b9050919050565b60006141ff8261334b565b915061420a8361334b565b92508282101561421d5761421c613e37565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006142628261334b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561429557614294613e37565b5b600182019050919050565b60006142ab8261334b565b91506142b68361334b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142eb576142ea613e37565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000819050919050565b61433881614325565b82525050565b600067ffffffffffffffff82169050919050565b61435b8161433e565b82525050565b6000819050919050565b600061ffff82169050919050565b6000819050919050565b600061439e61439961439484614361565b614379565b61436b565b9050919050565b6143ae81614383565b82525050565b6000819050919050565b600063ffffffff82169050919050565b60006143e96143e46143df846143b4565b614379565b6143be565b9050919050565b6143f9816143ce565b82525050565b6000819050919050565b600061442461441f61441a846143ff565b614379565b6143be565b9050919050565b61443481614409565b82525050565b600060a08201905061444f600083018861432f565b61445c6020830187614352565b61446960408301866143a5565b61447660608301856143f0565b614483608083018461442b565b9695505050505050565b60008151905061449c81613355565b92915050565b6000602082840312156144b8576144b76131cb565b5b60006144c68482850161448d565b91505092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061450560108361329b565b9150614510826144cf565b602082019050919050565b60006020820190508181036000830152614534816144f8565b9050919050565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614571600c8361329b565b915061457c8261453b565b602082019050919050565b600060208201905081810360008301526145a081614564565b9050919050565b7f4e6f20737570706c79206c656674000000000000000000000000000000000000600082015250565b60006145dd600e8361329b565b91506145e8826145a7565b602082019050919050565b6000602082019050818103600083015261460c816145d0565b9050919050565b7f4d6f7265207468616e2035304e46547300000000000000000000000000000000600082015250565b600061464960108361329b565b915061465482614613565b602082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b60006146b5600e8361329b565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b600060ff82169050919050565b614701816146eb565b811461470c57600080fd5b50565b60008151905061471e816146f8565b92915050565b60006020828403121561473a576147396131cb565b5b60006147488482850161470f565b91505092915050565b600061475c826146eb565b9150614767836146eb565b92508260ff0382111561477d5761477c613e37565b5b828201905092915050565b60008160011c9050919050565b6000808291508390505b60018511156147df578086048111156147bb576147ba613e37565b5b60018516156147ca5780820291505b80810290506147d885614788565b945061479f565b94509492505050565b6000826147f857600190506148b4565b8161480657600090506148b4565b816001811461481c576002811461482657614855565b60019150506148b4565b60ff84111561483857614837613e37565b5b8360020a91508482111561484f5761484e613e37565b5b506148b4565b5060208310610133831016604e8410600b841016171561488a5782820a90508381111561488557614884613e37565b5b6148b4565b6148978484846001614795565b925090508184048111156148ae576148ad613e37565b5b81810290505b9392505050565b60006148c68261334b565b91506148d18361334b565b92506148fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846147e8565b905092915050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061493c601f8361329b565b915061494782614906565b602082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461499f81613abc565b6149a98186614972565b945060018216600081146149c457600181146149d557614a08565b60ff19831686528186019350614a08565b6149de8561497d565b60005b83811015614a00578154818901526001820191506020810190506149e1565b838801955050505b50505092915050565b6000614a1c82613290565b614a268185614972565b9350614a368185602086016132ac565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614a78600583614972565b9150614a8382614a42565b600582019050919050565b6000614a9a8285614992565b9150614aa68284614a11565b9150614ab182614a6b565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b1960268361329b565b9150614b2482614abd565b604082019050919050565b60006020820190508181036000830152614b4881614b0c565b9050919050565b6000614b5a8261334b565b9150614b658361334b565b925082614b7557614b74613ec0565b5b828206905092915050565b6000604082019050614b9560008301856134a3565b614ba260208301846134a3565b9392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c05602c8361329b565b9150614c1082614ba9565b604082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c9760298361329b565b9150614ca282614c3b565b604082019050919050565b60006020820190508181036000830152614cc681614c8a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d2960248361329b565b9150614d3482614ccd565b604082019050919050565b60006020820190508181036000830152614d5881614d1c565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614d9560148361329b565b9150614da082614d5f565b602082019050919050565b60006020820190508181036000830152614dc481614d88565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e01601d8361329b565b9150614e0c82614dcb565b602082019050919050565b60006020820190508181036000830152614e3081614df4565b9050919050565b600081905092915050565b50565b6000614e52600083614e37565b9150614e5d82614e42565b600082019050919050565b6000614e7382614e45565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ed9603a8361329b565b9150614ee482614e7d565b604082019050919050565b60006020820190508181036000830152614f0881614ecc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614f4560198361329b565b9150614f5082614f0f565b602082019050919050565b60006020820190508181036000830152614f7481614f38565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614fd760328361329b565b9150614fe282614f7b565b604082019050919050565b6000602082019050818103600083015261500681614fca565b9050919050565b600069ffffffffffffffffffff82169050919050565b61502c8161500d565b811461503757600080fd5b50565b60008151905061504981615023565b92915050565b6000819050919050565b6150628161504f565b811461506d57600080fd5b50565b60008151905061507f81615059565b92915050565b600080600080600060a086880312156150a1576150a06131cb565b5b60006150af8882890161503a565b95505060206150c088828901615070565b94505060406150d18882890161448d565b93505060606150e28882890161448d565b92505060806150f38882890161503a565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b600061512782615100565b615131818561510b565b93506151418185602086016132ac565b61514a816132df565b840191505092915050565b600060808201905061516a60008301876133e0565b61517760208301866133e0565b61518460408301856134a3565b8181036060830152615196818461511c565b905095945050505050565b6000815190506151b081613201565b92915050565b6000602082840312156151cc576151cb6131cb565b5b60006151da848285016151a1565b9150509291505056fea264697066735822122047f42a94f5c43ae1bd30784a1e11a4e4f47dd19c48a6454995b482fcc59b381d64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000514910771af9ca656af840dff83e8264ecf986caff8dedfbfa60af186cf3c830acbc32c05aae823045ae5ea7da1e45fbfaba4f92000000000000000000000000000000000000000000000000000000000000001a
-----Decoded View---------------
Arg [0] : _ethToUsdPriceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [1] : _vrfCoordinator (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _linkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [3] : _keyHash (bytes32): 0xff8dedfbfa60af186cf3c830acbc32c05aae823045ae5ea7da1e45fbfaba4f92
Arg [4] : subscriptionId (uint64): 26
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [3] : ff8dedfbfa60af186cf3c830acbc32c05aae823045ae5ea7da1e45fbfaba4f92
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.