ETH Price: $3,331.12 (-4.36%)
Gas: 3 Gwei

Token

CosmoBugs (COSBUG)
 

Overview

Max Total Supply

419 COSBUG

Holders

44

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
cashnews.eth
Balance
2 COSBUG
0xd518ce89c232cdc4ff302c0f56ed3dc4ceba6611
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CosmoBugs

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 9 : CosmoBugs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;

import "./utils/Ownable.sol";
import "./CosmoBugsERC721.sol";

interface IERC20BurnTransfer {
    function burn(uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface ICosmoBugs {
    function isMintedBeforeReveal(uint256 index) external view returns (bool);
}


contract OwnableDelegateProxy {}
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}


// https://eips.ethereum.org/EIPS/eip-721 tokenURI
/**
 * @title CosmoBugs contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract CosmoBugs is Ownable, CosmoBugsERC721, ICosmoBugs {
    using SafeMath for uint256;

    // This is the provenance record of all CosmoBugs artwork in existence
    uint256 public constant COSMO_PRICE = 1_000_000_000_000e18;
    uint256 public constant CMP_PRICE = 5_000e18;
    uint256 public constant NAME_CHANGE_PRICE = 1_830e18;
    
    uint256 public constant SECONDS_IN_A_DAY = 86400;
    uint256 public constant MAX_SUPPLY = 16410;
    string  public constant PROVENANCE = "0a03c03e36aa3757228e9d185f794f25953c643110c8bb3eb5ef892d062b07ab";
    uint256 public constant SALE_START_TIMESTAMP = 1623682800; // "2021-06-14T15:00:00.000Z"
    // Time after which CosmoBugs are randomized and allotted
    uint256 public constant REVEAL_TIMESTAMP = 1624892400; // "2021-06-28T15:00:00.000Z"

    uint256 public startingIndexBlock;
    uint256 public startingIndex;

    // tokens
    address public nftPower;
    address public constant tokenCosmo = 0x27cd7375478F189bdcF55616b088BE03d9c4339c;
    address public constant tokenCmp = 0xB9FDc13F7f747bAEdCc356e9Da13Ab883fFa719B;

    address public proxyRegistryAddress;
    string private _contractURI;

    // Mapping from token ID to name
    mapping(uint256 => string) private _tokenName;
    // Mapping if certain name string has already been reserved
    mapping(string => bool) private _nameReserved;
    // Mapping from token ID to whether the CosmoMask was minted before reveal
    mapping(uint256 => bool) private _mintedBeforeReveal;

    event NameChange(uint256 indexed tokenId, string newName);
    event SetStartingIndexBlock(uint256 startingIndexBlock);
    event SetStartingIndex(uint256 startingIndex);


    constructor(address _nftPowerAddress, address _proxyRegistryAddress) public CosmoBugsERC721("CosmoBugs", "COSBUG") {
        nftPower = _nftPowerAddress;
        proxyRegistryAddress = _proxyRegistryAddress;
        _setURL("https://cosmobugs.com/");
        _setBaseURI("https://cosmobugs.com/metadata/");
        _contractURI = "https://cosmobugs.com/metadata/contract.json";
    }


    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    /**
     * @dev Returns name of the CosmoMask at index.
     */
    function tokenNameByIndex(uint256 index) public view returns (string memory) {
        return _tokenName[index];
    }

    /**
     * @dev Returns if the name has been reserved.
     */
    function isNameReserved(string memory nameString) public view returns (bool) {
        return _nameReserved[toLower(nameString)];
    }

    /**
     * @dev Returns if the CosmoMask has been minted before reveal phase
     */
    function isMintedBeforeReveal(uint256 index) public view override returns (bool) {
        return _mintedBeforeReveal[index];
    }

    /**
     * @dev Gets current CosmoMask Price
     */
    function getPrice() public view returns (uint256) {
        require(block.timestamp >= SALE_START_TIMESTAMP, "CosmoBugs: sale has not started");
        require(totalSupply() < MAX_SUPPLY, "CosmoBugs: sale has already ended");

        uint256 currentSupply = totalSupply();

        if (currentSupply >= 16409) {
            return 2_000_000e18;
        } else if (currentSupply >= 16407) {
            return 200_000e18;
        } else if (currentSupply >= 16400) {
            return 20_000e18;
        } else if (currentSupply >= 16381) {
            return 2_000e18;
        } else if (currentSupply >= 16000) {
            return 200e18;
        } else if (currentSupply >= 15000) {
            return 34e18;
        } else if (currentSupply >= 11000) {
            return 18e18;
        } else if (currentSupply >= 7000) {
            return 10e18;
        } else if (currentSupply >= 3000) {
            return 6e18;
        } else {
            return 2e18;
        }
    }

    /**
    * @dev Mints CosmoBugs
    */
    function mint(uint256 numberOfMasks) public payable {
        require(totalSupply() < MAX_SUPPLY, "CosmoBugs: sale has already ended");
        require(numberOfMasks > 0, "CosmoBugs: numberOfMasks cannot be 0");
        require(numberOfMasks <= 20, "CosmoBugs: You may not buy more than 20 CosmoBugs at once");
        require(totalSupply().add(numberOfMasks) <= MAX_SUPPLY, "CosmoBugs: Exceeds MAX_SUPPLY");
        require(getPrice().mul(numberOfMasks) == msg.value, "CosmoBugs: Ether value sent is not correct");

        for (uint256 i = 0; i < numberOfMasks; i++) {
            uint256 mintIndex = totalSupply();
            if (block.timestamp < REVEAL_TIMESTAMP) {
                _mintedBeforeReveal[mintIndex] = true;
            }
            _safeMint(msg.sender, mintIndex);
        }

        if (startingIndex == 0 && (totalSupply() == MAX_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            _setStartingIndex();
        }
    }

    function mintByCosmo(uint256 numberOfMasks) public {
        require(totalSupply() < MAX_SUPPLY, "CosmoBugs: sale has already ended");
        require(numberOfMasks > 0, "CosmoBugs: numberOfMasks cannot be 0");
        require(numberOfMasks <= 20, "CosmoBugs: You may not buy more than 20 CosmoBugs at once");
        require(totalSupply().add(numberOfMasks) <= (MAX_SUPPLY - 10), "CosmoBugs: The last 10 masks can only be purchased for ETH");

        uint256 purchaseAmount = COSMO_PRICE.mul(numberOfMasks);
        require(
            IERC20BurnTransfer(tokenCosmo).transferFrom(msg.sender, address(this), purchaseAmount),
            "CosmoBugs: Transfer COSMO amount exceeds allowance"
        );

        for (uint256 i = 0; i < numberOfMasks; i++) {
            uint256 mintIndex = totalSupply();
            if (block.timestamp < REVEAL_TIMESTAMP) {
                _mintedBeforeReveal[mintIndex] = true;
            }
            _safeMint(msg.sender, mintIndex);
        }

        if (startingIndex == 0 && (totalSupply() == MAX_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            _setStartingIndex();
        }

        IERC20BurnTransfer(tokenCosmo).burn(purchaseAmount);
    }

    function mintByCmp(uint256 numberOfMasks) public {
        require(totalSupply() < MAX_SUPPLY, "CosmoBugs: sale has already ended");
        require(numberOfMasks > 0, "CosmoBugs: numberOfMasks cannot be 0");
        require(numberOfMasks <= 20, "CosmoBugs: You may not buy more than 20 CosmoBugs at once");
        require(totalSupply().add(numberOfMasks) <= (MAX_SUPPLY - 10), "CosmoBugs: The last 10 masks can only be purchased for ETH");

        uint256 purchaseAmount = CMP_PRICE.mul(numberOfMasks);
        require(
            IERC20BurnTransfer(tokenCmp).transferFrom(msg.sender, address(this), purchaseAmount),
            "CosmoBugs: Transfer CMP amount exceeds allowance"
        );

        for (uint256 i = 0; i < numberOfMasks; i++) {
            uint256 mintIndex = totalSupply();
            if (block.timestamp < REVEAL_TIMESTAMP) {
                _mintedBeforeReveal[mintIndex] = true;
            }
            _safeMint(msg.sender, mintIndex);
        }

        if (startingIndex == 0 && (totalSupply() == MAX_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            _setStartingIndex();
        }

        IERC20BurnTransfer(tokenCmp).burn(purchaseAmount);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    /**
     * @dev Finalize starting index
     */
    function finalizeStartingIndex() public {
        require(startingIndex == 0, "CosmoBugs: starting index is already set");
        require(block.timestamp >= REVEAL_TIMESTAMP, "CosmoBugs: Too early");
        _setStartingIndex();
    }

    function _setStartingIndex() internal {
        startingIndexBlock = block.number - 1;
        emit SetStartingIndexBlock(startingIndexBlock);

        startingIndex = uint256(blockhash(startingIndexBlock)) % 16400;
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
        emit SetStartingIndex(startingIndex);
    }

    /**
     * @dev Changes the name for CosmoMask tokenId
     */
    function changeName(uint256 tokenId, string memory newName) public {
        address owner = ownerOf(tokenId);
        require(_msgSender() == owner, "CosmoBugs: caller is not the token owner");
        require(validateName(newName) == true, "CosmoBugs: not a valid new name");
        require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "CosmoBugs: new name is same as the current one");
        require(isNameReserved(newName) == false, "CosmoBugs: name already reserved");

        IERC20BurnTransfer(nftPower).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);

        // If already named, dereserve old name
        if (bytes(_tokenName[tokenId]).length > 0) {
            toggleReserveName(_tokenName[tokenId], false);
        }
        toggleReserveName(newName, true);
        _tokenName[tokenId] = newName;
        IERC20BurnTransfer(nftPower).burn(NAME_CHANGE_PRICE);
        emit NameChange(tokenId, newName);
    }

    /**
     * @dev Withdraw ether from this contract (Callable by owner)
     */
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        msg.sender.transfer(balance);
    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[toLower(str)] = isReserve;
    }

    /**
     * @dev Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
     */
    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 1)
            return false;
        // Cannot be longer than 25 characters
        if (b.length > 25)
            return false;
        // Leading space
        if (b[0] == 0x20)
            return false;
        // Trailing space
        if (b[b.length - 1] == 0x20)
            return false;

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];
            // Cannot contain continous spaces
            if (char == 0x20 && lastChar == 0x20)
                return false;
            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            )
                return false;
            lastChar = char;
        }
        return true;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90))
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            else
                bLower[i] = bStr[i];
        }
        return string(bLower);
    }

    function setBaseURI(string memory baseURI_) public onlyOwner {
        _setBaseURI(baseURI_);
    }

    function setContractURI(string memory contractURI_) public onlyOwner {
        _contractURI = contractURI_;
    }

    function setURL(string memory newUrl) public onlyOwner {
        _setURL(newUrl);
    }
}

File 2 of 9 : CosmoBugsERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "./libraries/SafeMath.sol";
import "./libraries/Address.sol";
import "./libraries/EnumerableSet.sol";
import "./libraries/EnumerableMap.sol";
import "./libraries/Strings.sol";
import "./utils/Context.sol";

interface ICosmoBugsERC721 {
    // IERC165
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    // IERC721Enumerable
    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);
    // IERC721Metadata
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
    // ERC721
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
}

interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
abstract contract CosmoBugsERC721 is Context, ICosmoBugsERC721 {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // ERC165
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA_SHORT = 0x93254542;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    mapping(address => EnumerableSet.UintSet) private _holderTokens;
    EnumerableMap.UintToAddressMap private _tokenOwners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    string private _name;
    string private _symbol;
    string private _baseURI;
    string private _url;


    constructor(string memory name_, string memory symbol_) internal {
        _name = name_;
        _symbol = symbol_;

        _registerInterface(_INTERFACE_ID_ERC165);
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA_SHORT);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "CosmoBugs: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "CosmoBugs: owner query for nonexistent token");
    }

    function name() public view override returns (string memory) {
        return _name;
    }

    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "CosmoBugs: URI query for nonexistent token");
        string memory base = baseURI();
        return string(abi.encodePacked(base, tokenId.toString(), ".json"));
    }

    function baseURI() public view returns (string memory) {
        return _baseURI;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    function totalSupply() public view override returns (uint256) {
        return _tokenOwners.length();
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);
        require(to != owner, "CosmoBugs: approval to current owner");
        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "CosmoBugs: approve caller is not owner nor approved for all"
        );
        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "CosmoBugs: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "CosmoBugs: approve to caller");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "CosmoBugs: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "CosmoBugs: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "CosmoBugs: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "CosmoBugs: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "CosmoBugs: transfer to non ERC721Receiver implementer");
    }

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "CosmoBugs: mint to the zero address");
        require(!_exists(tokenId), "CosmoBugs: token already minted");
        _holderTokens[to].add(tokenId);
        _tokenOwners.set(tokenId, to);
        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal {
        address owner = ownerOf(tokenId);
        _approve(address(0), tokenId);
        _holderTokens[owner].remove(tokenId);
        _tokenOwners.remove(tokenId);
        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "CosmoBugs: transfer of token that is not own");
        require(to != address(0), "CosmoBugs: transfer to the zero address");
        _approve(address(0), tokenId);
        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);
        _tokenOwners.set(tokenId, to);
        emit Transfer(from, to, tokenId);
    }

    function _setBaseURI(string memory baseURI_) internal {
        _baseURI = baseURI_;
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "CosmoBugs: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _setURL(string memory newUrl) internal {
        _url = newUrl;
    }

    // ERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "CosmoBugs: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 3 of 9 : Address.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function functionCall(address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 4 of 9 : EnumerableMap.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 */
library EnumerableMap {
    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        MapEntry[] _entries;
        mapping(bytes32 => uint256) _indexes;
    }

    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) {
            map._entries.push(MapEntry({_key: key, _value: value}));
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    function _remove(Map storage map, bytes32 key) private returns (bool) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex != 0) {
            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;
            MapEntry storage lastEntry = map._entries[lastIndex];
            map._entries[toDeleteIndex] = lastEntry;
            map._indexes[lastEntry._key] = toDeleteIndex + 1;
            map._entries.pop();
            delete map._indexes[key];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");
        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0);
        return (true, map._entries[keyIndex - 1]._value);
    }

    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key");
        return map._entries[keyIndex - 1]._value;
    }

    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage);
        return map._entries[keyIndex - 1]._value;
    }

    // UintToAddressMap
    struct UintToAddressMap {
        Map _inner;
    }

    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

File 5 of 9 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 */
library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = toDeleteIndex + 1;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // UintSet
    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 6 of 9 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 */
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
}

File 7 of 9 : Strings.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}

File 8 of 9 : Context.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction.
 */
abstract contract Context {
    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
}

File 9 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 */
abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftPowerAddress","type":"address"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startingIndex","type":"uint256"}],"name":"SetStartingIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startingIndexBlock","type":"uint256"}],"name":"SetStartingIndexBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CMP_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COSMO_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME_CHANGE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_A_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isMintedBeforeReveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMasks","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMasks","type":"uint256"}],"name":"mintByCmp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMasks","type":"uint256"}],"name":"mintByCosmo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPower","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUrl","type":"string"}],"name":"setURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCmp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCosmo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620056bc380380620056bc833981810160405260408110156200003757600080fd5b5080516020918201516040805180820182526009815268436f736d6f4275677360b81b8186015281518083019092526006825265434f5342554760d01b948201949094529192909160006200008b62000244565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000ea906007906020850190620002f9565b50805162000100906008906020840190620002f9565b50620001136301ffc9a760e01b62000248565b620001256380ac58cd60e01b62000248565b62000137635b5e139f60e01b62000248565b62000149634992a2a160e11b62000248565b6200015b63780e9d6360e01b62000248565b5050600d80546001600160a01b038085166001600160a01b031992831617909255600e80549284169290911691909117905560408051808201909152601681527f68747470733a2f2f636f736d6f627567732e636f6d2f000000000000000000006020820152620001cc90620002d0565b60408051808201909152601f81527f68747470733a2f2f636f736d6f627567732e636f6d2f6d657461646174612f0060208201526200020b90620002e9565b6040518060600160405280602c815260200162005690602c913980516200023b91600f91602090910190620002f9565b505050620003a5565b3390565b6001600160e01b03198082161415620002a8576040805162461bcd60e51b815260206004820152601f60248201527f436f736d6f427567733a20696e76616c696420696e7465726661636520696400604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b8051620002e590600a906020840190620002f9565b5050565b8051620002e59060099060208401905b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200033157600085556200037c565b82601f106200034c57805160ff19168380011785556200037c565b828001600101855582156200037c579182015b828111156200037c5782518255916020019190600101906200035f565b506200038a9291506200038e565b5090565b5b808211156200038a57600081556001016200038f565b6152db80620003b56000396000f3fe6080604052600436106103295760003560e01c806377343408116101a5578063b88d4fde116100ec578063cb774d4711610095578063e8a3d4851161006f578063e8a3d48514610efb578063e985e9c514610f10578063f2fde38b14610f58578063f9cfa06f14610f9857610329565b8063cb774d4714610ebc578063cd7c032614610ed1578063e36d649814610ee657610329565b8063bd793307116100c6578063bd79330714610dae578063c39cbef114610dd8578063c87b56dd14610e9257610329565b8063b88d4fde14610c8f578063bc28d70214610d6f578063bd10fb3b14610d9957610329565b806395d89b411161014e578063a0712d6811610128578063a0712d6814610c15578063a22cb46514610c32578063b4673bf414610c7a57610329565b806395d89b4114610b3857806398d5fdca14610b4d5780639ffdb65a14610b6257610329565b8063938e3d7b1161017f578063938e3d7b146109bd5780639416b42314610a70578063946807fd14610b2357610329565b806377343408146108e05780637bd7edc2146109935780638da5cb5b146109a857610329565b8063413b5993116102745780636373a6b11161021d57806370a08231116101f757806370a0823114610861578063715018a6146108a157806374df39c9146108b657806375394829146108cb57610329565b80636373a6b11461080d5780636c0360eb146108225780636d5224181461083757610329565b806354b6f1611161024e57806354b6f1611461071b57806355f804b3146107305780636352211e146107e357610329565b8063413b59931461068c57806342842e0e146106a15780634f6ccce7146106f157610329565b806318160ddd116102d65780632f745c59116102b05780632f745c591461061c57806332cb6b0c146106625780633ccfd60b1461067757610329565b806318160ddd1461059057806318e20a38146105b757806323b872dd146105cc57610329565b80630896dfd6116103075780630896dfd61461046b578063095ea7b31461049757806315b56d10146104dd57610329565b806301ffc9a71461032e57806306fdde031461038e578063081812fc14610418575b600080fd5b34801561033a57600080fd5b5061037a6004803603602081101561035157600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610fad565b604080519115158252519081900360200190f35b34801561039a57600080fd5b506103a3610fe8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103dd5781810151838201526020016103c5565b50505050905090810190601f16801561040a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042457600080fd5b506104426004803603602081101561043b57600080fd5b503561109d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561047757600080fd5b506104956004803603602081101561048e57600080fd5b5035611126565b005b3480156104a357600080fd5b50610495600480360360408110156104ba57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356114f6565b3480156104e957600080fd5b5061037a6004803603602081101561050057600080fd5b81019060208101813564010000000081111561051b57600080fd5b82018360208201111561052d57600080fd5b8035906020019184600183028401116401000000008311171561054f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611639945050505050565b34801561059c57600080fd5b506105a56116e8565b60408051918252519081900360200190f35b3480156105c357600080fd5b506105a56116f9565b3480156105d857600080fd5b50610495600480360360608110156105ef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611701565b34801561062857600080fd5b506105a56004803603604081101561063f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611772565b34801561066e57600080fd5b506105a56117aa565b34801561068357600080fd5b506104956117b0565b34801561069857600080fd5b5061044261188b565b3480156106ad57600080fd5b50610495600480360360608110156106c457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356118a3565b3480156106fd57600080fd5b506105a56004803603602081101561071457600080fd5b50356118be565b34801561072757600080fd5b506105a56118d4565b34801561073c57600080fd5b506104956004803603602081101561075357600080fd5b81019060208101813564010000000081111561076e57600080fd5b82018360208201111561078057600080fd5b803590602001918460018302840111640100000000831117156107a257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118e1945050505050565b3480156107ef57600080fd5b506104426004803603602081101561080657600080fd5b5035611995565b34801561081957600080fd5b506103a36119bd565b34801561082e57600080fd5b506103a36119d9565b34801561084357600080fd5b506103a36004803603602081101561085a57600080fd5b5035611a58565b34801561086d57600080fd5b506105a56004803603602081101561088457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b17565b3480156108ad57600080fd5b50610495611bb3565b3480156108c257600080fd5b50610495611cca565b3480156108d757600080fd5b506105a5611da0565b3480156108ec57600080fd5b506104956004803603602081101561090357600080fd5b81019060208101813564010000000081111561091e57600080fd5b82018360208201111561093057600080fd5b8035906020019184600183028401116401000000008311171561095257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611dae945050505050565b34801561099f57600080fd5b506105a5611e5f565b3480156109b457600080fd5b50610442611e70565b3480156109c957600080fd5b50610495600480360360208110156109e057600080fd5b8101906020810181356401000000008111156109fb57600080fd5b820183602082011115610a0d57600080fd5b80359060200191846001830284011164010000000083111715610a2f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e8c945050505050565b348015610a7c57600080fd5b506103a360048036036020811015610a9357600080fd5b810190602081018135640100000000811115610aae57600080fd5b820183602082011115610ac057600080fd5b80359060200191846001830284011164010000000083111715610ae257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f47945050505050565b348015610b2f57600080fd5b506105a561209a565b348015610b4457600080fd5b506103a36120a2565b348015610b5957600080fd5b506105a5612121565b348015610b6e57600080fd5b5061037a60048036036020811015610b8557600080fd5b810190602081018135640100000000811115610ba057600080fd5b820183602082011115610bb257600080fd5b80359060200191846001830284011164010000000083111715610bd457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061230c945050505050565b61049560048036036020811015610c2b57600080fd5b503561274a565b348015610c3e57600080fd5b5061049560048036036040811015610c5557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013515156129e5565b348015610c8657600080fd5b50610442612b56565b348015610c9b57600080fd5b5061049560048036036080811015610cb257600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359190810190608081016060820135640100000000811115610cfa57600080fd5b820183602082011115610d0c57600080fd5b80359060200191846001830284011164010000000083111715610d2e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6e945050505050565b348015610d7b57600080fd5b5061037a60048036036020811015610d9257600080fd5b5035612be0565b348015610da557600080fd5b50610442612bf5565b348015610dba57600080fd5b5061049560048036036020811015610dd157600080fd5b5035612c11565b348015610de457600080fd5b5061049560048036036040811015610dfb57600080fd5b81359190810190604081016020820135640100000000811115610e1d57600080fd5b820183602082011115610e2f57600080fd5b80359060200191846001830284011164010000000083111715610e5157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612fa8945050505050565b348015610e9e57600080fd5b506103a360048036036020811015610eb557600080fd5b503561361e565b348015610ec857600080fd5b506105a5613807565b348015610edd57600080fd5b5061044261380d565b348015610ef257600080fd5b506105a5613829565b348015610f0757600080fd5b506103a361382f565b348015610f1c57600080fd5b5061037a60048036036040811015610f3357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166138ae565b348015610f6457600080fd5b5061049560048036036020811015610f7b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661398c565b348015610fa457600080fd5b506105a5613b2d565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205460ff165b919050565b60078054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505090505b90565b60006110a882613b34565b6110fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614f40602f913960400191505060405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61401a6111316116e8565b10611187576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b600081116111e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b601481111561123a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b61401061124f826112496116e8565b90613b41565b11156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614f9d603a913960400191505060405180910390fd5b60006112bf6c0c9f2c9cd04674edea4000000083613bb5565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905290519192507327cd7375478f189bdcf55616b088be03d9c4339c916323b872dd916064808201926020929091908290030181600087803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b50516113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806152746032913960400191505060405180910390fd5b60005b8281101561142b5760006113d26116e8565b90506360d9e3f042101561141857600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b6114223382613c28565b506001016113c0565b50600c54158015611452575061401a6114426116e8565b148061145257506360d9e3f04210155b1561145f5761145f613c42565b7327cd7375478f189bdcf55616b088be03d9c4339c73ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d60208110156114f057600080fd5b50505050565b600061150182611995565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061512c6024913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166115a7613cf7565b73ffffffffffffffffffffffffffffffffffffffff1614806115d557506115d5816115d0613cf7565b6138ae565b61162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614f05603b913960400191505060405180910390fd5b6116348383613cfb565b505050565b6000601161164683611f47565b6040518082805190602001908083835b6020831061169357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611656565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205460ff16949350505050565b60006116f46003613d9b565b905090565b6360d9e3f081565b61171261170c613cf7565b82613da6565b611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061502d6034913960400191505060405180910390fd5b611634838383613e90565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604081206117a19083614060565b90505b92915050565b61401a81565b6117b8613cf7565b73ffffffffffffffffffffffffffffffffffffffff166117d6611e70565b73ffffffffffffffffffffffffffffffffffffffff161461185857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040514790339082156108fc029083906000818181858888f19350505050158015611887573d6000803e3d6000fd5b5050565b73b9fdc13f7f747baedcc356e9da13ab883ffa719b81565b61163483838360405180602001604052806000815250612b6e565b6000806118cc60038461406c565b509392505050565b6863345a083e94d8000081565b6118e9613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611907611e70565b73ffffffffffffffffffffffffffffffffffffffff161461198957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61199281614088565b50565b60006117a4826040518060600160405280602c8152602001614fd7602c91396003919061409b565b6040518060600160405280604081526020016150616040913981565b60098054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b60008181526010602090815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015611b0b5780601f10611ae057610100808354040283529160200191611b0b565b820191906000526020600020905b815481529060010190602001808311611aee57829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff8216611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614e46602d913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206117a490613d9b565b611bbb613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611bd9611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611c5b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600c5415611d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151c36028913960400191505060405180910390fd5b6360d9e3f0421015611d9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f736d6f427567733a20546f6f206561726c79000000000000000000000000604482015290519081900360640190fd5b611d9e613c42565b565b69010f0cf064dd5920000081565b611db6613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611e5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611992816140b2565b6c0c9f2c9cd04674edea4000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b611e94613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611eb2611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611f3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b805161188790600f906020840190614d61565b606060008290506000815167ffffffffffffffff81118015611f6857600080fd5b506040519080825280601f01601f191660200182016040528015611f93576020820181803683370190505b50905060005b82518110156118cc576041838281518110611fb057fe5b016020015160f81c10801590611fda5750605a838281518110611fcf57fe5b016020015160f81c11155b1561203f57828181518110611feb57fe5b602001015160f81c60f81b60f81c60200160f81b82828151811061200b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612092565b82818151811061204b57fe5b602001015160f81c60f81b82828151811061206257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600101611f99565b6360c76ef081565b60088054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b60006360c76ef042101561219657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a2073616c6520686173206e6f74207374617274656400604482015290519081900360640190fd5b61401a6121a16116e8565b106121f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60006122016116e8565b90506140198110612220576a01a784379d99db4200000091505061109a565b614017811061223c57692a5a058fc295ed00000091505061109a565b61401081106122585769043c33c193756480000091505061109a565b613ffd811061227357686c6b935b8bbd40000091505061109a565b613e80811061228e57680ad78ebc5ac620000091505061109a565b613a9881106122a9576801d7d843dc3b48000091505061109a565b612af881106122c35767f9ccd8a1c508000091505061109a565b611b5881106122dd57678ac7230489e8000091505061109a565b610bb881106122f7576753444835ec58000091505061109a565b671bc16d674ec8000091505061109a565b5090565b600080829050600181511015612326576000915050610fe3565b60198151111561233a576000915050610fe3565b8060008151811061234757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f200000000000000000000000000000000000000000000000000000000000000014156123a0576000915050610fe3565b806001825103815181106123b057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f20000000000000000000000000000000000000000000000000000000000000001415612409576000915050610fe3565b60008160008151811061241857fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016905060005b825181101561273f57600083828151811061245b57fe5b01602001517fff000000000000000000000000000000000000000000000000000000000000001690507f2000000000000000000000000000000000000000000000000000000000000000811480156124f457507f20000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008416145b15612506576000945050505050610fe3565b7f30000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080159061259a57507f39000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b15801561263857507f41000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080159061263657507f5a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b80156126d557507f61000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216108015906126d357507f7a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b801561272357507f20000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821614155b15612735576000945050505050610fe3565b9150600101612444565b506001949350505050565b61401a6127556116e8565b106127ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60008111612804576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b601481111561285e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b61401a61286d826112496116e8565b11156128da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f436f736d6f427567733a2045786365656473204d41585f535550504c59000000604482015290519081900360640190fd5b346128ed826128e7612121565b90613bb5565b14612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614e1c602a913960400191505060405180910390fd5b60005b818110156129b15760006129586116e8565b90506360d9e3f042101561299e57600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b6129a83382613c28565b50600101612946565b50600c541580156129d8575061401a6129c86116e8565b14806129d857506360d9e3f04210155b1561199257611992613c42565b6129ed613cf7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f436f736d6f427567733a20617070726f766520746f2063616c6c657200000000604482015290519081900360640190fd5b8060066000612a94613cf7565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155612b03613cf7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b7327cd7375478f189bdcf55616b088be03d9c4339c81565b612b7f612b79613cf7565b83613da6565b612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061502d6034913960400191505060405180910390fd5b6114f0848484846140c5565b60009081526012602052604090205460ff1690565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b61401a612c1c6116e8565b10612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60008111612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b6014811115612d25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b614010612d34826112496116e8565b1115612d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614f9d603a913960400191505060405180910390fd5b6000612da169010f0cf064dd5920000083613bb5565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052905191925073b9fdc13f7f747baedcc356e9da13ab883ffa719b916323b872dd916064808201926020929091908290030181600087803b158015612e1e57600080fd5b505af1158015612e32573d6000803e3d6000fd5b505050506040513d6020811015612e4857600080fd5b5051612e9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806151936030913960400191505060405180910390fd5b60005b82811015612f0d576000612eb46116e8565b90506360d9e3f0421015612efa57600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b612f043382613c28565b50600101612ea2565b50600c54158015612f34575061401a612f246116e8565b1480612f3457506360d9e3f04210155b15612f4157612f41613c42565b73b9fdc13f7f747baedcc356e9da13ab883ffa719b73ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c657600080fd5b6000612fb383611995565b90508073ffffffffffffffffffffffffffffffffffffffff16612fd4613cf7565b73ffffffffffffffffffffffffffffffffffffffff1614613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061524c6028913960400191505060405180910390fd5b6130498261230c565b15156001146130b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a206e6f7420612076616c6964206e6577206e616d6500604482015290519081900360640190fd5b60026010600085815260200190815260200160002060405180828054600181600116156101000203166002900480156131295780601f10613107576101008083540402835291820191613129565b820191906000526020600020905b815481529060010190602001808311613115575b5050915050602060405180830381855afa15801561314b573d6000803e3d6000fd5b5050506040513d602081101561316057600080fd5b505160405183516002918591819060208401908083835b602083106131b457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613177565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015613211573d6000803e3d6000fd5b5050506040513d602081101561322657600080fd5b5051141561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614f6f602e913960400191505060405180910390fd5b61328882611639565b156132f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f436f736d6f427567733a206e616d6520616c7265616479207265736572766564604482015290519081900360640190fd5b600d54604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526863345a083e94d800006044820152905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd916064808201926020929091908290030181600087803b15801561337c57600080fd5b505af1158015613390573d6000803e3d6000fd5b505050506040513d60208110156133a657600080fd5b505060008381526010602052604090205460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001841615020190911604156134ad5760008381526010602090815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018616150201909316929092049182018490048402810184019094528084526134ad93928301828280156134a15780601f10613476576101008083540402835291602001916134a1565b820191906000526020600020905b81548152906001019060200180831161348457829003601f168201915b50505050506000614131565b6134b8826001614131565b600083815260106020908152604090912083516134d792850190614d61565b50600d54604080517f42966c680000000000000000000000000000000000000000000000000000000081526863345a083e94d800006004820152905173ffffffffffffffffffffffffffffffffffffffff909216916342966c68916024808201926020929091908290030181600087803b15801561355457600080fd5b505af1158015613568573d6000803e3d6000fd5b505050506040513d602081101561357e57600080fd5b5050604080516020808252845182820152845186937f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b9387939092839283019185019080838360005b838110156135df5781810151838201526020016135c7565b50505050905090810190601f16801561360c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b606061362982613b34565b61367e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615003602a913960400191505060405180910390fd5b60006136886119d9565b90508061369484614207565b6040516020018083805190602001908083835b602083106136e457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016136a7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905285519190930192850191508083835b6020831061376857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161372b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5018152600590920190529695505050505050565b600c5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600f8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b600e54604080517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301529151600093831692851691839163c455279191602480820192602092909190829003018186803b15801561392857600080fd5b505afa15801561393c573d6000803e3d6000fd5b505050506040513d602081101561395257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561397a5760019150506117a4565b6139848484614334565b949350505050565b613994613cf7565b73ffffffffffffffffffffffffffffffffffffffff166139b2611e70565b73ffffffffffffffffffffffffffffffffffffffff1614613a3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614e9a6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6201518081565b60006117a460038361436f565b6000828201838110156117a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613bc4575060006117a4565b82820282848281613bd157fe5b04146117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151726021913960400191505060405180910390fd5b61188782826040518060200160405280600081525061437b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4301600b81905560408051918252517f1ebf104b139b44bd4c7fbbaf3a5f40960db3488203e805d3e4cfa0867f7fd4bf9181900360200190a1600b54614010904006600c819055613cc057600c54613cbc906001613b41565b600c555b600c5460408051918252517f7527e881a8a314f68a0941c7319ae764e91afbf6a0c93d179e74e9282c75b6e29181900360200190a1565b3390565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190613d5582611995565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a4826143e7565b6000613db182613b34565b613e06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150fd602f913960400191505060405180910390fd5b6000613e1183611995565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613e8057508373ffffffffffffffffffffffffffffffffffffffff16613e688461109d565b73ffffffffffffffffffffffffffffffffffffffff16145b80613984575061398481856138ae565b8273ffffffffffffffffffffffffffffffffffffffff16613eb082611995565b73ffffffffffffffffffffffffffffffffffffffff1614613f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615220602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614e736027913960400191505060405180910390fd5b613f93600082613cfb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600260205260409020613fc290826143eb565b5073ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020613ff290826143f7565b50613fff60038284614403565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006117a18383614426565b600080808061407b86866144a4565b9097909650945050505050565b8051611887906009906020840190614d61565b60006140a8848484614539565b90505b9392505050565b805161188790600a906020840190614d61565b6140d0848484613e90565b6140dc8484848461461d565b6114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151eb6035913960400191505060405180910390fd5b80601161413d84611f47565b6040518082805190602001908083835b6020831061418a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490030190922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925550505050565b606081614248575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fe3565b8160005b811561426057600101600a8204915061424c565b60008167ffffffffffffffff8111801561427957600080fd5b506040519080825280601f01601f1916602001820160405280156142a4576020820181803683370190505b5085935090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561432b57600a840660300160f81b828280600190039350815181106142f157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506142ce565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b60006117a1838361482d565b6143858383614845565b614392600084848461461d565b611634576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151eb6035913960400191505060405180910390fd5b5490565b60006117a183836149ac565b60006117a18383614a90565b60006140a8848473ffffffffffffffffffffffffffffffffffffffff8516614ada565b81546000908210614482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614dfa6022913960400191505060405180910390fd5b82600001828154811061449157fe5b9060005260206000200154905092915050565b815460009081908310614502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806151506022913960400191505060405180910390fd5b600084600001848154811061451357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816145ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145b357818101518382015260200161459b565b50505050905090810190601f1680156145e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061460157fe5b9060005260206000209060020201600101549150509392505050565b600061463e8473ffffffffffffffffffffffffffffffffffffffff16614b71565b61464a57506001613984565b60006147c27f150b7a0200000000000000000000000000000000000000000000000000000000614678613cf7565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156146f95781810151838201526020016146e1565b50505050905090810190601f1680156147265780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603581526020016151eb6035913973ffffffffffffffffffffffffffffffffffffffff88169190614b77565b905060008180602001905160208110156147db57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001492505050949350505050565b60009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff82166148b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806150a16023913960400191505060405180910390fd5b6148ba81613b34565b1561492657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a20746f6b656e20616c7265616479206d696e74656400604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902061495590826143f7565b5061496260038284614403565b50604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015614a865783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191908101906000908790839081106149fd57fe5b9060005260206000200154905080876000018481548110614a1a57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080614a4a57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506117a4565b60009150506117a4565b6000614a9c838361482d565b614ad2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556117a4565b5060006117a4565b600082815260018401602052604081205480614b3f5750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556140ab565b82856000016001830381548110614b5257fe5b90600052602060002090600202016001018190555060009150506140ab565b3b151590565b60606140a8848460008585614b8b85614b71565b614bf657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c5f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614c22565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614cc1576040519150601f19603f3d011682016040523d82523d6000602084013e614cc6565b606091505b5091509150614cd6828286614ce1565b979650505050505050565b60608315614cf05750816140ab565b825115614d005782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156145b357818101518382015260200161459b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614d975760008555614ddd565b82601f10614db057805160ff1916838001178555614ddd565b82800160010185558215614ddd579182015b82811115614ddd578251825591602001919060010190614dc2565b506123089291505b808211156123085760008155600101614de556fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473436f736d6f427567733a2045746865722076616c75652073656e74206973206e6f7420636f7272656374436f736d6f427567733a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373436f736d6f427567733a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f736d6f427567733a2073616c652068617320616c726561647920656e646564436f736d6f427567733a206e756d6265724f664d61736b732063616e6e6f742062652030436f736d6f427567733a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c436f736d6f427567733a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a206e6577206e616d652069732073616d65206173207468652063757272656e74206f6e65436f736d6f427567733a20546865206c617374203130206d61736b732063616e206f6e6c792062652070757263686173656420666f7220455448436f736d6f427567733a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656430613033633033653336616133373537323238653964313835663739346632353935336336343331313063386262336562356566383932643036326230376162436f736d6f427567733a206d696e7420746f20746865207a65726f2061646472657373436f736d6f427567733a20596f75206d6179206e6f7420627579206d6f7265207468616e20323020436f736d6f42756773206174206f6e6365436f736d6f427567733a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a20617070726f76616c20746f2063757272656e74206f776e6572456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f736d6f427567733a205472616e7366657220434d5020616d6f756e74206578636565647320616c6c6f77616e6365436f736d6f427567733a207374617274696e6720696e64657820697320616c726561647920736574436f736d6f427567733a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572436f736d6f427567733a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e436f736d6f427567733a2063616c6c6572206973206e6f742074686520746f6b656e206f776e6572436f736d6f427567733a205472616e7366657220434f534d4f20616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bd43f78b6eb95fd273e7d2ff51855d7900c567ae0fd1d7470e67117b6ac5364f64736f6c6343000706003368747470733a2f2f636f736d6f627567732e636f6d2f6d657461646174612f636f6e74726163742e6a736f6e000000000000000000000000d6319d0d2bc6d58066f61c1f82715564b31dd864000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x6080604052600436106103295760003560e01c806377343408116101a5578063b88d4fde116100ec578063cb774d4711610095578063e8a3d4851161006f578063e8a3d48514610efb578063e985e9c514610f10578063f2fde38b14610f58578063f9cfa06f14610f9857610329565b8063cb774d4714610ebc578063cd7c032614610ed1578063e36d649814610ee657610329565b8063bd793307116100c6578063bd79330714610dae578063c39cbef114610dd8578063c87b56dd14610e9257610329565b8063b88d4fde14610c8f578063bc28d70214610d6f578063bd10fb3b14610d9957610329565b806395d89b411161014e578063a0712d6811610128578063a0712d6814610c15578063a22cb46514610c32578063b4673bf414610c7a57610329565b806395d89b4114610b3857806398d5fdca14610b4d5780639ffdb65a14610b6257610329565b8063938e3d7b1161017f578063938e3d7b146109bd5780639416b42314610a70578063946807fd14610b2357610329565b806377343408146108e05780637bd7edc2146109935780638da5cb5b146109a857610329565b8063413b5993116102745780636373a6b11161021d57806370a08231116101f757806370a0823114610861578063715018a6146108a157806374df39c9146108b657806375394829146108cb57610329565b80636373a6b11461080d5780636c0360eb146108225780636d5224181461083757610329565b806354b6f1611161024e57806354b6f1611461071b57806355f804b3146107305780636352211e146107e357610329565b8063413b59931461068c57806342842e0e146106a15780634f6ccce7146106f157610329565b806318160ddd116102d65780632f745c59116102b05780632f745c591461061c57806332cb6b0c146106625780633ccfd60b1461067757610329565b806318160ddd1461059057806318e20a38146105b757806323b872dd146105cc57610329565b80630896dfd6116103075780630896dfd61461046b578063095ea7b31461049757806315b56d10146104dd57610329565b806301ffc9a71461032e57806306fdde031461038e578063081812fc14610418575b600080fd5b34801561033a57600080fd5b5061037a6004803603602081101561035157600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610fad565b604080519115158252519081900360200190f35b34801561039a57600080fd5b506103a3610fe8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103dd5781810151838201526020016103c5565b50505050905090810190601f16801561040a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042457600080fd5b506104426004803603602081101561043b57600080fd5b503561109d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561047757600080fd5b506104956004803603602081101561048e57600080fd5b5035611126565b005b3480156104a357600080fd5b50610495600480360360408110156104ba57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356114f6565b3480156104e957600080fd5b5061037a6004803603602081101561050057600080fd5b81019060208101813564010000000081111561051b57600080fd5b82018360208201111561052d57600080fd5b8035906020019184600183028401116401000000008311171561054f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611639945050505050565b34801561059c57600080fd5b506105a56116e8565b60408051918252519081900360200190f35b3480156105c357600080fd5b506105a56116f9565b3480156105d857600080fd5b50610495600480360360608110156105ef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611701565b34801561062857600080fd5b506105a56004803603604081101561063f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611772565b34801561066e57600080fd5b506105a56117aa565b34801561068357600080fd5b506104956117b0565b34801561069857600080fd5b5061044261188b565b3480156106ad57600080fd5b50610495600480360360608110156106c457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356118a3565b3480156106fd57600080fd5b506105a56004803603602081101561071457600080fd5b50356118be565b34801561072757600080fd5b506105a56118d4565b34801561073c57600080fd5b506104956004803603602081101561075357600080fd5b81019060208101813564010000000081111561076e57600080fd5b82018360208201111561078057600080fd5b803590602001918460018302840111640100000000831117156107a257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118e1945050505050565b3480156107ef57600080fd5b506104426004803603602081101561080657600080fd5b5035611995565b34801561081957600080fd5b506103a36119bd565b34801561082e57600080fd5b506103a36119d9565b34801561084357600080fd5b506103a36004803603602081101561085a57600080fd5b5035611a58565b34801561086d57600080fd5b506105a56004803603602081101561088457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b17565b3480156108ad57600080fd5b50610495611bb3565b3480156108c257600080fd5b50610495611cca565b3480156108d757600080fd5b506105a5611da0565b3480156108ec57600080fd5b506104956004803603602081101561090357600080fd5b81019060208101813564010000000081111561091e57600080fd5b82018360208201111561093057600080fd5b8035906020019184600183028401116401000000008311171561095257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611dae945050505050565b34801561099f57600080fd5b506105a5611e5f565b3480156109b457600080fd5b50610442611e70565b3480156109c957600080fd5b50610495600480360360208110156109e057600080fd5b8101906020810181356401000000008111156109fb57600080fd5b820183602082011115610a0d57600080fd5b80359060200191846001830284011164010000000083111715610a2f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e8c945050505050565b348015610a7c57600080fd5b506103a360048036036020811015610a9357600080fd5b810190602081018135640100000000811115610aae57600080fd5b820183602082011115610ac057600080fd5b80359060200191846001830284011164010000000083111715610ae257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f47945050505050565b348015610b2f57600080fd5b506105a561209a565b348015610b4457600080fd5b506103a36120a2565b348015610b5957600080fd5b506105a5612121565b348015610b6e57600080fd5b5061037a60048036036020811015610b8557600080fd5b810190602081018135640100000000811115610ba057600080fd5b820183602082011115610bb257600080fd5b80359060200191846001830284011164010000000083111715610bd457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061230c945050505050565b61049560048036036020811015610c2b57600080fd5b503561274a565b348015610c3e57600080fd5b5061049560048036036040811015610c5557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013515156129e5565b348015610c8657600080fd5b50610442612b56565b348015610c9b57600080fd5b5061049560048036036080811015610cb257600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359190810190608081016060820135640100000000811115610cfa57600080fd5b820183602082011115610d0c57600080fd5b80359060200191846001830284011164010000000083111715610d2e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6e945050505050565b348015610d7b57600080fd5b5061037a60048036036020811015610d9257600080fd5b5035612be0565b348015610da557600080fd5b50610442612bf5565b348015610dba57600080fd5b5061049560048036036020811015610dd157600080fd5b5035612c11565b348015610de457600080fd5b5061049560048036036040811015610dfb57600080fd5b81359190810190604081016020820135640100000000811115610e1d57600080fd5b820183602082011115610e2f57600080fd5b80359060200191846001830284011164010000000083111715610e5157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612fa8945050505050565b348015610e9e57600080fd5b506103a360048036036020811015610eb557600080fd5b503561361e565b348015610ec857600080fd5b506105a5613807565b348015610edd57600080fd5b5061044261380d565b348015610ef257600080fd5b506105a5613829565b348015610f0757600080fd5b506103a361382f565b348015610f1c57600080fd5b5061037a60048036036040811015610f3357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166138ae565b348015610f6457600080fd5b5061049560048036036020811015610f7b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661398c565b348015610fa457600080fd5b506105a5613b2d565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205460ff165b919050565b60078054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505090505b90565b60006110a882613b34565b6110fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614f40602f913960400191505060405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61401a6111316116e8565b10611187576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b600081116111e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b601481111561123a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b61401061124f826112496116e8565b90613b41565b11156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614f9d603a913960400191505060405180910390fd5b60006112bf6c0c9f2c9cd04674edea4000000083613bb5565b604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905290519192507327cd7375478f189bdcf55616b088be03d9c4339c916323b872dd916064808201926020929091908290030181600087803b15801561133c57600080fd5b505af1158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b50516113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806152746032913960400191505060405180910390fd5b60005b8281101561142b5760006113d26116e8565b90506360d9e3f042101561141857600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b6114223382613c28565b506001016113c0565b50600c54158015611452575061401a6114426116e8565b148061145257506360d9e3f04210155b1561145f5761145f613c42565b7327cd7375478f189bdcf55616b088be03d9c4339c73ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d60208110156114f057600080fd5b50505050565b600061150182611995565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061512c6024913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166115a7613cf7565b73ffffffffffffffffffffffffffffffffffffffff1614806115d557506115d5816115d0613cf7565b6138ae565b61162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614f05603b913960400191505060405180910390fd5b6116348383613cfb565b505050565b6000601161164683611f47565b6040518082805190602001908083835b6020831061169357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611656565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205460ff16949350505050565b60006116f46003613d9b565b905090565b6360d9e3f081565b61171261170c613cf7565b82613da6565b611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061502d6034913960400191505060405180910390fd5b611634838383613e90565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604081206117a19083614060565b90505b92915050565b61401a81565b6117b8613cf7565b73ffffffffffffffffffffffffffffffffffffffff166117d6611e70565b73ffffffffffffffffffffffffffffffffffffffff161461185857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040514790339082156108fc029083906000818181858888f19350505050158015611887573d6000803e3d6000fd5b5050565b73b9fdc13f7f747baedcc356e9da13ab883ffa719b81565b61163483838360405180602001604052806000815250612b6e565b6000806118cc60038461406c565b509392505050565b6863345a083e94d8000081565b6118e9613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611907611e70565b73ffffffffffffffffffffffffffffffffffffffff161461198957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61199281614088565b50565b60006117a4826040518060600160405280602c8152602001614fd7602c91396003919061409b565b6040518060600160405280604081526020016150616040913981565b60098054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b60008181526010602090815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015611b0b5780601f10611ae057610100808354040283529160200191611b0b565b820191906000526020600020905b815481529060010190602001808311611aee57829003601f168201915b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff8216611b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614e46602d913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206117a490613d9b565b611bbb613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611bd9611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611c5b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600c5415611d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806151c36028913960400191505060405180910390fd5b6360d9e3f0421015611d9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f736d6f427567733a20546f6f206561726c79000000000000000000000000604482015290519081900360640190fd5b611d9e613c42565b565b69010f0cf064dd5920000081565b611db6613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611e5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611992816140b2565b6c0c9f2c9cd04674edea4000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b611e94613cf7565b73ffffffffffffffffffffffffffffffffffffffff16611eb2611e70565b73ffffffffffffffffffffffffffffffffffffffff1614611f3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b805161188790600f906020840190614d61565b606060008290506000815167ffffffffffffffff81118015611f6857600080fd5b506040519080825280601f01601f191660200182016040528015611f93576020820181803683370190505b50905060005b82518110156118cc576041838281518110611fb057fe5b016020015160f81c10801590611fda5750605a838281518110611fcf57fe5b016020015160f81c11155b1561203f57828181518110611feb57fe5b602001015160f81c60f81b60f81c60200160f81b82828151811061200b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612092565b82818151811061204b57fe5b602001015160f81c60f81b82828151811061206257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600101611f99565b6360c76ef081565b60088054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b60006360c76ef042101561219657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a2073616c6520686173206e6f74207374617274656400604482015290519081900360640190fd5b61401a6121a16116e8565b106121f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60006122016116e8565b90506140198110612220576a01a784379d99db4200000091505061109a565b614017811061223c57692a5a058fc295ed00000091505061109a565b61401081106122585769043c33c193756480000091505061109a565b613ffd811061227357686c6b935b8bbd40000091505061109a565b613e80811061228e57680ad78ebc5ac620000091505061109a565b613a9881106122a9576801d7d843dc3b48000091505061109a565b612af881106122c35767f9ccd8a1c508000091505061109a565b611b5881106122dd57678ac7230489e8000091505061109a565b610bb881106122f7576753444835ec58000091505061109a565b671bc16d674ec8000091505061109a565b5090565b600080829050600181511015612326576000915050610fe3565b60198151111561233a576000915050610fe3565b8060008151811061234757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f200000000000000000000000000000000000000000000000000000000000000014156123a0576000915050610fe3565b806001825103815181106123b057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f20000000000000000000000000000000000000000000000000000000000000001415612409576000915050610fe3565b60008160008151811061241857fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016905060005b825181101561273f57600083828151811061245b57fe5b01602001517fff000000000000000000000000000000000000000000000000000000000000001690507f2000000000000000000000000000000000000000000000000000000000000000811480156124f457507f20000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008416145b15612506576000945050505050610fe3565b7f30000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080159061259a57507f39000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b15801561263857507f41000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080159061263657507f5a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b80156126d557507f61000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216108015906126d357507f7a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b155b801561272357507f20000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821614155b15612735576000945050505050610fe3565b9150600101612444565b506001949350505050565b61401a6127556116e8565b106127ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60008111612804576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b601481111561285e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b61401a61286d826112496116e8565b11156128da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f436f736d6f427567733a2045786365656473204d41585f535550504c59000000604482015290519081900360640190fd5b346128ed826128e7612121565b90613bb5565b14612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614e1c602a913960400191505060405180910390fd5b60005b818110156129b15760006129586116e8565b90506360d9e3f042101561299e57600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b6129a83382613c28565b50600101612946565b50600c541580156129d8575061401a6129c86116e8565b14806129d857506360d9e3f04210155b1561199257611992613c42565b6129ed613cf7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f436f736d6f427567733a20617070726f766520746f2063616c6c657200000000604482015290519081900360640190fd5b8060066000612a94613cf7565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155612b03613cf7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b7327cd7375478f189bdcf55616b088be03d9c4339c81565b612b7f612b79613cf7565b83613da6565b612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061502d6034913960400191505060405180910390fd5b6114f0848484846140c5565b60009081526012602052604090205460ff1690565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b61401a612c1c6116e8565b10612c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ec06021913960400191505060405180910390fd5b60008111612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ee16024913960400191505060405180910390fd5b6014811115612d25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806150c46039913960400191505060405180910390fd5b614010612d34826112496116e8565b1115612d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614f9d603a913960400191505060405180910390fd5b6000612da169010f0cf064dd5920000083613bb5565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052905191925073b9fdc13f7f747baedcc356e9da13ab883ffa719b916323b872dd916064808201926020929091908290030181600087803b158015612e1e57600080fd5b505af1158015612e32573d6000803e3d6000fd5b505050506040513d6020811015612e4857600080fd5b5051612e9f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806151936030913960400191505060405180910390fd5b60005b82811015612f0d576000612eb46116e8565b90506360d9e3f0421015612efa57600081815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b612f043382613c28565b50600101612ea2565b50600c54158015612f34575061401a612f246116e8565b1480612f3457506360d9e3f04210155b15612f4157612f41613c42565b73b9fdc13f7f747baedcc356e9da13ab883ffa719b73ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156114c657600080fd5b6000612fb383611995565b90508073ffffffffffffffffffffffffffffffffffffffff16612fd4613cf7565b73ffffffffffffffffffffffffffffffffffffffff1614613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061524c6028913960400191505060405180910390fd5b6130498261230c565b15156001146130b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a206e6f7420612076616c6964206e6577206e616d6500604482015290519081900360640190fd5b60026010600085815260200190815260200160002060405180828054600181600116156101000203166002900480156131295780601f10613107576101008083540402835291820191613129565b820191906000526020600020905b815481529060010190602001808311613115575b5050915050602060405180830381855afa15801561314b573d6000803e3d6000fd5b5050506040513d602081101561316057600080fd5b505160405183516002918591819060208401908083835b602083106131b457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613177565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015613211573d6000803e3d6000fd5b5050506040513d602081101561322657600080fd5b5051141561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614f6f602e913960400191505060405180910390fd5b61328882611639565b156132f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f436f736d6f427567733a206e616d6520616c7265616479207265736572766564604482015290519081900360640190fd5b600d54604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526863345a083e94d800006044820152905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd916064808201926020929091908290030181600087803b15801561337c57600080fd5b505af1158015613390573d6000803e3d6000fd5b505050506040513d60208110156133a657600080fd5b505060008381526010602052604090205460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001841615020190911604156134ad5760008381526010602090815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018616150201909316929092049182018490048402810184019094528084526134ad93928301828280156134a15780601f10613476576101008083540402835291602001916134a1565b820191906000526020600020905b81548152906001019060200180831161348457829003601f168201915b50505050506000614131565b6134b8826001614131565b600083815260106020908152604090912083516134d792850190614d61565b50600d54604080517f42966c680000000000000000000000000000000000000000000000000000000081526863345a083e94d800006004820152905173ffffffffffffffffffffffffffffffffffffffff909216916342966c68916024808201926020929091908290030181600087803b15801561355457600080fd5b505af1158015613568573d6000803e3d6000fd5b505050506040513d602081101561357e57600080fd5b5050604080516020808252845182820152845186937f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b9387939092839283019185019080838360005b838110156135df5781810151838201526020016135c7565b50505050905090810190601f16801561360c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b606061362982613b34565b61367e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615003602a913960400191505060405180910390fd5b60006136886119d9565b90508061369484614207565b6040516020018083805190602001908083835b602083106136e457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016136a7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905285519190930192850191508083835b6020831061376857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161372b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5018152600590920190529695505050505050565b600c5481565b600e5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600f8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110925780601f1061106757610100808354040283529160200191611092565b600e54604080517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301529151600093831692851691839163c455279191602480820192602092909190829003018186803b15801561392857600080fd5b505afa15801561393c573d6000803e3d6000fd5b505050506040513d602081101561395257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561397a5760019150506117a4565b6139848484614334565b949350505050565b613994613cf7565b73ffffffffffffffffffffffffffffffffffffffff166139b2611e70565b73ffffffffffffffffffffffffffffffffffffffff1614613a3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614e9a6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6201518081565b60006117a460038361436f565b6000828201838110156117a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613bc4575060006117a4565b82820282848281613bd157fe5b04146117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151726021913960400191505060405180910390fd5b61188782826040518060200160405280600081525061437b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4301600b81905560408051918252517f1ebf104b139b44bd4c7fbbaf3a5f40960db3488203e805d3e4cfa0867f7fd4bf9181900360200190a1600b54614010904006600c819055613cc057600c54613cbc906001613b41565b600c555b600c5460408051918252517f7527e881a8a314f68a0941c7319ae764e91afbf6a0c93d179e74e9282c75b6e29181900360200190a1565b3390565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190613d5582611995565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a4826143e7565b6000613db182613b34565b613e06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806150fd602f913960400191505060405180910390fd5b6000613e1183611995565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613e8057508373ffffffffffffffffffffffffffffffffffffffff16613e688461109d565b73ffffffffffffffffffffffffffffffffffffffff16145b80613984575061398481856138ae565b8273ffffffffffffffffffffffffffffffffffffffff16613eb082611995565b73ffffffffffffffffffffffffffffffffffffffff1614613f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615220602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614e736027913960400191505060405180910390fd5b613f93600082613cfb565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600260205260409020613fc290826143eb565b5073ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020613ff290826143f7565b50613fff60038284614403565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006117a18383614426565b600080808061407b86866144a4565b9097909650945050505050565b8051611887906009906020840190614d61565b60006140a8848484614539565b90505b9392505050565b805161188790600a906020840190614d61565b6140d0848484613e90565b6140dc8484848461461d565b6114f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151eb6035913960400191505060405180910390fd5b80601161413d84611f47565b6040518082805190602001908083835b6020831061418a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490030190922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169315159390931790925550505050565b606081614248575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fe3565b8160005b811561426057600101600a8204915061424c565b60008167ffffffffffffffff8111801561427957600080fd5b506040519080825280601f01601f1916602001820160405280156142a4576020820181803683370190505b5085935090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561432b57600a840660300160f81b828280600190039350815181106142f157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506142ce565b50949350505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b60006117a1838361482d565b6143858383614845565b614392600084848461461d565b611634576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151eb6035913960400191505060405180910390fd5b5490565b60006117a183836149ac565b60006117a18383614a90565b60006140a8848473ffffffffffffffffffffffffffffffffffffffff8516614ada565b81546000908210614482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614dfa6022913960400191505060405180910390fd5b82600001828154811061449157fe5b9060005260206000200154905092915050565b815460009081908310614502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806151506022913960400191505060405180910390fd5b600084600001848154811061451357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816145ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145b357818101518382015260200161459b565b50505050905090810190601f1680156145e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061460157fe5b9060005260206000209060020201600101549150509392505050565b600061463e8473ffffffffffffffffffffffffffffffffffffffff16614b71565b61464a57506001613984565b60006147c27f150b7a0200000000000000000000000000000000000000000000000000000000614678613cf7565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156146f95781810151838201526020016146e1565b50505050905090810190601f1680156147265780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603581526020016151eb6035913973ffffffffffffffffffffffffffffffffffffffff88169190614b77565b905060008180602001905160208110156147db57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001492505050949350505050565b60009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff82166148b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806150a16023913960400191505060405180910390fd5b6148ba81613b34565b1561492657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f436f736d6f427567733a20746f6b656e20616c7265616479206d696e74656400604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902061495590826143f7565b5061496260038284614403565b50604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015614a865783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191908101906000908790839081106149fd57fe5b9060005260206000200154905080876000018481548110614a1a57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080614a4a57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506117a4565b60009150506117a4565b6000614a9c838361482d565b614ad2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556117a4565b5060006117a4565b600082815260018401602052604081205480614b3f5750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556140ab565b82856000016001830381548110614b5257fe5b90600052602060002090600202016001018190555060009150506140ab565b3b151590565b60606140a8848460008585614b8b85614b71565b614bf657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614c5f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614c22565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614cc1576040519150601f19603f3d011682016040523d82523d6000602084013e614cc6565b606091505b5091509150614cd6828286614ce1565b979650505050505050565b60608315614cf05750816140ab565b825115614d005782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156145b357818101518382015260200161459b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614d975760008555614ddd565b82601f10614db057805160ff1916838001178555614ddd565b82800160010185558215614ddd579182015b82811115614ddd578251825591602001919060010190614dc2565b506123089291505b808211156123085760008155600101614de556fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473436f736d6f427567733a2045746865722076616c75652073656e74206973206e6f7420636f7272656374436f736d6f427567733a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373436f736d6f427567733a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f736d6f427567733a2073616c652068617320616c726561647920656e646564436f736d6f427567733a206e756d6265724f664d61736b732063616e6e6f742062652030436f736d6f427567733a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c436f736d6f427567733a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a206e6577206e616d652069732073616d65206173207468652063757272656e74206f6e65436f736d6f427567733a20546865206c617374203130206d61736b732063616e206f6e6c792062652070757263686173656420666f7220455448436f736d6f427567733a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656430613033633033653336616133373537323238653964313835663739346632353935336336343331313063386262336562356566383932643036326230376162436f736d6f427567733a206d696e7420746f20746865207a65726f2061646472657373436f736d6f427567733a20596f75206d6179206e6f7420627579206d6f7265207468616e20323020436f736d6f42756773206174206f6e6365436f736d6f427567733a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f736d6f427567733a20617070726f76616c20746f2063757272656e74206f776e6572456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f736d6f427567733a205472616e7366657220434d5020616d6f756e74206578636565647320616c6c6f77616e6365436f736d6f427567733a207374617274696e6720696e64657820697320616c726561647920736574436f736d6f427567733a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572436f736d6f427567733a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e436f736d6f427567733a2063616c6c6572206973206e6f742074686520746f6b656e206f776e6572436f736d6f427567733a205472616e7366657220434f534d4f20616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bd43f78b6eb95fd273e7d2ff51855d7900c567ae0fd1d7470e67117b6ac5364f64736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d6319d0d2bc6d58066f61c1f82715564b31dd864000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _nftPowerAddress (address): 0xd6319D0d2Bc6D58066F61C1f82715564B31DD864
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d6319d0d2bc6d58066f61c1f82715564b31dd864
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.