Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
4,959 SND
Holders
1,394
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 SNDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OnChainSands
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; contract OnChainSands is ERC721, ERC721Enumerable, Ownable { using Counters for Counters.Counter; using SafeMath for uint256; Counters.Counter private _tokenIdCounter; uint private constant maxTokensPerTransaction = 30; uint256 private tokenPrice = 30000000000000000; //0.03 ETH uint256 private constant nftsNumber = 5000; uint256 private constant nftsPublicNumber = 4950; constructor() ERC721("OnChain Sands", "SND") { _tokenIdCounter.increment(); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } function safeMint(address to) public onlyOwner { _safeMint(to, _tokenIdCounter.current()); _tokenIdCounter.increment(); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function toHashCode(uint256 value) internal pure returns (string memory) { if (value == 0) { return "000000"; } uint256 i; bytes memory buffer = "000000"; for(i=6;i>0;i--) { if (value % 16 < 10) buffer[i-1] = bytes1(uint8(48 + uint256(value % 16))); else buffer[i-1] = bytes1(uint8(55 + uint256(value % 16))); value /= 16; } return string(buffer); } function getFarObject(uint256 num) internal pure returns (string memory) { string[4] memory far; far[0] ='M431.741,537.724 371.85,467.096 321.582,517.364 254.859,442.361 160.11,537.109'; far[1] ='M191,556l219-2l-99-117L191,556z'; far[2] ='M244,557 238,488 248,488 238,413 298,398 296,389 424,407 401,484 391,487 383,555'; far[3] ='M209,511c0-0,36-8,36-8 s10-1,11-1s17-15,17-16s0-6,0-6l19-0v-6h9l1-6h4v-1 h67v2h5v4c0,0,11-1,11,0s0,8,0,8h20v6l18,18h7v10v70H209 L209,511z'; return far[num-1]; } function getSun(uint256 num) internal pure returns (string memory) { uint256 suns; uint256 suns_m; suns_m = 650299126634312082; suns = 709260192684279125512259162535278106613289157619291124044823099706295099; if (num >= 8) { suns = num == 8 ? suns_m : suns_m / 1000000000; } else { if (num > 0) suns = suns / (1000 ** (num*3)); } string memory output = string(abi.encodePacked('cx="',toString((suns/1000000)%1000),'" cy="',toString((suns/1000)%1000), '" r="',toString(suns%1000),'"')); return output; } //this feature is just for fun, it's pointless. function getCamel(uint256 num) internal pure returns (string memory) { uint256[50] memory xtypes; uint256 pos; uint256 i; uint256 temp; uint256 sym; uint256 lines; xtypes[0] = 2750871777490806264085493004602956112481215626846361120; // Elon Musk is a poser xtypes[1] = 24031940146303221873185246330856176777890234172085460524828847635091787832103; xtypes[2] = 4369554406778136407906521031351492442121714090311337998835645029932110349922; xtypes[3] = 35339669699060465125668189898147169548632576962648599291375229098669428362322; xtypes[4] = 672238645676028630017590070904525; xtypes[11] = 37599700675902714367317740679304042296080055052422520140113640294389393350439; xtypes[12] = 38087302781903350862724587794493881498317283716547227642212787098338845152311; xtypes[13] = 1114275929128553399568145623741250323077119217211655860047041411166003561237; xtypes[14] = 44483940829496349223937135327653774303045114145795750475934727822431742908025; xtypes[15] = 1301031010810467202189960410466201454370628906584976487492660977313; xtypes[21] = 24511554605809013553427690817438832449166603887000346203695542442847542862631; xtypes[22] = 24712231507965098789272277915974614596914779217528115716846960336470200999989; xtypes[23] = 31779261119830188930260713981005416210882557915559935577937916313743035255330; xtypes[24] = 30845749996097297930742408311135328346981512733480170301818670564314058110498; xtypes[25] = 4393324743237794958108912339045511528520735357988065415454558326487042311245; xtypes[26] = 4383618393247594429327385840719100733921976757672061077695343950821928420434; xtypes[27] = 28260977779972716408629221197954496518888178178346784762024000144425; // I wrote that because I'm jealous of his billions xtypes[31] = 33981201337895841066299736423112852304759862823304893271895015697500599799591; xtypes[32] = 38092437674498035584450155165625035089506200894468052066380022772320589009972; xtypes[33] = 1002964437672768398493084675030519774534336229557529541653364574576256516854; xtypes[34] = 41202914189462662695915620887590875333337880836299726911136825280773640739640; xtypes[35] = 40993983140047288513282733679841254915488686784624912185639295148702690920129; xtypes[36] = 43462155136449166491448379421314888609432193428547199763947083681431896678423; xtypes[37] = 3091541931616987385254478349605488253295528003625843124585170727615066703541; xtypes[38] = 42893843881028951002600077923910138109116652418088673519145098082818520534773; xtypes[39] = 35790225028626312902234269550783631619805539570794490376389285434126321176320; xtypes[40] = 23946826271475684407; // and the fact that he's sexy xtypes[41] = 32696238382569806469557342148762393436204618157687364688486249358066242446087; xtypes[42] = 30829847781535805781250327403060765435737126585110613555906562372477089399884; xtypes[43] = 2322370439730553613354915887410243625117939153279733562435129926126979548749; xtypes[44] = 3077242879332650009073929722759956366751482431073885344923252432370954176881; xtypes[45] = 35126784166904065671947169645446477285741344117817602589955598641710815590065; xtypes[46] = 2978473281905248387737881203435264718697731825484007630263831601596209749570; xtypes[47] = 542357; bytes memory buffer = new bytes(500); temp = xtypes[1]; pos=0; for(lines=1;lines<=10;lines++) { if (xtypes[10*(num-1) + lines] == 0) break; temp = xtypes[10*(num-1) + lines]; for(i=0;i<=50;i++) { if (temp==0) break; sym = temp%32; temp /= 32; buffer[pos++] = bytes1(uint8((xtypes[0]/(128**sym))%128)); } } bytes memory buffer2 = new bytes(pos); for(i=0;i<pos;i++) buffer2[i] = buffer[i]; return string(buffer2); } // programmers are the coolest people. function getDune1(uint256 num) internal pure returns (string memory) { string[2] memory dune; dune[0] = 'M-68,1082l1157,6l-19-577c0,0-39-6-117-6 s-102,8-185,16s-118,8-183,8s-181-21-331-21s-286,42-286,42 L-68,1082z'; dune[1] = 'M1089,1015l-1157,5l19-478c0,0,42-15,119-22 c77-6,173-8,255,0c82,9,159,12,225,12s188-14,338-14 s165,33,165,33L1089,1015z'; return dune[num-1]; } // and humble. function getDune2(uint256 num) internal pure returns (string memory) { string[4] memory dune; dune[0] = 'M-39,1013l1181,40c0,0-18-502-77-485 c-185,52-250-23-416-5c-77,8-148,29-324-22S-61,574-61,614 L-39,1013z'; dune[1] = 'M1140,1013l-1181,40c0,0-37-507,23-496c189,34,315-4,482,13 c77,8,205,51,391-21c170-66,270,61,273,69L1140,1013z'; dune[2] = 'M-39,1016l1181,40c0,0-18-502-77-485 c-185,52-211-40-377-22c-77,8-203,37-380,25 c-182-12-327,14-330,22L-39,1016z'; dune[3] = 'M1142,1016l-1181,40c0,0-66-554-9-530 c181,77,299,26,464,33c77,3,207,45,382,14 c180-32,327,14,330,22L1142,1016z'; return dune[num-1]; } function tokenURI(uint256 tokenId) pure public override(ERC721) returns (string memory) { uint256[17] memory xtypes; string[5] memory colors; string[4] memory dune3; string[4] memory dune31; string[4] memory dune32; string[27] memory parts; uint256[12] memory params; string[6] memory obj1; string[6] memory obj2; uint256 pos; uint256 rand = random(string(abi.encodePacked('Sand',toString(tokenId)))); params[0] = 1 + ((rand/10) % 5);// camel= params[1] = 1 + ((rand/1000) % 33); // pallette= params[2] = 1 + ((rand/10000) % 4); // dune main params[3] = 1 + ((rand/10000) % 2); // dune top params[4] = 1 + ((rand/100000) % 4); // dune bottom params[5] = 1 + ((rand/1000000000) % 4); // pyr= params[6] = 1 + ((rand/10000000000) % 5); // obj= params[7] = 1 + ((rand/100000000) % 5); // sun obj1[0] = 'M128,897c4,1,8,6,15,7 c8-5,15-11,20-17c0-2,1-5,1-6c0-0,0-0,0-0 c0-0,0-0,0-0c2-3,5-4,7-3c0-0,0-1,1-1 c-2-2-8-1-12,4c-3,5-6,6-6,6c-2,0-3,0-4,0 c-0-0-0-0-0-0c-0-2-3-4-6-4l-0-2l-3,1l0,2 c-2,1-3,4-2,7c0,0,0,0,0,0c-4,1-11,2-16,2 c-8-0-8,6-8,6l9-2C125,896,127,896,128,897z'; obj1[1] = 'M177,903 214,864 186,888 177,872 181,892 167,904 160,889 168,880 158,885 140,842 152,878 134,874 154,884 164,915 171,915 175,905 190,903'; obj1[2] = 'M173,924l-2-9l-8-4l-5-9 l-0,11l-7,3l-0,3l-16,13l2,3l6-0l10-0l2-2l3,1l7-1 l1-2l4-1l10,3L173,924z'; obj1[3] = 'M102,924c42,0,79-13,96-32 l-1-10l-19-6l-9,4l-6-6l-20-11l-11,3l-1,37l-8,5l-6-2 l-8,2l-5,17C100,924,101,924,102,924z'; obj1[4] = 'M196,909l-27-60l2-3l-2-2 l2-1l-7-3l0,6l-14,16l1,11l0-9l13-11l2,0l2,5 l-2,44l3-7l0,3l2-30l0,1c0,7,2,21,2,21 c0-0,0-9,0-14l13,34L196,909z'; obj2[0] = 'M176,873c0,0-92,25-89,38 c3,13,43,1,56-8C157,895,176,873,176,873z'; obj2[1] = 'M135,907 164,913 164,915 171,915 145,929 112,932 145,925 160,916 151,912 145,914 147,911'; obj2[2] = 'M164,927 159,927 155,929 155,931 141,931 140,930 150,922 139,929 138,929 133,933 137,932 134,935 155,931 155,932 158,934 163,932 166,930'; obj2[3] = 'M188,900l-14-21l-4,1 c0,0,7,19,7,20c-0,0-6,1-6,1l-18-6l-2-17l-3,13l-8-21 l-3,2l0,13l-43,12l-6,9l-43,6l-6,6l67,1l9-0 C142,922,170,913,188,900z'; obj2[4]= 'M189,905 100,921 96,944 107,925 196,909'; // Frank Herbert is a genius. dune3[0] = 'M789.651,612.665c-75.205-13.229-180.045,29.189-247.215,32.078c-67.168,2.892-214.902-55.596-254.981-57.02c-80.609-2.861-205.862,94.49-292.672,100.213c-15.255,1.007-30.625-0.204-46.191-2.981v364.425l1091.444-8.328V687.689C964.066,678.827,883.855,629.24,789.651,612.665z'; dune3[1] = 'M-132,707c93-1,328-89,431-72 c102,17,188,72,270,68c81-4,199-87,275-85s268,142,268,142 v254H-98L-132,707z'; dune3[2] = 'M1231.049,614.778c-106.1-3.109-270.963,102.704-385.223,108.925c-114.258,6.229-233.418-65.354-377.06-87.139c-99.948-15.158-239.281,33.44-328.552,36.751c-89.269,3.313-285.609-63.696-338.877-65.326c-107.132-3.277-14.89,534.698-14.89,534.698l1120.001-20.622C906.449,1122.064,1337.147,617.889,1231.049,614.778z'; dune3[3] = 'M-47.384,729.587l16.5,334.482H1082.06l-7.499-400.48c0,0-143.994,46.509-293.986,48.009c-138.278,1.383-269.985-73.507-410.979-102.005S-47.384,729.587-47.384,729.587'; dune31[0] = 'M730.696,695.521c-14.66-64.234,54.479-83.549,53.738-83.668c-74.773-10.486-176.365,30.068-241.998,32.891c-65.18,2.806-206.219-52.184-251.139-56.739c10.547,3.674,18.777,12.776,20.959,31.223c5.711,48.342-25.114,246.768-200.632,410.215l572.048,6.992h0.246c157.754-55.303,336.631-126.377,336.631-164.342C1020.549,804.177,747.467,768.968,730.696,695.521z'; dune31[1] = 'M569,702 c-81,4-167-51-270-68c-90-14-282,51-391,68l-6,301l0,8h750 C841,871,874,687,868,644c-2-15-9-23-19-26c-1-0-2-0-3-0 C769,615,651,698,569,702z'; dune31[2] = 'M390.417,731.489c-19.484-73.591,72.4-95.72,71.42-95.854c-99.376-12.017-234.395,34.446-321.621,37.682c-54.263,2.01-148.083-21.957-225.287-41.429c5.73,98.433,58.558,405.557,495.521,392.111c96.733-2.977,150.2,2.841,173.166,14.275c110.086-40.351,192.021-78.959,192.021-104.494C775.637,855.974,412.705,815.635,390.417,731.489z'; dune31[3] = 'M1143.557,771.596C842.766,774.434,590.294,994.69,563.871,1018.5H281.277c219.414-27.692,269.289-134.762,270.71-200.116c1.5-68.996-181.491-76.496-295.484-116.994c-107.063-38.035,57.096-89.3,77.455-95.395C186.829,603.571-47.384,729.587-47.384,729.587l14.307,321.913l1176.634,27.58C1143.557,1079.08,1461.541,768.596,1143.557,771.596z'; dune32[0] = 'M312.256,619.224c-2.186-18.486-10.448-27.592-21.027-31.25c-1.286-0.119-2.543-0.203-3.773-0.246c-80.611-2.863-205.862,94.489-292.671,100.211c-15.255,1.007-30.627-0.204-46.193-2.981v369.479H83.292C283.871,886.871,318.262,670.06,312.256,619.224z'; dune32[1] = 'M296,634 c-104-14-335,72-428,73l33,306h296c150-49,320-113,320-147 c0-60-259-92-275-158C229,651,283,636,296,634z'; dune32[2] = ''; dune32[3] = ''; // His War of the Worlds is a masterpiece. xtypes[0] = 438473426514619468937593363674906600980101972218980261389738755026321310; xtypes[1] = 1528428735494740386746687706769036728542265312936553054402188188078571243; xtypes[2] = 1576159433658212066304323894815932062177799089437395523990699050641915806; xtypes[3] = 1638277479168345925933593678264841420808332802796276121428815506753716126; xtypes[4] = 1482277213785937432487838137602393875317079519468030334287176488800222955; xtypes[5] = 569254049910285240562266942057277174170434705955446158280559749706542294; xtypes[6] = 695961355261660318153968727586838433117983201812599465335857818068058111; xtypes[7] = 1499951127606893309180610179916526153806597374206025036948893607141571007; xtypes[8] = 1487975643258097207966143169235216509055880303550960490725369271497513569; xtypes[9] = 893871907223691020346594411790439061317907470229888515211998968157829111; xtypes[10] = 1456322660702981972363882139452691332072845879862426480408917545756655090; xtypes[11] = 1414100953265237643112910920600703942226523030837917351177428632577495874; xtypes[12] = 1412526850302830771701738382967853559447456676243931652623233627352724185; xtypes[13] = 956176030089680310714094738241368283497248873645169781803481032958345082; xtypes[14] = 407203048447432245888292259364249687668615656070679106091707478370827939; xtypes[15] = 720473443048720196433395035253138729115353664155452813862022957330631299; xtypes[16] = 1219326055746586710817491577091388615; pos = (params[1]-1) * 5; colors[0] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216); pos = (params[1]-1) * 5 + 1; colors[1] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216); pos = (params[1]-1) * 5 + 2; colors[2] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216); pos = (params[1]-1) * 5 + 3; colors[3] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216); pos = (params[1]-1) * 5 + 4; colors[4] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216); // Who's stronger, the camel or the Bedouin? parts[0] = '<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve"> <linearGradient id="mainGradient" gradientUnits="userSpaceOnUse" x1="-162.3992" y1="118.0994" x2="-162.3993" y2="1117.9104" gradientTransform="matrix(1 0 0 -1 662.3999 1118.0991)"> <stop offset="0.64" style="stop-color:#'; // 2 parts[1] = '"/> <stop offset="1" style="stop-color:#'; // 3 parts[2] = '"/> </linearGradient> <rect x="0.001" y="0.189" fill="url(#mainGradient)" width="1000" height="1000"/> <circle opacity="0.1" fill="#'; // 1 parts[3] = string(abi.encodePacked('" cx="44" cy="823" r="99"/> <radialGradient id="sunGradient" ',getSun(params[7]*2-2),' gradientUnits="userSpaceOnUse"> <stop offset="0.7" style="stop-color:#')); // 1 parts[4] = '"/> <stop offset="1" style="stop-color:#'; // 2 parts[5] = string(abi.encodePacked('"/> </radialGradient> <circle opacity="0.8" fill="url(#sunGradient)" ',getSun(params[7]*2-2),'/>')); // 1 parts[6] = ''; // 1 parts[7] = ''; // 2 parts[8] = ''; // 1 parts[9] = ''; // 1 parts[10] = ''; // 2 parts[11] = ''; // 1 parts[12] = ''; // 1 parts[13] = ''; // 2 parts[14] = '<g> <path opacity="0.11" fill="#'; // 1 parts[15] = '" d="M668,423c0,0,313-0,303-28 c-10-28-397-48,15-46c301,2,196,46,460,43 c258-3,484-60,485-17c1,43-290,24-290,50s288,9,478,12 c189,3,341-83,535-26c194,56,322,32,517,5 c194-27,140,0,427,0c287,0,1180,0,1180,0v-31H3607c0,0-137-11-283-10 c-146,0-162,33-394-7c-232-41-312-43-420-24 c-107,18-255,68-395,74s-397,18-398,7c-1-10,447-26,446-65 c-1-38-176-42-391-25c-215,16-395-14-568-19 c-172-4-626-8-627,25s323,25,322,50c-0,9-593,3-593,3H-36v27 h478C442,421,553,423,668,423z"/> <path opacity="0.11" fill="#'; // 1 parts[16] = '" d="M668,404c0,0,322,12,312-15 c-10-28-804-56,8-62c301-2,239,37,503,34 c258-3,565-42,569,1c2,29-381,32-417,61 c-23,18,273,12,470,7c189-5,513-94,714-52 c212,44,184,46,379,18c194-27,188,1,475,1c287,0,1096,0,1096,0 v-20c0,0-1102,0-1175,0s-137-13-284-13c-146,0-161,25-393-16 c-232-41-315-31-422-12c-107,18-250,68-389,74s-432,24-432,13 c0-13,458-25,473-71c12-37-172-54-387-38 c-215,16-395-14-568-19c-172-4-620,7-621,41 c-1,34,319,32,321,51c0,9-598-12-598-12H-36v27h478 C442,403,553,404,668,404z"/> <animateMotion path="M 0 0 L -3750 40 Z" dur="250s" repeatCount="indefinite" /> </g> <path opacity="0.25" fill="#'; // 5 parts[17] = string(abi.encodePacked('" d="',getFarObject(params[5]),'"/> <path fill="#')); // 5 parts[18] = string(abi.encodePacked('" d="',getDune1(params[3]),'"/> <g> <path fill="#')); // 4 parts[19] = string(abi.encodePacked('" d="',getCamel(params[0]),'"/> <animateMotion path="m 0 0 h -5000" dur="2500s" repeatCount="indefinite" /> </g> <path fill="#')); // 4 parts[20] = string(abi.encodePacked('" d="',getDune2(params[4]),'"/> <path fill="#')); // 2 parts[21] = string(abi.encodePacked('" d="',dune3[params[2]-1],'"/> <linearGradient id="sandGradient" gradientUnits="userSpaceOnUse" x1="-1424" y1="658" x2="-456" y2="658" gradientTransform="matrix(1 0 0 1 1324.7998 158.1992)"> <stop offset="0" style="stop-color:#')); // 2 parts[22] = '"/> <stop offset="0.8" style="stop-color:#'; // 3 parts[23] = string(abi.encodePacked('"/> </linearGradient> <path opacity="0.35" fill="url(#sandGradient)" d="',dune31[params[2]-1],'"/> <path opacity="0.35" fill="#')); // 3 parts[24] = string(abi.encodePacked('" d="',dune32[params[2]-1],'"/> <path opacity="0.1" fill="#')); // 3 parts[25] = string(abi.encodePacked('" d="',obj2[params[6]-1],'"/> <path opacity="0.4" fill="#')); // 3 parts[26] = string(abi.encodePacked('" d="',obj1[params[6]-1],'"/> </svg> ')); // Stronger is the earthworm. string memory output = string(abi.encodePacked(parts[0],colors[1],parts[1],colors[2],parts[2])); output = string(abi.encodePacked(output,colors[0],parts[3],colors[0],parts[4],colors[1] )); output = string(abi.encodePacked(output,parts[5],colors[0],parts[6],colors[0] )); output = string(abi.encodePacked(output,parts[7],colors[1],parts[8],colors[0])); output = string(abi.encodePacked(output,parts[9],colors[0],parts[10],colors[1] )); output = string(abi.encodePacked(output,parts[11],colors[0],parts[12],colors[0])); output = string(abi.encodePacked(output,parts[13],colors[1],parts[14],colors[0] )); output = string(abi.encodePacked(output,parts[15],colors[0],parts[16],colors[4])); output = string(abi.encodePacked(output,parts[17],colors[4],parts[18],colors[3] )); output = string(abi.encodePacked(output,parts[19],colors[3],parts[20],colors[1])); output = string(abi.encodePacked(output,parts[21],colors[1],parts[22],colors[2])); output = string(abi.encodePacked(output,parts[23],colors[2],parts[24],colors[2])); output = string(abi.encodePacked(output,parts[25],colors[2],parts[26])); // please don't scold me for the quality of my code, I've been programming in PHP for 10 years string[11] memory aparts; aparts[0] = '[{ "trait_type": "Main", "value": "'; aparts[1] = toString(params[0]); aparts[2] = '" }, { "trait_type": "Palette", "value": "'; aparts[3] = toString(params[1]); aparts[4] = '" }, { "trait_type": "Near Object", "value": "'; aparts[5] = toString(params[6]); aparts[6] = '" }, { "trait_type": "Far Object", "value": "'; aparts[7] = toString(params[5]); aparts[8] = '" }, { "trait_type": "Sun", "value": "'; aparts[9] = toString(params[7]); aparts[10] = '" }]'; // they're going to make me squeeze Doom into the next collection // help... string memory strparams = string(abi.encodePacked(aparts[0], aparts[1], aparts[2], aparts[3], aparts[4], aparts[5])); strparams = string(abi.encodePacked(strparams, aparts[6], aparts[7], aparts[8], aparts[9], aparts[10])); // they made me write this code string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "OnChain Sands", "description": "Beautiful views, completely generated OnChain","attributes":', strparams, ', "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function claimdQw4w9WgXcQ() public { require(_tokenIdCounter.current() <= 500, "Tokens number to mint exceeds number of public tokens"); _safeMint(msg.sender, _tokenIdCounter.current()); _tokenIdCounter.increment(); } // why are you reading this? is there something between us? function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } // they won't fall for it a second time function buySands(uint tokensNumber) public payable { require(tokensNumber > 0, "Wrong amount"); require(tokensNumber <= maxTokensPerTransaction, "Max tokens per transaction number exceeded"); require(_tokenIdCounter.current().add(tokensNumber) <= nftsPublicNumber, "Tokens number to mint exceeds number of public tokens"); require(tokenPrice.mul(tokensNumber) <= msg.value, "Ether value sent is too low"); for(uint i = 0; i < tokensNumber; i++) { _safeMint(msg.sender, _tokenIdCounter.current()); _tokenIdCounter.increment(); } } } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT 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 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT 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 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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT 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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT 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 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 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 pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"buySands","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimdQw4w9WgXcQ","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052666a94d74f430000600c553480156200001c57600080fd5b50604080518082018252600d81526c4f6e436861696e2053616e647360981b60208083019182528351808501909452600384526214d39160ea1b9084015281519192916200006d916000916200011c565b508051620000839060019060208401906200011c565b505050620000a06200009a620000bd60201b60201c565b620000c1565b620000b7600b6200011360201b62001f2d1760201c565b620001ff565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b8280546200012a90620001c2565b90600052602060002090601f0160209004810192826200014e576000855562000199565b82601f106200016957805160ff191683800117855562000199565b8280016001018555821562000199579182015b82811115620001995782518255916020019190600101906200017c565b50620001a7929150620001ab565b5090565b5b80821115620001a75760008155600101620001ac565b600181811c90821680620001d757607f821691505b60208210811415620001f957634e487b7160e01b600052602260045260246000fd5b50919050565b615f7f806200020f6000396000f3fe6080604052600436106101405760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610365578063aaf492a314610385578063b88d4fde1461039a578063c87b56dd146103ba578063e985e9c5146103da578063f2fde38b1461042357600080fd5b80634f6ccce7146102bd5780636352211e146102dd57806370a08231146102fd578063715018a61461031d5780638da5cb5b1461033257806395d89b411461035057600080fd5b806323b872dd1161010857806323b872dd146102155780632f745c591461023557806330ffc9e3146102555780633ccfd60b1461026857806340d097c31461027d57806342842e0e1461029d57600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806318160ddd146101f6575b600080fd5b34801561015157600080fd5b506101656101603660046138a5565b610443565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610454565b60405161017191906141f3565b3480156101a857600080fd5b506101bc6101b73660046138df565b6104e6565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461387b565b610580565b005b34801561020257600080fd5b506008545b604051908152602001610171565b34801561022157600080fd5b506101f4610230366004613727565b610696565b34801561024157600080fd5b5061020761025036600461387b565b6106c7565b6101f46102633660046138df565b61075d565b34801561027457600080fd5b506101f46108d2565b34801561028957600080fd5b506101f46102983660046136d9565b61092b565b3480156102a957600080fd5b506101f46102b8366004613727565b610973565b3480156102c957600080fd5b506102076102d83660046138df565b61098e565b3480156102e957600080fd5b506101bc6102f83660046138df565b610a21565b34801561030957600080fd5b506102076103183660046136d9565b610a98565b34801561032957600080fd5b506101f4610b1f565b34801561033e57600080fd5b50600a546001600160a01b03166101bc565b34801561035c57600080fd5b5061018f610b55565b34801561037157600080fd5b506101f461038036600461383f565b610b64565b34801561039157600080fd5b506101f4610c29565b3480156103a657600080fd5b506101f46103b5366004613763565b610c6e565b3480156103c657600080fd5b5061018f6103d53660046138df565b610ca6565b3480156103e657600080fd5b506101656103f53660046136f4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561042f57600080fd5b506101f461043e3660046136d9565b611e95565b600061044e82611f36565b92915050565b606060008054610463906144c3565b80601f016020809104026020016040519081016040528092919081815260200182805461048f906144c3565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058b82610a21565b9050806001600160a01b0316836001600160a01b031614156105f95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055b565b336001600160a01b0382161480610615575061061581336103f5565b6106875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055b565b6106918383611f5b565b505050565b6106a03382611fc9565b6106bc5760405162461bcd60e51b815260040161055b906142e2565b6106918383836120c0565b60006106d283610a98565b82106107345760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161055b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000811161079c5760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8185b5bdd5b9d60a21b604482015260640161055b565b601e8111156108005760405162461bcd60e51b815260206004820152602a60248201527f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d62656044820152691c88195e18d95959195960b21b606482015260840161055b565b61135661081682610810600b5490565b9061226b565b11156108345760405162461bcd60e51b815260040161055b90614258565b600c543490610843908361227e565b11156108915760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420697320746f6f206c6f770000000000604482015260640161055b565b60005b818110156108ce576108ae336108a9600b5490565b61228a565b6108bc600b80546001019055565b806108c6816144fe565b915050610894565b5050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161055b906142ad565b6040514790339082156108fc029083906000818181858888f193505050501580156108ce573d6000803e3d6000fd5b600a546001600160a01b031633146109555760405162461bcd60e51b815260040161055b906142ad565b610962816108a9600b5490565b610970600b80546001019055565b50565b61069183838360405180602001604052806000815250610c6e565b600061099960085490565b82106109fc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161055b565b60088281548110610a0f57610a0f61456f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061044e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161055b565b60006001600160a01b038216610b035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161055b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b495760405162461bcd60e51b815260040161055b906142ad565b610b5360006122a4565b565b606060018054610463906144c3565b6001600160a01b038216331415610bbd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6101f4610c35600b5490565b1115610c535760405162461bcd60e51b815260040161055b90614258565b610c60336108a9600b5490565b610b53600b80546001019055565b610c783383611fc9565b610c945760405162461bcd60e51b815260040161055b906142e2565b610ca0848484846122f6565b50505050565b6060610cb06135b6565b610cb86135d5565b610cc06135fc565b610cc86135fc565b610cd06135fc565b610cd8613616565b610ce0613631565b610ce8613650565b610cf0613650565b600080610d23610cff8e612329565b604051602001610d0f919061418a565b604051602081830303815290604052612427565b90506005610d32600a8361434b565b610d3c9190614519565b610d47906001614333565b85526021610d576103e88361434b565b610d619190614519565b610d6c906001614333565b60208601526004610d7f6127108361434b565b610d899190614519565b610d94906001614333565b60408601526002610da76127108361434b565b610db19190614519565b610dbc906001614333565b60608601526004610dd0620186a08361434b565b610dda9190614519565b610de5906001614333565b60808601526004610dfa633b9aca008361434b565b610e049190614519565b610e0f906001614333565b60a08601526005610e256402540be4008361434b565b610e2f9190614519565b610e3a906001614333565b60c08601526005610e4f6305f5e1008361434b565b610e599190614519565b610e64906001614333565b60e08601526040805161014081019091526101098082526157ba602083013984526040805160c081019091526088808252614785602083013984600160200201819052506040518060800160405280605f81526020016148a9605f9139604080860191909152805160a08101909152607280825261480d602083013960608501526040805160c081019091526087808252614f5a602083013960808086019190915260408051918201905260418082526154816020830139835260408051608081019091526058808252615c75602083013983600160200201819052506040518060c00160405280608881526020016150ec60889139604080850191909152805160c08101909152608d80825261566e60208301396060808501919091526040805191820190526027808252615e6b6020830139608084015260408051610140810190915261010b808252614fe1602083013989526040805160a0810190915260688082526145b2602083013989600160200201819052506040518061016001604052806101318152602001615ccd61013191396040808b0191909152805160e0810190915260a2808252614cf8602083013960608a015260408051610180810190915261015c808252615b19602083013988526040805160c081019091526092808252615eb8602083013988600160200201819052506040518061018001604052806101418152602001614bb761014191396040808a019190915280516101808101909152610149808252614e116020830139606089015260408051610120810190915260f28082526154c2602083013987526040805160a08101909152606f808252614b2560208301396020888101919091526040805180830182526000808252828b0191909152815180840183529081526060808b01919091527d3f87e2204da90013704fa4ffebfafff2a140ba0000ba0000ffc64fffff9e8e527ddd74929a3a93560094ffd28afffeebdd74929a3a93560094ff9191fffeeb8e8401527de45f00ae3000780000ff7700ffff9ee47946ae3c23780000ff9757ffff9e918e01919091527ded5f16ca300ba60000ff771cffff9ed55f178230462f0075ff7700ffff9e908d01527dd6c4b7b395888f6559e3cfbdfffeebedb688ca7d56a64324ffd3a1fffeeb60808d01527d527ace653d9a7800664898e8d6fffbd2713ca5382578000ee88d48ffecd660a08d01527d64d6a432836d0031367dffc0ffff9ee4b478ae5a6f780066ffe17dffffff60c08d01527dd954478c2a463f0045ff6947fff9bfd2a75a7754671d0073ffd154fff9bf60e08d01527dd79815864c0a360000ffbe19ffedb0d92a228c15333f0045ff3419ffda616101008d01527d81838d404664000a3ba1a1a1f7f7f78096c14d4b7e1a003b9abbe3f7f7f76101208d01527dd302027c0101240000ff0303ffcb21c5ce92626c67000a3bf6ffa8fffdf26101408d01527dcce3eb66acc2007599ffffff8bb6c7d846088923113b001aff5703ffd3426101608d01527dcca98866565c000330ffd29efff7e8b64ed15e2776060019e261fffff2d96101808d01527d8a8a8a454545000000adadadffffff74bd713a6e52001f3391e581f2ff7a6101a08d01527d3b00002200000a0000470000a3000024003912001c0000002d0047523ea36101c08d01527d6863d863328a5e003c6b7cff59005000373a006062008a8a002226008a836101e08d01526eead56a7f5e542a0042ffec6efff4c76102008d015285015161136b90600190614469565b61137690600561444a565b91506113d3630100000061138b600a85614519565b6113999063010000006143a2565b8d6113a5600a8761434b565b601181106113b5576113b561456f565b60200201516113c4919061434b565b6113ce9190614519565b612458565b8a5260208501516113e690600190614469565b6113f190600561444a565b6113fc906001614333565b9150611411630100000061138b600a85614519565b6020808c019190915285015161142990600190614469565b61143490600561444a565b61143f906002614333565b9150611454630100000061138b600a85614519565b60408b0152602085015161146a90600190614469565b61147590600561444a565b611480906003614333565b9150611495630100000061138b600a85614519565b60608b015260208501516114ab90600190614469565b6114b690600561444a565b6114c1906004614333565b91506114d6630100000061138b600a85614519565b60808b01526040805161020081019091526101cd8082526158c360208301398652604080516060810190915260288082526146cc602083013986600160200201819052506040518060c001604052806084815260200161461a60849139604087015261156060028660075b602002015161155190600261444a565b61155b9190614469565b612577565b6040516020016115709190613efe565b60408051808303601f190181529181526060808901929092528051918201905260288082526146cc602083013960808701526115af6002866007611541565b6040516020016115bf9190613fc6565b60408051601f1981840301815291815260a0880191909152805160208082018352600080835260c08a01929092528251808201845282815260e08a0152825180820184528281526101008a0152825180820184528281526101208a0152825180820184528281526101408a0152825180820184528281526101608a0152825180820184528281526101808a0152825180820184529182526101a0890191909152815180830183528181527f3c673e203c70617468206f7061636974793d22302e3131222066696c6c3d2223818301526101c0890152815161022081019092526101f080835290614935908301396101e087015260408051610280810190915261025f808252615222602083013961020087015260a08501516116e090612665565b6040516020016116f09190613c55565b60408051808303601f19018152919052610220870152606085015161171490612732565b6040516020016117249190613c9e565b60408051808303601f19018152919052610240870152845161174590612790565b6040516020016117559190613e52565b60408051808303601f19018152919052610260870152608085015161177990612e97565b6040516020016117899190613c55565b60408051808303601f1901815291815261028088019190915285015189906117b390600190614469565b600481106117c3576117c361456f565b60200201516040516020016117d89190613d2e565b60408051808303601f190181529181526102a0880191909152805160608101909152602a8082526146f460208301396102c08701526040850151889061182090600190614469565b600481106118305761183061456f565b60200201516040516020016118459190613b08565b60408051808303601f190181529181526102e0880191909152850151879061186f90600190614469565b6004811061187f5761187f61456f565b60200201516040516020016118949190613c00565b60408051808303601f1901815291905261030087015260c085015183906118bd90600190614469565b600681106118cd576118cd61456f565b60200201516040516020016118e29190613bab565b60408051808303601f1901815291905261032087015260c0850151849061190b90600190614469565b6006811061191b5761191b61456f565b60200201516040516020016119309190613ceb565b60408051808303601f19018152918152610340880191909152865160208c810151818a01518e8501518b860151955160009661196f9695909101613997565b60408051601f198184030181529190529050808b6000602002015188600360200201518d600060200201518a600460200201518f600160200201516040516020016119bf96959493929190613a02565b60408051808303601f190181529082905260a08901518d5160c08b01519294506119f0938593908290602001613997565b60408051601f1981840301815291905290508087600760200201518c6001602002015189600860200201518e60006020020151604051602001611a37959493929190613997565b60408051601f1981840301815291905290508087600960200201518c6000602002015189600a60200201518e60016020020151604051602001611a7e959493929190613997565b60408051808303601f19018152908290526101608901518d516101808b0151929450611ab1938593908290602001613997565b60408051601f1981840301815291905290508087600d60200201518c6001602002015189600e60200201518e60006020020151604051602001611af8959493929190613997565b60408051601f1981840301815291905290508087600f60200201518c6000602002015189601060200201518e60046020020151604051602001611b3f959493929190613997565b60408051601f1981840301815291905290508087601160200201518c6004602002015189601260200201518e60036020020151604051602001611b86959493929190613997565b60408051601f1981840301815291905290508087601360200201518c6003602002015189601460200201518e60016020020151604051602001611bcd959493929190613997565b60408051601f1981840301815291905290508087601560200201518c6001602002015189601660200201518e60026020020151604051602001611c14959493929190613997565b60408051808303601f190181528282526102e08a0151918e01516103008b0151919450611c4993859392908290602001613997565b60408051808303601f190181528282526103208a0151918e01516103408b0151919450611c7c9385939290602001613940565b6040516020818303038152906040529050611c9561366a565b604051806060016040528060238152602001614b94602391398152611cc18760005b6020020151612329565b81600160200201819052506040518060600160405280602a815260200161487f602a91396040820152611cf5876001611cb7565b606080830191909152604080519182019052602e80825261469e60208301396080820152611d24876006611cb7565b60a08201526040805160608101909152602d808252614908602083013960c0820152611d51876005611cb7565b60e082015260408051606081019091526026808252615e926020830139610100820152611d7f876007611cb7565b610120820152604080518082018252600481526322207d5d60e01b602080830191909152610140840191909152825181840151838501516060860151608087015160a08801519651600097611dd697909101613a02565b60408051808303601f190181529082905260c084015160e0850151610100860151610120870151610140880151949650611e1595879590602001613a02565b60405160208183030381529060405290506000611e5a82611e3586612f1f565b604051602001611e4692919061404b565b604051602081830303815290604052612f1f565b905080604051602001611e6d9190614145565b6040516020818303038152906040529350839f50505050505050505050505050505050919050565b600a546001600160a01b03163314611ebf5760405162461bcd60e51b815260040161055b906142ad565b6001600160a01b038116611f245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055b565b610970816122a4565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061044e575061044e82613085565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9082610a21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166120425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161055b565b600061204d83610a21565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d846104e6565b6001600160a01b0316145b806120b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120d382610a21565b6001600160a01b03161461213b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161055b565b6001600160a01b03821661219d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161055b565b6121a88383836130d5565b6121b3600082611f5b565b6001600160a01b03831660009081526003602052604081208054600192906121dc908490614469565b90915550506001600160a01b038216600090815260036020526040812080546001929061220a908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122778284614333565b9392505050565b6000612277828461444a565b6108ce8282604051806020016040528060008152506130e0565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123018484846120c0565b61230d84848484613113565b610ca05760405162461bcd60e51b815260040161055b90614206565b60608161234d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123775780612361816144fe565b91506123709050600a8361434b565b9150612351565b60008167ffffffffffffffff81111561239257612392614585565b6040519080825280601f01601f1916602001820160405280156123bc576020820181803683370190505b5090505b84156120b8576123d1600183614469565b91506123de600a86614519565b6123e9906030614333565b60f81b8183815181106123fe576123fe61456f565b60200101906001600160f81b031916908160001a905350612420600a8661434b565b94506123c0565b60008160405160200161243a9190613924565b60408051601f19818403018152919052805160209091012092915050565b60608161248157505060408051808201909152600681526503030303030360d41b602082015290565b6040805180820190915260068082526503030303030360d41b6020830152905b811561227757600a6124b4601086614519565b101561250b576124c5601085614519565b6124d0906030614333565b60f81b816124df600185614469565b815181106124ef576124ef61456f565b60200101906001600160f81b031916908160001a905350612558565b612516601085614519565b612521906037614333565b60f81b81612530600185614469565b815181106125405761254061456f565b60200101906001600160f81b031916908160001a9053505b61256360108561434b565b93508161256f816144ac565b9250506124a1565b60607d66c3ec35814cf53a8d1d8f8f2b573412cb485cf3ae933a4389431f09c33b670906539c38c8f192600884106125cd57836008146125c4576125bf633b9aca008261434b565b6125c6565b805b91506125f7565b83156125f7576125de84600361444a565b6125ea906103e86143a2565b6125f4908361434b565b91505b600061261b6103e861260c620f42408661434b565b6126169190614519565b612329565b61262b6103e861260c818761434b565b61263a6126166103e887614519565b60405160200161264c93929190613a81565b60408051601f1981840301815291905295945050505050565b606061266f6135fc565b6040518060800160405280604e8152602001615620604e9139815260408051808201909152601f81527f4d3139312c3535366c3231392d326c2d39392d3131374c3139312c3535367a006020820152816001602002018190525060405180608001604052806050815260200161576a60509139604080830191909152805160c081019091526089808252615a9060208301398160035b602002015280612716600185614469565b600481106127265761272661456f565b60200201519392505050565b606061273c613685565b6040518060a00160405280606c81526020016155b4606c913981526040805160a081019091526077808252614d9a6020830139602082015280612780600185614469565b600281106127265761272661456f565b606061279a61369e565b761cb86ed9ab466c98faedcf668c7598539b324435cb562081527f3521989a09445313522889b48867113631146226c622489b788a2d926c1b5b276020808301919091527f09a91484d058561363113d32149b2162426d221889b90d5b28862d486cda866260408301527f4e218b521c34150d44d486a26ce22a09a91444da4433889b51544d906426cc5260608301526d2124d836b64d2cb3320d84dc86cd60808301527f5320ad2a1c5320c52a1cd320b56a195720a56a1ad720b5aa195f20adea1b5f276101608301527f5434a6416ad433a6415ad4399e415ad432a6409ad436a6415a5434a6413a54376101808301527f0276a8674c8276a8674c8276a8634c82d6a8534c8336a86f3c8335a8733c83156101a08301527f625904ad50da5904ad50de3905ab50ce59056b50e259066d50ce79026f50d6796101c08301527b0c5aa195f209e2a19df20ce6a14df20c66a1b4f20b62a1acf20b5ea16101e08301527f36310c5b1159a0a06426c433135311504db87226d433136c29444dc5aa1a63276102a08301527f36a2a09b10c84d0485213522909b51584d4c44f948516cc51909b8886226e0356102c08301527f46426ca41989b80d9a08c4316a4376d03413521a09b288a826a451136710ca226102e08301527f4432136814b641b89b60a5a0886f113702489b515c4d4c4516a4336da424b6226103008301527f09b6889f988989905226e436682510c5a90ddb40d04d486826ce22a09a91444d6103208301527f09b10a4310a4290a5690a4290a4290a560985226a45213642489a91244db44526103408301527c010c5aa1a63264c8496c622a49a0ace2cc46c1b4b068862d486426c4296103608301527f4b20adaa1a4b20c5aa1bcb209dea1c4b20adea1bcb20bdea1c4b20c5ea18cf276103e083015260009081908190819081907f54378e412b54358e412b54368e412b54388e415b542996412b543296411b543490879060200201527f0237a8629c8278a86a9c8298a86c9c82d7a8691c82b7a8651c8297a86b1c82f66104208701527f5b1805e360c539063350d939067150a53905ef50e73805af50c738046f50db386104408701527f5aa1c5b00adaa18df00b5ea1be300ae2a18e700c5ea1be300966a1ce300b46c16104608701527f6016b5438ae011b5432b6017ad429b6014ad433b6017ad434b6019ad434b60176104808701527f06d5c02f7a86b5c0337a8675c0137a86b5c0336a8536c02f6a8735c02d6a86b56104a08701527f5ed50e27805ad50d298027150e698027150c6b8052f50e6b804ef50e6b804ef56104c08701527f4f208cac1b4f204cac14d700ae6a18d700b62a19d3009dea1953009dea19cf006104e087015268014c54379e414cd4376105008701527f48496a45213411125a90c9b2125a91484dc8a426c453136511504d8dea1a63076105208701527f44291352290922909c090522905224852b48a226c84913662ac44d885226c44c6105408701527f05226a433136214b622934150cc4d9864d886226c851136e2a09b90d04d4864d6105608701527f06cda86226dc3113661989b40cc4d04858148581242912d218892188921489716105808701527f4da90e26db852dbc429136510c44d024326c4586d222909b7149b265c31136b16105a08701527f0695c1922b444d985226c8358b411a5434ae0e0846f50d31835c316e0536de426105c0870152620846956105e0870152604080516101f4808252610220820190925260009160208201818036833750505060208801516000975094506001925090505b600a8211612ddd578682612cc360018c614469565b612cce90600a61444a565b612cd89190614333565b60328110612ce857612ce861456f565b6020020151612cf657612ddd565b8682612d0360018c614469565b612d0e90600a61444a565b612d189190614333565b60328110612d2857612d2861456f565b60200201519350600094505b60328511612dcb5783612d4657612dcb565b612d51602085614519565b9250612d5e60208561434b565b93506080612d6c84826143a2565b8851612d78919061434b565b612d829190614519565b60f81b8187612d90816144fe565b985081518110612da257612da261456f565b60200101906001600160f81b031916908160001a90535084612dc3816144fe565b955050612d34565b81612dd5816144fe565b925050612cae565b60008667ffffffffffffffff811115612df857612df8614585565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b509050600095505b86861015612e8a57818681518110612e4457612e4461456f565b602001015160f81c60f81b818781518110612e6157612e6161456f565b60200101906001600160f81b031916908160001a90535085612e82816144fe565b965050612e2a565b9998505050505050505050565b6060612ea16135fc565b6040518060a001604052806067815260200161471e6067913981526040805160a08101909152606d808252615dfe602083013981600160200201819052506040518060a00160405280606f81526020016156fb606f9139604080830191909152805160a08101909152606e8082526151b46020830139816003612705565b805160609080612f3f575050604080516020810190915260008152919050565b60006003612f4e836002614333565b612f58919061434b565b612f6390600461444a565b90506000612f72826020614333565b67ffffffffffffffff811115612f8a57612f8a614585565b6040519080825280601f01601f191660200182016040528015612fb4576020820181803683370190505b5090506000604051806060016040528060408152602001615174604091399050600181016020830160005b86811015613040576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fdf565b50600386066001811461305a576002811461306b57613077565b613d3d60f01b600119830152613077565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806130b657506001600160e01b03198216635b5e139f60e01b145b8061044e57506301ffc9a760e01b6001600160e01b031983161461044e565b610691838383613220565b6130ea83836132d8565b6130f76000848484613113565b6106915760405162461bcd60e51b815260040161055b90614206565b60006001600160a01b0384163b1561321557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131579033908990889088906004016141b6565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a1575060408051601f3d908101601f1916820190925261319e918101906138c2565b60015b6131fb573d8080156131cf576040519150601f19603f3d011682016040523d82523d6000602084013e6131d4565b606091505b5080516131f35760405162461bcd60e51b815260040161055b90614206565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120b8565b506001949350505050565b6001600160a01b03831661327b5761327681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61329e565b816001600160a01b0316836001600160a01b03161461329e5761329e8382613426565b6001600160a01b0382166132b557610691816134c3565b826001600160a01b0316826001600160a01b031614610691576106918282613572565b6001600160a01b03821661332e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161055b565b6000818152600260205260409020546001600160a01b0316156133935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161055b565b61339f600083836130d5565b6001600160a01b03821660009081526003602052604081208054600192906133c8908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161343384610a98565b61343d9190614469565b600083815260076020526040902054909150808214613490576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134d590600190614469565b600083815260096020526040812054600880549394509092849081106134fd576134fd61456f565b90600052602060002001549050806008838154811061351e5761351e61456f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061355657613556614559565b6001900381819060005260206000200160009055905550505050565b600061357d83610a98565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011906020820280368337509192915050565b6040518060a001604052806005905b60608152602001906001900390816135e45790505090565b6040805160808101909152606081526003602082016135e4565b60408051610360810190915260608152601a602082016135e4565b604051806101800160405280600c906020820280368337509192915050565b6040805160c08101909152606081526005602082016135e4565b60408051610160810190915260608152600a602082016135e4565b60408051808201909152606081526001602082016135e4565b6040518061064001604052806032906020820280368337509192915050565b80356001600160a01b03811681146136d457600080fd5b919050565b6000602082840312156136eb57600080fd5b612277826136bd565b6000806040838503121561370757600080fd5b613710836136bd565b915061371e602084016136bd565b90509250929050565b60008060006060848603121561373c57600080fd5b613745846136bd565b9250613753602085016136bd565b9150604084013590509250925092565b6000806000806080858703121561377957600080fd5b613782856136bd565b9350613790602086016136bd565b925060408501359150606085013567ffffffffffffffff808211156137b457600080fd5b818701915087601f8301126137c857600080fd5b8135818111156137da576137da614585565b604051601f8201601f19908116603f0116810190838211818310171561380257613802614585565b816040528281528a602084870101111561381b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561385257600080fd5b61385b836136bd565b91506020830135801515811461387057600080fd5b809150509250929050565b6000806040838503121561388e57600080fd5b613897836136bd565b946020939093013593505050565b6000602082840312156138b757600080fd5b81356122778161459b565b6000602082840312156138d457600080fd5b81516122778161459b565b6000602082840312156138f157600080fd5b5035919050565b60008151808452613910816020860160208601614480565b601f01601f19169290920160200192915050565b60008251613936818460208701614480565b9190910192915050565b60008551613952818460208a01614480565b855190830190613966818360208a01614480565b8551910190613979818360208901614480565b845191019061398c818360208801614480565b019695505050505050565b600086516139a9818460208b01614480565b8651908301906139bd818360208b01614480565b86519101906139d0818360208a01614480565b85519101906139e3818360208901614480565b84519101906139f6818360208801614480565b01979650505050505050565b600087516020613a158285838d01614480565b885191840191613a288184848d01614480565b8851920191613a3a8184848c01614480565b8751920191613a4c8184848b01614480565b8651920191613a5e8184848a01614480565b8551920191613a708184848901614480565b919091019998505050505050505050565b6331bc1e9160e11b81528351600090613aa1816004850160208901614480565b65111031bc9e9160d11b6004918401918201528451613ac781600a840160208901614480565b641110391e9160d91b600a92909101918201528351613aed81600f840160208801614480565b601160f91b600f929091019182015260100195945050505050565b7f222f3e203c2f6c696e6561724772616469656e743e203c70617468206f70616381527f6974793d22302e3335222066696c6c3d2275726c282373616e64477261646965602082015267373a149110321e9160c11b604082015260008251613b77816048850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e3335222066696c6c3d22236048939091019283015250606801919050565b641110321e9160d91b81528151600090613bcc816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e34222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c21816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e31222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c76816005850160208701614480565b70222f3e203c706174682066696c6c3d222360781b6005939091019283015250601601919050565b641110321e9160d91b81528151600090613cbf816005850160208701614480565b74222f3e203c673e203c706174682066696c6c3d222360581b6005939091019283015250601a01919050565b641110321e9160d91b81528151600090613d0c816005850160208701614480565b6a011179f101e17b9bb339f160ad1b6005939091019283015250601001919050565b641110321e9160d91b81528151600090613d4f816005850160208701614480565b7f222f3e203c6c696e6561724772616469656e742069643d2273616e644772616460059390910192830152507f69656e7422206772616469656e74556e6974733d227573657253706163654f6e60258201527f557365222078313d222d31343234222079313d22363538222078323d222d343560458201527f36222079323d2236353822206772616469656e745472616e73666f726d3d226d60658201527f6174726978283120302030203120313332342e37393938203135382e3139393260858201527f29223e203c73746f70206f66667365743d223022207374796c653d2273746f7060a5820152672d636f6c6f723a2360c01b60c582015260cd01919050565b641110321e9160d91b81528151600090613e73816005850160208701614480565b7f222f3e203c616e696d6174654d6f74696f6e20706174683d226d20302030206860059390910192830152507f202d3530303022206475723d2232353030732220726570656174436f756e743d60258201527f22696e646566696e69746522202f3e203c2f673e203c706174682066696c6c3d604582015261222360f01b6065820152606701919050565b7f222063783d223434222063793d223832332220723d223939222f3e203c72616481527f69616c4772616469656e742069643d2273756e4772616469656e742220000000602082015260008251613f5c81603d850160208701614480565b7f206772616469656e74556e6974733d227573657253706163654f6e557365223e603d9390910192830152507f203c73746f70206f66667365743d22302e3722207374796c653d2273746f702d605d82015266636f6c6f723a2360c81b607d820152608401919050565b7f222f3e203c2f72616469616c4772616469656e743e203c636972636c65206f7081527f61636974793d22302e38222066696c6c3d2275726c282373756e4772616469656020820152640373a1491160dd1b604082015260008251614032816045850160208701614480565b61179f60f11b6045939091019283015250604701919050565b7f7b226e616d65223a20224f6e436861696e2053616e6473222c2022646573637281527f697074696f6e223a202242656175746966756c2076696577732c20636f6d706c60208201527f6574656c792067656e657261746564204f6e436861696e222c226174747269626040820152653aba32b9911d60d11b6060820152600083516140de816066850160208801614480565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260669184019182015265185cd94d8d0b60d21b6086820152835161412a81608c840160208801614480565b61227d60f01b608c9290910191820152608e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161417d81601d850160208701614480565b91909101601d0192915050565b6314d85b9960e21b8152600082516141a9816004850160208701614480565b9190910160040192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141e9908301846138f8565b9695505050505050565b60208152600061227760208301846138f8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f546f6b656e73206e756d62657220746f206d696e742065786365656473206e756040820152746d626572206f66207075626c696320746f6b656e7360581b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156143465761434661452d565b500190565b60008261435a5761435a614543565b500490565b600181815b8085111561439a5781600019048211156143805761438061452d565b8085161561438d57918102915b93841c9390800290614364565b509250929050565b600061227783836000826143b85750600161044e565b816143c55750600061044e565b81600181146143db57600281146143e557614401565b600191505061044e565b60ff8411156143f6576143f661452d565b50506001821b61044e565b5060208310610133831016604e8410600b8410161715614424575081810a61044e565b61442e838361435f565b80600019048211156144425761444261452d565b029392505050565b60008160001904831182151516156144645761446461452d565b500290565b60008282101561447b5761447b61452d565b500390565b60005b8381101561449b578181015183820152602001614483565b83811115610ca05750506000910152565b6000816144bb576144bb61452d565b506000190190565b600181811c908216806144d757607f821691505b602082108114156144f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145125761451261452d565b5060010190565b60008261452857614528614543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097057600080fdfe4d2d3133322c3730376339332d312c3332382d38392c3433312d373220633130322c31372c3138382c37322c3237302c36386338312d342c3139392d38372c3237352d3835733236382c3134322c3236382c3134322076323534482d39384c2d3133322c3730377a222f3e203c2f6c696e6561724772616469656e743e203c7265637420783d22302e3030312220793d22302e313839222066696c6c3d2275726c28236d61696e4772616469656e7429222077696474683d223130303022206865696768743d2231303030222f3e203c636972636c65206f7061636974793d22302e31222066696c6c3d222322207d2c207b202274726169745f74797065223a20224e656172204f626a656374222c202276616c7565223a2022222f3e203c73746f70206f66667365743d223122207374796c653d2273746f702d636f6c6f723a23222f3e203c73746f70206f66667365743d22302e3822207374796c653d2273746f702d636f6c6f723a234d2d33392c313031336c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3235302d32332d3431362d35632d37372c382d3134382c32392d3332342d3232532d36312c3537342d36312c363134204c2d33392c313031337a4d3137372c393033203231342c383634203138362c383838203137372c383732203138312c383932203136372c393034203136302c383839203136382c383830203135382c383835203134302c383432203135322c383738203133342c383734203135342c383834203136342c393135203137312c393135203137352c393035203139302c3930334d3130322c3932346334322c302c37392d31332c39362d3332206c2d312d31306c2d31392d366c2d392c346c2d362d366c2d32302d31316c2d31312c336c2d312c33376c2d382c356c2d362d32206c2d382c326c2d352c3137433130302c3932342c3130312c3932342c3130322c3932347a22207d2c207b202274726169745f74797065223a202250616c65747465222c202276616c7565223a20224d3137332c3932346c2d322d396c2d382d346c2d352d39206c2d302c31316c2d372c336c2d302c336c2d31362c31336c322c336c362d306c31302d306c322d326c332c316c372d31206c312d326c342d316c31302c334c3137332c3932347a22207d2c207b202274726169745f74797065223a2022466172204f626a656374222c202276616c7565223a20222220643d224d3636382c34323363302c302c3331332d302c3330332d323820632d31302d32382d3339372d34382c31352d3436633330312c322c3139362c34362c3436302c343320633235382d332c3438342d36302c3438352d313763312c34332d3239302c32342d3239302c3530733238382c392c3437382c313220633138392c332c3334312d38332c3533352d3236633139342c35362c3332322c33322c3531372c3520633139342d32372c3134302c302c3432372c30633238372c302c313138302c302c313138302c30762d3331483336303763302c302d3133372d31312d3238332d313020632d3134362c302d3136322c33332d3339342d37632d3233322d34312d3331322d34332d3432302d323420632d3130372c31382d3235352c36382d3339352c3734732d3339372c31382d3339382c37632d312d31302c3434372d32362c3434362d363520632d312d33382d3137362d34322d3339312d3235632d3231352c31362d3339352d31342d3536382d313920632d3137322d342d3632362d382d3632372c3235733332332c32352c3332322c3530632d302c392d3539332c332d3539332c33482d33367632372068343738433434322c3432312c3535332c3432332c3636382c3432337a222f3e203c70617468206f7061636974793d22302e3131222066696c6c3d22234d3239362c36333420632d3130342d31342d3333352c37322d3432382c37336c33332c33303668323936633135302d34392c3332302d3131332c3332302d3134372063302d36302d3235392d39322d3237352d313538433232392c3635312c3238332c3633362c3239362c3633347a5b7b202274726169745f74797065223a20224d61696e222c202276616c7565223a20224d3339302e3431372c3733312e343839632d31392e3438342d37332e3539312c37322e342d39352e37322c37312e34322d39352e383534632d39392e3337362d31322e3031372d3233342e3339352c33342e3434362d3332312e3632312c33372e363832632d35342e3236332c322e30312d3134382e3038332d32312e3935372d3232352e3238372d34312e34323963352e37332c39382e3433332c35382e3535382c3430352e3535372c3439352e3532312c3339322e3131316339362e3733332d322e3937372c3135302e322c322e3834312c3137332e3136362c31342e323735633131302e3038362d34302e3335312c3139322e3032312d37382e3935392c3139322e3032312d3130342e343934433737352e3633372c3835352e3937342c3431322e3730352c3831352e3633352c3339302e3431372c3733312e3438397a4d2d34372e3338342c3732392e3538376c31362e352c3333342e34383248313038322e30366c2d372e3439392d3430302e343863302c302d3134332e3939342c34362e3530392d3239332e3938362c34382e303039632d3133382e3237382c312e3338332d3236392e3938352d37332e3530372d3431302e3937392d3130322e303035532d34372e3338342c3732392e3538372d34372e3338342c3732392e3538374d313038392c313031356c2d313135372c356c31392d34373863302c302c34322d31352c3131392d3232206337372d362c3137332d382c3235352c306338322c392c3135392c31322c3232352c3132733138382d31342c3333382d313420733136352c33332c3136352c33334c313038392c313031357a4d313134332e3535372c3737312e353936433834322e3736362c3737342e3433342c3539302e3239342c3939342e36392c3536332e3837312c313031382e35483238312e323737633231392e3431342d32372e3639322c3236392e3238392d3133342e3736322c3237302e37312d3230302e31313663312e352d36382e3939362d3138312e3439312d37362e3439362d3239352e3438342d3131362e393934632d3130372e3036332d33382e3033352c35372e3039362d38392e332c37372e3435352d39352e333935433138362e3832392c3630332e3537312d34372e3338342c3732392e3538372d34372e3338342c3732392e3538376c31342e3330372c3332312e3931336c313137362e3633342c32372e353843313134332e3535372c313037392e30382c313436312e3534312c3736382e3539362c313134332e3535372c3737312e3539367a4d3139362c3930396c2d32372d36306c322d336c2d322d32206c322d316c2d372d336c302c366c2d31342c31366c312c31316c302d396c31332d31316c322c306c322c35206c2d322c34346c332d376c302c336c322d33306c302c3163302c372c322c32312c322c32312063302d302c302d392c302d31346c31332c33344c3139362c3930397a4d3738392e3635312c3631322e363635632d37352e3230352d31332e3232392d3138302e3034352c32392e3138392d3234372e3231352c33322e303738632d36372e3136382c322e3839322d3231342e3930322d35352e3539362d3235342e3938312d35372e3032632d38302e3630392d322e3836312d3230352e3836322c39342e34392d3239322e3637322c3130302e323133632d31352e3235352c312e3030372d33302e3632352d302e3230342d34362e3139312d322e393831763336342e3432356c313039312e3434342d382e333238563638372e363839433936342e3036362c3637382e3832372c3838332e3835352c3632392e32342c3738392e3635312c3631322e3636357a4d3136342c393237203135392c393237203135352c393239203135352c393331203134312c393331203134302c393330203135302c393232203133392c393239203133382c393239203133332c393333203133372c393332203133342c393335203135352c393331203135352c393332203135382c393334203136332c393332203136362c3933304142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d313134322c313031366c2d313138312c343063302c302d36362d3535342d392d35333020633138312c37372c3239392c32362c3436342c33336337372c332c3230372c34352c3338322c313420633138302d33322c3332372c31342c3333302c32324c313134322c313031367a2220643d224d3636382c34303463302c302c3332322c31322c3331322d313520632d31302d32382d3830342d35362c382d3632633330312d322c3233392c33372c3530332c333420633235382d332c3536352d34322c3536392c3163322c32392d3338312c33322d3431372c363120632d32332c31382c3237332c31322c3437302c37633138392d352c3531332d39342c3731342d353220633231322c34342c3138342c34362c3337392c3138633139342d32372c3138382c312c3437352c31633238372c302c313039362c302c313039362c3020762d323063302c302d313130322c302d313137352c30732d3133372d31332d3238342d3133632d3134362c302d3136312c32352d3339332d313620632d3233322d34312d3331352d33312d3432322d3132632d3130372c31382d3235302c36382d3338392c3734732d3433322c32342d3433322c31332063302d31332c3435382d32352c3437332d37316331322d33372d3137322d35342d3338372d333820632d3231352c31362d3339352d31342d3536382d3139632d3137322d342d3632302c372d3632312c343120632d312c33342c3331392c33322c3332312c353163302c392d3539382d31322d3539382d3132482d33367632376834373820433434322c3430332c3535332c3430342c3636382c3430347a222f3e203c616e696d6174654d6f74696f6e20706174683d224d20302030204c202d33373530203430205a22206475723d22323530732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f673e203c70617468206f7061636974793d22302e3235222066696c6c3d22234d3137362c38373363302c302d39322c32352d38392c33382063332c31332c34332c312c35362d38433135372c3839352c3137362c3837332c3137362c3837337a4d3331322e3235362c3631392e323234632d322e3138362d31382e3438362d31302e3434382d32372e3539322d32312e3032372d33312e3235632d312e3238362d302e3131392d322e3534332d302e3230332d332e3737332d302e323436632d38302e3631312d322e3836332d3230352e3836322c39342e3438392d3239322e3637312c3130302e323131632d31352e3235352c312e3030372d33302e3632372d302e3230342d34362e3139332d322e393831763336392e3437394838332e323932433238332e3837312c3838362e3837312c3331382e3236322c3637302e30362c3331322e3235362c3631392e3232347a4d2d36382c313038326c313135372c366c2d31392d35373763302c302d33392d362d3131372d3620732d3130322c382d3138352c3136732d3131382c382d3138332c38732d3138312d32312d3333312d3231732d3238362c34322d3238362c3432204c2d36382c313038327a4d3433312e3734312c3533372e373234203337312e38352c3436372e303936203332312e3538322c3531372e333634203235342e3835392c3434322e333631203136302e31312c3533372e3130394d3138382c3930306c2d31342d32316c2d342c312063302c302c372c31392c372c3230632d302c302d362c312d362c316c2d31382d366c2d322d31376c2d332c31336c2d382d3231206c2d332c326c302c31336c2d34332c31326c2d362c396c2d34332c366c2d362c366c36372c316c392d3020433134322c3932322c3137302c3931332c3138382c3930307a4d2d33392c313031366c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3231312d34302d3337372d3232632d37372c382d3230332c33372d3338302c323520632d3138322d31322d3332372c31342d3333302c32324c2d33392c313031367a4d3234342c353537203233382c343838203234382c343838203233382c343133203239382c333938203239362c333839203432342c343037203430312c343834203339312c343837203338332c3535354d3132382c38393763342c312c382c362c31352c372063382d352c31352d31312c32302d313763302d322c312d352c312d3663302d302c302d302c302d302063302d302c302d302c302d3063322d332c352d342c372d3363302d302c302d312c312d3120632d322d322d382d312d31322c34632d332c352d362c362d362c36632d322c302d332c302d342c3020632d302d302d302d302d302d30632d302d322d332d342d362d346c2d302d326c2d332c316c302c3220632d322c312d332c342d322c3763302c302c302c302c302c30632d342c312d31312c322d31362c3220632d382d302d382c362d382c366c392d32433132352c3839362c3132372c3839362c3132382c3839377a3c7376672076657273696f6e3d22312e31222069643d224c617965725f322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2220783d223070782220793d22307078222077696474683d2231303030707822206865696768743d22313030307078222076696577426f783d22302030203130303020313030302220656e61626c652d6261636b67726f756e643d226e657720302030203130303020313030302220786d6c3a73706163653d227072657365727665223e203c6c696e6561724772616469656e742069643d226d61696e4772616469656e7422206772616469656e74556e6974733d227573657253706163654f6e557365222078313d222d3136322e33393932222079313d223131382e30393934222078323d222d3136322e33393933222079323d22313131372e3931303422206772616469656e745472616e73666f726d3d226d6174726978283120302030202d31203636322e3339393920313131382e3039393129223e203c73746f70206f66667365743d22302e363422207374796c653d2273746f702d636f6c6f723a234d3230392c35313163302d302c33362d382c33362d38207331302d312c31312d317331372d31352c31372d313673302d362c302d366c31392d30762d3668396c312d366834762d312068363776326835763463302c302c31312d312c31312c3073302c382c302c3868323076366c31382c3138683776313076373048323039204c3230392c3531317a4d3733302e3639362c3639352e353231632d31342e36362d36342e3233342c35342e3437392d38332e3534392c35332e3733382d38332e363638632d37342e3737332d31302e3438362d3137362e3336352c33302e3036382d3234312e3939382c33322e383931632d36352e31382c322e3830362d3230362e3231392d35322e3138342d3235312e3133392d35362e3733396331302e3534372c332e3637342c31382e3737372c31322e3737362c32302e3935392c33312e32323363352e3731312c34382e3334322d32352e3131342c3234362e3736382d3230302e3633322c3431302e3231356c3537322e3034382c362e39393268302e323436633135372e3735342d35352e3330332c3333362e3633312d3132362e3337372c3333362e3633312d3136342e33343243313032302e3534392c3830342e3137372c3734372e3436372c3736382e3936382c3733302e3639362c3639352e3532317a4d3133352c393037203136342c393133203136342c393135203137312c393135203134352c393239203131322c393332203134352c393235203136302c393136203135312c393132203134352c393134203134372c3931314d313233312e3034392c3631342e373738632d3130362e312d332e3130392d3237302e3936332c3130322e3730342d3338352e3232332c3130382e393235632d3131342e3235382c362e3232392d3233332e3431382d36352e3335342d3337372e30362d38372e313339632d39392e3934382d31352e3135382d3233392e3238312c33332e34342d3332382e3535322c33362e373531632d38392e3236392c332e3331332d3238352e3630392d36332e3639362d3333382e3837372d36352e333236632d3130372e3133322d332e3237372d31342e38392c3533342e3639382d31342e38392c3533342e3639386c313132302e3030312d32302e363232433930362e3434392c313132322e3036342c313333372e3134372c3631372e3838392c313233312e3034392c3631342e3737387a4d313134302c313031336c2d313138312c343063302c302d33372d3530372c32332d343936633138392c33342c3331352d342c3438322c3133206337372c382c3230352c35312c3339312d3231633137302d36362c3237302c36312c3237332c36394c313134302c313031337a4d3138392c393035203130302c3932312039362c393434203130372c393235203139362c39303922207d2c207b202274726169745f74797065223a202253756e222c202276616c7565223a20224d3536392c37303220632d38312c342d3136372d35312d3237302d3638632d39302d31342d3238322c35312d3339312c36386c2d362c3330316c302c386837353020433834312c3837312c3837342c3638372c3836382c363434632d322d31352d392d32332d31392d3236632d312d302d322d302d332d3020433736392c3631352c3635312c3639382c3536392c3730327aa26469706673582212203f330052506af68832c77f5e07df0efbf225ff3cf26fc62dd9c5d62fd828f77264736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101405760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610365578063aaf492a314610385578063b88d4fde1461039a578063c87b56dd146103ba578063e985e9c5146103da578063f2fde38b1461042357600080fd5b80634f6ccce7146102bd5780636352211e146102dd57806370a08231146102fd578063715018a61461031d5780638da5cb5b1461033257806395d89b411461035057600080fd5b806323b872dd1161010857806323b872dd146102155780632f745c591461023557806330ffc9e3146102555780633ccfd60b1461026857806340d097c31461027d57806342842e0e1461029d57600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806318160ddd146101f6575b600080fd5b34801561015157600080fd5b506101656101603660046138a5565b610443565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610454565b60405161017191906141f3565b3480156101a857600080fd5b506101bc6101b73660046138df565b6104e6565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461387b565b610580565b005b34801561020257600080fd5b506008545b604051908152602001610171565b34801561022157600080fd5b506101f4610230366004613727565b610696565b34801561024157600080fd5b5061020761025036600461387b565b6106c7565b6101f46102633660046138df565b61075d565b34801561027457600080fd5b506101f46108d2565b34801561028957600080fd5b506101f46102983660046136d9565b61092b565b3480156102a957600080fd5b506101f46102b8366004613727565b610973565b3480156102c957600080fd5b506102076102d83660046138df565b61098e565b3480156102e957600080fd5b506101bc6102f83660046138df565b610a21565b34801561030957600080fd5b506102076103183660046136d9565b610a98565b34801561032957600080fd5b506101f4610b1f565b34801561033e57600080fd5b50600a546001600160a01b03166101bc565b34801561035c57600080fd5b5061018f610b55565b34801561037157600080fd5b506101f461038036600461383f565b610b64565b34801561039157600080fd5b506101f4610c29565b3480156103a657600080fd5b506101f46103b5366004613763565b610c6e565b3480156103c657600080fd5b5061018f6103d53660046138df565b610ca6565b3480156103e657600080fd5b506101656103f53660046136f4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561042f57600080fd5b506101f461043e3660046136d9565b611e95565b600061044e82611f36565b92915050565b606060008054610463906144c3565b80601f016020809104026020016040519081016040528092919081815260200182805461048f906144c3565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058b82610a21565b9050806001600160a01b0316836001600160a01b031614156105f95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055b565b336001600160a01b0382161480610615575061061581336103f5565b6106875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055b565b6106918383611f5b565b505050565b6106a03382611fc9565b6106bc5760405162461bcd60e51b815260040161055b906142e2565b6106918383836120c0565b60006106d283610a98565b82106107345760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161055b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000811161079c5760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8185b5bdd5b9d60a21b604482015260640161055b565b601e8111156108005760405162461bcd60e51b815260206004820152602a60248201527f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d62656044820152691c88195e18d95959195960b21b606482015260840161055b565b61135661081682610810600b5490565b9061226b565b11156108345760405162461bcd60e51b815260040161055b90614258565b600c543490610843908361227e565b11156108915760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420697320746f6f206c6f770000000000604482015260640161055b565b60005b818110156108ce576108ae336108a9600b5490565b61228a565b6108bc600b80546001019055565b806108c6816144fe565b915050610894565b5050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161055b906142ad565b6040514790339082156108fc029083906000818181858888f193505050501580156108ce573d6000803e3d6000fd5b600a546001600160a01b031633146109555760405162461bcd60e51b815260040161055b906142ad565b610962816108a9600b5490565b610970600b80546001019055565b50565b61069183838360405180602001604052806000815250610c6e565b600061099960085490565b82106109fc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161055b565b60088281548110610a0f57610a0f61456f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061044e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161055b565b60006001600160a01b038216610b035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161055b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b495760405162461bcd60e51b815260040161055b906142ad565b610b5360006122a4565b565b606060018054610463906144c3565b6001600160a01b038216331415610bbd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6101f4610c35600b5490565b1115610c535760405162461bcd60e51b815260040161055b90614258565b610c60336108a9600b5490565b610b53600b80546001019055565b610c783383611fc9565b610c945760405162461bcd60e51b815260040161055b906142e2565b610ca0848484846122f6565b50505050565b6060610cb06135b6565b610cb86135d5565b610cc06135fc565b610cc86135fc565b610cd06135fc565b610cd8613616565b610ce0613631565b610ce8613650565b610cf0613650565b600080610d23610cff8e612329565b604051602001610d0f919061418a565b604051602081830303815290604052612427565b90506005610d32600a8361434b565b610d3c9190614519565b610d47906001614333565b85526021610d576103e88361434b565b610d619190614519565b610d6c906001614333565b60208601526004610d7f6127108361434b565b610d899190614519565b610d94906001614333565b60408601526002610da76127108361434b565b610db19190614519565b610dbc906001614333565b60608601526004610dd0620186a08361434b565b610dda9190614519565b610de5906001614333565b60808601526004610dfa633b9aca008361434b565b610e049190614519565b610e0f906001614333565b60a08601526005610e256402540be4008361434b565b610e2f9190614519565b610e3a906001614333565b60c08601526005610e4f6305f5e1008361434b565b610e599190614519565b610e64906001614333565b60e08601526040805161014081019091526101098082526157ba602083013984526040805160c081019091526088808252614785602083013984600160200201819052506040518060800160405280605f81526020016148a9605f9139604080860191909152805160a08101909152607280825261480d602083013960608501526040805160c081019091526087808252614f5a602083013960808086019190915260408051918201905260418082526154816020830139835260408051608081019091526058808252615c75602083013983600160200201819052506040518060c00160405280608881526020016150ec60889139604080850191909152805160c08101909152608d80825261566e60208301396060808501919091526040805191820190526027808252615e6b6020830139608084015260408051610140810190915261010b808252614fe1602083013989526040805160a0810190915260688082526145b2602083013989600160200201819052506040518061016001604052806101318152602001615ccd61013191396040808b0191909152805160e0810190915260a2808252614cf8602083013960608a015260408051610180810190915261015c808252615b19602083013988526040805160c081019091526092808252615eb8602083013988600160200201819052506040518061018001604052806101418152602001614bb761014191396040808a019190915280516101808101909152610149808252614e116020830139606089015260408051610120810190915260f28082526154c2602083013987526040805160a08101909152606f808252614b2560208301396020888101919091526040805180830182526000808252828b0191909152815180840183529081526060808b01919091527d3f87e2204da90013704fa4ffebfafff2a140ba0000ba0000ffc64fffff9e8e527ddd74929a3a93560094ffd28afffeebdd74929a3a93560094ff9191fffeeb8e8401527de45f00ae3000780000ff7700ffff9ee47946ae3c23780000ff9757ffff9e918e01919091527ded5f16ca300ba60000ff771cffff9ed55f178230462f0075ff7700ffff9e908d01527dd6c4b7b395888f6559e3cfbdfffeebedb688ca7d56a64324ffd3a1fffeeb60808d01527d527ace653d9a7800664898e8d6fffbd2713ca5382578000ee88d48ffecd660a08d01527d64d6a432836d0031367dffc0ffff9ee4b478ae5a6f780066ffe17dffffff60c08d01527dd954478c2a463f0045ff6947fff9bfd2a75a7754671d0073ffd154fff9bf60e08d01527dd79815864c0a360000ffbe19ffedb0d92a228c15333f0045ff3419ffda616101008d01527d81838d404664000a3ba1a1a1f7f7f78096c14d4b7e1a003b9abbe3f7f7f76101208d01527dd302027c0101240000ff0303ffcb21c5ce92626c67000a3bf6ffa8fffdf26101408d01527dcce3eb66acc2007599ffffff8bb6c7d846088923113b001aff5703ffd3426101608d01527dcca98866565c000330ffd29efff7e8b64ed15e2776060019e261fffff2d96101808d01527d8a8a8a454545000000adadadffffff74bd713a6e52001f3391e581f2ff7a6101a08d01527d3b00002200000a0000470000a3000024003912001c0000002d0047523ea36101c08d01527d6863d863328a5e003c6b7cff59005000373a006062008a8a002226008a836101e08d01526eead56a7f5e542a0042ffec6efff4c76102008d015285015161136b90600190614469565b61137690600561444a565b91506113d3630100000061138b600a85614519565b6113999063010000006143a2565b8d6113a5600a8761434b565b601181106113b5576113b561456f565b60200201516113c4919061434b565b6113ce9190614519565b612458565b8a5260208501516113e690600190614469565b6113f190600561444a565b6113fc906001614333565b9150611411630100000061138b600a85614519565b6020808c019190915285015161142990600190614469565b61143490600561444a565b61143f906002614333565b9150611454630100000061138b600a85614519565b60408b0152602085015161146a90600190614469565b61147590600561444a565b611480906003614333565b9150611495630100000061138b600a85614519565b60608b015260208501516114ab90600190614469565b6114b690600561444a565b6114c1906004614333565b91506114d6630100000061138b600a85614519565b60808b01526040805161020081019091526101cd8082526158c360208301398652604080516060810190915260288082526146cc602083013986600160200201819052506040518060c001604052806084815260200161461a60849139604087015261156060028660075b602002015161155190600261444a565b61155b9190614469565b612577565b6040516020016115709190613efe565b60408051808303601f190181529181526060808901929092528051918201905260288082526146cc602083013960808701526115af6002866007611541565b6040516020016115bf9190613fc6565b60408051601f1981840301815291815260a0880191909152805160208082018352600080835260c08a01929092528251808201845282815260e08a0152825180820184528281526101008a0152825180820184528281526101208a0152825180820184528281526101408a0152825180820184528281526101608a0152825180820184528281526101808a0152825180820184529182526101a0890191909152815180830183528181527f3c673e203c70617468206f7061636974793d22302e3131222066696c6c3d2223818301526101c0890152815161022081019092526101f080835290614935908301396101e087015260408051610280810190915261025f808252615222602083013961020087015260a08501516116e090612665565b6040516020016116f09190613c55565b60408051808303601f19018152919052610220870152606085015161171490612732565b6040516020016117249190613c9e565b60408051808303601f19018152919052610240870152845161174590612790565b6040516020016117559190613e52565b60408051808303601f19018152919052610260870152608085015161177990612e97565b6040516020016117899190613c55565b60408051808303601f1901815291815261028088019190915285015189906117b390600190614469565b600481106117c3576117c361456f565b60200201516040516020016117d89190613d2e565b60408051808303601f190181529181526102a0880191909152805160608101909152602a8082526146f460208301396102c08701526040850151889061182090600190614469565b600481106118305761183061456f565b60200201516040516020016118459190613b08565b60408051808303601f190181529181526102e0880191909152850151879061186f90600190614469565b6004811061187f5761187f61456f565b60200201516040516020016118949190613c00565b60408051808303601f1901815291905261030087015260c085015183906118bd90600190614469565b600681106118cd576118cd61456f565b60200201516040516020016118e29190613bab565b60408051808303601f1901815291905261032087015260c0850151849061190b90600190614469565b6006811061191b5761191b61456f565b60200201516040516020016119309190613ceb565b60408051808303601f19018152918152610340880191909152865160208c810151818a01518e8501518b860151955160009661196f9695909101613997565b60408051601f198184030181529190529050808b6000602002015188600360200201518d600060200201518a600460200201518f600160200201516040516020016119bf96959493929190613a02565b60408051808303601f190181529082905260a08901518d5160c08b01519294506119f0938593908290602001613997565b60408051601f1981840301815291905290508087600760200201518c6001602002015189600860200201518e60006020020151604051602001611a37959493929190613997565b60408051601f1981840301815291905290508087600960200201518c6000602002015189600a60200201518e60016020020151604051602001611a7e959493929190613997565b60408051808303601f19018152908290526101608901518d516101808b0151929450611ab1938593908290602001613997565b60408051601f1981840301815291905290508087600d60200201518c6001602002015189600e60200201518e60006020020151604051602001611af8959493929190613997565b60408051601f1981840301815291905290508087600f60200201518c6000602002015189601060200201518e60046020020151604051602001611b3f959493929190613997565b60408051601f1981840301815291905290508087601160200201518c6004602002015189601260200201518e60036020020151604051602001611b86959493929190613997565b60408051601f1981840301815291905290508087601360200201518c6003602002015189601460200201518e60016020020151604051602001611bcd959493929190613997565b60408051601f1981840301815291905290508087601560200201518c6001602002015189601660200201518e60026020020151604051602001611c14959493929190613997565b60408051808303601f190181528282526102e08a0151918e01516103008b0151919450611c4993859392908290602001613997565b60408051808303601f190181528282526103208a0151918e01516103408b0151919450611c7c9385939290602001613940565b6040516020818303038152906040529050611c9561366a565b604051806060016040528060238152602001614b94602391398152611cc18760005b6020020151612329565b81600160200201819052506040518060600160405280602a815260200161487f602a91396040820152611cf5876001611cb7565b606080830191909152604080519182019052602e80825261469e60208301396080820152611d24876006611cb7565b60a08201526040805160608101909152602d808252614908602083013960c0820152611d51876005611cb7565b60e082015260408051606081019091526026808252615e926020830139610100820152611d7f876007611cb7565b610120820152604080518082018252600481526322207d5d60e01b602080830191909152610140840191909152825181840151838501516060860151608087015160a08801519651600097611dd697909101613a02565b60408051808303601f190181529082905260c084015160e0850151610100860151610120870151610140880151949650611e1595879590602001613a02565b60405160208183030381529060405290506000611e5a82611e3586612f1f565b604051602001611e4692919061404b565b604051602081830303815290604052612f1f565b905080604051602001611e6d9190614145565b6040516020818303038152906040529350839f50505050505050505050505050505050919050565b600a546001600160a01b03163314611ebf5760405162461bcd60e51b815260040161055b906142ad565b6001600160a01b038116611f245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055b565b610970816122a4565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061044e575061044e82613085565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9082610a21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166120425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161055b565b600061204d83610a21565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d846104e6565b6001600160a01b0316145b806120b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120d382610a21565b6001600160a01b03161461213b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161055b565b6001600160a01b03821661219d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161055b565b6121a88383836130d5565b6121b3600082611f5b565b6001600160a01b03831660009081526003602052604081208054600192906121dc908490614469565b90915550506001600160a01b038216600090815260036020526040812080546001929061220a908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122778284614333565b9392505050565b6000612277828461444a565b6108ce8282604051806020016040528060008152506130e0565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123018484846120c0565b61230d84848484613113565b610ca05760405162461bcd60e51b815260040161055b90614206565b60608161234d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123775780612361816144fe565b91506123709050600a8361434b565b9150612351565b60008167ffffffffffffffff81111561239257612392614585565b6040519080825280601f01601f1916602001820160405280156123bc576020820181803683370190505b5090505b84156120b8576123d1600183614469565b91506123de600a86614519565b6123e9906030614333565b60f81b8183815181106123fe576123fe61456f565b60200101906001600160f81b031916908160001a905350612420600a8661434b565b94506123c0565b60008160405160200161243a9190613924565b60408051601f19818403018152919052805160209091012092915050565b60608161248157505060408051808201909152600681526503030303030360d41b602082015290565b6040805180820190915260068082526503030303030360d41b6020830152905b811561227757600a6124b4601086614519565b101561250b576124c5601085614519565b6124d0906030614333565b60f81b816124df600185614469565b815181106124ef576124ef61456f565b60200101906001600160f81b031916908160001a905350612558565b612516601085614519565b612521906037614333565b60f81b81612530600185614469565b815181106125405761254061456f565b60200101906001600160f81b031916908160001a9053505b61256360108561434b565b93508161256f816144ac565b9250506124a1565b60607d66c3ec35814cf53a8d1d8f8f2b573412cb485cf3ae933a4389431f09c33b670906539c38c8f192600884106125cd57836008146125c4576125bf633b9aca008261434b565b6125c6565b805b91506125f7565b83156125f7576125de84600361444a565b6125ea906103e86143a2565b6125f4908361434b565b91505b600061261b6103e861260c620f42408661434b565b6126169190614519565b612329565b61262b6103e861260c818761434b565b61263a6126166103e887614519565b60405160200161264c93929190613a81565b60408051601f1981840301815291905295945050505050565b606061266f6135fc565b6040518060800160405280604e8152602001615620604e9139815260408051808201909152601f81527f4d3139312c3535366c3231392d326c2d39392d3131374c3139312c3535367a006020820152816001602002018190525060405180608001604052806050815260200161576a60509139604080830191909152805160c081019091526089808252615a9060208301398160035b602002015280612716600185614469565b600481106127265761272661456f565b60200201519392505050565b606061273c613685565b6040518060a00160405280606c81526020016155b4606c913981526040805160a081019091526077808252614d9a6020830139602082015280612780600185614469565b600281106127265761272661456f565b606061279a61369e565b761cb86ed9ab466c98faedcf668c7598539b324435cb562081527f3521989a09445313522889b48867113631146226c622489b788a2d926c1b5b276020808301919091527f09a91484d058561363113d32149b2162426d221889b90d5b28862d486cda866260408301527f4e218b521c34150d44d486a26ce22a09a91444da4433889b51544d906426cc5260608301526d2124d836b64d2cb3320d84dc86cd60808301527f5320ad2a1c5320c52a1cd320b56a195720a56a1ad720b5aa195f20adea1b5f276101608301527f5434a6416ad433a6415ad4399e415ad432a6409ad436a6415a5434a6413a54376101808301527f0276a8674c8276a8674c8276a8634c82d6a8534c8336a86f3c8335a8733c83156101a08301527f625904ad50da5904ad50de3905ab50ce59056b50e259066d50ce79026f50d6796101c08301527b0c5aa195f209e2a19df20ce6a14df20c66a1b4f20b62a1acf20b5ea16101e08301527f36310c5b1159a0a06426c433135311504db87226d433136c29444dc5aa1a63276102a08301527f36a2a09b10c84d0485213522909b51584d4c44f948516cc51909b8886226e0356102c08301527f46426ca41989b80d9a08c4316a4376d03413521a09b288a826a451136710ca226102e08301527f4432136814b641b89b60a5a0886f113702489b515c4d4c4516a4336da424b6226103008301527f09b6889f988989905226e436682510c5a90ddb40d04d486826ce22a09a91444d6103208301527f09b10a4310a4290a5690a4290a4290a560985226a45213642489a91244db44526103408301527c010c5aa1a63264c8496c622a49a0ace2cc46c1b4b068862d486426c4296103608301527f4b20adaa1a4b20c5aa1bcb209dea1c4b20adea1bcb20bdea1c4b20c5ea18cf276103e083015260009081908190819081907f54378e412b54358e412b54368e412b54388e415b542996412b543296411b543490879060200201527f0237a8629c8278a86a9c8298a86c9c82d7a8691c82b7a8651c8297a86b1c82f66104208701527f5b1805e360c539063350d939067150a53905ef50e73805af50c738046f50db386104408701527f5aa1c5b00adaa18df00b5ea1be300ae2a18e700c5ea1be300966a1ce300b46c16104608701527f6016b5438ae011b5432b6017ad429b6014ad433b6017ad434b6019ad434b60176104808701527f06d5c02f7a86b5c0337a8675c0137a86b5c0336a8536c02f6a8735c02d6a86b56104a08701527f5ed50e27805ad50d298027150e698027150c6b8052f50e6b804ef50e6b804ef56104c08701527f4f208cac1b4f204cac14d700ae6a18d700b62a19d3009dea1953009dea19cf006104e087015268014c54379e414cd4376105008701527f48496a45213411125a90c9b2125a91484dc8a426c453136511504d8dea1a63076105208701527f44291352290922909c090522905224852b48a226c84913662ac44d885226c44c6105408701527f05226a433136214b622934150cc4d9864d886226c851136e2a09b90d04d4864d6105608701527f06cda86226dc3113661989b40cc4d04858148581242912d218892188921489716105808701527f4da90e26db852dbc429136510c44d024326c4586d222909b7149b265c31136b16105a08701527f0695c1922b444d985226c8358b411a5434ae0e0846f50d31835c316e0536de426105c0870152620846956105e0870152604080516101f4808252610220820190925260009160208201818036833750505060208801516000975094506001925090505b600a8211612ddd578682612cc360018c614469565b612cce90600a61444a565b612cd89190614333565b60328110612ce857612ce861456f565b6020020151612cf657612ddd565b8682612d0360018c614469565b612d0e90600a61444a565b612d189190614333565b60328110612d2857612d2861456f565b60200201519350600094505b60328511612dcb5783612d4657612dcb565b612d51602085614519565b9250612d5e60208561434b565b93506080612d6c84826143a2565b8851612d78919061434b565b612d829190614519565b60f81b8187612d90816144fe565b985081518110612da257612da261456f565b60200101906001600160f81b031916908160001a90535084612dc3816144fe565b955050612d34565b81612dd5816144fe565b925050612cae565b60008667ffffffffffffffff811115612df857612df8614585565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b509050600095505b86861015612e8a57818681518110612e4457612e4461456f565b602001015160f81c60f81b818781518110612e6157612e6161456f565b60200101906001600160f81b031916908160001a90535085612e82816144fe565b965050612e2a565b9998505050505050505050565b6060612ea16135fc565b6040518060a001604052806067815260200161471e6067913981526040805160a08101909152606d808252615dfe602083013981600160200201819052506040518060a00160405280606f81526020016156fb606f9139604080830191909152805160a08101909152606e8082526151b46020830139816003612705565b805160609080612f3f575050604080516020810190915260008152919050565b60006003612f4e836002614333565b612f58919061434b565b612f6390600461444a565b90506000612f72826020614333565b67ffffffffffffffff811115612f8a57612f8a614585565b6040519080825280601f01601f191660200182016040528015612fb4576020820181803683370190505b5090506000604051806060016040528060408152602001615174604091399050600181016020830160005b86811015613040576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fdf565b50600386066001811461305a576002811461306b57613077565b613d3d60f01b600119830152613077565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806130b657506001600160e01b03198216635b5e139f60e01b145b8061044e57506301ffc9a760e01b6001600160e01b031983161461044e565b610691838383613220565b6130ea83836132d8565b6130f76000848484613113565b6106915760405162461bcd60e51b815260040161055b90614206565b60006001600160a01b0384163b1561321557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131579033908990889088906004016141b6565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a1575060408051601f3d908101601f1916820190925261319e918101906138c2565b60015b6131fb573d8080156131cf576040519150601f19603f3d011682016040523d82523d6000602084013e6131d4565b606091505b5080516131f35760405162461bcd60e51b815260040161055b90614206565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120b8565b506001949350505050565b6001600160a01b03831661327b5761327681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61329e565b816001600160a01b0316836001600160a01b03161461329e5761329e8382613426565b6001600160a01b0382166132b557610691816134c3565b826001600160a01b0316826001600160a01b031614610691576106918282613572565b6001600160a01b03821661332e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161055b565b6000818152600260205260409020546001600160a01b0316156133935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161055b565b61339f600083836130d5565b6001600160a01b03821660009081526003602052604081208054600192906133c8908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161343384610a98565b61343d9190614469565b600083815260076020526040902054909150808214613490576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134d590600190614469565b600083815260096020526040812054600880549394509092849081106134fd576134fd61456f565b90600052602060002001549050806008838154811061351e5761351e61456f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061355657613556614559565b6001900381819060005260206000200160009055905550505050565b600061357d83610a98565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011906020820280368337509192915050565b6040518060a001604052806005905b60608152602001906001900390816135e45790505090565b6040805160808101909152606081526003602082016135e4565b60408051610360810190915260608152601a602082016135e4565b604051806101800160405280600c906020820280368337509192915050565b6040805160c08101909152606081526005602082016135e4565b60408051610160810190915260608152600a602082016135e4565b60408051808201909152606081526001602082016135e4565b6040518061064001604052806032906020820280368337509192915050565b80356001600160a01b03811681146136d457600080fd5b919050565b6000602082840312156136eb57600080fd5b612277826136bd565b6000806040838503121561370757600080fd5b613710836136bd565b915061371e602084016136bd565b90509250929050565b60008060006060848603121561373c57600080fd5b613745846136bd565b9250613753602085016136bd565b9150604084013590509250925092565b6000806000806080858703121561377957600080fd5b613782856136bd565b9350613790602086016136bd565b925060408501359150606085013567ffffffffffffffff808211156137b457600080fd5b818701915087601f8301126137c857600080fd5b8135818111156137da576137da614585565b604051601f8201601f19908116603f0116810190838211818310171561380257613802614585565b816040528281528a602084870101111561381b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561385257600080fd5b61385b836136bd565b91506020830135801515811461387057600080fd5b809150509250929050565b6000806040838503121561388e57600080fd5b613897836136bd565b946020939093013593505050565b6000602082840312156138b757600080fd5b81356122778161459b565b6000602082840312156138d457600080fd5b81516122778161459b565b6000602082840312156138f157600080fd5b5035919050565b60008151808452613910816020860160208601614480565b601f01601f19169290920160200192915050565b60008251613936818460208701614480565b9190910192915050565b60008551613952818460208a01614480565b855190830190613966818360208a01614480565b8551910190613979818360208901614480565b845191019061398c818360208801614480565b019695505050505050565b600086516139a9818460208b01614480565b8651908301906139bd818360208b01614480565b86519101906139d0818360208a01614480565b85519101906139e3818360208901614480565b84519101906139f6818360208801614480565b01979650505050505050565b600087516020613a158285838d01614480565b885191840191613a288184848d01614480565b8851920191613a3a8184848c01614480565b8751920191613a4c8184848b01614480565b8651920191613a5e8184848a01614480565b8551920191613a708184848901614480565b919091019998505050505050505050565b6331bc1e9160e11b81528351600090613aa1816004850160208901614480565b65111031bc9e9160d11b6004918401918201528451613ac781600a840160208901614480565b641110391e9160d91b600a92909101918201528351613aed81600f840160208801614480565b601160f91b600f929091019182015260100195945050505050565b7f222f3e203c2f6c696e6561724772616469656e743e203c70617468206f70616381527f6974793d22302e3335222066696c6c3d2275726c282373616e64477261646965602082015267373a149110321e9160c11b604082015260008251613b77816048850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e3335222066696c6c3d22236048939091019283015250606801919050565b641110321e9160d91b81528151600090613bcc816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e34222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c21816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e31222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c76816005850160208701614480565b70222f3e203c706174682066696c6c3d222360781b6005939091019283015250601601919050565b641110321e9160d91b81528151600090613cbf816005850160208701614480565b74222f3e203c673e203c706174682066696c6c3d222360581b6005939091019283015250601a01919050565b641110321e9160d91b81528151600090613d0c816005850160208701614480565b6a011179f101e17b9bb339f160ad1b6005939091019283015250601001919050565b641110321e9160d91b81528151600090613d4f816005850160208701614480565b7f222f3e203c6c696e6561724772616469656e742069643d2273616e644772616460059390910192830152507f69656e7422206772616469656e74556e6974733d227573657253706163654f6e60258201527f557365222078313d222d31343234222079313d22363538222078323d222d343560458201527f36222079323d2236353822206772616469656e745472616e73666f726d3d226d60658201527f6174726978283120302030203120313332342e37393938203135382e3139393260858201527f29223e203c73746f70206f66667365743d223022207374796c653d2273746f7060a5820152672d636f6c6f723a2360c01b60c582015260cd01919050565b641110321e9160d91b81528151600090613e73816005850160208701614480565b7f222f3e203c616e696d6174654d6f74696f6e20706174683d226d20302030206860059390910192830152507f202d3530303022206475723d2232353030732220726570656174436f756e743d60258201527f22696e646566696e69746522202f3e203c2f673e203c706174682066696c6c3d604582015261222360f01b6065820152606701919050565b7f222063783d223434222063793d223832332220723d223939222f3e203c72616481527f69616c4772616469656e742069643d2273756e4772616469656e742220000000602082015260008251613f5c81603d850160208701614480565b7f206772616469656e74556e6974733d227573657253706163654f6e557365223e603d9390910192830152507f203c73746f70206f66667365743d22302e3722207374796c653d2273746f702d605d82015266636f6c6f723a2360c81b607d820152608401919050565b7f222f3e203c2f72616469616c4772616469656e743e203c636972636c65206f7081527f61636974793d22302e38222066696c6c3d2275726c282373756e4772616469656020820152640373a1491160dd1b604082015260008251614032816045850160208701614480565b61179f60f11b6045939091019283015250604701919050565b7f7b226e616d65223a20224f6e436861696e2053616e6473222c2022646573637281527f697074696f6e223a202242656175746966756c2076696577732c20636f6d706c60208201527f6574656c792067656e657261746564204f6e436861696e222c226174747269626040820152653aba32b9911d60d11b6060820152600083516140de816066850160208801614480565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260669184019182015265185cd94d8d0b60d21b6086820152835161412a81608c840160208801614480565b61227d60f01b608c9290910191820152608e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161417d81601d850160208701614480565b91909101601d0192915050565b6314d85b9960e21b8152600082516141a9816004850160208701614480565b9190910160040192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141e9908301846138f8565b9695505050505050565b60208152600061227760208301846138f8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f546f6b656e73206e756d62657220746f206d696e742065786365656473206e756040820152746d626572206f66207075626c696320746f6b656e7360581b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156143465761434661452d565b500190565b60008261435a5761435a614543565b500490565b600181815b8085111561439a5781600019048211156143805761438061452d565b8085161561438d57918102915b93841c9390800290614364565b509250929050565b600061227783836000826143b85750600161044e565b816143c55750600061044e565b81600181146143db57600281146143e557614401565b600191505061044e565b60ff8411156143f6576143f661452d565b50506001821b61044e565b5060208310610133831016604e8410600b8410161715614424575081810a61044e565b61442e838361435f565b80600019048211156144425761444261452d565b029392505050565b60008160001904831182151516156144645761446461452d565b500290565b60008282101561447b5761447b61452d565b500390565b60005b8381101561449b578181015183820152602001614483565b83811115610ca05750506000910152565b6000816144bb576144bb61452d565b506000190190565b600181811c908216806144d757607f821691505b602082108114156144f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145125761451261452d565b5060010190565b60008261452857614528614543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097057600080fdfe4d2d3133322c3730376339332d312c3332382d38392c3433312d373220633130322c31372c3138382c37322c3237302c36386338312d342c3139392d38372c3237352d3835733236382c3134322c3236382c3134322076323534482d39384c2d3133322c3730377a222f3e203c2f6c696e6561724772616469656e743e203c7265637420783d22302e3030312220793d22302e313839222066696c6c3d2275726c28236d61696e4772616469656e7429222077696474683d223130303022206865696768743d2231303030222f3e203c636972636c65206f7061636974793d22302e31222066696c6c3d222322207d2c207b202274726169745f74797065223a20224e656172204f626a656374222c202276616c7565223a2022222f3e203c73746f70206f66667365743d223122207374796c653d2273746f702d636f6c6f723a23222f3e203c73746f70206f66667365743d22302e3822207374796c653d2273746f702d636f6c6f723a234d2d33392c313031336c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3235302d32332d3431362d35632d37372c382d3134382c32392d3332342d3232532d36312c3537342d36312c363134204c2d33392c313031337a4d3137372c393033203231342c383634203138362c383838203137372c383732203138312c383932203136372c393034203136302c383839203136382c383830203135382c383835203134302c383432203135322c383738203133342c383734203135342c383834203136342c393135203137312c393135203137352c393035203139302c3930334d3130322c3932346334322c302c37392d31332c39362d3332206c2d312d31306c2d31392d366c2d392c346c2d362d366c2d32302d31316c2d31312c336c2d312c33376c2d382c356c2d362d32206c2d382c326c2d352c3137433130302c3932342c3130312c3932342c3130322c3932347a22207d2c207b202274726169745f74797065223a202250616c65747465222c202276616c7565223a20224d3137332c3932346c2d322d396c2d382d346c2d352d39206c2d302c31316c2d372c336c2d302c336c2d31362c31336c322c336c362d306c31302d306c322d326c332c316c372d31206c312d326c342d316c31302c334c3137332c3932347a22207d2c207b202274726169745f74797065223a2022466172204f626a656374222c202276616c7565223a20222220643d224d3636382c34323363302c302c3331332d302c3330332d323820632d31302d32382d3339372d34382c31352d3436633330312c322c3139362c34362c3436302c343320633235382d332c3438342d36302c3438352d313763312c34332d3239302c32342d3239302c3530733238382c392c3437382c313220633138392c332c3334312d38332c3533352d3236633139342c35362c3332322c33322c3531372c3520633139342d32372c3134302c302c3432372c30633238372c302c313138302c302c313138302c30762d3331483336303763302c302d3133372d31312d3238332d313020632d3134362c302d3136322c33332d3339342d37632d3233322d34312d3331322d34332d3432302d323420632d3130372c31382d3235352c36382d3339352c3734732d3339372c31382d3339382c37632d312d31302c3434372d32362c3434362d363520632d312d33382d3137362d34322d3339312d3235632d3231352c31362d3339352d31342d3536382d313920632d3137322d342d3632362d382d3632372c3235733332332c32352c3332322c3530632d302c392d3539332c332d3539332c33482d33367632372068343738433434322c3432312c3535332c3432332c3636382c3432337a222f3e203c70617468206f7061636974793d22302e3131222066696c6c3d22234d3239362c36333420632d3130342d31342d3333352c37322d3432382c37336c33332c33303668323936633135302d34392c3332302d3131332c3332302d3134372063302d36302d3235392d39322d3237352d313538433232392c3635312c3238332c3633362c3239362c3633347a5b7b202274726169745f74797065223a20224d61696e222c202276616c7565223a20224d3339302e3431372c3733312e343839632d31392e3438342d37332e3539312c37322e342d39352e37322c37312e34322d39352e383534632d39392e3337362d31322e3031372d3233342e3339352c33342e3434362d3332312e3632312c33372e363832632d35342e3236332c322e30312d3134382e3038332d32312e3935372d3232352e3238372d34312e34323963352e37332c39382e3433332c35382e3535382c3430352e3535372c3439352e3532312c3339322e3131316339362e3733332d322e3937372c3135302e322c322e3834312c3137332e3136362c31342e323735633131302e3038362d34302e3335312c3139322e3032312d37382e3935392c3139322e3032312d3130342e343934433737352e3633372c3835352e3937342c3431322e3730352c3831352e3633352c3339302e3431372c3733312e3438397a4d2d34372e3338342c3732392e3538376c31362e352c3333342e34383248313038322e30366c2d372e3439392d3430302e343863302c302d3134332e3939342c34362e3530392d3239332e3938362c34382e303039632d3133382e3237382c312e3338332d3236392e3938352d37332e3530372d3431302e3937392d3130322e303035532d34372e3338342c3732392e3538372d34372e3338342c3732392e3538374d313038392c313031356c2d313135372c356c31392d34373863302c302c34322d31352c3131392d3232206337372d362c3137332d382c3235352c306338322c392c3135392c31322c3232352c3132733138382d31342c3333382d313420733136352c33332c3136352c33334c313038392c313031357a4d313134332e3535372c3737312e353936433834322e3736362c3737342e3433342c3539302e3239342c3939342e36392c3536332e3837312c313031382e35483238312e323737633231392e3431342d32372e3639322c3236392e3238392d3133342e3736322c3237302e37312d3230302e31313663312e352d36382e3939362d3138312e3439312d37362e3439362d3239352e3438342d3131362e393934632d3130372e3036332d33382e3033352c35372e3039362d38392e332c37372e3435352d39352e333935433138362e3832392c3630332e3537312d34372e3338342c3732392e3538372d34372e3338342c3732392e3538376c31342e3330372c3332312e3931336c313137362e3633342c32372e353843313134332e3535372c313037392e30382c313436312e3534312c3736382e3539362c313134332e3535372c3737312e3539367a4d3139362c3930396c2d32372d36306c322d336c2d322d32206c322d316c2d372d336c302c366c2d31342c31366c312c31316c302d396c31332d31316c322c306c322c35206c2d322c34346c332d376c302c336c322d33306c302c3163302c372c322c32312c322c32312063302d302c302d392c302d31346c31332c33344c3139362c3930397a4d3738392e3635312c3631322e363635632d37352e3230352d31332e3232392d3138302e3034352c32392e3138392d3234372e3231352c33322e303738632d36372e3136382c322e3839322d3231342e3930322d35352e3539362d3235342e3938312d35372e3032632d38302e3630392d322e3836312d3230352e3836322c39342e34392d3239322e3637322c3130302e323133632d31352e3235352c312e3030372d33302e3632352d302e3230342d34362e3139312d322e393831763336342e3432356c313039312e3434342d382e333238563638372e363839433936342e3036362c3637382e3832372c3838332e3835352c3632392e32342c3738392e3635312c3631322e3636357a4d3136342c393237203135392c393237203135352c393239203135352c393331203134312c393331203134302c393330203135302c393232203133392c393239203133382c393239203133332c393333203133372c393332203133342c393335203135352c393331203135352c393332203135382c393334203136332c393332203136362c3933304142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d313134322c313031366c2d313138312c343063302c302d36362d3535342d392d35333020633138312c37372c3239392c32362c3436342c33336337372c332c3230372c34352c3338322c313420633138302d33322c3332372c31342c3333302c32324c313134322c313031367a2220643d224d3636382c34303463302c302c3332322c31322c3331322d313520632d31302d32382d3830342d35362c382d3632633330312d322c3233392c33372c3530332c333420633235382d332c3536352d34322c3536392c3163322c32392d3338312c33322d3431372c363120632d32332c31382c3237332c31322c3437302c37633138392d352c3531332d39342c3731342d353220633231322c34342c3138342c34362c3337392c3138633139342d32372c3138382c312c3437352c31633238372c302c313039362c302c313039362c3020762d323063302c302d313130322c302d313137352c30732d3133372d31332d3238342d3133632d3134362c302d3136312c32352d3339332d313620632d3233322d34312d3331352d33312d3432322d3132632d3130372c31382d3235302c36382d3338392c3734732d3433322c32342d3433322c31332063302d31332c3435382d32352c3437332d37316331322d33372d3137322d35342d3338372d333820632d3231352c31362d3339352d31342d3536382d3139632d3137322d342d3632302c372d3632312c343120632d312c33342c3331392c33322c3332312c353163302c392d3539382d31322d3539382d3132482d33367632376834373820433434322c3430332c3535332c3430342c3636382c3430347a222f3e203c616e696d6174654d6f74696f6e20706174683d224d20302030204c202d33373530203430205a22206475723d22323530732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f673e203c70617468206f7061636974793d22302e3235222066696c6c3d22234d3137362c38373363302c302d39322c32352d38392c33382063332c31332c34332c312c35362d38433135372c3839352c3137362c3837332c3137362c3837337a4d3331322e3235362c3631392e323234632d322e3138362d31382e3438362d31302e3434382d32372e3539322d32312e3032372d33312e3235632d312e3238362d302e3131392d322e3534332d302e3230332d332e3737332d302e323436632d38302e3631312d322e3836332d3230352e3836322c39342e3438392d3239322e3637312c3130302e323131632d31352e3235352c312e3030372d33302e3632372d302e3230342d34362e3139332d322e393831763336392e3437394838332e323932433238332e3837312c3838362e3837312c3331382e3236322c3637302e30362c3331322e3235362c3631392e3232347a4d2d36382c313038326c313135372c366c2d31392d35373763302c302d33392d362d3131372d3620732d3130322c382d3138352c3136732d3131382c382d3138332c38732d3138312d32312d3333312d3231732d3238362c34322d3238362c3432204c2d36382c313038327a4d3433312e3734312c3533372e373234203337312e38352c3436372e303936203332312e3538322c3531372e333634203235342e3835392c3434322e333631203136302e31312c3533372e3130394d3138382c3930306c2d31342d32316c2d342c312063302c302c372c31392c372c3230632d302c302d362c312d362c316c2d31382d366c2d322d31376c2d332c31336c2d382d3231206c2d332c326c302c31336c2d34332c31326c2d362c396c2d34332c366c2d362c366c36372c316c392d3020433134322c3932322c3137302c3931332c3138382c3930307a4d2d33392c313031366c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3231312d34302d3337372d3232632d37372c382d3230332c33372d3338302c323520632d3138322d31322d3332372c31342d3333302c32324c2d33392c313031367a4d3234342c353537203233382c343838203234382c343838203233382c343133203239382c333938203239362c333839203432342c343037203430312c343834203339312c343837203338332c3535354d3132382c38393763342c312c382c362c31352c372063382d352c31352d31312c32302d313763302d322c312d352c312d3663302d302c302d302c302d302063302d302c302d302c302d3063322d332c352d342c372d3363302d302c302d312c312d3120632d322d322d382d312d31322c34632d332c352d362c362d362c36632d322c302d332c302d342c3020632d302d302d302d302d302d30632d302d322d332d342d362d346c2d302d326c2d332c316c302c3220632d322c312d332c342d322c3763302c302c302c302c302c30632d342c312d31312c322d31362c3220632d382d302d382c362d382c366c392d32433132352c3839362c3132372c3839362c3132382c3839377a3c7376672076657273696f6e3d22312e31222069643d224c617965725f322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2220783d223070782220793d22307078222077696474683d2231303030707822206865696768743d22313030307078222076696577426f783d22302030203130303020313030302220656e61626c652d6261636b67726f756e643d226e657720302030203130303020313030302220786d6c3a73706163653d227072657365727665223e203c6c696e6561724772616469656e742069643d226d61696e4772616469656e7422206772616469656e74556e6974733d227573657253706163654f6e557365222078313d222d3136322e33393932222079313d223131382e30393934222078323d222d3136322e33393933222079323d22313131372e3931303422206772616469656e745472616e73666f726d3d226d6174726978283120302030202d31203636322e3339393920313131382e3039393129223e203c73746f70206f66667365743d22302e363422207374796c653d2273746f702d636f6c6f723a234d3230392c35313163302d302c33362d382c33362d38207331302d312c31312d317331372d31352c31372d313673302d362c302d366c31392d30762d3668396c312d366834762d312068363776326835763463302c302c31312d312c31312c3073302c382c302c3868323076366c31382c3138683776313076373048323039204c3230392c3531317a4d3733302e3639362c3639352e353231632d31342e36362d36342e3233342c35342e3437392d38332e3534392c35332e3733382d38332e363638632d37342e3737332d31302e3438362d3137362e3336352c33302e3036382d3234312e3939382c33322e383931632d36352e31382c322e3830362d3230362e3231392d35322e3138342d3235312e3133392d35362e3733396331302e3534372c332e3637342c31382e3737372c31322e3737362c32302e3935392c33312e32323363352e3731312c34382e3334322d32352e3131342c3234362e3736382d3230302e3633322c3431302e3231356c3537322e3034382c362e39393268302e323436633135372e3735342d35352e3330332c3333362e3633312d3132362e3337372c3333362e3633312d3136342e33343243313032302e3534392c3830342e3137372c3734372e3436372c3736382e3936382c3733302e3639362c3639352e3532317a4d3133352c393037203136342c393133203136342c393135203137312c393135203134352c393239203131322c393332203134352c393235203136302c393136203135312c393132203134352c393134203134372c3931314d313233312e3034392c3631342e373738632d3130362e312d332e3130392d3237302e3936332c3130322e3730342d3338352e3232332c3130382e393235632d3131342e3235382c362e3232392d3233332e3431382d36352e3335342d3337372e30362d38372e313339632d39392e3934382d31352e3135382d3233392e3238312c33332e34342d3332382e3535322c33362e373531632d38392e3236392c332e3331332d3238352e3630392d36332e3639362d3333382e3837372d36352e333236632d3130372e3133322d332e3237372d31342e38392c3533342e3639382d31342e38392c3533342e3639386c313132302e3030312d32302e363232433930362e3434392c313132322e3036342c313333372e3134372c3631372e3838392c313233312e3034392c3631342e3737387a4d313134302c313031336c2d313138312c343063302c302d33372d3530372c32332d343936633138392c33342c3331352d342c3438322c3133206337372c382c3230352c35312c3339312d3231633137302d36362c3237302c36312c3237332c36394c313134302c313031337a4d3138392c393035203130302c3932312039362c393434203130372c393235203139362c39303922207d2c207b202274726169745f74797065223a202253756e222c202276616c7565223a20224d3536392c37303220632d38312c342d3136372d35312d3237302d3638632d39302d31342d3238322c35312d3339312c36386c2d362c3330316c302c386837353020433834312c3837312c3837342c3638372c3836382c363434632d322d31352d392d32332d31392d3236632d312d302d322d302d332d3020433736392c3631352c3635312c3639382c3536392c3730327aa26469706673582212203f330052506af68832c77f5e07df0efbf225ff3cf26fc62dd9c5d62fd828f77264736f6c63430008070033
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.