ERC-721
Overview
Max Total Supply
0 YESITIS
Holders
5
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 YESITISLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ThisIsNFT
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; //import "./StringUtils.sol"; import "./ERC721.sol"; import "./Ownable.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 ThisIsNFT is Ownable, ERC721 { using Strings for uint256; using Strings for uint8; string public artist = "Eivind Kleiven"; string public description = "\"This is NFT\" is an onchain project showing what NFT is at its simplest form, a TokenID with transferable ownership in a contract. Anyone can mint for the price of gas and gas price (in gwei) is set as TokenID."; string[4] private colors = ['ffe94d','a6e276','ff9c92','da95d1']; uint8[4][24] private palettes = [[0,1,2,3],[1,0,2,3],[2,0,1,3],[0,2,1,3],[1,2,0,3],[2,1,0,3],[2,1,3,0],[1,2,3,0],[3,2,1,0],[2,3,1,0],[1,3,2,0],[3,1,2,0],[3,0,2,1],[0,3,2,1],[2,3,0,1],[3,2,0,1],[0,2,3,1],[2,0,3,1],[1,0,3,2],[0,1,3,2],[3,1,0,2],[1,3,0,2],[0,3,1,2],[3,0,1,2]]; string private _pBaseURI; bool private _tokenURIAsJson = false; /** * Mapping from tokenId to array where first element is index of palette and second element index of pattern */ mapping(uint256 => uint8) public tokenProperties; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor () ERC721("This is NFT", "YESITIS") { } function color(uint256 tokenId, uint256 index) public view returns (string memory){ return colors[palettes[tokenProperties[tokenId]][index]]; } function getRandomPaletteIndex(uint256 tokenId) internal view returns (uint8) { uint8 index = uint8(uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, tokenId)))%100); if(index >= 40){ return (index-40)/10+18; } else if(index >=20){ return (index-20)/5+14; }else if(index >=8){ return (index-8)/2+8; } return index; } function setBaseURI(string memory baseURI) onlyOwner public { _pBaseURI = baseURI; } function returnJsonFromTokenURI(bool yesorno) onlyOwner public { _tokenURIAsJson = yesorno; } function mint() public { uint tokenId = tx.gasprice/1000000000; _mint(_msgSender(), tokenId); tokenProperties[tokenId] = getRandomPaletteIndex(tokenId); } function svg(uint256 tokenId) public view returns (string memory) { string memory part1 = string(abi.encodePacked("<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 900 900' style='background-color:#",color(tokenId,0),";fill:#",color(tokenId,1),";' font-family='Arial' font-size='30'><text x='76' y='280' fill='#",color(tokenId,2),"' font-weight='bold' font-size='130'>THIS IS NFT</text><text transform='matrix(1 0 0 1 100 400)'><tspan x='0' y='0' font-weight='bold' >Account</tspan><tspan x='0' y='36'>",toAsciiString(ownerOf(tokenId)),"</tspan><tspan x='0' y='144' font-weight='bold'>Is holder of TokenId</tspan><a href='data:text/html,%3C%21DOCTYPE%20html>%3Chtml%20lang%3D%22en%22>%3Chead>%3Ctitle>This%20is%20NFT%20%23",tokenId.toString(),"%3C%2Ftitle>%3Cmeta%20charset%3D%22UTF-8%22>%3Cmeta%20name%3D%22viewport%22%20content%3D%22width%3Ddevice-width%2C%20initial-scale%3D1.0%22>%3Cmeta%20name%3D%22apple-mobile-web-app-capable%22%20content%3D%22yes%22>%3Cstyle>%2A{touch-action%3Anone%3Buser-select%3Anone%3B-webkit-user-select%3Anone%3B-ms-user-select%3Anone%3B-moz-user-select%3Anone%3Bbox-sizing%3Aborder-box}img{pointer-events%3Anone}body{margin%3A0%3Bpadding%3A0%3Bmin-height%3A100vh%3Boverflow%3Ahidden%3Bbackground-color%3A%23202020}%23content{min-height%3A100vh}%23wrapper{min-height%3A100vh}%23scene{--size%3A0px%3B--scale%3A0.65%3Bheight%3Avar%28--size%29%3Bwidth%3Avar%28--size%29%3Bperspective%3A3000px}%23cube{height%3A100%25%3Bposition%3Arelative%3B--rotation-x%3A-40deg%3B--rotation-y%3A45deg%3Btransform-style%3Apreserve-3d%3Btransform%3AtranslateZ%28calc%28-1%2A%28var%28--size%29%2F2%29%29%29%20scale3d%28var%28--scale%29%2C%20var%28--scale%29%2C%20var%28--scale%29%29%20rotateX%28var%28--rotation-x%29%29%20rotateY%28var%28--rotation-y%29%29}.face{display%3Aflex%3Bjustify-content%3Aspace-around%3Balign-items%3Acenter%3Bposition%3Aabsolute%3Bwidth%3Avar%28--size%29%3Bheight%3Avar%28--size%29}.front{transform%3ArotateY%280deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}.right{transform%3ArotateY%2890deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}.back{transform%3ArotateY%28180deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}.left{transform%3ArotateY%28-90deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}.top{transform%3ArotateX%2890deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}.bottom{transform%3ArotateX%28-90deg%29%20translateZ%28calc%28var%28--size%29%2F2%29%29}%40keyframes%20spin{0%25{transform%3AtranslateZ%28calc%28-1%2Avar%28--size%29%2F2%29%29%20scale3d%28var%28--scale%29%2C%20var%28--scale%29%2C%20var%28--scale%29%29%20rotateX%28var%28--rotation-x%29%29%20rotateY%28calc%28var%28--rotation-y%29%29%29}100%25{transform%3AtranslateZ%28calc%28-1%2Avar%28--size%29%2F2%29%29%20scale3d%28var%28--scale%29%2C%20var%28--scale%29%2C%20var%28--scale%29%29%20rotateX%28var%28--rotation-x%29%29%20rotateY%28calc%28var%28--rotation-y%29%20%2B%20360deg%29%29}}%3C%2Fstyle>%20%3Cscript>let%20svg%2Cwrapper%3Ddocument.getElementById%28%22wrapper%22%29%2Cscene%3Ddocument.getElementById%28%22scene%22%29%2Ccube%3Ddocument.getElementById%28%22cube%22%29%2Cp1ScreenX%3D-1%2Cp1ScreenY%3D-1%2Cp1PointerId%3D-1%2Cp2ScreenX%3D-1%2Cp2ScreenY%3D-1%2Cp2PointerId%3D-1%2CprevDiff%3D-1%3Bfunction%20getRotationYFrom3DMatrix%28e%29{var%20t%3DparseFloat%28getComputedStyle%28cube%29.getPropertyValue%28%22--scale%22%29%29%2Cn%3D%28n%3D%28n%3De.split%28%22%28%22%29%5B1%5D%29.split%28%22%29%22%29%5B0%5D%29.split%28%22%2C%22%29%2Cr%3DMath.sign%28n%5B0%5D%29%2Co%3DMath.abs%28n%5B0%5D%2Ft%29%2Ce%3Dr%2A%28o-Math.floor%28o%29%29%2Ct%3Dn%5B1%5D%2Co%3Dn%5B2%5D%2Cn%3Dn%5B3%5D%2Ce%3DMath.round%28Math.acos%28e%29%2A%28180%2FMath.PI%29%29%2Ct%3DMath.round%28Math.asin%28t%29%2A%28180%2FMath.PI%29%29%2Co%3DMath.round%28-1%2AMath.asin%28o%29%2A%28180%2FMath.PI%29%29%2Cr%3D%28Math.round%28Math.acos%28n%29%2A%28180%2FMath.PI%29%29%2C1%29%3Bt%3C0%3FMath.sign%28t%29%3D%3DMath.sign%28o%29%26%26%28r%3D-1%29%3A0%3Ct%26%26Math.sign%28t%29%21%3DMath.sign%28o%29%26%26%28r%3D-1%29%3Bo%3DparseInt%28getComputedStyle%28cube%29.getPropertyValue%28%22--rotation-x%22%29.substr%280%2CgetComputedStyle%28cube%29.getPropertyValue%28%22--rotation-x%22%29.indexOf%28%22deg%22%29%29%29%3Breturn%2090%3C%3DMath.abs%28o%29%26%26Math.abs%28o%29%3C270%26%26%28r%2A%3D-1%29%2Cr%2Ae}function%20setSize%28%29{stopSpin%28%29%2Cscene.style.setProperty%28%22--size%22%2C%220px%22%29%2Cwrapper.style.marginRight%3D%220px%22%2Cwrapper.style.marginLeft%3D%220px%22%3Bvar%20e%3Dwrapper.offsetHeight%2Ct%3Dwrapper.offsetWidth%2B2%2Awrapper.offsetLeft%3Blet%20n%3D0%2Cr%3Dt%3Be%3Ct%26%26%28n%3Dt-e%2Cr%3De%29%2Cwrapper.style.marginRight%3DMath.ceil%28n%2F2%29%2B%22px%22%2Cwrapper.style.marginLeft%3DMath.floor%28n%2F2%29%2B%22px%22%2Cscene.style.setProperty%28%22--size%22%2Cr%2B%22px%22%29%2CstartSpin%28%29}function%20zoom%28e%29{stopSpin%28%29%2Cscene.style.setProperty%28%22--scale%22%2CMath.max%28%2BMath.sign%28e%29%2F80%2BparseFloat%28getComputedStyle%28scene%29.getPropertyValue%28%22--scale%22%29%29%2C.01%29%29}function%20pointerdown_handler%28e%29{stopSpin%28%29%2C-1%3D%3Dp1PointerId%3F%28p1PointerId%3De.pointerId%2Cp1ScreenX%3De.screenX%2Cp1ScreenY%3De.screenY%29%3A-1%3D%3Dp2PointerId%26%26%28p2PointerId%3De.pointerId%2Cp2ScreenX%3De.screenX%2Cp2ScreenY%3De.screenY%29}function%20pointerup_handler%28e%2Ct%29{startSpin%28%29%2Cp1PointerId%3D-1%2Cp1ScreenX%3D-1%2Cp1ScreenY%3D-1%2Cp2PointerId%3D-1%2Cp2ScreenX%3D-1%2C%28p2ScreenY%3D-1%29%21%3Dp1PointerId%26%26-1%21%3Dp2PointerId||%28prevDiff%3D-1%29}function%20pointermove_handler%28n%29{if%28n.preventDefault%28%29%2C-1%21%3Dp1PointerId%29{let%20e%3D0%2Ct%3D0%3Bn.pointerId%3D%3Dp1PointerId%3F%28e%3Dn.screenX-p1ScreenX%2Ct%3Dn.screenY-p1ScreenY%2Cp1ScreenX%3Dn.screenX%2Cp1ScreenY%3Dn.screenY%29%3An.pointerId%3D%3Dp2PointerId%26%26%28p2ScreenX%3Dn.screenX%2Cp2ScreenY%3Dn.screenY%29%2C-1%21%3Dp1PointerId%26%26-1%3D%3Dp2PointerId%3Frotate%28e%2Ct%29%3A-1%21%3Dp1PointerId%26%26-1%21%3Dp2PointerId%26%26%28n%3DMath.sqrt%28Math.pow%28p1ScreenX-p2ScreenX%2C2%29%2BMath.pow%28p1ScreenY-p2ScreenY%2C2%29%29%2C0%3CprevDiff%26%26zoom%28n-prevDiff%29%2CprevDiff%3Dn%29}}function%20rotate%28e%2Ct%29{t%3D%28parseInt%28getComputedStyle%28cube%29.getPropertyValue%28%22--rotation-x%22%29.substr%280%2CgetComputedStyle%28cube%29.getPropertyValue%28%22--rotation-x%22%29.indexOf%28%22deg%22%29%29%29%2B-1%2At%29%25360%2B%22deg%22%2Ce%3DparseInt%28getComputedStyle%28cube%29.getPropertyValue%28%22--rotation-y%22%29.substr%280%2CgetComputedStyle%28cube%29.getPropertyValue%28%22--rotation-y%22%29.indexOf%28%22deg%22%29%29%29%2Be%2B%22deg%22%3Bcube.style.setProperty%28%22--rotation-x%22%2Ct%29%2Ccube.style.setProperty%28%22--rotation-y%22%2Ce%29}function%20stopSpin%28%29{var%20e%3Dwindow.getComputedStyle%28cube%29.getPropertyValue%28%22transform%22%29%3Bcube.style.animation%3D%22none%22%3Be%3DgetRotationYFrom3DMatrix%28e%29%3Bcube.style.setProperty%28%22--rotation-y%22%2Ce%2B%22deg%22%29}function%20startSpin%28%29{cube.style.animation%3D%22spin%2020s%20linear%20infinite%22}window.addEventListener%28%22DOMContentLoaded%22%2C%28%29%3D>{wrapper%3Ddocument.getElementById%28%22wrapper%22%29%2Cscene%3Ddocument.getElementById%28%22scene%22%29%2Ccube%3Ddocument.getElementById%28%22cube%22%29%2Csvg%3Ddocument.getElementsByTagName%28%22svg%22%29%5B0%5D%2Ccube.children%5B1%5D.appendChild%28svg.cloneNode%28%210%29%29%2Ccube.children%5B2%5D.appendChild%28svg.cloneNode%28%210%29%29%2Ccube.children%5B3%5D.appendChild%28svg.cloneNode%28%210%29%29%2Ccube.children%5B4%5D.appendChild%28svg.cloneNode%28%210%29%29%2Ccube.children%5B5%5D.appendChild%28svg.cloneNode%28%210%29%29%2Cscene.addEventListener%28%22pointerup%22%2Cpointerup_handler%29%2Cscene.addEventListener%28%22pointermove%22%2Cpointermove_handler%29%2Cscene.addEventListener%28%22pointerdown%22%2Cpointerdown_handler%29%2Cscene.addEventListener%28%22pointerleave%22%2Cpointerup_handler%29%2Cscene.addEventListener%28%22pointercancel%22%2Cpointerup_handler%29%2Cscene.addEventListener%28%22wheel%22%2Ce%3D>{zoom%28-1%2Ae.deltaY%29}%29%2CsetSize%28%29%2Cvoid%200%21%3D%3Dwindow.onresize%3Fwindow.onresize%3DsetSize%3Avoid%200%21%3D%3Dwindow.onorientationchange%26%26%28window.onorientationchange%3DsetSize%29}%29%3B%3C%2Fscript>%20%3C%2Fhead>%3Cbody>%3Cdiv%20id%3D%22content%22>%3Cdiv%20id%3D%22wrapper%22>%3Cdiv%20id%3D%22scene%22>%3Cdiv%20id%3D%22cube%22%20class%3D%22cube%22>%3Cdiv%20class%3D%22face%20front%22>%20%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%20900%20900%22%20style%3D%22background-color%3A%23",color(tokenId,0),"%3Bfill%3A%")); string memory part2 = string(abi.encodePacked("23",color(tokenId,1),"%3B%22%20font-family%3D%22Arial%22%20font-size%3D%2230%22>%20%3Ctext%20x%3D%2276%22%20y%3D%22280%22%20fill%3D%22%23",color(tokenId,2),"%22%20font-weight%3D%22bold%22%20font-size%3D%22130%22>THIS%20IS%20NFT%3C%2Ftext>%20%3Ctext%20transform%3D%22matrix%281%200%200%201%20100%20400%29%22>%20%3Ctspan%20x%3D%220%22%20y%3D%220%22%20font-weight%3D%22bold%22%20>Account%3C%2Ftspan>%20%3Ctspan%20x%3D%220%22%20y%3D%2236%22>",toAsciiString(ownerOf(tokenId)),"%3C%2Ftspan>%20%3Ctspan%20x%3D%220%22%20y%3D%22144%22%20font-weight%3D%22bold%22>Is%20holder%20of%20TokenId%3C%2Ftspan>%20%3Ctspan%20x%3D%220%22%20y%3D%22180%22>",tokenId.toString(),"%3C%2Ftspan>%20%3Ctspan%20x%3D%220%22%20y%3D%22288%22%20font-weight%3D%22bold%22>In%20contract%3C%2Ftspan>%20%3Ctspan%20x%3D%220%22%20y%3D%22324%22>",toAsciiString(address(this)),"%3C%2Ftspan>%20%3C%2Ftext>%20%3Ccircle%20cx%3D%22425%22%20cy%3D%22150%22%20r%3D%2220%22%20fill%3D%22%23",color(tokenId,3),"%22>%3C%2Fcircle>%20%3C%2Fsvg>%3C%2Fdiv>%3Cdiv%20class%3D%22face%20back%22>%3C%2Fdiv>%3Cdiv%20class%3D%22face%20right%22>%3C%2Fdiv>%3Cdiv%20class%3D%22face%20left%22>%3C%2Fdiv>%3Cdiv%20class%3D%22face%20top%22>%3C%2Fdiv>%3Cdiv%20class%3D%22face%20bottom%22>%3C%2Fdiv>%3C%2Fdiv>%3C%2Fdiv>%3C%2Fdiv>%3C%2Fdiv>%3C%2Fbody>%3C%2Fhtml>'><tspan x='0' y")); string memory part3 = string(abi.encodePacked("='180' fill='#",color(tokenId,1),"'>",tokenId.toString(),"</tspan></a><tspan x='0' y='288' font-weight='bold'>In contract</tspan><tspan x='0' y='324'>",toAsciiString(address(this)),"</tspan></text><circle cx='425' cy='150' r='20' fill='#",color(tokenId,3),"'></circle></svg>")); return string(abi.encodePacked(part1,part2,part3)); } function metadata(uint256 tokenId) public view returns (string memory) { return string(abi.encodePacked("{\"name\":\"This is NFT #",tokenId.toString(),"\",\"createdBy\":\"Eivind Kleiven\",\"yearCreated\":\"2021\",\"description\": \"Still don't know what the hells a NFT?\",\"image_data\":\"",svg(tokenId),"\",\"attributes\":[{\"trait_type\":\"Palette\",\"value\":\"",tokenProperties[tokenId].toString(),"\"}]}")); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if(_tokenURIAsJson){ return metadata(tokenId); } string memory part1 = string(abi.encodePacked(_pBaseURI,"?t=",tokenId.toString(),"&a=",toAsciiString(ownerOf(tokenId)),"&c=",toAsciiString(address(this)))); string memory part2 = string(abi.encodePacked("&p=",tokenProperties[tokenId].toString(),"&c0=",color(tokenId,0),"&c1=",color(tokenId,1),"&c2=",color(tokenId,2),"&c3=",color(tokenId,3))); return string(abi.encodePacked(part1,part2)); } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(abi.encodePacked("0x",s)); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-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. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"color","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"yesorno","type":"bool"}],"name":"returnJsonFromTokenURI","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"svg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenProperties","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]
Contract Creation Code
60c0604052600e60808190526d22b4bb34b7321025b632b4bb32b760911b60a090815262000031916007919062000540565b5060405180610100016040528060d2815260200162005d7260d291398051620000639160089160209091019062000540565b506040805160c081018252600660808201818152651999994e4d1960d21b60a084015282528251808401845281815265309b32991b9b60d11b60208281019190915280840191909152835180850185528281526533331cb19c9960d11b818301528385015283518085019094529083526564613935643160d01b908301526060810191909152620000f9906009906004620005cf565b50604080516103808101825260006103008201818152600161032084018190526002610340850181905260036103608601819052928552855160808181018852838252602082810187905282890184905260608084018790528189019390935288518083018a52848152808201889052808a01869052808401879052888a015288518083018a52878152808201859052808a018690528084018790528389015288518083018a52858152808201859052808a018890528084018790528289015288518083018a52848152808201869052808a0188905280840187905260a089015288518083018a52848152808201869052808a0187905280840188905260c089015288518083018a52858152808201859052808a0187905280840188905260e089015288518083018a52868152808201859052808a0186905280840188905261010089015288518083018a52848152808201879052808a0186905280840188905261012089015288518083018a52858152808201879052808a0185905280840188905261014089015288518083018a52868152808201869052808a0185905280840188905261016089015288518083018a52868152808201889052808a0185905280840186905261018089015288518083018a52878152808201879052808a018590528084018690526101a089015288518083018a52848152808201879052808a018890528084018690526101c089015288518083018a52868152808201859052808a018890528084018690526101e089015288518083018a52878152808201859052808a0187905280840186905261020089015288518083018a52848152808201889052808a0187905280840186905261022089015288518083018a52858152808201889052808a0187905280840185905261024089015288518083018a52878152808201869052808a0187905280840185905261026089015288518083018a52868152808201869052808a0188905280840185905261028089015288518083018a52858152808201879052808a018890528084018590526102a089015288518083018a52878152808201879052808a018690528084018590526102c0890152885191820189529481529384019490945294820152908101929092526102e08101919091526200044f90600d90601862000622565b506026805460ff191690553480156200046757600080fd5b506040518060400160405280600b81526020016a151a1a5cc81a5cc813919560aa1b815250604051806040016040528060078152602001665945534954495360c81b8152506000620004be6200053c60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200051d90600190602085019062000540565b5080516200053390600290602084019062000540565b505050620007be565b3390565b8280546200054e9062000781565b90600052602060002090601f016020900481019282620005725760008555620005bd565b82601f106200058d57805160ff1916838001178555620005bd565b82800160010185558215620005bd579182015b82811115620005bd578251825591602001919060010190620005a0565b50620005cb9291506200066f565b5090565b826004810192821562000614579160200282015b828111156200061457825180516200060391849160209091019062000540565b5091602001919060010190620005e3565b50620005cb92915062000686565b826018810192821562000661579160200282015b8281111562000661578251620006509083906004620006a7565b509160200191906001019062000636565b50620005cb92915062000670565b5b80821115620005cb576000815560010162000670565b80821115620005cb5760006200069d82826200073c565b5060010162000686565b600183019183908215620005bd5791602002820160005b83821115620006fe57835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620006be565b80156200072d5782816101000a81549060ff0219169055600101602081600001049283019260010302620006fe565b5050620005cb9291506200066f565b5080546200074a9062000781565b6000825580601f106200075e57506200077e565b601f0160209004906000526020600020908101906200077e91906200066f565b50565b600181811c908216806200079657607f821691505b60208210811415620007b857634e487b7160e01b600052602260045260246000fd5b50919050565b6155a480620007ce6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806355f804b3116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461035d578063e3684e3914610370578063e985e9c514610383578063f2fde38b146103bf5761018e565b806395d89b411461032f578063a22cb46514610337578063b88d4fde1461034a5761018e565b806355f804b3146102c75780636352211e146102da57806370a08231146102ed578063715018a61461030e5780637284e416146103165780638da5cb5b1461031e5761018e565b806328c108f01161014b57806342842e0e1161012557806342842e0e1461028657806342966c681461029957806343bc1612146102ac57806344b285db146102b45761018e565b806328c108f01461022b5780632b50d4d51461023e57806334110a4d146102515761018e565b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb5780631249c58b1461021057806323b872dd14610218575b600080fd5b6101a66101a1366004611cd2565b6103d2565b60405190151581526020015b60405180910390f35b6101c3610426565b6040516101b2919061518c565b6101e36101de366004611d50565b6104b8565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004611c8f565b610552565b005b61020e610668565b61020e610226366004611bb2565b6106af565b61020e610239366004611cb8565b6106e1565b6101c361024c366004611d68565b61071e565b61027461025f366004611d50565b60276020526000908152604090205460ff1681565b60405160ff90911681526020016101b2565b61020e610294366004611bb2565b61083d565b61020e6102a7366004611d50565b610858565b6101c36108d2565b6101c36102c2366004611d50565b610960565b61020e6102d5366004611d0a565b610ab3565b6101e36102e8366004611d50565b610af4565b6103006102fb366004611b5f565b610b6b565b6040519081526020016101b2565b61020e610bf2565b6101c3610c66565b6000546001600160a01b03166101e3565b6101c3610c73565b61020e610345366004611c66565b610c82565b61020e610358366004611bed565b610d54565b6101c361036b366004611d50565b610d8c565b6101c361037e366004611d50565b610f05565b6101a6610391366004611b80565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020e6103cd366004611b5f565b610f5c565b60006001600160e01b031982166380ac58cd60e01b148061040357506001600160e01b03198216635b5e139f60e01b145b8061041e57506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b606060018054610435906154ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610461906154ac565b80156104ae5780601f10610483576101008083540402835291602001916104ae565b820191906000526020600020905b81548152906001019060200180831161049157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166105365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061055d82610af4565b9050806001600160a01b0316836001600160a01b031614156105cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161052d565b336001600160a01b03821614806105e757506105e78133610391565b6106595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161052d565b6106638383611046565b505050565b6000610678633b9aca003a6152b4565b905061068433826110b4565b61068d816111f6565b600091825260276020526040909120805460ff191660ff909216919091179055565b6106ba335b826112e0565b6106d65760405162461bcd60e51b815260040161052d90615226565b6106638383836113d7565b6000546001600160a01b0316331461070b5760405162461bcd60e51b815260040161052d906151f1565b6026805460ff1916911515919091179055565b600082815260276020526040902054606090600990600d9060ff166018811061075757634e487b7160e01b600052603260045260246000fd5b01836004811061077757634e487b7160e01b600052603260045260246000fd5b602081049091015460ff601f9092166101000a900416600481106107ab57634e487b7160e01b600052603260045260246000fd5b0180546107b7906154ac565b80601f01602080910402602001604051908101604052809291908181526020018280546107e3906154ac565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b5050505050905092915050565b61066383838360405180602001604052806000815250610d54565b610861336106b4565b6108c65760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161052d565b6108cf81611577565b50565b600780546108df906154ac565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906154ac565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b505050505081565b6060600061096f83600061071e565b61097a84600161071e565b61098585600261071e565b61099661099187610af4565b611612565b61099f87611797565b6109aa88600061071e565b6040516020016109bf969594939291906126c8565b604051602081830303815290604052905060006109dd84600161071e565b6109e885600261071e565b6109f461099187610af4565b6109fd87611797565b610a0630611612565b610a1189600361071e565b604051602001610a2696959493929190611f33565b60405160208183030381529060405290506000610a4485600161071e565b610a4d86611797565b610a5630611612565b610a6188600361071e565b604051602001610a749493929190614f3c565b6040516020818303038152906040529050828282604051602001610a9a93929190611e00565b6040516020818303038152906040529350505050919050565b6000546001600160a01b03163314610add5760405162461bcd60e51b815260040161052d906151f1565b8051610af0906025906020840190611a29565b5050565b6000818152600360205260408120546001600160a01b03168061041e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161052d565b60006001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161052d565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c1c5760405162461bcd60e51b815260040161052d906151f1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600880546108df906154ac565b606060028054610435906154ac565b6001600160a01b038216331415610cdb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161052d565b3360008181526006602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d48911515815260200190565b60405180910390a35050565b610d5e33836112e0565b610d7a5760405162461bcd60e51b815260040161052d90615226565b610d86848484846118b2565b50505050565b6000818152600360205260409020546060906001600160a01b0316610e0b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161052d565b60265460ff1615610e2657610e1f82610f05565b9050610421565b60006025610e3384611797565b610e3f61099186610af4565b610e4830611612565b604051602001610e5b9493929190611e43565b60408051601f19818403018152918152600085815260276020529081205491925090610e899060ff16611797565b610e9485600061071e565b610e9f86600161071e565b610eaa87600261071e565b610eb588600361071e565b604051602001610ec995949392919061508f565b60405160208183030381529060405290508181604051602001610eed929190611dd1565b60405160208183030381529060405292505050919050565b6060610f1082611797565b610f1983610960565b600084815260276020526040902054610f349060ff16611797565b604051602001610f4693929190612571565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314610f865760405162461bcd60e51b815260040161052d906151f1565b6001600160a01b038116610feb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161052d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061107b82610af4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b03821661110a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161052d565b6000818152600360205260409020546001600160a01b03161561116f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161052d565b6001600160a01b0382166000908152600460205260408120805460019290611198908490615277565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080514260208201526bffffffffffffffffffffffff193360601b16918101919091526054810182905260009081906064906074016040516020818303038152906040528051906020012060001c61124f9190615502565b905060288160ff161061128657600a61126960288361545d565b61127391906152c8565b61127e90601261528f565b915050610421565b60148160ff16106112b357600561129e60148361545d565b6112a891906152c8565b61127e90600e61528f565b60088160ff161061041e5760026112cb60088361545d565b6112d591906152c8565b61127e90600861528f565b6000818152600360205260408120546001600160a01b03166113595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161052d565b600061136483610af4565b9050806001600160a01b0316846001600160a01b0316148061139f5750836001600160a01b0316611394846104b8565b6001600160a01b0316145b806113cf57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166113ea82610af4565b6001600160a01b0316146114525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161052d565b6001600160a01b0382166114b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161052d565b6114bf600082611046565b6001600160a01b03831660009081526004602052604081208054600192906114e8908490615446565b90915550506001600160a01b0382166000908152600460205260408120805460019290611516908490615277565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061158282610af4565b905061158f600083611046565b6001600160a01b03811660009081526004602052604081208054600192906115b8908490615446565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561176e57600061164f826013615446565b61165a9060086153fe565b611665906002615330565b611678906001600160a01b0387166152b4565b60f81b9050600060108260f81c61168f91906152c8565b60f81b905060008160f81c60106116a6919061541d565b8360f81c6116b4919061545d565b60f81b90506116c2826118e5565b856116ce8660026153fe565b815181106116ec57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061170c816118e5565b856117188660026153fe565b611723906001615277565b8151811061174157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053505050508080611766906154e7565b915050611639565b50806040516020016117809190612547565b604051602081830303815290604052915050919050565b6060816117bc57506040805180820190915260018152600360fc1b6020820152610421565b8160005b81156117e657806117d0816154e7565b91506117df9050600a836152b4565b91506117c0565b60008167ffffffffffffffff81111561180f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611839576020820181803683370190505b5090505b84156113cf5761184e600183615446565b915061185b600a86615502565b611866906030615277565b60f81b81838151811061188957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506118ab600a866152b4565b945061183d565b6118bd8484846113d7565b6118c98484848461191c565b610d865760405162461bcd60e51b815260040161052d9061519f565b6000600a60f883901c101561190d5761190360f883901c603061528f565b60f81b9050610421565b61190360f883901c605761528f565b60006001600160a01b0384163b15611a1e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061196090339089908890889060040161514f565b602060405180830381600087803b15801561197a57600080fd5b505af19250505080156119aa575060408051601f3d908101601f191682019092526119a791810190611cee565b60015b611a04573d8080156119d8576040519150601f19603f3d011682016040523d82523d6000602084013e6119dd565b606091505b5080516119fc5760405162461bcd60e51b815260040161052d9061519f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b506001949350505050565b828054611a35906154ac565b90600052602060002090601f016020900481019282611a575760008555611a9d565b82601f10611a7057805160ff1916838001178555611a9d565b82800160010185558215611a9d579182015b82811115611a9d578251825591602001919060010190611a82565b50611aa9929150611aad565b5090565b5b80821115611aa95760008155600101611aae565b600067ffffffffffffffff80841115611add57611add615542565b604051601f8501601f19908116603f01168101908282118183101715611b0557611b05615542565b81604052809350858152868686011115611b1e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461042157600080fd5b8035801515811461042157600080fd5b600060208284031215611b70578081fd5b611b7982611b38565b9392505050565b60008060408385031215611b92578081fd5b611b9b83611b38565b9150611ba960208401611b38565b90509250929050565b600080600060608486031215611bc6578081fd5b611bcf84611b38565b9250611bdd60208501611b38565b9150604084013590509250925092565b60008060008060808587031215611c02578081fd5b611c0b85611b38565b9350611c1960208601611b38565b925060408501359150606085013567ffffffffffffffff811115611c3b578182fd5b8501601f81018713611c4b578182fd5b611c5a87823560208401611ac2565b91505092959194509250565b60008060408385031215611c78578182fd5b611c8183611b38565b9150611ba960208401611b4f565b60008060408385031215611ca1578182fd5b611caa83611b38565b946020939093013593505050565b600060208284031215611cc9578081fd5b611b7982611b4f565b600060208284031215611ce3578081fd5b8135611b7981615558565b600060208284031215611cff578081fd5b8151611b7981615558565b600060208284031215611d1b578081fd5b813567ffffffffffffffff811115611d31578182fd5b8201601f81018413611d41578182fd5b6113cf84823560208401611ac2565b600060208284031215611d61578081fd5b5035919050565b60008060408385031215611d7a578182fd5b50508035926020909101359150565b60008151808452611da1816020860160208601615480565b601f01601f19169290920160200192915050565b60008151611dc7818560208601615480565b9290920192915050565b60008351611de3818460208801615480565b835190830190611df7818360208801615480565b01949350505050565b60008451611e12818460208901615480565b845190830190611e26818360208901615480565b8451910190611e39818360208801615480565b0195945050505050565b600080865482600182811c915080831680611e5f57607f831692505b6020808410821415611e7f57634e487b7160e01b87526022600452602487fd5b818015611e935760018114611ea457611ed0565b60ff19861689528489019650611ed0565b60008d815260209020885b86811015611ec85781548b820152908501908301611eaf565b505084890196505b505050505050611f28611f22611f13611f0d611efe611ef886623f743d60e81b815260030190565b8b611db5565b6226613d60e81b815260030190565b88611db5565b6226633d60e81b815260030190565b85611db5565b979650505050505050565b600061323360f01b82528751611f50816002850160208c01615480565b7f253342253232253230666f6e742d66616d696c79253344253232417269616c256002918401918201527f3232253230666f6e742d73697a6525334425323233302532323e25323025334360228201527f746578742532307825334425323237362532322532307925334425323232383060428201527225323225323066696c6c25334425323225323360681b60628201528751611ff5816075840160208c01615480565b7f253232253230666f6e742d776569676874253344253232626f6c642532322532607592909101918201527f30666f6e742d73697a652533442532323133302532323e54484953253230495360958201527f2532304e4654253343253246746578743e25323025334374657874253230747260b58201527f616e73666f726d2533442532326d61747269782532383125323030253230302560d58201527f3230312532303130302532303430302532392532323e2532302533437473706160f58201527f6e253230782533442532323025323225323079253344253232302532322532306101158201527f666f6e742d776569676874253344253232626f6c642532322532303e4163636f6101358201527f756e74253343253246747370616e3e253230253343747370616e2532307825336101558201527f44253232302532322532307925334425323233362532323e000000000000000061017582015261253a61239161238b61230661230061224861224261217761018d89018f611db5565b7f253343253246747370616e3e253230253343747370616e25323078253344253281527f323025323225323079253344253232313434253232253230666f6e742d77656960208201527f676874253344253232626f6c642532323e4973253230686f6c6465722532306f60408201527f66253230546f6b656e4964253343253246747370616e3e25323025334374737060608201527f616e2532307825334425323230253232253230792533442532323138302532326080820152601f60f91b60a082015260a10190565b8c611db5565b7f253343253246747370616e3e253230253343747370616e25323078253344253281527f323025323225323079253344253232323838253232253230666f6e742d77656960208201527f676874253344253232626f6c642532323e496e253230636f6e7472616374253360408201527f43253246747370616e3e253230253343747370616e25323078253344253232306060820152731299191299183c9299a212991919991a1299191f60611b608082015260940190565b89611db5565b7f253343253246747370616e3e253230253343253246746578743e25323025334381527f636972636c65253230637825334425323234323525323225323063792533442560208201527f323231353025323225323072253344253232323025323225323066696c6c25336040820152664425323225323360c81b606082015260670190565b86611db5565b7f2532323e253343253246636972636c653e2532302533432532467376673e253381527f432532466469763e253343646976253230636c6173732533442532326661636560208201527f2532306261636b2532323e2533432532466469763e253343646976253230636c60408201527f6173732533442532326661636525323072696768742532323e2533432532466460608201527f69763e253343646976253230636c617373253344253232666163652532306c6560808201527f66742532323e2533432532466469763e253343646976253230636c617373253360a08201527f4425323266616365253230746f702532323e2533432532466469763e2533436460c08201527f6976253230636c61737325334425323266616365253230626f74746f6d25323260e08201527f3e2533432532466469763e2533432532466469763e2533432532466469763e256101008201527f33432532466469763e2533432532466469763e253343253246626f64793e25336101208201527f4325324668746d6c3e273e3c747370616e20783d2730272079000000000000006101408201526101590190565b9998505050505050505050565b600061060f60f31b82528251612564816002850160208701615480565b9190910160020192915050565b757b226e616d65223a2254686973206973204e4654202360501b815283516000906125a3816016850160208901615480565b7f222c22637265617465644279223a22456976696e64204b6c656976656e222c226016918401918201527f7965617243726561746564223a2232303231222c226465736372697074696f6e60368201527f223a20225374696c6c20646f6e2774206b6e6f7720776861742074686520686560568201527f6c6c732061204e46543f222c22696d6167655f64617461223a2200000000000060768201528451612652816090840160208901615480565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2250609092909101918201527030b632ba3a329116113b30b63ab2911d1160791b60b082015283516126aa8160c1840160208801615480565b63227d5d7d60e01b60c1929091019182015260c50195945050505050565b60007f3c7376672076657273696f6e3d27312e312720786d6c6e733d27687474703a2f82527f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e60208301527f6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2760408301527f2076696577426f783d27302030203930302039303027207374796c653d27626160608301526f636b67726f756e642d636f6c6f723a2360801b6080830152875161278b816090850160208c01615480565b663b66696c6c3a2360c81b60909184019182015287516127b2816097840160208c01615480565b7f3b2720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a65609792909101918201527f3d273330273e3c7465787420783d2737362720793d27323830272066696c6c3d60b782015261272360f01b60d782015261253a614f2561238b6129ec61230061290561224261283060d989018f611db5565b7f2720666f6e742d7765696768743d27626f6c642720666f6e742d73697a653d2781527f313330273e54484953204953204e46543c2f746578743e3c746578742074726160208201527f6e73666f726d3d276d617472697828312030203020312031303020343030292760408201527f3e3c747370616e20783d27302720793d27302720666f6e742d7765696768743d60608201527f27626f6c6427203e4163636f756e743c2f747370616e3e3c747370616e20783d60808201526a139813903c9e93999b139f60a91b60a082015260ab0190565b7f3c2f747370616e3e3c747370616e20783d27302720793d273134342720666f6e81527f742d7765696768743d27626f6c64273e497320686f6c646572206f6620546f6b60208201527f656e49643c2f747370616e3e3c6120687265663d27646174613a746578742f6860408201527f746d6c2c253343253231444f435459504525323068746d6c3e25334368746d6c60608201527f2532306c616e67253344253232656e2532323e253343686561643e253343746960808201527f746c653e5468697325323069732532304e46542532302532330000000000000060a082015260b90190565b7f2533432532467469746c653e2533436d6574612532306368617273657425334481527f2532325554462d382532323e2533436d6574612532306e616d6525334425323260208201527f76696577706f7274253232253230636f6e74656e74253344253232776964746860408201527f2533446465766963652d7769647468253243253230696e697469616c2d73636160608201527f6c65253344312e302532323e2533436d6574612532306e616d6525334425323260808201527f6170706c652d6d6f62696c652d7765622d6170702d63617061626c652532322560a08201527f3230636f6e74656e742533442532327965732532323e2533437374796c653e2560c08201527f32417b746f7563682d616374696f6e2533416e6f6e65253342757365722d736560e08201527f6c6563742533416e6f6e652533422d7765626b69742d757365722d73656c65636101008201527f742533416e6f6e652533422d6d732d757365722d73656c6563742533416e6f6e6101208201527f652533422d6d6f7a2d757365722d73656c6563742533416e6f6e65253342626f6101408201527f782d73697a696e67253341626f726465722d626f787d696d677b706f696e74656101608201527f722d6576656e74732533416e6f6e657d626f64797b6d617267696e25334130256101808201527f334270616464696e67253341302533426d696e2d6865696768742533413130306101a08201527f76682533426f766572666c6f7725334168696464656e2533426261636b67726f6101c08201527f756e642d636f6c6f722533412532333230323032307d253233636f6e74656e746101e08201527f7b6d696e2d68656967687425334131303076687d253233777261707065727b6d6102008201527f696e2d68656967687425334131303076687d2532337363656e657b2d2d73697a6102208201527f652533413070782533422d2d7363616c65253341302e363525334268656967686102408201527f742533417661722532382d2d73697a65253239253342776964746825334176616102608201527f722532382d2d73697a65253239253342706572737065637469766525334133306102808201527f303070787d253233637562657b686569676874253341313030253235253342706102a08201527f6f736974696f6e25334172656c61746976652533422d2d726f746174696f6e2d6102c08201527f782533412d34306465672533422d2d726f746174696f6e2d79253341343564656102e08201527f672533427472616e73666f726d2d7374796c6525334170726573657276652d336103008201527f642533427472616e73666f726d2533417472616e736c6174655a25323863616c6103208201527f632532382d312532412532387661722532382d2d73697a6525323925324632256103408201527f32392532392532392532307363616c6533642532387661722532382d2d7363616103608201527f6c652532392532432532307661722532382d2d7363616c6525323925324325326103808201527f307661722532382d2d7363616c65253239253239253230726f746174655825326103a08201527f387661722532382d2d726f746174696f6e2d78253239253239253230726f74616103c08201527f7465592532387661722532382d2d726f746174696f6e2d792532392532397d2e6103e08201527f666163657b646973706c6179253341666c65782533426a7573746966792d636f6104008201527f6e74656e7425334173706163652d61726f756e64253342616c69676e2d6974656104208201527f6d7325334163656e746572253342706f736974696f6e2533416162736f6c75746104408201527f6525334277696474682533417661722532382d2d73697a6525323925334268656104608201527f696768742533417661722532382d2d73697a652532397d2e66726f6e747b74726104808201527f616e73666f726d253341726f74617465592532383064656725323925323074726104a08201527f616e736c6174655a25323863616c632532387661722532382d2d73697a6525326104c08201527f39253246322532392532397d2e72696768747b7472616e73666f726d253341726104e08201527f6f746174655925323839306465672532392532307472616e736c6174655a25326105008201527f3863616c632532387661722532382d2d73697a6525323925324632253239253261052082018190527f397d2e6261636b7b7472616e73666f726d253341726f746174655925323831386105408301527f306465672532392532307472616e736c6174655a25323863616c6325323876616105608301527f722532382d2d73697a65253239253246322532392532397d2e6c6566747b74726105808301527f616e73666f726d253341726f74617465592532382d39306465672532392532306105a08301527f7472616e736c6174655a25323863616c632532387661722532382d2d73697a656105c08301527f253239253246322532392532397d2e746f707b7472616e73666f726d253341726105e08301527f6f746174655825323839306465672532392532307472616e736c6174655a25326106008301526106208201527f397d2e626f74746f6d7b7472616e73666f726d253341726f74617465582532386106408201527f2d39306465672532392532307472616e736c6174655a25323863616c632532386106608201527f7661722532382d2d73697a65253239253246322532392532397d2534306b65796106808201527f6672616d65732532307370696e7b302532357b7472616e73666f726d253341746106a08201527f72616e736c6174655a25323863616c632532382d312532417661722532382d2d6106c08201527f73697a65253239253246322532392532392532307363616c65336425323876616106e08201527f722532382d2d7363616c652532392532432532307661722532382d2d7363616c6107008201527f652532392532432532307661722532382d2d7363616c652532392532392532306107208201527f726f74617465582532387661722532382d2d726f746174696f6e2d78253239256107408201527f3239253230726f746174655925323863616c632532387661722532382d2d726f6107608201527f746174696f6e2d792532392532392532397d3130302532357b7472616e73666f6107808201527f726d2533417472616e736c6174655a25323863616c632532382d3125324176616107a08201527f722532382d2d73697a65253239253246322532392532392532307363616c65336107c08201527f642532387661722532382d2d7363616c652532392532432532307661722532386107e08201527f2d2d7363616c652532392532432532307661722532382d2d7363616c652532396108008201527f253239253230726f74617465582532387661722532382d2d726f746174696f6e6108208201527f2d78253239253239253230726f746174655925323863616c63253238766172256108408201527f32382d2d726f746174696f6e2d792532392532302532422532303336306465676108608201527f2532392532397d7d2533432532467374796c653e2532302533437363726970746108808201527f3e6c657425323073766725324377726170706572253344646f63756d656e742e6108a08201527f676574456c656d656e74427949642532382532327772617070657225323225326108c08201527f392532437363656e65253344646f63756d656e742e676574456c656d656e74426108e08201527f7949642532382532327363656e6525323225323925324363756265253344646f6109008201527f63756d656e742e676574456c656d656e744279496425323825323263756265256109208201527f3232253239253243703153637265656e582533442d31253243703153637265656109408201527f6e592533442d312532437031506f696e74657249642533442d312532437032536109608201527f637265656e582533442d31253243703253637265656e592533442d31253243706109808201527f32506f696e74657249642533442d3125324370726576446966662533442d31256109a08201527f334266756e6374696f6e253230676574526f746174696f6e5946726f6d33444d6109c08201527f6174726978253238652532397b766172253230742533447061727365466c6f616109e08201527f74253238676574436f6d70757465645374796c65253238637562652532392e67610a008201527f657450726f706572747956616c75652532382532322d2d7363616c6525323225610a208201527f32392532392532436e2533442532386e2533442532386e253344652e73706c69610a408201527f74253238253232253238253232253239253542312535442532392e73706c6974610a608201527f253238253232253239253232253239253542302535442532392e73706c697425610a808201527f3238253232253243253232253239253243722533444d6174682e7369676e2532610aa08201527f386e253542302535442532392532436f2533444d6174682e6162732532386e25610ac08201527f3542302535442532467425323925324365253344722532412532386f2d4d6174610ae08201527f682e666c6f6f722532386f253239253239253243742533446e25354231253544610b008201527f2532436f2533446e253542322535442532436e2533446e253542332535442532610b208201527f43652533444d6174682e726f756e642532384d6174682e61636f732532386525610b408201527f32392532412532383138302532464d6174682e50492532392532392532437425610b608201527f33444d6174682e726f756e642532384d6174682e6173696e2532387425323925610b808201527f32412532383138302532464d6174682e50492532392532392532436f2533444d610ba08201527f6174682e726f756e642532382d312532414d6174682e6173696e2532386f2532610bc08201527f392532412532383138302532464d6174682e5049253239253239253243722533610be08201527f442532384d6174682e726f756e642532384d6174682e61636f732532386e2532610c008201527f392532412532383138302532464d6174682e5049253239253239253243312532610c208201527f3925334274253343302533464d6174682e7369676e2532387425323925334425610c408201527f33444d6174682e7369676e2532386f253239253236253236253238722533442d610c608201527f3125323925334130253343742532362532364d6174682e7369676e2532387425610c808201527f32392532312533444d6174682e7369676e2532386f2532392532362532362532610ca08201527f38722533442d312532392533426f2533447061727365496e7425323867657443610cc08201527f6f6d70757465645374796c65253238637562652532392e67657450726f706572610ce08201527f747956616c75652532382532322d2d726f746174696f6e2d782532322532392e610d008201527f73756273747225323830253243676574436f6d70757465645374796c65253238610d208201527f637562652532392e67657450726f706572747956616c75652532382532322d2d610d408201527f726f746174696f6e2d782532322532392e696e6465784f662532382532326465610d608201527f6725323225323925323925323925334272657475726e25323039302533432533610d808201527f444d6174682e6162732532386f2532392532362532364d6174682e6162732532610da08201527f386f253239253343323730253236253236253238722532412533442d31253239610dc08201527f25324372253241657d66756e6374696f6e25323073657453697a652532382532610de08201527f397b73746f705370696e2532382532392532437363656e652e7374796c652e73610e008201527f657450726f70657274792532382532322d2d73697a6525323225324325323230610e208201527f7078253232253239253243777261707065722e7374796c652e6d617267696e52610e408201527f69676874253344253232307078253232253243777261707065722e7374796c65610e608201527f2e6d617267696e4c656674253344253232307078253232253342766172253230610e808201527f65253344777261707065722e6f66667365744865696768742532437425334477610ea08201527f7261707065722e6f666673657457696474682532423225324177726170706572610ec08201527f2e6f66667365744c6566742533426c65742532306e2533443025324372253344610ee08201527f7425334265253343742532362532362532386e253344742d6525324372253344610f008201527f65253239253243777261707065722e7374796c652e6d617267696e5269676874610f208201527f2533444d6174682e6365696c2532386e25324632253239253242253232707825610f408201527f3232253243777261707065722e7374796c652e6d617267696e4c656674253344610f608201527f4d6174682e666c6f6f722532386e253246322532392532422532327078253232610f808201527f2532437363656e652e7374796c652e73657450726f7065727479253238253232610fa08201527f2d2d73697a652532322532437225324225323270782532322532392532437374610fc08201527f6172745370696e2532382532397d66756e6374696f6e2532307a6f6f6d253238610fe08201527f652532397b73746f705370696e2532382532392532437363656e652e7374796c6110008201527f652e73657450726f70657274792532382532322d2d7363616c652532322532436110208201527f4d6174682e6d61782532382532424d6174682e7369676e2532386525323925326110408201527f4638302532427061727365466c6f6174253238676574436f6d707574656453746110608201527f796c652532387363656e652532392e67657450726f706572747956616c7565256110808201527f32382532322d2d7363616c652532322532392532392532432e303125323925326110a08201527f397d66756e6374696f6e253230706f696e746572646f776e5f68616e646c65726110c08201527f253238652532397b73746f705370696e2532382532392532432d3125334425336110e08201527f447031506f696e74657249642533462532387031506f696e74657249642533446111008201527f652e706f696e7465724964253243703153637265656e58253344652e736372656111208201527f656e58253243703153637265656e59253344652e73637265656e5925323925336111408201527f412d312533442533447032506f696e74657249642532362532362532387032506111608201527f6f696e7465724964253344652e706f696e7465724964253243703253637265656111808201527f6e58253344652e73637265656e58253243703253637265656e59253344652e736111a08201527f637265656e592532397d66756e6374696f6e253230706f696e74657275705f686111c08201527f616e646c657225323865253243742532397b73746172745370696e25323825326111e08201527f392532437031506f696e74657249642533442d31253243703153637265656e586112008201527f2533442d31253243703153637265656e592533442d312532437032506f696e746112208201527f657249642533442d31253243703253637265656e582533442d312532432532386112408201527f703253637265656e592533442d312532392532312533447031506f696e7465726112608201527f49642532362532362d312532312533447032506f696e74657249647c7c2532386112808201527f70726576446966662533442d312532397d66756e6374696f6e253230706f696e6112a08201527f7465726d6f76655f68616e646c65722532386e2532397b69662532386e2e70726112c08201527f6576656e7444656661756c742532382532392532432d312532312533447031506112e08201527f6f696e74657249642532397b6c657425323065253344302532437425334430256113008201527f33426e2e706f696e74657249642533442533447031506f696e746572496425336113208201527f46253238652533446e2e73637265656e582d703153637265656e5825324374256113408201527f33446e2e73637265656e592d703153637265656e59253243703153637265656e6113608201527f582533446e2e73637265656e58253243703153637265656e592533446e2e73636113808201527f7265656e592532392533416e2e706f696e74657249642533442533447032506f6113a08201527f696e7465724964253236253236253238703253637265656e582533446e2e73636113c08201527f7265656e58253243703253637265656e592533446e2e73637265656e592532396113e08201527f2532432d312532312533447031506f696e74657249642532362532362d3125336114008201527f442533447032506f696e7465724964253346726f7461746525323865253243746114208201527f2532392533412d312532312533447031506f696e74657249642532362532362d6114408201527f312532312533447032506f696e74657249642532362532362532386e2533444d6114608201527f6174682e737172742532384d6174682e706f77253238703153637265656e582d6114808201527f703253637265656e58253243322532392532424d6174682e706f7725323870316114a08201527f53637265656e592d703253637265656e592532433225323925323925324330256114c08201527f334370726576446966662532362532367a6f6f6d2532386e2d707265764469666114e08201527f6625323925324370726576446966662533446e2532397d7d66756e6374696f6e6115008201527f253230726f7461746525323865253243742532397b74253344253238706172736115208201527f65496e74253238676574436f6d70757465645374796c652532386375626525326115408201527f392e67657450726f706572747956616c75652532382532322d2d726f746174696115608201527f6f6e2d782532322532392e73756273747225323830253243676574436f6d70756115808201527f7465645374796c65253238637562652532392e67657450726f706572747956616115a08201527f6c75652532382532322d2d726f746174696f6e2d782532322532392e696e64656115c08201527f784f662532382532326465672532322532392532392532392532422d312532416115e08201527f74253239253235333630253242253232646567253232253243652533447061726116008201527f7365496e74253238676574436f6d70757465645374796c6525323863756265256116208201527f32392e67657450726f706572747956616c75652532382532322d2d726f7461746116408201527f696f6e2d792532322532392e73756273747225323830253243676574436f6d706116608201527f757465645374796c65253238637562652532392e67657450726f7065727479566116808201527f616c75652532382532322d2d726f746174696f6e2d792532322532392e696e646116a08201527f65784f66253238253232646567253232253239253239253239253242652532426116c08201527f253232646567253232253342637562652e7374796c652e73657450726f7065726116e08201527f74792532382532322d2d726f746174696f6e2d782532322532437425323925326117008201527f43637562652e7374796c652e73657450726f70657274792532382532322d2d726117208201527f6f746174696f6e2d79253232253243652532397d66756e6374696f6e253230736117408201527f746f705370696e2532382532397b7661722532306525334477696e646f772e676117608201527f6574436f6d70757465645374796c65253238637562652532392e67657450726f6117808201527f706572747956616c75652532382532327472616e73666f726d253232253239256117a08201527f3342637562652e7374796c652e616e696d6174696f6e2533442532326e6f6e656117c08201527f25323225334265253344676574526f746174696f6e5946726f6d33444d6174726117e08201527f697825323865253239253342637562652e7374796c652e73657450726f7065726118008201527f74792532382532322d2d726f746174696f6e2d792532322532436525324225326118208201527f326465672532322532397d66756e6374696f6e25323073746172745370696e256118408201527f32382532397b637562652e7374796c652e616e696d6174696f6e2533442532326118608201527f7370696e2532303230732532306c696e656172253230696e66696e69746525326118808201527f327d77696e646f772e6164644576656e744c697374656e6572253238253232446118a08201527f4f4d436f6e74656e744c6f616465642532322532432532382532392533443e7b6118c08201527f77726170706572253344646f63756d656e742e676574456c656d656e744279496118e08201527f64253238253232777261707065722532322532392532437363656e65253344646119008201527f6f63756d656e742e676574456c656d656e74427949642532382532327363656e6119208201527f6525323225323925324363756265253344646f63756d656e742e676574456c656119408201527f6d656e74427949642532382532326375626525323225323925324373766725336119608201527f44646f63756d656e742e676574456c656d656e747342795461674e616d6525326119808201527f3825323273766725323225323925354230253544253243637562652e6368696c6119a08201527f6472656e253542312535442e617070656e644368696c642532387376672e636c6119c08201527f6f6e654e6f646525323825323130253239253239253243637562652e6368696c6119e082018190527f6472656e253542322535442e617070656e644368696c642532387376672e636c611a00830152611a2082018190527f6472656e253542332535442e617070656e644368696c642532387376672e636c611a40830152611a6082018190527f6472656e253542342535442e617070656e644368696c642532387376672e636c611a80830152611aa08201527f6472656e253542352535442e617070656e644368696c642532387376672e636c611ac08201527f6f6e654e6f6465253238253231302532392532392532437363656e652e616464611ae08201527f4576656e744c697374656e6572253238253232706f696e746572757025323225611b008201527f3243706f696e74657275705f68616e646c65722532392532437363656e652e61611b208201527f64644576656e744c697374656e6572253238253232706f696e7465726d6f7665611b408201527f253232253243706f696e7465726d6f76655f68616e646c657225323925324373611b608201527f63656e652e6164644576656e744c697374656e6572253238253232706f696e74611b808201527f6572646f776e253232253243706f696e746572646f776e5f68616e646c657225611ba08201527f32392532437363656e652e6164644576656e744c697374656e65722532382532611bc08201527f32706f696e7465726c65617665253232253243706f696e74657275705f68616e611be08201527f646c65722532392532437363656e652e6164644576656e744c697374656e6572611c008201527f253238253232706f696e74657263616e63656c253232253243706f696e746572611c208201527f75705f68616e646c65722532392532437363656e652e6164644576656e744c69611c408201527f7374656e6572253238253232776865656c253232253243652533443e7b7a6f6f611c608201527f6d2532382d31253241652e64656c7461592532397d2532392532437365745369611c808201527f7a65253238253239253243766f69642532303025323125334425334477696e64611ca08201527f6f772e6f6e726573697a6525334677696e646f772e6f6e726573697a65253344611cc08201527f73657453697a65253341766f69642532303025323125334425334477696e646f611ce08201527f772e6f6e6f7269656e746174696f6e6368616e67652532362532362532387769611d008201527f6e646f772e6f6e6f7269656e746174696f6e6368616e67652533447365745369611d208201527f7a652532397d2532392533422533432532467363726970743e25323025334325611d408201527f3246686561643e253343626f64793e2533436469762532306964253344253232611d608201527f636f6e74656e742532323e253343646976253230696425334425323277726170611d808201527f7065722532323e25334364697625323069642533442532327363656e65253232611da08201527f3e253343646976253230696425334425323263756265253232253230636c6173611dc08201527f73253344253232637562652532323e253343646976253230636c617373253344611de08201527f2532326661636525323066726f6e742532323e25323025334373766725323076611e008201527f657273696f6e253344253232312e31253232253230786d6c6e73253344253232611e208201527f687474702533412532462532467777772e77332e6f7267253246323030302532611e408201527f46737667253232253230786d6c6e73253341786c696e6b253344253232687474611e608201527f702533412532462532467777772e77332e6f726725324631393939253246786c611e808201527f696e6b25323225323076696577426f7825334425323230253230302532303930611ea08201527f302532303930302532322532307374796c652533442532326261636b67726f75611ec08201526d6e642d636f6c6f7225334125323360901b611ee0820152611eee0190565b6a25334266696c6c2533412560a81b8152600b0190565b60006d3d27313830272066696c6c3d272360901b82528551614f6581600e850160208a01615480565b61139f60f11b600e918401918201528551614f87816010840160208a01615480565b7f3c2f747370616e3e3c2f613e3c747370616e20783d27302720793d2732383827601092909101918201527f20666f6e742d7765696768743d27626f6c64273e496e20636f6e74726163743c60308201527f2f747370616e3e3c747370616e20783d27302720793d27333234273e000000006050820152845161501181606c840160208901615480565b7f3c2f747370616e3e3c2f746578743e3c636972636c652063783d273432352720606c92909101918201527f63793d273135302720723d273230272066696c6c3d2723000000000000000000608c820152611f2861507260a3830186611db5565b70139f1e17b1b4b931b6329f1e17b9bb339f60791b815260110190565b60006226703d60e81b825286516150ad816003850160208b01615480565b632663303d60e01b60039184019182015286516150d1816007840160208b01615480565b632663313d60e01b6007929091019182015285516150f681600b840160208a01615480565b632663323d60e01b600b9290910191820152845161511b81600f840160208901615480565b632663333d60e01b600f92909101918201528351615140816013840160208801615480565b01601301979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061518290830184611d89565b9695505050505050565b600060208252611b796020830184611d89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561528a5761528a615516565b500190565b600060ff821660ff84168060ff038211156152ac576152ac615516565b019392505050565b6000826152c3576152c361552c565b500490565b600060ff8316806152db576152db61552c565b8060ff84160491505092915050565b80825b60018086116152fc5750615327565b81870482111561530e5761530e615516565b8086161561531b57918102915b9490941c9380026152ed565b94509492505050565b6000611b79600019848460008261534957506001611b79565b8161535657506000611b79565b816001811461536c5760028114615376576153a3565b6001915050611b79565b60ff84111561538757615387615516565b6001841b91508482111561539d5761539d615516565b50611b79565b5060208310610133831016604e8410600b84101617156153d6575081810a838111156153d1576153d1615516565b611b79565b6153e384848460016152ea565b8086048211156153f5576153f5615516565b02949350505050565b600081600019048311821515161561541857615418615516565b500290565b600060ff821660ff84168160ff048111821515161561543e5761543e615516565b029392505050565b60008282101561545857615458615516565b500390565b600060ff821660ff84168082101561547757615477615516565b90039392505050565b60005b8381101561549b578181015183820152602001615483565b83811115610d865750506000910152565b600181811c908216806154c057607f821691505b602082108114156154e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154fb576154fb615516565b5060010190565b6000826155115761551161552c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108cf57600080fdfea2646970667358221220a66ea4139bc30b2a60b53c830e4c148d1398b313a37498388df323e3818160af64736f6c634300080300332254686973206973204e46542220697320616e206f6e636861696e2070726f6a6563742073686f77696e672077686174204e4654206973206174206974732073696d706c65737420666f726d2c206120546f6b656e49442077697468207472616e7366657261626c65206f776e65727368697020696e206120636f6e74726163742e20416e796f6e652063616e206d696e7420666f7220746865207072696365206f662067617320616e64206761732070726963652028696e2067776569292069732073657420617320546f6b656e49442e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806355f804b3116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461035d578063e3684e3914610370578063e985e9c514610383578063f2fde38b146103bf5761018e565b806395d89b411461032f578063a22cb46514610337578063b88d4fde1461034a5761018e565b806355f804b3146102c75780636352211e146102da57806370a08231146102ed578063715018a61461030e5780637284e416146103165780638da5cb5b1461031e5761018e565b806328c108f01161014b57806342842e0e1161012557806342842e0e1461028657806342966c681461029957806343bc1612146102ac57806344b285db146102b45761018e565b806328c108f01461022b5780632b50d4d51461023e57806334110a4d146102515761018e565b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb5780631249c58b1461021057806323b872dd14610218575b600080fd5b6101a66101a1366004611cd2565b6103d2565b60405190151581526020015b60405180910390f35b6101c3610426565b6040516101b2919061518c565b6101e36101de366004611d50565b6104b8565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004611c8f565b610552565b005b61020e610668565b61020e610226366004611bb2565b6106af565b61020e610239366004611cb8565b6106e1565b6101c361024c366004611d68565b61071e565b61027461025f366004611d50565b60276020526000908152604090205460ff1681565b60405160ff90911681526020016101b2565b61020e610294366004611bb2565b61083d565b61020e6102a7366004611d50565b610858565b6101c36108d2565b6101c36102c2366004611d50565b610960565b61020e6102d5366004611d0a565b610ab3565b6101e36102e8366004611d50565b610af4565b6103006102fb366004611b5f565b610b6b565b6040519081526020016101b2565b61020e610bf2565b6101c3610c66565b6000546001600160a01b03166101e3565b6101c3610c73565b61020e610345366004611c66565b610c82565b61020e610358366004611bed565b610d54565b6101c361036b366004611d50565b610d8c565b6101c361037e366004611d50565b610f05565b6101a6610391366004611b80565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020e6103cd366004611b5f565b610f5c565b60006001600160e01b031982166380ac58cd60e01b148061040357506001600160e01b03198216635b5e139f60e01b145b8061041e57506301ffc9a760e01b6001600160e01b03198316145b90505b919050565b606060018054610435906154ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610461906154ac565b80156104ae5780601f10610483576101008083540402835291602001916104ae565b820191906000526020600020905b81548152906001019060200180831161049157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166105365760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061055d82610af4565b9050806001600160a01b0316836001600160a01b031614156105cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161052d565b336001600160a01b03821614806105e757506105e78133610391565b6106595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161052d565b6106638383611046565b505050565b6000610678633b9aca003a6152b4565b905061068433826110b4565b61068d816111f6565b600091825260276020526040909120805460ff191660ff909216919091179055565b6106ba335b826112e0565b6106d65760405162461bcd60e51b815260040161052d90615226565b6106638383836113d7565b6000546001600160a01b0316331461070b5760405162461bcd60e51b815260040161052d906151f1565b6026805460ff1916911515919091179055565b600082815260276020526040902054606090600990600d9060ff166018811061075757634e487b7160e01b600052603260045260246000fd5b01836004811061077757634e487b7160e01b600052603260045260246000fd5b602081049091015460ff601f9092166101000a900416600481106107ab57634e487b7160e01b600052603260045260246000fd5b0180546107b7906154ac565b80601f01602080910402602001604051908101604052809291908181526020018280546107e3906154ac565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b5050505050905092915050565b61066383838360405180602001604052806000815250610d54565b610861336106b4565b6108c65760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161052d565b6108cf81611577565b50565b600780546108df906154ac565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906154ac565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b505050505081565b6060600061096f83600061071e565b61097a84600161071e565b61098585600261071e565b61099661099187610af4565b611612565b61099f87611797565b6109aa88600061071e565b6040516020016109bf969594939291906126c8565b604051602081830303815290604052905060006109dd84600161071e565b6109e885600261071e565b6109f461099187610af4565b6109fd87611797565b610a0630611612565b610a1189600361071e565b604051602001610a2696959493929190611f33565b60405160208183030381529060405290506000610a4485600161071e565b610a4d86611797565b610a5630611612565b610a6188600361071e565b604051602001610a749493929190614f3c565b6040516020818303038152906040529050828282604051602001610a9a93929190611e00565b6040516020818303038152906040529350505050919050565b6000546001600160a01b03163314610add5760405162461bcd60e51b815260040161052d906151f1565b8051610af0906025906020840190611a29565b5050565b6000818152600360205260408120546001600160a01b03168061041e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161052d565b60006001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161052d565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c1c5760405162461bcd60e51b815260040161052d906151f1565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600880546108df906154ac565b606060028054610435906154ac565b6001600160a01b038216331415610cdb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161052d565b3360008181526006602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d48911515815260200190565b60405180910390a35050565b610d5e33836112e0565b610d7a5760405162461bcd60e51b815260040161052d90615226565b610d86848484846118b2565b50505050565b6000818152600360205260409020546060906001600160a01b0316610e0b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161052d565b60265460ff1615610e2657610e1f82610f05565b9050610421565b60006025610e3384611797565b610e3f61099186610af4565b610e4830611612565b604051602001610e5b9493929190611e43565b60408051601f19818403018152918152600085815260276020529081205491925090610e899060ff16611797565b610e9485600061071e565b610e9f86600161071e565b610eaa87600261071e565b610eb588600361071e565b604051602001610ec995949392919061508f565b60405160208183030381529060405290508181604051602001610eed929190611dd1565b60405160208183030381529060405292505050919050565b6060610f1082611797565b610f1983610960565b600084815260276020526040902054610f349060ff16611797565b604051602001610f4693929190612571565b6040516020818303038152906040529050919050565b6000546001600160a01b03163314610f865760405162461bcd60e51b815260040161052d906151f1565b6001600160a01b038116610feb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161052d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061107b82610af4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b03821661110a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161052d565b6000818152600360205260409020546001600160a01b03161561116f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161052d565b6001600160a01b0382166000908152600460205260408120805460019290611198908490615277565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080514260208201526bffffffffffffffffffffffff193360601b16918101919091526054810182905260009081906064906074016040516020818303038152906040528051906020012060001c61124f9190615502565b905060288160ff161061128657600a61126960288361545d565b61127391906152c8565b61127e90601261528f565b915050610421565b60148160ff16106112b357600561129e60148361545d565b6112a891906152c8565b61127e90600e61528f565b60088160ff161061041e5760026112cb60088361545d565b6112d591906152c8565b61127e90600861528f565b6000818152600360205260408120546001600160a01b03166113595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161052d565b600061136483610af4565b9050806001600160a01b0316846001600160a01b0316148061139f5750836001600160a01b0316611394846104b8565b6001600160a01b0316145b806113cf57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166113ea82610af4565b6001600160a01b0316146114525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161052d565b6001600160a01b0382166114b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161052d565b6114bf600082611046565b6001600160a01b03831660009081526004602052604081208054600192906114e8908490615446565b90915550506001600160a01b0382166000908152600460205260408120805460019290611516908490615277565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061158282610af4565b905061158f600083611046565b6001600160a01b03811660009081526004602052604081208054600192906115b8908490615446565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561176e57600061164f826013615446565b61165a9060086153fe565b611665906002615330565b611678906001600160a01b0387166152b4565b60f81b9050600060108260f81c61168f91906152c8565b60f81b905060008160f81c60106116a6919061541d565b8360f81c6116b4919061545d565b60f81b90506116c2826118e5565b856116ce8660026153fe565b815181106116ec57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061170c816118e5565b856117188660026153fe565b611723906001615277565b8151811061174157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053505050508080611766906154e7565b915050611639565b50806040516020016117809190612547565b604051602081830303815290604052915050919050565b6060816117bc57506040805180820190915260018152600360fc1b6020820152610421565b8160005b81156117e657806117d0816154e7565b91506117df9050600a836152b4565b91506117c0565b60008167ffffffffffffffff81111561180f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611839576020820181803683370190505b5090505b84156113cf5761184e600183615446565b915061185b600a86615502565b611866906030615277565b60f81b81838151811061188957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506118ab600a866152b4565b945061183d565b6118bd8484846113d7565b6118c98484848461191c565b610d865760405162461bcd60e51b815260040161052d9061519f565b6000600a60f883901c101561190d5761190360f883901c603061528f565b60f81b9050610421565b61190360f883901c605761528f565b60006001600160a01b0384163b15611a1e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061196090339089908890889060040161514f565b602060405180830381600087803b15801561197a57600080fd5b505af19250505080156119aa575060408051601f3d908101601f191682019092526119a791810190611cee565b60015b611a04573d8080156119d8576040519150601f19603f3d011682016040523d82523d6000602084013e6119dd565b606091505b5080516119fc5760405162461bcd60e51b815260040161052d9061519f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b506001949350505050565b828054611a35906154ac565b90600052602060002090601f016020900481019282611a575760008555611a9d565b82601f10611a7057805160ff1916838001178555611a9d565b82800160010185558215611a9d579182015b82811115611a9d578251825591602001919060010190611a82565b50611aa9929150611aad565b5090565b5b80821115611aa95760008155600101611aae565b600067ffffffffffffffff80841115611add57611add615542565b604051601f8501601f19908116603f01168101908282118183101715611b0557611b05615542565b81604052809350858152868686011115611b1e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461042157600080fd5b8035801515811461042157600080fd5b600060208284031215611b70578081fd5b611b7982611b38565b9392505050565b60008060408385031215611b92578081fd5b611b9b83611b38565b9150611ba960208401611b38565b90509250929050565b600080600060608486031215611bc6578081fd5b611bcf84611b38565b9250611bdd60208501611b38565b9150604084013590509250925092565b60008060008060808587031215611c02578081fd5b611c0b85611b38565b9350611c1960208601611b38565b925060408501359150606085013567ffffffffffffffff811115611c3b578182fd5b8501601f81018713611c4b578182fd5b611c5a87823560208401611ac2565b91505092959194509250565b60008060408385031215611c78578182fd5b611c8183611b38565b9150611ba960208401611b4f565b60008060408385031215611ca1578182fd5b611caa83611b38565b946020939093013593505050565b600060208284031215611cc9578081fd5b611b7982611b4f565b600060208284031215611ce3578081fd5b8135611b7981615558565b600060208284031215611cff578081fd5b8151611b7981615558565b600060208284031215611d1b578081fd5b813567ffffffffffffffff811115611d31578182fd5b8201601f81018413611d41578182fd5b6113cf84823560208401611ac2565b600060208284031215611d61578081fd5b5035919050565b60008060408385031215611d7a578182fd5b50508035926020909101359150565b60008151808452611da1816020860160208601615480565b601f01601f19169290920160200192915050565b60008151611dc7818560208601615480565b9290920192915050565b60008351611de3818460208801615480565b835190830190611df7818360208801615480565b01949350505050565b60008451611e12818460208901615480565b845190830190611e26818360208901615480565b8451910190611e39818360208801615480565b0195945050505050565b600080865482600182811c915080831680611e5f57607f831692505b6020808410821415611e7f57634e487b7160e01b87526022600452602487fd5b818015611e935760018114611ea457611ed0565b60ff19861689528489019650611ed0565b60008d815260209020885b86811015611ec85781548b820152908501908301611eaf565b505084890196505b505050505050611f28611f22611f13611f0d611efe611ef886623f743d60e81b815260030190565b8b611db5565b6226613d60e81b815260030190565b88611db5565b6226633d60e81b815260030190565b85611db5565b979650505050505050565b600061323360f01b82528751611f50816002850160208c01615480565b7f253342253232253230666f6e742d66616d696c79253344253232417269616c256002918401918201527f3232253230666f6e742d73697a6525334425323233302532323e25323025334360228201527f746578742532307825334425323237362532322532307925334425323232383060428201527225323225323066696c6c25334425323225323360681b60628201528751611ff5816075840160208c01615480565b7f253232253230666f6e742d776569676874253344253232626f6c642532322532607592909101918201527f30666f6e742d73697a652533442532323133302532323e54484953253230495360958201527f2532304e4654253343253246746578743e25323025334374657874253230747260b58201527f616e73666f726d2533442532326d61747269782532383125323030253230302560d58201527f3230312532303130302532303430302532392532323e2532302533437473706160f58201527f6e253230782533442532323025323225323079253344253232302532322532306101158201527f666f6e742d776569676874253344253232626f6c642532322532303e4163636f6101358201527f756e74253343253246747370616e3e253230253343747370616e2532307825336101558201527f44253232302532322532307925334425323233362532323e000000000000000061017582015261253a61239161238b61230661230061224861224261217761018d89018f611db5565b7f253343253246747370616e3e253230253343747370616e25323078253344253281527f323025323225323079253344253232313434253232253230666f6e742d77656960208201527f676874253344253232626f6c642532323e4973253230686f6c6465722532306f60408201527f66253230546f6b656e4964253343253246747370616e3e25323025334374737060608201527f616e2532307825334425323230253232253230792533442532323138302532326080820152601f60f91b60a082015260a10190565b8c611db5565b7f253343253246747370616e3e253230253343747370616e25323078253344253281527f323025323225323079253344253232323838253232253230666f6e742d77656960208201527f676874253344253232626f6c642532323e496e253230636f6e7472616374253360408201527f43253246747370616e3e253230253343747370616e25323078253344253232306060820152731299191299183c9299a212991919991a1299191f60611b608082015260940190565b89611db5565b7f253343253246747370616e3e253230253343253246746578743e25323025334381527f636972636c65253230637825334425323234323525323225323063792533442560208201527f323231353025323225323072253344253232323025323225323066696c6c25336040820152664425323225323360c81b606082015260670190565b86611db5565b7f2532323e253343253246636972636c653e2532302533432532467376673e253381527f432532466469763e253343646976253230636c6173732533442532326661636560208201527f2532306261636b2532323e2533432532466469763e253343646976253230636c60408201527f6173732533442532326661636525323072696768742532323e2533432532466460608201527f69763e253343646976253230636c617373253344253232666163652532306c6560808201527f66742532323e2533432532466469763e253343646976253230636c617373253360a08201527f4425323266616365253230746f702532323e2533432532466469763e2533436460c08201527f6976253230636c61737325334425323266616365253230626f74746f6d25323260e08201527f3e2533432532466469763e2533432532466469763e2533432532466469763e256101008201527f33432532466469763e2533432532466469763e253343253246626f64793e25336101208201527f4325324668746d6c3e273e3c747370616e20783d2730272079000000000000006101408201526101590190565b9998505050505050505050565b600061060f60f31b82528251612564816002850160208701615480565b9190910160020192915050565b757b226e616d65223a2254686973206973204e4654202360501b815283516000906125a3816016850160208901615480565b7f222c22637265617465644279223a22456976696e64204b6c656976656e222c226016918401918201527f7965617243726561746564223a2232303231222c226465736372697074696f6e60368201527f223a20225374696c6c20646f6e2774206b6e6f7720776861742074686520686560568201527f6c6c732061204e46543f222c22696d6167655f64617461223a2200000000000060768201528451612652816090840160208901615480565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2250609092909101918201527030b632ba3a329116113b30b63ab2911d1160791b60b082015283516126aa8160c1840160208801615480565b63227d5d7d60e01b60c1929091019182015260c50195945050505050565b60007f3c7376672076657273696f6e3d27312e312720786d6c6e733d27687474703a2f82527f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e60208301527f6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2760408301527f2076696577426f783d27302030203930302039303027207374796c653d27626160608301526f636b67726f756e642d636f6c6f723a2360801b6080830152875161278b816090850160208c01615480565b663b66696c6c3a2360c81b60909184019182015287516127b2816097840160208c01615480565b7f3b2720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a65609792909101918201527f3d273330273e3c7465787420783d2737362720793d27323830272066696c6c3d60b782015261272360f01b60d782015261253a614f2561238b6129ec61230061290561224261283060d989018f611db5565b7f2720666f6e742d7765696768743d27626f6c642720666f6e742d73697a653d2781527f313330273e54484953204953204e46543c2f746578743e3c746578742074726160208201527f6e73666f726d3d276d617472697828312030203020312031303020343030292760408201527f3e3c747370616e20783d27302720793d27302720666f6e742d7765696768743d60608201527f27626f6c6427203e4163636f756e743c2f747370616e3e3c747370616e20783d60808201526a139813903c9e93999b139f60a91b60a082015260ab0190565b7f3c2f747370616e3e3c747370616e20783d27302720793d273134342720666f6e81527f742d7765696768743d27626f6c64273e497320686f6c646572206f6620546f6b60208201527f656e49643c2f747370616e3e3c6120687265663d27646174613a746578742f6860408201527f746d6c2c253343253231444f435459504525323068746d6c3e25334368746d6c60608201527f2532306c616e67253344253232656e2532323e253343686561643e253343746960808201527f746c653e5468697325323069732532304e46542532302532330000000000000060a082015260b90190565b7f2533432532467469746c653e2533436d6574612532306368617273657425334481527f2532325554462d382532323e2533436d6574612532306e616d6525334425323260208201527f76696577706f7274253232253230636f6e74656e74253344253232776964746860408201527f2533446465766963652d7769647468253243253230696e697469616c2d73636160608201527f6c65253344312e302532323e2533436d6574612532306e616d6525334425323260808201527f6170706c652d6d6f62696c652d7765622d6170702d63617061626c652532322560a08201527f3230636f6e74656e742533442532327965732532323e2533437374796c653e2560c08201527f32417b746f7563682d616374696f6e2533416e6f6e65253342757365722d736560e08201527f6c6563742533416e6f6e652533422d7765626b69742d757365722d73656c65636101008201527f742533416e6f6e652533422d6d732d757365722d73656c6563742533416e6f6e6101208201527f652533422d6d6f7a2d757365722d73656c6563742533416e6f6e65253342626f6101408201527f782d73697a696e67253341626f726465722d626f787d696d677b706f696e74656101608201527f722d6576656e74732533416e6f6e657d626f64797b6d617267696e25334130256101808201527f334270616464696e67253341302533426d696e2d6865696768742533413130306101a08201527f76682533426f766572666c6f7725334168696464656e2533426261636b67726f6101c08201527f756e642d636f6c6f722533412532333230323032307d253233636f6e74656e746101e08201527f7b6d696e2d68656967687425334131303076687d253233777261707065727b6d6102008201527f696e2d68656967687425334131303076687d2532337363656e657b2d2d73697a6102208201527f652533413070782533422d2d7363616c65253341302e363525334268656967686102408201527f742533417661722532382d2d73697a65253239253342776964746825334176616102608201527f722532382d2d73697a65253239253342706572737065637469766525334133306102808201527f303070787d253233637562657b686569676874253341313030253235253342706102a08201527f6f736974696f6e25334172656c61746976652533422d2d726f746174696f6e2d6102c08201527f782533412d34306465672533422d2d726f746174696f6e2d79253341343564656102e08201527f672533427472616e73666f726d2d7374796c6525334170726573657276652d336103008201527f642533427472616e73666f726d2533417472616e736c6174655a25323863616c6103208201527f632532382d312532412532387661722532382d2d73697a6525323925324632256103408201527f32392532392532392532307363616c6533642532387661722532382d2d7363616103608201527f6c652532392532432532307661722532382d2d7363616c6525323925324325326103808201527f307661722532382d2d7363616c65253239253239253230726f746174655825326103a08201527f387661722532382d2d726f746174696f6e2d78253239253239253230726f74616103c08201527f7465592532387661722532382d2d726f746174696f6e2d792532392532397d2e6103e08201527f666163657b646973706c6179253341666c65782533426a7573746966792d636f6104008201527f6e74656e7425334173706163652d61726f756e64253342616c69676e2d6974656104208201527f6d7325334163656e746572253342706f736974696f6e2533416162736f6c75746104408201527f6525334277696474682533417661722532382d2d73697a6525323925334268656104608201527f696768742533417661722532382d2d73697a652532397d2e66726f6e747b74726104808201527f616e73666f726d253341726f74617465592532383064656725323925323074726104a08201527f616e736c6174655a25323863616c632532387661722532382d2d73697a6525326104c08201527f39253246322532392532397d2e72696768747b7472616e73666f726d253341726104e08201527f6f746174655925323839306465672532392532307472616e736c6174655a25326105008201527f3863616c632532387661722532382d2d73697a6525323925324632253239253261052082018190527f397d2e6261636b7b7472616e73666f726d253341726f746174655925323831386105408301527f306465672532392532307472616e736c6174655a25323863616c6325323876616105608301527f722532382d2d73697a65253239253246322532392532397d2e6c6566747b74726105808301527f616e73666f726d253341726f74617465592532382d39306465672532392532306105a08301527f7472616e736c6174655a25323863616c632532387661722532382d2d73697a656105c08301527f253239253246322532392532397d2e746f707b7472616e73666f726d253341726105e08301527f6f746174655825323839306465672532392532307472616e736c6174655a25326106008301526106208201527f397d2e626f74746f6d7b7472616e73666f726d253341726f74617465582532386106408201527f2d39306465672532392532307472616e736c6174655a25323863616c632532386106608201527f7661722532382d2d73697a65253239253246322532392532397d2534306b65796106808201527f6672616d65732532307370696e7b302532357b7472616e73666f726d253341746106a08201527f72616e736c6174655a25323863616c632532382d312532417661722532382d2d6106c08201527f73697a65253239253246322532392532392532307363616c65336425323876616106e08201527f722532382d2d7363616c652532392532432532307661722532382d2d7363616c6107008201527f652532392532432532307661722532382d2d7363616c652532392532392532306107208201527f726f74617465582532387661722532382d2d726f746174696f6e2d78253239256107408201527f3239253230726f746174655925323863616c632532387661722532382d2d726f6107608201527f746174696f6e2d792532392532392532397d3130302532357b7472616e73666f6107808201527f726d2533417472616e736c6174655a25323863616c632532382d3125324176616107a08201527f722532382d2d73697a65253239253246322532392532392532307363616c65336107c08201527f642532387661722532382d2d7363616c652532392532432532307661722532386107e08201527f2d2d7363616c652532392532432532307661722532382d2d7363616c652532396108008201527f253239253230726f74617465582532387661722532382d2d726f746174696f6e6108208201527f2d78253239253239253230726f746174655925323863616c63253238766172256108408201527f32382d2d726f746174696f6e2d792532392532302532422532303336306465676108608201527f2532392532397d7d2533432532467374796c653e2532302533437363726970746108808201527f3e6c657425323073766725324377726170706572253344646f63756d656e742e6108a08201527f676574456c656d656e74427949642532382532327772617070657225323225326108c08201527f392532437363656e65253344646f63756d656e742e676574456c656d656e74426108e08201527f7949642532382532327363656e6525323225323925324363756265253344646f6109008201527f63756d656e742e676574456c656d656e744279496425323825323263756265256109208201527f3232253239253243703153637265656e582533442d31253243703153637265656109408201527f6e592533442d312532437031506f696e74657249642533442d312532437032536109608201527f637265656e582533442d31253243703253637265656e592533442d31253243706109808201527f32506f696e74657249642533442d3125324370726576446966662533442d31256109a08201527f334266756e6374696f6e253230676574526f746174696f6e5946726f6d33444d6109c08201527f6174726978253238652532397b766172253230742533447061727365466c6f616109e08201527f74253238676574436f6d70757465645374796c65253238637562652532392e67610a008201527f657450726f706572747956616c75652532382532322d2d7363616c6525323225610a208201527f32392532392532436e2533442532386e2533442532386e253344652e73706c69610a408201527f74253238253232253238253232253239253542312535442532392e73706c6974610a608201527f253238253232253239253232253239253542302535442532392e73706c697425610a808201527f3238253232253243253232253239253243722533444d6174682e7369676e2532610aa08201527f386e253542302535442532392532436f2533444d6174682e6162732532386e25610ac08201527f3542302535442532467425323925324365253344722532412532386f2d4d6174610ae08201527f682e666c6f6f722532386f253239253239253243742533446e25354231253544610b008201527f2532436f2533446e253542322535442532436e2533446e253542332535442532610b208201527f43652533444d6174682e726f756e642532384d6174682e61636f732532386525610b408201527f32392532412532383138302532464d6174682e50492532392532392532437425610b608201527f33444d6174682e726f756e642532384d6174682e6173696e2532387425323925610b808201527f32412532383138302532464d6174682e50492532392532392532436f2533444d610ba08201527f6174682e726f756e642532382d312532414d6174682e6173696e2532386f2532610bc08201527f392532412532383138302532464d6174682e5049253239253239253243722533610be08201527f442532384d6174682e726f756e642532384d6174682e61636f732532386e2532610c008201527f392532412532383138302532464d6174682e5049253239253239253243312532610c208201527f3925334274253343302533464d6174682e7369676e2532387425323925334425610c408201527f33444d6174682e7369676e2532386f253239253236253236253238722533442d610c608201527f3125323925334130253343742532362532364d6174682e7369676e2532387425610c808201527f32392532312533444d6174682e7369676e2532386f2532392532362532362532610ca08201527f38722533442d312532392533426f2533447061727365496e7425323867657443610cc08201527f6f6d70757465645374796c65253238637562652532392e67657450726f706572610ce08201527f747956616c75652532382532322d2d726f746174696f6e2d782532322532392e610d008201527f73756273747225323830253243676574436f6d70757465645374796c65253238610d208201527f637562652532392e67657450726f706572747956616c75652532382532322d2d610d408201527f726f746174696f6e2d782532322532392e696e6465784f662532382532326465610d608201527f6725323225323925323925323925334272657475726e25323039302533432533610d808201527f444d6174682e6162732532386f2532392532362532364d6174682e6162732532610da08201527f386f253239253343323730253236253236253238722532412533442d31253239610dc08201527f25324372253241657d66756e6374696f6e25323073657453697a652532382532610de08201527f397b73746f705370696e2532382532392532437363656e652e7374796c652e73610e008201527f657450726f70657274792532382532322d2d73697a6525323225324325323230610e208201527f7078253232253239253243777261707065722e7374796c652e6d617267696e52610e408201527f69676874253344253232307078253232253243777261707065722e7374796c65610e608201527f2e6d617267696e4c656674253344253232307078253232253342766172253230610e808201527f65253344777261707065722e6f66667365744865696768742532437425334477610ea08201527f7261707065722e6f666673657457696474682532423225324177726170706572610ec08201527f2e6f66667365744c6566742533426c65742532306e2533443025324372253344610ee08201527f7425334265253343742532362532362532386e253344742d6525324372253344610f008201527f65253239253243777261707065722e7374796c652e6d617267696e5269676874610f208201527f2533444d6174682e6365696c2532386e25324632253239253242253232707825610f408201527f3232253243777261707065722e7374796c652e6d617267696e4c656674253344610f608201527f4d6174682e666c6f6f722532386e253246322532392532422532327078253232610f808201527f2532437363656e652e7374796c652e73657450726f7065727479253238253232610fa08201527f2d2d73697a652532322532437225324225323270782532322532392532437374610fc08201527f6172745370696e2532382532397d66756e6374696f6e2532307a6f6f6d253238610fe08201527f652532397b73746f705370696e2532382532392532437363656e652e7374796c6110008201527f652e73657450726f70657274792532382532322d2d7363616c652532322532436110208201527f4d6174682e6d61782532382532424d6174682e7369676e2532386525323925326110408201527f4638302532427061727365466c6f6174253238676574436f6d707574656453746110608201527f796c652532387363656e652532392e67657450726f706572747956616c7565256110808201527f32382532322d2d7363616c652532322532392532392532432e303125323925326110a08201527f397d66756e6374696f6e253230706f696e746572646f776e5f68616e646c65726110c08201527f253238652532397b73746f705370696e2532382532392532432d3125334425336110e08201527f447031506f696e74657249642533462532387031506f696e74657249642533446111008201527f652e706f696e7465724964253243703153637265656e58253344652e736372656111208201527f656e58253243703153637265656e59253344652e73637265656e5925323925336111408201527f412d312533442533447032506f696e74657249642532362532362532387032506111608201527f6f696e7465724964253344652e706f696e7465724964253243703253637265656111808201527f6e58253344652e73637265656e58253243703253637265656e59253344652e736111a08201527f637265656e592532397d66756e6374696f6e253230706f696e74657275705f686111c08201527f616e646c657225323865253243742532397b73746172745370696e25323825326111e08201527f392532437031506f696e74657249642533442d31253243703153637265656e586112008201527f2533442d31253243703153637265656e592533442d312532437032506f696e746112208201527f657249642533442d31253243703253637265656e582533442d312532432532386112408201527f703253637265656e592533442d312532392532312533447031506f696e7465726112608201527f49642532362532362d312532312533447032506f696e74657249647c7c2532386112808201527f70726576446966662533442d312532397d66756e6374696f6e253230706f696e6112a08201527f7465726d6f76655f68616e646c65722532386e2532397b69662532386e2e70726112c08201527f6576656e7444656661756c742532382532392532432d312532312533447031506112e08201527f6f696e74657249642532397b6c657425323065253344302532437425334430256113008201527f33426e2e706f696e74657249642533442533447031506f696e746572496425336113208201527f46253238652533446e2e73637265656e582d703153637265656e5825324374256113408201527f33446e2e73637265656e592d703153637265656e59253243703153637265656e6113608201527f582533446e2e73637265656e58253243703153637265656e592533446e2e73636113808201527f7265656e592532392533416e2e706f696e74657249642533442533447032506f6113a08201527f696e7465724964253236253236253238703253637265656e582533446e2e73636113c08201527f7265656e58253243703253637265656e592533446e2e73637265656e592532396113e08201527f2532432d312532312533447031506f696e74657249642532362532362d3125336114008201527f442533447032506f696e7465724964253346726f7461746525323865253243746114208201527f2532392533412d312532312533447031506f696e74657249642532362532362d6114408201527f312532312533447032506f696e74657249642532362532362532386e2533444d6114608201527f6174682e737172742532384d6174682e706f77253238703153637265656e582d6114808201527f703253637265656e58253243322532392532424d6174682e706f7725323870316114a08201527f53637265656e592d703253637265656e592532433225323925323925324330256114c08201527f334370726576446966662532362532367a6f6f6d2532386e2d707265764469666114e08201527f6625323925324370726576446966662533446e2532397d7d66756e6374696f6e6115008201527f253230726f7461746525323865253243742532397b74253344253238706172736115208201527f65496e74253238676574436f6d70757465645374796c652532386375626525326115408201527f392e67657450726f706572747956616c75652532382532322d2d726f746174696115608201527f6f6e2d782532322532392e73756273747225323830253243676574436f6d70756115808201527f7465645374796c65253238637562652532392e67657450726f706572747956616115a08201527f6c75652532382532322d2d726f746174696f6e2d782532322532392e696e64656115c08201527f784f662532382532326465672532322532392532392532392532422d312532416115e08201527f74253239253235333630253242253232646567253232253243652533447061726116008201527f7365496e74253238676574436f6d70757465645374796c6525323863756265256116208201527f32392e67657450726f706572747956616c75652532382532322d2d726f7461746116408201527f696f6e2d792532322532392e73756273747225323830253243676574436f6d706116608201527f757465645374796c65253238637562652532392e67657450726f7065727479566116808201527f616c75652532382532322d2d726f746174696f6e2d792532322532392e696e646116a08201527f65784f66253238253232646567253232253239253239253239253242652532426116c08201527f253232646567253232253342637562652e7374796c652e73657450726f7065726116e08201527f74792532382532322d2d726f746174696f6e2d782532322532437425323925326117008201527f43637562652e7374796c652e73657450726f70657274792532382532322d2d726117208201527f6f746174696f6e2d79253232253243652532397d66756e6374696f6e253230736117408201527f746f705370696e2532382532397b7661722532306525334477696e646f772e676117608201527f6574436f6d70757465645374796c65253238637562652532392e67657450726f6117808201527f706572747956616c75652532382532327472616e73666f726d253232253239256117a08201527f3342637562652e7374796c652e616e696d6174696f6e2533442532326e6f6e656117c08201527f25323225334265253344676574526f746174696f6e5946726f6d33444d6174726117e08201527f697825323865253239253342637562652e7374796c652e73657450726f7065726118008201527f74792532382532322d2d726f746174696f6e2d792532322532436525324225326118208201527f326465672532322532397d66756e6374696f6e25323073746172745370696e256118408201527f32382532397b637562652e7374796c652e616e696d6174696f6e2533442532326118608201527f7370696e2532303230732532306c696e656172253230696e66696e69746525326118808201527f327d77696e646f772e6164644576656e744c697374656e6572253238253232446118a08201527f4f4d436f6e74656e744c6f616465642532322532432532382532392533443e7b6118c08201527f77726170706572253344646f63756d656e742e676574456c656d656e744279496118e08201527f64253238253232777261707065722532322532392532437363656e65253344646119008201527f6f63756d656e742e676574456c656d656e74427949642532382532327363656e6119208201527f6525323225323925324363756265253344646f63756d656e742e676574456c656119408201527f6d656e74427949642532382532326375626525323225323925324373766725336119608201527f44646f63756d656e742e676574456c656d656e747342795461674e616d6525326119808201527f3825323273766725323225323925354230253544253243637562652e6368696c6119a08201527f6472656e253542312535442e617070656e644368696c642532387376672e636c6119c08201527f6f6e654e6f646525323825323130253239253239253243637562652e6368696c6119e082018190527f6472656e253542322535442e617070656e644368696c642532387376672e636c611a00830152611a2082018190527f6472656e253542332535442e617070656e644368696c642532387376672e636c611a40830152611a6082018190527f6472656e253542342535442e617070656e644368696c642532387376672e636c611a80830152611aa08201527f6472656e253542352535442e617070656e644368696c642532387376672e636c611ac08201527f6f6e654e6f6465253238253231302532392532392532437363656e652e616464611ae08201527f4576656e744c697374656e6572253238253232706f696e746572757025323225611b008201527f3243706f696e74657275705f68616e646c65722532392532437363656e652e61611b208201527f64644576656e744c697374656e6572253238253232706f696e7465726d6f7665611b408201527f253232253243706f696e7465726d6f76655f68616e646c657225323925324373611b608201527f63656e652e6164644576656e744c697374656e6572253238253232706f696e74611b808201527f6572646f776e253232253243706f696e746572646f776e5f68616e646c657225611ba08201527f32392532437363656e652e6164644576656e744c697374656e65722532382532611bc08201527f32706f696e7465726c65617665253232253243706f696e74657275705f68616e611be08201527f646c65722532392532437363656e652e6164644576656e744c697374656e6572611c008201527f253238253232706f696e74657263616e63656c253232253243706f696e746572611c208201527f75705f68616e646c65722532392532437363656e652e6164644576656e744c69611c408201527f7374656e6572253238253232776865656c253232253243652533443e7b7a6f6f611c608201527f6d2532382d31253241652e64656c7461592532397d2532392532437365745369611c808201527f7a65253238253239253243766f69642532303025323125334425334477696e64611ca08201527f6f772e6f6e726573697a6525334677696e646f772e6f6e726573697a65253344611cc08201527f73657453697a65253341766f69642532303025323125334425334477696e646f611ce08201527f772e6f6e6f7269656e746174696f6e6368616e67652532362532362532387769611d008201527f6e646f772e6f6e6f7269656e746174696f6e6368616e67652533447365745369611d208201527f7a652532397d2532392533422533432532467363726970743e25323025334325611d408201527f3246686561643e253343626f64793e2533436469762532306964253344253232611d608201527f636f6e74656e742532323e253343646976253230696425334425323277726170611d808201527f7065722532323e25334364697625323069642533442532327363656e65253232611da08201527f3e253343646976253230696425334425323263756265253232253230636c6173611dc08201527f73253344253232637562652532323e253343646976253230636c617373253344611de08201527f2532326661636525323066726f6e742532323e25323025334373766725323076611e008201527f657273696f6e253344253232312e31253232253230786d6c6e73253344253232611e208201527f687474702533412532462532467777772e77332e6f7267253246323030302532611e408201527f46737667253232253230786d6c6e73253341786c696e6b253344253232687474611e608201527f702533412532462532467777772e77332e6f726725324631393939253246786c611e808201527f696e6b25323225323076696577426f7825334425323230253230302532303930611ea08201527f302532303930302532322532307374796c652533442532326261636b67726f75611ec08201526d6e642d636f6c6f7225334125323360901b611ee0820152611eee0190565b6a25334266696c6c2533412560a81b8152600b0190565b60006d3d27313830272066696c6c3d272360901b82528551614f6581600e850160208a01615480565b61139f60f11b600e918401918201528551614f87816010840160208a01615480565b7f3c2f747370616e3e3c2f613e3c747370616e20783d27302720793d2732383827601092909101918201527f20666f6e742d7765696768743d27626f6c64273e496e20636f6e74726163743c60308201527f2f747370616e3e3c747370616e20783d27302720793d27333234273e000000006050820152845161501181606c840160208901615480565b7f3c2f747370616e3e3c2f746578743e3c636972636c652063783d273432352720606c92909101918201527f63793d273135302720723d273230272066696c6c3d2723000000000000000000608c820152611f2861507260a3830186611db5565b70139f1e17b1b4b931b6329f1e17b9bb339f60791b815260110190565b60006226703d60e81b825286516150ad816003850160208b01615480565b632663303d60e01b60039184019182015286516150d1816007840160208b01615480565b632663313d60e01b6007929091019182015285516150f681600b840160208a01615480565b632663323d60e01b600b9290910191820152845161511b81600f840160208901615480565b632663333d60e01b600f92909101918201528351615140816013840160208801615480565b01601301979650505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061518290830184611d89565b9695505050505050565b600060208252611b796020830184611d89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561528a5761528a615516565b500190565b600060ff821660ff84168060ff038211156152ac576152ac615516565b019392505050565b6000826152c3576152c361552c565b500490565b600060ff8316806152db576152db61552c565b8060ff84160491505092915050565b80825b60018086116152fc5750615327565b81870482111561530e5761530e615516565b8086161561531b57918102915b9490941c9380026152ed565b94509492505050565b6000611b79600019848460008261534957506001611b79565b8161535657506000611b79565b816001811461536c5760028114615376576153a3565b6001915050611b79565b60ff84111561538757615387615516565b6001841b91508482111561539d5761539d615516565b50611b79565b5060208310610133831016604e8410600b84101617156153d6575081810a838111156153d1576153d1615516565b611b79565b6153e384848460016152ea565b8086048211156153f5576153f5615516565b02949350505050565b600081600019048311821515161561541857615418615516565b500290565b600060ff821660ff84168160ff048111821515161561543e5761543e615516565b029392505050565b60008282101561545857615458615516565b500390565b600060ff821660ff84168082101561547757615477615516565b90039392505050565b60005b8381101561549b578181015183820152602001615483565b83811115610d865750506000910152565b600181811c908216806154c057607f821691505b602082108114156154e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154fb576154fb615516565b5060010190565b6000826155115761551161552c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108cf57600080fdfea2646970667358221220a66ea4139bc30b2a60b53c830e4c148d1398b313a37498388df323e3818160af64736f6c63430008030033
Deployed Bytecode Sourcemap
385:15118:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1471:288:3;;;;;;:::i;:::-;;:::i;:::-;;;39677:14:13;;39670:22;39652:41;;39640:2;39625:18;1471:288:3;;;;;;;;2377:98;;;:::i;:::-;;;;;;;:::i;3796:217::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;38964:32:13;;;38946:51;;38934:2;38919:18;3796:217:3;38901:102:13;3340:395:3;;;;;;:::i;:::-;;:::i;:::-;;2453:182:12;;;:::i;4660:300:3:-;;;;;;:::i;:::-;;:::i;2338:105:12:-;;;;;;:::i;:::-;;:::i;1600:155::-;;;;;;:::i;:::-;;:::i;1355:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47092:4:13;47080:17;;;47062:36;;47050:2;47035:18;1355:48:12;47017:87:13;5026:149:3;;;;;;:::i;:::-;;:::i;15255:241:12:-;;;;;;:::i;:::-;;:::i;496:39::-;;;:::i;2650:10555::-;;;;;;:::i;:::-;;:::i;2227:96::-;;;;;;:::i;:::-;;:::i;2080:235:3:-;;;;;;:::i;:::-;;:::i;1818:205::-;;;;;;:::i;:::-;;:::i;:::-;;;46884:25:13;;;46872:2;46857:18;1818:205:3;46839:76:13;1693:145:10;;;:::i;541:242:12:-;;;:::i;1061:85:10:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:10;1061:85;;2539:102:3;;;:::i;4080:290::-;;;;;;:::i;:::-;;:::i;5241:282::-;;;;;;:::i;:::-;;:::i;13708:700:12:-;;;;;;:::i;:::-;;:::i;13215:427::-;;;;;;:::i;:::-;;:::i;4436:162:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4556:25:3;;;4533:4;4556:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4436:162;1987:240:10;;;;;;:::i;:::-;;:::i;1471:288:3:-;1573:4;-1:-1:-1;;;;;;1596:40:3;;-1:-1:-1;;;1596:40:3;;:104;;-1:-1:-1;;;;;;;1652:48:3;;-1:-1:-1;;;1652:48:3;1596:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:2;;;1716:36:3;1589:163;;1471:288;;;;:::o;2377:98::-;2431:13;2463:5;2456:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:98;:::o;3796:217::-;3872:7;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;3891:73;;;;-1:-1:-1;;;3891:73:3;;44103:2:13;3891:73:3;;;44085:21:13;44142:2;44122:18;;;44115:30;44181:34;44161:18;;;44154:62;-1:-1:-1;;;44232:18:13;;;44225:42;44284:19;;3891:73:3;;;;;;;;;-1:-1:-1;3982:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;3982:24:3;;3796:217::o;3340:395::-;3420:13;3436:23;3451:7;3436:14;:23::i;:::-;3420:39;;3483:5;-1:-1:-1;;;;;3477:11:3;:2;-1:-1:-1;;;;;3477:11:3;;;3469:57;;;;-1:-1:-1;;;3469:57:3;;45703:2:13;3469:57:3;;;45685:21:13;45742:2;45722:18;;;45715:30;45781:34;45761:18;;;45754:62;-1:-1:-1;;;45832:18:13;;;45825:31;45873:19;;3469:57:3;45675:223:13;3469:57:3;665:10:1;-1:-1:-1;;;;;3545:21:3;;;;:69;;-1:-1:-1;3570:44:3;3594:5;665:10:1;3601:12:3;586:96:1;3570:44:3;3537:159;;;;-1:-1:-1;;;3537:159:3;;42496:2:13;3537:159:3;;;42478:21:13;42535:2;42515:18;;;42508:30;42574:34;42554:18;;;42547:62;42645:26;42625:18;;;42618:54;42689:19;;3537:159:3;42468:246:13;3537:159:3;3707:21;3716:2;3720:7;3707:8;:21::i;:::-;3340:395;;;:::o;2453:182:12:-;2486:12;2501:22;2513:10;2501:11;:22;:::i;:::-;2486:37;-1:-1:-1;2533:28:12;665:10:1;2553:7:12;2533:5;:28::i;:::-;2598:30;2620:7;2598:21;:30::i;:::-;2571:24;;;;:15;:24;;;;;;:57;;-1:-1:-1;;2571:57:12;;;;;;;;;;;2453:182::o;4660:300:3:-;4819:41;665:10:1;4838:12:3;4852:7;4819:18;:41::i;:::-;4811:103;;;;-1:-1:-1;;;4811:103:3;;;;;;;:::i;:::-;4925:28;4935:4;4941:2;4945:7;4925:9;:28::i;2338:105:12:-;1107:7:10;1133:6;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;2411:15:12::1;:25:::0;;-1:-1:-1;;2411:25:12::1;::::0;::::1;;::::0;;;::::1;::::0;;2338:105::o;1600:155::-;1715:24;;;;:15;:24;;;;;;1668:13;;1699:6;;1706:8;;1715:24;;1706:34;;;;;-1:-1:-1;;;1706:34:12;;;;;;;;;;1741:5;1706:41;;;;;-1:-1:-1;;;1706:41:12;;;;;;;;;;;;;;;;;;;;;;;;;;1699:49;;;;;-1:-1:-1;;;1699:49:12;;;;;;;;;;1692:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1600:155;;;;:::o;5026:149:3:-;5129:39;5146:4;5152:2;5156:7;5129:39;;;;;;;;;;;;:16;:39::i;15255:241:12:-;15371:41;665:10:1;15390:12:12;586:96:1;15371:41:12;15363:102;;;;-1:-1:-1;;;15363:102:12;;46523:2:13;15363:102:12;;;46505:21:13;46562:2;46542:18;;;46535:30;46601:34;46581:18;;;46574:62;-1:-1:-1;;;46652:18:13;;;46645:46;46708:19;;15363:102:12;46495:238:13;15363:102:12;15475:14;15481:7;15475:5;:14::i;:::-;15255:241;:::o;496:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2650:10555::-;2701:13;2735:19;2928:16;2934:7;2942:1;2928:5;:16::i;:::-;2955;2961:7;2969:1;2955:5;:16::i;:::-;3041;3047:7;3055:1;3041:5;:16::i;:::-;3232:31;3246:16;3254:7;3246;:16::i;:::-;3232:13;:31::i;:::-;3452:18;:7;:16;:18::i;:::-;11392:16;11398:7;11406:1;11392:5;:16::i;:::-;2764:8659;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2735:8689;;11434:19;11485:16;11491:7;11499:1;11485:5;:16::i;:::-;11620;11626:7;11634:1;11620:5;:16::i;:::-;11920:31;11934:16;11942:7;11934;:16::i;11920:31::-;12116:18;:7;:16;:18::i;:::-;12286:28;12308:4;12286:13;:28::i;:::-;12421:16;12427:7;12435:1;12421:5;:16::i;:::-;11463:1323;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11434:1353;;12797:19;12860:16;12866:7;12874:1;12860:5;:16::i;:::-;12882:18;:7;:16;:18::i;:::-;12996:28;13018:4;12996:13;:28::i;:::-;13083:16;13089:7;13097:1;13083:5;:16::i;:::-;12826:294;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12797:324;;13170:5;13176;13182;13153:35;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13139:50;;;;;2650:10555;;;:::o;2227:96::-;1107:7:10;1133:6;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;2297:19:12;;::::1;::::0;:9:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2227:96:::0;:::o;2080:235:3:-;2152:7;2187:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2187:16:3;2221:19;2213:73;;;;-1:-1:-1;;;2213:73:3;;43332:2:13;2213:73:3;;;43314:21:13;43371:2;43351:18;;;43344:30;43410:34;43390:18;;;43383:62;-1:-1:-1;;;43461:18:13;;;43454:39;43510:19;;2213:73:3;43304:231:13;1818:205:3;1890:7;-1:-1:-1;;;;;1917:19:3;;1909:74;;;;-1:-1:-1;;;1909:74:3;;42921:2:13;1909:74:3;;;42903:21:13;42960:2;42940:18;;;42933:30;42999:34;42979:18;;;42972:62;-1:-1:-1;;;43050:18:13;;;43043:40;43100:19;;1909:74:3;42893:232:13;1909:74:3;-1:-1:-1;;;;;;2000:16:3;;;;;:9;:16;;;;;;;1818:205::o;1693:145:10:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;1799:1:::1;1783:6:::0;;1762:40:::1;::::0;-1:-1:-1;;;;;1783:6:10;;::::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1829:1;1812:19:::0;;-1:-1:-1;;;;;;1812:19:10::1;::::0;;1693:145::o;541:242:12:-;;;;;;;:::i;2539:102:3:-;2595:13;2627:7;2620:14;;;;;:::i;4080:290::-;-1:-1:-1;;;;;4182:24:3;;665:10:1;4182:24:3;;4174:62;;;;-1:-1:-1;;;4174:62:3;;41729:2:13;4174:62:3;;;41711:21:13;41768:2;41748:18;;;41741:30;41807:27;41787:18;;;41780:55;41852:18;;4174:62:3;41701:175:13;4174:62:3;665:10:1;4247:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4247:42:3;;;;;;;;;;:53;;-1:-1:-1;;4247:53:3;;;;;;;:42;-1:-1:-1;;;;;4315:48:3;;4354:8;4315:48;;;;39677:14:13;39670:22;39652:41;;39640:2;39625:18;;39607:92;4315:48:3;;;;;;;;4080:290;;:::o;5241:282::-;5372:41;665:10:1;5405:7:3;5372:18;:41::i;:::-;5364:103;;;;-1:-1:-1;;;5364:103:3;;;;;;;:::i;:::-;5477:39;5491:4;5497:2;5501:7;5510:5;5477:13;:39::i;:::-;5241:282;;;;:::o;13708:700:12:-;7022:4:3;7045:16;;;:7;:16;;;;;;13773:13:12;;-1:-1:-1;;;;;7045:16:3;13798:76:12;;;;-1:-1:-1;;;13798:76:12;;45287:2:13;13798:76:12;;;45269:21:13;45326:2;45306:18;;;45299:30;45365:34;45345:18;;;45338:62;-1:-1:-1;;;45416:18:13;;;45409:45;45471:19;;13798:76:12;45259:237:13;13798:76:12;13896:15;;;;13893:68;;;13933:17;13942:7;13933:8;:17::i;:::-;13926:24;;;;13893:68;13979:19;14025:9;14041:18;:7;:16;:18::i;:::-;14066:31;14080:16;14088:7;14080;:16::i;14066:31::-;14104:28;14126:4;14104:13;:28::i;:::-;14008:125;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14008:125:12;;;;;;;;;14144:19;14196:24;;;:15;14008:125;14196:24;;;;;14008:125;;-1:-1:-1;14144:19:12;14196:35;;:24;;:33;:35::i;:::-;14239:16;14245:7;14253:1;14239:5;:16::i;:::-;14263;14269:7;14277:1;14263:5;:16::i;:::-;14287;14293:7;14301:1;14287:5;:16::i;:::-;14311;14317:7;14325:1;14311:5;:16::i;:::-;14173:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14144:185;;14379:5;14385;14362:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14348:44;;;;13708:700;;;:::o;13215:427::-;13271:13;13355:18;:7;:16;:18::i;:::-;13515:12;13519:7;13515:3;:12::i;:::-;13590:24;;;;:15;:24;;;;;;:35;;:24;;:33;:35::i;:::-;13310:324;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13296:339;;13215:427;;;:::o;1987:240:10:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;2075:22:10;::::1;2067:73;;;::::0;-1:-1:-1;;;2067:73:10;;40560:2:13;2067:73:10::1;::::0;::::1;40542:21:13::0;40599:2;40579:18;;;40572:30;40638:34;40618:18;;;40611:62;-1:-1:-1;;;40689:18:13;;;40682:36;40735:19;;2067:73:10::1;40532:228:13::0;2067:73:10::1;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:10;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:10::1;-1:-1:-1::0;;;;;2203:17:10;;;::::1;::::0;;;::::1;::::0;;1987:240::o;10721:171:3:-;10795:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10795:29:3;-1:-1:-1;;;;;10795:29:3;;;;;;;;:24;;10848:23;10795:24;10848:14;:23::i;:::-;-1:-1:-1;;;;;10839:46:3;;;;;;;;;;;10721:171;;:::o;8819:372::-;-1:-1:-1;;;;;8898:16:3;;8890:61;;;;-1:-1:-1;;;8890:61:3;;43742:2:13;8890:61:3;;;43724:21:13;;;43761:18;;;43754:30;43820:34;43800:18;;;43793:62;43872:18;;8890:61:3;43714:182:13;8890:61:3;7022:4;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;:30;8961:58;;;;-1:-1:-1;;;8961:58:3;;40967:2:13;8961:58:3;;;40949:21:13;41006:2;40986:18;;;40979:30;41045;41025:18;;;41018:58;41093:18;;8961:58:3;40939:178:13;8961:58:3;-1:-1:-1;;;;;9086:13:3;;;;;;:9;:13;;;;;:18;;9103:1;;9086:13;:18;;9103:1;;9086:18;:::i;:::-;;;;-1:-1:-1;;9114:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9114:21:3;-1:-1:-1;;;;;9114:21:3;;;;;;;;9151:33;;9114:16;;;9151:33;;9114:16;;9151:33;8819:372;;:::o;1764:453:12:-;1895:54;;;1912:15;1895:54;;;38621:19:13;-1:-1:-1;;1929:10:12;38678:2:13;38674:15;38670:53;38656:12;;;38649:75;;;;38740:12;;;38733:28;;;1835:5:12;;;;1952:3;;38777:12:13;;1895:54:12;;;;;;;;;;;;1885:65;;;;;;1880:71;;:75;;;;:::i;:::-;1860:96;;1987:2;1978:5;:11;;;1975:201;;2022:2;2012:8;2018:2;2012:5;:8;:::i;:::-;2011:13;;;;:::i;:::-;:16;;2025:2;2011:16;:::i;:::-;2004:23;;;;;1975:201;2063:2;2055:5;:10;;;2052:124;;2098:1;2088:8;2094:2;2088:5;:8;:::i;:::-;2087:12;;;;:::i;:::-;:15;;2100:2;2087:15;:::i;2052:124::-;2129:1;2121:5;:9;;;2118:58;;2162:1;2153:7;2159:1;2153:5;:7;:::i;:::-;2152:11;;;;:::i;:::-;:13;;2164:1;2152:13;:::i;7240:351:3:-;7333:4;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;7349:73;;;;-1:-1:-1;;;7349:73:3;;42083:2:13;7349:73:3;;;42065:21:13;42122:2;42102:18;;;42095:30;42161:34;42141:18;;;42134:62;-1:-1:-1;;;42212:18:13;;;42205:42;42264:19;;7349:73:3;42055:234:13;7349:73:3;7432:13;7448:23;7463:7;7448:14;:23::i;:::-;7432:39;;7500:5;-1:-1:-1;;;;;7489:16:3;:7;-1:-1:-1;;;;;7489:16:3;;:51;;;;7533:7;-1:-1:-1;;;;;7509:31:3;:20;7521:7;7509:11;:20::i;:::-;-1:-1:-1;;;;;7509:31:3;;7489:51;:94;;;-1:-1:-1;;;;;;4556:25:3;;;4533:4;4556:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7544:39;7481:103;7240:351;-1:-1:-1;;;;7240:351:3:o;10080:530::-;10204:4;-1:-1:-1;;;;;10177:31:3;:23;10192:7;10177:14;:23::i;:::-;-1:-1:-1;;;;;10177:31:3;;10169:85;;;;-1:-1:-1;;;10169:85:3;;44877:2:13;10169:85:3;;;44859:21:13;44916:2;44896:18;;;44889:30;44955:34;44935:18;;;44928:62;-1:-1:-1;;;45006:18:13;;;44999:39;45055:19;;10169:85:3;44849:231:13;10169:85:3;-1:-1:-1;;;;;10272:16:3;;10264:65;;;;-1:-1:-1;;;10264:65:3;;41324:2:13;10264:65:3;;;41306:21:13;41363:2;41343:18;;;41336:30;41402:34;41382:18;;;41375:62;-1:-1:-1;;;41453:18:13;;;41446:34;41497:19;;10264:65:3;41296:226:13;10264:65:3;10441:29;10458:1;10462:7;10441:8;:29::i;:::-;-1:-1:-1;;;;;10481:15:3;;;;;;:9;:15;;;;;:20;;10500:1;;10481:15;:20;;10500:1;;10481:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10511:13:3;;;;;;:9;:13;;;;;:18;;10528:1;;10511:13;:18;;10528:1;;10511:18;:::i;:::-;;;;-1:-1:-1;;10539:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10539:21:3;-1:-1:-1;;;;;10539:21:3;;;;;;;;;10576:27;;10539:16;;10576:27;;;;;;;10080:530;;;:::o;9408:348::-;9467:13;9483:23;9498:7;9483:14;:23::i;:::-;9467:39;;9603:29;9620:1;9624:7;9603:8;:29::i;:::-;-1:-1:-1;;;;;9643:16:3;;;;;;:9;:16;;;;;:21;;9663:1;;9643:16;:21;;9663:1;;9643:21;:::i;:::-;;;;-1:-1:-1;;9681:16:3;;;;:7;:16;;;;;;9674:23;;-1:-1:-1;;;;;;9674:23:3;;;9713:36;9689:7;;9681:16;-1:-1:-1;;;;;9713:36:3;;;;;9681:16;;9713:36;9408:348;;:::o;14428:476:12:-;14527:13;;;14537:2;14527:13;;;14485;14527;;;;;;14510:14;;14527:13;;;;;;;;;;;-1:-1:-1;14527:13:12;14510:30;;14555:6;14550:299;14571:2;14567:1;:6;14550:299;;;14594:8;14645:6;14650:1;14645:2;:6;:::i;:::-;14642:10;;:1;:10;:::i;:::-;14638:15;;:1;:15;:::i;:::-;14618:36;;-1:-1:-1;;;;;14618:16:12;;:36;:::i;:::-;14605:51;;14594:62;;14670:9;14700:2;14695:1;14689:8;;:13;;;;:::i;:::-;14682:21;;14670:33;;14717:9;14758:2;14752:9;;14747:2;:14;;;;:::i;:::-;14742:1;14736:8;;:25;;;;:::i;:::-;14729:33;;14717:45;;14785:8;14790:2;14785:4;:8::i;:::-;14776:1;14778:3;14780:1;14778;:3;:::i;:::-;14776:6;;;;;;-1:-1:-1;;;14776:6:12;;;;;;;;;;;;:17;-1:-1:-1;;;;;14776:17:12;;;;;;;;;14818:8;14823:2;14818:4;:8::i;:::-;14807:1;14809:3;14811:1;14809;:3;:::i;:::-;:5;;14813:1;14809:5;:::i;:::-;14807:8;;;;;;-1:-1:-1;;;14807:8:12;;;;;;;;;;;;:19;-1:-1:-1;;;;;14807:19:12;;;;;;;;;14550:299;;;14575:3;;;;;:::i;:::-;;;;14550:299;;;;14894:1;14872:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;14858:39;;;14428:476;;;:::o;271:703:11:-;327:13;544:10;540:51;;-1:-1:-1;570:10:11;;;;;;;;;;;;-1:-1:-1;;;570:10:11;;;;;;540:51;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:11;;-1:-1:-1;716:2:11;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:11;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:11;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:11;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:11;;;;;;;;-1:-1:-1;915:11:11;924:2;915:11;;:::i;:::-;;;787:150;;6385:269:3;6498:28;6508:4;6514:2;6518:7;6498:9;:28::i;:::-;6544:48;6567:4;6573:2;6577:7;6586:5;6544:22;:48::i;:::-;6536:111;;;;-1:-1:-1;;;6536:111:3;;;;;;;:::i;14910:168:12:-;14957:8;14992:2;14981:8;;;;:13;14977:94;;;15010:15;:8;;;;15021:4;15010:15;:::i;:::-;15003:23;;14996:30;;;;14977:94;15055:15;:8;;;;15066:4;15055:15;:::i;11445:824:3:-;11565:4;-1:-1:-1;;;;;11589:13:3;;1078:20:0;1116:8;11585:678:3;;11624:72;;-1:-1:-1;;;11624:72:3;;-1:-1:-1;;;;;11624:36:3;;;;;:72;;665:10:1;;11675:4:3;;11681:7;;11690:5;;11624:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11624:72:3;;;;;;;;-1:-1:-1;;11624:72:3;;;;;;;;;;;;:::i;:::-;;;11620:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11867:13:3;;11863:334;;11909:60;;-1:-1:-1;;;11909:60:3;;;;;;;:::i;11863:334::-;12149:6;12143:13;12134:6;12130:2;12126:15;12119:38;11620:591;-1:-1:-1;;;;;;11746:55:3;-1:-1:-1;;;11746:55:3;;-1:-1:-1;11739:62:3;;11585:678;-1:-1:-1;12248:4:3;11445:824;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:13;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:13;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:13;;757:42;;747:2;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:2;;978:1;975;968:12;993:196;;1105:2;1093:9;1084:7;1080:23;1076:32;1073:2;;;1126:6;1118;1111:22;1073:2;1154:29;1173:9;1154:29;:::i;:::-;1144:39;1063:126;-1:-1:-1;;;1063:126:13:o;1194:270::-;;;1323:2;1311:9;1302:7;1298:23;1294:32;1291:2;;;1344:6;1336;1329:22;1291:2;1372:29;1391:9;1372:29;:::i;:::-;1362:39;;1420:38;1454:2;1443:9;1439:18;1420:38;:::i;:::-;1410:48;;1281:183;;;;;:::o;1469:338::-;;;;1615:2;1603:9;1594:7;1590:23;1586:32;1583:2;;;1636:6;1628;1621:22;1583:2;1664:29;1683:9;1664:29;:::i;:::-;1654:39;;1712:38;1746:2;1735:9;1731:18;1712:38;:::i;:::-;1702:48;;1797:2;1786:9;1782:18;1769:32;1759:42;;1573:234;;;;;:::o;1812:696::-;;;;;1984:3;1972:9;1963:7;1959:23;1955:33;1952:2;;;2006:6;1998;1991:22;1952:2;2034:29;2053:9;2034:29;:::i;:::-;2024:39;;2082:38;2116:2;2105:9;2101:18;2082:38;:::i;:::-;2072:48;;2167:2;2156:9;2152:18;2139:32;2129:42;;2222:2;2211:9;2207:18;2194:32;2249:18;2241:6;2238:30;2235:2;;;2286:6;2278;2271:22;2235:2;2314:22;;2367:4;2359:13;;2355:27;-1:-1:-1;2345:2:13;;2401:6;2393;2386:22;2345:2;2429:73;2494:7;2489:2;2476:16;2471:2;2467;2463:11;2429:73;:::i;:::-;2419:83;;;1942:566;;;;;;;:::o;2513:264::-;;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;2660:6;2652;2645:22;2607:2;2688:29;2707:9;2688:29;:::i;:::-;2678:39;;2736:35;2767:2;2756:9;2752:18;2736:35;:::i;2782:264::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2960:29;2979:9;2960:29;:::i;:::-;2950:39;3036:2;3021:18;;;;3008:32;;-1:-1:-1;;;2869:177:13:o;3051:190::-;;3160:2;3148:9;3139:7;3135:23;3131:32;3128:2;;;3181:6;3173;3166:22;3128:2;3209:26;3225:9;3209:26;:::i;3246:255::-;;3357:2;3345:9;3336:7;3332:23;3328:32;3325:2;;;3378:6;3370;3363:22;3325:2;3422:9;3409:23;3441:30;3465:5;3441:30;:::i;3506:259::-;;3628:2;3616:9;3607:7;3603:23;3599:32;3596:2;;;3649:6;3641;3634:22;3596:2;3686:9;3680:16;3705:30;3729:5;3705:30;:::i;3770:480::-;;3892:2;3880:9;3871:7;3867:23;3863:32;3860:2;;;3913:6;3905;3898:22;3860:2;3958:9;3945:23;3991:18;3983:6;3980:30;3977:2;;;4028:6;4020;4013:22;3977:2;4056:22;;4109:4;4101:13;;4097:27;-1:-1:-1;4087:2:13;;4143:6;4135;4128:22;4087:2;4171:73;4236:7;4231:2;4218:16;4213:2;4209;4205:11;4171:73;:::i;4255:190::-;;4367:2;4355:9;4346:7;4342:23;4338:32;4335:2;;;4388:6;4380;4373:22;4335:2;-1:-1:-1;4416:23:13;;4325:120;-1:-1:-1;4325:120:13:o;4450:258::-;;;4579:2;4567:9;4558:7;4554:23;4550:32;4547:2;;;4600:6;4592;4585:22;4547:2;-1:-1:-1;;4628:23:13;;;4698:2;4683:18;;;4670:32;;-1:-1:-1;4537:171:13:o;4713:268::-;;4803:5;4797:12;4830:6;4825:3;4818:19;4846:63;4902:6;4895:4;4890:3;4886:14;4879:4;4872:5;4868:16;4846:63;:::i;:::-;4963:2;4942:15;-1:-1:-1;;4938:29:13;4929:39;;;;4970:4;4925:50;;4773:208;-1:-1:-1;;4773:208:13:o;4986:184::-;;5065:5;5059:12;5080:52;5125:6;5120:3;5113:4;5106:5;5102:16;5080:52;:::i;:::-;5148:16;;;;;5035:135;-1:-1:-1;;5035:135:13:o;25266:470::-;;25483:6;25477:13;25499:53;25545:6;25540:3;25533:4;25525:6;25521:17;25499:53;:::i;:::-;25615:13;;25574:16;;;;25637:57;25615:13;25574:16;25671:4;25659:17;;25637:57;:::i;:::-;25710:20;;25453:283;-1:-1:-1;;;;25453:283:13:o;25741:664::-;;26006:6;26000:13;26022:53;26068:6;26063:3;26056:4;26048:6;26044:17;26022:53;:::i;:::-;26138:13;;26097:16;;;;26160:57;26138:13;26097:16;26194:4;26182:17;;26160:57;:::i;:::-;26284:13;;26239:20;;;26306:57;26284:13;26239:20;26340:4;26328:17;;26306:57;:::i;:::-;26379:20;;25976:429;-1:-1:-1;;;;;25976:429:13:o;26410:1721::-;;27014:3;27049:6;27043:13;27079:3;27101:1;27129:9;27125:2;27121:18;27111:28;;27189:2;27178:9;27174:18;27211;27201:2;;27255:4;27247:6;27243:17;27233:27;;27201:2;27281;27329;27321:6;27318:14;27298:18;27295:38;27292:2;;;-1:-1:-1;;;27356:33:13;;27412:4;27409:1;27402:15;27442:4;27363:3;27430:17;27292:2;27473:18;27500:104;;;;27618:1;27613:322;;;;27466:469;;27500:104;-1:-1:-1;;27533:24:13;;27521:37;;27578:16;;;;-1:-1:-1;27500:104:13;;27613:322;47109:127;47175:17;;;47225:4;47209:21;;27708:3;27724:165;27738:6;27735:1;27732:13;27724:165;;;27816:14;;27803:11;;;27796:35;27859:16;;;;27753:10;;27724:165;;;27728:3;;27918:6;27913:3;27909:16;27902:23;;27466:469;;;;;;;27951:174;27976:148;28006:117;28031:91;28061:60;28086:34;28116:3;-1:-1:-1;;;23829:18:13;;23872:1;23863:11;;23819:61;28086:34;28078:6;28061:60;:::i;:::-;-1:-1:-1;;;24408:18:13;;24451:1;24442:11;;24398:61;28031:91;28023:6;28006:117;:::i;:::-;-1:-1:-1;;;23578:18:13;;23621:1;23612:11;;23568:61;27976:148;27968:6;27951:174;:::i;:::-;27944:181;26993:1138;-1:-1:-1;;;;;;;26993:1138:13:o;28136:2482::-;;-1:-1:-1;;;29239:3:13;29232:17;29278:6;29272:13;29294:61;29348:6;29344:1;29339:3;29335:11;29328:4;29320:6;29316:17;29294:61;:::i;:::-;29418:34;29414:1;29374:16;;;29406:10;;;29399:54;29482:34;29477:2;29469:11;;29462:55;29546:34;29541:2;29533:11;;29526:55;-1:-1:-1;;;29605:2:13;29597:11;;29590:42;29657:13;;29679:64;29657:13;29728:3;29720:12;;29713:4;29701:17;;29679:64;:::i;:::-;29809:34;29803:3;29762:17;;;;29795:12;;;29788:56;29874:34;29868:3;29860:12;;29853:56;29939:34;29933:3;29925:12;;29918:56;30004:34;29998:3;29990:12;;29983:56;30069:34;30063:3;30055:12;;30048:56;30134:34;30128:3;30120:12;;30113:56;30199:34;30193:3;30185:12;;30178:56;30264:34;30258:3;30250:12;;30243:56;30329:26;30323:3;30315:12;;30308:48;30372:240;30402:209;30427:183;30457:152;30482:126;30512:95;30537:69;30567:38;30600:3;30592:12;;30584:6;30567:38;:::i;:::-;5719:34;5707:47;;5784:34;5779:2;5770:12;;5763:56;5849:34;5844:2;5835:12;;5828:56;5914:34;5909:2;5900:12;;5893:56;5980:34;5974:3;5965:13;;5958:57;-1:-1:-1;;;6040:3:13;6031:13;;6024:26;6075:3;6066:13;;5697:388;30537:69;30529:6;30512:95;:::i;:::-;23189:34;23177:47;;23254:34;23249:2;23240:12;;23233:56;23319:34;23314:2;23305:12;;23298:56;23384:34;23379:2;23370:12;;23363:56;-1:-1:-1;;;23444:3:13;23435:13;;23428:45;23498:3;23489:13;;23167:341;30482:126;30474:6;30457:152;:::i;:::-;22731:34;22719:47;;22796:34;22791:2;22782:12;;22775:56;22861:34;22856:2;22847:12;;22840:56;-1:-1:-1;;;22921:2:13;22912:12;;22905:31;22961:3;22952:13;;22709:262;30427:183;30419:6;30402:209;:::i;:::-;24541:34;24529:47;;24606:34;24601:2;24592:12;;24585:56;24671:34;24666:2;24657:12;;24650:56;24736:34;24731:2;24722:12;;24715:56;24802:34;24796:3;24787:13;;24780:57;24868:34;24862:3;24853:13;;24846:57;24934:34;24928:3;24919:13;;24912:57;25000:34;24994:3;24985:13;;24978:57;25066:34;25060:3;25051:13;;25044:57;25132:34;25126:3;25117:13;;25110:57;25198:27;25192:3;25183:13;;25176:50;25251:3;25242:13;;24519:742;30372:240;30365:247;29222:1396;-1:-1:-1;;;;;;;;;29222:1396:13:o;30623:417::-;;-1:-1:-1;;;30878:3:13;30871:17;30917:6;30911:13;30933:61;30987:6;30983:1;30978:3;30974:11;30967:4;30959:6;30955:17;30933:61;:::i;:::-;31014:16;;;;31032:1;31010:24;;30861:179;-1:-1:-1;;30861:179:13:o;31045:1797::-;-1:-1:-1;;;31694:68:13;;31785:13;;31045:1797;;31807:62;31785:13;31857:2;31848:12;;31841:4;31829:17;;31807:62;:::i;:::-;31933:66;31928:2;31888:16;;;31920:11;;;31913:87;32029:66;32024:2;32016:11;;32009:87;32125:66;32120:2;32112:11;;32105:87;32222:66;32216:3;32208:12;;32201:88;32314:13;;32336:64;32314:13;32385:3;32377:12;;32370:4;32358:17;;32336:64;:::i;:::-;32466:66;32460:3;32419:17;;;;32452:12;;;32445:88;-1:-1:-1;;;32557:3:13;32549:12;;32542:68;32635:13;;32657:64;32635:13;32706:3;32698:12;;32691:4;32679:17;;32657:64;:::i;:::-;-1:-1:-1;;;32781:3:13;32740:17;;;;32773:12;;;32766:42;32832:3;32824:12;;31684:1158;-1:-1:-1;;;;;31684:1158:13:o;32847:2136::-;;33955:34;33950:3;33943:47;34020:34;34015:2;34010:3;34006:12;33999:56;34085:34;34080:2;34075:3;34071:12;34064:56;34150:34;34145:2;34140:3;34136:12;34129:56;-1:-1:-1;;;34210:3:13;34205;34201:13;34194:41;34264:6;34258:13;34280:61;34334:6;34328:3;34323;34319:13;34314:2;34306:6;34302:15;34280:61;:::i;:::-;-1:-1:-1;;;34400:3:13;34360:16;;;34392:12;;;34385:31;34441:13;;34463:62;34441:13;34510:3;34502:12;;34497:2;34485:15;;34463:62;:::i;:::-;34591:34;34585:3;34544:17;;;;34577:12;;;34570:56;34656:34;34650:3;34642:12;;34635:56;-1:-1:-1;;;34715:3:13;34707:12;;34700:26;34742:235;34772:204;34797:178;34827:147;34852:121;34877:95;34902:69;34932:38;34965:3;34957:12;;34949:6;34932:38;:::i;:::-;23962:34;23950:47;;24027:34;24022:2;24013:12;;24006:56;24092:34;24087:2;24078:12;;24071:56;24157:34;24152:2;24143:12;;24136:56;24223:34;24217:3;24208:13;;24201:57;-1:-1:-1;;;24283:3:13;24274:13;;24267:36;24328:3;24319:13;;23940:398;34877:95;5247:34;5235:47;;5312:34;5307:2;5298:12;;5291:56;5377:34;5372:2;5363:12;;5356:56;5442:34;5437:2;5428:12;;5421:56;5508:34;5502:3;5493:13;;5486:57;5574:27;5568:3;5559:13;;5552:50;5627:3;5618:13;;5225:412;34827:147;6167:34;6155:47;;6232:34;6227:2;6218:12;;6211:56;6297:34;6292:2;6283:12;;6276:56;6362:34;6357:2;6348:12;;6341:56;6428:34;6422:3;6413:13;;6406:57;6494:34;6488:3;6479:13;;6472:57;6560:34;6554:3;6545:13;;6538:57;6626:34;6620:3;6611:13;;6604:57;6692:34;6686:3;6677:13;;6670:57;6758:34;6752:3;6743:13;;6736:57;6824:34;6818:3;6809:13;;6802:57;6890:34;6884:3;6875:13;;6868:57;6956:34;6950:3;6941:13;;6934:57;7022:34;7016:3;7007:13;;7000:57;7088:34;7082:3;7073:13;;7066:57;7154:34;7148:3;7139:13;;7132:57;7220:34;7214:3;7205:13;;7198:57;7286:34;7280:3;7271:13;;7264:57;7352:34;7346:3;7337:13;;7330:57;7418:34;7412:3;7403:13;;7396:57;7484:34;7478:3;7469:13;;7462:57;7550:34;7544:3;7535:13;;7528:57;7616:34;7610:3;7601:13;;7594:57;7682:34;7676:3;7667:13;;7660:57;7748:34;7742:3;7733:13;;7726:57;7814:34;7808:3;7799:13;;7792:57;7880:34;7874:3;7865:13;;7858:57;7946:34;7940:3;7931:13;;7924:57;8012:34;8006:3;7997:13;;7990:57;8078:34;8072:3;8063:13;;8056:57;8144:34;8138:3;8129:13;;8122:57;8210:34;8204:3;8195:13;;8188:57;8277:34;8270:4;8261:14;;8254:58;8344:34;8337:4;8328:14;;8321:58;8411:34;8404:4;8395:14;;8388:58;8478:34;8471:4;8462:14;;8455:58;8545:34;8538:4;8529:14;;8522:58;8612:34;8605:4;8596:14;;8589:58;8679:34;8672:4;8663:14;;8656:58;8746:34;8739:4;8730:14;;8723:58;8813:34;8806:4;8797:14;;8790:58;8867:34;8926:4;8917:14;;8910:26;;;8968:34;8961:4;8952:14;;8945:58;9035:34;9028:4;9019:14;;9012:58;9102:34;9095:4;9086:14;;9079:58;9169:34;9162:4;9153:14;;9146:58;9236:34;9229:4;9220:14;;9213:58;9303:34;9296:4;9287:14;;9280:58;9370:34;9363:4;9354:14;;9347:58;9430:4;9421:14;;9414:26;9472:34;9465:4;9456:14;;9449:58;9539:34;9532:4;9523:14;;9516:58;9606:34;9599:4;9590:14;;9583:58;9673:34;9666:4;9657:14;;9650:58;9740:34;9733:4;9724:14;;9717:58;9807:34;9800:4;9791:14;;9784:58;9874:34;9867:4;9858:14;;9851:58;9941:34;9934:4;9925:14;;9918:58;10008:34;10001:4;9992:14;;9985:58;10075:34;10068:4;10059:14;;10052:58;10142:34;10135:4;10126:14;;10119:58;10209:34;10202:4;10193:14;;10186:58;10276:34;10269:4;10260:14;;10253:58;10343:34;10336:4;10327:14;;10320:58;10410:34;10403:4;10394:14;;10387:58;10477:34;10470:4;10461:14;;10454:58;10544:34;10537:4;10528:14;;10521:58;10611:34;10604:4;10595:14;;10588:58;10678:34;10671:4;10662:14;;10655:58;10745:34;10738:4;10729:14;;10722:58;10812:34;10805:4;10796:14;;10789:58;10879:34;10872:4;10863:14;;10856:58;10946:34;10939:4;10930:14;;10923:58;11013:34;11006:4;10997:14;;10990:58;11080:34;11073:4;11064:14;;11057:58;11147:34;11140:4;11131:14;;11124:58;11214:34;11207:4;11198:14;;11191:58;11281:34;11274:4;11265:14;;11258:58;11348:34;11341:4;11332:14;;11325:58;11415:34;11408:4;11399:14;;11392:58;11482:34;11475:4;11466:14;;11459:58;11549:34;11542:4;11533:14;;11526:58;11616:34;11609:4;11600:14;;11593:58;11683:34;11676:4;11667:14;;11660:58;11750:34;11743:4;11734:14;;11727:58;11817:34;11810:4;11801:14;;11794:58;11884:34;11877:4;11868:14;;11861:58;11951:34;11944:4;11935:14;;11928:58;12018:34;12011:4;12002:14;;11995:58;12085:34;12078:4;12069:14;;12062:58;12152:34;12145:4;12136:14;;12129:58;12219:34;12212:4;12203:14;;12196:58;12286:34;12279:4;12270:14;;12263:58;12353:34;12346:4;12337:14;;12330:58;12420:34;12413:4;12404:14;;12397:58;12487:34;12480:4;12471:14;;12464:58;12554:34;12547:4;12538:14;;12531:58;12621:34;12614:4;12605:14;;12598:58;12688:34;12681:4;12672:14;;12665:58;12755:34;12748:4;12739:14;;12732:58;12822:34;12815:4;12806:14;;12799:58;12889:34;12882:4;12873:14;;12866:58;12956:34;12949:4;12940:14;;12933:58;13023:34;13016:4;13007:14;;13000:58;13090:34;13083:4;13074:14;;13067:58;13157:34;13150:4;13141:14;;13134:58;13224:34;13217:4;13208:14;;13201:58;13291:34;13284:4;13275:14;;13268:58;13358:34;13351:4;13342:14;;13335:58;13425:34;13418:4;13409:14;;13402:58;13492:34;13485:4;13476:14;;13469:58;13559:34;13552:4;13543:14;;13536:58;13626:34;13619:4;13610:14;;13603:58;13693:34;13686:4;13677:14;;13670:58;13760:34;13753:4;13744:14;;13737:58;13827:34;13820:4;13811:14;;13804:58;13894:34;13887:4;13878:14;;13871:58;13961:34;13954:4;13945:14;;13938:58;14028:34;14021:4;14012:14;;14005:58;14095:34;14088:4;14079:14;;14072:58;14162:34;14155:4;14146:14;;14139:58;14229:34;14222:4;14213:14;;14206:58;14296:34;14289:4;14280:14;;14273:58;14363:34;14356:4;14347:14;;14340:58;14430:34;14423:4;14414:14;;14407:58;14497:34;14490:4;14481:14;;14474:58;14564:34;14557:4;14548:14;;14541:58;14631:34;14624:4;14615:14;;14608:58;14698:34;14691:4;14682:14;;14675:58;14765:34;14758:4;14749:14;;14742:58;14832:34;14825:4;14816:14;;14809:58;14899:34;14892:4;14883:14;;14876:58;14966:34;14959:4;14950:14;;14943:58;15033:34;15026:4;15017:14;;15010:58;15100:34;15093:4;15084:14;;15077:58;15167:34;15160:4;15151:14;;15144:58;15234:34;15227:4;15218:14;;15211:58;15301:34;15294:4;15285:14;;15278:58;15368:34;15361:4;15352:14;;15345:58;15435:34;15428:4;15419:14;;15412:58;15502:34;15495:4;15486:14;;15479:58;15569:34;15562:4;15553:14;;15546:58;15636:34;15629:4;15620:14;;15613:58;15703:34;15696:4;15687:14;;15680:58;15770:34;15763:4;15754:14;;15747:58;15837:34;15830:4;15821:14;;15814:58;15904:34;15897:4;15888:14;;15881:58;15971:34;15964:4;15955:14;;15948:58;16038:34;16031:4;16022:14;;16015:58;16105:34;16098:4;16089:14;;16082:58;16172:34;16165:4;16156:14;;16149:58;16239:34;16232:4;16223:14;;16216:58;16306:34;16299:4;16290:14;;16283:58;16373:34;16366:4;16357:14;;16350:58;16440:34;16433:4;16424:14;;16417:58;16507:34;16500:4;16491:14;;16484:58;16574:34;16567:4;16558:14;;16551:58;16641:34;16634:4;16625:14;;16618:58;16708:34;16701:4;16692:14;;16685:58;16775:34;16768:4;16759:14;;16752:58;16842:34;16835:4;16826:14;;16819:58;16909:34;16902:4;16893:14;;16886:58;16976:34;16969:4;16960:14;;16953:58;17043:34;17036:4;17027:14;;17020:58;17110:34;17103:4;17094:14;;17087:58;17177:34;17170:4;17161:14;;17154:58;17244:34;17237:4;17228:14;;17221:58;17311:34;17304:4;17295:14;;17288:58;17378:34;17371:4;17362:14;;17355:58;17445:34;17438:4;17429:14;;17422:58;17512:34;17505:4;17496:14;;17489:58;17579:34;17572:4;17563:14;;17556:58;17646:34;17639:4;17630:14;;17623:58;17713:34;17706:4;17697:14;;17690:58;17780:34;17773:4;17764:14;;17757:58;17847:34;17840:4;17831:14;;17824:58;17914:34;17907:4;17898:14;;17891:58;17981:34;17974:4;17965:14;;17958:58;18048:34;18041:4;18032:14;;18025:58;18115:34;18108:4;18099:14;;18092:58;18182:34;18175:4;18166:14;;18159:58;18249:34;18242:4;18233:14;;18226:58;18316:34;18309:4;18300:14;;18293:58;18383:34;18376:4;18367:14;;18360:58;18450:34;18443:4;18434:14;;18427:58;18517:34;18510:4;18501:14;;18494:58;18584:34;18577:4;18568:14;;18561:58;18651:34;18644:4;18635:14;;18628:58;18718:34;18711:4;18702:14;;18695:58;18785:34;18778:4;18769:14;;18762:58;18852:34;18845:4;18836:14;;18829:58;18919:34;18912:4;18903:14;;18896:58;18986:34;18979:4;18970:14;;18963:58;19053:34;19046:4;19037:14;;19030:58;19120:34;19113:4;19104:14;;19097:58;19187:34;19180:4;19171:14;;19164:58;19254:34;19247:4;19238:14;;19231:58;19321:34;19314:4;19305:14;;19298:58;19388:34;19381:4;19372:14;;19365:58;19455:34;19448:4;19439:14;;19432:58;19522:34;19515:4;19506:14;;19499:58;19589:34;19582:4;19573:14;;19566:58;19656:34;19649:4;19640:14;;19633:58;19723:34;19716:4;19707:14;;19700:58;19790:34;19783:4;19774:14;;19767:58;19857:34;19850:4;19841:14;;19834:58;19924:34;19917:4;19908:14;;19901:58;19978:34;20037:4;20028:14;;20021:26;;;20079:34;20072:4;20063:14;;20056:58;20139:4;20130:14;;20123:26;;;20181:34;20174:4;20165:14;;20158:58;20241:4;20232:14;;20225:26;;;20283:34;20276:4;20267:14;;20260:58;20343:4;20334:14;;20327:26;20385:34;20378:4;20369:14;;20362:58;20452:34;20445:4;20436:14;;20429:58;20519:34;20512:4;20503:14;;20496:58;20586:34;20579:4;20570:14;;20563:58;20653:34;20646:4;20637:14;;20630:58;20720:34;20713:4;20704:14;;20697:58;20787:34;20780:4;20771:14;;20764:58;20854:34;20847:4;20838:14;;20831:58;20921:34;20914:4;20905:14;;20898:58;20988:34;20981:4;20972:14;;20965:58;21055:34;21048:4;21039:14;;21032:58;21122:34;21115:4;21106:14;;21099:58;21189:34;21182:4;21173:14;;21166:58;21256:34;21249:4;21240:14;;21233:58;21323:34;21316:4;21307:14;;21300:58;21390:34;21383:4;21374:14;;21367:58;21457:34;21450:4;21441:14;;21434:58;21524:34;21517:4;21508:14;;21501:58;21591:34;21584:4;21575:14;;21568:58;21658:34;21651:4;21642:14;;21635:58;21725:34;21718:4;21709:14;;21702:58;21792:34;21785:4;21776:14;;21769:58;21859:34;21852:4;21843:14;;21836:58;21926:34;21919:4;21910:14;;21903:58;21993:34;21986:4;21977:14;;21970:58;22060:34;22053:4;22044:14;;22037:58;22127:34;22120:4;22111:14;;22104:58;22194:34;22187:4;22178:14;;22171:58;22261:34;22254:4;22245:14;;22238:58;22328:34;22321:4;22312:14;;22305:58;22395:34;22388:4;22379:14;;22372:58;22462:34;22455:4;22446:14;;22439:58;22529:34;22522:4;22513:14;;22506:58;-1:-1:-1;;;22589:4:13;22580:14;;22573:40;22638:4;22629:14;;6145:16504;34772:204;-1:-1:-1;;;23699:26:13;;23750:2;23741:12;;23689:70;34988:1696;;-1:-1:-1;;;35793:3:13;35786:29;35844:6;35838:13;35860:62;35915:6;35910:2;35905:3;35901:12;35894:4;35886:6;35882:17;35860:62;:::i;:::-;-1:-1:-1;;;35981:2:13;35941:16;;;35973:11;;;35966:25;36016:13;;36038:63;36016:13;36087:2;36079:11;;36072:4;36060:17;;36038:63;:::i;:::-;36166:34;36161:2;36120:17;;;;36153:11;;;36146:55;36230:34;36225:2;36217:11;;36210:55;36294:30;36289:2;36281:11;;36274:51;36350:13;;36372:64;36350:13;36421:3;36413:12;;36406:4;36394:17;;36372:64;:::i;:::-;36502:34;36496:3;36455:17;;;;36488:12;;;36481:56;36567:25;36561:3;36553:12;;36546:47;36609:69;36639:38;36672:3;36664:12;;36656:6;36639:38;:::i;:::-;-1:-1:-1;;;23041:32:13;;23098:2;23089:12;;23031:76;36689:1742;;-1:-1:-1;;;37542:3:13;37535:18;37582:6;37576:13;37598:61;37652:6;37648:1;37643:3;37639:11;37632:4;37624:6;37620:17;37598:61;:::i;:::-;-1:-1:-1;;;37718:1:13;37678:16;;;37710:10;;;37703:26;37754:13;;37776:62;37754:13;37825:1;37817:10;;37810:4;37798:17;;37776:62;:::i;:::-;-1:-1:-1;;;37898:1:13;37857:17;;;;37890:10;;;37883:26;37934:13;;37956:63;37934:13;38005:2;37997:11;;37990:4;37978:17;;37956:63;:::i;:::-;-1:-1:-1;;;38079:2:13;38038:17;;;;38071:11;;;38064:27;38116:13;;38138:63;38116:13;38187:2;38179:11;;38172:4;38160:17;;38138:63;:::i;:::-;-1:-1:-1;;;38261:2:13;38220:17;;;;38253:11;;;38246:27;38298:13;;38320:63;38298:13;38369:2;38361:11;;38354:4;38342:17;;38320:63;:::i;:::-;38403:17;38422:2;38399:26;;37525:906;-1:-1:-1;;;;;;;37525:906:13:o;39008:499::-;-1:-1:-1;;;;;39277:15:13;;;39259:34;;39329:15;;39324:2;39309:18;;39302:43;39376:2;39361:18;;39354:34;;;39424:3;39419:2;39404:18;;39397:31;;;39008:499;;39445:56;;39481:19;;39473:6;39445:56;:::i;:::-;39437:64;39211:296;-1:-1:-1;;;;;;39211:296:13:o;39704:230::-;;39853:2;39842:9;39835:21;39873:55;39924:2;39913:9;39909:18;39901:6;39873:55;:::i;39939:414::-;40141:2;40123:21;;;40180:2;40160:18;;;40153:30;40219:34;40214:2;40199:18;;40192:62;-1:-1:-1;;;40285:2:13;40270:18;;40263:48;40343:3;40328:19;;40113:240::o;44314:356::-;44516:2;44498:21;;;44535:18;;;44528:30;44594:34;44589:2;44574:18;;44567:62;44661:2;44646:18;;44488:182::o;45903:413::-;46105:2;46087:21;;;46144:2;46124:18;;;46117:30;46183:34;46178:2;46163:18;;46156:62;-1:-1:-1;;;46249:2:13;46234:18;;46227:47;46306:3;46291:19;;46077:239::o;47241:128::-;;47312:1;47308:6;47305:1;47302:13;47299:2;;;47318:18;;:::i;:::-;-1:-1:-1;47354:9:13;;47289:80::o;47374:204::-;;47448:4;47445:1;47441:12;47480:4;47477:1;47473:12;47515:3;47509:4;47505:14;47500:3;47497:23;47494:2;;;47523:18;;:::i;:::-;47559:13;;47420:158;-1:-1:-1;;;47420:158:13:o;47583:120::-;;47649:1;47639:2;;47654:18;;:::i;:::-;-1:-1:-1;47688:9:13;;47629:74::o;47708:165::-;;47780:4;47777:1;47773:12;47804:3;47794:2;;47811:18;;:::i;:::-;47863:3;47856:4;47853:1;47849:12;47845:22;47840:27;;;47752:121;;;;:::o;47878:453::-;47974:6;47997:5;48011:314;48060:1;48097:2;48087:8;48084:16;48074:2;;48104:5;;;48074:2;48145:4;48140:3;48136:14;48130:4;48127:24;48124:2;;;48154:18;;:::i;:::-;48204:2;48194:8;48190:17;48187:2;;;48219:16;;;;48187:2;48298:17;;;;;48258:15;;48011:314;;;47955:376;;;;;;;:::o;48336:139::-;;48425:44;-1:-1:-1;;48452:8:13;48446:4;48480:922;48564:8;48554:2;;-1:-1:-1;48605:1:13;48619:5;;48554:2;48653:4;48643:2;;-1:-1:-1;48690:1:13;48704:5;;48643:2;48735:4;48753:1;48748:59;;;;48821:1;48816:183;;;;48728:271;;48748:59;48778:1;48769:10;;48792:5;;;48816:183;48853:3;48843:8;48840:17;48837:2;;;48860:18;;:::i;:::-;48916:1;48906:8;48902:16;48893:25;;48944:3;48937:5;48934:14;48931:2;;;48951:18;;:::i;:::-;48984:5;;;48728:271;;49083:2;49073:8;49070:16;49064:3;49058:4;49055:13;49051:36;49045:2;49035:8;49032:16;49027:2;49021:4;49018:12;49014:35;49011:77;49008:2;;;-1:-1:-1;49120:19:13;;;49155:14;;;49152:2;;;49172:18;;:::i;:::-;49205:5;;49008:2;49252:42;49290:3;49280:8;49274:4;49271:1;49252:42;:::i;:::-;49327:6;49322:3;49318:16;49309:7;49306:29;49303:2;;;49338:18;;:::i;:::-;49376:20;;48544:858;-1:-1:-1;;;;48544:858:13:o;49407:168::-;;49513:1;49509;49505:6;49501:14;49498:1;49495:21;49490:1;49483:9;49476:17;49472:45;49469:2;;;49520:18;;:::i;:::-;-1:-1:-1;49560:9:13;;49459:116::o;49580:238::-;;49658:4;49655:1;49651:12;49690:4;49687:1;49683:12;49750:3;49744:4;49740:14;49735:3;49732:23;49725:3;49718:11;49711:19;49707:49;49704:2;;;49759:18;;:::i;:::-;49799:13;;49630:188;-1:-1:-1;;;49630:188:13:o;49823:125::-;;49891:1;49888;49885:8;49882:2;;;49896:18;;:::i;:::-;-1:-1:-1;49933:9:13;;49872:76::o;49953:195::-;;50028:4;50025:1;50021:12;50060:4;50057:1;50053:12;50085:3;50080;50077:12;50074:2;;;50092:18;;:::i;:::-;50129:13;;;50000:148;-1:-1:-1;;;50000:148:13:o;50153:258::-;50225:1;50235:113;50249:6;50246:1;50243:13;50235:113;;;50325:11;;;50319:18;50306:11;;;50299:39;50271:2;50264:10;50235:113;;;50366:6;50363:1;50360:13;50357:2;;;-1:-1:-1;;50401:1:13;50383:16;;50376:27;50206:205::o;50416:380::-;50495:1;50491:12;;;;50538;;;50559:2;;50613:4;50605:6;50601:17;50591:27;;50559:2;50666;50658:6;50655:14;50635:18;50632:38;50629:2;;;50712:10;50707:3;50703:20;50700:1;50693:31;50747:4;50744:1;50737:15;50775:4;50772:1;50765:15;50629:2;;50471:325;;;:::o;50801:135::-;;-1:-1:-1;;50861:17:13;;50858:2;;;50881:18;;:::i;:::-;-1:-1:-1;50928:1:13;50917:13;;50848:88::o;50941:112::-;;50999:1;50989:2;;51004:18;;:::i;:::-;-1:-1:-1;51038:9:13;;50979:74::o;51058:127::-;51119:10;51114:3;51110:20;51107:1;51100:31;51150:4;51147:1;51140:15;51174:4;51171:1;51164:15;51190:127;51251:10;51246:3;51242:20;51239:1;51232:31;51282:4;51279:1;51272:15;51306:4;51303:1;51296:15;51322:127;51383:10;51378:3;51374:20;51371:1;51364:31;51414:4;51411:1;51404:15;51438:4;51435:1;51428:15;51454:131;-1:-1:-1;;;;;;51528:32:13;;51518:43;;51508:2;;51575:1;51572;51565:12
Swarm Source
ipfs://a66ea4139bc30b2a60b53c830e4c148d1398b313a37498388df323e3818160af
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.