Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 14869552 | 974 days ago | IN | 0 ETH | 0.00097597 | ||||
Add Many One Of ... | 13986363 | 1112 days ago | IN | 0 ETH | 0.2735077 | ||||
Add Many One Of ... | 13986363 | 1112 days ago | IN | 0 ETH | 0.28449841 | ||||
Add Many Mouths | 13986363 | 1112 days ago | IN | 0 ETH | 0.05459985 | ||||
Add Many Mouths | 13986363 | 1112 days ago | IN | 0 ETH | 0.12276836 | ||||
Add Many Skins | 13986363 | 1112 days ago | IN | 0 ETH | 0.05396262 | ||||
Add Many Skins | 13986363 | 1112 days ago | IN | 0 ETH | 0.15026601 | ||||
Add Many Accesso... | 13986358 | 1112 days ago | IN | 0 ETH | 0.0405792 | ||||
Add Many Clothes | 13986358 | 1112 days ago | IN | 0 ETH | 0.20534603 | ||||
Add Many Bg Item... | 13986358 | 1112 days ago | IN | 0 ETH | 0.0961839 | ||||
Add Many Hats | 13986358 | 1112 days ago | IN | 0 ETH | 0.01976394 | ||||
Add Many Eyes | 13986355 | 1112 days ago | IN | 0 ETH | 0.03218142 | ||||
Add Many Colors ... | 13986355 | 1112 days ago | IN | 0 ETH | 0.5835893 | ||||
Add Many Backgro... | 13986355 | 1112 days ago | IN | 0 ETH | 0.01774099 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Descriptor
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 /// @title The Wizards NFT descriptor pragma solidity ^0.8.6; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {IDescriptor} from "./IDescriptor.sol"; import {ISeeder} from "../seeder/ISeeder.sol"; import {NFTDescriptor} from "../libs/NFTDescriptor.sol"; import {MultiPartRLEToSVG} from "../libs/MultiPartRLEToSVG.sol"; contract Descriptor is IDescriptor, Ownable { using Strings for uint256; // Whether or not new parts can be added bool public override arePartsLocked; // Whether or not `tokenURI` should be returned as a data URI (Default: true) bool public override isDataURIEnabled = true; // Base URI string public override baseURI; // Color Palettes (Index => Hex Colors) mapping(uint8 => string[]) public override palettes; // Backgrounds (Hex Colors) string[] public override backgrounds; // Skins (Custom RLE) bytes[] public override skins; // Clothes (Custom RLE) bytes[] public override clothes; // Accessories (Custom RLE) bytes[] public override accessory; // BgItems (orb, staff, etc) (Custom RLE) bytes[] public override bgItems; // Mouths (Custom RLE) bytes[] public override mouths; // Eyes (Custom RLE) bytes[] public override eyes; // Hats (Custom RLE) bytes[] public override hats; // 1-1 wizards (Custom RLE) bytes[] public override oneOfOnes; uint256 public lastOneOfOneCount; /** * @notice Require that the parts have not been locked. */ modifier whenPartsNotLocked() { require(!arePartsLocked, "Parts are locked"); _; } /** * @notice Get the number of available `backgrounds`. */ function backgroundCount() external view override returns (uint256) { return backgrounds.length; } /** * @notice One of ones count. */ function oneOfOnesCount() external view override returns (uint256) { return oneOfOnes.length; } /** * @notice Get the number of available `skins`. */ function skinsCount() external view override returns (uint256) { return skins.length; } /** * @notice Get the number of available `clothes`. */ function clothesCount() external view override returns (uint256) { return clothes.length; } /** * @notice Get the number of available `accesories`. */ function accessoryCount() external view override returns (uint256) { return accessory.length; } /** * @notice Get the number of available `bg items`. */ function bgItemsCount() external view override returns (uint256) { return bgItems.length; } /** * @notice Get the number of available `hats`. */ function hatsCount() external view override returns (uint256) { return hats.length; } /** * @notice Get the number of available `mouths`. */ function mouthsCount() external view override returns (uint256) { return mouths.length; } /** * @notice Get the number of available `eyes`. */ function eyesCount() external view override returns (uint256) { return eyes.length; } /** * @notice Add colors to a color palette. * @dev This function can only be called by the owner. */ function addManyColorsToPalette( uint8 paletteIndex, string[] calldata newColors ) external override onlyOwner { require( palettes[paletteIndex].length + newColors.length <= 256, "Palettes can only hold 256 colors" ); for (uint256 i = 0; i < newColors.length; i++) { _addColorToPalette(paletteIndex, newColors[i]); } } /** * @notice Replaces colors in a color palette. * @dev This function can only be called by the owner and should only * be used administratively to restore proper palette indexes. */ function replacePalette(uint8 paletteIndex, string[] calldata newColors) external onlyOwner { require(newColors.length <= 256, "Palettes can only hold 256 colors"); delete palettes[paletteIndex]; for (uint256 i = 0; i < newColors.length; i++) { _addColorToPalette(paletteIndex, newColors[i]); } } /** * @notice Batch add backgrounds. * @dev This function can only be called by the owner when not locked. */ function addManyBackgrounds(string[] calldata _backgrounds) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _backgrounds.length; i++) { _addBackground(_backgrounds[i]); } } /** * @notice Batch add skins. * @dev This function can only be called by the owner when not locked. */ function addManySkins(bytes[] calldata _skins) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _skins.length; i++) { _addSkin(_skins[i]); } } /** * @notice Batch add hats. * @dev This function can only be called by the owner when not locked. */ function addManyHats(bytes[] calldata _hats) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _hats.length; i++) { _addHat(_hats[i]); } } /** * @notice Batch add eyes. * @dev This function can only be called by the owner when not locked. */ function addManyEyes(bytes[] calldata _eyes) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _eyes.length; i++) { _addEyes(_eyes[i]); } } /** * @notice Batch add mouths. * @dev This function can only be called by the owner when not locked. */ function addManyMouths(bytes[] calldata _mouths) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _mouths.length; i++) { _addMouth(_mouths[i]); } } /** * @notice Batch add bg items. * @dev This function can only be called by the owner when not locked. */ function addManyBgItems(bytes[] calldata _bgItems) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _bgItems.length; i++) { _addBgItem(_bgItems[i]); } } /** * @notice Batch add accessories. * @dev This function can only be called by the owner when not locked. */ function addManyAccessories(bytes[] calldata _accessory) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _accessory.length; i++) { _addAccessory(_accessory[i]); } } /** * @notice Batch add clothes. * @dev This function can only be called by the owner when not locked. */ function addManyClothes(bytes[] calldata _clothes) external override onlyOwner whenPartsNotLocked { for (uint256 i = 0; i < _clothes.length; i++) { _addClothes(_clothes[i]); } } /** * @notice Batch add one of one Wizards. * @dev This function can only be called by the owner when not locked. */ function addManyOneOfOnes(bytes[] calldata _oneOfOnes) external override onlyOwner whenPartsNotLocked { lastOneOfOneCount += _oneOfOnes.length; for (uint256 i = 0; i < _oneOfOnes.length; i++) { _addOneOfOne(_oneOfOnes[i]); } } /** * @notice Add a single color to a color palette. * @dev This function can only be called by the owner. */ function addColorToPalette(uint8 _paletteIndex, string calldata _color) external override onlyOwner { require( palettes[_paletteIndex].length <= 255, "Palettes can only hold 256 colors" ); _addColorToPalette(_paletteIndex, _color); } /** * @notice Add a one of one wizards. * @dev This function can only be called by the owner when not locked. */ function addOneOfOne(bytes calldata _oneOfOne) external override onlyOwner whenPartsNotLocked { lastOneOfOneCount += 1; _addOneOfOne(_oneOfOne); } /** * @notice Add a background. * @dev This function can only be called by the owner when not locked. */ function addBackground(string calldata _background) external override onlyOwner whenPartsNotLocked { _addBackground(_background); } /** * @notice Add a skin. * @dev This function can only be called by the owner when not locked. */ function addSkin(bytes calldata _skin) external override onlyOwner whenPartsNotLocked { _addSkin(_skin); } /** * @notice Add wizard hat. * @dev This function can only be called by the owner when not locked. */ function addHat(bytes calldata _hat) external override onlyOwner whenPartsNotLocked { _addHat(_hat); } /** * @notice Add a clothes. * @dev This function can only be called by the owner when not locked. */ function addClothes(bytes calldata _clothes) external override onlyOwner whenPartsNotLocked { _addClothes(_clothes); } /** * @notice Add a bg item. * @dev This function can only be called by the owner when not locked. */ function addBgItem(bytes calldata _bgItem) external override onlyOwner whenPartsNotLocked { _addBgItem(_bgItem); } /** * @notice Add a accessory. * @dev This function can only be called by the owner when not locked. */ function addAccessory(bytes calldata _accessory) external override onlyOwner whenPartsNotLocked { _addAccessory(_accessory); } /** * @notice Add a mouth. * @dev This function can only be called by the owner when not locked. */ function addMouth(bytes calldata _mouth) external override onlyOwner whenPartsNotLocked { _addMouth(_mouth); } /** * @notice Add eyes. * @dev This function can only be called by the owner when not locked. */ function addEyes(bytes calldata _eyes) external override onlyOwner whenPartsNotLocked { _addEyes(_eyes); } /** * @notice Lock all parts. * @dev This cannot be reversed and can only be called by the owner when not locked. */ function lockParts() external override onlyOwner whenPartsNotLocked { arePartsLocked = true; emit PartsLocked(); } /** * @notice Toggle a boolean value which determines if `tokenURI` returns a data URI * or an HTTP URL. * @dev This can only be called by the owner. */ function toggleDataURIEnabled() external override onlyOwner { bool enabled = !isDataURIEnabled; isDataURIEnabled = enabled; emit DataURIToggled(enabled); } /** * @notice Set the base URI for all token IDs. It is automatically * added as a prefix to the value returned in {tokenURI}, or to the * token ID if {tokenURI} is empty. * @dev This can only be called by the owner. */ function setBaseURI(string calldata _baseURI) external override onlyOwner { baseURI = _baseURI; emit BaseURIUpdated(_baseURI); } /** * @notice Given a token ID and seed, construct a token URI. * @dev The returned value may be a base64 encoded data URI or an API URL. */ function tokenURI(uint256 tokenId, ISeeder.Seed memory seed) external view override returns (string memory) { if (isDataURIEnabled) { return dataURI(tokenId, seed); } return string(abi.encodePacked(baseURI, tokenId.toString())); } /** * @notice Given a token ID and seed, construct a base64 encoded data URI. */ function dataURI(uint256 tokenId, ISeeder.Seed memory seed) public view override returns (string memory) { string memory wizardId = tokenId.toString(); string memory name = string(abi.encodePacked("Wizard #", wizardId)); string memory description = ""; if (seed.oneOfOne) { description = string( abi.encodePacked( "Wizard #", wizardId, " is a one of one artpiece and a member of the WizardsDAO" ) ); } else { description = string( abi.encodePacked( "Wizard #", wizardId, " is a member of the WizardsDAO" ) ); } return genericDataURI(name, description, seed); } /** * @notice Given a name, description, and seed, construct a base64 encoded data URI. */ function genericDataURI( string memory name, string memory description, ISeeder.Seed memory seed ) public view override returns (string memory) { NFTDescriptor.TokenURIParams memory params = NFTDescriptor .TokenURIParams({ name: name, description: description, parts: _getPartsForSeed(seed), background: backgrounds[seed.background] }); return NFTDescriptor.constructTokenURI(params, palettes); } /** * @notice Given a seed, construct a base64 encoded SVG image. */ function generateSVGImage(ISeeder.Seed memory seed) external view override returns (string memory) { MultiPartRLEToSVG.SVGParams memory params = MultiPartRLEToSVG .SVGParams({ parts: _getPartsForSeed(seed), background: backgrounds[seed.background] }); return NFTDescriptor.generateSVGImage(params, palettes); } /** * @notice Add a single color to a color palette. */ function _addColorToPalette(uint8 _paletteIndex, string calldata _color) internal { palettes[_paletteIndex].push(_color); } /** * @notice Add a single one of one wizard. */ function _addOneOfOne(bytes calldata _oneOfOne) internal { oneOfOnes.push(_oneOfOne); } /** * @notice Add a background. */ function _addBackground(string calldata _background) internal { backgrounds.push(_background); } /** * @notice Add a skin. */ function _addSkin(bytes calldata _skin) internal { skins.push(_skin); } /** * @notice Add clothes. */ function _addClothes(bytes calldata _clothes) internal { clothes.push(_clothes); } /** * @notice Add accessories. */ function _addAccessory(bytes calldata _accessory) internal { accessory.push(_accessory); } /** * @notice Add bg items. */ function _addBgItem(bytes calldata _bgItem) internal { bgItems.push(_bgItem); } /** * @notice Add a mouth. */ function _addMouth(bytes calldata _mouth) internal { mouths.push(_mouth); } /** * @notice Add eyes. */ function _addEyes(bytes calldata _eyes) internal { eyes.push(_eyes); } /** * @notice Add hat. */ function _addHat(bytes calldata _hat) internal { hats.push(_hat); } /** * @notice Get all parts for the passed `seed`. */ function _getPartsForSeed(ISeeder.Seed memory seed) internal view returns (bytes[] memory) { if (seed.oneOfOne) { bytes[] memory _oneOfOneParts = new bytes[](1); _oneOfOneParts[0] = oneOfOnes[seed.oneOfOneIndex]; return _oneOfOneParts; } bytes[] memory _parts = new bytes[](7); _parts[0] = skins[seed.skin]; _parts[1] = clothes[seed.clothes]; _parts[2] = eyes[seed.eyes]; _parts[3] = mouths[seed.mouth]; _parts[4] = accessory[seed.accessory]; _parts[5] = bgItems[seed.bgItem]; _parts[6] = hats[seed.hat]; return _parts; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for Descriptor pragma solidity ^0.8.6; import { ISeeder } from '../seeder/ISeeder.sol'; interface IDescriptor { event PartsLocked(); event DataURIToggled(bool enabled); event BaseURIUpdated(string baseURI); function arePartsLocked() external returns (bool); function isDataURIEnabled() external returns (bool); function baseURI() external returns (string memory); function palettes(uint8 paletteIndex, uint256 colorIndex) external view returns (string memory); function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external; function addColorToPalette(uint8 paletteIndex, string calldata color) external; function backgrounds(uint256 index) external view returns (string memory); function backgroundCount() external view returns (uint256); function addManyBackgrounds(string[] calldata backgrounds) external; function addBackground(string calldata background) external; function oneOfOnes(uint256 index) external view returns (bytes memory); function oneOfOnesCount() external view returns (uint256); function addOneOfOne(bytes calldata _oneOfOne) external; function addManyOneOfOnes(bytes[] calldata _oneOfOnes) external; function skins(uint256 index) external view returns (bytes memory); function skinsCount() external view returns (uint256); function addManySkins(bytes[] calldata skins) external; function addSkin(bytes calldata skin) external; function hats(uint256 index) external view returns (bytes memory); function hatsCount() external view returns (uint256); function addManyHats(bytes[] calldata hats) external; function addHat(bytes calldata hat) external; function clothes(uint256 index) external view returns (bytes memory); function clothesCount() external view returns (uint256); function addManyClothes(bytes[] calldata ears) external; function addClothes(bytes calldata ear) external; function mouths(uint256 index) external view returns (bytes memory); function mouthsCount() external view returns (uint256); function addManyMouths(bytes[] calldata mouths) external; function addMouth(bytes calldata mouth) external; function eyes(uint256 index) external view returns (bytes memory); function eyesCount() external view returns (uint256); function addManyEyes(bytes[] calldata eyes) external; function addEyes(bytes calldata eye) external; function accessory(uint256 index) external view returns (bytes memory); function accessoryCount() external view returns (uint256); function addManyAccessories(bytes[] calldata noses) external; function addAccessory(bytes calldata nose) external; function bgItems(uint256 index) external view returns (bytes memory); function bgItemsCount() external view returns (uint256); function addManyBgItems(bytes[] calldata noses) external; function addBgItem(bytes calldata nose) external; function lockParts() external; function toggleDataURIEnabled() external; function setBaseURI(string calldata baseURI) external; function tokenURI(uint256 tokenId, ISeeder.Seed memory seed) external view returns (string memory); function dataURI(uint256 tokenId, ISeeder.Seed memory seed) external view returns (string memory); function genericDataURI( string calldata name, string calldata description, ISeeder.Seed memory seed ) external view returns (string memory); function generateSVGImage(ISeeder.Seed memory seed) external view returns (string memory); }
// SPDX-License-Identifier: GPL-3.0 /// @title Interface for Seeder pragma solidity ^0.8.6; import { IDescriptor } from '../descriptor/IDescriptor.sol'; // "Skin", "Cloth", "Eye", "Mouth", "Acc", "Item", "Hat" interface ISeeder { struct Seed { uint48 background; uint48 skin; uint48 clothes; uint48 eyes; uint48 mouth; uint48 accessory; uint48 bgItem; uint48 hat; bool oneOfOne; uint48 oneOfOneIndex; } function generateSeed(uint256 wizardId, IDescriptor descriptor, bool isOneOfOne, uint48 isOneOfOneIndex) external view returns (Seed memory); }
// SPDX-License-Identifier: GPL-3.0 /// @title A library used to construct ERC721 token URIs and SVG images pragma solidity ^0.8.6; import { Base64 } from 'base64-sol/base64.sol'; import { MultiPartRLEToSVG } from './MultiPartRLEToSVG.sol'; library NFTDescriptor { struct TokenURIParams { string name; string description; bytes[] parts; string background; } /** * @notice Construct an ERC721 token URI. */ function constructTokenURI(TokenURIParams memory params, mapping(uint8 => string[]) storage palettes) public view returns (string memory) { string memory image = generateSVGImage( MultiPartRLEToSVG.SVGParams({ parts: params.parts, background: params.background }), palettes ); // prettier-ignore return string( abi.encodePacked( 'data:application/json;base64,', Base64.encode( bytes( abi.encodePacked('{"name":"', params.name, '", "description":"', params.description, '", "image": "', 'data:image/svg+xml;base64,', image, '"}') ) ) ) ); } /** * @notice Generate an SVG image for use in the ERC721 token URI. */ function generateSVGImage(MultiPartRLEToSVG.SVGParams memory params, mapping(uint8 => string[]) storage palettes) public view returns (string memory svg) { return Base64.encode(bytes(MultiPartRLEToSVG.generateSVG(params, palettes))); } }
// SPDX-License-Identifier: GPL-3.0 /// @title A library used to convert multi-part RLE compressed images to SVG pragma solidity ^0.8.6; library MultiPartRLEToSVG { struct SVGParams { bytes[] parts; string background; } struct ContentBounds { uint8 top; uint8 right; uint8 bottom; uint8 left; } struct Rect { uint8 length; uint8 colorIndex; } struct DecodedImage { uint8 paletteIndex; ContentBounds bounds; Rect[] rects; } /** * @notice Given RLE image parts and color palettes, merge to generate a single SVG image. */ function generateSVG(SVGParams memory params, mapping(uint8 => string[]) storage palettes) internal view returns (string memory svg) { // prettier-ignore return string( abi.encodePacked( '<svg width="190" height="190" viewBox="0 0 190 190" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges">', '<rect width="100%" height="100%" fill="#', params.background, '" />', _generateSVGRects(params, palettes), '</svg>' ) ); } /** * @notice Given RLE image parts and color palettes, generate SVG rects. * This is a lookup table that enables very cheap int to string * conversions when operating on a set of predefined integers. * This is used below to convert the integer length of each rectangle * in a 19x19 pixel grid to the string representation of the length * in a 190x190 pixel grid, which is the chosen dimension for all Wizards. * For example: A length of 3 gets mapped to '30'. */ // prettier-ignore function _generateSVGRects(SVGParams memory params, mapping(uint8 => string[]) storage palettes) private view returns (string memory svg) { string[20] memory lookup = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100', '110', '120', '130', '140', '150', '160', '170', '180', '190' ]; string memory rects; for (uint8 p = 0; p < params.parts.length; p++) { DecodedImage memory image = _decodeRLEImage(params.parts[p]); string[] storage palette = palettes[image.paletteIndex]; uint256 currentX = image.bounds.left; uint256 currentY = image.bounds.top; uint256 cursor; string[16] memory buffer; string memory part; for (uint256 i = 0; i < image.rects.length; i++) { Rect memory rect = image.rects[i]; if (rect.colorIndex != 0) { buffer[cursor] = lookup[rect.length]; // width buffer[cursor + 1] = lookup[currentX]; // x buffer[cursor + 2] = lookup[currentY]; // y buffer[cursor + 3] = palette[rect.colorIndex]; // color cursor += 4; if (cursor >= 16) { part = string(abi.encodePacked(part, _getChunk(cursor, buffer))); cursor = 0; } } currentX += rect.length; if (currentX == image.bounds.right) { currentX = image.bounds.left; currentY++; } } if (cursor != 0) { part = string(abi.encodePacked(part, _getChunk(cursor, buffer))); } rects = string(abi.encodePacked(rects, part)); } return rects; } /** * @notice Return a string that consists of all rects in the provided `buffer`. */ // prettier-ignore function _getChunk(uint256 cursor, string[16] memory buffer) private pure returns (string memory) { string memory chunk; for (uint256 i = 0; i < cursor; i += 4) { chunk = string( abi.encodePacked( chunk, '<rect width="', buffer[i], '" height="10" x="', buffer[i + 1], '" y="', buffer[i + 2], '" fill="#', buffer[i + 3], '" />' ) ); } return chunk; } /** * @notice Decode a single RLE compressed image into a `DecodedImage`. */ function _decodeRLEImage(bytes memory image) private pure returns (DecodedImage memory) { uint8 paletteIndex = uint8(image[0]); ContentBounds memory bounds = ContentBounds({ top: uint8(image[1]), right: uint8(image[2]), bottom: uint8(image[3]), left: uint8(image[4]) }); uint256 cursor; Rect[] memory rects = new Rect[]((image.length - 5) / 2); for (uint256 i = 5; i < image.length; i += 2) { rects[cursor] = Rect({ length: uint8(image[i]), colorIndex: uint8(image[i + 1]) }); cursor++; } return DecodedImage({ paletteIndex: paletteIndex, bounds: bounds, rects: rects }); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/internal/libs/NFTDescriptor.sol": { "NFTDescriptor": "0x6b06f5e119868b3aa688cf7249701ce2a603fa79" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"DataURIToggled","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":[],"name":"PartsLocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accessory","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessoryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_accessory","type":"bytes"}],"name":"addAccessory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_background","type":"string"}],"name":"addBackground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_bgItem","type":"bytes"}],"name":"addBgItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_clothes","type":"bytes"}],"name":"addClothes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_paletteIndex","type":"uint8"},{"internalType":"string","name":"_color","type":"string"}],"name":"addColorToPalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_eyes","type":"bytes"}],"name":"addEyes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_hat","type":"bytes"}],"name":"addHat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_accessory","type":"bytes[]"}],"name":"addManyAccessories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_backgrounds","type":"string[]"}],"name":"addManyBackgrounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_bgItems","type":"bytes[]"}],"name":"addManyBgItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_clothes","type":"bytes[]"}],"name":"addManyClothes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"string[]","name":"newColors","type":"string[]"}],"name":"addManyColorsToPalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_eyes","type":"bytes[]"}],"name":"addManyEyes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_hats","type":"bytes[]"}],"name":"addManyHats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_mouths","type":"bytes[]"}],"name":"addManyMouths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_oneOfOnes","type":"bytes[]"}],"name":"addManyOneOfOnes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_skins","type":"bytes[]"}],"name":"addManySkins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_mouth","type":"bytes"}],"name":"addMouth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_oneOfOne","type":"bytes"}],"name":"addOneOfOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_skin","type":"bytes"}],"name":"addSkin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arePartsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backgroundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"backgrounds","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bgItems","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bgItemsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clothes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clothesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eyes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eyesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"generateSVGImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"genericDataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hats","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDataURIEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOneOfOneCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockParts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mouths","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mouthsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oneOfOnes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneOfOnesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"palettes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"string[]","name":"newColors","type":"string[]"}],"name":"replacePalette","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"skins","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skinsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleDataURIEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint48","name":"background","type":"uint48"},{"internalType":"uint48","name":"skin","type":"uint48"},{"internalType":"uint48","name":"clothes","type":"uint48"},{"internalType":"uint48","name":"eyes","type":"uint48"},{"internalType":"uint48","name":"mouth","type":"uint48"},{"internalType":"uint48","name":"accessory","type":"uint48"},{"internalType":"uint48","name":"bgItem","type":"uint48"},{"internalType":"uint48","name":"hat","type":"uint48"},{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint48","name":"oneOfOneIndex","type":"uint48"}],"internalType":"struct ISeeder.Seed","name":"seed","type":"tuple"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000805460ff60a81b1916600160a81b1790553480156200002457600080fd5b50620000303362000036565b62000086565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613c7280620000966000396000f3fe608060405234801561001057600080fd5b50600436106103625760003560e01c8063839644da116101c8578063c2deb8ec11610104578063e1bf8c51116100a2578063f2fde38b1161007c578063f2fde38b146106ea578063f9da8863146106fd578063fbb4aeff14610710578063fcbc920c1461072357600080fd5b8063e1bf8c51146106b1578063e74ff30f146106c4578063ee50c646146106d757600080fd5b8063ce2f4f53116100de578063ce2f4f531461065d578063dce72c2314610683578063dfe8478b14610696578063e11f49ea1461069e57600080fd5b8063c2deb8ec1461062e578063c48db0db14610641578063c50b7bc81461065457600080fd5b8063a7cde8b311610171578063ba58353d1161014b578063ba58353d146105e2578063bca747b5146105f5578063bcd4de1714610608578063c114543b1461061b57600080fd5b8063a7cde8b3146105b4578063ad1a4c3d146105c7578063b48f35d2146105cf57600080fd5b806390f1d5dc116101a257806390f1d5dc1461057b57806391b7916a1461058e578063a3053dd5146105a157600080fd5b8063839644da1461052d57806383cbdb02146105405780638da5cb5b1461055357600080fd5b806355f804b3116102a257806371aaa66b116102405780638104468c1161021a5780638104468c146104ec578063814146bf146104f457806381d23bd21461050757806381d69f091461051a57600080fd5b806371aaa66b146104a2578063773b9771146104b557806380ebc062146104d957600080fd5b80636b0be8871161027c5780636b0be887146104775780636b4311571461048a5780636c0360eb14610492578063715018a61461049a57600080fd5b806355f804b31461043e578063598fa9da146104515780635e70664c1461046457600080fd5b80632db2ede51161030f5780634531c0a8116102e95780634531c0a8146104135780634daebac21461041b57806350271c161461042357806353632ff11461042b57600080fd5b80632db2ede5146103da57806340a29775146103ed578063440b57d21461040057600080fd5b806317b552ab1161034057806317b552ab146103b75780632a1d0769146103ca5780632c6be7cb146103d257600080fd5b80630475d8631461036757806304bde4dd1461037c5780630de51866146103a5575b600080fd5b61037a610375366004613314565b61072b565b005b61038f61038a36600461348d565b61083f565b60405161039c919061384c565b60405180910390f35b6008545b60405190815260200161039c565b61037a6103c5366004613356565b6108eb565b61037a6109ba565b6005546103a9565b61038f6103e836600461348d565b610ad2565b61038f6103fb3660046134a6565b610ae2565b61037a61040e366004613314565b610b8b565b6003546103a9565b6006546103a9565b600b546103a9565b61037a610439366004613356565b610c95565b61037a61044c366004613356565b610d60565b61038f61045f36600461356d565b610e11565b61037a610472366004613356565b610e49565b61038f61048536600461348d565b610f14565b6007546103a9565b61038f610f24565b61037a610f31565b61037a6104b0366004613356565b610fa4565b6000546104c990600160a01b900460ff1681565b604051901515815260200161039c565b61038f6104e736600461348d565b61106f565b6009546103a9565b61038f6105023660046133fa565b61107f565b61038f6105153660046134a6565b6111f6565b61037a610528366004613314565b611261565b61037a61053b3660046134d4565b611386565b61037a61054e366004613356565b6114d3565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039c565b61038f61058936600461348d565b61159e565b61037a61059c366004613314565b6115ae565b61038f6105af36600461348d565b6116b8565b61037a6105c2366004613314565b6116c8565b6004546103a9565b61037a6105dd366004613314565b6117d2565b61037a6105f0366004613314565b6118dc565b61038f61060336600461348d565b6119e6565b61038f610616366004613470565b6119f6565b61037a610629366004613314565b611b5f565b61038f61063c36600461348d565b611c69565b61037a61064f366004613356565b611c79565b6103a9600c5481565b6000546104c9907501000000000000000000000000000000000000000000900460ff1681565b61037a610691366004613356565b611d44565b61037a611e0f565b61037a6106ac3660046134d4565b611ef9565b61038f6106bf36600461348d565b612026565b61037a6106d2366004613356565b612036565b61037a6106e5366004613314565b61211a565b61037a6106f83660046132de565b612224565b61037a61070b366004613527565b612320565b61037a61071e366004613356565b61241a565b600a546103a9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156107f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a5761082883838381811061081157610811613bde565b90506020028101906108239190613988565b6124e5565b8061083281613b33565b9150506107f4565b505050565b6003818154811061084f57600080fd5b90600052602060002001600091509050805461086a90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461089690613adf565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156109ac5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826124e5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610a7b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6004818154811061084f57600080fd5b60606000610aef84612522565b9050600081604051602001610b049190613709565b60408051601f19818403018152602083019091526000825261010086015190925015610b515782604051602001610b3b91906137ba565b6040516020818303038152906040529050610b74565b82604051602001610b62919061374e565b60405160208183030381529060405290505b610b7f82828761107f565b93505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610c4c5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57610c83838383818110610c6c57610c6c613bde565b9050602002810190610c7e9190613988565b61265c565b80610c8d81613b33565b915050610c4f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610d565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612699565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610dd360018383612fc9565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610e0592919061385f565b60405180910390a15050565b60026020528160005260406000208181548110610e2d57600080fd5b9060005260206000200160009150915050805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610f0a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826126d6565b6007818154811061084f57600080fd5b6001805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610fa26000612713565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156110655760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b6828261265c565b600b818154811061084f57600080fd5b6060600060405180608001604052808681526020018581526020016110a385612788565b81526020016003856000015165ffffffffffff16815481106110c7576110c7613bde565b9060005260206000200180546110dc90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613adf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa7963bf1deae28260026040518363ffffffff1660e01b81526004016111999291906138f5565b60006040518083038186803b1580156111b157600080fd5b505af41580156111c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ed919081019061338c565b95945050505050565b6000546060907501000000000000000000000000000000000000000000900460ff161561122e576112278383610ae2565b9050610b85565b600161123984612522565b60405160200161124a929190613634565b604051602081830303815290604052905092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156113225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b81819050600c60008282546113379190613a70565b90915550600090505b8181101561083a5761137483838381811061135d5761135d613bde565b905060200281019061136f9190613988565b612e6f565b8061137e81613b33565b915050611340565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff83166000908152600260205260409020546101009061140f908390613a70565b11156114835760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60005b818110156114cd576114bb848484848181106114a4576114a4613bde565b90506020028101906114b69190613988565b612eac565b806114c581613b33565b915050611486565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461153a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156115945760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612ed9565b6008818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146116155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561166f5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576116a683838381811061168f5761168f613bde565b90506020028101906116a19190613988565b6126d6565b806116b081613b33565b915050611672565b6009818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461172f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156117895760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576117c08383838181106117a9576117a9613bde565b90506020028101906117bb9190613988565b612ed9565b806117ca81613b33565b91505061178c565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156118935760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576118ca8383838181106118b3576118b3613bde565b90506020028101906118c59190613988565b612f16565b806118d481613b33565b915050611896565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561199d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576119d48383838181106119bd576119bd613bde565b90506020028101906119cf9190613988565b612f53565b806119de81613b33565b9150506119a0565b600a818154811061084f57600080fd5b606060006040518060400160405280611a0e85612788565b81526020016003856000015165ffffffffffff1681548110611a3257611a32613bde565b906000526020600020018054611a4790613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7390613adf565b8015611ac05780601f10611a9557610100808354040283529160200191611ac0565b820191906000526020600020905b815481529060010190602001808311611aa357829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa796366b8c2418260026040518363ffffffff1660e01b8152600401611b0492919061388e565b60006040518083038186803b158015611b1c57600080fd5b505af4158015611b30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b58919081019061338c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611c205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57611c57838383818110611c4057611c40613bde565b9050602002810190611c529190613988565b612f90565b80611c6181613b33565b915050611c23565b6006818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611d3a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f53565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611e055760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610100811115611fd85760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60ff83166000908152600260205260408120611ff39161306b565b60005b818110156114cd57612014848484848181106114a4576114a4613bde565b8061201e81613b33565b915050611ff6565b6005818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461209d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156120f75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6001600c600082825461210a9190613a70565b909155506109b690508282612e6f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156121db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576122128383838181106121fb576121fb613bde565b905060200281019061220d9190613988565b612699565b8061221c81613b33565b9150506121de565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b73ffffffffffffffffffffffffffffffffffffffff81166123145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161078e565b61231d81612713565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff838116600090815260026020526040902054111561240f5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b61083a838383612eac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156124db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f90565b6006805460018101825560009190915261083a907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018383612fc9565b60608161256257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561258c578061257681613b33565b91506125859050600a83613a88565b9150612566565b60008167ffffffffffffffff8111156125a7576125a7613c0d565b6040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b5090505b8415612654576125e6600183613a9c565b91506125f3600a86613b6c565b6125fe906030613a70565b60f81b81838151811061261357612613613bde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061264d600a86613a88565b94506125d5565b949350505050565b6008805460018101825560009190915261083a907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018383612fc9565b6004805460018101825560009190915261083a907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018383612fc9565b6003805460018101825560009190915261083a907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018383612fc9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161010001511561289a57604080516001808252818301909252600091816020015b60608152602001906001900390816127ac579050509050600b83610120015165ffffffffffff16815481106127e3576127e3613bde565b9060005260206000200180546127f890613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613adf565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b50505050508160008151811061288957612889613bde565b602090810291909101015292915050565b6040805160078082526101008201909252600091816020015b60608152602001906001900390816128b35790505090506004836020015165ffffffffffff16815481106128e9576128e9613bde565b9060005260206000200180546128fe90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461292a90613adf565b80156129775780601f1061294c57610100808354040283529160200191612977565b820191906000526020600020905b81548152906001019060200180831161295a57829003601f168201915b50505050508160008151811061298f5761298f613bde565b60200260200101819052506005836040015165ffffffffffff16815481106129b9576129b9613bde565b9060005260206000200180546129ce90613adf565b80601f01602080910402602001604051908101604052809291908181526020018280546129fa90613adf565b8015612a475780601f10612a1c57610100808354040283529160200191612a47565b820191906000526020600020905b815481529060010190602001808311612a2a57829003601f168201915b505050505081600181518110612a5f57612a5f613bde565b60200260200101819052506009836060015165ffffffffffff1681548110612a8957612a89613bde565b906000526020600020018054612a9e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612aca90613adf565b8015612b175780601f10612aec57610100808354040283529160200191612b17565b820191906000526020600020905b815481529060010190602001808311612afa57829003601f168201915b505050505081600281518110612b2f57612b2f613bde565b60200260200101819052506008836080015165ffffffffffff1681548110612b5957612b59613bde565b906000526020600020018054612b6e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9a90613adf565b8015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b505050505081600381518110612bff57612bff613bde565b602002602001018190525060068360a0015165ffffffffffff1681548110612c2957612c29613bde565b906000526020600020018054612c3e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90613adf565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b505050505081600481518110612ccf57612ccf613bde565b602002602001018190525060078360c0015165ffffffffffff1681548110612cf957612cf9613bde565b906000526020600020018054612d0e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90613adf565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081600581518110612d9f57612d9f613bde565b6020026020010181905250600a8360e0015165ffffffffffff1681548110612dc957612dc9613bde565b906000526020600020018054612dde90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0a90613adf565b8015612e575780601f10612e2c57610100808354040283529160200191612e57565b820191906000526020600020905b815481529060010190602001808311612e3a57829003601f168201915b50505050508160068151811061288957612889613bde565b600b805460018101825560009190915261083a907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018383612fc9565b60ff831660009081526002602090815260408220805460018101825590835291206114cd91018383612fc9565b600a805460018101825560009190915261083a907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018383612fc9565b6009805460018101825560009190915261083a907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018383612fc9565b6007805460018101825560009190915261083a907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018383612fc9565b6005805460018101825560009190915261083a907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183835b828054612fd590613adf565b90600052602060002090601f016020900481019282612ff7576000855561305b565b82601f1061302e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561305b565b8280016001018555821561305b579182015b8281111561305b578235825591602001919060010190613040565b50613067929150613089565b5090565b508054600082559060005260206000209081019061231d919061309e565b5b80821115613067576000815560010161308a565b808211156130675760006130b282826130bb565b5060010161309e565b5080546130c790613adf565b6000825580601f106130d7575050565b601f01602090049060005260206000209081019061231d9190613089565b60008083601f84011261310757600080fd5b50813567ffffffffffffffff81111561311f57600080fd5b6020830191508360208260051b850101111561313a57600080fd5b9250929050565b8035801515811461315157600080fd5b919050565b60008083601f84011261316857600080fd5b50813567ffffffffffffffff81111561318057600080fd5b60208301915083602082850101111561313a57600080fd5b600082601f8301126131a957600080fd5b81356131bc6131b782613a48565b613a17565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b6000610140828403121561320157600080fd5b6132096139ed565b9050613214826132b7565b8152613222602083016132b7565b6020820152613233604083016132b7565b6040820152613244606083016132b7565b6060820152613255608083016132b7565b608082015261326660a083016132b7565b60a082015261327760c083016132b7565b60c082015261328860e083016132b7565b60e082015261010061329b818401613141565b908201526101206132ad8382016132b7565b9082015292915050565b803565ffffffffffff8116811461315157600080fd5b803560ff8116811461315157600080fd5b6000602082840312156132f057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611b5857600080fd5b6000806020838503121561332757600080fd5b823567ffffffffffffffff81111561333e57600080fd5b61334a858286016130f5565b90969095509350505050565b6000806020838503121561336957600080fd5b823567ffffffffffffffff81111561338057600080fd5b61334a85828601613156565b60006020828403121561339e57600080fd5b815167ffffffffffffffff8111156133b557600080fd5b8201601f810184136133c657600080fd5b80516133d46131b782613a48565b8181528560208385010111156133e957600080fd5b6111ed826020830160208601613ab3565b6000806000610180848603121561341057600080fd5b833567ffffffffffffffff8082111561342857600080fd5b61343487838801613198565b9450602086013591508082111561344a57600080fd5b5061345786828701613198565b92505061346785604086016131ee565b90509250925092565b6000610140828403121561348357600080fd5b611b5883836131ee565b60006020828403121561349f57600080fd5b5035919050565b60008061016083850312156134ba57600080fd5b823591506134cb84602085016131ee565b90509250929050565b6000806000604084860312156134e957600080fd5b6134f2846132cd565b9250602084013567ffffffffffffffff81111561350e57600080fd5b61351a868287016130f5565b9497909650939450505050565b60008060006040848603121561353c57600080fd5b613545846132cd565b9250602084013567ffffffffffffffff81111561356157600080fd5b61351a86828701613156565b6000806040838503121561358057600080fd5b613589836132cd565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b858110156135df5782840389526135cd8483516135ec565b988501989350908401906001016135b5565b5091979650505050505050565b60008151808452613604816020860160208601613ab3565b601f01601f19169290920160200192915050565b6000815161362a818560208601613ab3565b9290920192915050565b600080845481600182811c91508083168061365057607f831692505b6020808410821415613689577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561369d57600181146136cc576136f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136f9565b60008b81526020902060005b868110156136f15781548b8201529085019083016136d8565b505084890196505b5050505050506111ed8185613618565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613741816008850160208701613ab3565b9190910160080192915050565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613786816008850160208701613ab3565b7f2069732061206d656d626572206f66207468652057697a6172647344414f00006008939091019283015250602601919050565b7f57697a61726420230000000000000000000000000000000000000000000000008152600082516137f2816008850160208701613ab3565b7f2069732061206f6e65206f66206f6e6520617274706965636520616e6420612060089390910192830152507f6d656d626572206f66207468652057697a6172647344414f00000000000000006028820152604001919050565b602081526000611b5860208301846135ec565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60408152600083516040808401526138a96080840182613597565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526138e482826135ec565b925050508260208301529392505050565b60408152600083516080604084015261391160c08401826135ec565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261394d83836135ec565b9250604087015191508085840301608086015261396a8383613597565b925060608701519150808584030160a0860152506138e482826135ec565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b83018035915067ffffffffffffffff8211156139d857600080fd5b60200191503681900382131561313a57600080fd5b604051610140810167ffffffffffffffff81118282101715613a1157613a11613c0d565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a4057613a40613c0d565b604052919050565b600067ffffffffffffffff821115613a6257613a62613c0d565b50601f01601f191660200190565b60008219821115613a8357613a83613b80565b500190565b600082613a9757613a97613baf565b500490565b600082821015613aae57613aae613b80565b500390565b60005b83811015613ace578181015183820152602001613ab6565b838111156114cd5750506000910152565b600181811c90821680613af357607f821691505b60208210811415613b2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6557613b65613b80565b5060010190565b600082613b7b57613b7b613baf565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212208992b25cc03dfcf217e26c4d12ba849070abcc9891c410230e2222df144bdf0464736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103625760003560e01c8063839644da116101c8578063c2deb8ec11610104578063e1bf8c51116100a2578063f2fde38b1161007c578063f2fde38b146106ea578063f9da8863146106fd578063fbb4aeff14610710578063fcbc920c1461072357600080fd5b8063e1bf8c51146106b1578063e74ff30f146106c4578063ee50c646146106d757600080fd5b8063ce2f4f53116100de578063ce2f4f531461065d578063dce72c2314610683578063dfe8478b14610696578063e11f49ea1461069e57600080fd5b8063c2deb8ec1461062e578063c48db0db14610641578063c50b7bc81461065457600080fd5b8063a7cde8b311610171578063ba58353d1161014b578063ba58353d146105e2578063bca747b5146105f5578063bcd4de1714610608578063c114543b1461061b57600080fd5b8063a7cde8b3146105b4578063ad1a4c3d146105c7578063b48f35d2146105cf57600080fd5b806390f1d5dc116101a257806390f1d5dc1461057b57806391b7916a1461058e578063a3053dd5146105a157600080fd5b8063839644da1461052d57806383cbdb02146105405780638da5cb5b1461055357600080fd5b806355f804b3116102a257806371aaa66b116102405780638104468c1161021a5780638104468c146104ec578063814146bf146104f457806381d23bd21461050757806381d69f091461051a57600080fd5b806371aaa66b146104a2578063773b9771146104b557806380ebc062146104d957600080fd5b80636b0be8871161027c5780636b0be887146104775780636b4311571461048a5780636c0360eb14610492578063715018a61461049a57600080fd5b806355f804b31461043e578063598fa9da146104515780635e70664c1461046457600080fd5b80632db2ede51161030f5780634531c0a8116102e95780634531c0a8146104135780634daebac21461041b57806350271c161461042357806353632ff11461042b57600080fd5b80632db2ede5146103da57806340a29775146103ed578063440b57d21461040057600080fd5b806317b552ab1161034057806317b552ab146103b75780632a1d0769146103ca5780632c6be7cb146103d257600080fd5b80630475d8631461036757806304bde4dd1461037c5780630de51866146103a5575b600080fd5b61037a610375366004613314565b61072b565b005b61038f61038a36600461348d565b61083f565b60405161039c919061384c565b60405180910390f35b6008545b60405190815260200161039c565b61037a6103c5366004613356565b6108eb565b61037a6109ba565b6005546103a9565b61038f6103e836600461348d565b610ad2565b61038f6103fb3660046134a6565b610ae2565b61037a61040e366004613314565b610b8b565b6003546103a9565b6006546103a9565b600b546103a9565b61037a610439366004613356565b610c95565b61037a61044c366004613356565b610d60565b61038f61045f36600461356d565b610e11565b61037a610472366004613356565b610e49565b61038f61048536600461348d565b610f14565b6007546103a9565b61038f610f24565b61037a610f31565b61037a6104b0366004613356565b610fa4565b6000546104c990600160a01b900460ff1681565b604051901515815260200161039c565b61038f6104e736600461348d565b61106f565b6009546103a9565b61038f6105023660046133fa565b61107f565b61038f6105153660046134a6565b6111f6565b61037a610528366004613314565b611261565b61037a61053b3660046134d4565b611386565b61037a61054e366004613356565b6114d3565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039c565b61038f61058936600461348d565b61159e565b61037a61059c366004613314565b6115ae565b61038f6105af36600461348d565b6116b8565b61037a6105c2366004613314565b6116c8565b6004546103a9565b61037a6105dd366004613314565b6117d2565b61037a6105f0366004613314565b6118dc565b61038f61060336600461348d565b6119e6565b61038f610616366004613470565b6119f6565b61037a610629366004613314565b611b5f565b61038f61063c36600461348d565b611c69565b61037a61064f366004613356565b611c79565b6103a9600c5481565b6000546104c9907501000000000000000000000000000000000000000000900460ff1681565b61037a610691366004613356565b611d44565b61037a611e0f565b61037a6106ac3660046134d4565b611ef9565b61038f6106bf36600461348d565b612026565b61037a6106d2366004613356565b612036565b61037a6106e5366004613314565b61211a565b61037a6106f83660046132de565b612224565b61037a61070b366004613527565b612320565b61037a61071e366004613356565b61241a565b600a546103a9565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600054600160a01b900460ff16156107f15760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a5761082883838381811061081157610811613bde565b90506020028101906108239190613988565b6124e5565b8061083281613b33565b9150506107f4565b505050565b6003818154811061084f57600080fd5b90600052602060002001600091509050805461086a90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461089690613adf565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156109ac5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826124e5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610a7b5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1781556040517f1680ee6d421f70ed6030d2fc4fcb50217a5dd617858d56562b119eca59172e579190a1565b6004818154811061084f57600080fd5b60606000610aef84612522565b9050600081604051602001610b049190613709565b60408051601f19818403018152602083019091526000825261010086015190925015610b515782604051602001610b3b91906137ba565b6040516020818303038152906040529050610b74565b82604051602001610b62919061374e565b60405160208183030381529060405290505b610b7f82828761107f565b93505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610c4c5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57610c83838383818110610c6c57610c6c613bde565b9050602002810190610c7e9190613988565b61265c565b80610c8d81613b33565b915050610c4f565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610d565760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612699565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610dd360018383612fc9565b507f6741b2fc379fad678116fe3d4d4b9a1a184ab53ba36b86ad0fa66340b1ab41ad8282604051610e0592919061385f565b60405180910390a15050565b60026020528160005260406000208181548110610e2d57600080fd5b9060005260206000200160009150915050805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610eb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615610f0a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b682826126d6565b6007818154811061084f57600080fd5b6001805461086a90613adf565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610fa26000612713565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461100b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156110655760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b6828261265c565b600b818154811061084f57600080fd5b6060600060405180608001604052808681526020018581526020016110a385612788565b81526020016003856000015165ffffffffffff16815481106110c7576110c7613bde565b9060005260206000200180546110dc90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461110890613adf565b80156111555780601f1061112a57610100808354040283529160200191611155565b820191906000526020600020905b81548152906001019060200180831161113857829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa7963bf1deae28260026040518363ffffffff1660e01b81526004016111999291906138f5565b60006040518083038186803b1580156111b157600080fd5b505af41580156111c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ed919081019061338c565b95945050505050565b6000546060907501000000000000000000000000000000000000000000900460ff161561122e576112278383610ae2565b9050610b85565b600161123984612522565b60405160200161124a929190613634565b604051602081830303815290604052905092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156113225760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b81819050600c60008282546113379190613a70565b90915550600090505b8181101561083a5761137483838381811061135d5761135d613bde565b905060200281019061136f9190613988565b612e6f565b8061137e81613b33565b915050611340565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff83166000908152600260205260409020546101009061140f908390613a70565b11156114835760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60005b818110156114cd576114bb848484848181106114a4576114a4613bde565b90506020028101906114b69190613988565b612eac565b806114c581613b33565b915050611486565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461153a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156115945760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612ed9565b6008818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff1633146116155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561166f5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576116a683838381811061168f5761168f613bde565b90506020028101906116a19190613988565b6126d6565b806116b081613b33565b915050611672565b6009818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461172f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156117895760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576117c08383838181106117a9576117a9613bde565b90506020028101906117bb9190613988565b612ed9565b806117ca81613b33565b91505061178c565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156118935760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576118ca8383838181106118b3576118b3613bde565b90506020028101906118c59190613988565b612f16565b806118d481613b33565b915050611896565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff161561199d5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576119d48383838181106119bd576119bd613bde565b90506020028101906119cf9190613988565b612f53565b806119de81613b33565b9150506119a0565b600a818154811061084f57600080fd5b606060006040518060400160405280611a0e85612788565b81526020016003856000015165ffffffffffff1681548110611a3257611a32613bde565b906000526020600020018054611a4790613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7390613adf565b8015611ac05780601f10611a9557610100808354040283529160200191611ac0565b820191906000526020600020905b815481529060010190602001808311611aa357829003601f168201915b50505050508152509050736b06f5e119868b3aa688cf7249701ce2a603fa796366b8c2418260026040518363ffffffff1660e01b8152600401611b0492919061388e565b60006040518083038186803b158015611b1c57600080fd5b505af4158015611b30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b58919081019061338c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bc65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611c205760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a57611c57838383818110611c4057611c40613bde565b9050602002810190611c529190613988565b612f90565b80611c6181613b33565b915050611c23565b6006818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611d3a5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f53565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff1615611e055760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff811675010000000000000000000000000000000000000000009182900460ff1615918202179091556040518181527f360c3d72ee193226275b842f85231c259c934e85459fed80fa68e502ffa9dbde9060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b610100811115611fd85760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b60ff83166000908152600260205260408120611ff39161306b565b60005b818110156114cd57612014848484848181106114a4576114a4613bde565b8061201e81613b33565b915050611ff6565b6005818154811061084f57600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461209d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156120f75760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6001600c600082825461210a9190613a70565b909155506109b690508282612e6f565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156121db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b60005b8181101561083a576122128383838181106121fb576121fb613bde565b905060200281019061220d9190613988565b612699565b8061221c81613b33565b9150506121de565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b73ffffffffffffffffffffffffffffffffffffffff81166123145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161078e565b61231d81612713565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146123875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b60ff838116600090815260026020526040902054111561240f5760405162461bcd60e51b815260206004820152602160248201527f50616c65747465732063616e206f6e6c7920686f6c642032353620636f6c6f7260448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161078e565b61083a838383612eac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078e565b600054600160a01b900460ff16156124db5760405162461bcd60e51b815260206004820152601060248201527f506172747320617265206c6f636b656400000000000000000000000000000000604482015260640161078e565b6109b68282612f90565b6006805460018101825560009190915261083a907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018383612fc9565b60608161256257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561258c578061257681613b33565b91506125859050600a83613a88565b9150612566565b60008167ffffffffffffffff8111156125a7576125a7613c0d565b6040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b5090505b8415612654576125e6600183613a9c565b91506125f3600a86613b6c565b6125fe906030613a70565b60f81b81838151811061261357612613613bde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061264d600a86613a88565b94506125d5565b949350505050565b6008805460018101825560009190915261083a907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018383612fc9565b6004805460018101825560009190915261083a907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018383612fc9565b6003805460018101825560009190915261083a907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018383612fc9565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161010001511561289a57604080516001808252818301909252600091816020015b60608152602001906001900390816127ac579050509050600b83610120015165ffffffffffff16815481106127e3576127e3613bde565b9060005260206000200180546127f890613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613adf565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b50505050508160008151811061288957612889613bde565b602090810291909101015292915050565b6040805160078082526101008201909252600091816020015b60608152602001906001900390816128b35790505090506004836020015165ffffffffffff16815481106128e9576128e9613bde565b9060005260206000200180546128fe90613adf565b80601f016020809104026020016040519081016040528092919081815260200182805461292a90613adf565b80156129775780601f1061294c57610100808354040283529160200191612977565b820191906000526020600020905b81548152906001019060200180831161295a57829003601f168201915b50505050508160008151811061298f5761298f613bde565b60200260200101819052506005836040015165ffffffffffff16815481106129b9576129b9613bde565b9060005260206000200180546129ce90613adf565b80601f01602080910402602001604051908101604052809291908181526020018280546129fa90613adf565b8015612a475780601f10612a1c57610100808354040283529160200191612a47565b820191906000526020600020905b815481529060010190602001808311612a2a57829003601f168201915b505050505081600181518110612a5f57612a5f613bde565b60200260200101819052506009836060015165ffffffffffff1681548110612a8957612a89613bde565b906000526020600020018054612a9e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612aca90613adf565b8015612b175780601f10612aec57610100808354040283529160200191612b17565b820191906000526020600020905b815481529060010190602001808311612afa57829003601f168201915b505050505081600281518110612b2f57612b2f613bde565b60200260200101819052506008836080015165ffffffffffff1681548110612b5957612b59613bde565b906000526020600020018054612b6e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9a90613adf565b8015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b505050505081600381518110612bff57612bff613bde565b602002602001018190525060068360a0015165ffffffffffff1681548110612c2957612c29613bde565b906000526020600020018054612c3e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90613adf565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b505050505081600481518110612ccf57612ccf613bde565b602002602001018190525060078360c0015165ffffffffffff1681548110612cf957612cf9613bde565b906000526020600020018054612d0e90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90613adf565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081600581518110612d9f57612d9f613bde565b6020026020010181905250600a8360e0015165ffffffffffff1681548110612dc957612dc9613bde565b906000526020600020018054612dde90613adf565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0a90613adf565b8015612e575780601f10612e2c57610100808354040283529160200191612e57565b820191906000526020600020905b815481529060010190602001808311612e3a57829003601f168201915b50505050508160068151811061288957612889613bde565b600b805460018101825560009190915261083a907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018383612fc9565b60ff831660009081526002602090815260408220805460018101825590835291206114cd91018383612fc9565b600a805460018101825560009190915261083a907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018383612fc9565b6009805460018101825560009190915261083a907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af018383612fc9565b6007805460018101825560009190915261083a907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018383612fc9565b6005805460018101825560009190915261083a907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00183835b828054612fd590613adf565b90600052602060002090601f016020900481019282612ff7576000855561305b565b82601f1061302e578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561305b565b8280016001018555821561305b579182015b8281111561305b578235825591602001919060010190613040565b50613067929150613089565b5090565b508054600082559060005260206000209081019061231d919061309e565b5b80821115613067576000815560010161308a565b808211156130675760006130b282826130bb565b5060010161309e565b5080546130c790613adf565b6000825580601f106130d7575050565b601f01602090049060005260206000209081019061231d9190613089565b60008083601f84011261310757600080fd5b50813567ffffffffffffffff81111561311f57600080fd5b6020830191508360208260051b850101111561313a57600080fd5b9250929050565b8035801515811461315157600080fd5b919050565b60008083601f84011261316857600080fd5b50813567ffffffffffffffff81111561318057600080fd5b60208301915083602082850101111561313a57600080fd5b600082601f8301126131a957600080fd5b81356131bc6131b782613a48565b613a17565b8181528460208386010111156131d157600080fd5b816020850160208301376000918101602001919091529392505050565b6000610140828403121561320157600080fd5b6132096139ed565b9050613214826132b7565b8152613222602083016132b7565b6020820152613233604083016132b7565b6040820152613244606083016132b7565b6060820152613255608083016132b7565b608082015261326660a083016132b7565b60a082015261327760c083016132b7565b60c082015261328860e083016132b7565b60e082015261010061329b818401613141565b908201526101206132ad8382016132b7565b9082015292915050565b803565ffffffffffff8116811461315157600080fd5b803560ff8116811461315157600080fd5b6000602082840312156132f057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611b5857600080fd5b6000806020838503121561332757600080fd5b823567ffffffffffffffff81111561333e57600080fd5b61334a858286016130f5565b90969095509350505050565b6000806020838503121561336957600080fd5b823567ffffffffffffffff81111561338057600080fd5b61334a85828601613156565b60006020828403121561339e57600080fd5b815167ffffffffffffffff8111156133b557600080fd5b8201601f810184136133c657600080fd5b80516133d46131b782613a48565b8181528560208385010111156133e957600080fd5b6111ed826020830160208601613ab3565b6000806000610180848603121561341057600080fd5b833567ffffffffffffffff8082111561342857600080fd5b61343487838801613198565b9450602086013591508082111561344a57600080fd5b5061345786828701613198565b92505061346785604086016131ee565b90509250925092565b6000610140828403121561348357600080fd5b611b5883836131ee565b60006020828403121561349f57600080fd5b5035919050565b60008061016083850312156134ba57600080fd5b823591506134cb84602085016131ee565b90509250929050565b6000806000604084860312156134e957600080fd5b6134f2846132cd565b9250602084013567ffffffffffffffff81111561350e57600080fd5b61351a868287016130f5565b9497909650939450505050565b60008060006040848603121561353c57600080fd5b613545846132cd565b9250602084013567ffffffffffffffff81111561356157600080fd5b61351a86828701613156565b6000806040838503121561358057600080fd5b613589836132cd565b946020939093013593505050565b600081518084526020808501808196508360051b8101915082860160005b858110156135df5782840389526135cd8483516135ec565b988501989350908401906001016135b5565b5091979650505050505050565b60008151808452613604816020860160208601613ab3565b601f01601f19169290920160200192915050565b6000815161362a818560208601613ab3565b9290920192915050565b600080845481600182811c91508083168061365057607f831692505b6020808410821415613689577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561369d57600181146136cc576136f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616895284890196506136f9565b60008b81526020902060005b868110156136f15781548b8201529085019083016136d8565b505084890196505b5050505050506111ed8185613618565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613741816008850160208701613ab3565b9190910160080192915050565b7f57697a6172642023000000000000000000000000000000000000000000000000815260008251613786816008850160208701613ab3565b7f2069732061206d656d626572206f66207468652057697a6172647344414f00006008939091019283015250602601919050565b7f57697a61726420230000000000000000000000000000000000000000000000008152600082516137f2816008850160208701613ab3565b7f2069732061206f6e65206f66206f6e6520617274706965636520616e6420612060089390910192830152507f6d656d626572206f66207468652057697a6172647344414f00000000000000006028820152604001919050565b602081526000611b5860208301846135ec565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60408152600083516040808401526138a96080840182613597565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526138e482826135ec565b925050508260208301529392505050565b60408152600083516080604084015261391160c08401826135ec565b905060208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08085840301606086015261394d83836135ec565b9250604087015191508085840301608086015261396a8383613597565b925060608701519150808584030160a0860152506138e482826135ec565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126139bd57600080fd5b83018035915067ffffffffffffffff8211156139d857600080fd5b60200191503681900382131561313a57600080fd5b604051610140810167ffffffffffffffff81118282101715613a1157613a11613c0d565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a4057613a40613c0d565b604052919050565b600067ffffffffffffffff821115613a6257613a62613c0d565b50601f01601f191660200190565b60008219821115613a8357613a83613b80565b500190565b600082613a9757613a97613baf565b500490565b600082821015613aae57613aae613b80565b500390565b60005b83811015613ace578181015183820152602001613ab6565b838111156114cd5750506000910152565b600181811c90821680613af357607f821691505b60208210811415613b2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6557613b65613b80565b5060010190565b600082613b7b57613b7b613baf565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212208992b25cc03dfcf217e26c4d12ba849070abcc9891c410230e2222df144bdf0464736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.