ERC-721
Overview
Max Total Supply
5,000 METWA
Holders
1,328
Market
Volume (24H)
0.02 ETH
Min Price (24H)
$66.19 @ 0.020000 ETH
Max Price (24H)
$66.19 @ 0.020000 ETH
Other Info
Token Contract
Balance
3 METWALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MetropolisWorldPassport
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 20000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.1; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; //access control import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; // Helper functions OpenZeppelin provides. import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; interface ImageDataInf{ function getCDNImageForElement(string calldata element, uint16 level)external view returns(string memory); function getIPFSImageForElement(string calldata element, uint16 level)external view returns(string memory); function getAnnimationForElement(string calldata element)external view returns(string memory); } interface TokenURIInf{ function maketokenURi(uint _tokenId, uint wlSpots, uint winChances, uint softClay ) external view returns(string memory); function contractURI() external view returns (string memory); } interface WinContr { function getReferalIncrease()external view returns(uint16); function updateAfterLoss(uint passportId, string calldata city, uint32 buildingId)external; } contract MetropolisWorldPassport is ERC721Enumerable, Ownable, AccessControl { address private IMAGE_DATA_CONTRACT; ImageDataInf ImageContract; address private WIN_CONTRACT; WinContr WinContract; address private WL_CONTRACT; address private TURI_CONTRACT; TokenURIInf TuriContract; //defining the access roles bytes32 public constant UPDATER_ROLE = keccak256("UPDATER_ROLE"); //bytes32 public constant BALANCE_ROLE = keccak256("BALANCE_ROLE"); bytes32 public constant CONTRACT_ROLE = keccak256("CONTRACT_ROLE"); //payment split contract address payable private _paymentSplit; // The tokenId is the NFTs unique identifier, it's just a number that goes // 0, 1, 2, 3, etc. using Counters for Counters.Counter; Counters.Counter private _tokenIds; //counter for token ids //updateable variables uint32 public _mintLimit = 5000; uint16 public _maxAllowedPerWallet = 301; //maximum allowed to mint per wallet string private _oddAvatar = "nomad"; string private _evenAvatar = "citizen"; uint256 public _navPrice = 0.12 ether; struct AccessToken { uint256 id; uint32 winChances; uint32 softClay; // max is 4 billion // string name; string rank; //string description; //string image; //string animation; //string cdnImage; string element; uint avatarWl; uint256[] whitelistSpots; } string[] elements = ["Fire", "Water", "Air", "Space", "Pixel", "Earth"]; //store the list of minted tokens metadata to thier token id mapping(uint256 => AccessToken) nftAccessTokenAttribute; //give away wallets mapping(address=>uint16) _freeMintable; //winners of free passport are mapped here and can mint for free. mapping(bytes => bool) _signatureUsed; //set up functions constructor(address imageContract, address admin) ERC721("Metropolis World Passport", "METWA") { //require(imageContract != address(0)); IMAGE_DATA_CONTRACT = imageContract; ImageContract = ImageDataInf(IMAGE_DATA_CONTRACT); // I increment _tokenIds here so that my first NFT has an ID of 1. _tokenIds.increment(); _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(UPDATER_ROLE, msg.sender); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); } //overides function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable ,AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function contractURI() public view returns (string memory) { return TuriContract.contractURI(); } /** * @dev Set up the addrese for other contracts which interact with this contract. * @param winContract The address of the win chances contract. * @param wlContract The address of the Whitelist Contract. * @param turiContract The address of the Token URI contract * @notice Can only be called by wallets with UPDATER_ROLE */ function setWLContractAddress(address payable paymentContract, address winContract, address wlContract, address turiContract)external onlyRole(UPDATER_ROLE){ // require(winContract != address(0)); // require(wlContract != address(0)); // require(turiContract != address(0)); WIN_CONTRACT = winContract; WinContract = WinContr(WIN_CONTRACT); WL_CONTRACT = wlContract; TURI_CONTRACT = turiContract; TuriContract = TokenURIInf(TURI_CONTRACT); _paymentSplit = paymentContract; } function setImageContract(address imageContract)external onlyRole(UPDATER_ROLE){ require(imageContract != address(0)); IMAGE_DATA_CONTRACT = imageContract; ImageContract = ImageDataInf(IMAGE_DATA_CONTRACT); } //minting functions function _internalMint(address toWallet, uint32 winChance)internal { uint256 newItemId = _tokenIds.current(); // make sure not above limit of available mints. require(newItemId <= _mintLimit, "To many minted"); //make sure not already got 1 require(balanceOf(toWallet) < _maxAllowedPerWallet, "address already owns max allowed"); _safeMint(toWallet, newItemId); //randomly assign the element string memory elm = elements[newItemId % 6]; //randomly assign the chracter WL spot. uint avwl = 1;//_oddAvatar; if (newItemId % 2 == 1) { //is an odd number avwl = 2;//_evenAvatar; } nftAccessTokenAttribute[newItemId] = AccessToken({ id: newItemId, winChances: winChance, softClay: 0, rank: "N", element: elm, avatarWl: avwl, whitelistSpots: new uint256[](0) }); // Increment the tokenId for the next person that uses it. _tokenIds.increment(); } /** * @dev Used internally to mint free passports and send them to addreses eg. comp winners. * @param toWallet The address which the passport will be minted too. * @notice Can only be called by wallets with UPDATER_ROLE */ function freeMint(address toWallet)external onlyRole(UPDATER_ROLE) { _internalMint(toWallet, 1); } /** * @dev Used by users who hvae been awarded a free passport. Checks against the list of approved wallets */ function userFreeMint(uint16 mints)external{ require(_freeMintable[msg.sender] >= mints, "not on the free mint list"); for(uint16 i; i < mints; i++){ //as comp winners they get an extra win chance too _internalMint(msg.sender, 2); //remove free mint ability } _freeMintable[msg.sender] -= mints; } function myFreeMints()external view returns(uint16){ return _freeMintable[msg.sender]; } function recoverSigner(bytes32 hash, bytes memory signature) internal pure returns (address) { bytes32 messageDigest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", hash ) ); return ECDSA.recover(messageDigest, signature); } /** * @dev Bulk minitng function for users. * @param numberOfMints the number of passports to be minted. * @param toAddress the address the nft is going to. * @param referrerTokenId the passport ID of the referrer, pass 0 if there is no referall. */ function bulkMint(uint16 numberOfMints, address toAddress, uint256 referrerTokenId, bytes32 hash, bytes memory signature)external payable { require(recoverSigner(hash, signature)==owner(),"invalid signature"); require(!_signatureUsed[signature], "Signature has already been used."); require(numberOfMints < _maxAllowedPerWallet, "Trying to mint more then max allowed per wallet" ); require(msg.value >= (numberOfMints * _navPrice), "not paid enough"); require(balanceOf(msg.sender) < _maxAllowedPerWallet - numberOfMints, "address already owns max allowed"); require(_tokenIds.current() + numberOfMints - 1 <= _mintLimit, "Will take you over max supply"); _signatureUsed[signature] = true; for(uint16 i; i < numberOfMints; i++){ if (referrerTokenId != 0){ referralMint(referrerTokenId, toAddress); }else{ _internalMint(toAddress, 1); } } //return the excess if any if (msg.value > (numberOfMints * _navPrice)){ Address.sendValue(payable(msg.sender), (msg.value - (numberOfMints * _navPrice))); } } /** * @dev Standard minitng with the added functionaility of a referal mechamisum. * @param referrerTokenId The token id of the passport refering the mint */ function referralMint(uint256 referrerTokenId, address toAddress) internal { //tokenId is the Id of the Token referring the new mint. //this function increases win chances for each person refeered uint256 newItemId = _tokenIds.current(); require(referrerTokenId < newItemId, "Invalid token ID"); //require(referrerTokenId != 0, "Invalid token ID"); _internalMint(toAddress, 2); nftAccessTokenAttribute[referrerTokenId] .winChances += WinContract.getReferalIncrease(); } //Whitelist Functions // all the functions which created the proccess of adding or removing WL from the passport //city WL spots /** * @dev used by the WL contract to attache whitlis spots for cities to passport. * @param wlId The ID of the WL being attached * @param passportId the token ID of the passport which the WL is being attcahed to. * @notice only callable by a wallet/contract with the CONTRACT_ROLE */ function attachWLSpot(uint wlId, uint passportId)external onlyRole(CONTRACT_ROLE){ //called from the WL contract adds WL to passport for city drop. nftAccessTokenAttribute[passportId].whitelistSpots.push(wlId); } /** * @dev Get the WL spots a particular passport has. * @param passportId The token id of the passport */ function getWLSpots(uint passportId)external view returns(uint[] memory){ return nftAccessTokenAttribute[passportId].whitelistSpots; } function detachCityWLSpot(uint passportId, uint index)external onlyRole(CONTRACT_ROLE){ //called from the WL contract. nftAccessTokenAttribute[passportId].whitelistSpots[index] = nftAccessTokenAttribute[passportId].whitelistSpots[nftAccessTokenAttribute[passportId].whitelistSpots.length-1]; nftAccessTokenAttribute[passportId].whitelistSpots.pop(); } //avatar whitelist spots function contractRemoveAvatarWL(uint256 tokenId, address owner) external onlyRole(CONTRACT_ROLE) { // when the user mints the avatar this is called by that contract and the WL is removed from the passport // can also be used to manually remove spot // we assume the avatar contract has checked the WL spot is correct. // check owner owns passport require(ownerOf(tokenId) == owner, "owner needs to own the passport"); nftAccessTokenAttribute[tokenId].avatarWl = 0; } function manualAddAvatarWL(uint256 tokenId, uint avatar) external onlyRole(UPDATER_ROLE) { // for us to manually add a WL spot to the passport. nftAccessTokenAttribute[tokenId].avatarWl = avatar; } function checkAvatarWL(uint passportId)external view returns(uint){ return nftAccessTokenAttribute[passportId].avatarWl; } function setAvatarWLNames(string calldata odd, string calldata even) external onlyRole(UPDATER_ROLE) { _oddAvatar = odd; _evenAvatar = even; } //Win Chance functions function userUpdateAfterLoss(uint passportId, string calldata city, uint32 buildingId)external{ //called by user to update thier win chances after they loose require(ownerOf(passportId)==msg.sender, "You must own the passport to claim win chance increases"); WinContract.updateAfterLoss(passportId, city, buildingId); } function increaseWinChance(uint passportId, uint16 inc)external onlyRole(CONTRACT_ROLE){ nftAccessTokenAttribute[passportId].winChances += inc; } function decreaseWinChance(uint passportId, uint16 dec)external onlyRole(CONTRACT_ROLE){ nftAccessTokenAttribute[passportId].winChances -= dec; } // view values function getWinChances(uint256 tokenId)external view returns (uint32) { //return the win chances of a specific token return nftAccessTokenAttribute[tokenId].winChances; } //Soft Clay functions // all the functions relating to the meteor dust process. function increaseSoftClay(uint passportId, uint32 amount)external onlyRole(CONTRACT_ROLE){ nftAccessTokenAttribute[passportId].softClay += amount; } function decreaseSoftClay(uint passportId, uint32 amount)external onlyRole(CONTRACT_ROLE){ nftAccessTokenAttribute[passportId].softClay -= amount; } function updateRank(uint256 tokenId, uint32 _pioneerLevel, uint32 _legendLevel)external onlyRole(CONTRACT_ROLE){ // checks if the stamp count for a token id is high enough to move up a rank. // we run it each time a stamp is claimed if (nftAccessTokenAttribute[tokenId].softClay >= _legendLevel) { nftAccessTokenAttribute[tokenId].rank = "L"; } else if ( nftAccessTokenAttribute[tokenId].softClay >= _pioneerLevel && nftAccessTokenAttribute[tokenId].softClay < _legendLevel ) { nftAccessTokenAttribute[tokenId].rank = "P"; } else if (nftAccessTokenAttribute[tokenId].softClay < _pioneerLevel) { nftAccessTokenAttribute[tokenId].rank = "N"; } } function getSoftClay(uint passportId)external view onlyRole(CONTRACT_ROLE) returns(uint32){ return nftAccessTokenAttribute[passportId].softClay; } //Admin or Helper Functions // Mostly the ones use internaly to help user flow on the site. function setFreeMinters(address[] calldata winners)external onlyRole(UPDATER_ROLE){ // used by us to add competition winners // should not exceed 500 items but can be split of required uint len = winners.length; for (uint16 i; i<len;i++){ _freeMintable[winners[i]]+=1; } } function setPrice(uint256 price) external onlyRole(UPDATER_ROLE) { //set the price of minting. _navPrice = price; } function setMaxAllowed(uint16 maxA)external onlyRole(UPDATER_ROLE){ //max allowed per wallet _maxAllowedPerWallet = maxA; } function checkIfHasNFT(address owner) external view returns (AccessToken[] memory nft) { //a solution to get ownership detials uint256 bal = balanceOf(owner); AccessToken[] memory x = new AccessToken[](bal); for (uint256 i = 0; i < bal; i++) { uint tokenId = tokenOfOwnerByIndex(owner,i); x[i] = nftAccessTokenAttribute[tokenId]; } return x; } function getCurrentTokenId() external view returns (string memory) { // we will use this in the snapshot before each drop // The idea being to loop through all the token id's from 1 up to this number and see who owns them, // reading each token URI to see the win chances. // we will do this on the front end. return Strings.toString(_tokenIds.current()); } function setMintLimit(uint32 limt) public onlyRole(UPDATER_ROLE) { //change the mint limit to restrict the total number of NFT's that can be minted _mintLimit = limt; } function sectionOne(uint _tokenId)external view returns(bytes memory){ // string memory rank = "Navigator"; // if (nftAccessTokenAttribute[_tokenId].softClay >= _legendLevel){ // rank = "Pioneer"; // } string memory avatar = "Citizen"; if (nftAccessTokenAttribute[_tokenId].avatarWl == 2){ avatar = "Nomad"; } bytes memory dataURI = abi.encodePacked( '{"name": "', "Passport: ", nftAccessTokenAttribute[_tokenId].element, '", "description": "', "", '", "image": "', ImageContract.getIPFSImageForElement(nftAccessTokenAttribute[_tokenId].element, 1), '", "animation_url": "', ImageContract.getAnnimationForElement(nftAccessTokenAttribute[_tokenId].element), '", "attributes": [{ "trait_type": "Avatar WL", "value": "', avatar, '"},{ "trait_type": "Rank", "value": "', nftAccessTokenAttribute[_tokenId].rank, '"},{ "trait_type": "Element", "value": "', nftAccessTokenAttribute[_tokenId].element ); return dataURI; } // nftAccessTokenAttribute[_tokenId].description // //token URI's // ImageContract.getIPFSImageForElement(elm, 1), // cdnImage: ImageContract.getCDNImageForElement(elm, 1) function tokenURI(uint256 _tokenId) public view override returns (string memory) { AccessToken memory accessTokenAttributes = nftAccessTokenAttribute[ _tokenId ]; return TuriContract.maketokenURi(_tokenId, accessTokenAttributes.whitelistSpots.length, accessTokenAttributes.winChances, accessTokenAttributes.softClay); } // Transfers the ETH out of the contract to the specified address. function withdraw() external { uint256 balance = address(this).balance; Address.sendValue(_paymentSplit, balance); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../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) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// 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 // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// 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 (last updated v4.5.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// 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 (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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 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/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 (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
{ "optimizer": { "enabled": true, "runs": 20000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"imageContract","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxAllowedPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_navPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlId","type":"uint256"},{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"attachWLSpot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfMints","type":"uint16"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"referrerTokenId","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bulkMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"checkAvatarWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"checkIfHasNFT","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint32","name":"winChances","type":"uint32"},{"internalType":"uint32","name":"softClay","type":"uint32"},{"internalType":"string","name":"rank","type":"string"},{"internalType":"string","name":"element","type":"string"},{"internalType":"uint256","name":"avatarWl","type":"uint256"},{"internalType":"uint256[]","name":"whitelistSpots","type":"uint256[]"}],"internalType":"struct MetropolisWorldPassport.AccessToken[]","name":"nft","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"contractRemoveAvatarWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"decreaseSoftClay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint16","name":"dec","type":"uint16"}],"name":"decreaseWinChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"detachCityWLSpot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWallet","type":"address"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"getSoftClay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"getWLSpots","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWinChances","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"increaseSoftClay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint16","name":"inc","type":"uint16"}],"name":"increaseWinChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"avatar","type":"uint256"}],"name":"manualAddAvatarWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myFreeMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"sectionOne","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","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":"odd","type":"string"},{"internalType":"string","name":"even","type":"string"}],"name":"setAvatarWLNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"setFreeMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"imageContract","type":"address"}],"name":"setImageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxA","type":"uint16"}],"name":"setMaxAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"limt","type":"uint32"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"paymentContract","type":"address"},{"internalType":"address","name":"winContract","type":"address"},{"internalType":"address","name":"wlContract","type":"address"},{"internalType":"address","name":"turiContract","type":"address"}],"name":"setWLContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint32","name":"_pioneerLevel","type":"uint32"},{"internalType":"uint32","name":"_legendLevel","type":"uint32"}],"name":"updateRank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"mints","type":"uint16"}],"name":"userFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"string","name":"city","type":"string"},{"internalType":"uint32","name":"buildingId","type":"uint32"}],"name":"userUpdateAfterLoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6015805465ffffffffffff191665012d0000138817905560c060405260056080819052641b9bdb585960da1b60a09081526200003f9160169190620003a2565b506040805180820190915260078082526631b4ba34bd32b760c91b60209092019182526200007091601791620003a2565b506701aa535d3d0c00006018556040805161010081018252600460c08201908152634669726560e01b60e08301528152815180830183526005808252642bb0ba32b960d91b6020838101919091528084019290925283518085018552600381526220b4b960e91b81840152838501528351808501855281815264537061636560d81b8184015260608401528351808501855281815264141a5e195b60da1b818401526080840152835180850190945283526408ac2e4e8d60db1b9083015260a08101919091526200014690601990600662000431565b503480156200015457600080fd5b506040516200631538038062006315833981016040819052620001779162000528565b604080518082018252601981527f4d6574726f706f6c697320576f726c642050617373706f7274000000000000006020808301918252835180850190945260058452644d4554574160d81b908401528151919291620001d991600091620003a2565b508051620001ef906001906020840190620003a2565b5050506200020c620002066200029e60201b60201c565b620002a2565b600c80546001600160a01b03199081166001600160a01b038516908117909255600d80549091169091179055620002506014620002f4602090811b62002dc017901c565b6200025d600082620002fd565b620002897f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab33620002fd565b62000296600033620002fd565b50506200059c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff166200039e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200035d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b828054620003b0906200055f565b90600052602060002090601f016020900481019282620003d457600085556200041f565b82601f10620003ef57805160ff19168380011785556200041f565b828001600101855582156200041f579182015b828111156200041f57825182559160200191906001019062000402565b506200042d92915062000491565b5090565b82805482825590600052602060002090810192821562000483579160200282015b8281111562000483578251805162000472918491602090910190620003a2565b509160200191906001019062000452565b506200042d929150620004a8565b5b808211156200042d576000815560010162000492565b808211156200042d576000620004bf8282620004c9565b50600101620004a8565b508054620004d7906200055f565b6000825580601f10620004e8575050565b601f01602090049060005260206000209081019062000508919062000491565b50565b80516001600160a01b03811681146200052357600080fd5b919050565b600080604083850312156200053b578182fd5b62000546836200050b565b915062000556602084016200050b565b90509250929050565b600181811c908216806200057457607f821691505b602082108114156200059657634e487b7160e01b600052602260045260246000fd5b50919050565b615d6980620005ac6000396000f3fe6080604052600436106103975760003560e01c80636352211e116101dc578063a22cb46511610102578063db8d6050116100a0578063f1cf64091161006f578063f1cf640914610ba1578063f2fde38b14610bbe578063f687c3ce14610bde578063fa07ce1d14610bfe57600080fd5b8063db8d605014610af6578063df69124b14610b16578063e8a3d48514610b36578063e985e9c514610b4b57600080fd5b8063c6f414a8116100dc578063c6f414a814610a80578063c87b56dd14610a96578063d229771c14610ab6578063d547741f14610ad657600080fd5b8063a22cb46514610a20578063b173803514610a40578063b88d4fde14610a6057600080fd5b80637f9a105c1161017a57806391b7f5ed1161014957806391b7f5ed1461098357806391d14854146109a357806395d89b41146109f6578063a217fddf14610a0b57600080fd5b80637f9a105c146108f857806387a0fcd2146109185780638da5cb5b1461093857806390de88331461096357600080fd5b80636e00af34116101b65780636e00af341461086757806370a082311461089d578063715018a6146108bd5780637d53e615146108d257600080fd5b80636352211e146107ed578063644f1ea91461080d57806367ad1a9b1461083a57600080fd5b80632f745c59116102c15780634886dbf11161025f578063538d9f5a1161022e578063538d9f5a1461077857806356189236146107985780635c103fd2146107ad578063621c1f94146107cd57600080fd5b80634886dbf1146106cd5780634a3895d6146106ed5780634f6ccce7146107385780634ffcefd31461075857600080fd5b80633870889f1161029b5780633870889f146106445780633ccfd60b1461066457806342842e0e1461067957806347e633801461069957600080fd5b80632f745c59146105f157806335672ef81461061157806336568abe1461062457600080fd5b806318160ddd11610339578063248a9ca311610308578063248a9ca314610561578063281ca2fc1461059157806329591a6f146105b15780632f2ff15d146105d157600080fd5b806318160ddd146104ec5780631af5bf6914610501578063201b1a651461052157806323b872dd1461054157600080fd5b806307b260ab1161037557806307b260ab14610435578063081812fc14610465578063095ea7b3146104aa57806316c85277146104cc57600080fd5b806301ffc9a71461039c57806303fe46ab146103d157806306fdde0314610413575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004615124565b610c1e565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506104057f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c81565b6040519081526020016103c8565b34801561041f57600080fd5b50610428610c2f565b6040516103c8919061599d565b34801561044157600080fd5b506104056104503660046150e8565b6000908152601a602052604090206004015490565b34801561047157600080fd5b506104856104803660046150e8565b610cc1565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103c8565b3480156104b657600080fd5b506104ca6104c536600461504d565b610d86565b005b3480156104d857600080fd5b506104ca6104e7366004615078565b610edf565b3480156104f857600080fd5b50600854610405565b34801561050d57600080fd5b506104ca61051c3660046152e4565b610fc8565b34801561052d57600080fd5b506104ca61053c366004615238565b6110ef565b34801561054d57600080fd5b506104ca61055c366004614f72565b611157565b34801561056d57600080fd5b5061040561057c3660046150e8565b6000908152600b602052604090206001015490565b34801561059d57600080fd5b506104ca6105ac366004615238565b6111de565b3480156105bd57600080fd5b506104ca6105cc366004615100565b6112b5565b3480156105dd57600080fd5b506104ca6105ec366004615100565b611378565b3480156105fd57600080fd5b5061040561060c36600461504d565b61139d565b6104ca61061f366004615270565b611452565b34801561063057600080fd5b506104ca61063f366004615100565b6117f1565b34801561065057600080fd5b506104ca61065f3660046153b0565b61188a565b34801561067057600080fd5b506104ca611a6d565b34801561068557600080fd5b506104ca610694366004614f72565b611a95565b3480156106a557600080fd5b506104057f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab81565b3480156106d957600080fd5b506104ca6106e8366004615364565b611ab0565b3480156106f957600080fd5b506107236107083660046150e8565b6000908152601a602052604090206001015463ffffffff1690565b60405163ffffffff90911681526020016103c8565b34801561074457600080fd5b506104056107533660046150e8565b611bb3565b34801561076457600080fd5b506104ca610773366004614edf565b611c65565b34801561078457600080fd5b506104ca610793366004615364565b611d1d565b3480156107a457600080fd5b50610428611d6c565b3480156107b957600080fd5b506107236107c83660046150e8565b611d84565b3480156107d957600080fd5b506104ca6107e8366004615340565b611dd9565b3480156107f957600080fd5b506104856108083660046150e8565b611e51565b34801561081957600080fd5b5061082d610828366004614ec3565b611ee9565b6040516103c89190615894565b34801561084657600080fd5b5061085a6108553660046150e8565b6121d3565b6040516103c8919061598a565b34801561087357600080fd5b5060155461088a90640100000000900461ffff1681565b60405161ffff90911681526020016103c8565b3480156108a957600080fd5b506104056108b8366004614ec3565b612238565b3480156108c957600080fd5b506104ca6122ec565b3480156108de57600080fd5b50336000908152601b602052604090205461ffff1661088a565b34801561090457600080fd5b506104ca610913366004614ec3565b61235f565b34801561092457600080fd5b506104ca610933366004615340565b6123fb565b34801561094457600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610485565b34801561096f57600080fd5b506104ca61097e3660046153eb565b612450565b34801561098f57600080fd5b506104ca61099e3660046150e8565b6124b2565b3480156109af57600080fd5b506103bc6109be366004615100565b6000918252600b6020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610a0257600080fd5b506104286124e2565b348015610a1757600080fd5b50610405600081565b348015610a2c57600080fd5b506104ca610a3b36600461501c565b6124f1565b348015610a4c57600080fd5b50610428610a5b3660046150e8565b6124fc565b348015610a6c57600080fd5b506104ca610a7b366004614fb2565b61274f565b348015610a8c57600080fd5b5061040560185481565b348015610aa257600080fd5b50610428610ab13660046150e8565b6127d7565b348015610ac257600080fd5b506104ca610ad1366004615364565b612a83565b348015610ae257600080fd5b506104ca610af1366004615100565b612ac3565b348015610b0257600080fd5b506104ca610b11366004615385565b612ae8565b348015610b2257600080fd5b506104ca610b3136600461515c565b612b44565b348015610b4257600080fd5b50610428612b8f565b348015610b5757600080fd5b506103bc610b66366004614f3a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bad57600080fd5b506015546107239063ffffffff1681565b348015610bca57600080fd5b506104ca610bd9366004614ec3565b612c36565b348015610bea57600080fd5b506104ca610bf9366004615385565b612d2f565b348015610c0a57600080fd5b506104ca610c19366004614ec3565b612d8b565b6000610c2982612dc9565b92915050565b606060008054610c3e90615bed565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6a90615bed565b8015610cb75780601f10610c8c57610100808354040283529160200191610cb7565b820191906000526020600020905b815481529060010190602001808311610c9a57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610d5d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d9182611e51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e355760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b3373ffffffffffffffffffffffffffffffffffffffff82161480610e5e5750610e5e8133610b66565b610ed05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d54565b610eda8383612e1f565b505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab610f0981612ebf565b8160005b818161ffff161015610fc1576001601b600087878561ffff16818110610f4357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f589190614ec3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190610f9490849061ffff16615a87565b92506101000a81548161ffff021916908361ffff1602179055508080610fb990615c22565b915050610f0d565b5050505050565b33610fd285611e51565b73ffffffffffffffffffffffffffffffffffffffff161461105b5760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374206f776e207468652070617373706f727420746f20636c6160448201527f696d2077696e206368616e636520696e637265617365730000000000000000006064820152608401610d54565b600f546040517f4af2407100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634af24071906110b79087908790879087906004016159e9565b600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b5050505050505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61111981612ebf565b506015805461ffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff909216919091179055565b6111613382612ec9565b6111d35760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d54565b610eda83838361301f565b336000908152601b602052604090205461ffff808316911610156112445760405162461bcd60e51b815260206004820152601960248201527f6e6f74206f6e207468652066726565206d696e74206c697374000000000000006044820152606401610d54565b60005b8161ffff168161ffff1610156112745761126233600261325d565b8061126c81615c22565b915050611247565b50336000908152601b60205260408120805483929061129890849061ffff16615b35565b92506101000a81548161ffff021916908361ffff16021790555050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c6112df81612ebf565b8173ffffffffffffffffffffffffffffffffffffffff166112ff84611e51565b73ffffffffffffffffffffffffffffffffffffffff16146113625760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206e6565647320746f206f776e207468652070617373706f7274006044820152606401610d54565b50506000908152601a6020526040812060040155565b6000828152600b602052604090206001015461139381612ebf565b610eda83836135a6565b60006113a883612238565b821061141c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610d54565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16611475838361369a565b73ffffffffffffffffffffffffffffffffffffffff16146114d85760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610d54565b601c816040516114e8919061558d565b9081526040519081900360200190205460ff16156115485760405162461bcd60e51b815260206004820181905260248201527f5369676e61747572652068617320616c7265616479206265656e20757365642e6044820152606401610d54565b60155461ffff6401000000009091048116908616106115cf5760405162461bcd60e51b815260206004820152602f60248201527f547279696e6720746f206d696e74206d6f7265207468656e206d617820616c6c60448201527f6f776564207065722077616c6c657400000000000000000000000000000000006064820152608401610d54565b6018546115e09061ffff8716615af8565b34101561162f5760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207061696420656e6f75676800000000000000000000000000000000006044820152606401610d54565b601554611649908690640100000000900461ffff16615b35565b61ffff1661165633612238565b106116a35760405162461bcd60e51b815260206004820181905260248201527f6164647265737320616c7265616479206f776e73206d617820616c6c6f7765646044820152606401610d54565b60155463ffffffff16600161ffff87166116bc60145490565b6116c69190615aad565b6116d09190615b58565b111561171e5760405162461bcd60e51b815260206004820152601d60248201527f57696c6c2074616b6520796f75206f766572206d617820737570706c790000006044820152606401610d54565b6001601c82604051611730919061558d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560005b8561ffff168161ffff1610156117b35783156117965761179184866136f4565b6117a1565b6117a185600161325d565b806117ab81615c22565b915050611771565b506018546117c59061ffff8716615af8565b341115610fc157610fc1336018548761ffff166117e29190615af8565b6117ec9034615b58565b61382a565b73ffffffffffffffffffffffffffffffffffffffff8116331461187c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d54565b6118868282613950565b5050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c6118b481612ebf565b6000848152601a602052604090206001015463ffffffff808416640100000000909204161061193957604080518082018252600181527f4c0000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a9091529290922090516119339260029092019190614cb4565b50611a67565b6000848152601a602052604090206001015463ffffffff808516640100000000909204161080159061198c57506000848152601a602052604090206001015463ffffffff80841664010000000090920416105b156119e757604080518082018252600181527f500000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a9091529290922090516119339260029092019190614cb4565b6000848152601a602052604090206001015463ffffffff808516640100000000909204161015611a6757604080518082018252600181527f4e0000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a909152929092209051610fc19260029092019190614cb4565b50505050565b6013544790611a929073ffffffffffffffffffffffffffffffffffffffff168261382a565b50565b610eda8383836040518060200160405280600081525061274f565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611ada81612ebf565b6000838152601a602052604090206005018054611af990600190615b58565b81548110611b1757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601a60008581526020019081526020016000206005018381548110611b5757634e487b7160e01b600052603260045260246000fd5b9060005260206000200181905550601a6000848152602001908152602001600020600501805480611b9857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055505050565b6000611bbe60085490565b8210611c325760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610d54565b60088281548110611c5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab611c8f81612ebf565b50600e805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600f8054821690921790915560108054938516938216939093179092556011805491841691831682179055601280548316909117905560138054939092169216919091179055565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611d4781612ebf565b506000908152601a602090815260408220600501805460018101825590835291200155565b6060611d7f611d7a60145490565b613a0b565b905090565b60007f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611db081612ebf565b6000838152601a6020526040902060010154640100000000900463ffffffff1691505b50919050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611e0381612ebf565b6000838152601a60205260408120600101805461ffff85169290611e2e90849063ffffffff16615ac5565b92506101000a81548163ffffffff021916908363ffffffff160217905550505050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610c295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610d54565b60606000611ef683612238565b905060008167ffffffffffffffff811115611f2157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611f9e57816020015b611f8b6040518060e0016040528060008152602001600063ffffffff168152602001600063ffffffff168152602001606081526020016060815260200160008152602001606081525090565b815260200190600190039081611f3f5790505b50905060005b828110156121cb576000611fb8868361139d565b6000818152601a6020908152604091829020825160e08101845281548152600182015463ffffffff80821694830194909452640100000000900490921692820192909252600282018054939450909260608401919061201690615bed565b80601f016020809104026020016040519081016040528092919081815260200182805461204290615bed565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b505050505081526020016003820180546120a890615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546120d490615bed565b80156121215780601f106120f657610100808354040283529160200191612121565b820191906000526020600020905b81548152906001019060200180831161210457829003601f168201915b50505050508152602001600482015481526020016005820180548060200260200160405190810160405280929190818152602001828054801561218357602002820191906000526020600020905b81548152602001906001019080831161216f575b5050505050815250508383815181106121ac57634e487b7160e01b600052603260045260246000fd5b60200260200101819052505080806121c390615c44565b915050611fa4565b509392505050565b6000818152601a602090815260409182902060050180548351818402810184019094528084526060939283018282801561222c57602002820191906000526020600020905b815481526020019060010190808311612218575b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff82166122c35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610d54565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146123535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d54565b61235d6000613b59565b565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61238981612ebf565b73ffffffffffffffffffffffffffffffffffffffff82166123a957600080fd5b50600c805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155600d8054909216179055565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c61242581612ebf565b6000838152601a60205260408120600101805461ffff85169290611e2e90849063ffffffff16615b6f565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61247a81612ebf565b50601580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab6124dc81612ebf565b50601855565b606060018054610c3e90615bed565b611886338383613bd0565b606060006040518060400160405280600781526020017f436974697a656e000000000000000000000000000000000000000000000000008152509050601a6000848152602001908152602001600020600401546002141561258d575060408051808201909152600581527f4e6f6d616400000000000000000000000000000000000000000000000000000060208201525b6000838152601a6020526040808220600d5491517faa158c3800000000000000000000000000000000000000000000000000000000815260039091019173ffffffffffffffffffffffffffffffffffffffff169063aa158c38906125f89084906001906004016159c3565b60006040518083038186803b15801561261057600080fd5b505afa158015612624573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261264c91908101906151c5565b600d546000878152601a60205260409081902090517f85c496ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916385c496ad916126b5916003909101906004016159b0565b60006040518083038186803b1580156126cd57600080fd5b505afa1580156126e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261270991908101906151c5565b6000878152601a602090815260409182902091516127379594939288926002820192600390920191016155a9565b60408051601f19818403018152919052949350505050565b6127593383612ec9565b6127cb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d54565b611a6784848484613ce4565b6000818152601a60209081526040808320815160e08101835281548152600182015463ffffffff808216958301959095526401000000009004909316918301919091526002810180546060949392918386019161283390615bed565b80601f016020809104026020016040519081016040528092919081815260200182805461285f90615bed565b80156128ac5780601f10612881576101008083540402835291602001916128ac565b820191906000526020600020905b81548152906001019060200180831161288f57829003601f168201915b505050505081526020016003820180546128c590615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546128f190615bed565b801561293e5780601f106129135761010080835404028352916020019161293e565b820191906000526020600020905b81548152906001019060200180831161292157829003601f168201915b5050505050815260200160048201548152602001600582018054806020026020016040519081016040528092919081815260200182805480156129a057602002820191906000526020600020905b81548152602001906001019080831161298c575b50505091909252505060125460c083015151602084015160408086015190517f2acabed3000000000000000000000000000000000000000000000000000000008152600481018a9052602481019390935263ffffffff918216604484015216606482015292935073ffffffffffffffffffffffffffffffffffffffff1691632acabed3915060840160006040518083038186803b158015612a4057600080fd5b505afa158015612a54573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a7c91908101906151c5565b9392505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612aad81612ebf565b506000918252601a602052604090912060040155565b6000828152600b6020526040902060010154612ade81612ebf565b610eda8383613950565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c612b1281612ebf565b6000838152601a602052604090206001018054839190600490611e2e908490640100000000900463ffffffff16615ac5565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612b6e81612ebf565b612b7a60168686614d38565b50612b8760178484614d38565b505050505050565b601254604080517fe8a3d485000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff169163e8a3d485916004808301926000929190829003018186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d7f91908101906151c5565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612c9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff8116612d265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d54565b611a9281613b59565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c612d5981612ebf565b6000838152601a602052604090206001018054839190600490611e2e908490640100000000900463ffffffff16615b6f565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612db581612ebf565b61188682600161325d565b80546001019055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610c295750610c2982613d6d565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612e7982611e51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a928133613dc3565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16612f605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d54565b6000612f6b83611e51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd9575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061301757508373ffffffffffffffffffffffffffffffffffffffff16612fff84610cc1565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661303f82611e51565b73ffffffffffffffffffffffffffffffffffffffff16146130c85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610d54565b73ffffffffffffffffffffffffffffffffffffffff82166131505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d54565b61315b838383613e5d565b613166600082612e1f565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061319c908490615b58565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906131d7908490615aad565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061326860145490565b60155490915063ffffffff168111156132c35760405162461bcd60e51b815260206004820152600e60248201527f546f206d616e79206d696e7465640000000000000000000000000000000000006044820152606401610d54565b601554640100000000900461ffff166132db84612238565b106133285760405162461bcd60e51b815260206004820181905260248201527f6164647265737320616c7265616479206f776e73206d617820616c6c6f7765646044820152606401610d54565b6133328382613e68565b60006019613341600684615c7d565b8154811061335f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461337490615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546133a090615bed565b80156133ed5780601f106133c2576101008083540402835291602001916133ed565b820191906000526020600020905b8154815290600101906020018083116133d057829003601f168201915b505050505090506000600190506002836134079190615c7d565b60011415613413575060025b6040518060e001604052808481526020018563ffffffff168152602001600063ffffffff1681526020016040518060400160405280600181526020017f4e000000000000000000000000000000000000000000000000000000000000008152508152602001838152602001828152602001600067ffffffffffffffff8111156134ac57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134d5578160200160208202803683370190505b5090526000848152601a602090815260409182902083518155838201516001820180549486015163ffffffff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090961692169190911793909317909255606083015180516135539260028501920190614cb4565b506080820151805161356f916003840191602090910190614cb4565b5060a0820151600482015560c08201518051613595916005840191602090910190614dca565b505060148054600101905550610fc1565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611886576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561363c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c016040516020818303038152906040528051906020012090506130178184613e82565b60006136ff60145490565b90508083106137505760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e204944000000000000000000000000000000006044820152606401610d54565b61375b82600261325d565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663139dbb6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c357600080fd5b505afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190615254565b6000848152601a60205260408120600101805461ffff9390931692909190611e2e90849063ffffffff16615ac5565b8047101561387a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d54565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146138d4576040519150601f19603f3d011682016040523d82523d6000602084013e6138d9565b606091505b5050905080610eda5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d54565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615611886576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606081613a4b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613a755780613a5f81615c44565b9150613a6e9050600a83615ae4565b9150613a4f565b60008167ffffffffffffffff811115613a9e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613ac8576020820181803683370190505b5090505b841561301757613add600183615b58565b9150613aea600a86615c7d565b613af5906030615aad565b60f81b818381518110613b1857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613b52600a86615ae4565b9450613acc565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613cef84848461301f565b613cfb84848484613e9e565b611a675760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610c295750610c2982614065565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661188657613e1b8173ffffffffffffffffffffffffffffffffffffffff166014614148565b613e26836020614148565b604051602001613e379291906157ca565b60408051601f198184030181529082905262461bcd60e51b8252610d549160040161599d565b610eda8383836143b7565b6118868282604051806020016040528060008152506144bd565b6000806000613e918585614546565b915091506121cb816145b6565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561405a576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613f1590339089908890889060040161584b565b602060405180830381600087803b158015613f2f57600080fd5b505af1925050508015613f5f575060408051601f3d908101601f19168201909252613f5c91810190615140565b60015b61400f573d808015613f8d576040519150601f19603f3d011682016040523d82523d6000602084013e613f92565b606091505b5080516140075760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613017565b506001949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806140f857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610c29565b60606000614157836002615af8565b614162906002615aad565b67ffffffffffffffff81111561418857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156141b2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106141f757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061426857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006142a4846002615af8565b6142af906001615aad565b90505b6001811115614368577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106142fe57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061432257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361436181615bb8565b90506142b2565b508315612a7c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff831661441f5761441a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61445c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461445c5761445c83826147ed565b73ffffffffffffffffffffffffffffffffffffffff821661448057610eda816148a4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610eda57610eda828261497d565b6144c783836149ce565b6144d46000848484613e9e565b610eda5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b60008082516041141561457d5760208301516040840151606085015160001a61457187828585614b68565b945094505050506145af565b8251604014156145a7576020830151604084015161459c868383614c62565b9350935050506145af565b506000905060025b9250929050565b60008160048111156145d857634e487b7160e01b600052602160045260246000fd5b14156145e15750565b600181600481111561460357634e487b7160e01b600052602160045260246000fd5b14156146515760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d54565b600281600481111561467357634e487b7160e01b600052602160045260246000fd5b14156146c15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d54565b60038160048111156146e357634e487b7160e01b600052602160045260246000fd5b14156147575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b600481600481111561477957634e487b7160e01b600052602160045260246000fd5b1415611a925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b600060016147fa84612238565b6148049190615b58565b6000838152600760205260409020549091508082146148645773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906148b690600190615b58565b600083815260096020526040812054600880549394509092849081106148ec57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061491b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061496157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061498883612238565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216614a315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d54565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615614aa35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d54565b614aaf60008383613e5d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290614ae5908490615aad565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614b9f5750600090506003614c59565b8460ff16601b14158015614bb757508460ff16601c14155b15614bc85750600090506004614c59565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c1c573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116614c5257600060019250925050614c59565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681614c9860ff86901c601b615aad565b9050614ca687828885614b68565b935093505050935093915050565b828054614cc090615bed565b90600052602060002090601f016020900481019282614ce25760008555614d28565b82601f10614cfb57805160ff1916838001178555614d28565b82800160010185558215614d28579182015b82811115614d28578251825591602001919060010190614d0d565b50614d34929150614e04565b5090565b828054614d4490615bed565b90600052602060002090601f016020900481019282614d665760008555614d28565b82601f10614d9d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614d28565b82800160010185558215614d28579182015b82811115614d28578235825591602001919060010190614daf565b828054828255906000526020600020908101928215614d285791602002820182811115614d28578251825591602001919060010190614d0d565b5b80821115614d345760008155600101614e05565b600082601f830112614e29578081fd5b8135614e3c614e3782615a5f565b615a2e565b818152846020838601011115614e50578283fd5b816020850160208301379081016020019190915292915050565b60008083601f840112614e7b578182fd5b50813567ffffffffffffffff811115614e92578182fd5b6020830191508360208285010111156145af57600080fd5b803563ffffffff81168114614ebe57600080fd5b919050565b600060208284031215614ed4578081fd5b8135612a7c81615cd3565b60008060008060808587031215614ef4578283fd5b8435614eff81615cd3565b93506020850135614f0f81615cd3565b92506040850135614f1f81615cd3565b91506060850135614f2f81615cd3565b939692955090935050565b60008060408385031215614f4c578182fd5b8235614f5781615cd3565b91506020830135614f6781615cd3565b809150509250929050565b600080600060608486031215614f86578283fd5b8335614f9181615cd3565b92506020840135614fa181615cd3565b929592945050506040919091013590565b60008060008060808587031215614fc7578384fd5b8435614fd281615cd3565b93506020850135614fe281615cd3565b925060408501359150606085013567ffffffffffffffff811115615004578182fd5b61501087828801614e19565b91505092959194509250565b6000806040838503121561502e578182fd5b823561503981615cd3565b915060208301358015158114614f67578182fd5b6000806040838503121561505f578182fd5b823561506a81615cd3565b946020939093013593505050565b6000806020838503121561508a578182fd5b823567ffffffffffffffff808211156150a1578384fd5b818501915085601f8301126150b4578384fd5b8135818111156150c2578485fd5b8660208260051b85010111156150d6578485fd5b60209290920196919550909350505050565b6000602082840312156150f9578081fd5b5035919050565b60008060408385031215615112578182fd5b823591506020830135614f6781615cd3565b600060208284031215615135578081fd5b8135612a7c81615cf5565b600060208284031215615151578081fd5b8151612a7c81615cf5565b60008060008060408587031215615171578182fd5b843567ffffffffffffffff80821115615188578384fd5b61519488838901614e6a565b909650945060208701359150808211156151ac578384fd5b506151b987828801614e6a565b95989497509550505050565b6000602082840312156151d6578081fd5b815167ffffffffffffffff8111156151ec578182fd5b8201601f810184136151fc578182fd5b805161520a614e3782615a5f565b81815285602083850101111561521e578384fd5b61522f826020830160208601615b8c565b95945050505050565b600060208284031215615249578081fd5b8135612a7c81615d23565b600060208284031215615265578081fd5b8151612a7c81615d23565b600080600080600060a08688031215615287578283fd5b853561529281615d23565b945060208601356152a281615cd3565b93506040860135925060608601359150608086013567ffffffffffffffff8111156152cb578182fd5b6152d788828901614e19565b9150509295509295909350565b600080600080606085870312156152f9578182fd5b84359350602085013567ffffffffffffffff811115615316578283fd5b61532287828801614e6a565b9094509250615335905060408601614eaa565b905092959194509250565b60008060408385031215615352578182fd5b823591506020830135614f6781615d23565b60008060408385031215615376578182fd5b50508035926020909101359150565b60008060408385031215615397578182fd5b823591506153a760208401614eaa565b90509250929050565b6000806000606084860312156153c4578081fd5b833592506153d460208501614eaa565b91506153e260408501614eaa565b90509250925092565b6000602082840312156153fc578081fd5b612a7c82614eaa565b6000815180845260208085019450808401835b8381101561543457815187529582019590820190600101615418565b509495945050505050565b60008151808452615457816020860160208601615b8c565b601f01601f19169290920160200192915050565b6000815461547881615bed565b80855260206001838116801561549557600181146154c7576154f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901526040880195506154f5565b866000528260002060005b858110156154ed5781548a82018601529083019084016154d2565b890184019650505b505050505092915050565b6000815461550d81615bed565b60018281168015615525576001811461555457615583565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528287019450615583565b8560005260208060002060005b8581101561557a5781548a820152908401908201615561565b50505082870194505b5050505092915050565b6000825161559f818460208701615b8c565b9190910192915050565b7f7b226e616d65223a20220000000000000000000000000000000000000000000081527f50617373706f72743a2000000000000000000000000000000000000000000000600a82015260006156016014830189615500565b7f222c20226465736372697074696f6e223a20220000000000000000000000000081527f222c2022696d616765223a2022000000000000000000000000000000000000006013820152875161565d816020840160208c01615b8c565b8082019150507f222c2022616e696d6174696f6e5f75726c223a202200000000000000000000006020820152865161569c816035840160208b01615b8c565b7f222c202261747472696275746573223a205b7b202274726169745f7479706522603592909101918201527f3a202241766174617220574c222c202276616c7565223a2022000000000000006055820152855161570081606e840160208a01615b8c565b6157bc6157b6615767615761606e858701017f227d2c7b202274726169745f74797065223a202252616e6b222c202276616c7581527f65223a2022000000000000000000000000000000000000000000000000000000602082015260250190565b89615500565b7f227d2c7b202274726169745f74797065223a2022456c656d656e74222c20227681527f616c7565223a2022000000000000000000000000000000000000000000000000602082015260280190565b86615500565b9a9950505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615802816017850160208801615b8c565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161583f816028840160208801615b8c565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261588a608083018461543f565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561597c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160e0815185528882015163ffffffff8082168b880152808a850151168a880152505060608083015182828801526159248388018261543f565b925050506080808301518683038288015261593f838261543f565b9250505060a080830151818701525060c080830151925085820381870152506159688183615405565b9689019694505050908601906001016158ba565b509098975050505050505050565b602081526000612a7c6020830184615405565b602081526000612a7c602083018461543f565b602081526000612a7c602083018461546b565b6040815260006159d6604083018561546b565b905061ffff831660208301529392505050565b8481526060602082015282606082015282846080830137600080608085840101526080601f19601f860116830101905063ffffffff8316604083015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615a5757615a57615cbd565b604052919050565b600067ffffffffffffffff821115615a7957615a79615cbd565b50601f01601f191660200190565b600061ffff808316818516808303821115615aa457615aa4615c91565b01949350505050565b60008219821115615ac057615ac0615c91565b500190565b600063ffffffff808316818516808303821115615aa457615aa4615c91565b600082615af357615af3615ca7565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b3057615b30615c91565b500290565b600061ffff83811690831681811015615b5057615b50615c91565b039392505050565b600082821015615b6a57615b6a615c91565b500390565b600063ffffffff83811690831681811015615b5057615b50615c91565b60005b83811015615ba7578181015183820152602001615b8f565b83811115611a675750506000910152565b600081615bc757615bc7615c91565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680615c0157607f821691505b60208210811415611dd357634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415615c3a57615c3a615c91565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c7657615c76615c91565b5060010190565b600082615c8c57615c8c615ca7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a9257600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611a9257600080fd5b61ffff81168114611a9257600080fdfea2646970667358221220ba9e70c264a16f49af0ee0a05ade5864e8b04a1e1f763a73f668a68db7a9ecf464736f6c63430008040033000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc4490000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
Deployed Bytecode
0x6080604052600436106103975760003560e01c80636352211e116101dc578063a22cb46511610102578063db8d6050116100a0578063f1cf64091161006f578063f1cf640914610ba1578063f2fde38b14610bbe578063f687c3ce14610bde578063fa07ce1d14610bfe57600080fd5b8063db8d605014610af6578063df69124b14610b16578063e8a3d48514610b36578063e985e9c514610b4b57600080fd5b8063c6f414a8116100dc578063c6f414a814610a80578063c87b56dd14610a96578063d229771c14610ab6578063d547741f14610ad657600080fd5b8063a22cb46514610a20578063b173803514610a40578063b88d4fde14610a6057600080fd5b80637f9a105c1161017a57806391b7f5ed1161014957806391b7f5ed1461098357806391d14854146109a357806395d89b41146109f6578063a217fddf14610a0b57600080fd5b80637f9a105c146108f857806387a0fcd2146109185780638da5cb5b1461093857806390de88331461096357600080fd5b80636e00af34116101b65780636e00af341461086757806370a082311461089d578063715018a6146108bd5780637d53e615146108d257600080fd5b80636352211e146107ed578063644f1ea91461080d57806367ad1a9b1461083a57600080fd5b80632f745c59116102c15780634886dbf11161025f578063538d9f5a1161022e578063538d9f5a1461077857806356189236146107985780635c103fd2146107ad578063621c1f94146107cd57600080fd5b80634886dbf1146106cd5780634a3895d6146106ed5780634f6ccce7146107385780634ffcefd31461075857600080fd5b80633870889f1161029b5780633870889f146106445780633ccfd60b1461066457806342842e0e1461067957806347e633801461069957600080fd5b80632f745c59146105f157806335672ef81461061157806336568abe1461062457600080fd5b806318160ddd11610339578063248a9ca311610308578063248a9ca314610561578063281ca2fc1461059157806329591a6f146105b15780632f2ff15d146105d157600080fd5b806318160ddd146104ec5780631af5bf6914610501578063201b1a651461052157806323b872dd1461054157600080fd5b806307b260ab1161037557806307b260ab14610435578063081812fc14610465578063095ea7b3146104aa57806316c85277146104cc57600080fd5b806301ffc9a71461039c57806303fe46ab146103d157806306fdde0314610413575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004615124565b610c1e565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506104057f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c81565b6040519081526020016103c8565b34801561041f57600080fd5b50610428610c2f565b6040516103c8919061599d565b34801561044157600080fd5b506104056104503660046150e8565b6000908152601a602052604090206004015490565b34801561047157600080fd5b506104856104803660046150e8565b610cc1565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103c8565b3480156104b657600080fd5b506104ca6104c536600461504d565b610d86565b005b3480156104d857600080fd5b506104ca6104e7366004615078565b610edf565b3480156104f857600080fd5b50600854610405565b34801561050d57600080fd5b506104ca61051c3660046152e4565b610fc8565b34801561052d57600080fd5b506104ca61053c366004615238565b6110ef565b34801561054d57600080fd5b506104ca61055c366004614f72565b611157565b34801561056d57600080fd5b5061040561057c3660046150e8565b6000908152600b602052604090206001015490565b34801561059d57600080fd5b506104ca6105ac366004615238565b6111de565b3480156105bd57600080fd5b506104ca6105cc366004615100565b6112b5565b3480156105dd57600080fd5b506104ca6105ec366004615100565b611378565b3480156105fd57600080fd5b5061040561060c36600461504d565b61139d565b6104ca61061f366004615270565b611452565b34801561063057600080fd5b506104ca61063f366004615100565b6117f1565b34801561065057600080fd5b506104ca61065f3660046153b0565b61188a565b34801561067057600080fd5b506104ca611a6d565b34801561068557600080fd5b506104ca610694366004614f72565b611a95565b3480156106a557600080fd5b506104057f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab81565b3480156106d957600080fd5b506104ca6106e8366004615364565b611ab0565b3480156106f957600080fd5b506107236107083660046150e8565b6000908152601a602052604090206001015463ffffffff1690565b60405163ffffffff90911681526020016103c8565b34801561074457600080fd5b506104056107533660046150e8565b611bb3565b34801561076457600080fd5b506104ca610773366004614edf565b611c65565b34801561078457600080fd5b506104ca610793366004615364565b611d1d565b3480156107a457600080fd5b50610428611d6c565b3480156107b957600080fd5b506107236107c83660046150e8565b611d84565b3480156107d957600080fd5b506104ca6107e8366004615340565b611dd9565b3480156107f957600080fd5b506104856108083660046150e8565b611e51565b34801561081957600080fd5b5061082d610828366004614ec3565b611ee9565b6040516103c89190615894565b34801561084657600080fd5b5061085a6108553660046150e8565b6121d3565b6040516103c8919061598a565b34801561087357600080fd5b5060155461088a90640100000000900461ffff1681565b60405161ffff90911681526020016103c8565b3480156108a957600080fd5b506104056108b8366004614ec3565b612238565b3480156108c957600080fd5b506104ca6122ec565b3480156108de57600080fd5b50336000908152601b602052604090205461ffff1661088a565b34801561090457600080fd5b506104ca610913366004614ec3565b61235f565b34801561092457600080fd5b506104ca610933366004615340565b6123fb565b34801561094457600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610485565b34801561096f57600080fd5b506104ca61097e3660046153eb565b612450565b34801561098f57600080fd5b506104ca61099e3660046150e8565b6124b2565b3480156109af57600080fd5b506103bc6109be366004615100565b6000918252600b6020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610a0257600080fd5b506104286124e2565b348015610a1757600080fd5b50610405600081565b348015610a2c57600080fd5b506104ca610a3b36600461501c565b6124f1565b348015610a4c57600080fd5b50610428610a5b3660046150e8565b6124fc565b348015610a6c57600080fd5b506104ca610a7b366004614fb2565b61274f565b348015610a8c57600080fd5b5061040560185481565b348015610aa257600080fd5b50610428610ab13660046150e8565b6127d7565b348015610ac257600080fd5b506104ca610ad1366004615364565b612a83565b348015610ae257600080fd5b506104ca610af1366004615100565b612ac3565b348015610b0257600080fd5b506104ca610b11366004615385565b612ae8565b348015610b2257600080fd5b506104ca610b3136600461515c565b612b44565b348015610b4257600080fd5b50610428612b8f565b348015610b5757600080fd5b506103bc610b66366004614f3a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bad57600080fd5b506015546107239063ffffffff1681565b348015610bca57600080fd5b506104ca610bd9366004614ec3565b612c36565b348015610bea57600080fd5b506104ca610bf9366004615385565b612d2f565b348015610c0a57600080fd5b506104ca610c19366004614ec3565b612d8b565b6000610c2982612dc9565b92915050565b606060008054610c3e90615bed565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6a90615bed565b8015610cb75780601f10610c8c57610100808354040283529160200191610cb7565b820191906000526020600020905b815481529060010190602001808311610c9a57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610d5d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d9182611e51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e355760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b3373ffffffffffffffffffffffffffffffffffffffff82161480610e5e5750610e5e8133610b66565b610ed05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d54565b610eda8383612e1f565b505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab610f0981612ebf565b8160005b818161ffff161015610fc1576001601b600087878561ffff16818110610f4357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f589190614ec3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081208054909190610f9490849061ffff16615a87565b92506101000a81548161ffff021916908361ffff1602179055508080610fb990615c22565b915050610f0d565b5050505050565b33610fd285611e51565b73ffffffffffffffffffffffffffffffffffffffff161461105b5760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374206f776e207468652070617373706f727420746f20636c6160448201527f696d2077696e206368616e636520696e637265617365730000000000000000006064820152608401610d54565b600f546040517f4af2407100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634af24071906110b79087908790879087906004016159e9565b600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b5050505050505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61111981612ebf565b506015805461ffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff909216919091179055565b6111613382612ec9565b6111d35760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d54565b610eda83838361301f565b336000908152601b602052604090205461ffff808316911610156112445760405162461bcd60e51b815260206004820152601960248201527f6e6f74206f6e207468652066726565206d696e74206c697374000000000000006044820152606401610d54565b60005b8161ffff168161ffff1610156112745761126233600261325d565b8061126c81615c22565b915050611247565b50336000908152601b60205260408120805483929061129890849061ffff16615b35565b92506101000a81548161ffff021916908361ffff16021790555050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c6112df81612ebf565b8173ffffffffffffffffffffffffffffffffffffffff166112ff84611e51565b73ffffffffffffffffffffffffffffffffffffffff16146113625760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206e6565647320746f206f776e207468652070617373706f7274006044820152606401610d54565b50506000908152601a6020526040812060040155565b6000828152600b602052604090206001015461139381612ebf565b610eda83836135a6565b60006113a883612238565b821061141c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610d54565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16611475838361369a565b73ffffffffffffffffffffffffffffffffffffffff16146114d85760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610d54565b601c816040516114e8919061558d565b9081526040519081900360200190205460ff16156115485760405162461bcd60e51b815260206004820181905260248201527f5369676e61747572652068617320616c7265616479206265656e20757365642e6044820152606401610d54565b60155461ffff6401000000009091048116908616106115cf5760405162461bcd60e51b815260206004820152602f60248201527f547279696e6720746f206d696e74206d6f7265207468656e206d617820616c6c60448201527f6f776564207065722077616c6c657400000000000000000000000000000000006064820152608401610d54565b6018546115e09061ffff8716615af8565b34101561162f5760405162461bcd60e51b815260206004820152600f60248201527f6e6f74207061696420656e6f75676800000000000000000000000000000000006044820152606401610d54565b601554611649908690640100000000900461ffff16615b35565b61ffff1661165633612238565b106116a35760405162461bcd60e51b815260206004820181905260248201527f6164647265737320616c7265616479206f776e73206d617820616c6c6f7765646044820152606401610d54565b60155463ffffffff16600161ffff87166116bc60145490565b6116c69190615aad565b6116d09190615b58565b111561171e5760405162461bcd60e51b815260206004820152601d60248201527f57696c6c2074616b6520796f75206f766572206d617820737570706c790000006044820152606401610d54565b6001601c82604051611730919061558d565b90815260405190819003602001902080549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921691909117905560005b8561ffff168161ffff1610156117b35783156117965761179184866136f4565b6117a1565b6117a185600161325d565b806117ab81615c22565b915050611771565b506018546117c59061ffff8716615af8565b341115610fc157610fc1336018548761ffff166117e29190615af8565b6117ec9034615b58565b61382a565b73ffffffffffffffffffffffffffffffffffffffff8116331461187c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d54565b6118868282613950565b5050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c6118b481612ebf565b6000848152601a602052604090206001015463ffffffff808416640100000000909204161061193957604080518082018252600181527f4c0000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a9091529290922090516119339260029092019190614cb4565b50611a67565b6000848152601a602052604090206001015463ffffffff808516640100000000909204161080159061198c57506000848152601a602052604090206001015463ffffffff80841664010000000090920416105b156119e757604080518082018252600181527f500000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a9091529290922090516119339260029092019190614cb4565b6000848152601a602052604090206001015463ffffffff808516640100000000909204161015611a6757604080518082018252600181527f4e0000000000000000000000000000000000000000000000000000000000000060208083019182526000888152601a909152929092209051610fc19260029092019190614cb4565b50505050565b6013544790611a929073ffffffffffffffffffffffffffffffffffffffff168261382a565b50565b610eda8383836040518060200160405280600081525061274f565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611ada81612ebf565b6000838152601a602052604090206005018054611af990600190615b58565b81548110611b1757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601a60008581526020019081526020016000206005018381548110611b5757634e487b7160e01b600052603260045260246000fd5b9060005260206000200181905550601a6000848152602001908152602001600020600501805480611b9857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055505050565b6000611bbe60085490565b8210611c325760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610d54565b60088281548110611c5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab611c8f81612ebf565b50600e805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600f8054821690921790915560108054938516938216939093179092556011805491841691831682179055601280548316909117905560138054939092169216919091179055565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611d4781612ebf565b506000908152601a602090815260408220600501805460018101825590835291200155565b6060611d7f611d7a60145490565b613a0b565b905090565b60007f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611db081612ebf565b6000838152601a6020526040902060010154640100000000900463ffffffff1691505b50919050565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c611e0381612ebf565b6000838152601a60205260408120600101805461ffff85169290611e2e90849063ffffffff16615ac5565b92506101000a81548163ffffffff021916908363ffffffff160217905550505050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610c295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610d54565b60606000611ef683612238565b905060008167ffffffffffffffff811115611f2157634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611f9e57816020015b611f8b6040518060e0016040528060008152602001600063ffffffff168152602001600063ffffffff168152602001606081526020016060815260200160008152602001606081525090565b815260200190600190039081611f3f5790505b50905060005b828110156121cb576000611fb8868361139d565b6000818152601a6020908152604091829020825160e08101845281548152600182015463ffffffff80821694830194909452640100000000900490921692820192909252600282018054939450909260608401919061201690615bed565b80601f016020809104026020016040519081016040528092919081815260200182805461204290615bed565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b505050505081526020016003820180546120a890615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546120d490615bed565b80156121215780601f106120f657610100808354040283529160200191612121565b820191906000526020600020905b81548152906001019060200180831161210457829003601f168201915b50505050508152602001600482015481526020016005820180548060200260200160405190810160405280929190818152602001828054801561218357602002820191906000526020600020905b81548152602001906001019080831161216f575b5050505050815250508383815181106121ac57634e487b7160e01b600052603260045260246000fd5b60200260200101819052505080806121c390615c44565b915050611fa4565b509392505050565b6000818152601a602090815260409182902060050180548351818402810184019094528084526060939283018282801561222c57602002820191906000526020600020905b815481526020019060010190808311612218575b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff82166122c35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610d54565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146123535760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d54565b61235d6000613b59565b565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61238981612ebf565b73ffffffffffffffffffffffffffffffffffffffff82166123a957600080fd5b50600c805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909155600d8054909216179055565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c61242581612ebf565b6000838152601a60205260408120600101805461ffff85169290611e2e90849063ffffffff16615b6f565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab61247a81612ebf565b50601580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab6124dc81612ebf565b50601855565b606060018054610c3e90615bed565b611886338383613bd0565b606060006040518060400160405280600781526020017f436974697a656e000000000000000000000000000000000000000000000000008152509050601a6000848152602001908152602001600020600401546002141561258d575060408051808201909152600581527f4e6f6d616400000000000000000000000000000000000000000000000000000060208201525b6000838152601a6020526040808220600d5491517faa158c3800000000000000000000000000000000000000000000000000000000815260039091019173ffffffffffffffffffffffffffffffffffffffff169063aa158c38906125f89084906001906004016159c3565b60006040518083038186803b15801561261057600080fd5b505afa158015612624573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261264c91908101906151c5565b600d546000878152601a60205260409081902090517f85c496ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916385c496ad916126b5916003909101906004016159b0565b60006040518083038186803b1580156126cd57600080fd5b505afa1580156126e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261270991908101906151c5565b6000878152601a602090815260409182902091516127379594939288926002820192600390920191016155a9565b60408051601f19818403018152919052949350505050565b6127593383612ec9565b6127cb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d54565b611a6784848484613ce4565b6000818152601a60209081526040808320815160e08101835281548152600182015463ffffffff808216958301959095526401000000009004909316918301919091526002810180546060949392918386019161283390615bed565b80601f016020809104026020016040519081016040528092919081815260200182805461285f90615bed565b80156128ac5780601f10612881576101008083540402835291602001916128ac565b820191906000526020600020905b81548152906001019060200180831161288f57829003601f168201915b505050505081526020016003820180546128c590615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546128f190615bed565b801561293e5780601f106129135761010080835404028352916020019161293e565b820191906000526020600020905b81548152906001019060200180831161292157829003601f168201915b5050505050815260200160048201548152602001600582018054806020026020016040519081016040528092919081815260200182805480156129a057602002820191906000526020600020905b81548152602001906001019080831161298c575b50505091909252505060125460c083015151602084015160408086015190517f2acabed3000000000000000000000000000000000000000000000000000000008152600481018a9052602481019390935263ffffffff918216604484015216606482015292935073ffffffffffffffffffffffffffffffffffffffff1691632acabed3915060840160006040518083038186803b158015612a4057600080fd5b505afa158015612a54573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a7c91908101906151c5565b9392505050565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612aad81612ebf565b506000918252601a602052604090912060040155565b6000828152600b6020526040902060010154612ade81612ebf565b610eda8383613950565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c612b1281612ebf565b6000838152601a602052604090206001018054839190600490611e2e908490640100000000900463ffffffff16615ac5565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612b6e81612ebf565b612b7a60168686614d38565b50612b8760178484614d38565b505050505050565b601254604080517fe8a3d485000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff169163e8a3d485916004808301926000929190829003018186803b158015612bfa57600080fd5b505afa158015612c0e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d7f91908101906151c5565b600a5473ffffffffffffffffffffffffffffffffffffffff163314612c9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff8116612d265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d54565b611a9281613b59565b7f364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223c612d5981612ebf565b6000838152601a602052604090206001018054839190600490611e2e908490640100000000900463ffffffff16615b6f565b7f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab612db581612ebf565b61188682600161325d565b80546001019055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610c295750610c2982613d6d565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612e7982611e51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a928133613dc3565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16612f605760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d54565b6000612f6b83611e51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fd9575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061301757508373ffffffffffffffffffffffffffffffffffffffff16612fff84610cc1565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661303f82611e51565b73ffffffffffffffffffffffffffffffffffffffff16146130c85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610d54565b73ffffffffffffffffffffffffffffffffffffffff82166131505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d54565b61315b838383613e5d565b613166600082612e1f565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061319c908490615b58565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906131d7908490615aad565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061326860145490565b60155490915063ffffffff168111156132c35760405162461bcd60e51b815260206004820152600e60248201527f546f206d616e79206d696e7465640000000000000000000000000000000000006044820152606401610d54565b601554640100000000900461ffff166132db84612238565b106133285760405162461bcd60e51b815260206004820181905260248201527f6164647265737320616c7265616479206f776e73206d617820616c6c6f7765646044820152606401610d54565b6133328382613e68565b60006019613341600684615c7d565b8154811061335f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461337490615bed565b80601f01602080910402602001604051908101604052809291908181526020018280546133a090615bed565b80156133ed5780601f106133c2576101008083540402835291602001916133ed565b820191906000526020600020905b8154815290600101906020018083116133d057829003601f168201915b505050505090506000600190506002836134079190615c7d565b60011415613413575060025b6040518060e001604052808481526020018563ffffffff168152602001600063ffffffff1681526020016040518060400160405280600181526020017f4e000000000000000000000000000000000000000000000000000000000000008152508152602001838152602001828152602001600067ffffffffffffffff8111156134ac57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134d5578160200160208202803683370190505b5090526000848152601a602090815260409182902083518155838201516001820180549486015163ffffffff908116640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090961692169190911793909317909255606083015180516135539260028501920190614cb4565b506080820151805161356f916003840191602090910190614cb4565b5060a0820151600482015560c08201518051613595916005840191602090910190614dca565b505060148054600101905550610fc1565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611886576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561363c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c016040516020818303038152906040528051906020012090506130178184613e82565b60006136ff60145490565b90508083106137505760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e204944000000000000000000000000000000006044820152606401610d54565b61375b82600261325d565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663139dbb6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137c357600080fd5b505afa1580156137d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fb9190615254565b6000848152601a60205260408120600101805461ffff9390931692909190611e2e90849063ffffffff16615ac5565b8047101561387a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d54565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146138d4576040519150601f19603f3d011682016040523d82523d6000602084013e6138d9565b606091505b5050905080610eda5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d54565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615611886576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606081613a4b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613a755780613a5f81615c44565b9150613a6e9050600a83615ae4565b9150613a4f565b60008167ffffffffffffffff811115613a9e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613ac8576020820181803683370190505b5090505b841561301757613add600183615b58565b9150613aea600a86615c7d565b613af5906030615aad565b60f81b818381518110613b1857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613b52600a86615ae4565b9450613acc565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613cef84848461301f565b613cfb84848484613e9e565b611a675760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610c295750610c2982614065565b6000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661188657613e1b8173ffffffffffffffffffffffffffffffffffffffff166014614148565b613e26836020614148565b604051602001613e379291906157ca565b60408051601f198184030181529082905262461bcd60e51b8252610d549160040161599d565b610eda8383836143b7565b6118868282604051806020016040528060008152506144bd565b6000806000613e918585614546565b915091506121cb816145b6565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561405a576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613f1590339089908890889060040161584b565b602060405180830381600087803b158015613f2f57600080fd5b505af1925050508015613f5f575060408051601f3d908101601f19168201909252613f5c91810190615140565b60015b61400f573d808015613f8d576040519150601f19603f3d011682016040523d82523d6000602084013e613f92565b606091505b5080516140075760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050613017565b506001949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806140f857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610c29565b60606000614157836002615af8565b614162906002615aad565b67ffffffffffffffff81111561418857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156141b2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106141f757634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061426857634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006142a4846002615af8565b6142af906001615aad565b90505b6001811115614368577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106142fe57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061432257634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361436181615bb8565b90506142b2565b508315612a7c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d54565b73ffffffffffffffffffffffffffffffffffffffff831661441f5761441a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61445c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461445c5761445c83826147ed565b73ffffffffffffffffffffffffffffffffffffffff821661448057610eda816148a4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610eda57610eda828261497d565b6144c783836149ce565b6144d46000848484613e9e565b610eda5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d54565b60008082516041141561457d5760208301516040840151606085015160001a61457187828585614b68565b945094505050506145af565b8251604014156145a7576020830151604084015161459c868383614c62565b9350935050506145af565b506000905060025b9250929050565b60008160048111156145d857634e487b7160e01b600052602160045260246000fd5b14156145e15750565b600181600481111561460357634e487b7160e01b600052602160045260246000fd5b14156146515760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d54565b600281600481111561467357634e487b7160e01b600052602160045260246000fd5b14156146c15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d54565b60038160048111156146e357634e487b7160e01b600052602160045260246000fd5b14156147575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b600481600481111561477957634e487b7160e01b600052602160045260246000fd5b1415611a925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d54565b600060016147fa84612238565b6148049190615b58565b6000838152600760205260409020549091508082146148645773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906148b690600190615b58565b600083815260096020526040812054600880549394509092849081106148ec57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061491b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061496157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061498883612238565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216614a315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d54565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615614aa35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d54565b614aaf60008383613e5d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290614ae5908490615aad565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614b9f5750600090506003614c59565b8460ff16601b14158015614bb757508460ff16601c14155b15614bc85750600090506004614c59565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c1c573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116614c5257600060019250925050614c59565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681614c9860ff86901c601b615aad565b9050614ca687828885614b68565b935093505050935093915050565b828054614cc090615bed565b90600052602060002090601f016020900481019282614ce25760008555614d28565b82601f10614cfb57805160ff1916838001178555614d28565b82800160010185558215614d28579182015b82811115614d28578251825591602001919060010190614d0d565b50614d34929150614e04565b5090565b828054614d4490615bed565b90600052602060002090601f016020900481019282614d665760008555614d28565b82601f10614d9d578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614d28565b82800160010185558215614d28579182015b82811115614d28578235825591602001919060010190614daf565b828054828255906000526020600020908101928215614d285791602002820182811115614d28578251825591602001919060010190614d0d565b5b80821115614d345760008155600101614e05565b600082601f830112614e29578081fd5b8135614e3c614e3782615a5f565b615a2e565b818152846020838601011115614e50578283fd5b816020850160208301379081016020019190915292915050565b60008083601f840112614e7b578182fd5b50813567ffffffffffffffff811115614e92578182fd5b6020830191508360208285010111156145af57600080fd5b803563ffffffff81168114614ebe57600080fd5b919050565b600060208284031215614ed4578081fd5b8135612a7c81615cd3565b60008060008060808587031215614ef4578283fd5b8435614eff81615cd3565b93506020850135614f0f81615cd3565b92506040850135614f1f81615cd3565b91506060850135614f2f81615cd3565b939692955090935050565b60008060408385031215614f4c578182fd5b8235614f5781615cd3565b91506020830135614f6781615cd3565b809150509250929050565b600080600060608486031215614f86578283fd5b8335614f9181615cd3565b92506020840135614fa181615cd3565b929592945050506040919091013590565b60008060008060808587031215614fc7578384fd5b8435614fd281615cd3565b93506020850135614fe281615cd3565b925060408501359150606085013567ffffffffffffffff811115615004578182fd5b61501087828801614e19565b91505092959194509250565b6000806040838503121561502e578182fd5b823561503981615cd3565b915060208301358015158114614f67578182fd5b6000806040838503121561505f578182fd5b823561506a81615cd3565b946020939093013593505050565b6000806020838503121561508a578182fd5b823567ffffffffffffffff808211156150a1578384fd5b818501915085601f8301126150b4578384fd5b8135818111156150c2578485fd5b8660208260051b85010111156150d6578485fd5b60209290920196919550909350505050565b6000602082840312156150f9578081fd5b5035919050565b60008060408385031215615112578182fd5b823591506020830135614f6781615cd3565b600060208284031215615135578081fd5b8135612a7c81615cf5565b600060208284031215615151578081fd5b8151612a7c81615cf5565b60008060008060408587031215615171578182fd5b843567ffffffffffffffff80821115615188578384fd5b61519488838901614e6a565b909650945060208701359150808211156151ac578384fd5b506151b987828801614e6a565b95989497509550505050565b6000602082840312156151d6578081fd5b815167ffffffffffffffff8111156151ec578182fd5b8201601f810184136151fc578182fd5b805161520a614e3782615a5f565b81815285602083850101111561521e578384fd5b61522f826020830160208601615b8c565b95945050505050565b600060208284031215615249578081fd5b8135612a7c81615d23565b600060208284031215615265578081fd5b8151612a7c81615d23565b600080600080600060a08688031215615287578283fd5b853561529281615d23565b945060208601356152a281615cd3565b93506040860135925060608601359150608086013567ffffffffffffffff8111156152cb578182fd5b6152d788828901614e19565b9150509295509295909350565b600080600080606085870312156152f9578182fd5b84359350602085013567ffffffffffffffff811115615316578283fd5b61532287828801614e6a565b9094509250615335905060408601614eaa565b905092959194509250565b60008060408385031215615352578182fd5b823591506020830135614f6781615d23565b60008060408385031215615376578182fd5b50508035926020909101359150565b60008060408385031215615397578182fd5b823591506153a760208401614eaa565b90509250929050565b6000806000606084860312156153c4578081fd5b833592506153d460208501614eaa565b91506153e260408501614eaa565b90509250925092565b6000602082840312156153fc578081fd5b612a7c82614eaa565b6000815180845260208085019450808401835b8381101561543457815187529582019590820190600101615418565b509495945050505050565b60008151808452615457816020860160208601615b8c565b601f01601f19169290920160200192915050565b6000815461547881615bed565b80855260206001838116801561549557600181146154c7576154f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901526040880195506154f5565b866000528260002060005b858110156154ed5781548a82018601529083019084016154d2565b890184019650505b505050505092915050565b6000815461550d81615bed565b60018281168015615525576001811461555457615583565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841687528287019450615583565b8560005260208060002060005b8581101561557a5781548a820152908401908201615561565b50505082870194505b5050505092915050565b6000825161559f818460208701615b8c565b9190910192915050565b7f7b226e616d65223a20220000000000000000000000000000000000000000000081527f50617373706f72743a2000000000000000000000000000000000000000000000600a82015260006156016014830189615500565b7f222c20226465736372697074696f6e223a20220000000000000000000000000081527f222c2022696d616765223a2022000000000000000000000000000000000000006013820152875161565d816020840160208c01615b8c565b8082019150507f222c2022616e696d6174696f6e5f75726c223a202200000000000000000000006020820152865161569c816035840160208b01615b8c565b7f222c202261747472696275746573223a205b7b202274726169745f7479706522603592909101918201527f3a202241766174617220574c222c202276616c7565223a2022000000000000006055820152855161570081606e840160208a01615b8c565b6157bc6157b6615767615761606e858701017f227d2c7b202274726169745f74797065223a202252616e6b222c202276616c7581527f65223a2022000000000000000000000000000000000000000000000000000000602082015260250190565b89615500565b7f227d2c7b202274726169745f74797065223a2022456c656d656e74222c20227681527f616c7565223a2022000000000000000000000000000000000000000000000000602082015260280190565b86615500565b9a9950505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615802816017850160208801615b8c565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161583f816028840160208801615b8c565b01602801949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261588a608083018461543f565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561597c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160e0815185528882015163ffffffff8082168b880152808a850151168a880152505060608083015182828801526159248388018261543f565b925050506080808301518683038288015261593f838261543f565b9250505060a080830151818701525060c080830151925085820381870152506159688183615405565b9689019694505050908601906001016158ba565b509098975050505050505050565b602081526000612a7c6020830184615405565b602081526000612a7c602083018461543f565b602081526000612a7c602083018461546b565b6040815260006159d6604083018561546b565b905061ffff831660208301529392505050565b8481526060602082015282606082015282846080830137600080608085840101526080601f19601f860116830101905063ffffffff8316604083015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615a5757615a57615cbd565b604052919050565b600067ffffffffffffffff821115615a7957615a79615cbd565b50601f01601f191660200190565b600061ffff808316818516808303821115615aa457615aa4615c91565b01949350505050565b60008219821115615ac057615ac0615c91565b500190565b600063ffffffff808316818516808303821115615aa457615aa4615c91565b600082615af357615af3615ca7565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b3057615b30615c91565b500290565b600061ffff83811690831681811015615b5057615b50615c91565b039392505050565b600082821015615b6a57615b6a615c91565b500390565b600063ffffffff83811690831681811015615b5057615b50615c91565b60005b83811015615ba7578181015183820152602001615b8f565b83811115611a675750506000910152565b600081615bc757615bc7615c91565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680615c0157607f821691505b60208210811415611dd357634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415615c3a57615c3a615c91565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c7657615c76615c91565b5060010190565b600082615c8c57615c8c615ca7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a9257600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611a9257600080fd5b61ffff81168114611a9257600080fdfea2646970667358221220ba9e70c264a16f49af0ee0a05ade5864e8b04a1e1f763a73f668a68db7a9ecf464736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc4490000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
-----Decoded View---------------
Arg [0] : imageContract (address): 0x084d1301407B08f3feA7D9fFeae4c89d3e9BC449
Arg [1] : admin (address): 0x5D2FD8f39c24Ac0338fC6268119ca8c500aE3086
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc449
Arg [1] : 0000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.