Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,015 VITALIK
Holders
525
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 VITALIKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ButerinCards
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: MIT /// @title JPEG Mining /// @author Xatarrer /// @notice Unaudited pragma solidity ^0.8.0; import "./Array.sol"; import "./ButerinCardsLib.sol"; import "./ButerinCardsBackA.sol"; import "./ButerinCardsBackB.sol"; import "./ERC721Enumerable.sol"; import "./SSTORE2.sol"; import "./Ownable.sol"; import "./LibString.sol"; import "./MerkleProof.sol"; contract ButerinCards is ERC721Enumerable, Ownable { event Mined( address indexed minerAddress, uint256 indexed uploadedKB, uint256 indexed tokenId, uint8 phaseId, uint16 tokenIdWithinPhase, uint8 quoteId, uint8 bgDirectionId, uint8 bgPaletteId, uint16 lastTokenIdInScan, uint32 Nbytes, uint8 Nicons, uint32 seed ); // State variables mapping(address => uint256) public Nmined; // Number of cards mined by an address uint256[] public chunks; // Array of tightly pack card data and metadata string public baseURLAnimation = "https://yellow-immense-spider-81.mypinata.cloud/ipfs/Qmczf1nd4uHzLxWRZ68pc2PWXBPKcRkoc39ZgQkB8X5bgy/index.html"; // Constants string private constant _NAME = "Buterin Cards"; string private constant _SYMBOL = "VITALIK"; bytes32 private immutable _ROOT; uint256 public immutable TOKEN_ID_FIRST_BLUE_CHROMINANCE; // TokenId of first blue chrominance chunk uint256 public immutable TOKEN_ID_FIRST_RED_CHROMINANCE; // TokenId of first red chrominance chunk uint256 public immutable N_EMPTY_BLUE_COLOR_CHUNKS; uint256 public immutable N_EMPTY_RED_COLOR_CHUNKS; address public immutable JPEG_HEADER_POINTER; // Pointer to JPEG header constructor( bytes32 root, string memory jpegHeader, uint256 tokenIdFirstBlueChrominance, uint256 tokenIdFirstRedChrominance, uint256 NemptyBlueColorChunks, uint256 NemptyRedColorChunks ) ERC721(_NAME, _SYMBOL) { _ROOT = root; JPEG_HEADER_POINTER = SSTORE2.write(bytes(jpegHeader)); TOKEN_ID_FIRST_BLUE_CHROMINANCE = tokenIdFirstBlueChrominance; TOKEN_ID_FIRST_RED_CHROMINANCE = tokenIdFirstRedChrominance; N_EMPTY_BLUE_COLOR_CHUNKS = NemptyBlueColorChunks; N_EMPTY_RED_COLOR_CHUNKS = NemptyRedColorChunks; } function setBaseURLAnimation(string calldata newBaseURLAnimation) external onlyOwner { baseURLAnimation = newBaseURLAnimation; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Token does not exist"); // Retrieve chunk data ButerinCardsLib.ChunkUnpacked memory chunk = unpackChunk(tokenId); string memory cardIdStr = LibString.toString(tokenId + 1); string memory NiconsStr = LibString.toString(chunk.Nicons); string memory NkilobytesStr = LibString.toString(chunk.Nbytes / 1024); bytes[] memory bytesSegments = new bytes[](43); bytesSegments[0] = bytes("data:application/json;charset=UTF-8,%7B%22name%22%3A%22Buterin%20Card%20%23"); bytesSegments[1] = bytes(cardIdStr); bytesSegments[2] = bytes( "%22%2C%22description%22%3A%22Introducing%20the%20Buterin%20Cards%2C%20a%20unique%20on-chain%20collection%20of%202%2C015%20cards%20celebrating%20Ethereum's%20co-founder%2C%20Vitalik%20Buterin.%20Inspired%20by%20the%20iconic%20Nakamoto%20Cards%20on%20Bitcoin%2C%20the%20Buterin%20Cards%20aim%20to%20pay%20tribute%20to%20Vitalik's%20immense%20contributions%20to%20blockchain%20technology.%20%20%5Cn%5CnPermanently%20stored%20on%20the%20Ethereum%20blockchain%2C%20these%20cards%20are%20the%20result%20of%20a%20collaborative%20effort%20by%20JPEG%20miners%20who%20work%20together%20to%20upload%20each%20card's%20data%20on-chain.%20The%20face%20side%20of%20each%20card%20features%20an%20HTML%20and%20SVG-coded%20frame%20surrounding%20a%20JPEG%20image%20of%20Vitalik%20Buterin%2C%20designed%20by%20Xatarrer.%20At%20over%2010%20MB%2C%20this%20image%20holds%20the%20record%20for%20the%20largest%20stored%20JPEG%20on-chain%20at%20the%20time%20of%20minting.%20%20%5Cn%5CnAdding%20to%20the%20uniqueness%20of%20the%20cards%2C%20the%20face%20side%20background%2C%20designed%20by%20Pawe%C5%82%20Dudko%2C%20showcases%20mesmerizing%2C%20dynamically%20moving%20rays%20of%20color.%20As%20a%20fusion%20of%20profile%20picture%20(pfp)%20NFTs%20and%20generative%20art%2C%20the%20Buterin%20Cards%20possess%20randomly-selected%20attributes%20during%20minting%2C%20such%20as%20one%20of%2045%20possible%20quotes%20from%20Vitalik.%20%20%5Cn%5CnThe%20Buterin%20Cards%20are%20the%20second%20collection%20to%20utilize%20a%20technique%20called%20JPEG%20Mining.%20In%20this%20process%2C%20the%20miners%20are%20responsible%20for%20uploading%20the%20NFT%20components%2C%20including%20the%20HTML%2C%20SVG%2C%20and%20Vitalik%20JPEG.%20Using%20Progressive%20JPEG%20technology%2C%20the%20image%20is%20revealed%20as%20it%20is%20mined%2C%20and%20miners%20are%20rewarded%20with%20a%20Buterin%20Card%20for%20their%20efforts.%20%20%5Cn%5CnThe%20JPEG%20mining%20process%20of%20the%20Buterin%20Cards%20consists%20of%20six%20phases%3A%20%20%5Cn%5Cu270F%5CuFE0F%20Pencil%20Drawing%3A%20Miners%20upload%20the%20HTML%20and%20SVG%2C%20receiving%20a%20card%20with%20a%20hand-drawn%20vectorized%20SVG%20version%20of%20the%20JPEG%2C%20as%20no%20JPEG%20data%20is%20available%20yet.%20%20%5Cn%5CuD83D%5CuDD33%20Black%20%26%20White%3A%20The%20intensity%20component%20of%20the%20progressive%20JPEG%20is%20uploaded%2C%20rendering%20the%20image%20in%20pure%20black%20and%20white.%20%20%5Cn%5CuD83C%5CuDF2B%5CuFE0F%20Grey%20Shades%3A%20Additional%20bits%20for%20the%20intensity%20component%20reveal%20a%20range%20of%20grey%20tones.%20%20%5Cn%5CuD83D%5CuDFE6%20Blue%20Chroma%3A%20The%20blue%20chroma%20is%20uploaded%2C%20introducing%20blue%20and%20green%20hues%20to%20the%20JPEG.%20%20%5Cn%5CuD83D%5CuDFE5%20Red%20Chroma%3A%20The%20red%20chroma%20is%20added%2C%20infusing%20red%20and%20pink%20shades%20into%20the%20image.%20%20%5Cn%5CuD83C%5CuDF04%20In%20the%20final%20phase%2C%20the%20AC%20components%20are%20uploaded%2C%20enhancing%20the%20image%20resolution.%22%2C%22attributes%22%3A%5B%7B%22trait_type%22%3A%22Quote%20Title%22%2C%22value%22%3A%22" ); bytesSegments[3] = bytes(ButerinCardsLib.quoteName(chunk.quoteId)); bytesSegments[4] = bytes("%22%7D%2C%7B%22trait_type%22%3A%22Phase%22%2C%22value%22%3A%22"); bytesSegments[5] = bytes(ButerinCardsLib.phaseName(chunk.phaseId)); bytesSegments[6] = bytes("%22%7D%2C%7B%22trait_type%22%3A%22Background%20Direction%22%2C%22value%22%3A%22"); bytesSegments[7] = bytes(ButerinCardsLib.bgDirection(chunk.bgDirectionId)); bytesSegments[8] = bytes("%22%7D%2C%7B%22trait_type%22%3A%22Background%20Palette%22%2C%22value%22%3A%22"); bytesSegments[9] = bytes(ButerinCardsLib.bgPalette(chunk.bgPaletteId)); bytesSegments[10] = bytes( "%22%7D%2C%7B%22display_type%22%3A%22boost_number%22%2C%22trait_type%22%3A%22Number%20of%20Icons%22%2C%22value%22%3A" ); bytesSegments[11] = bytes(NiconsStr); bytesSegments[12] = bytes("%7D%2C%7B%22trait_type%22%3A%22Uploaded%20%5BKB%5D%22%2C%22value%22%3A"); bytesSegments[13] = bytes(NkilobytesStr); bytesSegments[14] = bytes("%7D%5D%2C%22animation_url%22%3A%22"); bytesSegments[15] = bytes(baseURLAnimation); bytesSegments[16] = bytes("?cardId="); bytesSegments[17] = bytes(cardIdStr); bytesSegments[18] = bytes("&phaseId="); bytesSegments[19] = bytes(LibString.toString(chunk.phaseId)); bytesSegments[20] = bytes("&tokenIdWithinPhase="); bytesSegments[21] = bytes(LibString.toString(chunk.tokenIdWithinPhase)); bytesSegments[22] = bytes("&kiloBytes="); bytesSegments[23] = bytes(NkilobytesStr); bytesSegments[24] = bytes(""eId="); bytesSegments[25] = bytes(LibString.toString(chunk.quoteId)); bytesSegments[26] = bytes("&bgDirection="); bytesSegments[27] = bytes(LibString.toString(chunk.bgDirectionId)); bytesSegments[28] = bytes("&bgPalette="); bytesSegments[29] = bytes(LibString.toString(chunk.bgPaletteId)); bytesSegments[30] = bytes("&seed="); bytesSegments[31] = bytes(LibString.toString(chunk.seed)); bytesSegments[32] = bytes("&Nicons="); bytesSegments[33] = bytes(NiconsStr); bytesSegments[34] = bytes("%22%2C%22image%22%3A%22"); bytesSegments[35] = bytes(ButerinCardsBackA.cardBackPiece0()); bytesSegments[36] = bytes(ButerinCardsBackA.cardBackPiece1(chunk.Nicons)); bytesSegments[37] = bytes(ButerinCardsBackB.cardBackPiece2()); bytesSegments[38] = bytes(chunk.quoteId < 8 ? ".2" : "0"); bytesSegments[39] = bytes(ButerinCardsBackB.cardBackPiece3()); bytesSegments[40] = bytes(ButerinCardsLib.cardBackPiece4()); bytesSegments[41] = bytes(ButerinCardsLib.cardBackPiece5(chunk.phaseId)); bytesSegments[42] = bytes("%22%7D"); return string(Array.join(bytesSegments)); } function onchainAnimation(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), "Token does not exist"); // Retrieve chunk data ButerinCardsLib.ChunkUnpacked memory chunk = unpackChunk(tokenId); // Communicates to the miner that its card is not fully uploaded just yet if (chunk.lastTokenIdInScan >= totalSupply()) ButerinCardsLib.cardNotAvailable(chunk.lastTokenIdInScan); uint256 NHTMLChunks = unpackChunk(0).lastTokenIdInScan + 1; uint256 NJPEGChunks; /** Let's fuse all the parts together: If phaseId == 0, then 1. _HTML_BEGINNING 2. User parameters separated by commas 3...M+1. HTML scans If phaseId > 0, then 1. _HTML_BEGINNING 2. User parameters separated by commas 3. JPEG header 4...(N+2). JPEG scans N+4. JPEG footer N+5...N+M+4. HTML scans Know that N + M = tokenId +1 */ // Create big array of bytes and copy necessary segments bytes[] memory bytesSegments = new bytes[]( chunk.phaseId == 0 ? chunk.lastTokenIdInScan + 3 : chunk.phaseId == 1 || chunk.phaseId == 2 ? chunk.lastTokenIdInScan + 5 : chunk.phaseId == 3 // Ads red empty chroma NOT blue empty chroma NOR red chroma ? chunk.lastTokenIdInScan + 5 - N_EMPTY_BLUE_COLOR_CHUNKS : chunk.phaseId == 4 // Add empty blue chroma NOT red empty chroma NOR blue chroma ? chunk.lastTokenIdInScan + 5 + TOKEN_ID_FIRST_BLUE_CHROMINANCE - TOKEN_ID_FIRST_RED_CHROMINANCE - N_EMPTY_RED_COLOR_CHUNKS : chunk.lastTokenIdInScan + 5 - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS ); bytesSegments[0] = htmlHeader(); uint256 ind; if (chunk.phaseId > 0) { // JPEG header bytesSegments[2] = SSTORE2.read(JPEG_HEADER_POINTER); // Number JPEG chunks (includes all chromas (including empty) regardless) NJPEGChunks = chunk.lastTokenIdInScan + 1 - NHTMLChunks; bytes memory tempChunk; // Add JPEG chunks for ( uint i = NHTMLChunks + N_EMPTY_BLUE_COLOR_CHUNKS + N_EMPTY_RED_COLOR_CHUNKS; i < NHTMLChunks + NJPEGChunks; i++ ) { if (chunk.phaseId != 4 || i < TOKEN_ID_FIRST_BLUE_CHROMINANCE) { tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i - NHTMLChunks - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + 3; bytesSegments[ind] = tempChunk; } else if (i >= TOKEN_ID_FIRST_RED_CHROMINANCE) { // We skip blue chroma in phase 4 tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i - NHTMLChunks - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + TOKEN_ID_FIRST_BLUE_CHROMINANCE - TOKEN_ID_FIRST_RED_CHROMINANCE + 3; bytesSegments[ind] = tempChunk; } } // Add empty blue color chunks if necessary for (uint256 i = NHTMLChunks; i < NHTMLChunks + N_EMPTY_BLUE_COLOR_CHUNKS; i++) { if (chunk.phaseId == 1 || chunk.phaseId == 2) { // B&W, Grey Tones and Red Chroma phases need empty blue chroma tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i + NJPEGChunks - NHTMLChunks - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + 3; bytesSegments[ind] = tempChunk; } else if (chunk.phaseId == 4) { // Red Chroma phase needs empty blue chroma tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i + NJPEGChunks - NHTMLChunks - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + TOKEN_ID_FIRST_BLUE_CHROMINANCE - TOKEN_ID_FIRST_RED_CHROMINANCE + 3; bytesSegments[ind] = tempChunk; } } // Add empty red color chunks if necessary for ( uint i = NHTMLChunks + N_EMPTY_BLUE_COLOR_CHUNKS; i < NHTMLChunks + N_EMPTY_BLUE_COLOR_CHUNKS + N_EMPTY_RED_COLOR_CHUNKS; i++ ) { if (chunk.phaseId == 1 || chunk.phaseId == 2) { // B&W and Grey Tones phases need empty red chroma tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i + NJPEGChunks - NHTMLChunks - N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + 3; bytesSegments[ind] = tempChunk; } else if (chunk.phaseId == 3) { // Blue Chroma phase needs empty red chroma tempChunk = SSTORE2.read(unpackChunk(i).dataPointer); ind = i + NJPEGChunks - NHTMLChunks - 2 * N_EMPTY_BLUE_COLOR_CHUNKS - N_EMPTY_RED_COLOR_CHUNKS + 3; bytesSegments[ind] = tempChunk; } } // JPEG footer bytesSegments[ind + 1] = jpegFooter(); // Correct number JPEG chunks (exclude empty chroma and blue chroma if necessary) if (chunk.phaseId == 3 || chunk.phaseId == 5) NJPEGChunks -= N_EMPTY_BLUE_COLOR_CHUNKS; if (chunk.phaseId >= 4) NJPEGChunks -= N_EMPTY_RED_COLOR_CHUNKS; if (chunk.phaseId == 4) NJPEGChunks -= TOKEN_ID_FIRST_RED_CHROMINANCE - TOKEN_ID_FIRST_BLUE_CHROMINANCE; } // HTML chunks for (uint256 i = 0; i < NHTMLChunks; i++) { ind = i + NJPEGChunks + (chunk.phaseId > 0 ? 4 : 2); bytesSegments[ind] = SSTORE2.read(unpackChunk(i).dataPointer); } // HTML parameters bytesSegments[1] = ButerinCardsLib.paramsHTML(tokenId, chunk); return string(Array.join(bytesSegments)); } function unpackChunk(uint tokenId) public view returns (ButerinCardsLib.ChunkUnpacked memory) { uint chunk = chunks[tokenId]; return ButerinCardsLib.ChunkUnpacked({ dataPointer: address(uint160(chunk)), // 20 bytes phaseId: uint8((chunk >> 160) & 0x7), // 3 bits tokenIdWithinPhase: uint16((chunk >> 163) & 0x7FF), // 11 bits lastTokenIdInScan: uint16((chunk >> 174) & 0x7FF), // 11 bits quoteId: uint8((chunk >> 185) & 0x3F), // 6 bits bgDirectionId: uint8((chunk >> 191) & 0x3), // 2 bits bgPaletteId: uint8((chunk >> 193) & 0xF), // 4 bits Nicons: uint8((chunk >> 197) & 0x3), // 2 bits Nbytes: uint32((chunk >> 199) & 0x1FFFFFF), // 25 bits seed: uint32((chunk >> 224) & 0xFFFFFFFF) // 32 bits }); } function _packChunk(ButerinCardsLib.ChunkUnpacked memory chunk) private pure returns (uint) { return uint(uint160(chunk.dataPointer)) | (uint(chunk.phaseId) << 160) | (uint(chunk.tokenIdWithinPhase) << 163) | (uint(chunk.lastTokenIdInScan) << 174) | (uint(chunk.quoteId) << 185) | (uint(chunk.bgDirectionId) << 191) | (uint(chunk.bgPaletteId) << 193) | (uint(chunk.Nicons) << 197) | (uint(chunk.Nbytes) << 199) | (uint(chunk.seed) << 224); } function _rndParams(ButerinCardsLib.ChunkUnpacked memory chunk, uint256 tokenId_) private view { uint256 rndUniform = uint256( keccak256( abi.encodePacked(block.number, block.timestamp, block.basefee, block.coinbase, msg.sender, tokenId_) ) ); chunk.seed = uint32(rndUniform); // Uniform distribution between 0 and 2**32-1 uint temp = rndUniform >> 32; chunk.bgDirectionId = temp & 0x3 > 1 ? 2 : temp & 0x1 == 1 ? 1 : 0; // Diagonal (2) has 0.5 probability, vertical(1) and horizontal(0) have 0.25 probability temp = (rndUniform >> 34) & 0xFFFF; // Use 16 bits to approximate custom distribution between 1 and 10 if (temp < 0x30A4) chunk.bgPaletteId = 1; else if (temp < 0x5C29) chunk.bgPaletteId = 2; else if (temp < 0x8290) chunk.bgPaletteId = 3; else if (temp < 0xA3D8) chunk.bgPaletteId = 4; else if (temp < 0xC000) chunk.bgPaletteId = 5; else if (temp < 0xD70B) chunk.bgPaletteId = 6; else if (temp < 0xE8F6) chunk.bgPaletteId = 7; else if (temp < 0xF5C3) chunk.bgPaletteId = 8; else if (temp < 0xFD71) chunk.bgPaletteId = 9; else chunk.bgPaletteId = 10; temp = (rndUniform >> 240) & 0xFFFF; // Use 16 bits to approximate custom distribution between 0 and 44 if (temp < 0x02ba) chunk.quoteId = 0; else if (temp < 0x0597) chunk.quoteId = 1; else if (temp < 0x0897) chunk.quoteId = 2; else if (temp < 0x0bb9) chunk.quoteId = 3; else if (temp < 0x0efd) chunk.quoteId = 4; else if (temp < 0x1264) chunk.quoteId = 5; else if (temp < 0x15ed) chunk.quoteId = 6; else if (temp < 0x1999) chunk.quoteId = 7; else if (temp < 0x1d67) chunk.quoteId = 8; else if (temp < 0x2158) chunk.quoteId = 9; else if (temp < 0x256b) chunk.quoteId = 10; else if (temp < 0x29a0) chunk.quoteId = 11; else if (temp < 0x2df8) chunk.quoteId = 12; else if (temp < 0x3273) chunk.quoteId = 13; else if (temp < 0x3710) chunk.quoteId = 14; else if (temp < 0x3bcf) chunk.quoteId = 15; else if (temp < 0x40b1) chunk.quoteId = 16; else if (temp < 0x45b5) chunk.quoteId = 17; else if (temp < 0x4adb) chunk.quoteId = 18; else if (temp < 0x5024) chunk.quoteId = 19; else if (temp < 0x5590) chunk.quoteId = 20; else if (temp < 0x5b1e) chunk.quoteId = 21; else if (temp < 0x60ce) chunk.quoteId = 22; else if (temp < 0x66a1) chunk.quoteId = 23; else if (temp < 0x6c96) chunk.quoteId = 24; else if (temp < 0x72ae) chunk.quoteId = 25; else if (temp < 0x78e8) chunk.quoteId = 26; else if (temp < 0x7f45) chunk.quoteId = 27; else if (temp < 0x85c4) chunk.quoteId = 28; else if (temp < 0x8c65) chunk.quoteId = 29; else if (temp < 0x9329) chunk.quoteId = 30; else if (temp < 0x9a0f) chunk.quoteId = 31; else if (temp < 0xa118) chunk.quoteId = 32; else if (temp < 0xa843) chunk.quoteId = 33; else if (temp < 0xaf91) chunk.quoteId = 34; else if (temp < 0xb701) chunk.quoteId = 35; else if (temp < 0xbe93) chunk.quoteId = 36; else if (temp < 0xc648) chunk.quoteId = 37; else if (temp < 0xce20) chunk.quoteId = 38; else if (temp < 0xd61a) chunk.quoteId = 39; else if (temp < 0xde36) chunk.quoteId = 40; else if (temp < 0xe675) chunk.quoteId = 41; else if (temp < 0xeed6) chunk.quoteId = 42; else if (temp < 0xf759) chunk.quoteId = 43; else chunk.quoteId = 44; } /// @param dataChunk will be a piece of HTML in UTF-8 or a piece of JPEG in base64 function mine( string calldata dataChunk, uint8 phaseId, uint16 tokenIdWithinPhase, uint16 lastTokenIdInScan, bytes32[] calldata proof ) external { // Get the next tokenIdx uint256 tokenId = totalSupply(); // Check hash matches _verifyDataChunk(dataChunk, tokenId, phaseId, tokenIdWithinPhase, lastTokenIdInScan, proof); // Generate random color, quote and seed ButerinCardsLib.ChunkUnpacked memory chunk; _rndParams(chunk, tokenId); // Pass rest of data chunk.dataPointer = SSTORE2.write(bytes(dataChunk)); chunk.phaseId = phaseId; chunk.tokenIdWithinPhase = tokenIdWithinPhase; chunk.lastTokenIdInScan = lastTokenIdInScan; chunk.Nicons = uint8(Nmined[msg.sender] % 3); chunk.Nbytes = uint32(bytes(dataChunk).length); if (tokenId > 0) chunk.Nbytes += unpackChunk(tokenId - 1).Nbytes; // Pack and store chunk chunks.push(_packChunk(chunk)); // Mint card _mint(msg.sender, tokenId); // Increment counter of mined cards by sender Nmined[msg.sender]++; // Emit event emit Mined( msg.sender, bytes(dataChunk).length, tokenId, phaseId, tokenIdWithinPhase, chunk.quoteId, chunk.bgDirectionId, chunk.bgPaletteId, lastTokenIdInScan, chunk.Nbytes, chunk.Nicons, chunk.seed ); } function _verifyDataChunk( string calldata dataChunk, uint256 tokenId, uint8 phaseId, uint16 tokenIdWithinPhase, uint16 lastTokenIdInScan, bytes32[] calldata proof ) private view { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(dataChunk, tokenId, phaseId, tokenIdWithinPhase, lastTokenIdInScan))) ); require(MerkleProof.verifyCalldata(proof, _ROOT, leaf), "Invalid data"); } function htmlHeader() public pure returns (bytes memory) { return bytes( "data:text/html;charset=utf-8,%3C!DOCTYPE%20html%3E%0D%0A%3Chtml%3E%0D%0A%20%20%20%20%3Chead%3E%0D%0A%20%20%20%20%20%20%20%20%3Cscript%3E%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20%5B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cardId%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20phaseId%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tokenIdWithinPhase%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kiloBytes%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quoteId%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bgDirection%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bgPalette%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Nicons%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20seed%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20jpegB64%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%20%3D%20%5B" ); } function jpegFooter() public pure returns (bytes memory) { return bytes("/9k="); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT /* * @dev Modified from original Array.sol from Clement Walter <[email protected]> */ pragma solidity ^0.8.0; error EmptyArray(); error GlueOutOfBounds(uint256 length); library Array { function join(bytes[] memory a, bytes memory glue) private pure returns (bytes memory) { uint256 inputPointer; uint256 gluePointer; assembly { inputPointer := a gluePointer := glue } return _joinReferenceType(inputPointer, gluePointer); } function join(bytes[] memory a) internal pure returns (bytes memory) { return join(a, bytes("")); } function _joinReferenceType( uint256 inputPointer, uint256 gluePointer ) private pure returns (bytes memory tempBytes) { assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Skip the first 32 bytes where we will store the length of the result let memoryPointer := add(tempBytes, 0x20) // Load glue let glueLength := mload(gluePointer) if gt(glueLength, 0x20) { revert(gluePointer, 0x20) } let glue := mload(add(gluePointer, 0x20)) // Load the length (first 32 bytes) let inputLength := mload(inputPointer) let inputData := add(inputPointer, 0x20) let end := add(inputData, mul(inputLength, 0x20)) // Initialize the length of the final string let stringLength := 0 // Iterate over all strings (a string is itself an array). for { let pointer := inputData } lt(pointer, end) { pointer := add(pointer, 0x20) } { let currentStringArray := mload(pointer) let currentStringLength := mload(currentStringArray) stringLength := add(stringLength, currentStringLength) let currentStringBytesCount := add( div(currentStringLength, 0x20), gt(mod(currentStringLength, 0x20), 0) ) let currentPointer := add(currentStringArray, 0x20) for { let copiedBytesCount := 0 } lt(copiedBytesCount, currentStringBytesCount) { copiedBytesCount := add(copiedBytesCount, 1) } { mstore(add(memoryPointer, mul(copiedBytesCount, 0x20)), mload(currentPointer)) currentPointer := add(currentPointer, 0x20) } memoryPointer := add(memoryPointer, currentStringLength) mstore(memoryPointer, glue) memoryPointer := add(memoryPointer, glueLength) } mstore(tempBytes, add(stringLength, mul(sub(inputLength, 1), glueLength))) mstore(0x40, and(add(memoryPointer, 31), not(31))) } return tempBytes; } }
//SPDX-License-Identifier: MIT /// @title JPEG Mining /// @author Xatarrer /// @notice Unaudited pragma solidity ^0.8.0; library ButerinCardsBackA { function cardBackPiece0() external pure returns (string memory piece) { return "data%3Aimage%2Fsvg%2Bxml%2C%253Csvg%2520viewBox%253D%25220%25200%2520100%2520140%2522%2520shape-rendering%253D%2522geometricPrecision%2522%2520text-rendering%253D%2522geometricPrecision%2522%2520image-rendering%253D%2522optimizeQuality%2522%2520xmlns%253D%2522http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg%2522%2520style%253D%2522font-size%253A23%2525%2522%253E%253Cstyle%253E%2540font-face%257Bfont-family%253A%2526quot%253BOrbitron%2526quot%253B%253Bsrc%253Aurl(data%253Aapplication%252Ffont-woff%253Bcharset%253Dutf-8%253Bbase64%252Cd09GRgABAAAAAAmQABAAAAAADzAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABbAAAABwAAAAchNLgWUdERUYAAAGIAAAAHAAAAB4AJwAjR1BPUwAAAaQAAACuAAAA%252Bi6OJkdHU1VCAAACVAAAACwAAAAwuP%252B4%252Fk9TLzIAAAKAAAAATgAAAGBgRBFTY21hcAAAAtAAAACYAAABommEYxtjdnQgAAADaAAAAAQAAAAEACECeWdhc3AAAANsAAAACAAAAAgAAAAQZ2x5ZgAAA3QAAAJRAAADOFBj1JNoZWFkAAAFyAAAADUAAAA2DIm08mhoZWEAAAYAAAAAHQAAACQG4gJQaG10eAAABiAAAABaAAAAdC4RAhpsb2NhAAAGfAAAACMAAAA8EKwRtG1heHAAAAagAAAAHwAAACAAYgBgbmFtZQAABsAAAAJKAAAFZHYKuF9wb3N0AAAJDAAAAIEAAADiyViAhQAAAAEAAAAA2odvjwAAAADKAw0xAAAAAOBIY5h42mNgZGBg4AFiMSBmYmAEQhkgZgHzGAAE0gBLeNpNjqsOwkAURE9LH3T7SDVBESQCjUA1KCSahAQUpIKg%252BQq%252BgW8jhIQKFBXL7CrE3DuPu5MlAAxzloTNar2hOu0uLSMi%252BViLy%252F95cDycW4aOeUSEUoHH3V9mjJkwY0HDlj1Xbi63vS6N%252FZDbNwPpp1hPaR%252Buwb6kviQktiMlV1%252Bsf1ViNYWma%252BhcLp7Kc3kmboRSiJXUSqZyQ68LIZIT%252B3Yjt9AO1RTrBT%252Ff6iYLAAB42mNgZGBg4GLQYdBjYHJx8wlh4MtJLMljkGBgAYoz%252FP8PJBAsIAAAnsoHa3jaY2BhXMUUwcDKwMLUBaQZGLwhNGMcgxFjDAMSaGBgSBdgYHCC8f38%252FVwZDjAoqP5hVvhvwcDAfJWRDyjMCJJjcmG6AKQUGJgAMO8L%252FgAAeNpjYGBgZoBgGQZGBhCYA%252BQxgvksDA1gWgAowsOgwODMkMiQypDJkMdQxFDKsECBS0FfIV71z%252F%252F%252FQFUKDE5A2RSobAlQlgEm%252B%252F%252Fx%252F0P%252Fl%252F5f%252FH%252FB%252Fzn%252FZ%252F6f8T%252FvAf%252F91%252Ff33FKA2ogTMLIxwJUwMgEJJnQFEKfjByyseKWBdrBzAGlOEIcLiLkZeHgZaAD4yNIFABvXJVAAIQJ5AAEAAf%252F%252FAA942l2Sv2sUQRTH35szN2vm0Ft29yRIhM2SBEKIcpu73ZBcYTy1kQxiYyFYiMbeYo2VP0DFxkabQArrwyIHIl40ooJnFa5RLPwDrvEPELKD31lPCQ7s29m38z7zfd8ZEhQS8ZzYpBJJWthmOrnSlYfoZ327PPZjpVsSmNJ2yabHbLory7y%252F0mWbj93QnY3dKOTDw35fbOY3QnGZQFpGUGJAR%252BgELRBN%252B%252BUodMN6bZJ9WQumw3qzxYszUThVRqbm%252FfddUjrNX4v5VI%252FP5j3ekmrcMdekUpJ3bDRnER%252BlWgx0%252BnRiIpl%252FqORj%252BwPB7Cn53M4RCIMphZYytHhE8dRMw11sxmGAnQLXr2H2PtU6FefzvarvV0Vdp%252Fwx1Rte1dysehtEghYR7ok2VelYQWhx2LBaG%252BgncKfxDvxaL9H8rSJNi%252FvpGuIF80Lp5PsVR2U6MavZnXVHgQWCuA5LFR0%252FoKYRu9YSfBQWWGFbidYJX8yAWpIVgPuOApDTRO%252Fum0w5fAoJxwyABTdGuAuNHk0e4Fq%252FrTh0OdIM%252BJuCfBoq5yqSP5k5vgpOX1b%252B0Eei%252BdK65Y%252F6pw402%252FtBXgSxkRt3Mgzx5Pa%252Bwa5MTSx8UHhEceQWxkR%252Fu3mZ8ZdkLcOxfXaUaFs7uFfA2bI5R50q6v6dTAem8RnzwVG8m%252BjM6mBqIDwTv%252BjoqMM4iIMIVi1zsINFw2FFftWJuPUqM%252B%252FQAY1qxP3Cl1FNcebWaszKka2DCUtYvpZiy11zzgrjnllNtK3HEG3Ul4hw1UPRzt%252Fah%252Bg3ne%252BnnQAAAHjaY2BkYGBgYnDqZWV4Hc9v85VBnvkFUIThFDOvIYh%252B4JE8A0QzczMzASkOBhDJAAD%252F5Qe3AAAAeNpjYGRgYL767xOQdGAAAmZuBkYGVCALAFtpAzkAAAB42mPMYVBkAAJGXyDWYmBgdmCwZjZjsGDaxmDCNJtBnGkLgzHDbSB7B4MZEzuDCeMGBlOm7QymILWMjUD1TEg0yKADQNwAxQlAPAuItaA0UI7JhYEBAGFKDk4AAHjaY2Bg0ILCAoYJDNsYHjEKMCox2jGGMOYx9uGFcwBTyQ12AHjaY2BkYGCQZdBnYGYAASYgZmQAiTkw6IEEAAsKAMMAeNqdVF1rE1EQPbtZS4taKkiRImXJgyhoTOJXrU9VLBTSptqgb0KSxiS6m43ZTUv%252Bgw%252F%252BDvGH%252BPUHfPMn%252BOSzZyazZrNBCrLcvefOnXtm7pnZBXAZv1GA460ARDDsoPjX7mLVuWK4gC3nmmEPVeeV4XPYcD4YXkLR%252BWh4Gfed74ZXcNV1DZ%252FHobtp%252BAI23YHhi47vvje8iruFT4bXsFb4afgS8S%252FDn7HupTl%252FQdlbN%252FwVy96u4W9Y8g6m%252BEcBG14DTxBhiAlG6KOLHhL4qKKMCraIGrR0ONe536JHwjnCgJZDRW%252B429YzOxhz7tE2Qsz1deVKyB1jG7f5dPV8j34tlHgqQkhrohECjiY9xpwjvKY9ykW8gZtkPTUOH8%252FpGXOMcML3MS276ie5HJArpHWbuLiQe5HRF%252B9zRP%252BQlsdcB%252BQTfsknINeIipSoiajyiOx1jqdEeZZbCyxnx%252FFzkV7onWJ6TP1nkc%252BOllarllHTVz197HM%252BUXtL1ZbaTlidDneaWinxaWOPzJKBvCcLNTzVp%252FSPqoW5GIlFmFU75ZuyhRZZ9ttcS%252F597Z5ZLY%252BUOWFUUUfynnoEnNtcD7QLRMcx8bHm7lt%252BcnqPakj%252FDtU3y1ybY5DuymtfYWYy%252FExm83HTbJq8d5M4yOg769Wmxt3BM8WJ9uW8EjE55Qsc0hYzYqxcJf0Kutyv83ztv87kuybfMy%252B5blHhVJWK9lvDemdfVZculL9BGQ8Zu4oHfN%252FDHftTVIne0rvDTALthGz13pGpTw6pXfAHMwTavwAAeNptxbsSwVAUBdC9E5J4P3ol9cnhCmWGCYUmheEPMGOMRuFf%252FCvDPbqsZiHAz%252FsFRZURwIAhQowxwRobbLFDiT0OOLLGOiPGTNhgky222WGXPfY54DA6XZ%252F3c%252BrT%252BHG7iOTyXUX%252Bp7baU3tmO3tuZ%252FbCXtq5Xwu%252F87ti9QG%252F1CoKAAAA)%2520format(%2526quot%253Bwoff%2526quot%253B)%257D%253C%252Fstyle%253E%253Cdefs%253E%253Cpath%2520id%253D%2522eth_right%2522%2520stroke-width%253D%2522142%2522%2520stroke-linejoin%253D%2522miter%2522%2520d%253D%2522M71%2520263v1860l792-499Z%2522%2520fill%253D%2522none%2522%252F%253E%253Cpath%2520id%253D%2522eth_right-back%2522%2520stroke-width%253D%2522142%2522%2520stroke-linejoin%253D%2522miter%2522%2520d%253D%2522m71%25201230%2520754%2520419%2522%252F%253E%253Cpath%2520id%253D%2522eth_bottom%2522%2520stroke-width%253D%2522142%2522%2520stroke-linejoin%253D%2522miter%2522%2520stroke-miterlimit%253D%2522100%2522%2520d%253D%2522m71%25202461%2520629-398-629%2520916Z%2522%2520fill%253D%2522none%2522%252F%253E%253Cpath%2520id%253D%2522eth_top_right%2522%2520d%253D%2522m0%252041%2520131%2520218L0%2520199Z%2522%252F%253E%253Cpath%2520id%253D%2522eth_middle_right%2522%2520d%253D%2522M0%2520199v138l131-78%2522%252F%253E%253Cpath%2520id%253D%2522eth_bottom_right%2522%2520d%253D%2522M0%2520362v107l131-185z%2522%252F%253E%253Cg%2520id%253D%2522eth_diamond%2522%2520filter%253D%2522url(%2523blackGlow)%2522%253E%253Cg%2520transform%253D%2522translate(32.68%252063.5)%2520scale(.00392)%2522%253E%253Cuse%2520href%253D%2522%2523eth_right-back%2522%2520stroke%253D%2522%2523CC71C2%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_right%2522%2520stroke%253D%2522%2523FF9C92%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom%2522%2520stroke%253D%2522%25235A9DED%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_right-back%2522%2520stroke%253D%2522%252388D848%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_right%2522%2520stroke%253D%2522%2523FFE94D%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom%2522%2520stroke%253D%2522%252353D3E0%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253C%252Fg%253E%253C%252Fg%253E%253Cg%2520id%253D%2522eth_color_b%2522%2520filter%253D%2522url(%2523blackGlow)%2522%253E%253Cg%2520transform%253D%2522matrix(.028%25200%25200%2520.028%252032.68%252082.42)%2522%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%2523F48B76%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%25239D68AB%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%2523647BBD%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%2523F9EC66%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%252350BB78%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%252310AFD3%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253C%252Fg%253E%253C%252Fg%253E%253Cg%2520id%253D%2522eth_pencil%2522%2520filter%253D%2522url(%2523glow)%2522%2520fill%253D%2522none%2522%2520stroke%253D%2522%2523000%2522%2520stroke-width%253D%252212%2522%253E%253Cpath%2520d%253D%2522M50.176%252062.258c-.213.42-.383.87-.387%25201.352.02.309.032.623.032.936-.059.252-.155.518-.115.776l.03.022M46.85%252060.193c-.065.223.103.472.183.682.14.207.241.428.38.633.154.218.242.47.388.694%2522%2520stroke-width%253D%2522.504%2522%252F%253E%253Cpath%2520d%253D%2522M46.85%252060.181c.281.135.508.385.796.538.443.284.836.613%25201.303.86.287.09.585.178.845.338.241.346.61-.004.811-.192.213-.187.535-.181.778-.331.776-.275%25201.59-.437%25202.341-.783.364-.084-.065.338-.133.466-.357.38-.704.773-1.015%25201.191-.4.321-.674.781-1.123%25201.047-.343.387-.76.71-1.056%25201.136-.202.29-.31.695-.621.88-.117.089-.007.443-.279.343-.356-.336-.493-.82-.72-1.241-.132-.207-.16-.485-.3-.7-.212-.261-.29-.603-.486-.878-.024-.154-.373-.603-.135-.632l.057.014%2522%2520stroke-width%253D%2522.504%2522%252F%253E%253Cpath%2520d%253D%2522M47.279%252059.701c.352.35.775.621%25201.227.837.372.232.72.513%25201.095.734l.045.007M50.21%252058.547c.08.26-.047.592-.064.873-.107.311-.11.65-.25.953-.115.302-.092.648-.243.931-.045.151.126.11.162.22%2522%2520stroke-width%253D%2522.504%2522%252F%253E%253Cpath%2520d%253D%2522M50.218%252058.537c-.418.177-.786.472-1.236.584-.487.153-.99.269-1.456.484-.488.294-.147-.303-.07-.52.218-.579.559-1.1.873-1.63.214-.444.455-.873.758-1.264.333-.596.507-1.26.731-1.9.027-.033.071-.04.109-.056%2522%2520stroke-width%253D%2522.504%2522%252F%253E%253Cpath%2520d%253D%2522M49.583%252061.628c.364-.158.767-.19%25201.14-.337.65-.203%25201.27-.486%25201.92-.687.207-.053.978-.328.369-.401-.524-.177-.975-.526-1.454-.796-.384-.276-.798-.497-1.143-.824-.339.015-.148-.423-.276-.624-.045-.55.037-1.094.005-1.644-.041-.378-.134-.749-.168-1.127.016-.303.055-.62.009-.917-.08-.015-.067-.123.004-.131M50.007%252053.802c-.183.382.27.395.347.711.289.244.262.71.609.906.248.313.458.67.583%25201.052.1.538.434.99.664%25201.474.294.594.688%25201.14%25201.019%25201.719.118.212.254.412.337.641%2522%2520stroke-width%253D%2522.504%2522%252F%253E%253C%252Fg%253E%253Cg%2520id%253D%2522eth_bw%2522%2520filter%253D%2522url(%2523glow)%2522%253E%253Cg%2520transform%253D%2522matrix(.028%25200%25200%2520.028%252067.32%252062.42)%2522%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253C%252Fg%253E%253C%252Fg%253E%253Cg%2520id%253D%2522eth_grey%2522%2520filter%253D%2522url(%2523glow)%2522%253E%253Cg%2520transform%253D%2522matrix(.028%25200%25200%2520.028%252067.32%252082.42)%2522%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%2523343434%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%2523141414%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%25233C3C3B%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%25238C8C8C%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%2523393939%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%25238C8C8C%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253C%252Fg%253E%253C%252Fg%253E%253Cg%2520id%253D%2522eth_color_a%2522%2520filter%253D%2522url(%2523blackGlow)%2522%253E%253Cg%2520transform%253D%2522matrix(.028%25200%25200%2520.028%252050%252092.42)%2522%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%2523B8FBF6%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%2523CAB3F5%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%2523C8B2F5%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_top_right%2522%2520fill%253D%2522%2523EECBC0%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_middle_right%2522%2520fill%253D%2522%252387A9F0%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_bottom_right%2522%2520fill%253D%2522%2523EECBC0%2522%2520transform%253D%2522scale(-1%25201)%2522%252F%253E%253C%252Fg%253E%253C%252Fg%253E%253Cfilter%2520id%253D%2522blackGlow%2522%253E%253CfeGaussianBlur%2520in%253D%2522SourceAlpha%2522%2520stdDeviation%253D%2522.4%2522%2520result%253D%2522blurredAlpha%2522%252F%253E%253CfeMerge%253E%253CfeMergeNode%2520in%253D%2522blurredAlpha%2522%252F%253E%253CfeMergeNode%2520in%253D%2522blurredAlpha%2522%252F%253E%253CfeMergeNode%2520in%253D%2522blurredAlpha%2522%252F%253E%253CfeMergeNode%2520in%253D%2522SourceGraphic%2522%252F%253E%253C%252FfeMerge%253E%253C%252Ffilter%253E%253Cfilter%2520id%253D%2522blur%2522%2520x%253D%2522-50%2525%2522%2520width%253D%2522200%2525%2522%253E%253CfeGaussianBlur%2520in%253D%2522SourceAlpha%2522%2520stdDeviation%253D%2522.5%2522%252F%253E%253C%252Ffilter%253E%253Cfilter%2520id%253D%2522rainbowGlow%2522%2520x%253D%2522-50%2525%2522%2520y%253D%2522-50%2525%2522%2520width%253D%2522200%2525%2522%2520height%253D%2522200%2525%2522%253E%253CfeGaussianBlur%2520in%253D%2522SourceAlpha%2522%2520stdDeviation%253D%25221.5%2522%2520result%253D%2522blurredAlpha%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%25223%2522%2520dy%253D%25223%2522%2520result%253D%2522redGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%2522-3%2522%2520dy%253D%25223%2522%2520result%253D%2522blueGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%2522-3%2522%2520dy%253D%2522-3%2522%2520result%253D%2522greenGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%25223%2522%2520dy%253D%2522-3%2522%2520result%253D%2522yellowGlow%2522%252F%253E%253CfeComponentTransfer%2520in%253D%2522redGlow%2522%2520result%253D%2522redGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522blueGlow%2522%2520result%253D%2522blueGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522greenGlow%2522%2520result%253D%2522greenGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522yellowGlow%2522%2520result%253D%2522yellowGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522redGlow%2522%2520in2%253D%2522greenGlow%2522%2520result%253D%2522redGreenGlow%2522%252F%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522yellowGlow%2522%2520in2%253D%2522blueGlow%2522%2520result%253D%2522yellowBlueGlow%2522%252F%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522redGreenGlow%2522%2520in2%253D%2522yellowBlueGlow%2522%2520result%253D%2522rainbowGlow%2522%252F%253E%253CfeMorphology%2520in%253D%2522SourceAlpha%2522%2520operator%253D%2522dilate%2522%2520radius%253D%2522.4%2522%2520result%253D%2522dilatedAlpha%2522%252F%253E%253CfeGaussianBlur%2520in%253D%2522dilatedAlpha%2522%2520stdDeviation%253D%2522.3%2522%2520result%253D%2522blurredDilatedAlpha%2522%252F%253E%253CfeComposite%2520in%253D%2522rainbowGlow%2522%2520in2%253D%2522blurredDilatedAlpha%2522%2520operator%253D%2522in%2522%2520result%253D%2522shrunkGlow%2522%252F%253E%253CfeMerge%253E%253CfeMergeNode%2520in%253D%2522shrunkGlow%2522%252F%253E%253CfeMergeNode%2520in%253D%2522shrunkGlow%2522%252F%253E%253CfeMergeNode%2520in%253D%2522SourceGraphic%2522%252F%253E%253C%252FfeMerge%253E%253C%252Ffilter%253E%253Cfilter%2520id%253D%2522glow%2522%253E%253CfeGaussianBlur%2520in%253D%2522SourceAlpha%2522%2520stdDeviation%253D%2522.2%2522%2520result%253D%2522blurredAlpha%2522%252F%253E%253CfeColorMatrix%2520in%253D%2522blurredAlpha%2522%2520values%253D%25220%25200%25200%25200%25201%25200%25200%25200%25200%25201%25200%25200%25200%25200%25201%25200%25200%25200%25201%25200%2522%2520result%253D%2522whiteBlurredAlpha%2522%252F%253E%253CfeMerge%253E%253CfeMergeNode%2520in%253D%2522whiteBlurredAlpha%2522%252F%253E%253CfeMergeNode%2520in%253D%2522whiteBlurredAlpha%2522%252F%253E%253CfeMergeNode%2520in%253D%2522SourceGraphic%2522%252F%253E%253C%252FfeMerge%253E%253C%252Ffilter%253E%253Cfilter%2520id%253D%2522rainbowGlowLarge%2522%2520x%253D%2522-100%2525%2522%2520y%253D%2522-100%2525%2522%2520width%253D%2522400%2525%2522%2520height%253D%2522400%2525%2522%253E%253CfeGaussianBlur%2520in%253D%2522SourceAlpha%2522%2520stdDeviation%253D%25221.5%2522%2520result%253D%2522blurredAlpha%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%25223%2522%2520dy%253D%25223%2522%2520result%253D%2522redGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%2522-3%2522%2520dy%253D%25223%2522%2520result%253D%2522blueGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%2522-3%2522%2520dy%253D%2522-3%2522%2520result%253D%2522greenGlow%2522%252F%253E%253CfeOffset%2520in%253D%2522blurredAlpha%2522%2520dx%253D%25223%2522%2520dy%253D%2522-3%2522%2520result%253D%2522yellowGlow%2522%252F%253E%253CfeComponentTransfer%2520in%253D%2522redGlow%2522%2520result%253D%2522redGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522blueGlow%2522%2520result%253D%2522blueGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522greenGlow%2522%2520result%253D%2522greenGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeComponentTransfer%2520in%253D%2522yellowGlow%2522%2520result%253D%2522yellowGlow%2522%253E%253CfeFuncR%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncG%2520type%253D%2522table%2522%2520tableValues%253D%25221%2522%252F%253E%253CfeFuncB%2520type%253D%2522table%2522%2520tableValues%253D%25220%2522%252F%253E%253C%252FfeComponentTransfer%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522redGlow%2522%2520in2%253D%2522greenGlow%2522%2520result%253D%2522redGreenGlow%2522%252F%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522yellowGlow%2522%2520in2%253D%2522blueGlow%2522%2520result%253D%2522yellowBlueGlow%2522%252F%253E%253CfeBlend%2520mode%253D%2522screen%2522%2520in%253D%2522redGreenGlow%2522%2520in2%253D%2522yellowBlueGlow%2522%2520result%253D%2522rainbowGlow%2522%252F%253E%253CfeMorphology%2520in%253D%2522SourceAlpha%2522%2520operator%253D%2522dilate%2522%2520radius%253D%25221.2%2522%2520result%253D%2522dilatedAlpha%2522%252F%253E%253CfeGaussianBlur%2520in%253D%2522dilatedAlpha%2522%2520stdDeviation%253D%25221.5%2522%2520result%253D%2522blurredDilatedAlpha%2522%252F%253E%253CfeComposite%2520in%253D%2522rainbowGlow%2522%2520in2%253D%2522blurredDilatedAlpha%2522%2520operator%253D%2522in%2522%2520result%253D%2522shrunkGlow%2522%252F%253E%253CfeMerge%253E%253CfeMergeNode%2520in%253D%2522shrunkGlow%2522%252F%253E%253CfeMergeNode%2520in%253D%2522shrunkGlow%2522%252F%253E%253CfeMergeNode%2520in%253D%2522SourceGraphic%2522%252F%253E%253C%252FfeMerge%253E%253C%252Ffilter%253E%253CradialGradient%2520id%253D%2522lightGlow%2522%2520cx%253D%252250%2525%2522%2520cy%253D%252250%2525%2522%2520r%253D%252250%2525%2522%2520fx%253D%252250%2525%2522%2520fy%253D%252250%2525%2522%253E%253Cstop%2520offset%253D%252250%2525%2522%2520style%253D%2522stop-color%253Awhite%253Bstop-opacity%253A.1%2522%252F%253E%253Cstop%2520offset%253D%2522100%2525%2522%2520style%253D%2522stop-color%253Awhite%253Bstop-opacity%253A0%2522%252F%253E%253C%252FradialGradient%253E%253ClinearGradient%2520id%253D%2522circuitGrad%2522%2520x2%253D%2522100%2525%2522%2520y2%253D%2522100%2525%2522%253E"; } function cardBackPiece1(uint8 Nicons) external pure returns (string memory piece) { if (Nicons == 0) return "%253Cstop%2520offset%253D%25220%2525%2522%2520stop-color%253D%2522%25232A2F3A%2522%2520%252F%253E"; if (Nicons == 1) return "%253Cstop%2520offset%253D%252275%2525%2522%2520stop-color%253D%2522%25232A2F3A%2522%252F%253E%253Cstop%2520offset%253D%252290%2525%2522%2520stop-color%253D%2522%2523fff%2522%252F%253E"; if (Nicons == 2) return "%253Cstop%2520offset%253D%252210%2525%2522%2520stop-color%253D%2522pink%2522%252F%253E%253Cstop%2520offset%253D%252225%2525%2522%2520stop-color%253D%2522%25232A2F3A%2522%252F%253E%253Cstop%2520offset%253D%252275%2525%2522%2520stop-color%253D%2522%25232A2F3A%2522%252F%253E%253Cstop%2520offset%253D%252290%2525%2522%2520stop-color%253D%2522%2523fff%2522%252F%253E"; } }
//SPDX-License-Identifier: MIT /// @title JPEG Mining /// @author Xatarrer /// @notice Unaudited pragma solidity ^0.8.0; library ButerinCardsBackB { function cardBackPiece2() external pure returns (string memory piece) { return "%253C%252FlinearGradient%253E%253CclipPath%2520id%253D%2522clipFrame%2522%253E%253Cpath%2520d%253D%2522M6%25204%25204%25206v128l2%25202h88l2-2V6l-2-2ZM0%25200h100v140H0Z%2522%252F%253E%253C%252FclipPath%253E%253Cpattern%2520id%253D%2522circuit%2522%2520width%253D%2522121.6%2522%2520height%253D%2522182.4%2522%2520patternUnits%253D%2522userSpaceOnUse%2522%253E%253Cpath%2520fill%253D%2522%25231A1D2A%2522%2520d%253D%2522M0%25200h100v140H0z%2522%252F%253E%253Cpath%2520fill%253D%2522url(%2523circuitGrad)%2522%2520mask%253D%2522url(%2523groupMask)%2522%2520d%253D%2522M0%25200h100v140H0z%2522%252F%253E%253C%252Fpattern%253E%253Cmask%2520id%253D%2522groupMask%2522%253E%253Cg%2520fill%253D%2522%2523fff%2522%253E%253Cpath%2520id%253D%2522circuitPath%2522%2520transform%253D%2522scale(.2)%2522%2520d%253D%2522M44.1%2520224a5%25205%25200%25201%25201%25200%25202H0v-2h44.1zm160%252048a5%25205%25200%25201%25201%25200%25202H82v-2h122.1zm57.8-46a5%25205%25200%25201%25201%25200-2H304v2h-42.1zm0%252016a5%25205%25200%25201%25201%25200-2H304v2h-42.1zm6.2-114a5%25205%25200%25201%25201%25200%25202h-86.2a5%25205%25200%25201%25201%25200-2h86.2zm-256-48a5%25205%25200%25201%25201%25200%25202H0v-2h12.1zm185.8%252034a5%25205%25200%25201%25201%25200-2h86.2a5%25205%25200%25201%25201%25200%25202h-86.2zM258%252012.1a5%25205%25200%25201%25201-2%25200V0h2v12.1zm-64%2520208a5%25205%25200%25201%25201-2%25200v-54.2a5%25205%25200%25201%25201%25202%25200v54.2zm48-198.2V80h62v2h-64V21.9a5%25205%25200%25201%25201%25202%25200zm16%252016V64h46v2h-48V37.9a5%25205%25200%25201%25201%25202%25200zm-128%252096V208h16v12.1a5%25205%25200%25201%25201-2%25200V210h-16v-76.1a5%25205%25200%25201%25201%25202%25200zm-5.9-21.9a5%25205%25200%25201%25201%25200%25202H114v48H85.9a5%25205%25200%25201%25201%25200-2H112v-48h12.1zm-6.2%2520130a5%25205%25200%25201%25201%25200-2H176v-74.1a5%25205%25200%25201%25201%25202%25200V242h-60.1zm-16-64a5%25205%25200%25201%25201%25200-2H114v48h10.1a5%25205%25200%25201%25201%25200%25202H112v-48h-10.1zM66%2520284.1a5%25205%25200%25201%25201-2%25200V274H50v30h-2v-32h18v12.1zM236.1%2520176a5%25205%25200%25201%25201%25200%25202H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5%25205%25200%25201%25201%25200-2H274v44.1a5%25205%25200%25201%25201-2%25200V146h-10.1zm-64%252096a5%25205%25200%25201%25201%25200-2H208v-80h16v-14h-42.1a5%25205%25200%25201%25201%25200-2H226v18h-16v80h-12.1zm86.2-210a5%25205%25200%25201%25201%25200%25202H272V0h2v32h10.1zM98%2520101.9V146H53.9a5%25205%25200%25201%25201%25200-2H96v-42.1a5%25205%25200%25201%25201%25202%25200zM53.9%252034a5%25205%25200%25201%25201%25200-2H80V0h2v34H53.9zm60.1%25203.9V66H82v64H69.9a5%25205%25200%25201%25201%25200-2H80V64h32V37.9a5%25205%25200%25201%25201%25202%25200zM101.9%252082a5%25205%25200%25201%25201%25200-2H128V37.9a5%25205%25200%25201%25201%25202%25200V82h-28.1zm16-64a5%25205%25200%25201%25201%25200-2H146v44.1a5%25205%25200%25201%25201-2%25200V18h-26.1zm102.2%2520270a5%25205%25200%25201%25201%25200%25202H98v14h-2v-16h124.1zM242%2520149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5%25205%25200%25201%25201%25202%25200zM53.9%252018a5%25205%25200%25201%25201%25200-2H64V2H48V0h18v18H53.9zm112%252032a5%25205%25200%25201%25201%25200-2H192V0h50v2h-48v48h-28.1zm-48-48a5%25205%25200%25200%25201-9.8-2h2.07a3%25203%25200%25201%25200%25205.66%25200H178v34h-18V21.9a5%25205%25200%25201%25201%25202%25200V32h14V2h-58.1zm0%252096a5%25205%25200%25201%25201%25200-2H137l32-32h39V21.9a5%25205%25200%25201%25201%25202%25200V66h-40.17l-32%252032H117.9zm28.1%252090.1a5%25205%25200%25201%25201-2%25200v-76.51L175.59%252080H224V21.9a5%25205%25200%25201%25201%25202%25200V82h-49.59L146%2520112.41v75.69zm16%252032a5%25205%25200%25201%25201-2%25200v-99.51L184.59%252096H300.1a5%25205%25200%25200%25201%25203.9-3.9v2.07a3%25203%25200%25200%25200%25200%25205.66v2.07a5%25205%25200%25200%25201-3.9-3.9H185.41L162%2520121.41v98.69zm-144-64a5%25205%25200%25201%25201-2%25200v-3.51l48-48V48h32V0h2v50H66v55.41l-48%252048v2.69zM50%252053.9v43.51l-48%252048V208h26.1a5%25205%25200%25201%25201%25200%25202H0v-65.41l48-48V53.9a5%25205%25200%25201%25201%25202%25200zm-16%252016v19.51l-34%252034v-2.82l32-32V69.9a5%25205%25200%25201%25201%25202%25200zM12.1%252032a5%25205%25200%25201%25201%25200%25202H9.41L0%252043.41V40.6L8.59%252032h3.51zm265.8%252018a5%25205%25200%25201%25201%25200-2h18.69l7.41-7.41v2.82L297.41%252050H277.9zm-16%2520160a5%25205%25200%25201%25201%25200-2H288v-71.41l16-16v2.82l-14%252014V210h-28.1zm-208%252032a5%25205%25200%25201%25201%25200-2H64v-22.59L40.59%2520194H21.9a5%25205%25200%25201%25201%25200-2h19.51L66%2520216.59V242H53.9zm150.2%252014a5%25205%25200%25201%25201%25200%25202H96v-56.6L56.6%2520162H37.9a5%25205%25200%25201%25201%25200-2h19.5L98%2520200.6V256h106.1zm-150.2%25202a5%25205%25200%25201%25201%25200-2H80v-46.59L48.59%2520178H21.9a5%25205%25200%25201%25201%25200-2h27.51L82%2520208.59V258H53.9zM34%252039.8v1.61L9.41%252066H0v-2h8.59L32%252040.59V0h2v39.8zM2%2520300.1a5%25205%25200%25200%25201%25203.9%25203.9H3.83A3%25203%25200%25200%25200%25200%2520302.17V256h18v48h-2v-46H2v42.1zM34%2520241v63h-2v-62H0v-2h34v1zM17%252018H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32%2520273v15h-2v-14h-14v14h-2v-16h18v1zM0%252092.1A5.02%25205.02%25200%25200%25201%25206%252097a5%25205%25200%25200%25201-6%25204.9v-2.07a3%25203%25200%25201%25200%25200-5.66V92.1zM80%2520272h2v32h-2v-32zm37.9%252032h-2.07a3%25203%25200%25200%25200-5.66%25200h-2.07a5%25205%25200%25200%25201%25209.8%25200zM5.9%25200A5.02%25205.02%25200%25200%25201%25200%25205.9V3.83A3%25203%25200%25200%25200%25203.83%25200H5.9zm294.2%25200h2.07A3%25203%25200%25200%25200%2520304%25203.83V5.9a5%25205%25200%25200%25201-3.9-5.9zm3.9%2520300.1v2.07a3%25203%25200%25200%25200-1.83%25201.83h-2.07a5%25205%25200%25200%25201%25203.9-3.9zM97%2520100a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-48%252032a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32%252048a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252032a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16-64a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252096a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-144a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252032a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-96%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm96%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16-64a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-32%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zM49%252036a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-32%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zM33%252068a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-48a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%2520240a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%252032a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16-64a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm80-176a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32%252048a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm112%2520176a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm-16%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zM17%2520180a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0%252016a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm0-32a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16%25200a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zM17%252084a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm32%252064a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206zm16-16a3%25203%25200%25201%25200%25200-6%25203%25203%25200%25200%25200%25200%25206z%2522%252F%253E%253Cuse%2520href%253D%2522%2523circuitPath%2522%2520transform%253D%2522translate(60.8)%2522%252F%253E%253Cuse%2520href%253D%2522%2523circuitPath%2522%2520transform%253D%2522translate(0%252060.8)%2522%252F%253E%253Cuse%2520href%253D%2522%2523circuitPath%2522%2520transform%253D%2522translate(60.8%252060.8)%2522%252F%253E%253Cuse%2520href%253D%2522%2523circuitPath%2522%2520transform%253D%2522translate(0%2520121.6)%2522%252F%253E%253Cuse%2520href%253D%2522%2523circuitPath%2522%2520transform%253D%2522translate(60.8%2520121.6)%2522%252F%253E%253C%252Fg%253E%253C%252Fmask%253E%253C%252Fdefs%253E%253Cpath%2520fill%253D%2522url(%2523circuit)%2522%2520d%253D%2522M4%25204h92v132H4z%2522%252F%253E%253Cg%2520opacity%253D%2522"; } function cardBackPiece3() external pure returns (string memory piece) { return "%2522%253E%253Cpath%2520fill%253D%2522%2523d7d7d9%2522%2520d%253D%2522M22.15%252089.032c4.966-5.885%25205.334-6.989%252010.115-9.563%25204.781-2.575%25205.333-1.104%252011.402-4.414%25206.069-3.31%25201.103-7.724%25204.23-14.712C51.023%252053.355%252060.402%252046.367%252063.712%252046c3.31-.368%25205.517-.551%25206.069-.551.551%25200-.184%25208.827-.184%25208.827l2.574%25203.678.552%252014.16-2.759%25202.207-3.494-1.288-1.839-6.252-2.758%25202.574%25207.908%252019.494-4.966%25204.781-43.584%25207.724-1.839-10.666%2522%252F%253E%253Cpath%2520fill%253D%2522%2523b9c6d0%2522%2520d%253D%2522M65.394%2520137.294c-15.294-.164-30.605-.15-45.87-1.227-2.886-1.243%25205.682-.903%25201.585-3.303-1.285-4.576%25204.416-8.54.955-13.404-.757-3.281%25205.746-8.4.21-5.013%25204.092-1.375.057-12.156.388-4.659%25201.12%25204.992-7.6%252011.326-8.573%25209.516%25202.528-1.734%25206.602-9.55%25201.691-4.038-4.917%25205.073-13.446-4.098-10.782-4.804%25201.668%25206.46%252014.071%25201.75%25207.185-3.305-6.503-4.096-9.663-14.142-1.971-18.864%25203.25-3.864%252017.818-5.924%252012.27%25201.72-1.982%25203.21-1.166%25209.747%25201.956%25209.377-1.65-2.26%25206.34.254%25208.374-1.637%25205.293-2.21%252010.876-3.907%252016.415-5.38%25206.128-.621%252012.579-3.43%252018.575-2.761%25201.453.434-3.55-3.117-.844-5.045.235-5.848-6.785-9.071-6.005-14.793.254-3.303-1.14-12.79%25202.096-5.585%25202.87%25202.319%25203.836%25206.601%25204.977%25209.101%25201.13-2.3%25201.857-3.089%25202.888-.844%25201.88-3.853.445-10.732-.021-14.44-3.653-1.526.884-9.892-3.52-6.927%25201.327-2.7%25203.246-8.172-1.144-3.323-5.684%25203.716-14.033%25204.662-16.746%252011.822-.205%25206.599-4.837%252015.375-12.403%252010.303-2.675-2.972-7.114%25201.937-7.14.586-.183-5.405%252013.23.211%25206.26-4.018-2.467-3.382-9.283-4.931-7.478-10.292%25203.575%25206.994%252014.159%25201.963%252016.15-3.899-2.608%25206.254-8.057%25203.26-13.344%25204.08-.154-5.61%25209.411-2.638%25209.506-5.243-4.359%25201.027-8.53-4.291-5.387-7.377%25202.047%25207.007%252013.259%25201.251%252015.576.785-2.868-1.018-.864-8.216.187-3.135%25202.578.519%252010.317%25203.479%25209.764%25202.224-1.206-5.103%25202.476-5.06%25202.673-.359%25201.837%25205.152%25209.093-1.067%25206.587%25204.574%25202.222-1.669%25204.879-3.407%25202.085.371-3.046%25204.832%25205.36-1.193%25207.322-1.966%25204.681-2.616%25209.251-5.473%252014.04-7.872-1.05%25202.179-7.845%25206.375-11.303%25209.078-3.192%25201.88-8.56%25207.18-10.263%25206.322%25204.23%25204.345.707%252010.72%25202.42%252016.137%25201.625%25205.673-9.295%25208.83-9.065%25202.35-1.28-6.84-2.348%25202.623%25201.103%25203.932%25205.221%25203.44.453%252011.815%25206.937%252013.837%25207.055-.443%25209.692%25206.987%25206.796%252012.449.186%25204.343-1.424%252014.89-6.487%252012.853-4.432-5.004.716-8.582%25202.717-13.018%25204.14-8.45-7.612-3.347-12.047-4.313-5.386-2.57-12.203%25201.887-15.768%25204.152.758%25207.43-10.693%25208.745-9.245%252015.278%25202.989%25204.843%25206.566%25209.269%25206.768%252015.245%25204.883%25204.898%252014.623.777%252021.34%25202.265%25208.434.098%252016.87.25%252025.292.748-4.714%25203.727-13.165.796-19.366%25201.773-2.772-.007-5.544-.02-8.316-.034zm-24.787-3.179c-4.296-4.086%25203.12-8.327-2.394-11.806-3.387-2.468-6.181-7.28-5.344-10.533-6.107%25203.13-6.046%25209.98-5.437%252015.882-.139%25203.902-.114%25208.147%25204.721%25206.76h8.634l-.176-.295zm-26.964-29.5c-.93-2.757-5.3-9.513-2.657-2.76.75.826%25201.387%25202.813%25202.657%25202.76zM40.32%252065.366c4.75-3.897-9.158-2.045-1.71-.015.56.22%25201.135.042%25201.71.015zm15.796-20.792c-.735-2.564-4.333.562-.316.06zm10.109%252077.137c-3.375-3.62-1.506-8.1%25201.797-9.774%25203.377-4.012%25204.902%25207.562.71%25208.746-.46.71-1.756%25202.66-2.507%25201.028zm-33.49-27.594c-2.324-.907-5.798-.512-4.328-4.238%25202.748.952%25204.155-2.564%25204.072.89%25201.878.174%25201.303%25203.12.256%25203.348zm8.223-18.58c-2.565-1.812-8.968-6.036-8.71-5.766%25205.277-1.661%252011.09%25205.987%252015.629.736-.93%25202.862-3.753%25205.422-6.92%25205.03zm28.339-15.684c-7.569-2.416%25203.694-4.806%25200%25200z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523eda45f%2522%2520d%253D%2522M67.578%2520137.252c-15.963-.212-31.946-.09-47.88-1.22-3.246-.95%25205.89-1.205%25201.354-3.607-.914-4.361%25204.101-7.97%25201.266-12.706-1.193-3.318%25205.994-9.223.121-5.543%25203.872-1.96-.158-12.126.31-4.595.544%25204.28-6.066%252011.202-8.307%25209.348%25202.219-1.162%25205.916-9.415%25201.55-3.958-3.478%25205.236-13.577-2.929-10.5-3.973%25203.269%25206.486%252013.617-.125%25206.14-4.765-4.833-3.428-8.409-10.218-3.886-15.375%25203.678-5.021%252011.064-7.642%252016.806-4.688-2.887%25203.5-5.294%252010.857-.379%252013.355%25204.84%25202.841%25202.299%252010.909%25209.217%25208.513%25207.401%25201.71%25204.114-10.632%25209.64-9.654%25206.162%25201.003%252012.808-6.419%252017.48-3.393%25204.519%25202.907%25209.453-.96%252014.224-.784%25205.566-1.57-4.992-3.693-6.69-5.23-1.385-5.18-2.217-11.296-6.645-15.582-.72-3.384-.89-10.497.138-12.116%25202.213%25204.657%25205.859%25207.918%25206.474%252012.775%25207.06-.379%25202.15-10.19%25203.71-14.689-1.518-3.025-3.087-5.058-2.358-8.747-5.649%25202.49%25203.771-8.122-2.084-3.836-5.15%25204.437-13.274%25204.608-16.95%252010.95-1.95%25205.425-3.12%252017.016-11.712%252012.632-3.063-2.766-8.606-.203-8.563-.012-.014-5.415%252012.58.285%25206.01-4.56-3.406-2.337-8.558-4.919-7.487-9.932%25203.245%25207.272%252013.764%25202.27%252016.316-3.145-1.778-1.072-3.013%25207.215-7.12%25203.395-2.514-1.862-8.715%25202.415-4.502-2.492%25201.273-2.545%25209.79-.273%25207.331-2.903-5.506%25203.883-7.915-11.669-3.128-4.209%25204.718%25201.903%252010.182-1.414%252014.564-2.028-3.349-.486-2.151-8.398-.51-2.934%25202.947.592%25209.284%25202.84%25209.929%25202.346-1.706-3.568%25201.184-6.407%25201.925-1.41.85%25204.052%25207.707%25203.045%25207.352%25202.775-3.159%25206.012%25206.238-3.063%25202.033%25202.263-4.653%25205.995%25205.9-.955%25208.107-2.028%25204.692-2.236%25208.847-5.72%252013.76-7.357C87.822%252043.941%252080.24%252048.745%252073.154%252054.2c-3.012-2.548%25203.562%25203.96%25201.008%25206.134-.68%25204.916%25202.963%252012.384-3.051%252015.172-5.28%25202.276-5.21-4.425-6.636-6.478-1.505%25205.958%25206.862%25209.5%25205.683%252016.101-1.013%25206.762%252010.317%25203.618%252011.535%25209.8-1.646%25205.588-.853%252011.798-2.813%252017.106-1.62%25204.818-6.946%25204.54-6.618-1.052.11-4.493%25208.818-9.766%25204.087-13.642-5.557-.438-11.76%25201.09-16.795-.135-5.005%25202.122-11.902%25202.093-11.971%25208.89-2.871%25205.023-12.398%25208.06-6.12%252014.625%25204.937%25203.595%25202.664%252012.598%25208.304%252014.375%25207.573-.89%252015.341-.016%252022.993-.15%25204.418.716%252011.69-1.03%252014.292%25201.413-4.705%25201.86-10.61.47-15.826.957a126.381%2520126.381%25200%25200%25201-3.647-.063zm-26.915-2.823c-2.47-2.848-1.589-6.431%25200-8.393-2.06-5.076-10.061-8.693-7.203-14.791-6.099%25203.188-7.12%25209.906-6.108%252016.11-.134%25204.23.002%25208.621%25205.365%25207.085%25202.648.036%25205.297.04%25207.946-.01zm-27.015-30.112c-.86-1.712-4.75-9.447-3.184-3.252.306.46%25203.04%25205.204%25203.184%25203.252zm26.893-39.02c4.08-4.027-9.527-1.66-1.778.107.6.218%25201.178-.022%25201.778-.107zM51.134%252048.28c3.132-1.42%252011.806-1.074%252011.547-1.45-4.156-.392-12.93%25201.295-14.14%25201.588.867.02%25201.735-.023%25202.593-.138zm4.858-3.534c-.244-3.009-4.655.313-.22.031zm9.612%252075.695c-3.408-3.628-.069-6.772%25202.41-8.316%25203.263-4.28%25204.501%25206.99.978%25208.512-.958%25201.514-3.102%25202.09-3.388-.196zM28.856%252093.65c-.28-1.638-1.605-5.564%25201.613-3.324%25202.352-4.257%25204.798%25206.34.047%25202.685l-.839.081zm12.102-18.113c-2.4-2.058-8.56-5.19-8.493-6.03%25205.35-1.02%252010.558%25206.137%252015.457%25201.188-1.186%25202.024-4.303%25206.147-6.964%25204.842zm28.494-2.21c-2.457-3.675%25203.308-3.249%25200%25200zm-.155-13.522c-6.898-1.167%25202.62-5.486%25200%25200z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523eda032%2522%2520d%253D%2522M54.291%2520137.105c-11.816-.332-23.664-.112-35.443-1.265%25202.076-.516%25204.01-2.106%25203.14-2.782%25202.461%25201.042%25206.61-2.585%25201.805-1.548-7.001-.493%25202.024-5.8-1.018-10.03-2.747-4.168%25204.142-8.151%25204.955-3.387-.48%25205.004-1.58%252012.544%25201.252%252016.417h11.903c-5.18-3.617%25208.956-2.394%25201.658-3.734-2.88.288-4.808-1.187-2.171-3.247.853-6.79-11.322-9.534-6.531-16.58%25204.15-3.275%25205.73-7.556%25206.904-12.317%25206.453.103%252012.379-3.037%252018.503-4.809%25204.817%25204.8%252012.247.207%252017.631-.477-3.85-3.28-12.308-3.37-9.88-10.701-.891-5.11-7.461-8.144-5.953-13.852.187-2.586-.86-11.661%25201.481-5.185%25203.612%25202.898%25203.925%25207.41%25205.794%252010.49%25206.18-.322%25202.576-9.005%25203.304-13.164.14-2.725-1.333-10.723%25202.336-4.933.042%25205.049.593%252010.49.473%252015.772-2.265%25206.544-10.545%25203.964-9.348-2.701-3.163%25205.595%25207.534%252010.598%25205.013%252017.664%25201.524%25204.893%252014.706%25203.26%252010.84%252011.553-1.665%25205.204.704%252011.676-3.633%252015.797-2.822%25205.453-7.418-4.23-1.042-2.515%25206.99-2.43-8.563-1.625-2.092-3.771%25201.798-3.742%25207.374-12.578-1.302-10.54-5.344%25201.86-10.722-1.39-15.785.444-3.976%25202.563-9.258%25201.816-9.218%25207.56-1.177%25205.76-12.54%25207.217-7.253%252013.76%25204.323%25204.302%25204.14%252010.754%25207.199%252015.62%252011.313.442%252022.672-.26%252033.953.933-4.043%25204.041-11.295.196-16.667%25201.602-3.603-.01-7.206-.033-10.808-.074zm11.359-16.668c-4.435-3.667%25208.421-1.861%25202.337-4.491-2.818.462-5.673-1.28-1.177-2.188%25201.878-2.608%25203.328-4.422%25204.057-.156%25201.712%25202.397-2.594%252011.122-5.217%25206.835zm-52.195-.689c2.965-1.328%25207.267-10.393%25201.964-4.532-3.968%25203.73-12.944-2.34-9.82-4.418%25202.832%25207.454%252013.29-.292%25205.9-4.728-7.347-4.139-7.597-14.924.143-18.793%25203.004-3.224%252016.256-3.829%252010.524%25202.805-1.248%25202.598.555%252010.033-3.705%25204.681-1.725-2.67%25202.636-10.803-2.712-4.99-4.312%25204.762-.078%252012.998%25202.658%252015.93-2.668-4.427-6.398-10.034-2.645-15.003%25204.214-5.447-.369%25204.263%25204.063%25205.752%25204.73%25202.894%252010.285%25208.137%25206.832%252014.174-1.688%25203.084-5.224%25204.656-2.693-.031%25201.937-2.653-1.93-6.759-1.204-1.816-.13%25205.185-3.881%252010.613-9.305%252010.969zm.464-14.543c-.617-2.554-5.475-10.652-3.245-3.719.843%25201.414%25201.816%25202.838%25203.245%25203.72zm4.404-8.256c-2.218-1.444-.595-10.205-1.548-3.527.123%25201.293.584%25202.613%25201.548%25203.527zm11.47-3.775c-4.9-4.357%25206.822-3.385%25201.81-.323-.467.298-1.405-.246-1.81.323zm10.7-18.093c-1.811-2.135-11.79-7.108-3.99-4.744%25202.995%25202.47%25209.223%25202.422%252010.6%25201.409-1.19%25202.205-4.007%25204.33-6.61%25203.335zm28.946-1.797c-2.38-3.685%25203.39-3.024%25200%25200zm-39.311-2.165c1.505-7.758%252011.316%25201.402%252014.08-5.06%25201.257-6.952%25202.83-15.35%252011.22-16.83%25203.281-1.459%252012.46-1.79%25204.985%25201.279-7.02%25201.775-12.166%25207.769-12.687%252015.034-.993%25208.04-9.203%25204.646-14.152%25203.36-1.493-.087-2.828.921-3.446%25202.217zm9.366-3.05c-4.091-2.369-9.25-5.39-10.822-9.803-.193-4.002%25203.613%25203.62%25206.66%25201.114%25203.73-.555%25208.945-3.666%25209.29-7.133-1.946%25203.017-5.333%25207.087-8.596%25203.082-2.775.728-6.169%25201.709-2.886-1.872%25201.69-1.305%252010.958-1.269%25207.969-2.52-3.688%25202.029-8.54-5.505-5.352-6.307%25203.795%25205.774%25209.63.167%252014.888.65%25202.724-.527-3.312-6.28.288-4.907%25202.384%25202.95%25207.708%25201.822%252010.624%25204.392-.514-2.49-.318-8.022%25201.488-2.831.503%25204.663%25208.113%25202.904%25207.375%25203.96-2%25204.874%25206.252-3.35%25202.05%25202.306-1.5%25202.753-7.71%25204.256-3.765-.36%25203.364-6.948-4.708%25204.313-4.89-.983-4.517-.761-14.364%25201.26-15.373%25201.527%25205.2.003%252010.302-2.312%252015.512-1.159-6.798%25201.35-15.67%25202.305-18.245%25209.973-1.217%25203.838.367%252012.093-6.215%252010.872zm1.17-2.82c3.407-4.633-9.658-1.052-1.732.245.616.153%25201.151-.069%25201.732-.245zm15.511-20.547c-1.207-3.563-4.684.935%25200%25200zM68.693%252059.71c-5.548-4.057%25204.373-1.526%25200%25200zm1.993-2.442c-3.563-2.834.556-7.743%25202.643-7.276%25202.745-2.748%25204.746%25204.46-.162%25203.736-3.837-3.064-1.023%25203.205-2.481%25203.54zm5.626-7c-.31-4.038%25206.2-3"; } }
//SPDX-License-Identifier: MIT /// @title JPEG Mining /// @author Xatarrer /// @notice Unaudited pragma solidity ^0.8.0; import "./Array.sol"; import "./LibString.sol"; library ButerinCardsLib { struct ChunkUnpacked { address dataPointer; // uploadedKB is obtained by getting the data and checking its length. uint8 phaseId; // 0 = HTML, 1 = B&W, 2= Grey tones, 3 = Blue chroma, 4 = Red chroma, 5 = Resolution. Value passed by miner. uint16 tokenIdWithinPhase; // Value passed by miner. uint16 lastTokenIdInScan; // Necessary for knowing when the NFT will be available. Value passed by miner. uint8 quoteId; // Range [0, 44]. Fixed randomly during mining. uint8 bgDirectionId; // Range [0, 2]. Fixed randomly during mining. uint8 bgPaletteId; // Range [1, 10]. Fixed randomly during mining. uint8 Nicons; // Range [0, 2]. Based on the #mint of a miner modulo 3 uint32 Nbytes; // Counts bytes uploaded up to this chunk. uint32 seed; // Fixed randomly during mining. } function paramsHTML(uint256 tokenId, ChunkUnpacked memory chunk) external pure returns (bytes memory) { return bytes( string.concat( LibString.toString(tokenId + 1), "%2C", LibString.toString(chunk.phaseId), "%2C", LibString.toString(chunk.tokenIdWithinPhase), "%2C", LibString.toString(chunk.Nbytes / 1024), "%2C", LibString.toString(chunk.quoteId), "%2C", LibString.toString(chunk.bgDirectionId), "%2C", LibString.toString(chunk.bgPaletteId), "%2C", LibString.toString(chunk.Nicons), "%2C", LibString.toString(chunk.seed), "%2C%22" ) ); } function quoteName(uint quoteId) public pure returns (string memory) { string[45] memory quotes = [ "%F0%9F%A6%84%20WoW", "%F0%9F%A6%84%20The%20Hard%20Forkoooooor", "%F0%9F%A6%84%20Bitcoiner", "%F0%9F%A6%84%20Weeeeeeee!", "%F0%9F%A6%84%20Humanton", "%F0%9F%A6%84%20That%20Darn%20Rock", "%F0%9F%A6%84%20Jason", "%F0%9F%A6%84%20Ultra-Sound%20Money", "Incentives", "Sourceful", "Paradoxical", "Currency%20%26%20Protocol", "Abnormal", "Institutional", "Revolution", "Peer-to-peer", "Cross-platform", "Dub", "Fundamentalism", "Signal", "Programmable", "Scripter", "E-God", "Credibly%20Insane", "Exponential", "Asian%20Fusion", "Blockchain%20Centrist", "2017%20Dec%2013", "Slippery%20Slope%20Fallacy", "Buterin's%20Law", "Elliptic%20Brains", "Social%20Capital", "Order", "Nope", "Legitimate", "Theatrical", "Blockchain", "Metaverse", "Paradox%20of%20Diversity", "Freedom", "Reminder", "Pluralist", "Alfalfa", "Beware", "Sound" ]; return quotes[quoteId]; } function phaseName(uint phaseId) public pure returns (string memory) { string[6] memory phases = [ "Pencil%20Drawing", "Black%20%26%20White", "Grey%20Shades", "Blue%20Chroma", "Red%20Chroma", "Resolution" ]; return phases[phaseId]; } function bgDirection(uint bgDirectionId) public pure returns (string memory) { string[3] memory bgDirections = ["Horizontal", "Vertical", "Diagonal"]; return bgDirections[bgDirectionId]; } function bgPalette(uint bgPaletteId) public pure returns (string memory) { string[10] memory bgPalettes = [ "Oceanic%20Twilight", "Earthen%20Tones", "Calm%20Coastline", "Warm%20Sunset", "Tropical%20Skies", "Mystic%20Blossoms", "Oceanic%20Contrast", "Autumn%20Breeze", "Enchanted%20Forest", "Vibrant%20Spectrum" ]; return bgPalettes[bgPaletteId - 1]; } function cardNotAvailable(uint256 lastTokenIdInScan) external pure returns (string memory dataURI) { return string.concat( "data%3Aimage%2Fsvg%2Bxml%3Bcharset%3DUTF-8%2C%253Csvg%250D%250A%2520%2520%2520%2520viewBox%253D%2522-20%25200%252040%252030%2522%250D%250A%2520%2520%2520%2520xmlns%253D%2522http%253A%252F%252Fwww.w3.org%252F2000%252Fsvg%2522%250D%250A%2520%2520%2520%2520xmlns%253Axlink%253D%2522http%253A%252F%252Fwww.w3.org%252F1999%252Fxlink%2522%250D%250A%2520%2520%2520%2520style%253D%2522font-size%253A%252023%2525%2522%250D%250A%253E%250D%250A%2520%2520%2520%2520%253Ctext%2520x%253D%25220%2522%2520y%253D%25225%2522%2520text-anchor%253D%2522middle%2522%253EThis%2520card%253C%252Ftext%253E%250D%250A%2520%2520%2520%2520%253Ctext%2520x%253D%25220%2522%2520y%253D%252210%2522%2520text-anchor%253D%2522middle%2522%253Ewill%2520be%2520visible%253C%252Ftext%253E%250D%250A%2520%2520%2520%2520%253Ctext%2520x%253D%25220%2522%2520y%253D%252215%2522%2520text-anchor%253D%2522middle%2522%253Ewhen%2520card%2520%2523", LibString.toString(lastTokenIdInScan), "%253C%252Ftext%253E%250D%250A%2520%2520%2520%2520%253Ctext%2520x%253D%25220%2522%2520y%253D%252220%2522%2520text-anchor%253D%2522middle%2522%253Eis%2520mined.%253C%252Ftext%253E%250D%250A%253C%252Fsvg%253E%250D%250A" ); } function cardBackPiece4() external pure returns (string memory piece) { return ".828%25208.54-6.626%25202.396-1.748%25207.753-3.776%25202.757-.368-3.731%25201.454-7.517%25207.77-11.297%25206.995zm13.766-9.146c1.432-2.348%25205.907-3.241%25201.49-.842-.434.313-.786%25201.223-1.49.842z%2522%252F%253E%253Cpath%2520fill%253D%2522%25234ea2a6%2522%2520d%253D%2522M54.291%2520137.105c-11.816-.332-23.664-.112-35.443-1.265%25202.076-.516%25204.01-2.106%25203.14-2.782%25202.461%25201.042%25206.61-2.585%25201.805-1.548-7.001-.493%25202.024-5.8-1.018-10.03-2.747-4.168%25204.142-8.151%25204.955-3.387-.48%25205.004-1.58%252012.544%25201.252%252016.417h11.903c-5.18-3.617%25208.956-2.394%25201.658-3.734-2.88.288-4.808-1.187-2.171-3.247.853-6.79-11.322-9.534-6.531-16.58%25204.15-3.275%25205.73-7.556%25206.904-12.317%25206.453.103%252012.379-3.037%252018.503-4.809%25204.817%25204.8%252012.247.207%252017.631-.477-3.85-3.28-12.308-3.37-9.88-10.701-.891-5.11-7.461-8.144-5.953-13.852.187-2.586-.86-11.661%25201.481-5.185%25203.612%25202.898%25203.925%25207.41%25205.794%252010.49%25206.18-.322%25202.576-9.005%25203.304-13.164.224-2.375-1.394-11.042%25202.287-5.01.508%25204.707.008%25209.848.694%252014.789-.324%25206.677-11.087%25206.38-9.05-1.014-3.461-1.727-.532%25206.13%25201.715%25206.805%25204.529%25204.016-.129%252012.879%25207.235%252013.51%25206.835.423%25208.05%25206.516%25205.862%252011.874-.264%25205.065.046%252012.105-5.815%252013.911-5.136-4.211%25202.259-3.518%25203.592-5.538-1.038-1.388-8.929-.432-3.973-2.461%25201.798-3.742%25207.374-12.578-1.302-10.54-5.344%25201.86-10.722-1.39-15.785.444-3.976%25202.563-9.258%25201.816-9.218%25207.56-1.177%25205.76-12.54%25207.217-7.253%252013.76%25204.323%25204.302%25204.14%252010.754%25207.199%252015.62%252011.313.442%252022.672-.26%252033.953.933-4.043%25204.041-11.295.196-16.667%25201.602-3.603-.01-7.206-.033-10.808-.074zm11.359-16.668c-4.435-3.667%25208.421-1.861%25202.337-4.491-2.818.462-5.673-1.28-1.177-2.188%25201.878-2.608%25203.328-4.422%25204.057-.156%25201.712%25202.397-2.594%252011.122-5.217%25206.835zm-52.195-.689c2.965-1.328%25207.267-10.393%25201.964-4.532-3.968%25203.73-12.944-2.34-9.82-4.418%25202.832%25207.454%252013.29-.292%25205.9-4.728-7.347-4.139-7.597-14.924.143-18.793%25203.004-3.224%252016.256-3.829%252010.524%25202.805-1.248%25202.598.555%252010.033-3.705%25204.681-1.726-2.67%25202.636-10.802-2.71-4.992-4.002%25205.093-.68%252014.904%25204.69%252016.967%25206.516-3.126-4.114-7.218-4.381-11.557-.75-2.785%25201.157-5.387.967-.771%25201.432%25205.034%25208.216%25207.242%25208.124%252013.425-.734%25203.085%25203.498%25201.121.145%25204.278-4.922%25205.244%25201.854-4.196-2.375-5.767.13%25205.958-2.648%252012.751-9.466%252013.402zm.464-14.543c-.617-2.554-5.475-10.652-3.245-3.719.843%25201.414%25201.816%25202.838%25203.245%25203.72zm55.52-31.921c-2.38-3.685%25203.39-3.024%25200%25200zm-39.311-2.165c-1.416-6.001%252011.871-2.063%25204.173-2.13-1.633-.105-3.54.438-4.173%25202.13zm9.366-3.05c-4.091-2.369-9.25-5.39-10.822-9.803-.193-4.002%25203.613%25203.62%25206.66%25201.114%25203.73-.555%25208.945-3.666%25209.29-7.133-1.946%25203.017-5.333%25207.087-8.596%25203.082-2.775.728-6.169%25201.709-2.886-1.872%25201.69-1.305%252010.958-1.269%25207.969-2.52-3.688%25202.029-8.54-5.505-5.352-6.307%25203.795%25205.774%25209.63.167%252014.888.65%25202.724-.527-3.312-6.28.288-4.907%25202.384%25202.95%25207.708%25201.822%252010.624%25204.392-.514-2.49-.318-8.022%25201.488-2.831.503%25204.663%25208.113%25202.904%25207.375%25203.96-2%25204.874%25206.252-3.35%25202.05%25202.306-1.5%25202.753-7.71%25204.256-3.765-.36%25203.364-6.948-4.708%25204.313-4.89-.983-4.517-.761-14.364%25201.26-15.373%25201.527%25205.2.003%252010.302-2.312%252015.512-1.159-6.798%25201.35-15.67%25202.305-18.245%25209.973-1.217%25203.838.367%252012.093-6.215%252010.872zm1.17-2.82c3.407-4.633-9.658-1.052-1.732.245.616.153%25201.151-.069%25201.732-.245zm15.511-20.547c-1.207-3.563-4.684.935%25200%25200zM68.693%252059.71c-5.548-4.057%25204.373-1.526%25200%25200zm6.278-7.368c-6.526-6.566%25206.88-1.223%25200%25200z%2522%252F%253E%253Cpath%2520fill%253D%2522%2523bb438c%2522%2520d%253D%2522M54.291%2520137.105c-11.816-.332-23.664-.112-35.443-1.265%25202.076-.516%25204.01-2.106%25203.14-2.782%25202.461%25201.042%25206.61-2.585%25201.805-1.548-7.001-.493%25202.024-5.8-1.018-10.03-2.67-4.147%25203.904-8.095%25205-3.448-.768%25205.124-1.225%252011.884.864%252016.478h12.246c-5.18-3.617%25208.956-2.394%25201.658-3.734-2.88.288-4.808-1.187-2.171-3.247.853-6.79-11.322-9.534-6.531-16.579%25204.15-3.276%25205.73-7.557%25206.904-12.318%25206.453.103%252012.379-3.037%252018.503-4.809%25204.817%25204.8%252012.247.207%252017.631-.477-3.85-3.28-12.308-3.37-9.88-10.701-.891-5.11-7.461-8.144-5.953-13.852.187-2.586-.86-11.661%25201.481-5.185%25203.612%25202.898%25203.925%25207.41%25205.794%252010.49%25206.18-.322%25202.576-9.005%25203.304-13.164.372-2.166-1.578-10.744%25202.151-5.247.738%25204.773.157%252010.043.799%252015.083-.038%25206.414-11.118%25206.426-8.88-.705-3.097-3.39-1.33%25205.412%25201.324%25206.08%25204.73%25204.496.125%252013.918%25208.513%252014.2%25208.325.826%25205.123%25208.843%25204.62%252014.276.835%25203.798-2.372%252013.305-6.722%25209.95-3.751-4.128%25209.391-2.733%25202.772-5.073-1.986.561-5.932-.851-2.03-1.698%25201.798-3.742%25207.374-12.578-1.302-10.54-5.344%25201.86-10.722-1.39-15.785.444-3.976%25202.563-9.258%25201.816-9.218%25207.56-1.177%25205.76-12.54%25207.217-7.253%252013.76%25204.323%25204.302%25204.14%252010.754%25207.199%252015.62%252011.313.442%252022.672-.26%252033.953.933-4.043%25204.041-11.295.196-16.667%25201.602-3.603-.01-7.206-.033-10.808-.074zm11.359-16.668c-4.435-3.667%25208.421-1.861%25202.337-4.491-2.818.462-5.673-1.28-1.177-2.188%25201.878-2.608%25203.328-4.422%25204.057-.156%25201.712%25202.397-2.594%252011.122-5.217%25206.835zm-52.195-.689c2.965-1.328%25207.267-10.393%25201.964-4.532-3.86%25203.762-13.056-2.4-9.715-4.296%25203.046%25207.013%252012.95.01%25206.116-4.577-2.288-2.012-10.037-9.375-2.621-8.432-.42-3.242%25205.62-9.401%25201.38-3.139-2.272%25202.99%25201.69%252011.017%25202.892%25209.286-.646-2.26-5.228-7.29-.54-5.011%25201.5-2.991.345-3.77%25201.574-.077.19%25203.943%25207.555%252011.977%25207.812%25204.592-2.35-3.465-8.896-8.167-5.484-12.064-1.387%25207.178%25209.927%25209.852%25207.93%252017.108-.406%25202.358%25204.267.685.726%25203.405-1.819%25202.57-3.914%25202.05-1.39-.565%25201.678-2.6-2.433-7.987-1.492-2.311.148%25205.073-4.011%252010.177-9.152%252010.613zm7.386-22.997c-4.707-2.048%25205.25-13.376.835-5.89-1.048%25201.426%25201.261%25205.786-.835%25205.89zm48.598-23.467c-2.38-3.685%25203.39-3.024%25200%25200zm-39.311-2.165c-1.416-6.001%252011.871-2.063%25204.173-2.13-1.633-.105-3.54.438-4.173%25202.13zm9.366-3.05c-4.091-2.369-9.25-5.39-10.822-9.803-.193-4.002%25203.613%25203.62%25206.66%25201.114%25203.73-.555%25208.945-3.666%25209.29-7.133-1.946%25203.017-5.333%25207.087-8.596%25203.082-2.775.728-6.169%25201.709-2.886-1.872%25201.69-1.305%252010.958-1.269%25207.969-2.52-3.687%25202.025-8.537-5.497-5.354-6.31%25203.588%25205.81%25209.195.293%252014.181.824%25204.734%25201.576%25209.646.674%252014.618%25201.32%25202.677.038%25208.273-4.197%25205.436%25201.182%25202.315-1.258%25205.569-4.222%25202.645.22-1.455%25202.746-8.046%25204.27-3.916-.373%25203.326-6.875-4.738%25204.359-4.904-.943-4.517-.761-14.364%25201.26-15.373%25201.527%25205.2.003%252010.302-2.312%252015.512-1.159-6.798%25201.35-15.67%25202.305-18.245%25209.973-1.217%25203.838.367%252012.093-6.215%252010.872zm1.17-2.82c3.407-4.633-9.658-1.052-1.732.245.616.153%25201.151-.069%25201.732-.245zm28.029-5.54c-5.548-4.056%25204.373-1.525%25200%25200zm6.278-7.367c-6.526-6.566%25206.88-1.223%25200%25200zm-23.713-8.24c-3.366-2.186.323-6.77.17-1.577-.203.032.682%25202.179-.17%25201.577z%2522%252F%253E%253Cpath%2520fill%253D%2522%25235c5d98%2522%2520d%253D%2522M54.291%2520137.105c-11.816-.332-23.664-.112-35.443-1.265%25202.148-.485%25203.906-2.175%25203.252-2.776%25206.22%25201.38%25207.008-11.583.793-10.188-2.084-3.796.916-9.775%25204.697-5.707-.294%25205.685-1.312%252011.858.899%252017.195%25203.128.428%25206.503-.006%25209.756.146%25204.633%25201.241-.888-3.75%25204.734-2.523%25206.365.072-1.428-11.851-3.016-7.372-3.508-4.414-11.384-10.982-4.093-16.032%25205.205-3.024%25201.84-12.048%25209.046-10.405%25206.673.04%252012.319-6.91%252017.98-2.245%25204.302-.665%252011.386-.543%252013.867-3.034-4.603-2.18-12.08-3.698-9.938-10.532-1.42-4.92-7.028-8.295-5.794-13.935.139-2.552-.725-11.233%25201.496-4.824%25203.612%25202.898%25203.925%25207.41%25205.794%252010.49%25206.18-.322%25202.576-9.005%25203.304-13.164.372-2.166-1.578-10.744%25202.151-5.247.738%25204.773.157%252010.043.799%252015.083-.038%25206.414-11.118%25206.426-8.88-.705-3.097-3.39-1.33%25205.412%25201.324%25206.08%25204.73%25204.496.125%252013.918%25208.513%252014.2%25208.325.826%25205.123%25208.843%25204.62%252014.276.777%25203.8-2.25%252013.049-6.633%252010.105-2.446-4.885%25209.415-2.626%25204.951-9.21-8.511%25201.84%25204.849-8.562-3.132-8.456-5.254.677-10.589%25201.112-15.68-.17-5.257%25202.444-11.79%25202.522-12.216%25209.222-1.968%25205.127-12.361%25207.206-6.44%252013.509%25204.782%25203.768%25202.996%252012.408%25207.87%252015.061%252010.963.362%252021.966-.26%252032.894.895-4.043%25204.041-11.295.196-16.667%25201.602-3.603-.01-7.206-.033-10.808-.074zm11.359-16.668c-3.506-4.237%25206.951-.457%25204.37-6.157-.754-3.32-1.22-4.513.847-.677%25201.711%25202.397-2.595%252011.12-5.217%25206.834zm-56.332-4.509c-3.912%25201.694-5.899-9.464-2.664-3.633%25206.035%25205.979%252011.062-6.072%25203.197-7.643-1.868-1.969-6.685-7.438-1.187-6.706%25201.462-1.865%25205.019-10.046%25202.115-3.657-2.55%25203.058%25201.31%252011.426%25202.692%25209.769-.625-2.182-5.217-7.386-.588-4.926%25201.5-2.393.45-4.46%25201.45-.507%25201.938%25204.63%25207.309%252010.38%25202.924%252015.222-2.03%25202.055-5.186%25202.588-7.94%25202.081zM20.84%252096.751c-4.707-2.048%25205.25-13.376.835-5.89-1.048%25201.426%25201.261%25205.786-.835%25205.89zm48.598-23.467c-2.38-3.685%25203.39-3.024%25200%25200zm-.746-13.574c-5.548-4.057%25204.373-1.526%25200%25200zm-37.107-3.226c-.522-6.111%252010.462-2.279%25209.682-5.974-4.124%25201.722-7.952-3.136-5.974-6.966%25203.2%25208.274%252012.377-.89%252018.016%25202.831%25205.78-.373%252011.771%25201.782%252016.835-1.541%25201.512-.747-1.629%25205.093%25201.8%25202.074%25205.76-3.085-6.02%25208.277-4.052%25202.485%25202.137-2.701%25202.115-6.097-1.292-1.997-2.74%25202.919-3.359-2.535-7.064-.64-5.492%25201.098-13.577-.493-15.437%25206.32-2.99%25207.387-7.835-.2-12.514%25203.408zm19.672-12.382c-3.366-2.186.323-6.77.17-1.577-.203.032.682%25202.179-.17%25201.577z%2522%252F%253E%253Cpath%2520fill%253D%2522%252335384c%2522%2520d%253D%2522M53.13%2520137.013c-11.361-.278-22.747-.16-34.074-1.202.612-1.018%25205.354-.648%25202.204-2.927%25207.724%25201.916%25205.434-8.035%25205.697-12.567%25201.527%25201.516-1.744%252010.94%25201.902%252014.02%25203.434-.07%252010.517%25201.079%252011.4-.736-1.171-3.17%25207.848.022%25204.741-5.113-2.305-5.067-4.427-12.766-10.055-14.42-5.294-1.99%25204.885-7.295%25204.948-11.776.965-7.667%252012.052-2.317%252015.995-7.829%25204.864-1.034%25208.668%25203.7%252013.653.646%25204.338-.207%252010.717-1.854%25203.527-4.104-8.196-.356-4.635-9.348-8.906-13.935-4.538-3.784-2.913-9.648-3.09-14.875-.438-2.747%25202.425%25204.057%25204.375%25204.932%25202.366%25202.315.446%25209.645%25205.76%25206.313%25201.484-5.301.282-11.75.096-17.187.434-6.352%25204.779%25202.883%25202.558%25205.411%25201.494%25205.203%25201.417%252016.047-6.751%252013.628-2.011-1.208-1.431-9.897-3.203-4.199.833%25204.556%25206.3%25207.137%25205.963%252012.17-2.02%25207.53%25207.547%25205.856%252010.842%252010.138%25201.824%25205.71-1.099%252012.654-2.15%252018.701-.78%25204.757-6.825%25205.004-4.81-.04%25207.417.382%25205.157-8.89%25204.138-13.61-3.38-4.06-10.606%25201.478-15.042-1.444-4.995.424-12.718%25201.258-14.714%25206.688.327%25206.902-11.546%25207.345-8.345%252014.319%25204.206%25204.6%25205.633%252012.37%25208.199%252016.696%25209.659.282%252019.329.055%252028.982.555-2.002%25204.238-10.428.639-14.85%25201.815-2.997-.012-5.994-.034-8.99-.068zm13.307-15.209c-5.3-5.132%25205.594-2.024%25203.868-7.423.073-4.554%25201.9%25205.297-1.632%25206.369-.447.33-1.51%25201.838-2.236%25201.054zm-52.843-16.289c-5.844-2.461-4.009-12.912-1.208-13.868-3.783%25204.309-2.69%252011.493%25201.208%252013.868zm7.199-8.84c-3.9-2.46%25204.68-13.187.814-5.155-.492%25201.35.803%25204.898-.814%25205.156zm48.52-23.885c-1.491-3.886%25202.915-.93%25200%25200zm-1.557-13.345c-3.457-5.99%25205.857%25201.238%25200%25200zm-.528-8.177c.784-2.42%25204.42-8.375-.39-4.219-6.722%25203.902%25207.535-6.662%25202.979%25201.12%25201.954-1.91%25205.38-2.948%25202.255.352-.53%25203.145-3.753.417-4.844%25202.747z%2522%252F%253E%253C%252Fg%253E%253Crect%2520width%253D%2522100%2522%2520height%253D%2522140%2522%2520rx%253D%25225%2522%2520clip-path%253D%2522url(%2523clipFrame)%2522%252F%253E%253Cg%2520font-family%253D%2522Orbitron%2522%2520text-anchor%253D%2522middle%2522%2520filter%253D%2522url(%2523rainbowGlow)%2522%253E%253Ctext%2520x%253D%252250%2522%2520y%253D%252235%2522%2520font-size%253D%25223em%2522%253EButerin%2520Card%253C%252Ftext%253E%253C%252Fg%253E%253Ccircle%2520cx%253D%252250%2522%2520cy%253D%252285%2522%2520r%253D%252250%2522%2520fill%253D%2522url(%2523lightGlow)%2522%252F%253E%253Cuse%2520href%253D%2522%2523eth_pencil%2522"; } function cardBackPiece5(uint8 phaseId) external pure returns (string memory piece) { bytes[] memory bytesSegments = new bytes[](12); string memory glowStr = "%2520filter%253D%2522url(%2523rainbowGlowLarge)%2522"; if (phaseId == 0) bytesSegments[0] = bytes(glowStr); bytesSegments[1] = bytes("%252F%253E%253Cuse%2520href%253D%2522%2523eth_bw%2522"); if (phaseId == 1) bytesSegments[2] = bytes(glowStr); bytesSegments[3] = bytes("%252F%253E%253Cuse%2520href%253D%2522%2523eth_grey%2522"); if (phaseId == 2) bytesSegments[4] = bytes(glowStr); bytesSegments[5] = bytes("%252F%253E%253Cuse%2520href%253D%2522%2523eth_color_a%2522"); if (phaseId == 3) bytesSegments[6] = bytes(glowStr); bytesSegments[7] = bytes("%252F%253E%253Cuse%2520href%253D%2522%2523eth_color_b%2522"); if (phaseId == 4) bytesSegments[8] = bytes(glowStr); bytesSegments[9] = bytes("%252F%253E%253Cuse%2520href%253D%2522%2523eth_diamond%2522"); if (phaseId == 5) bytesSegments[10] = bytes(glowStr); bytesSegments[11] = bytes("%252F%253E%253C%252Fsvg%253E"); return string(Array.join(bytesSegments)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Efficient library for creating string representations of integers. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibString.sol) library LibString { function toString(uint256 value) internal pure returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but we allocate 160 bytes // to keep the free memory pointer word aligned. We'll need 1 word for the length, 1 word for the // trailing zeros padding, and 3 other words for a max of 78 digits. In total: 5 * 32 = 160 bytes. let newFreeMemoryPointer := add(mload(0x40), 160) // Update the free memory pointer to avoid overriding our string. mstore(0x40, newFreeMemoryPointer) // Assign str to the end of the zone of newly allocated memory. str := sub(newFreeMemoryPointer, 32) // Clean the last word of memory it may not be overwritten. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { // Move the pointer 1 byte to the left. str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing temp until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } // Compute and cache the final total length of the string. let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 32) // Store the string's length at the start of memory allocated for our string. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Read and write to persistent storage at a fraction of the cost. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol) /// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol) library SSTORE2 { uint256 internal constant DATA_OFFSET = 1; // We skip the first byte as it's a STOP opcode to ensure the contract can't be called. /*////////////////////////////////////////////////////////////// WRITE LOGIC //////////////////////////////////////////////////////////////*/ function write(bytes memory data) internal returns (address pointer) { // Prefix the bytecode with a STOP opcode to ensure it cannot be called. bytes memory runtimeCode = abi.encodePacked(hex"00", data); bytes memory creationCode = abi.encodePacked( //---------------------------------------------------------------------------------------------------------------// // Opcode | Opcode + Arguments | Description | Stack View // //---------------------------------------------------------------------------------------------------------------// // 0x60 | 0x600B | PUSH1 11 | codeOffset // // 0x59 | 0x59 | MSIZE | 0 codeOffset // // 0x81 | 0x81 | DUP2 | codeOffset 0 codeOffset // // 0x38 | 0x38 | CODESIZE | codeSize codeOffset 0 codeOffset // // 0x03 | 0x03 | SUB | (codeSize - codeOffset) 0 codeOffset // // 0x80 | 0x80 | DUP | (codeSize - codeOffset) (codeSize - codeOffset) 0 codeOffset // // 0x92 | 0x92 | SWAP3 | codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) // // 0x59 | 0x59 | MSIZE | 0 codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) // // 0x39 | 0x39 | CODECOPY | 0 (codeSize - codeOffset) // // 0xf3 | 0xf3 | RETURN | // //---------------------------------------------------------------------------------------------------------------// hex"60_0B_59_81_38_03_80_92_59_39_F3", // Returns all code in the contract except for the first 11 (0B in hex) bytes. runtimeCode // The bytecode we want the contract to have after deployment. Capped at 1 byte less than the code size limit. ); assembly { // Deploy a new contract with the generated creation code. // We start 32 bytes into the code to avoid copying the byte length. pointer := create(0, add(creationCode, 32), mload(creationCode)) } require(pointer != address(0), "DEPLOYMENT_FAILED"); } /*////////////////////////////////////////////////////////////// READ LOGIC //////////////////////////////////////////////////////////////*/ function read(address pointer) internal view returns (bytes memory) { return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET); } function read(address pointer, uint256 start) internal view returns (bytes memory) { start += DATA_OFFSET; return readBytecode(pointer, start, pointer.code.length - start); } function read( address pointer, uint256 start, uint256 end ) internal view returns (bytes memory) { start += DATA_OFFSET; end += DATA_OFFSET; require(pointer.code.length >= end, "OUT_OF_BOUNDS"); return readBytecode(pointer, start, end - start); } /*////////////////////////////////////////////////////////////// INTERNAL HELPER LOGIC //////////////////////////////////////////////////////////////*/ function readBytecode( address pointer, uint256 start, uint256 size ) private view returns (bytes memory data) { assembly { // Get a pointer to some free memory. data := mload(0x40) // Update the free memory pointer to prevent overriding our data. // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)). // Adding 31 to size and running the result through the logic above ensures // the memory pointer remains word-aligned, following the Solidity convention. mstore(0x40, add(data, and(add(add(size, 32), 31), not(31)))) // Store the size of the data in the first 32 byte chunk of free memory. mstore(data, size) // Copy the code into memory right after the 32 bytes we used to store the size. extcodecopy(pointer, add(data, 32), start, size) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"string","name":"jpegHeader","type":"string"},{"internalType":"uint256","name":"tokenIdFirstBlueChrominance","type":"uint256"},{"internalType":"uint256","name":"tokenIdFirstRedChrominance","type":"uint256"},{"internalType":"uint256","name":"NemptyBlueColorChunks","type":"uint256"},{"internalType":"uint256","name":"NemptyRedColorChunks","type":"uint256"}],"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":"minerAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"uploadedKB","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"phaseId","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"tokenIdWithinPhase","type":"uint16"},{"indexed":false,"internalType":"uint8","name":"quoteId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"bgDirectionId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"bgPaletteId","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"lastTokenIdInScan","type":"uint16"},{"indexed":false,"internalType":"uint32","name":"Nbytes","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"Nicons","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"seed","type":"uint32"}],"name":"Mined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"JPEG_HEADER_POINTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N_EMPTY_BLUE_COLOR_CHUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"N_EMPTY_RED_COLOR_CHUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Nmined","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID_FIRST_BLUE_CHROMINANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID_FIRST_RED_CHROMINANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURLAnimation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"htmlHeader","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":"jpegFooter","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"dataChunk","type":"string"},{"internalType":"uint8","name":"phaseId","type":"uint8"},{"internalType":"uint16","name":"tokenIdWithinPhase","type":"uint16"},{"internalType":"uint16","name":"lastTokenIdInScan","type":"uint16"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"onchainAnimation","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURLAnimation","type":"string"}],"name":"setBaseURLAnimation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unpackChunk","outputs":[{"components":[{"internalType":"address","name":"dataPointer","type":"address"},{"internalType":"uint8","name":"phaseId","type":"uint8"},{"internalType":"uint16","name":"tokenIdWithinPhase","type":"uint16"},{"internalType":"uint16","name":"lastTokenIdInScan","type":"uint16"},{"internalType":"uint8","name":"quoteId","type":"uint8"},{"internalType":"uint8","name":"bgDirectionId","type":"uint8"},{"internalType":"uint8","name":"bgPaletteId","type":"uint8"},{"internalType":"uint8","name":"Nicons","type":"uint8"},{"internalType":"uint32","name":"Nbytes","type":"uint32"},{"internalType":"uint32","name":"seed","type":"uint32"}],"internalType":"struct ButerinCardsLib.ChunkUnpacked","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101e0604052606e6101408181529062005fde61016039600d90620000259082620002c9565b503480156200003357600080fd5b506040516200604c3803806200604c8339810160408190526200005691620003bb565b6040518060400160405280600d81526020016c4275746572696e20436172647360981b81525060405180604001604052806007815260200166564954414c494b60c81b8152508160009081620000ad9190620002c9565b506001620000bc8282620002c9565b505050620000d9620000d36200012060201b60201c565b62000124565b8560808181525050620000f7856200017660201b62002a101760201c565b6001600160a01b03166101205260a09390935260c09190915260e0526101005250620005029050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080826040516020016200018c9190620004a4565b6040516020818303038152906040529050600081604051602001620001b29190620004cc565b60405160208183030381529060405290508051602082016000f092506001600160a01b0383166200021d5760405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b604482015260640160405180910390fd5b5050919050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200024f57607f821691505b6020821081036200027057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002c457600081815260208120601f850160051c810160208610156200029f5750805b601f850160051c820191505b81811015620002c057828155600101620002ab565b5050505b505050565b81516001600160401b03811115620002e557620002e562000224565b620002fd81620002f684546200023a565b8462000276565b602080601f8311600181146200033557600084156200031c5750858301515b600019600386901b1c1916600185901b178555620002c0565b600085815260208120601f198616915b82811015620003665788860151825594840194600190910190840162000345565b5085821015620003855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015620003b257818101518382015260200162000398565b50506000910152565b60008060008060008060c08789031215620003d557600080fd5b865160208801519096506001600160401b0380821115620003f557600080fd5b818901915089601f8301126200040a57600080fd5b8151818111156200041f576200041f62000224565b604051601f8201601f19908116603f011681019083821181831017156200044a576200044a62000224565b816040528281528c60208487010111156200046457600080fd5b6200047783602083016020880162000395565b60408c015160608d015160808e015160a0909e01519c9f929e50909c909b909a5098509650505050505050565b6000815260008251620004bf81600185016020870162000395565b9190910160010192915050565b6a600b5981380380925939f360a81b81528151600090620004f581600b85016020870162000395565b91909101600b0192915050565b60805160a05160c05160e051610100516101205161599762000647600039600081816104e401526110cb0152600081816103de01528181610ed901528181610f4901528181611135015281816111ed015281816112f40152818161140a01528181611504015281816115f10152818161167d01528181611735015261188c01526000818161050b01528181610efa01528181610fd5015281816111590152818161120e01528181611315015281816113ac0152818161142b01528181611525015281816115c7015281816116150152818161169e01528181611759015261185001526000818161022d01528181610f6a0152818161127d015281816112b2015281816114c201526118e901526000818161044601528181610f8b015281816111b0015281816112d3015281816114e301526118c801526000612c2b01526159976000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063bb295ee1116100ad578063de597c0a1161007c578063de597c0a14610488578063e985e9c514610490578063f2fde38b146104cc578063f3a84acc146104df578063fa66c3d01461050657600080fd5b8063bb295ee114610426578063c87b56dd1461042e578063d3d49feb14610441578063dd4607cf1461046857600080fd5b8063a22cb465116100e9578063a22cb465146103c6578063a68f9de4146103d9578063b37e6bec14610400578063b88d4fde1461041357600080fd5b806370a0823114610392578063715018a6146103a55780638da5cb5b146103ad57806395d89b41146103be57600080fd5b80632f745c59116101925780635554da6d116101615780635554da6d146103395780635a2bc22d1461034c5780636352211e1461035f57806365a4234e1461037257600080fd5b80632f745c59146102e057806342842e0e146102f3578063460ea1db146103065780634f6ccce71461032657600080fd5b8063095ea7b3116101ce578063095ea7b31461029d5780630c15bad5146102b257806318160ddd146102c557806323b872dd146102cd57600080fd5b806301ffc9a7146102005780630535dfa71461022857806306fdde031461025d578063081812fc14610272575b600080fd5b61021361020e366004613dd8565b61052d565b60405190151581526020015b60405180910390f35b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161021f565b610265610558565b60405161021f9190613e45565b610285610280366004613e58565b6105ea565b6040516001600160a01b03909116815260200161021f565b6102b06102ab366004613e8d565b610611565b005b6102b06102c0366004613f12565b61072b565b60085461024f565b6102b06102db366004613fef565b6109d3565b61024f6102ee366004613e8d565b610a04565b6102b0610301366004613fef565b610a9a565b610319610314366004613e58565b610ab5565b60405161021f91906140f8565b61024f610334366004613e58565b610b7f565b6102b0610347366004614107565b610c12565b61024f61035a366004613e58565b610c27565b61028561036d366004613e58565b610c48565b61024f610380366004614149565b600b6020526000908152604090205481565b61024f6103a0366004614149565b610ca8565b6102b0610d2e565b600a546001600160a01b0316610285565b610265610d42565b6102b06103d4366004614164565b610d51565b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b61026561040e366004613e58565b610d60565b6102b061042136600461420f565b611a46565b610265611a7e565b61026561043c366004613e58565b611aa1565b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b6040805180820190915260048152632f396b3d60e01b6020820152610265565b610265612909565b61021361049e3660046142ba565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102b06104da366004614149565b612997565b6102857f000000000000000000000000000000000000000000000000000000000000000081565b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b0319821663780e9d6360e01b1480610552575061055282612ab5565b92915050565b606060008054610567906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610593906142ed565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b60006105f582612b05565b506000908152600460205260409020546001600160a01b031690565b600061061c82610c48565b9050806001600160a01b0316836001600160a01b03160361068e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106aa57506106aa813361049e565b61071c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610685565b6107268383612b64565b505050565b600061073660085490565b90506107488888838989898989612bd2565b610750613d6e565b61075a8183612c96565b61079989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1092505050565b6001600160a01b0316815260ff871660208083019190915261ffff8088166040808501919091529087166060840152336000908152600b9092529020546107e29060039061433d565b60ff1660e082015263ffffffff8816610100820152811561082c5761080b610314600184614367565b61010001518161010001818151610822919061437a565b63ffffffff169052505b600c6108c882600060e082610120015163ffffffff16901b60c783610100015163ffffffff16901b60c58460e0015160ff16901b60c18560c0015160ff16901b60bf8660a0015160ff16901b60b9876080015160ff16901b60ae886060015161ffff16901b60a3896040015161ffff16901b60a08a6020015160ff16901b8a600001516001600160a01b03161717171717171717179050919050565b815460018101835560009283526020909220909101556108e833836131ed565b336000908152600b602052604081208054916109038361439e565b91905055508189899050336001600160a01b03167f3b863996c61e31761bc3542c71c6bd5fdb28676b43035bbebb7116d4b54ba6f98a8a86608001518760a001518860c001518d8a61010001518b60e001518c61012001516040516109c09998979695949392919060ff998a16815261ffff9889166020820152968916604088015294881660608701529287166080860152941660a084015263ffffffff93841660c084015290931660e082015291166101008201526101200190565b60405180910390a4505050505050505050565b6109dd3382613386565b6109f95760405162461bcd60e51b8152600401610685906143b7565b610726838383613405565b6000610a0f83610ca8565b8210610a715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610685565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61072683838360405180602001604052806000815250611a46565b610abd613d6e565b6000600c8381548110610ad257610ad2614404565b6000918252602091829020015460408051610140810182526001600160a01b038316815260a083811c6007169482019490945260a383901c6107ff9081169282019290925260ae83901c909116606082015260b982901c603f16608082015260bf82901c60039081169382019390935260c182901c600f1660c082015260c582901c90921660e08084019190915260c782901c6301ffffff166101008401521c6101208201529392505050565b6000610b8a60085490565b8210610bed5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610685565b60088281548110610c0057610c00614404565b90600052602060002001549050919050565b610c1a613576565b600d610726828483614468565b600c8181548110610c3757600080fd5b600091825260209091200154905081565b6000818152600260205260408120546001600160a01b0316806105525760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610685565b60006001600160a01b038216610d125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610685565b506001600160a01b031660009081526003602052604090205490565b610d36613576565b610d4060006135d0565b565b606060018054610567906142ed565b610d5c338383613622565b5050565b6000818152600260205260409020546060906001600160a01b0316610dbe5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610685565b6000610dc983610ab5565b9050610dd460085490565b816060015161ffff1610610e65576060810151604051635615b97560e11b815261ffff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063ac2b72ea90602401600060405180830381865af4158015610e3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e639190810190614558565b505b6000610e716000610ab5565b60600151610e809060016145a1565b61ffff169050600080836020015160ff1660001461102c57836020015160ff1660011480610eb55750836020015160ff166002145b61101357836020015160ff16600314610fd357836020015160ff16600414610f47577f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085606001516005610f2a91906145a1565b61ffff16610f389190614367565b610f429190614367565b611041565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086606001516005610fbb91906145a1565b61ffff16610fc991906145bc565b610f389190614367565b7f00000000000000000000000000000000000000000000000000000000000000008460600151600561100591906145a1565b61ffff16610f429190614367565b60608401516110239060056145a1565b61ffff16611041565b606084015161103c9060036145a1565b61ffff165b67ffffffffffffffff811115611059576110596141a0565b60405190808252806020026020018201604052801561108c57816020015b60608152602001906001900390816110775790505b509050611097611a7e565b816000815181106110aa576110aa614404565b6020026020010181905250600080856020015160ff16111561191c576110ef7f00000000000000000000000000000000000000000000000000000000000000006136f0565b8260028151811061110257611102614404565b6020026020010181905250838560600151600161111f91906145a1565b61ffff1661112d9190614367565b9250606060007f000000000000000000000000000000000000000000000000000000000000000061117e7f0000000000000000000000000000000000000000000000000000000000000000886145bc565b61118891906145bc565b90505b61119585876145bc565b8110156113a457866020015160ff1660041415806111d257507f000000000000000000000000000000000000000000000000000000000000000081105b1561127b576111e96111e382610ab5565b516136f0565b91507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006112378884614367565b6112419190614367565b61124b9190614367565b6112569060036145bc565b92508184848151811061126b5761126b614404565b6020026020010181905250611392565b7f00000000000000000000000000000000000000000000000000000000000000008110611392576112ae6111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061133e8a86614367565b6113489190614367565b6113529190614367565b61135c91906145bc565b6113669190614367565b6113719060036145bc565b92508184848151811061138657611386614404565b60200260200101819052505b8061139c8161439e565b91505061118b565b50845b6113d17f0000000000000000000000000000000000000000000000000000000000000000876145bc565b8110156115bf57866020015160ff16600114806113f55750866020015160ff166002145b156114a3576114066111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008761145588856145bc565b61145f9190614367565b6114699190614367565b6114739190614367565b61147e9060036145bc565b92508184848151811061149357611493614404565b60200260200101819052506115ad565b866020015160ff166004036115ad576114be6111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008961154f8a876145bc565b6115599190614367565b6115639190614367565b61156d9190614367565b61157791906145bc565b6115819190614367565b61158c9060036145bc565b9250818484815181106115a1576115a1614404565b60200260200101819052505b806115b78161439e565b9150506113a7565b5060006115ec7f0000000000000000000000000000000000000000000000000000000000000000876145bc565b90505b7f000000000000000000000000000000000000000000000000000000000000000061163a7f0000000000000000000000000000000000000000000000000000000000000000886145bc565b61164491906145bc565b8110156117e657866020015160ff16600114806116685750866020015160ff166002145b15611716576116796111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000876116c888856145bc565b6116d29190614367565b6116dc9190614367565b6116e69190614367565b6116f19060036145bc565b92508184848151811061170657611706614404565b60200260200101819052506117d4565b866020015160ff166003036117d4576117316111e382610ab5565b91507f000000000000000000000000000000000000000000000000000000000000000061177f7f000000000000000000000000000000000000000000000000000000000000000060026145cf565b8761178a88856145bc565b6117949190614367565b61179e9190614367565b6117a89190614367565b6117b39060036145bc565b9250818484815181106117c8576117c8614404565b60200260200101819052505b806117de8161439e565b9150506115ef565b506040805180820190915260048152632f396b3d60e01b60208201528361180e8460016145bc565b8151811061181e5761181e614404565b6020026020010181905250856020015160ff16600314806118465750856020015160ff166005145b15611878576118757f000000000000000000000000000000000000000000000000000000000000000085614367565b93505b6004866020015160ff16106118b4576118b17f000000000000000000000000000000000000000000000000000000000000000085614367565b93505b856020015160ff1660040361191a5761190d7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000614367565b6119179085614367565b93505b505b60005b84811015611995576000866020015160ff161161193d576002611940565b60045b60ff1661194d85836145bc565b61195791906145bc565b91506119656111e382610ab5565b83838151811061197757611977614404565b6020026020010181905250808061198d9061439e565b91505061191f565b5060405163d54dcce760e01b815273190da63b06d57771341a44e5d285f736eaae0d6d9063d54dcce7906119cf908a9089906004016145e6565b600060405180830381865af41580156119ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a149190810190614558565b82600181518110611a2757611a27614404565b6020026020010181905250611a3b82613711565b979650505050505050565b611a503383613386565b611a6c5760405162461bcd60e51b8152600401610685906143b7565b611a788484848461372c565b50505050565b6060604051806103a0016040528061037f81526020016147d461037f9139905090565b6000818152600260205260409020546060906001600160a01b0316611aff5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610685565b6000611b0a83610ab5565b90506000611b21611b1c8560016145bc565b61375f565b90506000611b358360e0015160ff1661375f565b90506000611b5a610400856101000151611b4f91906145fb565b63ffffffff1661375f565b60408051602b808252610580820190925291925060009190816020015b6060815260200190600190039081611b775790505090506040518060800160405280604b8152602001615860604b913981600081518110611bba57611bba614404565b60200260200101819052508381600181518110611bd957611bd9614404565b602002602001018190525060405180610c400160405280610c0f8152602001614c51610c0f913981600281518110611c1357611c13614404565b60209081029190910101526080850151604051630600e42360e31b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d90633007211890602401600060405180830381865af4158015611c76573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9e9190810190614558565b81600381518110611cb157611cb1614404565b60200260200101819052506040518060600160405280603e8152602001614b53603e913981600481518110611ce857611ce8614404565b602090810291909101810191909152850151604051633405968960e21b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063d0165a2490602401600060405180830381865af4158015611d4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d759190810190614558565b81600581518110611d8857611d88614404565b60200260200101819052506040518060800160405280604f8152602001615913604f913981600681518110611dbf57611dbf614404565b602090810291909101015260a0850151604051639b6baba360e01b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d90639b6baba390602401600060405180830381865af4158015611e22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e4a9190810190614558565b81600781518110611e5d57611e5d614404565b60200260200101819052506040518060800160405280604d8152602001614c04604d913981600881518110611e9457611e94614404565b602090810291909101015260c0850151604051637e410a5d60e11b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063fc8214ba90602401600060405180830381865af4158015611ef7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f1f9190810190614558565b81600981518110611f3257611f32614404565b60200260200101819052506040518060a0016040528060738152602001614b916073913981600a81518110611f6957611f69614404565b60200260200101819052508281600b81518110611f8857611f88614404565b60200260200101819052506040518060800160405280604681526020016158cd6046913981600c81518110611fbf57611fbf614404565b60200260200101819052508181600d81518110611fde57611fde614404565b60200260200101819052506040518060600160405280602281526020016158ab6022913981600e8151811061201557612015614404565b6020026020010181905250600d805461202d906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612059906142ed565b80156120a65780601f1061207b576101008083540402835291602001916120a6565b820191906000526020600020905b81548152906001019060200180831161208957829003601f168201915b505050505081600f815181106120be576120be614404565b6020026020010181905250604051806040016040528060088152602001673f6361726449643d60c01b815250816010815181106120fd576120fd614404565b6020026020010181905250838160118151811061211c5761211c614404565b60200260200101819052506040518060400160405280600981526020016826706861736549643d60b81b8152508160128151811061215c5761215c614404565b6020026020010181905250612177856020015160ff1661375f565b8160138151811061218a5761218a614404565b60200260200101819052506040518060400160405280601481526020017326746f6b656e496457697468696e50686173653d60601b815250816014815181106121d5576121d5614404565b60200260200101819052506121f1856040015161ffff1661375f565b8160158151811061220457612204614404565b60200260200101819052506040518060400160405280600b81526020016a266b696c6f42797465733d60a81b8152508160168151811061224657612246614404565b6020026020010181905250818160178151811061226557612265614404565b6020026020010181905250604051806040016040528060098152602001682671756f746549643d60b81b815250816018815181106122a5576122a5614404565b60200260200101819052506122c0856080015160ff1661375f565b816019815181106122d3576122d3614404565b60200260200101819052506040518060400160405280600d81526020016c266267446972656374696f6e3d60981b81525081601a8151811061231757612317614404565b60200260200101819052506123328560a0015160ff1661375f565b81601b8151811061234557612345614404565b60200260200101819052506040518060400160405280600b81526020016a26626750616c657474653d60a81b81525081601c8151811061238757612387614404565b60200260200101819052506123a28560c0015160ff1661375f565b81601d815181106123b5576123b5614404565b60200260200101819052506040518060400160405280600681526020016526736565643d60d01b81525081601e815181106123f2576123f2614404565b602002602001018190525061241185610120015163ffffffff1661375f565b81601f8151811061242457612424614404565b602002602001018190525060405180604001604052806008815260200167264e69636f6e733d60c01b8152508160208151811061246357612463614404565b6020026020010181905250828160218151811061248257612482614404565b60200260200101819052506040518060400160405280601781526020017f253232253243253232696d616765253232253341253232000000000000000000815250816022815181106124d6576124d6614404565b602002602001018190525073079d45a112a4c8cad59b977b6fe7f5b7fbc9b7b063280da3b86040518163ffffffff1660e01b8152600401600060405180830381865af415801561252a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125529190810190614558565b8160238151811061256557612565614404565b602090810291909101015260e085015160405163e9cbb89b60e01b815260ff909116600482015273079d45a112a4c8cad59b977b6fe7f5b7fbc9b7b09063e9cbb89b90602401600060405180830381865af41580156125c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125f09190810190614558565b8160248151811061260357612603614404565b60200260200101819052507358439de643c9b546d782458926f9eca26ffb177d630263e6016040518163ffffffff1660e01b8152600401600060405180830381865af4158015612657573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261267f9190810190614558565b8160258151811061269257612692614404565b60200260200101819052506008856080015160ff16106126cb57604051806040016040528060018152602001600360fc1b8152506126e7565b60405180604001604052806002815260200161171960f11b8152505b816026815181106126fa576126fa614404565b60200260200101819052507358439de643c9b546d782458926f9eca26ffb177d63e6e757eb6040518163ffffffff1660e01b8152600401600060405180830381865af415801561274e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127769190810190614558565b8160278151811061278957612789614404565b602002602001018190525073190da63b06d57771341a44e5d285f736eaae0d6d63c72799bc6040518163ffffffff1660e01b8152600401600060405180830381865af41580156127dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128059190810190614558565b8160288151811061281857612818614404565b6020908102919091018101919091528501516040516362b7edcf60e11b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063c56fdb9e90602401600060405180830381865af415801561287d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128a59190810190614558565b816029815181106128b8576128b8614404565b602002602001018190525060405180604001604052806006815260200165094c8c894dd160d21b81525081602a815181106128f5576128f5614404565b6020026020010181905250611a3b81613711565b600d8054612916906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612942906142ed565b801561298f5780601f106129645761010080835404028352916020019161298f565b820191906000526020600020905b81548152906001019060200180831161297257829003601f168201915b505050505081565b61299f613576565b6001600160a01b038116612a045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610685565b612a0d816135d0565b50565b60008082604051602001612a24919061461e565b6040516020818303038152906040529050600081604051602001612a489190614644565b60405160208183030381529060405290508051602082016000f092506001600160a01b038316612aae5760405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606401610685565b5050919050565b60006001600160e01b031982166380ac58cd60e01b1480612ae657506001600160e01b03198216635b5e139f60e01b145b8061055257506301ffc9a760e01b6001600160e01b0319831614610552565b6000818152600260205260409020546001600160a01b0316612a0d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610685565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b9982610c48565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000888888888888604051602001612bef96959493929190614678565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052805190602001209050612c5083837f0000000000000000000000000000000000000000000000000000000000000000846137a3565b612c8b5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206461746160a01b6044820152606401610685565b505050505050505050565b604080514360208201524291810191909152486060808301919091526bffffffffffffffffffffffff1941821b811660808401523390911b16609482015260a8810182905260009060c80160408051601f19818403018152919052805160209182012063ffffffff8116610120860152915081901c60016003821611612d2f5780600116600114612d28576000612d32565b6001612d32565b60025b60ff1660a08501525061ffff602282901c166130a4811015612d5a57600160c0850152612e12565b615c29811015612d7057600260c0850152612e12565b618290811015612d8657600360c0850152612e12565b61a3d8811015612d9c57600460c0850152612e12565b61c000811015612db257600560c0850152612e12565b61d70b811015612dc857600660c0850152612e12565b61e8f6811015612dde57600760c0850152612e12565b61f5c3811015612df457600860c0850152612e12565b61fd71811015612e0a57600960c0850152612e12565b600a60c08501525b5060f081901c6102ba811015612e2e5760006080850152611a78565b610597811015612e445760016080850152611a78565b610897811015612e5a5760026080850152611a78565b610bb9811015612e705760036080850152611a78565b610efd811015612e865760046080850152611a78565b611264811015612e9c5760056080850152611a78565b6115ed811015612eb25760066080850152611a78565b611999811015612ec85760076080850152611a78565b611d67811015612ede5760086080850152611a78565b612158811015612ef45760096080850152611a78565b61256b811015612f0a57600a6080850152611a78565b6129a0811015612f2057600b6080850152611a78565b612df8811015612f3657600c6080850152611a78565b613273811015612f4c57600d6080850152611a78565b613710811015612f6257600e6080850152611a78565b613bcf811015612f7857600f6080850152611a78565b6140b1811015612f8e5760106080850152611a78565b6145b5811015612fa45760116080850152611a78565b614adb811015612fba5760126080850152611a78565b615024811015612fd05760136080850152611a78565b615590811015612fe65760146080850152611a78565b615b1e811015612ffc5760156080850152611a78565b6160ce8110156130125760166080850152611a78565b6166a18110156130285760176080850152611a78565b616c9681101561303e5760186080850152611a78565b6172ae8110156130545760196080850152611a78565b6178e881101561306a57601a6080850152611a78565b617f4581101561308057601b6080850152611a78565b6185c481101561309657601c6080850152611a78565b618c658110156130ac57601d6080850152611a78565b6193298110156130c257601e6080850152611a78565b619a0f8110156130d857601f6080850152611a78565b61a1188110156130ee5760206080850152611a78565b61a8438110156131045760216080850152611a78565b61af9181101561311a5760226080850152611a78565b61b7018110156131305760236080850152611a78565b61be938110156131465760246080850152611a78565b61c64881101561315c5760256080850152611a78565b61ce208110156131725760266080850152611a78565b61d61a8110156131885760276080850152611a78565b61de3681101561319e5760286080850152611a78565b61e6758110156131b45760296080850152611a78565b61eed68110156131ca57602a6080850152611a78565b61f7598110156131e057602b6080850152611a78565b602c608085015250505050565b6001600160a01b0382166132435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610685565b6000818152600260205260409020546001600160a01b0316156132a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b6132b66000838360016137bb565b6000818152600260205260409020546001600160a01b03161561331b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008061339283610c48565b9050806001600160a01b0316846001600160a01b031614806133d957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806133fd5750836001600160a01b03166133f2846105ea565b6001600160a01b0316145b949350505050565b826001600160a01b031661341882610c48565b6001600160a01b03161461343e5760405162461bcd60e51b8152600401610685906146cc565b6001600160a01b0382166134a05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610685565b6134ad83838360016137bb565b826001600160a01b03166134c082610c48565b6001600160a01b0316146134e65760405162461bcd60e51b8152600401610685906146cc565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314610d405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610685565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036136835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610685565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606061055282600161370c816001600160a01b0384163b614367565b6138fb565b6060610552826040518060200160405280600081525061391e565b613737848484613405565b61374384848484613935565b611a785760405162461bcd60e51b815260040161068590614711565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806137795750819003601f19909101908152919050565b6000826137b1868685613a33565b1495945050505050565b6137c784848484613a81565b60018111156138365760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610685565b816001600160a01b0385166138925761388d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6138b5565b836001600160a01b0316856001600160a01b0316146138b5576138b58582613b09565b6001600160a01b0384166138d1576138cc81613ba6565b6138f4565b846001600160a01b0316846001600160a01b0316146138f4576138f48482613c55565b5050505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b6060828261392c8282613c99565b95945050505050565b60006001600160a01b0384163b15613a2b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613979903390899088908890600401614763565b6020604051808303816000875af19250505080156139b4575060408051601f3d908101601f191682019092526139b1918101906147a0565b60015b613a11573d8080156139e2576040519150601f19603f3d011682016040523d82523d6000602084013e6139e7565b606091505b508051600003613a095760405162461bcd60e51b815260040161068590614711565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506133fd565b5060016133fd565b600081815b84811015613a7657613a6282878784818110613a5657613a56614404565b90506020020135613d42565b915080613a6e8161439e565b915050613a38565b5090505b9392505050565b6001811115611a78576001600160a01b03841615613ac7576001600160a01b03841660009081526003602052604081208054839290613ac1908490614367565b90915550505b6001600160a01b03831615611a78576001600160a01b03831660009081526003602052604081208054839290613afe9084906145bc565b909155505050505050565b60006001613b1684610ca8565b613b209190614367565b600083815260076020526040902054909150808214613b73576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613bb890600190614367565b60008381526009602052604081205460088054939450909284908110613be057613be0614404565b906000526020600020015490508060088381548110613c0157613c01614404565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613c3957613c396147bd565b6001900381819060005260206000200160009055905550505050565b6000613c6083610ca8565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051815160208083019190811115613cb157602084fd5b60208401518551602087016020820281016000825b82811015613d1f5780518051928301926020918201918104601f821615150160005b81811015613d0a578351602082028d0152602084019350600181019050613ce8565b50509890980186815287019750602001613cc6565b50600019909301909402919091018552505050601f01601f191660405292915050565b6000818310613d5e576000828152602084905260409020613a7a565b5060009182526020526040902090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6001600160e01b031981168114612a0d57600080fd5b600060208284031215613dea57600080fd5b8135613a7a81613dc2565b60005b83811015613e10578181015183820152602001613df8565b50506000910152565b60008151808452613e31816020860160208601613df5565b601f01601f19169290920160200192915050565b602081526000613a7a6020830184613e19565b600060208284031215613e6a57600080fd5b5035919050565b80356001600160a01b0381168114613e8857600080fd5b919050565b60008060408385031215613ea057600080fd5b613ea983613e71565b946020939093013593505050565b60008083601f840112613ec957600080fd5b50813567ffffffffffffffff811115613ee157600080fd5b602083019150836020828501011115613ef957600080fd5b9250929050565b803561ffff81168114613e8857600080fd5b600080600080600080600060a0888a031215613f2d57600080fd5b873567ffffffffffffffff80821115613f4557600080fd5b613f518b838c01613eb7565b909950975060208a0135915060ff82168214613f6c57600080fd5b819650613f7b60408b01613f00565b9550613f8960608b01613f00565b945060808a0135915080821115613f9f57600080fd5b818a0191508a601f830112613fb357600080fd5b813581811115613fc257600080fd5b8b60208260051b8501011115613fd757600080fd5b60208301945080935050505092959891949750929550565b60008060006060848603121561400457600080fd5b61400d84613e71565b925061401b60208501613e71565b9150604084013590509250925092565b80516001600160a01b03168252602081015161404c602084018260ff169052565b506040810151614062604084018261ffff169052565b506060810151614078606084018261ffff169052565b50608081015161408d608084018260ff169052565b5060a08101516140a260a084018260ff169052565b5060c08101516140b760c084018260ff169052565b5060e08101516140cc60e084018260ff169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff811684830152611a78565b6101408101610552828461402b565b6000806020838503121561411a57600080fd5b823567ffffffffffffffff81111561413157600080fd5b61413d85828601613eb7565b90969095509350505050565b60006020828403121561415b57600080fd5b613a7a82613e71565b6000806040838503121561417757600080fd5b61418083613e71565b91506020830135801515811461419557600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141df576141df6141a0565b604052919050565b600067ffffffffffffffff821115614201576142016141a0565b50601f01601f191660200190565b6000806000806080858703121561422557600080fd5b61422e85613e71565b935061423c60208601613e71565b925060408501359150606085013567ffffffffffffffff81111561425f57600080fd5b8501601f8101871361427057600080fd5b803561428361427e826141e7565b6141b6565b81815288602083850101111561429857600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156142cd57600080fd5b6142d683613e71565b91506142e460208401613e71565b90509250929050565b600181811c9082168061430157607f821691505b60208210810361432157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b60008261434c5761434c614327565b500690565b634e487b7160e01b600052601160045260246000fd5b8181038181111561055257610552614351565b63ffffffff81811683821601908082111561439757614397614351565b5092915050565b6000600182016143b0576143b0614351565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b601f82111561072657600081815260208120601f850160051c810160208610156144415750805b601f850160051c820191505b818110156144605782815560010161444d565b505050505050565b67ffffffffffffffff831115614480576144806141a0565b6144948361448e83546142ed565b8361441a565b6000601f8411600181146144c857600085156144b05750838201355b600019600387901b1c1916600186901b1783556138f4565b600083815260209020601f19861690835b828110156144f957868501358255602094850194600190920191016144d9565b50868210156145165760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600061453661427e846141e7565b905082815283838301111561454a57600080fd5b613a7a836020830184613df5565b60006020828403121561456a57600080fd5b815167ffffffffffffffff81111561458157600080fd5b8201601f8101841361459257600080fd5b6133fd84825160208401614528565b61ffff81811683821601908082111561439757614397614351565b8082018082111561055257610552614351565b808202811582820484141761055257610552614351565b8281526101608101613a7a602083018461402b565b600063ffffffff8084168061461257614612614327565b92169190910492915050565b6000815260008251614637816001850160208701613df5565b9190910160010192915050565b6a600b5981380380925939f360a81b8152815160009061466b81600b850160208701613df5565b91909101600b0192915050565b60a081528560a0820152858760c0830137600060c0878301810191909152602082019590955260ff93909316604084015261ffff9182166060840152166080820152601f909201601f191690910101919050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061479690830184613e19565b9695505050505050565b6000602082840312156147b257600080fd5b8151613a7a81613dc2565b634e487b7160e01b600052603160045260246000fdfe646174613a746578742f68746d6c3b636861727365743d7574662d382c25334321444f435459504525323068746d6c25334525304425304125334368746d6c2533452530442530412532302532302532302532302533436865616425334525304425304125323025323025323025323025323025323025323025323025334373637269707425334525304425304125323025323025323025323025323025323025323025323025323025323025323025323076617225323025354225304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323063617264496425324325304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323070686173654964253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230746f6b656e496457697468696e50686173652532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306b696c6f427974657325324325304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323071756f746549642532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306267446972656374696f6e253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230626750616c657474652532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532304e69636f6e73253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230736565642532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306a70656742363425304425304125323025323025323025323025323025323025323025323025323025323025323025323025354425323025334425323025354225323225374425324325374225323274726169745f74797065253232253341253232506861736525323225324325323276616c7565253232253341253232253232253744253243253742253232646973706c61795f74797065253232253341253232626f6f73745f6e756d62657225323225324325323274726169745f747970652532322533412532324e756d6265722532306f6625323049636f6e7325323225324325323276616c756525323225334125323225374425324325374225323274726169745f747970652532322533412532324261636b67726f756e6425323050616c6574746525323225324325323276616c75652532322533412532322532322532432532326465736372697074696f6e253232253341253232496e74726f647563696e672532307468652532304275746572696e253230436172647325324325323061253230756e697175652532306f6e2d636861696e253230636f6c6c656374696f6e2532306f6625323032253243303135253230636172647325323063656c6562726174696e67253230457468657265756d2773253230636f2d666f756e646572253243253230566974616c696b2532304275746572696e2e253230496e737069726564253230627925323074686525323069636f6e69632532304e616b616d6f746f25323043617264732532306f6e253230426974636f696e2532432532307468652532304275746572696e253230436172647325323061696d253230746f25323070617925323074726962757465253230746f253230566974616c696b2773253230696d6d656e7365253230636f6e747269627574696f6e73253230746f253230626c6f636b636861696e253230746563686e6f6c6f67792e2532302532302535436e2535436e5065726d616e656e746c7925323073746f7265642532306f6e253230746865253230457468657265756d253230626c6f636b636861696e25324325323074686573652532306361726473253230617265253230746865253230726573756c742532306f6625323061253230636f6c6c61626f7261746976652532306566666f727425323062792532304a5045472532306d696e65727325323077686f253230776f726b253230746f676574686572253230746f25323075706c6f616425323065616368253230636172642773253230646174612532306f6e2d636861696e2e25323054686525323066616365253230736964652532306f6625323065616368253230636172642532306665617475726573253230616e25323048544d4c253230616e642532305356472d636f6465642532306672616d65253230737572726f756e64696e67253230612532304a504547253230696d6167652532306f66253230566974616c696b2532304275746572696e25324325323064657369676e6564253230627925323058617461727265722e25323041742532306f76657225323031302532304d4225324325323074686973253230696d616765253230686f6c64732532307468652532307265636f7264253230666f722532307468652532306c61726765737425323073746f7265642532304a5045472532306f6e2d636861696e253230617425323074686525323074696d652532306f662532306d696e74696e672e2532302532302535436e2535436e416464696e67253230746f253230746865253230756e697175656e6573732532306f66253230746865253230636172647325324325323074686525323066616365253230736964652532306261636b67726f756e6425324325323064657369676e65642532306279253230506177652543352538322532304475646b6f25324325323073686f7763617365732532306d65736d6572697a696e6725324325323064796e616d6963616c6c792532306d6f76696e67253230726179732532306f66253230636f6c6f722e253230417325323061253230667573696f6e2532306f6625323070726f66696c652532307069637475726525323028706670292532304e465473253230616e6425323067656e657261746976652532306172742532432532307468652532304275746572696e2532304361726473253230706f737365737325323072616e646f6d6c792d73656c656374656425323061747472696275746573253230647572696e672532306d696e74696e672532432532307375636825323061732532306f6e652532306f662532303435253230706f737369626c6525323071756f74657325323066726f6d253230566974616c696b2e2532302532302535436e2535436e5468652532304275746572696e25323043617264732532306172652532307468652532307365636f6e64253230636f6c6c656374696f6e253230746f2532307574696c697a6525323061253230746563686e6971756525323063616c6c65642532304a5045472532304d696e696e672e253230496e2532307468697325323070726f636573732532432532307468652532306d696e657273253230617265253230726573706f6e7369626c65253230666f7225323075706c6f6164696e672532307468652532304e4654253230636f6d706f6e656e7473253243253230696e636c7564696e6725323074686525323048544d4c253243253230535647253243253230616e64253230566974616c696b2532304a5045472e2532305573696e6725323050726f67726573736976652532304a504547253230746563686e6f6c6f6779253243253230746865253230696d616765253230697325323072657665616c65642532306173253230697425323069732532306d696e6564253243253230616e642532306d696e657273253230617265253230726577617264656425323077697468253230612532304275746572696e25323043617264253230666f7225323074686569722532306566666f7274732e2532302532302535436e2535436e5468652532304a5045472532306d696e696e6725323070726f636573732532306f662532307468652532304275746572696e2532304361726473253230636f6e73697374732532306f662532307369782532307068617365732533412532302532302535436e2535437532373046253543754645304625323050656e63696c25323044726177696e672533412532304d696e65727325323075706c6f616425323074686525323048544d4c253230616e64253230535647253243253230726563656976696e672532306125323063617264253230776974682532306125323068616e642d647261776e253230766563746f72697a656425323053564725323076657273696f6e2532306f662532307468652532304a50454725324325323061732532306e6f2532304a504547253230646174612532306973253230617661696c61626c652532307965742e2532302532302535436e25354375443833442535437544443333253230426c61636b2532302532362532305768697465253341253230546865253230696e74656e73697479253230636f6d706f6e656e742532306f6625323074686525323070726f67726573736976652532304a504547253230697325323075706c6f6164656425324325323072656e646572696e67253230746865253230696d616765253230696e25323070757265253230626c61636b253230616e6425323077686974652e2532302532302535436e253543754438334325354375444632422535437546453046253230477265792532305368616465732533412532304164646974696f6e616c25323062697473253230666f72253230746865253230696e74656e73697479253230636f6d706f6e656e7425323072657665616c2532306125323072616e67652532306f6625323067726579253230746f6e65732e2532302532302535436e25354375443833442535437544464536253230426c75652532304368726f6d61253341253230546865253230626c75652532306368726f6d61253230697325323075706c6f61646564253243253230696e74726f647563696e67253230626c7565253230616e64253230677265656e25323068756573253230746f2532307468652532304a5045472e2532302532302535436e253543754438334425354375444645352532305265642532304368726f6d612533412532305468652532307265642532306368726f6d6125323069732532306164646564253243253230696e667573696e67253230726564253230616e6425323070696e6b253230736861646573253230696e746f253230746865253230696d6167652e2532302532302535436e25354375443833432535437544463034253230496e25323074686525323066696e616c25323070686173652532432532307468652532304143253230636f6d706f6e656e747325323061726525323075706c6f61646564253243253230656e68616e63696e67253230746865253230696d6167652532307265736f6c7574696f6e2e2532322532432532326174747269627574657325323225334125354225374225323274726169745f7479706525323225334125323251756f74652532305469746c6525323225324325323276616c7565253232253341253232646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d5554462d382c2537422532326e616d652532322533412532324275746572696e25323043617264253230253233253744253544253243253232616e696d6174696f6e5f75726c25323225334125323225374425324325374225323274726169745f7479706525323225334125323255706c6f616465642532302535424b4225354425323225324325323276616c756525323225334125323225374425324325374225323274726169745f747970652532322533412532324261636b67726f756e64253230446972656374696f6e25323225324325323276616c7565253232253341253232a2646970667358221220135793af9e531c59bb51bcdac3ee3c0d57dab1670c4a8b8e8fda08787bd435ac64736f6c6343000811003368747470733a2f2f79656c6c6f772d696d6d656e73652d7370696465722d38312e6d7970696e6174612e636c6f75642f697066732f516d637a66316e643475487a4c7857525a363870633250575842504b63526b6f6333395a67516b423858356267792f696e6465782e68746d6c9a08b67eeee8f5ae5803f57753a2c7c184d5f050918fef1c339d14bd80c6ef9700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000021500000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000011564617461253341696d6167652532466a706567253342626173653634253243253246396a25324634414151536b5a4a52674142415149414a51416c41414425324632774244414155444241514541775545424151464251554742777749427763484277384c43776b4d455138534568455045524554466877584578516146524552474345594768306448783866457863694a4349654a427765487837253246327742444151554642516347427734494341346546424555486834654868346548683465486834654868346548683465486834654868346548683465486834654868346548683465486834654868346548683465486834654868372532467767415243427278495941444152454141684542417845420000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063bb295ee1116100ad578063de597c0a1161007c578063de597c0a14610488578063e985e9c514610490578063f2fde38b146104cc578063f3a84acc146104df578063fa66c3d01461050657600080fd5b8063bb295ee114610426578063c87b56dd1461042e578063d3d49feb14610441578063dd4607cf1461046857600080fd5b8063a22cb465116100e9578063a22cb465146103c6578063a68f9de4146103d9578063b37e6bec14610400578063b88d4fde1461041357600080fd5b806370a0823114610392578063715018a6146103a55780638da5cb5b146103ad57806395d89b41146103be57600080fd5b80632f745c59116101925780635554da6d116101615780635554da6d146103395780635a2bc22d1461034c5780636352211e1461035f57806365a4234e1461037257600080fd5b80632f745c59146102e057806342842e0e146102f3578063460ea1db146103065780634f6ccce71461032657600080fd5b8063095ea7b3116101ce578063095ea7b31461029d5780630c15bad5146102b257806318160ddd146102c557806323b872dd146102cd57600080fd5b806301ffc9a7146102005780630535dfa71461022857806306fdde031461025d578063081812fc14610272575b600080fd5b61021361020e366004613dd8565b61052d565b60405190151581526020015b60405180910390f35b61024f7f00000000000000000000000000000000000000000000000000000000000003af81565b60405190815260200161021f565b610265610558565b60405161021f9190613e45565b610285610280366004613e58565b6105ea565b6040516001600160a01b03909116815260200161021f565b6102b06102ab366004613e8d565b610611565b005b6102b06102c0366004613f12565b61072b565b60085461024f565b6102b06102db366004613fef565b6109d3565b61024f6102ee366004613e8d565b610a04565b6102b0610301366004613fef565b610a9a565b610319610314366004613e58565b610ab5565b60405161021f91906140f8565b61024f610334366004613e58565b610b7f565b6102b0610347366004614107565b610c12565b61024f61035a366004613e58565b610c27565b61028561036d366004613e58565b610c48565b61024f610380366004614149565b600b6020526000908152604090205481565b61024f6103a0366004614149565b610ca8565b6102b0610d2e565b600a546001600160a01b0316610285565b610265610d42565b6102b06103d4366004614164565b610d51565b61024f7f000000000000000000000000000000000000000000000000000000000000001881565b61026561040e366004613e58565b610d60565b6102b061042136600461420f565b611a46565b610265611a7e565b61026561043c366004613e58565b611aa1565b61024f7f000000000000000000000000000000000000000000000000000000000000021581565b6040805180820190915260048152632f396b3d60e01b6020820152610265565b610265612909565b61021361049e3660046142ba565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102b06104da366004614149565b612997565b6102857f0000000000000000000000009bd6a6a7eeb89a5392b84de9a47cb86f09e264bb81565b61024f7f000000000000000000000000000000000000000000000000000000000000001881565b60006001600160e01b0319821663780e9d6360e01b1480610552575061055282612ab5565b92915050565b606060008054610567906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610593906142ed565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b60006105f582612b05565b506000908152600460205260409020546001600160a01b031690565b600061061c82610c48565b9050806001600160a01b0316836001600160a01b03160361068e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106aa57506106aa813361049e565b61071c5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610685565b6107268383612b64565b505050565b600061073660085490565b90506107488888838989898989612bd2565b610750613d6e565b61075a8183612c96565b61079989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1092505050565b6001600160a01b0316815260ff871660208083019190915261ffff8088166040808501919091529087166060840152336000908152600b9092529020546107e29060039061433d565b60ff1660e082015263ffffffff8816610100820152811561082c5761080b610314600184614367565b61010001518161010001818151610822919061437a565b63ffffffff169052505b600c6108c882600060e082610120015163ffffffff16901b60c783610100015163ffffffff16901b60c58460e0015160ff16901b60c18560c0015160ff16901b60bf8660a0015160ff16901b60b9876080015160ff16901b60ae886060015161ffff16901b60a3896040015161ffff16901b60a08a6020015160ff16901b8a600001516001600160a01b03161717171717171717179050919050565b815460018101835560009283526020909220909101556108e833836131ed565b336000908152600b602052604081208054916109038361439e565b91905055508189899050336001600160a01b03167f3b863996c61e31761bc3542c71c6bd5fdb28676b43035bbebb7116d4b54ba6f98a8a86608001518760a001518860c001518d8a61010001518b60e001518c61012001516040516109c09998979695949392919060ff998a16815261ffff9889166020820152968916604088015294881660608701529287166080860152941660a084015263ffffffff93841660c084015290931660e082015291166101008201526101200190565b60405180910390a4505050505050505050565b6109dd3382613386565b6109f95760405162461bcd60e51b8152600401610685906143b7565b610726838383613405565b6000610a0f83610ca8565b8210610a715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610685565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61072683838360405180602001604052806000815250611a46565b610abd613d6e565b6000600c8381548110610ad257610ad2614404565b6000918252602091829020015460408051610140810182526001600160a01b038316815260a083811c6007169482019490945260a383901c6107ff9081169282019290925260ae83901c909116606082015260b982901c603f16608082015260bf82901c60039081169382019390935260c182901c600f1660c082015260c582901c90921660e08084019190915260c782901c6301ffffff166101008401521c6101208201529392505050565b6000610b8a60085490565b8210610bed5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610685565b60088281548110610c0057610c00614404565b90600052602060002001549050919050565b610c1a613576565b600d610726828483614468565b600c8181548110610c3757600080fd5b600091825260209091200154905081565b6000818152600260205260408120546001600160a01b0316806105525760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610685565b60006001600160a01b038216610d125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610685565b506001600160a01b031660009081526003602052604090205490565b610d36613576565b610d4060006135d0565b565b606060018054610567906142ed565b610d5c338383613622565b5050565b6000818152600260205260409020546060906001600160a01b0316610dbe5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610685565b6000610dc983610ab5565b9050610dd460085490565b816060015161ffff1610610e65576060810151604051635615b97560e11b815261ffff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063ac2b72ea90602401600060405180830381865af4158015610e3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e639190810190614558565b505b6000610e716000610ab5565b60600151610e809060016145a1565b61ffff169050600080836020015160ff1660001461102c57836020015160ff1660011480610eb55750836020015160ff166002145b61101357836020015160ff16600314610fd357836020015160ff16600414610f47577f00000000000000000000000000000000000000000000000000000000000000187f000000000000000000000000000000000000000000000000000000000000001885606001516005610f2a91906145a1565b61ffff16610f389190614367565b610f429190614367565b611041565b7f00000000000000000000000000000000000000000000000000000000000000187f00000000000000000000000000000000000000000000000000000000000003af7f000000000000000000000000000000000000000000000000000000000000021586606001516005610fbb91906145a1565b61ffff16610fc991906145bc565b610f389190614367565b7f00000000000000000000000000000000000000000000000000000000000000188460600151600561100591906145a1565b61ffff16610f429190614367565b60608401516110239060056145a1565b61ffff16611041565b606084015161103c9060036145a1565b61ffff165b67ffffffffffffffff811115611059576110596141a0565b60405190808252806020026020018201604052801561108c57816020015b60608152602001906001900390816110775790505b509050611097611a7e565b816000815181106110aa576110aa614404565b6020026020010181905250600080856020015160ff16111561191c576110ef7f0000000000000000000000009bd6a6a7eeb89a5392b84de9a47cb86f09e264bb6136f0565b8260028151811061110257611102614404565b6020026020010181905250838560600151600161111f91906145a1565b61ffff1661112d9190614367565b9250606060007f000000000000000000000000000000000000000000000000000000000000001861117e7f0000000000000000000000000000000000000000000000000000000000000018886145bc565b61118891906145bc565b90505b61119585876145bc565b8110156113a457866020015160ff1660041415806111d257507f000000000000000000000000000000000000000000000000000000000000021581105b1561127b576111e96111e382610ab5565b516136f0565b91507f00000000000000000000000000000000000000000000000000000000000000187f00000000000000000000000000000000000000000000000000000000000000186112378884614367565b6112419190614367565b61124b9190614367565b6112569060036145bc565b92508184848151811061126b5761126b614404565b6020026020010181905250611392565b7f00000000000000000000000000000000000000000000000000000000000003af8110611392576112ae6111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000003af7f00000000000000000000000000000000000000000000000000000000000002157f00000000000000000000000000000000000000000000000000000000000000187f000000000000000000000000000000000000000000000000000000000000001861133e8a86614367565b6113489190614367565b6113529190614367565b61135c91906145bc565b6113669190614367565b6113719060036145bc565b92508184848151811061138657611386614404565b60200260200101819052505b8061139c8161439e565b91505061118b565b50845b6113d17f0000000000000000000000000000000000000000000000000000000000000018876145bc565b8110156115bf57866020015160ff16600114806113f55750866020015160ff166002145b156114a3576114066111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000187f00000000000000000000000000000000000000000000000000000000000000188761145588856145bc565b61145f9190614367565b6114699190614367565b6114739190614367565b61147e9060036145bc565b92508184848151811061149357611493614404565b60200260200101819052506115ad565b866020015160ff166004036115ad576114be6111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000003af7f00000000000000000000000000000000000000000000000000000000000002157f00000000000000000000000000000000000000000000000000000000000000187f00000000000000000000000000000000000000000000000000000000000000188961154f8a876145bc565b6115599190614367565b6115639190614367565b61156d9190614367565b61157791906145bc565b6115819190614367565b61158c9060036145bc565b9250818484815181106115a1576115a1614404565b60200260200101819052505b806115b78161439e565b9150506113a7565b5060006115ec7f0000000000000000000000000000000000000000000000000000000000000018876145bc565b90505b7f000000000000000000000000000000000000000000000000000000000000001861163a7f0000000000000000000000000000000000000000000000000000000000000018886145bc565b61164491906145bc565b8110156117e657866020015160ff16600114806116685750866020015160ff166002145b15611716576116796111e382610ab5565b91507f00000000000000000000000000000000000000000000000000000000000000187f0000000000000000000000000000000000000000000000000000000000000018876116c888856145bc565b6116d29190614367565b6116dc9190614367565b6116e69190614367565b6116f19060036145bc565b92508184848151811061170657611706614404565b60200260200101819052506117d4565b866020015160ff166003036117d4576117316111e382610ab5565b91507f000000000000000000000000000000000000000000000000000000000000001861177f7f000000000000000000000000000000000000000000000000000000000000001860026145cf565b8761178a88856145bc565b6117949190614367565b61179e9190614367565b6117a89190614367565b6117b39060036145bc565b9250818484815181106117c8576117c8614404565b60200260200101819052505b806117de8161439e565b9150506115ef565b506040805180820190915260048152632f396b3d60e01b60208201528361180e8460016145bc565b8151811061181e5761181e614404565b6020026020010181905250856020015160ff16600314806118465750856020015160ff166005145b15611878576118757f000000000000000000000000000000000000000000000000000000000000001885614367565b93505b6004866020015160ff16106118b4576118b17f000000000000000000000000000000000000000000000000000000000000001885614367565b93505b856020015160ff1660040361191a5761190d7f00000000000000000000000000000000000000000000000000000000000002157f00000000000000000000000000000000000000000000000000000000000003af614367565b6119179085614367565b93505b505b60005b84811015611995576000866020015160ff161161193d576002611940565b60045b60ff1661194d85836145bc565b61195791906145bc565b91506119656111e382610ab5565b83838151811061197757611977614404565b6020026020010181905250808061198d9061439e565b91505061191f565b5060405163d54dcce760e01b815273190da63b06d57771341a44e5d285f736eaae0d6d9063d54dcce7906119cf908a9089906004016145e6565b600060405180830381865af41580156119ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a149190810190614558565b82600181518110611a2757611a27614404565b6020026020010181905250611a3b82613711565b979650505050505050565b611a503383613386565b611a6c5760405162461bcd60e51b8152600401610685906143b7565b611a788484848461372c565b50505050565b6060604051806103a0016040528061037f81526020016147d461037f9139905090565b6000818152600260205260409020546060906001600160a01b0316611aff5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610685565b6000611b0a83610ab5565b90506000611b21611b1c8560016145bc565b61375f565b90506000611b358360e0015160ff1661375f565b90506000611b5a610400856101000151611b4f91906145fb565b63ffffffff1661375f565b60408051602b808252610580820190925291925060009190816020015b6060815260200190600190039081611b775790505090506040518060800160405280604b8152602001615860604b913981600081518110611bba57611bba614404565b60200260200101819052508381600181518110611bd957611bd9614404565b602002602001018190525060405180610c400160405280610c0f8152602001614c51610c0f913981600281518110611c1357611c13614404565b60209081029190910101526080850151604051630600e42360e31b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d90633007211890602401600060405180830381865af4158015611c76573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9e9190810190614558565b81600381518110611cb157611cb1614404565b60200260200101819052506040518060600160405280603e8152602001614b53603e913981600481518110611ce857611ce8614404565b602090810291909101810191909152850151604051633405968960e21b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063d0165a2490602401600060405180830381865af4158015611d4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d759190810190614558565b81600581518110611d8857611d88614404565b60200260200101819052506040518060800160405280604f8152602001615913604f913981600681518110611dbf57611dbf614404565b602090810291909101015260a0850151604051639b6baba360e01b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d90639b6baba390602401600060405180830381865af4158015611e22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e4a9190810190614558565b81600781518110611e5d57611e5d614404565b60200260200101819052506040518060800160405280604d8152602001614c04604d913981600881518110611e9457611e94614404565b602090810291909101015260c0850151604051637e410a5d60e11b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063fc8214ba90602401600060405180830381865af4158015611ef7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f1f9190810190614558565b81600981518110611f3257611f32614404565b60200260200101819052506040518060a0016040528060738152602001614b916073913981600a81518110611f6957611f69614404565b60200260200101819052508281600b81518110611f8857611f88614404565b60200260200101819052506040518060800160405280604681526020016158cd6046913981600c81518110611fbf57611fbf614404565b60200260200101819052508181600d81518110611fde57611fde614404565b60200260200101819052506040518060600160405280602281526020016158ab6022913981600e8151811061201557612015614404565b6020026020010181905250600d805461202d906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612059906142ed565b80156120a65780601f1061207b576101008083540402835291602001916120a6565b820191906000526020600020905b81548152906001019060200180831161208957829003601f168201915b505050505081600f815181106120be576120be614404565b6020026020010181905250604051806040016040528060088152602001673f6361726449643d60c01b815250816010815181106120fd576120fd614404565b6020026020010181905250838160118151811061211c5761211c614404565b60200260200101819052506040518060400160405280600981526020016826706861736549643d60b81b8152508160128151811061215c5761215c614404565b6020026020010181905250612177856020015160ff1661375f565b8160138151811061218a5761218a614404565b60200260200101819052506040518060400160405280601481526020017326746f6b656e496457697468696e50686173653d60601b815250816014815181106121d5576121d5614404565b60200260200101819052506121f1856040015161ffff1661375f565b8160158151811061220457612204614404565b60200260200101819052506040518060400160405280600b81526020016a266b696c6f42797465733d60a81b8152508160168151811061224657612246614404565b6020026020010181905250818160178151811061226557612265614404565b6020026020010181905250604051806040016040528060098152602001682671756f746549643d60b81b815250816018815181106122a5576122a5614404565b60200260200101819052506122c0856080015160ff1661375f565b816019815181106122d3576122d3614404565b60200260200101819052506040518060400160405280600d81526020016c266267446972656374696f6e3d60981b81525081601a8151811061231757612317614404565b60200260200101819052506123328560a0015160ff1661375f565b81601b8151811061234557612345614404565b60200260200101819052506040518060400160405280600b81526020016a26626750616c657474653d60a81b81525081601c8151811061238757612387614404565b60200260200101819052506123a28560c0015160ff1661375f565b81601d815181106123b5576123b5614404565b60200260200101819052506040518060400160405280600681526020016526736565643d60d01b81525081601e815181106123f2576123f2614404565b602002602001018190525061241185610120015163ffffffff1661375f565b81601f8151811061242457612424614404565b602002602001018190525060405180604001604052806008815260200167264e69636f6e733d60c01b8152508160208151811061246357612463614404565b6020026020010181905250828160218151811061248257612482614404565b60200260200101819052506040518060400160405280601781526020017f253232253243253232696d616765253232253341253232000000000000000000815250816022815181106124d6576124d6614404565b602002602001018190525073079d45a112a4c8cad59b977b6fe7f5b7fbc9b7b063280da3b86040518163ffffffff1660e01b8152600401600060405180830381865af415801561252a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125529190810190614558565b8160238151811061256557612565614404565b602090810291909101015260e085015160405163e9cbb89b60e01b815260ff909116600482015273079d45a112a4c8cad59b977b6fe7f5b7fbc9b7b09063e9cbb89b90602401600060405180830381865af41580156125c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125f09190810190614558565b8160248151811061260357612603614404565b60200260200101819052507358439de643c9b546d782458926f9eca26ffb177d630263e6016040518163ffffffff1660e01b8152600401600060405180830381865af4158015612657573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261267f9190810190614558565b8160258151811061269257612692614404565b60200260200101819052506008856080015160ff16106126cb57604051806040016040528060018152602001600360fc1b8152506126e7565b60405180604001604052806002815260200161171960f11b8152505b816026815181106126fa576126fa614404565b60200260200101819052507358439de643c9b546d782458926f9eca26ffb177d63e6e757eb6040518163ffffffff1660e01b8152600401600060405180830381865af415801561274e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127769190810190614558565b8160278151811061278957612789614404565b602002602001018190525073190da63b06d57771341a44e5d285f736eaae0d6d63c72799bc6040518163ffffffff1660e01b8152600401600060405180830381865af41580156127dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128059190810190614558565b8160288151811061281857612818614404565b6020908102919091018101919091528501516040516362b7edcf60e11b815260ff909116600482015273190da63b06d57771341a44e5d285f736eaae0d6d9063c56fdb9e90602401600060405180830381865af415801561287d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128a59190810190614558565b816029815181106128b8576128b8614404565b602002602001018190525060405180604001604052806006815260200165094c8c894dd160d21b81525081602a815181106128f5576128f5614404565b6020026020010181905250611a3b81613711565b600d8054612916906142ed565b80601f0160208091040260200160405190810160405280929190818152602001828054612942906142ed565b801561298f5780601f106129645761010080835404028352916020019161298f565b820191906000526020600020905b81548152906001019060200180831161297257829003601f168201915b505050505081565b61299f613576565b6001600160a01b038116612a045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610685565b612a0d816135d0565b50565b60008082604051602001612a24919061461e565b6040516020818303038152906040529050600081604051602001612a489190614644565b60405160208183030381529060405290508051602082016000f092506001600160a01b038316612aae5760405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606401610685565b5050919050565b60006001600160e01b031982166380ac58cd60e01b1480612ae657506001600160e01b03198216635b5e139f60e01b145b8061055257506301ffc9a760e01b6001600160e01b0319831614610552565b6000818152600260205260409020546001600160a01b0316612a0d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610685565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b9982610c48565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000888888888888604051602001612bef96959493929190614678565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052805190602001209050612c5083837f9a08b67eeee8f5ae5803f57753a2c7c184d5f050918fef1c339d14bd80c6ef97846137a3565b612c8b5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206461746160a01b6044820152606401610685565b505050505050505050565b604080514360208201524291810191909152486060808301919091526bffffffffffffffffffffffff1941821b811660808401523390911b16609482015260a8810182905260009060c80160408051601f19818403018152919052805160209182012063ffffffff8116610120860152915081901c60016003821611612d2f5780600116600114612d28576000612d32565b6001612d32565b60025b60ff1660a08501525061ffff602282901c166130a4811015612d5a57600160c0850152612e12565b615c29811015612d7057600260c0850152612e12565b618290811015612d8657600360c0850152612e12565b61a3d8811015612d9c57600460c0850152612e12565b61c000811015612db257600560c0850152612e12565b61d70b811015612dc857600660c0850152612e12565b61e8f6811015612dde57600760c0850152612e12565b61f5c3811015612df457600860c0850152612e12565b61fd71811015612e0a57600960c0850152612e12565b600a60c08501525b5060f081901c6102ba811015612e2e5760006080850152611a78565b610597811015612e445760016080850152611a78565b610897811015612e5a5760026080850152611a78565b610bb9811015612e705760036080850152611a78565b610efd811015612e865760046080850152611a78565b611264811015612e9c5760056080850152611a78565b6115ed811015612eb25760066080850152611a78565b611999811015612ec85760076080850152611a78565b611d67811015612ede5760086080850152611a78565b612158811015612ef45760096080850152611a78565b61256b811015612f0a57600a6080850152611a78565b6129a0811015612f2057600b6080850152611a78565b612df8811015612f3657600c6080850152611a78565b613273811015612f4c57600d6080850152611a78565b613710811015612f6257600e6080850152611a78565b613bcf811015612f7857600f6080850152611a78565b6140b1811015612f8e5760106080850152611a78565b6145b5811015612fa45760116080850152611a78565b614adb811015612fba5760126080850152611a78565b615024811015612fd05760136080850152611a78565b615590811015612fe65760146080850152611a78565b615b1e811015612ffc5760156080850152611a78565b6160ce8110156130125760166080850152611a78565b6166a18110156130285760176080850152611a78565b616c9681101561303e5760186080850152611a78565b6172ae8110156130545760196080850152611a78565b6178e881101561306a57601a6080850152611a78565b617f4581101561308057601b6080850152611a78565b6185c481101561309657601c6080850152611a78565b618c658110156130ac57601d6080850152611a78565b6193298110156130c257601e6080850152611a78565b619a0f8110156130d857601f6080850152611a78565b61a1188110156130ee5760206080850152611a78565b61a8438110156131045760216080850152611a78565b61af9181101561311a5760226080850152611a78565b61b7018110156131305760236080850152611a78565b61be938110156131465760246080850152611a78565b61c64881101561315c5760256080850152611a78565b61ce208110156131725760266080850152611a78565b61d61a8110156131885760276080850152611a78565b61de3681101561319e5760286080850152611a78565b61e6758110156131b45760296080850152611a78565b61eed68110156131ca57602a6080850152611a78565b61f7598110156131e057602b6080850152611a78565b602c608085015250505050565b6001600160a01b0382166132435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610685565b6000818152600260205260409020546001600160a01b0316156132a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b6132b66000838360016137bb565b6000818152600260205260409020546001600160a01b03161561331b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610685565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008061339283610c48565b9050806001600160a01b0316846001600160a01b031614806133d957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806133fd5750836001600160a01b03166133f2846105ea565b6001600160a01b0316145b949350505050565b826001600160a01b031661341882610c48565b6001600160a01b03161461343e5760405162461bcd60e51b8152600401610685906146cc565b6001600160a01b0382166134a05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610685565b6134ad83838360016137bb565b826001600160a01b03166134c082610c48565b6001600160a01b0316146134e65760405162461bcd60e51b8152600401610685906146cc565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b03163314610d405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610685565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036136835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610685565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606061055282600161370c816001600160a01b0384163b614367565b6138fb565b6060610552826040518060200160405280600081525061391e565b613737848484613405565b61374384848484613935565b611a785760405162461bcd60e51b815260040161068590614711565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806137795750819003601f19909101908152919050565b6000826137b1868685613a33565b1495945050505050565b6137c784848484613a81565b60018111156138365760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610685565b816001600160a01b0385166138925761388d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6138b5565b836001600160a01b0316856001600160a01b0316146138b5576138b58582613b09565b6001600160a01b0384166138d1576138cc81613ba6565b6138f4565b846001600160a01b0316846001600160a01b0316146138f4576138f48482613c55565b5050505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b6060828261392c8282613c99565b95945050505050565b60006001600160a01b0384163b15613a2b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613979903390899088908890600401614763565b6020604051808303816000875af19250505080156139b4575060408051601f3d908101601f191682019092526139b1918101906147a0565b60015b613a11573d8080156139e2576040519150601f19603f3d011682016040523d82523d6000602084013e6139e7565b606091505b508051600003613a095760405162461bcd60e51b815260040161068590614711565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506133fd565b5060016133fd565b600081815b84811015613a7657613a6282878784818110613a5657613a56614404565b90506020020135613d42565b915080613a6e8161439e565b915050613a38565b5090505b9392505050565b6001811115611a78576001600160a01b03841615613ac7576001600160a01b03841660009081526003602052604081208054839290613ac1908490614367565b90915550505b6001600160a01b03831615611a78576001600160a01b03831660009081526003602052604081208054839290613afe9084906145bc565b909155505050505050565b60006001613b1684610ca8565b613b209190614367565b600083815260076020526040902054909150808214613b73576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613bb890600190614367565b60008381526009602052604081205460088054939450909284908110613be057613be0614404565b906000526020600020015490508060088381548110613c0157613c01614404565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613c3957613c396147bd565b6001900381819060005260206000200160009055905550505050565b6000613c6083610ca8565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051815160208083019190811115613cb157602084fd5b60208401518551602087016020820281016000825b82811015613d1f5780518051928301926020918201918104601f821615150160005b81811015613d0a578351602082028d0152602084019350600181019050613ce8565b50509890980186815287019750602001613cc6565b50600019909301909402919091018552505050601f01601f191660405292915050565b6000818310613d5e576000828152602084905260409020613a7a565b5060009182526020526040902090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6001600160e01b031981168114612a0d57600080fd5b600060208284031215613dea57600080fd5b8135613a7a81613dc2565b60005b83811015613e10578181015183820152602001613df8565b50506000910152565b60008151808452613e31816020860160208601613df5565b601f01601f19169290920160200192915050565b602081526000613a7a6020830184613e19565b600060208284031215613e6a57600080fd5b5035919050565b80356001600160a01b0381168114613e8857600080fd5b919050565b60008060408385031215613ea057600080fd5b613ea983613e71565b946020939093013593505050565b60008083601f840112613ec957600080fd5b50813567ffffffffffffffff811115613ee157600080fd5b602083019150836020828501011115613ef957600080fd5b9250929050565b803561ffff81168114613e8857600080fd5b600080600080600080600060a0888a031215613f2d57600080fd5b873567ffffffffffffffff80821115613f4557600080fd5b613f518b838c01613eb7565b909950975060208a0135915060ff82168214613f6c57600080fd5b819650613f7b60408b01613f00565b9550613f8960608b01613f00565b945060808a0135915080821115613f9f57600080fd5b818a0191508a601f830112613fb357600080fd5b813581811115613fc257600080fd5b8b60208260051b8501011115613fd757600080fd5b60208301945080935050505092959891949750929550565b60008060006060848603121561400457600080fd5b61400d84613e71565b925061401b60208501613e71565b9150604084013590509250925092565b80516001600160a01b03168252602081015161404c602084018260ff169052565b506040810151614062604084018261ffff169052565b506060810151614078606084018261ffff169052565b50608081015161408d608084018260ff169052565b5060a08101516140a260a084018260ff169052565b5060c08101516140b760c084018260ff169052565b5060e08101516140cc60e084018260ff169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff811684830152611a78565b6101408101610552828461402b565b6000806020838503121561411a57600080fd5b823567ffffffffffffffff81111561413157600080fd5b61413d85828601613eb7565b90969095509350505050565b60006020828403121561415b57600080fd5b613a7a82613e71565b6000806040838503121561417757600080fd5b61418083613e71565b91506020830135801515811461419557600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141df576141df6141a0565b604052919050565b600067ffffffffffffffff821115614201576142016141a0565b50601f01601f191660200190565b6000806000806080858703121561422557600080fd5b61422e85613e71565b935061423c60208601613e71565b925060408501359150606085013567ffffffffffffffff81111561425f57600080fd5b8501601f8101871361427057600080fd5b803561428361427e826141e7565b6141b6565b81815288602083850101111561429857600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156142cd57600080fd5b6142d683613e71565b91506142e460208401613e71565b90509250929050565b600181811c9082168061430157607f821691505b60208210810361432157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b60008261434c5761434c614327565b500690565b634e487b7160e01b600052601160045260246000fd5b8181038181111561055257610552614351565b63ffffffff81811683821601908082111561439757614397614351565b5092915050565b6000600182016143b0576143b0614351565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b601f82111561072657600081815260208120601f850160051c810160208610156144415750805b601f850160051c820191505b818110156144605782815560010161444d565b505050505050565b67ffffffffffffffff831115614480576144806141a0565b6144948361448e83546142ed565b8361441a565b6000601f8411600181146144c857600085156144b05750838201355b600019600387901b1c1916600186901b1783556138f4565b600083815260209020601f19861690835b828110156144f957868501358255602094850194600190920191016144d9565b50868210156145165760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600061453661427e846141e7565b905082815283838301111561454a57600080fd5b613a7a836020830184613df5565b60006020828403121561456a57600080fd5b815167ffffffffffffffff81111561458157600080fd5b8201601f8101841361459257600080fd5b6133fd84825160208401614528565b61ffff81811683821601908082111561439757614397614351565b8082018082111561055257610552614351565b808202811582820484141761055257610552614351565b8281526101608101613a7a602083018461402b565b600063ffffffff8084168061461257614612614327565b92169190910492915050565b6000815260008251614637816001850160208701613df5565b9190910160010192915050565b6a600b5981380380925939f360a81b8152815160009061466b81600b850160208701613df5565b91909101600b0192915050565b60a081528560a0820152858760c0830137600060c0878301810191909152602082019590955260ff93909316604084015261ffff9182166060840152166080820152601f909201601f191690910101919050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061479690830184613e19565b9695505050505050565b6000602082840312156147b257600080fd5b8151613a7a81613dc2565b634e487b7160e01b600052603160045260246000fdfe646174613a746578742f68746d6c3b636861727365743d7574662d382c25334321444f435459504525323068746d6c25334525304425304125334368746d6c2533452530442530412532302532302532302532302533436865616425334525304425304125323025323025323025323025323025323025323025323025334373637269707425334525304425304125323025323025323025323025323025323025323025323025323025323025323025323076617225323025354225304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323063617264496425324325304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323070686173654964253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230746f6b656e496457697468696e50686173652532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306b696c6f427974657325324325304425304125323025323025323025323025323025323025323025323025323025323025323025323025323025323025323025323071756f746549642532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306267446972656374696f6e253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230626750616c657474652532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532304e69636f6e73253243253044253041253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230253230736565642532432530442530412532302532302532302532302532302532302532302532302532302532302532302532302532302532302532302532306a70656742363425304425304125323025323025323025323025323025323025323025323025323025323025323025323025354425323025334425323025354225323225374425324325374225323274726169745f74797065253232253341253232506861736525323225324325323276616c7565253232253341253232253232253744253243253742253232646973706c61795f74797065253232253341253232626f6f73745f6e756d62657225323225324325323274726169745f747970652532322533412532324e756d6265722532306f6625323049636f6e7325323225324325323276616c756525323225334125323225374425324325374225323274726169745f747970652532322533412532324261636b67726f756e6425323050616c6574746525323225324325323276616c75652532322533412532322532322532432532326465736372697074696f6e253232253341253232496e74726f647563696e672532307468652532304275746572696e253230436172647325324325323061253230756e697175652532306f6e2d636861696e253230636f6c6c656374696f6e2532306f6625323032253243303135253230636172647325323063656c6562726174696e67253230457468657265756d2773253230636f2d666f756e646572253243253230566974616c696b2532304275746572696e2e253230496e737069726564253230627925323074686525323069636f6e69632532304e616b616d6f746f25323043617264732532306f6e253230426974636f696e2532432532307468652532304275746572696e253230436172647325323061696d253230746f25323070617925323074726962757465253230746f253230566974616c696b2773253230696d6d656e7365253230636f6e747269627574696f6e73253230746f253230626c6f636b636861696e253230746563686e6f6c6f67792e2532302532302535436e2535436e5065726d616e656e746c7925323073746f7265642532306f6e253230746865253230457468657265756d253230626c6f636b636861696e25324325323074686573652532306361726473253230617265253230746865253230726573756c742532306f6625323061253230636f6c6c61626f7261746976652532306566666f727425323062792532304a5045472532306d696e65727325323077686f253230776f726b253230746f676574686572253230746f25323075706c6f616425323065616368253230636172642773253230646174612532306f6e2d636861696e2e25323054686525323066616365253230736964652532306f6625323065616368253230636172642532306665617475726573253230616e25323048544d4c253230616e642532305356472d636f6465642532306672616d65253230737572726f756e64696e67253230612532304a504547253230696d6167652532306f66253230566974616c696b2532304275746572696e25324325323064657369676e6564253230627925323058617461727265722e25323041742532306f76657225323031302532304d4225324325323074686973253230696d616765253230686f6c64732532307468652532307265636f7264253230666f722532307468652532306c61726765737425323073746f7265642532304a5045472532306f6e2d636861696e253230617425323074686525323074696d652532306f662532306d696e74696e672e2532302532302535436e2535436e416464696e67253230746f253230746865253230756e697175656e6573732532306f66253230746865253230636172647325324325323074686525323066616365253230736964652532306261636b67726f756e6425324325323064657369676e65642532306279253230506177652543352538322532304475646b6f25324325323073686f7763617365732532306d65736d6572697a696e6725324325323064796e616d6963616c6c792532306d6f76696e67253230726179732532306f66253230636f6c6f722e253230417325323061253230667573696f6e2532306f6625323070726f66696c652532307069637475726525323028706670292532304e465473253230616e6425323067656e657261746976652532306172742532432532307468652532304275746572696e2532304361726473253230706f737365737325323072616e646f6d6c792d73656c656374656425323061747472696275746573253230647572696e672532306d696e74696e672532432532307375636825323061732532306f6e652532306f662532303435253230706f737369626c6525323071756f74657325323066726f6d253230566974616c696b2e2532302532302535436e2535436e5468652532304275746572696e25323043617264732532306172652532307468652532307365636f6e64253230636f6c6c656374696f6e253230746f2532307574696c697a6525323061253230746563686e6971756525323063616c6c65642532304a5045472532304d696e696e672e253230496e2532307468697325323070726f636573732532432532307468652532306d696e657273253230617265253230726573706f6e7369626c65253230666f7225323075706c6f6164696e672532307468652532304e4654253230636f6d706f6e656e7473253243253230696e636c7564696e6725323074686525323048544d4c253243253230535647253243253230616e64253230566974616c696b2532304a5045472e2532305573696e6725323050726f67726573736976652532304a504547253230746563686e6f6c6f6779253243253230746865253230696d616765253230697325323072657665616c65642532306173253230697425323069732532306d696e6564253243253230616e642532306d696e657273253230617265253230726577617264656425323077697468253230612532304275746572696e25323043617264253230666f7225323074686569722532306566666f7274732e2532302532302535436e2535436e5468652532304a5045472532306d696e696e6725323070726f636573732532306f662532307468652532304275746572696e2532304361726473253230636f6e73697374732532306f662532307369782532307068617365732533412532302532302535436e2535437532373046253543754645304625323050656e63696c25323044726177696e672533412532304d696e65727325323075706c6f616425323074686525323048544d4c253230616e64253230535647253243253230726563656976696e672532306125323063617264253230776974682532306125323068616e642d647261776e253230766563746f72697a656425323053564725323076657273696f6e2532306f662532307468652532304a50454725324325323061732532306e6f2532304a504547253230646174612532306973253230617661696c61626c652532307965742e2532302532302535436e25354375443833442535437544443333253230426c61636b2532302532362532305768697465253341253230546865253230696e74656e73697479253230636f6d706f6e656e742532306f6625323074686525323070726f67726573736976652532304a504547253230697325323075706c6f6164656425324325323072656e646572696e67253230746865253230696d616765253230696e25323070757265253230626c61636b253230616e6425323077686974652e2532302532302535436e253543754438334325354375444632422535437546453046253230477265792532305368616465732533412532304164646974696f6e616c25323062697473253230666f72253230746865253230696e74656e73697479253230636f6d706f6e656e7425323072657665616c2532306125323072616e67652532306f6625323067726579253230746f6e65732e2532302532302535436e25354375443833442535437544464536253230426c75652532304368726f6d61253341253230546865253230626c75652532306368726f6d61253230697325323075706c6f61646564253243253230696e74726f647563696e67253230626c7565253230616e64253230677265656e25323068756573253230746f2532307468652532304a5045472e2532302532302535436e253543754438334425354375444645352532305265642532304368726f6d612533412532305468652532307265642532306368726f6d6125323069732532306164646564253243253230696e667573696e67253230726564253230616e6425323070696e6b253230736861646573253230696e746f253230746865253230696d6167652e2532302532302535436e25354375443833432535437544463034253230496e25323074686525323066696e616c25323070686173652532432532307468652532304143253230636f6d706f6e656e747325323061726525323075706c6f61646564253243253230656e68616e63696e67253230746865253230696d6167652532307265736f6c7574696f6e2e2532322532432532326174747269627574657325323225334125354225374225323274726169745f7479706525323225334125323251756f74652532305469746c6525323225324325323276616c7565253232253341253232646174613a6170706c69636174696f6e2f6a736f6e3b636861727365743d5554462d382c2537422532326e616d652532322533412532324275746572696e25323043617264253230253233253744253544253243253232616e696d6174696f6e5f75726c25323225334125323225374425324325374225323274726169745f7479706525323225334125323255706c6f616465642532302535424b4225354425323225324325323276616c756525323225334125323225374425324325374225323274726169745f747970652532322533412532324261636b67726f756e64253230446972656374696f6e25323225324325323276616c7565253232253341253232a2646970667358221220135793af9e531c59bb51bcdac3ee3c0d57dab1670c4a8b8e8fda08787bd435ac64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
9a08b67eeee8f5ae5803f57753a2c7c184d5f050918fef1c339d14bd80c6ef9700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000021500000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000011564617461253341696d6167652532466a706567253342626173653634253243253246396a25324634414151536b5a4a52674142415149414a51416c41414425324632774244414155444241514541775545424151464251554742777749427763484277384c43776b4d455138534568455045524554466877584578516146524552474345594768306448783866457863694a4349654a427765487837253246327742444151554642516347427734494341346546424555486834654868346548683465486834654868346548683465486834654868346548683465486834654868346548683465486834654868346548683465486834654868372532467767415243427278495941444152454141684542417845420000000000000000000000
-----Decoded View---------------
Arg [0] : root (bytes32): 0x9a08b67eeee8f5ae5803f57753a2c7c184d5f050918fef1c339d14bd80c6ef97
Arg [1] : jpegHeader (string): data%3Aimage%2Fjpeg%3Bbase64%2C%2F9j%2F4AAQSkZJRgABAQIAJQAlAAD%2F2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7%2F2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7%2FwgARCBrxIYADAREAAhEBAxEB
Arg [2] : tokenIdFirstBlueChrominance (uint256): 533
Arg [3] : tokenIdFirstRedChrominance (uint256): 943
Arg [4] : NemptyBlueColorChunks (uint256): 24
Arg [5] : NemptyRedColorChunks (uint256): 24
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 9a08b67eeee8f5ae5803f57753a2c7c184d5f050918fef1c339d14bd80c6ef97
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000215
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003af
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000115
Arg [7] : 64617461253341696d6167652532466a70656725334262617365363425324325
Arg [8] : 3246396a25324634414151536b5a4a52674142415149414a51416c4141442532
Arg [9] : 4632774244414155444241514541775545424151464251554742777749427763
Arg [10] : 484277384c43776b4d4551385345684550455245544668775845785161465245
Arg [11] : 52474345594768306448783866457863694a4349654a42776548783725324632
Arg [12] : 7742444151554642516347427734494341346546424555486834654868346548
Arg [13] : 6834654868346548683465486834654868346548683465486834654868346548
Arg [14] : 6834654868346548683465486834654868346548683465486837253246776741
Arg [15] : 5243427278495941444152454141684542417845420000000000000000000000
Libraries Used
ButerinCardsLib : 0x190da63b06d57771341a44e5d285f736eaae0d6dButerinCardsBackA : 0x079d45a112a4c8cad59b977b6fe7f5b7fbc9b7b0ButerinCardsBackB : 0x58439de643c9b546d782458926f9eca26ffb177d
Deployed Bytecode Sourcemap
398:24213:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1004:222:9;;;;;;:::i;:::-;;:::i;:::-;;;565:14:21;;558:22;540:41;;528:2;513:18;1004:222:9;;;;;;;;1457:55:2;;;;;;;;738:25:21;;;726:2;711:18;1457:55:2;592:177:21;2406:98:8;;;:::i;:::-;;;;;;;:::i;3870:167::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1988:32:21;;;1970:51;;1958:2;1943:18;3870:167:8;1824:203:21;3403:406:8;;;;;;:::i;:::-;;:::i;:::-;;21355:1609:2;;;;;;:::i;:::-;;:::i;1629:111:9:-;1716:10;:17;1629:111;;4547:326:8;;;;;;:::i;:::-;;:::i;1305:253:9:-;;;;;;:::i;:::-;;:::i;4939:179:8:-;;;;;;:::i;:::-;;:::i;16011:922:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1812:230:9:-;;;;;;:::i;:::-;;:::i;2387:142:2:-;;;;;;:::i;:::-;;:::i;950:23::-;;;;;;:::i;:::-;;:::i;2125:219:8:-;;;;;;:::i;:::-;;:::i;863:41:2:-;;;;;;:::i;:::-;;;;;;;;;;;;;;1864:204:8;;;;;;:::i;:::-;;:::i;1824:101:18:-;;;:::i;1194:85::-;1266:6;;-1:-1:-1;;;;;1266:6:18;1194:85;;2568:102:8;;;:::i;4104:153::-;;;;;;:::i;:::-;;:::i;1618:49:2:-;;;;;9286:6717;;;;;;:::i;:::-;;:::i;5184:314:8:-;;;;;;:::i;:::-;;:::i;23472:1032:2:-;;;:::i;2537:6741::-;;;;;;:::i;:::-;;:::i;1351:56::-;;;;;24512:96;24587:13;;;;;;;;;;;;-1:-1:-1;;;24587:13:2;;;;24512:96;;1028:154;;;:::i;4323:162:8:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4443:25:8;;;4420:4;4443:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4323:162;2074:198:18;;;;;;:::i;:::-;;:::i;1674:44:2:-;;;;;1561:50;;;;;1004:222:9;1106:4;-1:-1:-1;;;;;;1129:50:9;;-1:-1:-1;;;1129:50:9;;:90;;;1183:36;1207:11;1183:23;:36::i;:::-;1122:97;1004:222;-1:-1:-1;;1004:222:9:o;2406:98:8:-;2460:13;2492:5;2485:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2406:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;-1:-1:-1;4006:24:8;;;;:15;:24;;;;;;-1:-1:-1;;;;;4006:24:8;;3870:167::o;3403:406::-;3483:13;3499:23;3514:7;3499:14;:23::i;:::-;3483:39;;3546:5;-1:-1:-1;;;;;3540:11:8;:2;-1:-1:-1;;;;;3540:11:8;;3532:57;;;;-1:-1:-1;;;3532:57:8;;9761:2:21;3532:57:8;;;9743:21:21;9800:2;9780:18;;;9773:30;9839:34;9819:18;;;9812:62;-1:-1:-1;;;9890:18:21;;;9883:31;9931:19;;3532:57:8;;;;;;;;;719:10:6;-1:-1:-1;;;;;3621:21:8;;;;:62;;-1:-1:-1;3646:37:8;3663:5;719:10:6;4323:162:8;:::i;3646:37::-;3600:170;;;;-1:-1:-1;;;3600:170:8;;10163:2:21;3600:170:8;;;10145:21:21;10202:2;10182:18;;;10175:30;10241:34;10221:18;;;10214:62;10312:31;10292:18;;;10285:59;10361:19;;3600:170:8;9961:425:21;3600:170:8;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3473:336;3403:406;;:::o;21355:1609:2:-;21596:15;21614:13;1716:10:9;:17;;1629:111;21614:13:2;21596:31;;21671:91;21688:9;;21699:7;21708;21717:18;21737:17;21756:5;;21671:16;:91::i;:::-;21825:42;;:::i;:::-;21878:26;21889:5;21896:7;21878:10;:26::i;:::-;21967:31;21987:9;;21967:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21967:13:2;;-1:-1:-1;;;21967:31:2:i;:::-;-1:-1:-1;;;;;21947:51:2;;;22009:23;;;:13;;;;:23;;;;22043:45;;;;:24;;;;:45;;;;22099:43;;;:23;;;:43;22181:10;21947:17;22174:18;;;:6;:18;;;;;;:22;;22195:1;;22174:22;:::i;:::-;22153:44;;:12;;;:44;22208:46;;;:12;;;:46;22269:11;;22265:64;;22298:24;22310:11;22320:1;22310:7;:11;:::i;22298:24::-;:31;;;22282:5;:12;;:47;;;;;;;:::i;:::-;;;;;-1:-1:-1;22265:64:2;22375:6;22387:17;22398:5;17027:4;17514:3;17499:5;:10;;;17494:16;;:23;;17473:3;17456:5;:12;;;17451:18;;:25;;17430:3;17413:5;:12;;;17408:18;;:25;;17387:3;17365:5;:17;;;17360:23;;:30;;17339:3;17315:5;:19;;;17310:25;;:32;;17289:3;17271:5;:13;;;17266:19;;:26;;17245:3;17217:5;:23;;;17212:29;;:36;;17191:3;17162:5;:24;;;17157:30;;:37;;17136:3;17118:5;:13;;;17113:19;;:26;;17077:5;:17;;;-1:-1:-1;;;;;17064:32:2;:76;:131;:185;:229;:279;:327;:370;:413;:454;17044:474;;16941:585;;;;22387:17;22375:30;;;;;;;-1:-1:-1;22375:30:2;;;;;;;;;;;22440:26;22446:10;22458:7;22440:5;:26::i;:::-;22541:10;22534:18;;;;:6;:18;;;;;:20;;;;;;:::i;:::-;;;;;;22678:7;22646:9;;22640:23;;22615:10;-1:-1:-1;;;;;22595:361:2;;22700:7;22722:18;22755:5;:13;;;22783:5;:19;;;22817:5;:17;;;22849;22881:5;:12;;;22908:5;:12;;;22935:5;:10;;;22595:361;;;;;;;;;;;;;11595:4:21;11583:17;;;11565:36;;11620:6;11662:15;;;11657:2;11642:18;;11635:43;11714:17;;;11709:2;11694:18;;11687:45;11768:17;;;11763:2;11748:18;;11741:45;11823:17;;;11817:3;11802:19;;11795:46;11878:15;;11872:3;11857:19;;11850:44;11913:10;11960:15;;;11954:3;11939:19;;11932:44;12013:17;;;12007:3;11992:19;;11985:46;12068:15;;12062:3;12047:19;;12040:44;11552:3;11537:19;;11222:868;22595:361:2;;;;;;;;21551:1413;;21355:1609;;;;;;;:::o;4547:326:8:-;4736:41;719:10:6;4769:7:8;4736:18;:41::i;:::-;4728:99;;;;-1:-1:-1;;;4728:99:8;;;;;;;:::i;:::-;4838:28;4848:4;4854:2;4858:7;4838:9;:28::i;1305:253:9:-;1402:7;1437:23;1454:5;1437:16;:23::i;:::-;1429:5;:31;1421:87;;;;-1:-1:-1;;;1421:87:9;;12711:2:21;1421:87:9;;;12693:21:21;12750:2;12730:18;;;12723:30;12789:34;12769:18;;;12762:62;-1:-1:-1;;;12840:18:21;;;12833:41;12891:19;;1421:87:9;12509:407:21;1421:87:9;-1:-1:-1;;;;;;1525:19:9;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1305:253::o;4939:179:8:-;5072:39;5089:4;5095:2;5099:7;5072:39;;;;;;;;;;;;:16;:39::i;16011:922:2:-;16067:36;;:::i;:::-;16116:10;16129:6;16136:7;16129:15;;;;;;;;:::i;:::-;;;;;;;;;;;;16175:750;;;;;;;;-1:-1:-1;;;;;16175:750:2;;;;16316:3;16307:12;;;16323:3;16306:20;16175:750;;;;;;;16393:3;16384:12;;;16400:5;16383:22;;;16175:750;;;;;;;16472:3;16463:12;;;16462:22;;;16175:750;;;;16540:3;16531:12;;;16547:4;16530:21;16175:750;;;;16612:3;16603:12;;;16619:3;16602:20;;;16175:750;;;;;;;16681:3;16672:12;;;16688:3;16671:20;16175:750;;;;16745:3;16736:12;;;16735:20;;;16175:750;;;;;;;;16810:3;16801:12;;;16817:9;16800:26;16175:750;;;;16871:12;16175:750;;;;;;-1:-1:-1;;;16011:922:2:o;1812:230:9:-;1887:7;1922:30;1716:10;:17;;1629:111;1922:30;1914:5;:38;1906:95;;;;-1:-1:-1;;;1906:95:9;;13255:2:21;1906:95:9;;;13237:21:21;13294:2;13274:18;;;13267:30;13333:34;13313:18;;;13306:62;-1:-1:-1;;;13384:18:21;;;13377:42;13436:19;;1906:95:9;13053:408:21;1906:95:9;2018:10;2029:5;2018:17;;;;;;;;:::i;:::-;;;;;;;;;2011:24;;1812:230;;;:::o;2387:142:2:-;1087:13:18;:11;:13::i;:::-;2483:16:2::1;:38;2502:19:::0;;2483:16;:38:::1;:::i;950:23::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;950:23:2;:::o;2125:219:8:-;2197:7;6865:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6865:16:8;;2259:56;;;;-1:-1:-1;;;2259:56:8;;15726:2:21;2259:56:8;;;15708:21:21;15765:2;15745:18;;;15738:30;-1:-1:-1;;;15784:18:21;;;15777:54;15848:18;;2259:56:8;15524:348:21;1864:204:8;1936:7;-1:-1:-1;;;;;1963:19:8;;1955:73;;;;-1:-1:-1;;;1955:73:8;;16079:2:21;1955:73:8;;;16061:21:21;16118:2;16098:18;;;16091:30;16157:34;16137:18;;;16130:62;-1:-1:-1;;;16208:18:21;;;16201:39;16257:19;;1955:73:8;15877:405:21;1955:73:8;-1:-1:-1;;;;;;2045:16:8;;;;;:9;:16;;;;;;;1864:204::o;1824:101:18:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2568:102:8:-;2624:13;2656:7;2649:14;;;;;:::i;4104:153::-;4198:52;719:10:6;4231:8:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;9286:6717:2:-;7256:4:8;6865:16;;;:7;:16;;;;;;9350:13:2;;-1:-1:-1;;;;;6865:16:8;9376:49:2;;;;-1:-1:-1;;;9376:49:2;;16489:2:21;9376:49:2;;;16471:21:21;16528:2;16508:18;;;16501:30;-1:-1:-1;;;16547:18:21;;;16540:50;16607:18;;9376:49:2;16287:344:21;9376:49:2;9470:42;9515:20;9527:7;9515:11;:20::i;:::-;9470:65;;9662:13;1716:10:9;:17;;1629:111;9662:13:2;9635:5;:23;;;:40;;;9631:103;;9710:23;;;;9677:57;;-1:-1:-1;;;9677:57:2;;16819:6:21;16807:19;;;9677:57:2;;;16789:38:21;9677:15:2;;:32;;16762:18:21;;9677:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9677:57:2;;;;;;;;;;;;:::i;:::-;;9631:103;9747:19;9769:14;9781:1;9769:11;:14::i;:::-;:32;;;:36;;9804:1;9769:36;:::i;:::-;9747:58;;;;9816:19;10485:28;10542:5;:13;;;:18;;10559:1;10542:18;:739;;10593:5;:13;;;:18;;10610:1;10593:18;:40;;;;10615:5;:13;;;:18;;10632:1;10615:18;10593:40;:688;;10700:5;:13;;;:18;;10717:1;10700:18;:581;;10874:5;:13;;;:18;;10891:1;10874:18;:407;;11257:24;11229:25;11199:5;:23;;;11225:1;11199:27;;;;:::i;:::-;:55;;;;;;:::i;:::-;:82;;;;:::i;:::-;10542:739;;10874:407;11155:24;11101:30;11046:31;10974:5;:23;;;11021:1;10974:48;;;;:::i;:::-;:103;;;;;;:::i;:::-;:157;;;;:::i;10700:581::-;10829:25;10799:5;:23;;;10825:1;10799:27;;;;:::i;:::-;:55;;;;;;:::i;10593:688::-;10653:23;;;;:27;;10679:1;10653:27;:::i;:::-;10593:688;;10542:739;;;10563:23;;;;:27;;10589:1;10563:27;:::i;:::-;10542:739;;;10516:776;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10485:807;;11324:12;:10;:12::i;:::-;11305:13;11319:1;11305:16;;;;;;;;:::i;:::-;;;;;;:31;;;;11349:11;11391:1;11375:5;:13;;;:17;;;11371:4238;;;11456:33;11469:19;11456:12;:33::i;:::-;11437:13;11451:1;11437:16;;;;;;;;:::i;:::-;;;;;;:52;;;;11637:11;11607:5;:23;;;11633:1;11607:27;;;;:::i;:::-;:41;;;;;;:::i;:::-;11593:55;-1:-1:-1;11665:22:2;11757:6;11808:24;11766:39;11780:25;11766:11;:39;:::i;:::-;:66;;;;:::i;:::-;11757:75;;11734:1127;11855:25;11869:11;11855;:25;:::i;:::-;11851:1;:29;11734:1127;;;11941:5;:13;;;:18;;11958:1;11941:18;;:57;;;;11967:31;11963:1;:35;11941:57;11937:909;;;12035:40;12048:14;12060:1;12048:11;:14::i;:::-;:26;12035:12;:40::i;:::-;12023:52;-1:-1:-1;12150:24:2;12122:25;12104:15;12108:11;12104:1;:15;:::i;:::-;:43;;;;:::i;:::-;:70;;;;:::i;:::-;:74;;12177:1;12104:74;:::i;:::-;12098:80;;12222:9;12201:13;12215:3;12201:18;;;;;;;;:::i;:::-;;;;;;:30;;;;11937:909;;;12266:30;12261:1;:35;12257:589;;12388:40;12401:14;12413:1;12401:11;:14::i;12388:40::-;12376:52;-1:-1:-1;12714:30:2;12655:31;12603:24;12550:25;12482:40;12511:11;12482:1;:40;:::i;:::-;:93;;;;:::i;:::-;:145;;;;:::i;:::-;:204;;;;:::i;:::-;:262;;;;:::i;:::-;:291;;12772:1;12482:291;:::i;:::-;12451:322;;12817:9;12796:13;12810:3;12796:18;;;;;;;;:::i;:::-;;;;;;:30;;;;12257:589;11899:3;;;;:::i;:::-;;;;11734:1127;;;-1:-1:-1;12951:11:2;12934:1137;12968:39;12982:25;12968:11;:39;:::i;:::-;12964:1;:43;12934:1137;;;13037:5;:13;;;:18;;13054:1;13037:18;:40;;;;13059:5;:13;;;:18;;13076:1;13059:18;13037:40;13033:1023;;;13199:40;13212:14;13224:1;13212:11;:14::i;13199:40::-;13187:52;-1:-1:-1;13328:24:2;13300:25;13286:11;13268:15;13272:11;13268:1;:15;:::i;:::-;:29;;;;:::i;:::-;:57;;;;:::i;:::-;:84;;;;:::i;:::-;:88;;13355:1;13268:88;:::i;:::-;13262:94;;13400:9;13379:13;13393:3;13379:18;;;;;;;;:::i;:::-;;;;;;:30;;;;13033:1023;;;13439:5;:13;;;:18;;13456:1;13439:18;13435:621;;13559:40;13572:14;13584:1;13572:11;:14::i;13559:40::-;13547:52;-1:-1:-1;13924:30:2;13865:31;13813:24;13760:25;13721:11;13653:40;13682:11;13653:1;:40;:::i;:::-;:79;;;;:::i;:::-;:132;;;;:::i;:::-;:184;;;;:::i;:::-;:243;;;;:::i;:::-;:301;;;;:::i;:::-;:330;;13982:1;13653:330;:::i;:::-;13622:361;;14027:9;14006:13;14020:3;14006:18;;;;;;;;:::i;:::-;;;;;;:30;;;;13435:621;13009:3;;;;:::i;:::-;;;;12934:1137;;;-1:-1:-1;14166:6:2;14175:39;14189:25;14175:11;:39;:::i;:::-;14166:48;;14143:979;14279:24;14237:39;14251:25;14237:11;:39;:::i;:::-;:66;;;;:::i;:::-;14233:1;:70;14143:979;;;14364:5;:13;;;:18;;14381:1;14364:18;:40;;;;14386:5;:13;;;:18;;14403:1;14386:18;14364:40;14360:747;;;14513:40;14526:14;14538:1;14526:11;:14::i;14513:40::-;14501:52;-1:-1:-1;14642:24:2;14614:25;14600:11;14582:15;14586:11;14582:1;:15;:::i;:::-;:29;;;;:::i;:::-;:57;;;;:::i;:::-;:84;;;;:::i;:::-;:88;;14669:1;14582:88;:::i;:::-;14576:94;;14714:9;14693:13;14707:3;14693:18;;;;;;;;:::i;:::-;;;;;;:30;;;;14360:747;;;14753:5;:13;;;:18;;14770:1;14753:18;14749:358;;14873:40;14886:14;14898:1;14886:11;:14::i;14873:40::-;14861:52;-1:-1:-1;15006:24:2;14974:29;14978:25;14974:1;:29;:::i;:::-;14960:11;14942:15;14946:11;14942:1;:15;:::i;:::-;:29;;;;:::i;:::-;:61;;;;:::i;:::-;:88;;;;:::i;:::-;:92;;15033:1;14942:92;:::i;:::-;14936:98;;15078:9;15057:13;15071:3;15057:18;;;;;;;;:::i;:::-;;;;;;:30;;;;14749:358;14322:3;;;;:::i;:::-;;;;14143:979;;;-1:-1:-1;24587:13:2;;;;;;;;;;;;-1:-1:-1;;;24587:13:2;;;;15166;15180:7;:3;15186:1;15180:7;:::i;:::-;15166:22;;;;;;;;:::i;:::-;;;;;;:37;;;;15319:5;:13;;;:18;;15336:1;15319:18;:40;;;;15341:5;:13;;;:18;;15358:1;15341:18;15319:40;15315:86;;;15361:40;15376:25;15361:40;;:::i;:::-;;;15315:86;15437:1;15420:5;:13;;;:18;;;15416:63;;15440:39;15455:24;15440:39;;:::i;:::-;;;15416:63;15498:5;:13;;;:18;;15515:1;15498:18;15494:103;;15533:64;15566:31;15533:30;:64;:::i;:::-;15518:79;;;;:::i;:::-;;;15494:103;11394:4215;11371:4238;15650:9;15645:196;15669:11;15665:1;:15;15645:196;;;15743:1;15727:5;:13;;;:17;;;:25;;15751:1;15727:25;;;15747:1;15727:25;15708:45;;:15;15712:11;15708:1;:15;:::i;:::-;:45;;;;:::i;:::-;15702:51;;15789:40;15802:14;15814:1;15802:11;:14::i;15789:40::-;15768:13;15782:3;15768:18;;;;;;;;:::i;:::-;;;;;;:61;;;;15682:3;;;;;:::i;:::-;;;;15645:196;;;-1:-1:-1;15900:42:2;;-1:-1:-1;;;15900:42:2;;:15;;:26;;:42;;15927:7;;15936:5;;15900:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15900:42:2;;;;;;;;;;;;:::i;:::-;15881:13;15895:1;15881:16;;;;;;;;:::i;:::-;;;;;;:61;;;;15969:25;15980:13;15969:10;:25::i;:::-;15955:40;9286:6717;-1:-1:-1;;;;;;;9286:6717:2:o;5184:314:8:-;5352:41;719:10:6;5385:7:8;5352:18;:41::i;:::-;5344:99;;;;-1:-1:-1;;;5344:99:8;;;;;;;:::i;:::-;5453:38;5467:4;5473:2;5477:7;5486:4;5453:13;:38::i;:::-;5184:314;;;;:::o;23472:1032:2:-;23515:12;23560:936;;;;;;;;;;;;;;;;;23540:956;;23472:1032;:::o;2537:6741::-;7256:4:8;6865:16;;;:7;:16;;;;;;2602:13:2;;-1:-1:-1;;;;;6865:16:8;2628:49:2;;;;-1:-1:-1;;;2628:49:2;;16489:2:21;2628:49:2;;;16471:21:21;16528:2;16508:18;;;16501:30;-1:-1:-1;;;16547:18:21;;;16540:50;16607:18;;2628:49:2;16287:344:21;2628:49:2;2722:42;2767:20;2779:7;2767:11;:20::i;:::-;2722:65;-1:-1:-1;2798:23:2;2824:31;2843:11;:7;2853:1;2843:11;:::i;:::-;2824:18;:31::i;:::-;2798:57;;2866:23;2892:32;2911:5;:12;;;2892:32;;:18;:32::i;:::-;2866:58;;2935:27;2965:39;2999:4;2984:5;:12;;;:19;;;;:::i;:::-;2965:39;;:18;:39::i;:::-;3048:15;;;3060:2;3048:15;;;;;;;;;2935:69;;-1:-1:-1;3017:28:2;;3048:15;;;;;;;;;;;;;;;;;;;;;3017:46;;3093:84;;;;;;;;;;;;;;;;;3074:13;3088:1;3074:16;;;;;;;;:::i;:::-;;;;;;:103;;;;3213:9;3188:13;3202:1;3188:16;;;;;;;;:::i;:::-;;;;;;:35;;;;3253:3120;;;;;;;;;;;;;;;;;3234:13;3248:1;3234:16;;;;;;;;:::i;:::-;;;;;;;;;;:3139;6435:13;;;;6409:40;;-1:-1:-1;;;6409:40:2;;19294:4:21;19282:17;;;6409:40:2;;;19264:36:21;6409:15:2;;:25;;19237:18:21;;6409:40:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6409:40:2;;;;;;;;;;;;:::i;:::-;6384:13;6398:1;6384:16;;;;;;;;:::i;:::-;;;;;;:66;;;;6480:71;;;;;;;;;;;;;;;;;6461:13;6475:1;6461:16;;;;;;;;:::i;:::-;;;;;;;;;;;:90;;;;6613:13;;;6587:40;;-1:-1:-1;;;6587:40:2;;19294:4:21;19282:17;;;6587:40:2;;;19264:36:21;6587:15:2;;:25;;19237:18:21;;6587:40:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6587:40:2;;;;;;;;;;;;:::i;:::-;6562:13;6576:1;6562:16;;;;;;;;:::i;:::-;;;;;;:66;;;;6658:88;;;;;;;;;;;;;;;;;6639:13;6653:1;6639:16;;;;;;;;:::i;:::-;;;;;;;;;;:107;6810:19;;;;6782:48;;-1:-1:-1;;;6782:48:2;;19294:4:21;19282:17;;;6782:48:2;;;19264:36:21;6782:15:2;;:27;;19237:18:21;;6782:48:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6782:48:2;;;;;;;;;;;;:::i;:::-;6757:13;6771:1;6757:16;;;;;;;;:::i;:::-;;;;;;:74;;;;6861:86;;;;;;;;;;;;;;;;;6842:13;6856:1;6842:16;;;;;;;;:::i;:::-;;;;;;;;;;:105;7009:17;;;;6983:44;;-1:-1:-1;;;6983:44:2;;19294:4:21;19282:17;;;6983:44:2;;;19264:36:21;6983:15:2;;:25;;19237:18:21;;6983:44:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6983:44:2;;;;;;;;;;;;:::i;:::-;6958:13;6972:1;6958:16;;;;;;;;:::i;:::-;;;;;;:70;;;;7059:148;;;;;;;;;;;;;;;;;7039:13;7053:2;7039:17;;;;;;;;:::i;:::-;;;;;;:168;;;;7244:9;7218:13;7232:2;7218:17;;;;;;;;:::i;:::-;;;;;;:36;;;;7285:79;;;;;;;;;;;;;;;;;7265:13;7279:2;7265:17;;;;;;;;:::i;:::-;;;;;;:99;;;;7401:13;7375;7389:2;7375:17;;;;;;;;:::i;:::-;;;;;;:40;;;;7446:43;;;;;;;;;;;;;;;;;7426:13;7440:2;7426:17;;;;;;;;:::i;:::-;;;;;;:63;;;;7526:16;7500:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;7514:2;7500:17;;;;;;;;:::i;:::-;;;;;;:43;;;;7574:17;;;;;;;;;;;;;-1:-1:-1;;;7574:17:2;;;7554:13;7568:2;7554:17;;;;;;;;:::i;:::-;;;;;;:37;;;;7628:9;7602:13;7616:2;7602:17;;;;;;;;:::i;:::-;;;;;;:36;;;;7669:18;;;;;;;;;;;;;-1:-1:-1;;;7669:18:2;;;7649:13;7663:2;7649:17;;;;;;;;:::i;:::-;;;;;;:38;;;;7724:33;7743:5;:13;;;7724:33;;:18;:33::i;:::-;7698:13;7712:2;7698:17;;;;;;;;:::i;:::-;;;;;;:60;;;;7789:29;;;;;;;;;;;;;-1:-1:-1;;;7789:29:2;;;7769:13;7783:2;7769:17;;;;;;;;:::i;:::-;;;;;;:49;;;;7855:44;7874:5;:24;;;7855:44;;:18;:44::i;:::-;7829:13;7843:2;7829:17;;;;;;;;:::i;:::-;;;;;;:71;;;;7931:20;;;;;;;;;;;;;-1:-1:-1;;;7931:20:2;;;7911:13;7925:2;7911:17;;;;;;;;:::i;:::-;;;;;;:40;;;;7988:13;7962;7976:2;7962:17;;;;;;;;:::i;:::-;;;;;;:40;;;;8033:18;;;;;;;;;;;;;-1:-1:-1;;;8033:18:2;;;8013:13;8027:2;8013:17;;;;;;;;:::i;:::-;;;;;;:38;;;;8088:33;8107:5;:13;;;8088:33;;:18;:33::i;:::-;8062:13;8076:2;8062:17;;;;;;;;:::i;:::-;;;;;;:60;;;;8153:22;;;;;;;;;;;;;-1:-1:-1;;;8153:22:2;;;8133:13;8147:2;8133:17;;;;;;;;:::i;:::-;;;;;;:42;;;;8212:39;8231:5;:19;;;8212:39;;:18;:39::i;:::-;8186:13;8200:2;8186:17;;;;;;;;:::i;:::-;;;;;;:66;;;;8283:20;;;;;;;;;;;;;-1:-1:-1;;;8283:20:2;;;8263:13;8277:2;8263:17;;;;;;;;:::i;:::-;;;;;;:40;;;;8340:37;8359:5;:17;;;8340:37;;:18;:37::i;:::-;8314:13;8328:2;8314:17;;;;;;;;:::i;:::-;;;;;;:64;;;;8409:15;;;;;;;;;;;;;-1:-1:-1;;;8409:15:2;;;8389:13;8403:2;8389:17;;;;;;;;:::i;:::-;;;;;;:35;;;;8461:30;8480:5;:10;;;8461:30;;:18;:30::i;:::-;8435:13;8449:2;8435:17;;;;;;;;:::i;:::-;;;;;;:57;;;;8523:17;;;;;;;;;;;;;-1:-1:-1;;;8523:17:2;;;8503:13;8517:2;8503:17;;;;;;;;:::i;:::-;;;;;;:37;;;;8577:9;8551:13;8565:2;8551:17;;;;;;;;:::i;:::-;;;;;;:36;;;;8618:32;;;;;;;;;;;;;;;;;8598:13;8612:2;8598:17;;;;;;;;:::i;:::-;;;;;;:52;;;;8687:17;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8687:34:2;;;;;;;;;;;;:::i;:::-;8661:13;8675:2;8661:17;;;;;;;;:::i;:::-;;;;;;;;;;:61;8792:12;;;;8759:46;;-1:-1:-1;;;8759:46:2;;19294:4:21;19282:17;;;8759:46:2;;;19264:36:21;8759:17:2;;:32;;19237:18:21;;8759:46:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8759:46:2;;;;;;;;;;;;:::i;:::-;8733:13;8747:2;8733:17;;;;;;;;:::i;:::-;;;;;;:73;;;;8843:17;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8843:34:2;;;;;;;;;;;;:::i;:::-;8817:13;8831:2;8817:17;;;;;;;;:::i;:::-;;;;;;:61;;;;8931:1;8915:5;:13;;;:17;;;:30;;;;;;;;;;;;;;;-1:-1:-1;;;8915:30:2;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8915:30:2;;;;8889:13;8903:2;8889:17;;;;;;;;:::i;:::-;;;;;;:57;;;;8983:17;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8983:34:2;;;;;;;;;;;;:::i;:::-;8957:13;8971:2;8957:17;;;;;;;;:::i;:::-;;;;;;:61;;;;9055:15;:30;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9055:32:2;;;;;;;;;;;;:::i;:::-;9029:13;9043:2;9029:17;;;;;;;;:::i;:::-;;;;;;;;;;;:59;;;;9156:13;;;9125:45;;-1:-1:-1;;;9125:45:2;;19294:4:21;19282:17;;;9125:45:2;;;19264:36:21;9125:15:2;;:30;;19237:18:21;;9125:45:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9125:45:2;;;;;;;;;;;;:::i;:::-;9099:13;9113:2;9099:17;;;;;;;;:::i;:::-;;;;;;:72;;;;9202:15;;;;;;;;;;;;;-1:-1:-1;;;9202:15:2;;;9182:13;9196:2;9182:17;;;;;;;;:::i;:::-;;;;;;:35;;;;9244:25;9255:13;9244:10;:25::i;1028:154::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2074:198:18:-;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:18;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:18;;19710:2:21;2154:73:18::1;::::0;::::1;19692:21:21::0;19749:2;19729:18;;;19722:30;19788:34;19768:18;;;19761:62;-1:-1:-1;;;19839:18:21;;;19832:36;19885:19;;2154:73:18::1;19508:402:21::0;2154:73:18::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;692:2669:19:-;744:15;852:24;905:4;879:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;852:58;;921:25;2901:11;949:2084;;;;;;;;:::i;:::-;;;;;;;;;;;;;921:2112;;3269:12;3263:19;3258:2;3244:12;3240:21;3237:1;3230:53;3219:64;-1:-1:-1;;;;;;3311:21:19;;3303:51;;;;-1:-1:-1;;;3303:51:19;;21016:2:21;3303:51:19;;;20998:21:21;21055:2;21035:18;;;21028:30;-1:-1:-1;;;21074:18:21;;;21067:47;21131:18;;3303:51:19;20814:341:21;3303:51:19;761:2600;;692:2669;;;:::o;1505:300:8:-;1607:4;-1:-1:-1;;;;;;1642:40:8;;-1:-1:-1;;;1642:40:8;;:104;;-1:-1:-1;;;;;;;1698:48:8;;-1:-1:-1;;;1698:48:8;1642:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:7;;;1762:36:8;829:155:7;13401:133:8;7256:4;6865:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6865:16:8;13474:53;;;;-1:-1:-1;;;13474:53:8;;15726:2:21;13474:53:8;;;15708:21:21;15765:2;15745:18;;;15738:30;-1:-1:-1;;;15784:18:21;;;15777:54;15848:18;;13474:53:8;15524:348:21;12703:171:8;12777:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12777:29:8;-1:-1:-1;;;;;12777:29:8;;;;;;;;:24;;12830:23;12777:24;12830:14;:23::i;:::-;-1:-1:-1;;;;;12821:46:8;;;;;;;;;;;12703:171;;:::o;22972:492:2:-;23221:12;23294:9;;23305:7;23314;23323:18;23343:17;23283:78;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23283:78:2;;;;;;;;;23273:89;;23283:78;23273:89;;;;23260:103;;;22022:19:21;22057:12;23260:103:2;;;;;;;;;;;;23236:138;;;;;;23221:153;;23393:46;23420:5;;23427;23434:4;23393:26;:46::i;:::-;23385:71;;;;-1:-1:-1;;;23385:71:2;;22282:2:21;23385:71:2;;;22264:21:21;22321:2;22301:18;;;22294:30;-1:-1:-1;;;22340:18:21;;;22333:42;22392:18;;23385:71:2;22080:336:21;23385:71:2;23210:254;22972:492;;;;;;;;:::o;17534:3725::-;17711:100;;;17728:12;17711:100;;;22706:19:21;17742:15:2;22741:12:21;;;22734:28;;;;17759:13:2;22778:12:21;;;;22771:28;;;;-1:-1:-1;;17774:14:2;22883:15:21;;22879:24;;22865:12;;;22858:46;17790:10:2;22939:15:21;;;22935:24;22920:13;;;22913:47;22976:13;;;22969:29;;;17640:18:2;;23014:13:21;;17711:100:2;;;-1:-1:-1;;17711:100:2;;;;;;;;;17683:143;;17711:100;17683:143;;;;17850:31;;;:10;;;:31;17683:143;-1:-1:-1;17952:16:2;;;18014:1;18008:3;18001:10;;:14;:44;;18022:4;18029:3;18022:10;18036:1;18022:15;:23;;18044:1;18001:44;;18022:23;18040:1;18001:44;;;18018:1;18001:44;17979:66;;:19;;;:66;-1:-1:-1;18175:6:2;18169:2;18155:16;;;18154:27;18270:6;18263:13;;18259:526;;;18298:1;18278:17;;;:21;18259:526;;;18326:6;18319:4;:13;18315:470;;;18354:1;18334:17;;;:21;18315:470;;;18382:6;18375:4;:13;18371:414;;;18410:1;18390:17;;;:21;18371:414;;;18438:6;18431:4;:13;18427:358;;;18466:1;18446:17;;;:21;18427:358;;;18494:6;18487:4;:13;18483:302;;;18522:1;18502:17;;;:21;18483:302;;;18550:6;18543:4;:13;18539:246;;;18578:1;18558:17;;;:21;18539:246;;;18606:6;18599:4;:13;18595:190;;;18634:1;18614:17;;;:21;18595:190;;;18662:6;18655:4;:13;18651:134;;;18690:1;18670:17;;;:21;18651:134;;;18718:6;18711:4;:13;18707:78;;;18746:1;18726:17;;;:21;18707:78;;;18783:2;18763:17;;;:22;18707:78;-1:-1:-1;18820:3:2;18806:17;;;18922:6;18915:13;;18911:2340;;;18946:1;18930:13;;;:17;18911:2340;;;18974:6;18967:4;:13;18963:2288;;;18998:1;18982:13;;;:17;18963:2288;;;19026:6;19019:4;:13;19015:2236;;;19050:1;19034:13;;;:17;19015:2236;;;19078:6;19071:4;:13;19067:2184;;;19102:1;19086:13;;;:17;19067:2184;;;19130:6;19123:4;:13;19119:2132;;;19154:1;19138:13;;;:17;19119:2132;;;19182:6;19175:4;:13;19171:2080;;;19206:1;19190:13;;;:17;19171:2080;;;19234:6;19227:4;:13;19223:2028;;;19258:1;19242:13;;;:17;19223:2028;;;19286:6;19279:4;:13;19275:1976;;;19310:1;19294:13;;;:17;19275:1976;;;19338:6;19331:4;:13;19327:1924;;;19362:1;19346:13;;;:17;19327:1924;;;19390:6;19383:4;:13;19379:1872;;;19414:1;19398:13;;;:17;19379:1872;;;19442:6;19435:4;:13;19431:1820;;;19466:2;19450:13;;;:18;19431:1820;;;19495:6;19488:4;:13;19484:1767;;;19519:2;19503:13;;;:18;19484:1767;;;19548:6;19541:4;:13;19537:1714;;;19572:2;19556:13;;;:18;19537:1714;;;19601:6;19594:4;:13;19590:1661;;;19625:2;19609:13;;;:18;19590:1661;;;19654:6;19647:4;:13;19643:1608;;;19678:2;19662:13;;;:18;19643:1608;;;19707:6;19700:4;:13;19696:1555;;;19731:2;19715:13;;;:18;19696:1555;;;19760:6;19753:4;:13;19749:1502;;;19784:2;19768:13;;;:18;19749:1502;;;19813:6;19806:4;:13;19802:1449;;;19837:2;19821:13;;;:18;19802:1449;;;19866:6;19859:4;:13;19855:1396;;;19890:2;19874:13;;;:18;19855:1396;;;19919:6;19912:4;:13;19908:1343;;;19943:2;19927:13;;;:18;19908:1343;;;19972:6;19965:4;:13;19961:1290;;;19996:2;19980:13;;;:18;19961:1290;;;20025:6;20018:4;:13;20014:1237;;;20049:2;20033:13;;;:18;20014:1237;;;20078:6;20071:4;:13;20067:1184;;;20102:2;20086:13;;;:18;20067:1184;;;20131:6;20124:4;:13;20120:1131;;;20155:2;20139:13;;;:18;20120:1131;;;20184:6;20177:4;:13;20173:1078;;;20208:2;20192:13;;;:18;20173:1078;;;20237:6;20230:4;:13;20226:1025;;;20261:2;20245:13;;;:18;20226:1025;;;20290:6;20283:4;:13;20279:972;;;20314:2;20298:13;;;:18;20279:972;;;20343:6;20336:4;:13;20332:919;;;20367:2;20351:13;;;:18;20332:919;;;20396:6;20389:4;:13;20385:866;;;20420:2;20404:13;;;:18;20385:866;;;20449:6;20442:4;:13;20438:813;;;20473:2;20457:13;;;:18;20438:813;;;20502:6;20495:4;:13;20491:760;;;20526:2;20510:13;;;:18;20491:760;;;20555:6;20548:4;:13;20544:707;;;20579:2;20563:13;;;:18;20544:707;;;20608:6;20601:4;:13;20597:654;;;20632:2;20616:13;;;:18;20597:654;;;20661:6;20654:4;:13;20650:601;;;20685:2;20669:13;;;:18;20650:601;;;20714:6;20707:4;:13;20703:548;;;20738:2;20722:13;;;:18;20703:548;;;20767:6;20760:4;:13;20756:495;;;20791:2;20775:13;;;:18;20756:495;;;20820:6;20813:4;:13;20809:442;;;20844:2;20828:13;;;:18;20809:442;;;20873:6;20866:4;:13;20862:389;;;20897:2;20881:13;;;:18;20862:389;;;20926:6;20919:4;:13;20915:336;;;20950:2;20934:13;;;:18;20915:336;;;20979:6;20972:4;:13;20968:283;;;21003:2;20987:13;;;:18;20968:283;;;21032:6;21025:4;:13;21021:230;;;21056:2;21040:13;;;:18;21021:230;;;21085:6;21078:4;:13;21074:177;;;21109:2;21093:13;;;:18;21074:177;;;21138:6;21131:4;:13;21127:124;;;21162:2;21146:13;;;:18;21127:124;;;21191:6;21184:4;:13;21180:71;;;21215:2;21199:13;;;:18;21180:71;;;21249:2;21233:13;;;:18;17629:3630;;17534:3725;;:::o;9026:920:8:-;-1:-1:-1;;;;;9105:16:8;;9097:61;;;;-1:-1:-1;;;9097:61:8;;23240:2:21;9097:61:8;;;23222:21:21;;;23259:18;;;23252:30;23318:34;23298:18;;;23291:62;23370:18;;9097:61:8;23038:356:21;9097:61:8;7256:4;6865:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6865:16:8;7279:31;9168:58;;;;-1:-1:-1;;;9168:58:8;;23601:2:21;9168:58:8;;;23583:21:21;23640:2;23620:18;;;23613:30;23679;23659:18;;;23652:58;23727:18;;9168:58:8;23399:352:21;9168:58:8;9237:48;9266:1;9270:2;9274:7;9283:1;9237:20;:48::i;:::-;7256:4;6865:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6865:16:8;7279:31;9372:58;;;;-1:-1:-1;;;9372:58:8;;23601:2:21;9372:58:8;;;23583:21:21;23640:2;23620:18;;;23613:30;23679;23659:18;;;23652:58;23727:18;;9372:58:8;23399:352:21;9372:58:8;-1:-1:-1;;;;;9772:13:8;;;;;;:9;:13;;;;;;;;:18;;9789:1;9772:18;;;9811:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9811:21:8;;;;;9848:33;9819:7;;9772:13;;9848:33;;9772:13;;9848:33;4104:153;;:::o;7475:261::-;7568:4;7584:13;7600:23;7615:7;7600:14;:23::i;:::-;7584:39;;7652:5;-1:-1:-1;;;;;7641:16:8;:7;-1:-1:-1;;;;;7641:16:8;;:52;;;-1:-1:-1;;;;;;4443:25:8;;;4420:4;4443:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7661:32;7641:87;;;;7721:7;-1:-1:-1;;;;;7697:31:8;:20;7709:7;7697:11;:20::i;:::-;-1:-1:-1;;;;;7697:31:8;;7641:87;7633:96;7475:261;-1:-1:-1;;;;7475:261:8:o;11358:1233::-;11512:4;-1:-1:-1;;;;;11485:31:8;:23;11500:7;11485:14;:23::i;:::-;-1:-1:-1;;;;;11485:31:8;;11477:81;;;;-1:-1:-1;;;11477:81:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;11576:16:8;;11568:65;;;;-1:-1:-1;;;11568:65:8;;24364:2:21;11568:65:8;;;24346:21:21;24403:2;24383:18;;;24376:30;24442:34;24422:18;;;24415:62;-1:-1:-1;;;24493:18:21;;;24486:34;24537:19;;11568:65:8;24162:400:21;11568:65:8;11644:42;11665:4;11671:2;11675:7;11684:1;11644:20;:42::i;:::-;11813:4;-1:-1:-1;;;;;11786:31:8;:23;11801:7;11786:14;:23::i;:::-;-1:-1:-1;;;;;11786:31:8;;11778:81;;;;-1:-1:-1;;;11778:81:8;;;;;;;:::i;:::-;11928:24;;;;:15;:24;;;;;;;;11921:31;;-1:-1:-1;;;;;;11921:31:8;;;;;;-1:-1:-1;;;;;12396:15:8;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12396:20:8;;;12430:13;;;;;;;;;:18;;11921:31;12430:18;;;12468:16;;;:7;:16;;;;;;:21;;;;;;;;;;12505:27;;11944:7;;12505:27;;;3473:336;3403:406;;:::o;1352:130:18:-;1266:6;;-1:-1:-1;;;;;1266:6:18;719:10:6;1415:23:18;1407:68;;;;-1:-1:-1;;;1407:68:18;;24769:2:21;1407:68:18;;;24751:21:21;;;24788:18;;;24781:30;24847:34;24827:18;;;24820:62;24899:18;;1407:68:18;24567:356:21;2426:187:18;2518:6;;;-1:-1:-1;;;;;2534:17:18;;;-1:-1:-1;;;;;;2534:17:18;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;13010:307:8:-;13160:8;-1:-1:-1;;;;;13151:17:8;:5;-1:-1:-1;;;;;13151:17:8;;13143:55;;;;-1:-1:-1;;;13143:55:8;;25130:2:21;13143:55:8;;;25112:21:21;25169:2;25149:18;;;25142:30;25208:27;25188:18;;;25181:55;25253:18;;13143:55:8;24928:349:21;13143:55:8;-1:-1:-1;;;;;13208:25:8;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13208:46:8;;;;;;;;;;13269:41;;540::21;;;13269::8;;513:18:21;13269:41:8;;;;;;;13010:307;;;:::o;3548:161:19:-;3602:12;3633:69;3646:7;414:1;3668:33;414:1;-1:-1:-1;;;;;3668:19:19;;;:33;:::i;:::-;3633:12;:69::i;568:113:1:-;623:12;655:18;660:1;663:9;;;;;;;;;;;;655:4;:18::i;6359:305:8:-;6509:28;6519:4;6525:2;6529:7;6509:9;:28::i;:::-;6555:47;6578:4;6584:2;6588:7;6597:4;6555:22;:47::i;:::-;6547:110;;;;-1:-1:-1;;;6547:110:8;;;;;;;:::i;257:1997:15:-;313:17;742:3;735:4;729:11;725:21;851:20;845:4;838:34;995:2;973:20;969:29;962:36;;;1096:1;1091:3;1084:14;1197:3;1431:5;1413:477;1534:1;1529:3;1525:11;1518:18;;1703:2;1697:4;1693:13;1689:2;1685:22;1680:3;1672:36;1794:2;1784:13;;1851:25;1413:477;1851:25;-1:-1:-1;1989:13:15;;;-1:-1:-1;;2103:12:15;;;2219:19;;;2103:12;257:1997;-1:-1:-1;257:1997:15:o;1441:202:17:-;1572:4;1632;1595:33;1616:5;;1623:4;1595:20;:33::i;:::-;:41;;1441:202;-1:-1:-1;;;;;1441:202:17:o;2111:890:9:-;2282:61;2309:4;2315:2;2319:12;2333:9;2282:26;:61::i;:::-;2370:1;2358:9;:13;2354:219;;;2499:63;;-1:-1:-1;;;2499:63:9;;25903:2:21;2499:63:9;;;25885:21:21;25942:2;25922:18;;;25915:30;25981:34;25961:18;;;25954:62;-1:-1:-1;;;26032:18:21;;;26025:51;26093:19;;2499:63:9;25701:417:21;2354:219:9;2601:12;-1:-1:-1;;;;;2628:18:9;;2624:183;;2662:40;2694:7;3810:10;:17;;3783:24;;;;:15;:24;;;;;:44;;;3837:24;;;;;;;;;;;;3707:161;2662:40;2624:183;;;2731:2;-1:-1:-1;;;;;2723:10:9;:4;-1:-1:-1;;;;;2723:10:9;;2719:88;;2749:47;2782:4;2788:7;2749:32;:47::i;:::-;-1:-1:-1;;;;;2820:16:9;;2816:179;;2852:45;2889:7;2852:36;:45::i;:::-;2816:179;;;2924:4;-1:-1:-1;;;;;2918:10:9;:2;-1:-1:-1;;;;;2918:10:9;;2914:81;;2944:40;2972:2;2976:7;2944:27;:40::i;:::-;2272:729;2111:890;;;;:::o;4422:946:19:-;4658:4;4652:11;;5046:22;;;-1:-1:-1;;5042:36:19;5032:47;;5019:61;;;5179:18;;;5054:4;5340:5;5060:2;5325:13;;5316:7;5304:48;4422:946;;;;;:::o;244:316:1:-;317:12;445:1;475:4;507:45;445:1;475:4;507:18;:45::i;:::-;500:52;244:316;-1:-1:-1;;;;;244:316:1:o;14086:831:8:-;14235:4;-1:-1:-1;;;;;14255:13:8;;1465:19:0;:23;14251:660:8;;14290:71;;-1:-1:-1;;;14290:71:8;;-1:-1:-1;;;;;14290:36:8;;;;;:71;;719:10:6;;14341:4:8;;14347:7;;14356:4;;14290:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14290:71:8;;;;;;;;-1:-1:-1;;14290:71:8;;;;;;;;;;;;:::i;:::-;;;14286:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14528:6;:13;14545:1;14528:18;14524:321;;14570:60;;-1:-1:-1;;;14570:60:8;;;;;;;:::i;14524:321::-;14797:6;14791:13;14782:6;14778:2;14774:15;14767:38;14286:573;-1:-1:-1;;;;;;14411:51:8;-1:-1:-1;;;14411:51:8;;-1:-1:-1;14404:58:8;;14251:660;-1:-1:-1;14896:4:8;14889:11;;2391:300:17;2484:7;2526:4;2484:7;2540:116;2560:16;;;2540:116;;;2612:33;2622:12;2636:5;;2642:1;2636:8;;;;;;;:::i;:::-;;;;;;;2612:9;:33::i;:::-;2597:48;-1:-1:-1;2578:3:17;;;;:::i;:::-;;;;2540:116;;;-1:-1:-1;2672:12:17;-1:-1:-1;2391:300:17;;;;;;:::o;15633:396:8:-;15817:1;15805:9;:13;15801:222;;;-1:-1:-1;;;;;15838:18:8;;;15834:85;;-1:-1:-1;;;;;15876:15:8;;;;;;:9;:15;;;;;:28;;15895:9;;15876:15;:28;;15895:9;;15876:28;:::i;:::-;;;;-1:-1:-1;;15834:85:8;-1:-1:-1;;;;;15936:16:8;;;15932:81;;-1:-1:-1;;;;;15972:13:8;;;;;;:9;:13;;;;;:26;;15989:9;;15972:13;:26;;15989:9;;15972:26;:::i;:::-;;;;-1:-1:-1;;15633:396:8;;;;:::o;4485:970:9:-;4747:22;4797:1;4772:22;4789:4;4772:16;:22::i;:::-;:26;;;;:::i;:::-;4808:18;4829:26;;;:17;:26;;;;;;4747:51;;-1:-1:-1;4959:28:9;;;4955:323;;-1:-1:-1;;;;;5025:18:9;;5003:19;5025:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5074:30;;;;;;:44;;;5190:30;;:17;:30;;;;;:43;;;4955:323;-1:-1:-1;5371:26:9;;;;:17;:26;;;;;;;;5364:33;;;-1:-1:-1;;;;;5414:18:9;;;;;:12;:18;;;;;:34;;;;;;;5407:41;4485:970::o;5743:1061::-;6017:10;:17;5992:22;;6017:21;;6037:1;;6017:21;:::i;:::-;6048:18;6069:24;;;:15;:24;;;;;;6437:10;:26;;5992:46;;-1:-1:-1;6069:24:9;;5992:46;;6437:26;;;;;;:::i;:::-;;;;;;;;;6415:48;;6499:11;6474:10;6485;6474:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6578:28;;;:15;:28;;;;;;;:41;;;6747:24;;;;;6740:31;6781:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5814:990;;;5743:1061;:::o;3295:217::-;3379:14;3396:20;3413:2;3396:16;:20::i;:::-;-1:-1:-1;;;;;3426:16:9;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3470:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3295:217:9:o;689:2516:1:-;1017:4;1011:11;1224:18;;1159:4;1144:20;;;;1224:18;1259:20;;1256:83;;;1319:4;1306:11;1299:25;1256:83;1388:4;1375:11;1371:22;1365:29;1484:12;1478:19;1546:4;1532:12;1528:23;1608:4;1595:11;1591:22;1580:9;1576:38;1708:1;1835:9;1797:1209;1872:3;1863:7;1860:16;1797:1209;;;1986:14;;2045:25;;2104:38;;;;2298:4;2368:29;;;;2217:30;;2273;;;2270:37;;2191:135;2305:1;2417:390;2510:23;2492:16;2489:45;2417:390;;;2707:14;2701:21;2693:4;2675:16;2671:27;2656:13;2652:47;2645:78;2783:4;2767:14;2763:25;2745:43;;2600:1;2582:16;2578:24;2558:44;;2417:390;;;-1:-1:-1;;2842:39:1;;;;2899:27;;;2961:30;;;-1:-1:-1;1920:4:1;1907:18;1797:1209;;;-1:-1:-1;;;3062:19:1;;;3058:36;;;3040:55;;;;3022:74;;-1:-1:-1;;;3155:2:1;3127:22;-1:-1:-1;;3123:36:1;3117:4;3110:50;689:2516;;;;:::o;8879:147:17:-;8942:7;8972:1;8968;:5;:51;;9100:13;9191:15;;;9226:4;9219:15;;;9272:4;9256:21;;8968:51;;;-1:-1:-1;9100:13:17;9191:15;;;9226:4;9219:15;9272:4;9256:21;;;8879:147::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:21:-;-1:-1:-1;;;;;;88:32:21;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:21;998:16;;991:27;774:250::o;1029:271::-;1071:3;1109:5;1103:12;1136:6;1131:3;1124:19;1152:76;1221:6;1214:4;1209:3;1205:14;1198:4;1191:5;1187:16;1152:76;:::i;:::-;1282:2;1261:15;-1:-1:-1;;1257:29:21;1248:39;;;;1289:4;1244:50;;1029:271;-1:-1:-1;;1029:271:21:o;1305:220::-;1454:2;1443:9;1436:21;1417:4;1474:45;1515:2;1504:9;1500:18;1492:6;1474:45;:::i;1530:180::-;1589:6;1642:2;1630:9;1621:7;1617:23;1613:32;1610:52;;;1658:1;1655;1648:12;1610:52;-1:-1:-1;1681:23:21;;1530:180;-1:-1:-1;1530:180:21:o;2032:173::-;2100:20;;-1:-1:-1;;;;;2149:31:21;;2139:42;;2129:70;;2195:1;2192;2185:12;2129:70;2032:173;;;:::o;2210:254::-;2278:6;2286;2339:2;2327:9;2318:7;2314:23;2310:32;2307:52;;;2355:1;2352;2345:12;2307:52;2378:29;2397:9;2378:29;:::i;:::-;2368:39;2454:2;2439:18;;;;2426:32;;-1:-1:-1;;;2210:254:21:o;2469:348::-;2521:8;2531:6;2585:3;2578:4;2570:6;2566:17;2562:27;2552:55;;2603:1;2600;2593:12;2552:55;-1:-1:-1;2626:20:21;;2669:18;2658:30;;2655:50;;;2701:1;2698;2691:12;2655:50;2738:4;2730:6;2726:17;2714:29;;2790:3;2783:4;2774:6;2766;2762:19;2758:30;2755:39;2752:59;;;2807:1;2804;2797:12;2752:59;2469:348;;;;;:::o;2822:159::-;2889:20;;2949:6;2938:18;;2928:29;;2918:57;;2971:1;2968;2961:12;2986:1207;3116:6;3124;3132;3140;3148;3156;3164;3217:3;3205:9;3196:7;3192:23;3188:33;3185:53;;;3234:1;3231;3224:12;3185:53;3274:9;3261:23;3303:18;3344:2;3336:6;3333:14;3330:34;;;3360:1;3357;3350:12;3330:34;3399:59;3450:7;3441:6;3430:9;3426:22;3399:59;:::i;:::-;3477:8;;-1:-1:-1;3373:85:21;-1:-1:-1;3562:2:21;3547:18;;3534:32;;-1:-1:-1;3606:4:21;3595:16;;3585:27;;3575:55;;3626:1;3623;3616:12;3575:55;3649:5;3639:15;;3673:37;3706:2;3695:9;3691:18;3673:37;:::i;:::-;3663:47;;3729:37;3762:2;3751:9;3747:18;3729:37;:::i;:::-;3719:47;;3819:3;3808:9;3804:19;3791:33;3775:49;;3849:2;3839:8;3836:16;3833:36;;;3865:1;3862;3855:12;3833:36;3903:8;3892:9;3888:24;3878:34;;3950:7;3943:4;3939:2;3935:13;3931:27;3921:55;;3972:1;3969;3962:12;3921:55;4012:2;3999:16;4038:2;4030:6;4027:14;4024:34;;;4054:1;4051;4044:12;4024:34;4107:7;4102:2;4092:6;4089:1;4085:14;4081:2;4077:23;4073:32;4070:45;4067:65;;;4128:1;4125;4118:12;4067:65;4159:2;4155;4151:11;4141:21;;4181:6;4171:16;;;;;2986:1207;;;;;;;;;;:::o;4198:328::-;4275:6;4283;4291;4344:2;4332:9;4323:7;4319:23;4315:32;4312:52;;;4360:1;4357;4350:12;4312:52;4383:29;4402:9;4383:29;:::i;:::-;4373:39;;4431:38;4465:2;4454:9;4450:18;4431:38;:::i;:::-;4421:48;;4516:2;4505:9;4501:18;4488:32;4478:42;;4198:328;;;;;:::o;4805:1151::-;4891:12;;-1:-1:-1;;;;;1781:31:21;1769:44;;4955:4;4948:5;4944:16;4938:23;4970:46;5010:4;5005:3;5001:14;4987:12;4598:4;4587:16;4575:29;;4531:75;4970:46;;5064:4;5057:5;5053:16;5047:23;5079:49;5122:4;5117:3;5113:14;5097;4687:6;4676:18;4664:31;;4611:90;5079:49;;5176:4;5169:5;5165:16;5159:23;5191:49;5234:4;5229:3;5225:14;5209;4687:6;4676:18;4664:31;;4611:90;5191:49;;5288:4;5281:5;5277:16;5271:23;5303:48;5345:4;5340:3;5336:14;5320;4598:4;4587:16;4575:29;;4531:75;5303:48;;5399:4;5392:5;5388:16;5382:23;5414:48;5456:4;5451:3;5447:14;5431;4598:4;4587:16;4575:29;;4531:75;5414:48;;5510:4;5503:5;5499:16;5493:23;5525:48;5567:4;5562:3;5558:14;5542;4598:4;4587:16;4575:29;;4531:75;5525:48;;5621:4;5614:5;5610:16;5604:23;5636:48;5678:4;5673:3;5669:14;5653;4598:4;4587:16;4575:29;;4531:75;5636:48;-1:-1:-1;5703:6:21;5746:14;;;5740:21;4782:10;4771:22;;5804:12;;;4759:35;-1:-1:-1;;5836:6:21;5879:14;;;5873:21;4782:10;4771:22;;5937:12;;;4759:35;5903:47;4706:94;5961:265;6157:3;6142:19;;6170:50;6146:9;6202:6;6170:50;:::i;6231:411::-;6302:6;6310;6363:2;6351:9;6342:7;6338:23;6334:32;6331:52;;;6379:1;6376;6369:12;6331:52;6419:9;6406:23;6452:18;6444:6;6441:30;6438:50;;;6484:1;6481;6474:12;6438:50;6523:59;6574:7;6565:6;6554:9;6550:22;6523:59;:::i;:::-;6601:8;;6497:85;;-1:-1:-1;6231:411:21;-1:-1:-1;;;;6231:411:21:o;6647:186::-;6706:6;6759:2;6747:9;6738:7;6734:23;6730:32;6727:52;;;6775:1;6772;6765:12;6727:52;6798:29;6817:9;6798:29;:::i;6838:347::-;6903:6;6911;6964:2;6952:9;6943:7;6939:23;6935:32;6932:52;;;6980:1;6977;6970:12;6932:52;7003:29;7022:9;7003:29;:::i;:::-;6993:39;;7082:2;7071:9;7067:18;7054:32;7129:5;7122:13;7115:21;7108:5;7105:32;7095:60;;7151:1;7148;7141:12;7095:60;7174:5;7164:15;;;6838:347;;;;;:::o;7190:127::-;7251:10;7246:3;7242:20;7239:1;7232:31;7282:4;7279:1;7272:15;7306:4;7303:1;7296:15;7322:275;7393:2;7387:9;7458:2;7439:13;;-1:-1:-1;;7435:27:21;7423:40;;7493:18;7478:34;;7514:22;;;7475:62;7472:88;;;7540:18;;:::i;:::-;7576:2;7569:22;7322:275;;-1:-1:-1;7322:275:21:o;7602:186::-;7650:4;7683:18;7675:6;7672:30;7669:56;;;7705:18;;:::i;:::-;-1:-1:-1;7771:2:21;7750:15;-1:-1:-1;;7746:29:21;7777:4;7742:40;;7602:186::o;7793:888::-;7888:6;7896;7904;7912;7965:3;7953:9;7944:7;7940:23;7936:33;7933:53;;;7982:1;7979;7972:12;7933:53;8005:29;8024:9;8005:29;:::i;:::-;7995:39;;8053:38;8087:2;8076:9;8072:18;8053:38;:::i;:::-;8043:48;;8138:2;8127:9;8123:18;8110:32;8100:42;;8193:2;8182:9;8178:18;8165:32;8220:18;8212:6;8209:30;8206:50;;;8252:1;8249;8242:12;8206:50;8275:22;;8328:4;8320:13;;8316:27;-1:-1:-1;8306:55:21;;8357:1;8354;8347:12;8306:55;8393:2;8380:16;8418:48;8434:31;8462:2;8434:31;:::i;:::-;8418:48;:::i;:::-;8489:2;8482:5;8475:17;8529:7;8524:2;8519;8515;8511:11;8507:20;8504:33;8501:53;;;8550:1;8547;8540:12;8501:53;8605:2;8600;8596;8592:11;8587:2;8580:5;8576:14;8563:45;8649:1;8644:2;8639;8632:5;8628:14;8624:23;8617:34;8670:5;8660:15;;;;;7793:888;;;;;;;:::o;8909:260::-;8977:6;8985;9038:2;9026:9;9017:7;9013:23;9009:32;9006:52;;;9054:1;9051;9044:12;9006:52;9077:29;9096:9;9077:29;:::i;:::-;9067:39;;9125:38;9159:2;9148:9;9144:18;9125:38;:::i;:::-;9115:48;;8909:260;;;;;:::o;9174:380::-;9253:1;9249:12;;;;9296;;;9317:61;;9371:4;9363:6;9359:17;9349:27;;9317:61;9424:2;9416:6;9413:14;9393:18;9390:38;9387:161;;9470:10;9465:3;9461:20;9458:1;9451:31;9505:4;9502:1;9495:15;9533:4;9530:1;9523:15;9387:161;;9174:380;;;:::o;10391:127::-;10452:10;10447:3;10443:20;10440:1;10433:31;10483:4;10480:1;10473:15;10507:4;10504:1;10497:15;10523:112;10555:1;10581;10571:35;;10586:18;;:::i;:::-;-1:-1:-1;10620:9:21;;10523:112::o;10640:127::-;10701:10;10696:3;10692:20;10689:1;10682:31;10732:4;10729:1;10722:15;10756:4;10753:1;10746:15;10772:128;10839:9;;;10860:11;;;10857:37;;;10874:18;;:::i;10905:172::-;10972:10;11002;;;11014;;;10998:27;;11037:11;;;11034:37;;;11051:18;;:::i;:::-;11034:37;10905:172;;;;:::o;11082:135::-;11121:3;11142:17;;;11139:43;;11162:18;;:::i;:::-;-1:-1:-1;11209:1:21;11198:13;;11082:135::o;12095:409::-;12297:2;12279:21;;;12336:2;12316:18;;;12309:30;12375:34;12370:2;12355:18;;12348:62;-1:-1:-1;;;12441:2:21;12426:18;;12419:43;12494:3;12479:19;;12095:409::o;12921:127::-;12982:10;12977:3;12973:20;12970:1;12963:31;13013:4;13010:1;13003:15;13037:4;13034:1;13027:15;13592:545;13694:2;13689:3;13686:11;13683:448;;;13730:1;13755:5;13751:2;13744:17;13800:4;13796:2;13786:19;13870:2;13858:10;13854:19;13851:1;13847:27;13841:4;13837:38;13906:4;13894:10;13891:20;13888:47;;;-1:-1:-1;13929:4:21;13888:47;13984:2;13979:3;13975:12;13972:1;13968:20;13962:4;13958:31;13948:41;;14039:82;14057:2;14050:5;14047:13;14039:82;;;14102:17;;;14083:1;14072:13;14039:82;;;14043:3;;;13592:545;;;:::o;14313:1206::-;14437:18;14432:3;14429:27;14426:53;;;14459:18;;:::i;:::-;14488:94;14578:3;14538:38;14570:4;14564:11;14538:38;:::i;:::-;14532:4;14488:94;:::i;:::-;14608:1;14633:2;14628:3;14625:11;14650:1;14645:616;;;;15305:1;15322:3;15319:93;;;-1:-1:-1;15378:19:21;;;15365:33;15319:93;-1:-1:-1;;14270:1:21;14266:11;;;14262:24;14258:29;14248:40;14294:1;14290:11;;;14245:57;15425:78;;14618:895;;14645:616;13539:1;13532:14;;;13576:4;13563:18;;-1:-1:-1;;14681:17:21;;;14782:9;14804:229;14818:7;14815:1;14812:14;14804:229;;;14907:19;;;14894:33;14879:49;;15014:4;14999:20;;;;14967:1;14955:14;;;;14834:12;14804:229;;;14808:3;15061;15052:7;15049:16;15046:159;;;15185:1;15181:6;15175:3;15169;15166:1;15162:11;15158:21;15154:34;15150:39;15137:9;15132:3;15128:19;15115:33;15111:79;15103:6;15096:95;15046:159;;;15248:1;15242:3;15239:1;15235:11;15231:19;15225:4;15218:33;14618:895;;14313:1206;;;:::o;16838:321::-;16914:5;16943:52;16959:35;16987:6;16959:35;:::i;16943:52::-;16934:61;;17018:6;17011:5;17004:21;17058:3;17049:6;17044:3;17040:16;17037:25;17034:45;;;17075:1;17072;17065:12;17034:45;17088:65;17146:6;17139:4;17132:5;17128:16;17123:3;17088:65;:::i;17164:459::-;17244:6;17297:2;17285:9;17276:7;17272:23;17268:32;17265:52;;;17313:1;17310;17303:12;17265:52;17346:9;17340:16;17379:18;17371:6;17368:30;17365:50;;;17411:1;17408;17401:12;17365:50;17434:22;;17487:4;17479:13;;17475:27;-1:-1:-1;17465:55:21;;17516:1;17513;17506:12;17465:55;17539:78;17609:7;17604:2;17598:9;17593:2;17589;17585:11;17539:78;:::i;17628:168::-;17695:6;17721:10;;;17733;;;17717:27;;17756:11;;;17753:37;;;17770:18;;:::i;17801:125::-;17866:9;;;17887:10;;;17884:36;;;17900:18;;:::i;17931:168::-;18004:9;;;18035;;18052:15;;;18046:22;;18032:37;18022:71;;18073:18;;:::i;18104:344::-;18349:25;;;18336:3;18321:19;;18383:59;18438:2;18423:18;;18415:6;18383:59;:::i;18916:191::-;18955:1;18981:10;19018:2;19015:1;19011:10;19040:3;19030:37;;19047:18;;:::i;:::-;19085:10;;19081:20;;;;;18916:191;-1:-1:-1;;18916:191:21:o;19915:427::-;20175:1;20170:3;20163:14;20145:3;20206:6;20200:13;20222:74;20289:6;20285:1;20280:3;20276:11;20269:4;20261:6;20257:17;20222:74;:::i;:::-;20316:16;;;;20334:1;20312:24;;19915:427;-1:-1:-1;;19915:427:21:o;20347:462::-;-1:-1:-1;;;20595:47:21;;20665:13;;20577:3;;20687:75;20665:13;20750:2;20741:12;;20734:4;20722:17;;20687:75;:::i;:::-;20782:16;;;;20800:2;20778:25;;20347:462;-1:-1:-1;;20347:462:21:o;21160:728::-;21423:3;21412:9;21405:22;21464:6;21458:3;21447:9;21443:19;21436:35;21522:6;21514;21508:3;21497:9;21493:19;21480:49;21579:1;21573:3;21549:22;;;21545:32;;21538:43;;;;21684:4;21669:20;;21662:36;;;;21746:4;21734:17;;;;21729:2;21714:18;;21707:45;21771:6;21813:15;;;21808:2;21793:18;;21786:43;21866:15;21860:3;21845:19;;21838:44;21642:2;21621:15;;;-1:-1:-1;;21617:29:21;21602:45;;;21598:55;;;-1:-1:-1;21160:728:21:o;23756:401::-;23958:2;23940:21;;;23997:2;23977:18;;;23970:30;24036:34;24031:2;24016:18;;24009:62;-1:-1:-1;;;24102:2:21;24087:18;;24080:35;24147:3;24132:19;;23756:401::o;25282:414::-;25484:2;25466:21;;;25523:2;25503:18;;;25496:30;25562:34;25557:2;25542:18;;25535:62;-1:-1:-1;;;25628:2:21;25613:18;;25606:48;25686:3;25671:19;;25282:414::o;26123:489::-;-1:-1:-1;;;;;26392:15:21;;;26374:34;;26444:15;;26439:2;26424:18;;26417:43;26491:2;26476:18;;26469:34;;;26539:3;26534:2;26519:18;;26512:31;;;26317:4;;26560:46;;26586:19;;26578:6;26560:46;:::i;:::-;26552:54;26123:489;-1:-1:-1;;;;;;26123:489:21:o;26617:249::-;26686:6;26739:2;26727:9;26718:7;26714:23;26710:32;26707:52;;;26755:1;26752;26745:12;26707:52;26787:9;26781:16;26806:30;26830:5;26806:30;:::i;26871:127::-;26932:10;26927:3;26923:20;26920:1;26913:31;26963:4;26960:1;26953:15;26987:4;26984:1;26977:15
Swarm Source
ipfs://135793af9e531c59bb51bcdac3ee3c0d57dab1670c4a8b8e8fda08787bd435ac
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.