ETH Price: $4,044.44 (+3.99%)

Token

Small Graffiti (SG)
 

Overview

Max Total Supply

5,555 SG

Holders

2,294

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SG
0x77866e760501dd543a7932dd3acda144768498aa
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:
SmallGraffiti

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 12: SmallGraffiti.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Ownable.sol";
import "./ERC721T.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";

contract SmallGraffiti is ERC721T, Ownable, ReentrancyGuard {
  using Strings for uint;


  /**
    * @dev Data structure of Moon
    */
  struct Moon {
    address owner;
    bool celestialType;
  }

  uint public MAX_SUPPLY   = 5555;
  uint public PRICE        = 0 ether;
  uint public MAX_QTY = 2;
  
  Moon[] public moons;

  bool public isMintActive = false;

  mapping(address => uint) private minted;

  mapping(address => uint) private _balances;
  string private _tokenURIPrefix="ipfs://Qmd82H1E7sBqvREn75TH64VnMPXeyr6H3XusSQ9gL61ctE/";
  string private _tokenURISuffix =  ".json";

  constructor() 
    ERC721T("Small Graffiti", "SG"){
  }
  
/**
  * @dev Returns the number of tokens in ``owners``'s account.
  */
  function balanceOf(address account) public view override returns (uint) {
    require(account != address(0), "Graffiti: balance query for the zero address");
    return _balances[account];
  }

/**
  * @dev Returns the bool of tokens if``owner``'s account contains the tokenIds.
  */
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool ){
    for(uint i; i < tokenIds.length; ++i ){
      if( moons[ tokenIds[i] ].owner != account )
        return false;
    }

    return true;
  }

/**
  * @dev Returns the owner of the `tokenId` token.
  *
  */
  function ownerOf( uint tokenId ) public override view returns( address owner_ ){
    address owner = moons[tokenId-1].owner;
    require(owner != address(0), "Graffiti: query for nonexistent token");
    return owner;
  }

/**
  * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
  * Use along with {totalSupply} to enumerate all tokens.
  */
  function tokenByIndex(uint index) external view returns (uint) {
    require(index <= totalSupply(), "Graffiti: global index out of bounds");
    return index;
  }

/**
  * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
  * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
  */
  function tokenOfOwnerByIndex(address owner, uint index) public view returns (uint tokenId) {
    uint count;
    for( uint i; i <= moons.length; ++i ){
      if( owner == moons[i].owner ){
        if( count == index )
          return i+1;
        else
          ++count;
      }
    }

    revert("ERC721Enumerable: owner index out of bounds");
  }

 /**
  * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
  */
  function tokenURI(uint tokenId) external view override returns (string memory) {
    require(_exists(tokenId), "Graffiti: URI query for nonexistent token");
    return string(abi.encodePacked(_tokenURIPrefix, tokenId.toString(), _tokenURISuffix));
  }

/**
  * @dev Returns the total amount of tokens stored by the contract.
  */
  function totalSupply() public view returns( uint totalSupply_ ){
    return moons.length;
  }



/**
  * @dev Returns the list of tokenIds stored by the owner's account.
  */
  function walletOfOwner( address account ) external view returns( uint[] memory ){
    uint quantity = balanceOf( account );
    uint[] memory wallet = new uint[]( quantity );
    for( uint i; i < quantity; ++i ){
        wallet[i] = tokenOfOwnerByIndex( account, i );
    }
    return wallet;
  }



 /**
  * @dev mints token based on the number of qty specified.
  */
  function mint( uint quantity ) external payable nonReentrant {
    require(isMintActive == true,"Graffiti: Minting needs to be enabled.");
    require(quantity + minted[msg.sender] <= MAX_QTY,"Graffiti:Quantity must be less than or equal MAX_QTY");
    require( msg.value >= PRICE , "Graffiti: Ether sent is not correct" );
    uint supply = totalSupply();
    require( supply + quantity <= MAX_SUPPLY, "Graffiti: Mint/order exceeds supply" );
    minted[msg.sender] += quantity;
    for(uint i; i < quantity; i++){
       uint tokenId =  ++supply ;
      _mint( msg.sender, tokenId );
    }
  }



/**
  * @dev Returns the balance amount of the Contract address.
  */
  function getBalanceofContract() external view returns (uint256) {
    return address(this).balance;
  }

/**
  * @dev Withdraws an amount from the contract balance.
  */
  function withdraw(uint256 amount_) public onlyOwner {
    require(address(this).balance >= amount_, "Address: insufficient balance");

    // This will payout the owner 100% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: amount_}("");
    require(os);
    // =============================================================================
  }


  /**
  * @dev Allows team to mint the token without restriction.
  */
  function team_mint(uint[] calldata quantity, address[] calldata recipient) public onlyOwner{
    require(quantity.length == recipient.length, "Graffiti: Must provide equal quantities and recipients" );

    uint totalQuantity;
    uint supply = totalSupply();
    for(uint i; i < quantity.length; ++i){
      totalQuantity += quantity[i];
    }
    require( supply + totalQuantity < MAX_SUPPLY, "Graffiti: Mint/order exceeds supply" );

    for(uint i; i < recipient.length; ++i){
      for(uint j; j < quantity[i]; ++j){
        uint tokenId = ++supply;
        _mint( recipient[i], tokenId);
      }
    }
  }

/**
  * @dev Owner/Delegate sets the Minting flag.
  */
  function setMintingActive(bool mintActive_) external onlyOwner {
    require( isMintActive != mintActive_ , "Graffiti: New value matches old" );
    isMintActive = mintActive_;
  }

/**
  * @dev Owner/Delegates sets the BaseURI of IPFS.
  */
  function setBaseURI(string calldata prefix, string calldata suffix) external onlyOwner{
    _tokenURIPrefix = prefix;
    _tokenURISuffix = suffix;
  }

/**
  * @dev Owner/Delegate sets the Max supply of the token.
  */
  function setMaxSupply(uint maxSupply) external onlyOwner{
    require( MAX_SUPPLY != maxSupply, "Graffiti: New value matches old" );
    require( maxSupply >= totalSupply(), "Graffiti: Specified supply is lower than current balance" );
    MAX_SUPPLY = maxSupply;
  }

/**
  * @dev Owner/Delegate sets the Max. qty 
  */
  function setMaxQty(uint maxQty) external onlyOwner{
    require( MAX_QTY != maxQty, "Graffiti: New value matches old" );
    MAX_QTY = maxQty;
  }

/**
  * @dev Owner/Delegate sets the minting price.
  */
  function setPrice(uint price) external onlyOwner{
    require( PRICE != price, "Graffiti: New value matches old" );
    PRICE = price;
  }

/**
  * @dev increment and decrement balances based on address from and  to.
  */
  function _beforeTokenTransfer(address from, address to) internal {
    if( from != address(0) )
      --_balances[ from ];

    if( to != address(0) )
      ++_balances[ to ];
  }

/**
  * @dev returns bool if the tokenId exist.
  */
  function _exists(uint tokenId) internal view override returns (bool) {
    return tokenId>0 && tokenId <= moons.length && moons[tokenId-1].owner != address(0);
  }

/**
  * @dev mints token based address and tokenId
  */
  function _mint(address to, uint tokenId) internal {
    _beforeTokenTransfer(address(0), to);
    moons.push(Moon(to,false));
    emit Transfer(address(0), to, tokenId);
  }

/**
    * @dev update the moon type.
    */
  function updateMoontype(bool moonType, uint[] calldata tokenIds ) external onlyOwner {
        //update logic to update the MoonType
        for(uint i=0; i < tokenIds.length; i++) {
            require(_exists(tokenIds[i]), "Graffiti: TokenId not exist");
            moons[tokenIds[i]-1].celestialType = moonType;
        }
  }

/**
  * @dev returns the moontypes based on the tokenIds.
  */
  function getMoonType(uint[] calldata tokenIds) external view returns(bool[] memory moonTypes) {
      // return moontype true/false
      bool[] memory _moonTypes = new bool[](tokenIds.length);
      for(uint i; i < tokenIds.length; i++) {
        _moonTypes[i] = moons[tokenIds[i]-1].celestialType;
      }
      return _moonTypes;
  }

/**
  * @dev transfer tokenId to other address.
  */
  function _transfer(address from, address to, uint tokenId) internal override {
    require(moons[tokenId-1].owner == from, "Graffiti: transfer of token that is not owned");

    // Clear approvals from the previous owner
    _approve(address(0), tokenId);
    _beforeTokenTransfer(from, to);

    moons[tokenId-1].owner = to;
    emit Transfer(from, to, tokenId);
  }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 12: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 12: ERC721T.sol
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity ^0.8.0;

/****************************************
 * @author: squeebo_nft                 *
 * @team:   GoldenX                     *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

abstract contract ERC721T is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    string private _name;
    string private _symbol;

    mapping(uint => address) internal _tokenApprovals;
    mapping(address => mapping(address => bool)) internal _operatorApprovals;

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

    //public
    function balanceOf(address owner) public view virtual override returns( uint );

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

    function ownerOf(uint tokenId) public view virtual override returns (address);

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /*
    function totalSupply() public view virtual returns (uint) {
        return _owners.length - (_offset + _burned);
    }
    */


    function approve(address to, uint tokenId) external virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

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

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

    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId
    ) external virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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


    //internal
    function _approve(address to, uint tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _exists(uint tokenId) internal view virtual returns (bool);

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

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

    function _transfer(address from, address to, uint tokenId) internal virtual;
}

File 5 of 12: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 of 12: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 7 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 8 of 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}   

File 9 of 12: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 10 of 12: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 12 of 12: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_QTY","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":"PRICE","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceofContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getMoonType","outputs":[{"internalType":"bool[]","name":"moonTypes","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"moons","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"celestialType","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner_","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":"prefix","type":"string"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxQty","type":"uint256"}],"name":"setMaxQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"mintActive_","type":"bool"}],"name":"setMintingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"team_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":"totalSupply_","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":"bool","name":"moonType","type":"bool"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"updateMoontype","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6115b360065560006007556002600855600a805460ff1916905560e06040526036608081815290620032f760a03980516200004391600d9160209091019062000165565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200007291600e9162000165565b503480156200008057600080fd5b50604080518082018252600e81526d536d616c6c20477261666669746960901b602080830191825283518085019094526002845261534760f01b908401528151919291620000d19160009162000165565b508051620000e790600190602084019062000165565b50505062000104620000fe6200010f60201b60201c565b62000113565b600160055562000248565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000173906200020b565b90600052602060002090601f016020900481019282620001975760008555620001e2565b82601f10620001b257805160ff1916838001178555620001e2565b82800160010185558215620001e2579182015b82811115620001e2578251825591602001919060010190620001c5565b50620001f0929150620001f4565b5090565b5b80821115620001f05760008155600101620001f5565b6002810460018216806200022057607f821691505b602082108114156200024257634e487b7160e01b600052602260045260246000fd5b50919050565b61309f80620002586000396000f3fe60806040526004361061026a5760003560e01c80636352211e1161015357806395d89b41116100cb578063b88d4fde1161007f578063d04ef28511610064578063d04ef2851461069b578063e985e9c5146106bb578063f2fde38b146106db5761026a565b8063b88d4fde1461065b578063c87b56dd1461067b5761026a565b8063a22cb465116100b0578063a22cb465146105ee578063aae4ff941461060e578063abe8d6201461063b5761026a565b806395d89b41146105c6578063a0712d68146105db5761026a565b8063715018a6116101225780638d859f3e116101075780638d859f3e1461057c5780638da5cb5b1461059157806391b7f5ed146105a65761026a565b8063715018a6146105475780637c0ba74f1461055c5761026a565b80636352211e146104c75780636790a9de146104e75780636f8b44b01461050757806370a08231146105275761026a565b80632f745c59116101e65780634d44660c116101b55780634f6ccce71161019a5780634f6ccce71461047d5780635b92ac0d1461049d5780635ecc0222146104b25761026a565b80634d44660c1461042f5780634ee6bb231461044f5761026a565b80632f745c59146103ad57806332cb6b0c146103cd57806342842e0e146103e2578063438b6300146104025761026a565b806318160ddd1161023d57806323b872dd1161022257806323b872dd1461034d578063272ff2481461036d5780632e1a7d4d1461038d5761026a565b806318160ddd146103165780631c96cae9146103385761026a565b806301ffc9a71461026f57806306fdde03146102a5578063081812fc146102c7578063095ea7b3146102f4575b600080fd5b34801561027b57600080fd5b5061028f61028a36600461239f565b6106fb565b60405161029c919061266b565b60405180910390f35b3480156102b157600080fd5b506102ba6107a5565b60405161029c9190612676565b3480156102d357600080fd5b506102e76102e2366004612434565b610837565b60405161029c9190612582565b34801561030057600080fd5b5061031461030f366004612296565b610883565b005b34801561032257600080fd5b5061032b61091b565b60405161029c9190612eb8565b34801561034457600080fd5b5061032b610921565b34801561035957600080fd5b506103146103683660046120f7565b610927565b34801561037957600080fd5b50610314610388366004612434565b61095f565b34801561039957600080fd5b506103146103a8366004612434565b6109c5565b3480156103b957600080fd5b5061032b6103c8366004612296565b610a98565b3480156103d957600080fd5b5061032b610b3e565b3480156103ee57600080fd5b506103146103fd3660046120f7565b610b44565b34801561040e57600080fd5b5061042261041d3660046120ab565b610b5f565b60405161029c9190612633565b34801561043b57600080fd5b5061028f61044a36600461221c565b610c1b565b34801561045b57600080fd5b5061046f61046a366004612434565b610cb9565b60405161029c9291906125d2565b34801561048957600080fd5b5061032b610498366004612434565b610cff565b3480156104a957600080fd5b5061028f610d2c565b3480156104be57600080fd5b5061032b610d35565b3480156104d357600080fd5b506102e76104e2366004612434565b610d39565b3480156104f357600080fd5b506103146105023660046123d7565b610d9b565b34801561051357600080fd5b50610314610522366004612434565b610dfa565b34801561053357600080fd5b5061032b6105423660046120ab565b610e87565b34801561055357600080fd5b50610314610ecb565b34801561056857600080fd5b506103146105773660046122ff565b610f16565b34801561058857600080fd5b5061032b6110b0565b34801561059d57600080fd5b506102e76110b6565b3480156105b257600080fd5b506103146105c1366004612434565b6110c5565b3480156105d257600080fd5b506102ba61112b565b6103146105e9366004612434565b61113a565b3480156105fa57600080fd5b5061031461060936600461226d565b611285565b34801561061a57600080fd5b5061062e6106293660046122bf565b611371565b60405161029c91906125ed565b34801561064757600080fd5b50610314610656366004612382565b611483565b34801561066757600080fd5b50610314610676366004612132565b6115d5565b34801561068757600080fd5b506102ba610696366004612434565b61160e565b3480156106a757600080fd5b506103146106b6366004612368565b61166a565b3480156106c757600080fd5b5061028f6106d63660046120c5565b611703565b3480156106e757600080fd5b506103146106f63660046120ab565b611731565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061078e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079d575061079d826117a2565b90505b919050565b6060600080546107b490612f71565b80601f01602080910402602001604051908101604052809291908181526020018280546107e090612f71565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826117ec565b6108675760405162461bcd60e51b815260040161085e90612b64565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b600061088e82610d39565b9050806001600160a01b0316836001600160a01b031614156108c25760405162461bcd60e51b815260040161085e90612cb0565b806001600160a01b03166108d4611850565b6001600160a01b031614806108f057506108f0816106d6611850565b61090c5760405162461bcd60e51b815260040161085e90612b07565b6109168383611854565b505050565b60095490565b60085481565b610938610932611850565b826118da565b6109545760405162461bcd60e51b815260040161085e90612d0d565b61091683838361195f565b610967611850565b6001600160a01b03166109786110b6565b6001600160a01b03161461099e5760405162461bcd60e51b815260040161085e90612c1e565b8060085414156109c05760405162461bcd60e51b815260040161085e90612ad0565b600855565b6109cd611850565b6001600160a01b03166109de6110b6565b6001600160a01b031614610a045760405162461bcd60e51b815260040161085e90612c1e565b80471015610a245760405162461bcd60e51b815260040161085e90612925565b6000610a2e6110b6565b6001600160a01b031682604051610a449061257f565b60006040518083038185875af1925050503d8060008114610a81576040519150601f19603f3d011682016040523d82523d6000602084013e610a86565b606091505b5050905080610a9457600080fd5b5050565b60008060005b6009548111610b1f5760098181548110610ac857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610b0f5783821415610b0357610afa816001612ecd565b92505050610b38565b610b0c82612fac565b91505b610b1881612fac565b9050610a9e565b5060405162461bcd60e51b815260040161085e906126e6565b92915050565b60065481565b610916838383604051806020016040528060008152506115d5565b60606000610b6c83610e87565b905060008167ffffffffffffffff811115610b9757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bc0578160200160208202803683370190505b50905060005b82811015610c1357610bd88582610a98565b828281518110610bf857634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610c0c81612fac565b9050610bc6565b509392505050565b6000805b82811015610cac57846001600160a01b03166009858584818110610c5357634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610c7857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614610c9c576000915050610cb2565b610ca581612fac565b9050610c1f565b50600190505b9392505050565b60098181548110610cc957600080fd5b6000918252602090912001546001600160a01b038116915074010000000000000000000000000000000000000000900460ff1682565b6000610d0961091b565b821115610d285760405162461bcd60e51b815260040161085e90612d6a565b5090565b600a5460ff1681565b4790565b6000806009610d49600185612ef9565b81548110610d6757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690508061079d5760405162461bcd60e51b815260040161085e90612bc1565b610da3611850565b6001600160a01b0316610db46110b6565b6001600160a01b031614610dda5760405162461bcd60e51b815260040161085e90612c1e565b610de6600d8585611f4d565b50610df3600e8383611f4d565b5050505050565b610e02611850565b6001600160a01b0316610e136110b6565b6001600160a01b031614610e395760405162461bcd60e51b815260040161085e90612c1e565b806006541415610e5b5760405162461bcd60e51b815260040161085e90612ad0565b610e6361091b565b811015610e825760405162461bcd60e51b815260040161085e90612689565b600655565b60006001600160a01b038216610eaf5760405162461bcd60e51b815260040161085e90612a16565b506001600160a01b03166000908152600c602052604090205490565b610ed3611850565b6001600160a01b0316610ee46110b6565b6001600160a01b031614610f0a5760405162461bcd60e51b815260040161085e90612c1e565b610f146000611a79565b565b610f1e611850565b6001600160a01b0316610f2f6110b6565b6001600160a01b031614610f555760405162461bcd60e51b815260040161085e90612c1e565b828114610f745760405162461bcd60e51b815260040161085e906128c8565b600080610f7f61091b565b905060005b85811015610fd057868682818110610fac57634e487b7160e01b600052603260045260246000fd5b9050602002013583610fbe9190612ecd565b9250610fc981612fac565b9050610f84565b50600654610fde8383612ecd565b10610ffb5760405162461bcd60e51b815260040161085e90612c53565b60005b838110156110a75760005b87878381811061102957634e487b7160e01b600052603260045260246000fd5b9050602002013581101561109657600061104284612fac565b935083905061108587878581811061106a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061107f91906120ab565b82611ae3565b5061108f81612fac565b9050611009565b506110a081612fac565b9050610ffe565b50505050505050565b60075481565b6004546001600160a01b031690565b6110cd611850565b6001600160a01b03166110de6110b6565b6001600160a01b0316146111045760405162461bcd60e51b815260040161085e90612c1e565b8060075414156111265760405162461bcd60e51b815260040161085e90612ad0565b600755565b6060600180546107b490612f71565b6002600554141561115d5760405162461bcd60e51b815260040161085e90612e24565b6002600555600a5460ff1615156001146111895760405162461bcd60e51b815260040161085e90612a73565b600854336000908152600b60205260409020546111a69083612ecd565b11156111c45760405162461bcd60e51b815260040161085e906129b9565b6007543410156111e65760405162461bcd60e51b815260040161085e90612dc7565b60006111f061091b565b6006549091506112008383612ecd565b111561121e5760405162461bcd60e51b815260040161085e90612c53565b336000908152600b60205260408120805484929061123d908490612ecd565b90915550600090505b8281101561127b57600061125983612fac565b92508290506112683382611ae3565b508061127381612fac565b915050611246565b5050600160055550565b61128d611850565b6001600160a01b0316826001600160a01b031614156112be5760405162461bcd60e51b815260040161085e90612891565b80600360006112cb611850565b6001600160a01b0390811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915561132d611850565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611365919061266b565b60405180910390a35050565b606060008267ffffffffffffffff81111561139c57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113c5578160200160208202803683370190505b50905060005b83811015610c1357600960018686848181106113f757634e487b7160e01b600052603260045260246000fd5b905060200201356114089190612ef9565b8154811061142657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160149054906101000a900460ff1682828151811061146157634e487b7160e01b600052603260045260246000fd5b911515602092830291909101909101528061147b81612fac565b9150506113cb565b61148b611850565b6001600160a01b031661149c6110b6565b6001600160a01b0316146114c25760405162461bcd60e51b815260040161085e90612c1e565b60005b818110156115cf576114fc8383838181106114f057634e487b7160e01b600052603260045260246000fd5b905060200201356117ec565b6115185760405162461bcd60e51b815260040161085e906127fd565b836009600185858581811061153d57634e487b7160e01b600052603260045260246000fd5b9050602002013561154e9190612ef9565b8154811061156c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055806115c781612fac565b9150506114c5565b50505050565b6115e66115e0611850565b836118da565b6116025760405162461bcd60e51b815260040161085e90612d0d565b6115cf84848484611be4565b6060611619826117ec565b6116355760405162461bcd60e51b815260040161085e90612834565b600d61164083611c17565b600e6040516020016116549392919061254c565b6040516020818303038152906040529050919050565b611672611850565b6001600160a01b03166116836110b6565b6001600160a01b0316146116a95760405162461bcd60e51b815260040161085e90612c1e565b600a5460ff16151581151514156116d25760405162461bcd60e51b815260040161085e90612ad0565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b611739611850565b6001600160a01b031661174a6110b6565b6001600160a01b0316146117705760405162461bcd60e51b815260040161085e90612c1e565b6001600160a01b0381166117965760405162461bcd60e51b815260040161085e906127a0565b61179f81611a79565b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b600080821180156117ff57506009548211155b801561079d575060006009611815600185612ef9565b8154811061183357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b3390565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906118a182610d39565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118e5826117ec565b6119015760405162461bcd60e51b815260040161085e9061295c565b600061190c83610d39565b9050806001600160a01b0316846001600160a01b031614806119475750836001600160a01b031661193c84610837565b6001600160a01b0316145b8061195757506119578185611703565b949350505050565b6001600160a01b0383166009611976600184612ef9565b8154811061199457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146119c65760405162461bcd60e51b815260040161085e90612e5b565b6119d1600082611854565b6119db8383611d66565b8160096119e9600184612ef9565b81548110611a0757634e487b7160e01b600052603260045260246000fd5b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611aee600083611d66565b6040805180820182526001600160a01b038085168083526000602084018181526009805460018101825590835294517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90950180549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff969095167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117949094169290921790925591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611bef84848461195f565b611bfb84848484611ddd565b6115cf5760405162461bcd60e51b815260040161085e90612743565b606081611c58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526107a0565b8160005b8115611c825780611c6c81612fac565b9150611c7b9050600a83612ee5565b9150611c5c565b60008167ffffffffffffffff811115611cab57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cd5576020820181803683370190505b5090505b841561195757611cea600183612ef9565b9150611cf7600a86612fe5565b611d02906030612ecd565b60f81b818381518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d5f600a86612ee5565b9450611cd9565b6001600160a01b03821615611da0576001600160a01b0382166000908152600c602052604081208054909190611d9b90612f3c565b909155505b6001600160a01b03811615610a94576001600160a01b0381166000908152600c602052604081208054909190611dd590612fac565b909155505050565b6000611df1846001600160a01b0316611f47565b15611f3c57836001600160a01b031663150b7a02611e0d611850565b8786866040518563ffffffff1660e01b8152600401611e2f9493929190612596565b602060405180830381600087803b158015611e4957600080fd5b505af1925050508015611e97575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e94918101906123bb565b60015b611ef1573d808015611ec5576040519150601f19603f3d011682016040523d82523d6000602084013e611eca565b606091505b508051611ee95760405162461bcd60e51b815260040161085e90612743565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611957565b506001949350505050565b3b151590565b828054611f5990612f71565b90600052602060002090601f016020900481019282611f7b5760008555611fdf565b82601f10611fb2578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611fdf565b82800160010185558215611fdf579182015b82811115611fdf578235825591602001919060010190611fc4565b50610d289291505b80821115610d285760008155600101611fe7565b80356001600160a01b03811681146107a057600080fd5b60008083601f840112612023578081fd5b50813567ffffffffffffffff81111561203a578182fd5b602083019150836020808302850101111561205457600080fd5b9250929050565b803580151581146107a057600080fd5b60008083601f84011261207c578182fd5b50813567ffffffffffffffff811115612093578182fd5b60208301915083602082850101111561205457600080fd5b6000602082840312156120bc578081fd5b610cb282611ffb565b600080604083850312156120d7578081fd5b6120e083611ffb565b91506120ee60208401611ffb565b90509250929050565b60008060006060848603121561210b578081fd5b61211484611ffb565b925061212260208501611ffb565b9150604084013590509250925092565b60008060008060808587031215612147578081fd5b61215085611ffb565b9350602061215f818701611ffb565b935060408601359250606086013567ffffffffffffffff80821115612182578384fd5b818801915088601f830112612195578384fd5b8135818111156121a7576121a7613025565b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156121e8576121e8613025565b60405281815283820185018b10156121fe578586fd5b81858501868301379081019093019390935250939692955090935050565b600080600060408486031215612230578283fd5b61223984611ffb565b9250602084013567ffffffffffffffff811115612254578283fd5b61226086828701612012565b9497909650939450505050565b6000806040838503121561227f578182fd5b61228883611ffb565b91506120ee6020840161205b565b600080604083850312156122a8578182fd5b6122b183611ffb565b946020939093013593505050565b600080602083850312156122d1578182fd5b823567ffffffffffffffff8111156122e7578283fd5b6122f385828601612012565b90969095509350505050565b60008060008060408587031215612314578384fd5b843567ffffffffffffffff8082111561232b578586fd5b61233788838901612012565b9096509450602087013591508082111561234f578384fd5b5061235c87828801612012565b95989497509550505050565b600060208284031215612379578081fd5b610cb28261205b565b600080600060408486031215612396578283fd5b6122398461205b565b6000602082840312156123b0578081fd5b8135610cb28161303b565b6000602082840312156123cc578081fd5b8151610cb28161303b565b600080600080604085870312156123ec578182fd5b843567ffffffffffffffff80821115612403578384fd5b61240f8883890161206b565b90965094506020870135915080821115612427578384fd5b5061235c8782880161206b565b600060208284031215612445578081fd5b5035919050565b60008151808452612464816020860160208601612f10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600281046001808316806124b057607f831692505b60208084108214156124d057634e487b7160e01b86526022600452602486fd5b8180156124e4576001811461251357612540565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612540565b61251c88612ec1565b60005b868110156125385781548b82015290850190830161251f565b505084890196505b50505050505092915050565b60006125588286612496565b8451612568818360208901612f10565b61257481830186612496565b979650505050505050565b90565b6001600160a01b0391909116815260200190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125c8608083018461244c565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612627578351151583529284019291840191600101612609565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156126275783518352928401929184019160010161264f565b901515815260200190565b600060208252610cb2602083018461244c565b60208082526038908201527f47726166666974693a2053706563696669656420737570706c79206973206c6f60408201527f776572207468616e2063757272656e742062616c616e63650000000000000000606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f47726166666974693a20546f6b656e4964206e6f742065786973740000000000604082015260600190565b60208082526029908201527f47726166666974693a2055524920717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526036908201527f47726166666974693a204d7573742070726f7669646520657175616c2071756160408201527f6e74697469657320616e6420726563697069656e747300000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526034908201527f47726166666974693a5175616e74697479206d757374206265206c657373207460408201527f68616e206f7220657175616c204d41585f515459000000000000000000000000606082015260800190565b6020808252602c908201527f47726166666974693a2062616c616e636520717565727920666f72207468652060408201527f7a65726f20616464726573730000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f47726166666974693a204d696e74696e67206e6565647320746f20626520656e60408201527f61626c65642e0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f47726166666974693a204e65772076616c7565206d617463686573206f6c6400604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f47726166666974693a20717565727920666f72206e6f6e6578697374656e742060408201527f746f6b656e000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f47726166666974693a204d696e742f6f7264657220657863656564732073757060408201527f706c790000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60208082526024908201527f47726166666974693a20676c6f62616c20696e646578206f7574206f6620626f60408201527f756e647300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f47726166666974693a2045746865722073656e74206973206e6f7420636f727260408201527f6563740000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602d908201527f47726166666974693a207472616e73666572206f6620746f6b656e207468617460408201527f206973206e6f74206f776e656400000000000000000000000000000000000000606082015260800190565b90815260200190565b60009081526020902090565b60008219821115612ee057612ee0612ff9565b500190565b600082612ef457612ef461300f565b500490565b600082821015612f0b57612f0b612ff9565b500390565b60005b83811015612f2b578181015183820152602001612f13565b838111156115cf5750506000910152565b600081612f4b57612f4b612ff9565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600281046001821680612f8557607f821691505b60208210811415612fa657634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fde57612fde612ff9565b5060010190565b600082612ff457612ff461300f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461179f57600080fdfea26469706673582212206f1947273b3d24531b36a3d3c135d38dac3791c7ea92e9dde0d103b14816361364736f6c63430008000033697066733a2f2f516d643832483145377342717652456e373554483634566e4d5058657972364833587573535139674c36316374452f

Deployed Bytecode

0x60806040526004361061026a5760003560e01c80636352211e1161015357806395d89b41116100cb578063b88d4fde1161007f578063d04ef28511610064578063d04ef2851461069b578063e985e9c5146106bb578063f2fde38b146106db5761026a565b8063b88d4fde1461065b578063c87b56dd1461067b5761026a565b8063a22cb465116100b0578063a22cb465146105ee578063aae4ff941461060e578063abe8d6201461063b5761026a565b806395d89b41146105c6578063a0712d68146105db5761026a565b8063715018a6116101225780638d859f3e116101075780638d859f3e1461057c5780638da5cb5b1461059157806391b7f5ed146105a65761026a565b8063715018a6146105475780637c0ba74f1461055c5761026a565b80636352211e146104c75780636790a9de146104e75780636f8b44b01461050757806370a08231146105275761026a565b80632f745c59116101e65780634d44660c116101b55780634f6ccce71161019a5780634f6ccce71461047d5780635b92ac0d1461049d5780635ecc0222146104b25761026a565b80634d44660c1461042f5780634ee6bb231461044f5761026a565b80632f745c59146103ad57806332cb6b0c146103cd57806342842e0e146103e2578063438b6300146104025761026a565b806318160ddd1161023d57806323b872dd1161022257806323b872dd1461034d578063272ff2481461036d5780632e1a7d4d1461038d5761026a565b806318160ddd146103165780631c96cae9146103385761026a565b806301ffc9a71461026f57806306fdde03146102a5578063081812fc146102c7578063095ea7b3146102f4575b600080fd5b34801561027b57600080fd5b5061028f61028a36600461239f565b6106fb565b60405161029c919061266b565b60405180910390f35b3480156102b157600080fd5b506102ba6107a5565b60405161029c9190612676565b3480156102d357600080fd5b506102e76102e2366004612434565b610837565b60405161029c9190612582565b34801561030057600080fd5b5061031461030f366004612296565b610883565b005b34801561032257600080fd5b5061032b61091b565b60405161029c9190612eb8565b34801561034457600080fd5b5061032b610921565b34801561035957600080fd5b506103146103683660046120f7565b610927565b34801561037957600080fd5b50610314610388366004612434565b61095f565b34801561039957600080fd5b506103146103a8366004612434565b6109c5565b3480156103b957600080fd5b5061032b6103c8366004612296565b610a98565b3480156103d957600080fd5b5061032b610b3e565b3480156103ee57600080fd5b506103146103fd3660046120f7565b610b44565b34801561040e57600080fd5b5061042261041d3660046120ab565b610b5f565b60405161029c9190612633565b34801561043b57600080fd5b5061028f61044a36600461221c565b610c1b565b34801561045b57600080fd5b5061046f61046a366004612434565b610cb9565b60405161029c9291906125d2565b34801561048957600080fd5b5061032b610498366004612434565b610cff565b3480156104a957600080fd5b5061028f610d2c565b3480156104be57600080fd5b5061032b610d35565b3480156104d357600080fd5b506102e76104e2366004612434565b610d39565b3480156104f357600080fd5b506103146105023660046123d7565b610d9b565b34801561051357600080fd5b50610314610522366004612434565b610dfa565b34801561053357600080fd5b5061032b6105423660046120ab565b610e87565b34801561055357600080fd5b50610314610ecb565b34801561056857600080fd5b506103146105773660046122ff565b610f16565b34801561058857600080fd5b5061032b6110b0565b34801561059d57600080fd5b506102e76110b6565b3480156105b257600080fd5b506103146105c1366004612434565b6110c5565b3480156105d257600080fd5b506102ba61112b565b6103146105e9366004612434565b61113a565b3480156105fa57600080fd5b5061031461060936600461226d565b611285565b34801561061a57600080fd5b5061062e6106293660046122bf565b611371565b60405161029c91906125ed565b34801561064757600080fd5b50610314610656366004612382565b611483565b34801561066757600080fd5b50610314610676366004612132565b6115d5565b34801561068757600080fd5b506102ba610696366004612434565b61160e565b3480156106a757600080fd5b506103146106b6366004612368565b61166a565b3480156106c757600080fd5b5061028f6106d63660046120c5565b611703565b3480156106e757600080fd5b506103146106f63660046120ab565b611731565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061078e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079d575061079d826117a2565b90505b919050565b6060600080546107b490612f71565b80601f01602080910402602001604051908101604052809291908181526020018280546107e090612f71565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826117ec565b6108675760405162461bcd60e51b815260040161085e90612b64565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b600061088e82610d39565b9050806001600160a01b0316836001600160a01b031614156108c25760405162461bcd60e51b815260040161085e90612cb0565b806001600160a01b03166108d4611850565b6001600160a01b031614806108f057506108f0816106d6611850565b61090c5760405162461bcd60e51b815260040161085e90612b07565b6109168383611854565b505050565b60095490565b60085481565b610938610932611850565b826118da565b6109545760405162461bcd60e51b815260040161085e90612d0d565b61091683838361195f565b610967611850565b6001600160a01b03166109786110b6565b6001600160a01b03161461099e5760405162461bcd60e51b815260040161085e90612c1e565b8060085414156109c05760405162461bcd60e51b815260040161085e90612ad0565b600855565b6109cd611850565b6001600160a01b03166109de6110b6565b6001600160a01b031614610a045760405162461bcd60e51b815260040161085e90612c1e565b80471015610a245760405162461bcd60e51b815260040161085e90612925565b6000610a2e6110b6565b6001600160a01b031682604051610a449061257f565b60006040518083038185875af1925050503d8060008114610a81576040519150601f19603f3d011682016040523d82523d6000602084013e610a86565b606091505b5050905080610a9457600080fd5b5050565b60008060005b6009548111610b1f5760098181548110610ac857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610b0f5783821415610b0357610afa816001612ecd565b92505050610b38565b610b0c82612fac565b91505b610b1881612fac565b9050610a9e565b5060405162461bcd60e51b815260040161085e906126e6565b92915050565b60065481565b610916838383604051806020016040528060008152506115d5565b60606000610b6c83610e87565b905060008167ffffffffffffffff811115610b9757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bc0578160200160208202803683370190505b50905060005b82811015610c1357610bd88582610a98565b828281518110610bf857634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610c0c81612fac565b9050610bc6565b509392505050565b6000805b82811015610cac57846001600160a01b03166009858584818110610c5357634e487b7160e01b600052603260045260246000fd5b9050602002013581548110610c7857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614610c9c576000915050610cb2565b610ca581612fac565b9050610c1f565b50600190505b9392505050565b60098181548110610cc957600080fd5b6000918252602090912001546001600160a01b038116915074010000000000000000000000000000000000000000900460ff1682565b6000610d0961091b565b821115610d285760405162461bcd60e51b815260040161085e90612d6a565b5090565b600a5460ff1681565b4790565b6000806009610d49600185612ef9565b81548110610d6757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031690508061079d5760405162461bcd60e51b815260040161085e90612bc1565b610da3611850565b6001600160a01b0316610db46110b6565b6001600160a01b031614610dda5760405162461bcd60e51b815260040161085e90612c1e565b610de6600d8585611f4d565b50610df3600e8383611f4d565b5050505050565b610e02611850565b6001600160a01b0316610e136110b6565b6001600160a01b031614610e395760405162461bcd60e51b815260040161085e90612c1e565b806006541415610e5b5760405162461bcd60e51b815260040161085e90612ad0565b610e6361091b565b811015610e825760405162461bcd60e51b815260040161085e90612689565b600655565b60006001600160a01b038216610eaf5760405162461bcd60e51b815260040161085e90612a16565b506001600160a01b03166000908152600c602052604090205490565b610ed3611850565b6001600160a01b0316610ee46110b6565b6001600160a01b031614610f0a5760405162461bcd60e51b815260040161085e90612c1e565b610f146000611a79565b565b610f1e611850565b6001600160a01b0316610f2f6110b6565b6001600160a01b031614610f555760405162461bcd60e51b815260040161085e90612c1e565b828114610f745760405162461bcd60e51b815260040161085e906128c8565b600080610f7f61091b565b905060005b85811015610fd057868682818110610fac57634e487b7160e01b600052603260045260246000fd5b9050602002013583610fbe9190612ecd565b9250610fc981612fac565b9050610f84565b50600654610fde8383612ecd565b10610ffb5760405162461bcd60e51b815260040161085e90612c53565b60005b838110156110a75760005b87878381811061102957634e487b7160e01b600052603260045260246000fd5b9050602002013581101561109657600061104284612fac565b935083905061108587878581811061106a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061107f91906120ab565b82611ae3565b5061108f81612fac565b9050611009565b506110a081612fac565b9050610ffe565b50505050505050565b60075481565b6004546001600160a01b031690565b6110cd611850565b6001600160a01b03166110de6110b6565b6001600160a01b0316146111045760405162461bcd60e51b815260040161085e90612c1e565b8060075414156111265760405162461bcd60e51b815260040161085e90612ad0565b600755565b6060600180546107b490612f71565b6002600554141561115d5760405162461bcd60e51b815260040161085e90612e24565b6002600555600a5460ff1615156001146111895760405162461bcd60e51b815260040161085e90612a73565b600854336000908152600b60205260409020546111a69083612ecd565b11156111c45760405162461bcd60e51b815260040161085e906129b9565b6007543410156111e65760405162461bcd60e51b815260040161085e90612dc7565b60006111f061091b565b6006549091506112008383612ecd565b111561121e5760405162461bcd60e51b815260040161085e90612c53565b336000908152600b60205260408120805484929061123d908490612ecd565b90915550600090505b8281101561127b57600061125983612fac565b92508290506112683382611ae3565b508061127381612fac565b915050611246565b5050600160055550565b61128d611850565b6001600160a01b0316826001600160a01b031614156112be5760405162461bcd60e51b815260040161085e90612891565b80600360006112cb611850565b6001600160a01b0390811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915561132d611850565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611365919061266b565b60405180910390a35050565b606060008267ffffffffffffffff81111561139c57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113c5578160200160208202803683370190505b50905060005b83811015610c1357600960018686848181106113f757634e487b7160e01b600052603260045260246000fd5b905060200201356114089190612ef9565b8154811061142657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160149054906101000a900460ff1682828151811061146157634e487b7160e01b600052603260045260246000fd5b911515602092830291909101909101528061147b81612fac565b9150506113cb565b61148b611850565b6001600160a01b031661149c6110b6565b6001600160a01b0316146114c25760405162461bcd60e51b815260040161085e90612c1e565b60005b818110156115cf576114fc8383838181106114f057634e487b7160e01b600052603260045260246000fd5b905060200201356117ec565b6115185760405162461bcd60e51b815260040161085e906127fd565b836009600185858581811061153d57634e487b7160e01b600052603260045260246000fd5b9050602002013561154e9190612ef9565b8154811061156c57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055806115c781612fac565b9150506114c5565b50505050565b6115e66115e0611850565b836118da565b6116025760405162461bcd60e51b815260040161085e90612d0d565b6115cf84848484611be4565b6060611619826117ec565b6116355760405162461bcd60e51b815260040161085e90612834565b600d61164083611c17565b600e6040516020016116549392919061254c565b6040516020818303038152906040529050919050565b611672611850565b6001600160a01b03166116836110b6565b6001600160a01b0316146116a95760405162461bcd60e51b815260040161085e90612c1e565b600a5460ff16151581151514156116d25760405162461bcd60e51b815260040161085e90612ad0565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b611739611850565b6001600160a01b031661174a6110b6565b6001600160a01b0316146117705760405162461bcd60e51b815260040161085e90612c1e565b6001600160a01b0381166117965760405162461bcd60e51b815260040161085e906127a0565b61179f81611a79565b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b600080821180156117ff57506009548211155b801561079d575060006009611815600185612ef9565b8154811061183357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b3390565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906118a182610d39565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118e5826117ec565b6119015760405162461bcd60e51b815260040161085e9061295c565b600061190c83610d39565b9050806001600160a01b0316846001600160a01b031614806119475750836001600160a01b031661193c84610837565b6001600160a01b0316145b8061195757506119578185611703565b949350505050565b6001600160a01b0383166009611976600184612ef9565b8154811061199457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146119c65760405162461bcd60e51b815260040161085e90612e5b565b6119d1600082611854565b6119db8383611d66565b8160096119e9600184612ef9565b81548110611a0757634e487b7160e01b600052603260045260246000fd5b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611aee600083611d66565b6040805180820182526001600160a01b038085168083526000602084018181526009805460018101825590835294517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90950180549151151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff969095167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117949094169290921790925591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611bef84848461195f565b611bfb84848484611ddd565b6115cf5760405162461bcd60e51b815260040161085e90612743565b606081611c58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526107a0565b8160005b8115611c825780611c6c81612fac565b9150611c7b9050600a83612ee5565b9150611c5c565b60008167ffffffffffffffff811115611cab57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611cd5576020820181803683370190505b5090505b841561195757611cea600183612ef9565b9150611cf7600a86612fe5565b611d02906030612ecd565b60f81b818381518110611d2557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d5f600a86612ee5565b9450611cd9565b6001600160a01b03821615611da0576001600160a01b0382166000908152600c602052604081208054909190611d9b90612f3c565b909155505b6001600160a01b03811615610a94576001600160a01b0381166000908152600c602052604081208054909190611dd590612fac565b909155505050565b6000611df1846001600160a01b0316611f47565b15611f3c57836001600160a01b031663150b7a02611e0d611850565b8786866040518563ffffffff1660e01b8152600401611e2f9493929190612596565b602060405180830381600087803b158015611e4957600080fd5b505af1925050508015611e97575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e94918101906123bb565b60015b611ef1573d808015611ec5576040519150601f19603f3d011682016040523d82523d6000602084013e611eca565b606091505b508051611ee95760405162461bcd60e51b815260040161085e90612743565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611957565b506001949350505050565b3b151590565b828054611f5990612f71565b90600052602060002090601f016020900481019282611f7b5760008555611fdf565b82601f10611fb2578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555611fdf565b82800160010185558215611fdf579182015b82811115611fdf578235825591602001919060010190611fc4565b50610d289291505b80821115610d285760008155600101611fe7565b80356001600160a01b03811681146107a057600080fd5b60008083601f840112612023578081fd5b50813567ffffffffffffffff81111561203a578182fd5b602083019150836020808302850101111561205457600080fd5b9250929050565b803580151581146107a057600080fd5b60008083601f84011261207c578182fd5b50813567ffffffffffffffff811115612093578182fd5b60208301915083602082850101111561205457600080fd5b6000602082840312156120bc578081fd5b610cb282611ffb565b600080604083850312156120d7578081fd5b6120e083611ffb565b91506120ee60208401611ffb565b90509250929050565b60008060006060848603121561210b578081fd5b61211484611ffb565b925061212260208501611ffb565b9150604084013590509250925092565b60008060008060808587031215612147578081fd5b61215085611ffb565b9350602061215f818701611ffb565b935060408601359250606086013567ffffffffffffffff80821115612182578384fd5b818801915088601f830112612195578384fd5b8135818111156121a7576121a7613025565b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156121e8576121e8613025565b60405281815283820185018b10156121fe578586fd5b81858501868301379081019093019390935250939692955090935050565b600080600060408486031215612230578283fd5b61223984611ffb565b9250602084013567ffffffffffffffff811115612254578283fd5b61226086828701612012565b9497909650939450505050565b6000806040838503121561227f578182fd5b61228883611ffb565b91506120ee6020840161205b565b600080604083850312156122a8578182fd5b6122b183611ffb565b946020939093013593505050565b600080602083850312156122d1578182fd5b823567ffffffffffffffff8111156122e7578283fd5b6122f385828601612012565b90969095509350505050565b60008060008060408587031215612314578384fd5b843567ffffffffffffffff8082111561232b578586fd5b61233788838901612012565b9096509450602087013591508082111561234f578384fd5b5061235c87828801612012565b95989497509550505050565b600060208284031215612379578081fd5b610cb28261205b565b600080600060408486031215612396578283fd5b6122398461205b565b6000602082840312156123b0578081fd5b8135610cb28161303b565b6000602082840312156123cc578081fd5b8151610cb28161303b565b600080600080604085870312156123ec578182fd5b843567ffffffffffffffff80821115612403578384fd5b61240f8883890161206b565b90965094506020870135915080821115612427578384fd5b5061235c8782880161206b565b600060208284031215612445578081fd5b5035919050565b60008151808452612464816020860160208601612f10565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600281046001808316806124b057607f831692505b60208084108214156124d057634e487b7160e01b86526022600452602486fd5b8180156124e4576001811461251357612540565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612540565b61251c88612ec1565b60005b868110156125385781548b82015290850190830161251f565b505084890196505b50505050505092915050565b60006125588286612496565b8451612568818360208901612f10565b61257481830186612496565b979650505050505050565b90565b6001600160a01b0391909116815260200190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125c8608083018461244c565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612627578351151583529284019291840191600101612609565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156126275783518352928401929184019160010161264f565b901515815260200190565b600060208252610cb2602083018461244c565b60208082526038908201527f47726166666974693a2053706563696669656420737570706c79206973206c6f60408201527f776572207468616e2063757272656e742062616c616e63650000000000000000606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f47726166666974693a20546f6b656e4964206e6f742065786973740000000000604082015260600190565b60208082526029908201527f47726166666974693a2055524920717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526036908201527f47726166666974693a204d7573742070726f7669646520657175616c2071756160408201527f6e74697469657320616e6420726563697069656e747300000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526034908201527f47726166666974693a5175616e74697479206d757374206265206c657373207460408201527f68616e206f7220657175616c204d41585f515459000000000000000000000000606082015260800190565b6020808252602c908201527f47726166666974693a2062616c616e636520717565727920666f72207468652060408201527f7a65726f20616464726573730000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f47726166666974693a204d696e74696e67206e6565647320746f20626520656e60408201527f61626c65642e0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f47726166666974693a204e65772076616c7565206d617463686573206f6c6400604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f47726166666974693a20717565727920666f72206e6f6e6578697374656e742060408201527f746f6b656e000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f47726166666974693a204d696e742f6f7264657220657863656564732073757060408201527f706c790000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60208082526024908201527f47726166666974693a20676c6f62616c20696e646578206f7574206f6620626f60408201527f756e647300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f47726166666974693a2045746865722073656e74206973206e6f7420636f727260408201527f6563740000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602d908201527f47726166666974693a207472616e73666572206f6620746f6b656e207468617460408201527f206973206e6f74206f776e656400000000000000000000000000000000000000606082015260800190565b90815260200190565b60009081526020902090565b60008219821115612ee057612ee0612ff9565b500190565b600082612ef457612ef461300f565b500490565b600082821015612f0b57612f0b612ff9565b500390565b60005b83811015612f2b578181015183820152602001612f13565b838111156115cf5750506000910152565b600081612f4b57612f4b612ff9565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600281046001821680612f8557607f821691505b60208210811415612fa657634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fde57612fde612ff9565b5060010190565b600082612ff457612ff461300f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461179f57600080fdfea26469706673582212206f1947273b3d24531b36a3d3c135d38dac3791c7ea92e9dde0d103b14816361364736f6c63430008000033

Deployed Bytecode Sourcemap

172:8810:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1270:305:3;;;;;;;;;;-1:-1:-1;1270:305:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1074:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2254:216::-;;;;;;;;;;-1:-1:-1;2254:216:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1843:403::-;;;;;;;;;;-1:-1:-1;1843:403:3;;;;;:::i;:::-;;:::i;:::-;;3071:95:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;462:23::-;;;;;;;;;;;;;:::i;2953:334:3:-;;;;;;;;;;-1:-1:-1;2953:334:3;;;;;:::i;:::-;;:::i;6637:149:10:-;;;;;;;;;;-1:-1:-1;6637:149:10;;;;;:::i;:::-;;:::i;4510:539::-;;;;;;;;;;-1:-1:-1;4510:539:10;;;;;:::i;:::-;;:::i;2275:361::-;;;;;;;;;;-1:-1:-1;2275:361:10;;;;;:::i;:::-;;:::i;387:31::-;;;;;;;;;;;;;:::i;3295:184:3:-;;;;;;;;;;-1:-1:-1;3295:184:3;;;;;:::i;:::-;;:::i;3257:303:10:-;;;;;;;;;;-1:-1:-1;3257:303:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1226:245::-;;;;;;;;;;-1:-1:-1;1226:245:10;;;;;:::i;:::-;;:::i;494:19::-;;;;;;;;;;-1:-1:-1;494:19:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1936:166::-;;;;;;;;;;-1:-1:-1;1936:166:10;;;;;:::i;:::-;;:::i;520:32::-;;;;;;;;;;;;;:::i;4331:105::-;;;;;;;;;;;;;:::i;1545:225::-;;;;;;;;;;-1:-1:-1;1545:225:10;;;;;:::i;:::-;;:::i;6075:154::-;;;;;;;;;;-1:-1:-1;6075:154:10;;;;;:::i;:::-;;:::i;6305:271::-;;;;;;;;;;-1:-1:-1;6305:271:10;;;;;:::i;:::-;;:::i;932:195::-;;;;;;;;;;-1:-1:-1;932:195:10;;;;;:::i;:::-;;:::i;1650:94:8:-;;;;;;;;;;;;;:::i;5131:627:10:-;;;;;;;;;;-1:-1:-1;5131:627:10;;;;;:::i;:::-;;:::i;423:34::-;;;;;;;;;;;;;:::i;999:87:8:-;;;;;;;;;;;;;:::i;6852:141:10:-;;;;;;;;;;-1:-1:-1;6852:141:10;;;;;:::i;:::-;;:::i;1583:106:3:-;;;;;;;;;;;;;:::i;3642:606:10:-;;;;;;:::i;:::-;;:::i;2650:295:3:-;;;;;;;;;;-1:-1:-1;2650:295:3;;;;;:::i;:::-;;:::i;8198:343:10:-;;;;;;;;;;-1:-1:-1;8198:343:10;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7791:335::-;;;;;;;;;;-1:-1:-1;7791:335:10;;;;;:::i;:::-;;:::i;3487:325:3:-;;;;;;;;;;-1:-1:-1;3487:325:3;;;;;:::i;:::-;;:::i;2731:254:10:-;;;;;;;;;;-1:-1:-1;2731:254:10;;;;;:::i;:::-;;:::i;5823:183::-;;;;;;;;;;-1:-1:-1;5823:183:10;;;;;:::i;:::-;;:::i;2478:164:3:-;;;;;;;;;;-1:-1:-1;2478:164:3;;;;;:::i;:::-;;:::i;1899:192:8:-;;;;;;;;;;-1:-1:-1;1899:192:8;;;;;:::i;:::-;;:::i;1270:305:3:-;1372:4;1409:40;;;1424:25;1409:40;;:105;;-1:-1:-1;1466:48:3;;;1481:33;1466:48;1409:105;:158;;;;1531:36;1555:11;1531:23;:36::i;:::-;1389:178;;1270:305;;;;:::o;1074:102::-;1130:13;1163:5;1156:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1074:102;:::o;2254:216::-;2327:7;2355:16;2363:7;2355;:16::i;:::-;2347:73;;;;-1:-1:-1;;;2347:73:3;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;2438:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;2438:24:3;;2254:216::o;1843:403::-;1923:13;1939:16;1947:7;1939;:16::i;:::-;1923:32;;1980:5;-1:-1:-1;;;;;1974:11:3;:2;-1:-1:-1;;;;;1974:11:3;;;1966:57;;;;-1:-1:-1;;;1966:57:3;;;;;;;:::i;:::-;2074:5;-1:-1:-1;;;;;2058:21:3;:12;:10;:12::i;:::-;-1:-1:-1;;;;;2058:21:3;;:62;;;;2083:37;2100:5;2107:12;:10;:12::i;2083:37::-;2036:168;;;;-1:-1:-1;;;2036:168:3;;;;;;;:::i;:::-;2217:21;2226:2;2230:7;2217:8;:21::i;:::-;1843:403;;;:::o;3071:95:10:-;3148:5;:12;3071:95;:::o;462:23::-;;;;:::o;2953:334:3:-;3145:41;3164:12;:10;:12::i;:::-;3178:7;3145:18;:41::i;:::-;3137:103;;;;-1:-1:-1;;;3137:103:3;;;;;;;:::i;:::-;3251:28;3261:4;3267:2;3271:7;3251:9;:28::i;6637:149:10:-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;6714:6:10::1;6703:7;;:17;;6694:63;;;;-1:-1:-1::0;;;6694:63:10::1;;;;;;;:::i;:::-;6764:7;:16:::0;6637:149::o;4510:539::-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;4602:7:10::1;4577:21;:32;;4569:74;;;;-1:-1:-1::0;;;4569:74:10::1;;;;;;;:::i;:::-;4885:7;4906;:5;:7::i;:::-;-1:-1:-1::0;;;;;4898:21:10::1;4927:7;4898:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4884:55;;;4954:2;4946:11;;;::::0;::::1;;1290:1:8;4510:539:10::0;:::o;2275:361::-;2352:12;2373:10;2395:6;2390:179;2408:5;:12;2403:17;;2390:179;;2449:5;2455:1;2449:8;;;;;;-1:-1:-1;;;2449:8:10;;;;;;;;;;;;;;;;;;:14;-1:-1:-1;;;;;2440:23:10;;;2449:14;;2440:23;2436:126;;;2489:5;2480;:14;2476:76;;;2515:3;:1;2517;2515:3;:::i;:::-;2508:10;;;;;;2476:76;2545:7;;;:::i;:::-;;;2476:76;2422:3;;;:::i;:::-;;;2390:179;;;;2577:53;;-1:-1:-1;;;2577:53:10;;;;;;;:::i;2275:361::-;;;;;:::o;387:31::-;;;;:::o;3295:184:3:-;3432:39;3449:4;3455:2;3459:7;3432:39;;;;;;;;;;;;:16;:39::i;3257:303:10:-;3322:13;3344;3360:20;3371:7;3360:9;:20::i;:::-;3344:36;;3387:20;3422:8;3410:22;;;;;;-1:-1:-1;;;3410:22:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3410:22:10;;3387:45;;3444:6;3439:96;3456:8;3452:1;:12;3439:96;;;3494:33;3515:7;3524:1;3494:19;:33::i;:::-;3482:6;3489:1;3482:9;;;;;;-1:-1:-1;;;3482:9:10;;;;;;;;;;;;;;;;;;:45;3466:3;;;:::i;:::-;;;3439:96;;;-1:-1:-1;3548:6:10;3257:303;-1:-1:-1;;;3257:303:10:o;1226:245::-;1313:4;1330:6;1326:120;1338:19;;;1326:120;;;1407:7;-1:-1:-1;;;;;1377:37:10;:5;1384:8;;1393:1;1384:11;;;;;-1:-1:-1;;;1384:11:10;;;;;;;;;;;;;;;1377:20;;;;;;-1:-1:-1;;;1377:20:10;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;1377:26:10;:37;1373:65;;1433:5;1426:12;;;;;1373:65;1359:3;;;:::i;:::-;;;1326:120;;;;1461:4;1454:11;;1226:245;;;;;;:::o;494:19::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;494:19:10;;;-1:-1:-1;494:19:10;;;;;;:::o;1936:166::-;1993:4;2023:13;:11;:13::i;:::-;2014:5;:22;;2006:71;;;;-1:-1:-1;;;2006:71:10;;;;;;;:::i;:::-;-1:-1:-1;2091:5:10;1936:166::o;520:32::-;;;;;;:::o;4331:105::-;4409:21;4331:105;:::o;1545:225::-;1608:14;;1647:5;1653:9;1661:1;1653:7;:9;:::i;:::-;1647:16;;;;;;-1:-1:-1;;;1647:16:10;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;1647:22:10;;-1:-1:-1;1684:19:10;1676:69;;;;-1:-1:-1;;;1676:69:10;;;;;;;:::i;6075:154::-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;6168:24:10::1;:15;6186:6:::0;;6168:24:::1;:::i;:::-;-1:-1:-1::0;6199:24:10::1;:15;6217:6:::0;;6199:24:::1;:::i;:::-;;6075:154:::0;;;;:::o;6305:271::-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;6391:9:10::1;6377:10;;:23;;6368:69;;;;-1:-1:-1::0;;;6368:69:10::1;;;;;;;:::i;:::-;6466:13;:11;:13::i;:::-;6453:9;:26;;6444:97;;;;-1:-1:-1::0;;;6444:97:10::1;;;;;;;:::i;:::-;6548:10;:22:::0;6305:271::o;932:195::-;998:4;-1:-1:-1;;;;;1019:21:10;;1011:78;;;;-1:-1:-1;;;1011:78:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1103:18:10;;;;;:9;:18;;;;;;;932:195::o;1650:94:8:-;1230:12;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;5131:627:10:-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;5237:35:10;;::::1;5229:103;;;;-1:-1:-1::0;;;5229:103:10::1;;;;;;;:::i;:::-;5341:18;5366:11:::0;5380:13:::1;:11;:13::i;:::-;5366:27;;5404:6;5400:82;5412:19:::0;;::::1;5400:82;;;5463:8;;5472:1;5463:11;;;;;-1:-1:-1::0;;;5463:11:10::1;;;;;;;;;;;;;;;5446:28;;;;;:::i;:::-;::::0;-1:-1:-1;5433:3:10::1;::::0;::::1;:::i;:::-;;;5400:82;;;-1:-1:-1::0;5522:10:10::1;::::0;5497:22:::1;5506:13:::0;5497:6;:22:::1;:::i;:::-;:35;5488:85;;;;-1:-1:-1::0;;;5488:85:10::1;;;;;;;:::i;:::-;5586:6;5582:171;5594:20:::0;;::::1;5582:171;;;5633:6;5629:117;5645:8;;5654:1;5645:11;;;;;-1:-1:-1::0;;;5645:11:10::1;;;;;;;;;;;;;;;5641:1;:15;5629:117;;;5673:12;5688:8;::::0;::::1;:::i;:::-;;;;5673:23;;5707:29;5714:9;;5724:1;5714:12;;;;;-1:-1:-1::0;;;5714:12:10::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5728:7;5707:5;:29::i;:::-;-1:-1:-1::0;5658:3:10::1;::::0;::::1;:::i;:::-;;;5629:117;;;-1:-1:-1::0;5616:3:10::1;::::0;::::1;:::i;:::-;;;5582:171;;;;1290:1:8;;5131:627:10::0;;;;:::o;423:34::-;;;;:::o;999:87:8:-;1072:6;;-1:-1:-1;;;;;1072:6:8;999:87;:::o;6852:141:10:-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;6925:5:10::1;6916;;:14;;6907:60;;;;-1:-1:-1::0;;;6907:60:10::1;;;;;;;:::i;:::-;6974:5;:13:::0;6852:141::o;1583:106:3:-;1641:13;1674:7;1667:14;;;;;:::i;3642:606:10:-;1778:1:9;2376:7;;:19;;2368:63;;;;-1:-1:-1;;;2368:63:9;;;;;;;:::i;:::-;1778:1;2509:7;:18;3718:12:10::1;::::0;::::1;;:20;;:12:::0;:20:::1;3710:70;;;;-1:-1:-1::0;;;3710:70:10::1;;;;;;;:::i;:::-;3828:7;::::0;3813:10:::1;3806:18;::::0;;;:6:::1;:18;::::0;;;;;3795:29:::1;::::0;:8;:29:::1;:::i;:::-;:40;;3787:104;;;;-1:-1:-1::0;;;3787:104:10::1;;;;;;;:::i;:::-;3920:5;;3907:9;:18;;3898:69;;;;-1:-1:-1::0;;;3898:69:10::1;;;;;;;:::i;:::-;3974:11;3988:13;:11;:13::i;:::-;4038:10;::::0;3974:27;;-1:-1:-1;4017:17:10::1;4026:8:::0;3974:27;4017:17:::1;:::i;:::-;:31;;4008:81;;;;-1:-1:-1::0;;;4008:81:10::1;;;;;;;:::i;:::-;4103:10;4096:18;::::0;;;:6:::1;:18;::::0;;;;:30;;4118:8;;4096:18;:30:::1;::::0;4118:8;;4096:30:::1;:::i;:::-;::::0;;;-1:-1:-1;4137:6:10::1;::::0;-1:-1:-1;4133:110:10::1;4149:8;4145:1;:12;4133:110;;;4173:12;4189:8;::::0;::::1;:::i;:::-;;;;4173:24;;4207:28;4214:10;4226:7;4207:5;:28::i;:::-;-1:-1:-1::0;4159:3:10;::::1;::::0;::::1;:::i;:::-;;;;4133:110;;;-1:-1:-1::0;;1734:1:9;2688:7;:22;-1:-1:-1;3642:606:10:o;2650:295:3:-;2767:12;:10;:12::i;:::-;-1:-1:-1;;;;;2755:24:3;:8;-1:-1:-1;;;;;2755:24:3;;;2747:62;;;;-1:-1:-1;;;2747:62:3;;;;;;;:::i;:::-;2865:8;2820:18;:32;2839:12;:10;:12::i;:::-;-1:-1:-1;;;;;2820:32:3;;;;;;;;;;;;;;;;;-1:-1:-1;2820:32:3;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;;2904:12;:10;:12::i;:::-;-1:-1:-1;;;;;2889:48:3;;2928:8;2889:48;;;;;;:::i;:::-;;;;;;;;2650:295;;:::o;8198:343:10:-;8267:23;8338:24;8376:8;8365:27;;;;;;-1:-1:-1;;;8365:27:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8365:27:10;;8338:54;;8405:6;8401:109;8413:19;;;8401:109;;;8466:5;8484:1;8472:8;;8481:1;8472:11;;;;;-1:-1:-1;;;8472:11:10;;;;;;;;;;;;;;;:13;;;;:::i;:::-;8466:20;;;;;;-1:-1:-1;;;8466:20:10;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;8450:10;8461:1;8450:13;;;;;;-1:-1:-1;;;8450:13:10;;;;;;;;;:50;;;:13;;;;;;;;;;;:50;8434:3;;;;:::i;:::-;;;;8401:109;;7791:335;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;7938:6:10::1;7934:187;7948:19:::0;;::::1;7934:187;;;7997:20;8005:8;;8014:1;8005:11;;;;;-1:-1:-1::0;;;8005:11:10::1;;;;;;;;;;;;;;;7997:7;:20::i;:::-;7989:60;;;;-1:-1:-1::0;;;7989:60:10::1;;;;;;;:::i;:::-;8101:8;8064:5;8082:1;8070:8;;8079:1;8070:11;;;;;-1:-1:-1::0;;;8070:11:10::1;;;;;;;;;;;;;;;:13;;;;:::i;:::-;8064:20;;;;;;-1:-1:-1::0;;;8064:20:10::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:45:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;7969:3;::::1;::::0;::::1;:::i;:::-;;;;7934:187;;;;7791:335:::0;;;:::o;3487:325:3:-;3659:41;3678:12;:10;:12::i;:::-;3692:7;3659:18;:41::i;:::-;3651:103;;;;-1:-1:-1;;;3651:103:3;;;;;;;:::i;:::-;3765:39;3779:4;3785:2;3789:7;3798:5;3765:13;:39::i;2731:254:10:-;2795:13;2825:16;2833:7;2825;:16::i;:::-;2817:70;;;;-1:-1:-1;;;2817:70:10;;;;;;;:::i;:::-;2925:15;2942:18;:7;:16;:18::i;:::-;2962:15;2908:70;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2894:85;;2731:254;;;:::o;5823:183::-;1230:12:8;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;5902:12:10::1;::::0;::::1;;:27;;::::0;::::1;;;;5893:74;;;;-1:-1:-1::0;;;5893:74:10::1;;;;;;;:::i;:::-;5974:12;:26:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;5823:183::o;2478:164:3:-;-1:-1:-1;;;;;2599:25:3;;;2575:4;2599:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;2478:164::o;1899:192:8:-;1230:12;:10;:12::i;:::-;-1:-1:-1;;;;;1219:23:8;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1219:23:8;;1211:68;;;;-1:-1:-1;;;1211:68:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;1988:22:8;::::1;1980:73;;;;-1:-1:-1::0;;;1980:73:8::1;;;;;;;:::i;:::-;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;787:157:2:-;896:40;;;911:25;896:40;787:157;;;:::o;7331:165:10:-;7394:4;7422:1;7414:7;:9;:36;;;;-1:-1:-1;7438:5:10;:12;7427:23;;;7414:36;:76;;;;-1:-1:-1;7488:1:10;7454:5;7460:9;7468:1;7460:7;:9;:::i;:::-;7454:16;;;;;;-1:-1:-1;;;7454:16:10;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;7454:22:10;:36;;;7331:165;-1:-1:-1;;7331:165:10:o;602:98:1:-;682:10;602:98;:::o;3838:164:3:-;3910:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;3910:29:3;;;;;;;;:24;;3964:16;3910:24;3964:7;:16::i;:::-;-1:-1:-1;;;;;3955:39:3;;;;;;;;;;;3838:164;;:::o;4890:338::-;4980:4;5005:16;5013:7;5005;:16::i;:::-;4997:73;;;;-1:-1:-1;;;4997:73:3;;;;;;;:::i;:::-;5081:13;5097:16;5105:7;5097;:16::i;:::-;5081:32;;5143:5;-1:-1:-1;;;;;5132:16:3;:7;-1:-1:-1;;;;;5132:16:3;;:51;;;;5176:7;-1:-1:-1;;;;;5152:31:3;:20;5164:7;5152:11;:20::i;:::-;-1:-1:-1;;;;;5152:31:3;;5132:51;:87;;;;5187:32;5204:5;5211:7;5187:16;:32::i;:::-;5124:96;4890:338;-1:-1:-1;;;;4890:338:3:o;8603:376:10:-;-1:-1:-1;;;;;8695:30:10;;:5;8701:9;8709:1;8701:7;:9;:::i;:::-;8695:16;;;;;;-1:-1:-1;;;8695:16:10;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;8695:22:10;:30;8687:88;;;;-1:-1:-1;;;8687:88:10;;;;;;;:::i;:::-;8832:29;8849:1;8853:7;8832:8;:29::i;:::-;8868:30;8889:4;8895:2;8868:20;:30::i;:::-;8932:2;8907:5;8913:9;8921:1;8913:7;:9;:::i;:::-;8907:16;;;;;;-1:-1:-1;;;8907:16:10;;;;;;;;;;;;;;;;;:27;;;;-1:-1:-1;;;;;8907:27:10;;;;;;8946;;8965:7;;8946:27;;;;;;;;;;8907:16;8946:27;8603:376;;;:::o;2099:173:8:-;2174:6;;;-1:-1:-1;;;;;2191:17:8;;;;;;;;;;;2224:40;;2174:6;;;2191:17;2174:6;;2224:40;;2155:16;;2224:40;2099:173;;:::o;7561:177:10:-;7618:36;7647:1;7651:2;7618:20;:36::i;:::-;7672:14;;;;;;;;-1:-1:-1;;;;;7672:14:10;;;;;;-1:-1:-1;7672:14:10;;;;;;7661:5;:26;;7672:14;7661:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7699:33;;7724:7;;-1:-1:-1;7699:33:10;;-1:-1:-1;;7699:33:10;7561:177;;:::o;5236:312:3:-;5390:28;5400:4;5406:2;5410:7;5390:9;:28::i;:::-;5437:48;5460:4;5466:2;5470:7;5479:5;5437:22;:48::i;:::-;5429:111;;;;-1:-1:-1;;;5429:111:3;;;;;;;:::i;342:723:11:-;398:13;619:10;615:53;;-1:-1:-1;646:10:11;;;;;;;;;;;;;;;;;;;615:53;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:11;;-1:-1:-1;798:2:11;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;-1:-1:-1;;;844:17:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:11;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:11;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;-1:-1:-1;;;932:14:11;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:11;1012:2;1003:11;;:::i;:::-;;;872:154;;7084:185:10;-1:-1:-1;;;;;7160:18:10;;;7156:51;;-1:-1:-1;;;;;7190:17:10;;;;;;:9;:17;;;;;7188:19;;7190:17;;;7188:19;;;:::i;:::-;;;;-1:-1:-1;7156:51:10;-1:-1:-1;;;;;7220:16:10;;;7216:47;;-1:-1:-1;;;;;7248:15:10;;;;;;:9;:15;;;;;7246:17;;7248:15;;;7246:17;;;:::i;:::-;;;;-1:-1:-1;7084:185:10;;:::o;4010:796:3:-;4162:4;4183:15;:2;-1:-1:-1;;;;;4183:13:3;;:15::i;:::-;4179:620;;;4235:2;-1:-1:-1;;;;;4219:36:3;;4256:12;:10;:12::i;:::-;4270:4;4276:7;4285:5;4219:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4219:72:3;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4215:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4461:13:3;;4457:272;;4504:60;;-1:-1:-1;;;4504:60:3;;;;;;;:::i;4457:272::-;4679:6;4673:13;4664:6;4660:2;4656:15;4649:38;4215:529;4342:51;;4352:41;4342:51;;-1:-1:-1;4335:58:3;;4179:620;-1:-1:-1;4783:4:3;4010:796;;;;;;:::o;743:387:0:-;1066:20;1114:8;;;743:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:198:12;84:20;;-1:-1:-1;;;;;133:54:12;;123:65;;113:2;;202:1;199;192:12;217:400;;;350:3;343:4;335:6;331:17;327:27;317:2;;373:6;365;358:22;317:2;-1:-1:-1;401:20:12;;444:18;433:30;;430:2;;;483:8;473;466:26;430:2;527:4;519:6;515:17;503:29;;590:3;583:4;575;567:6;563:17;555:6;551:30;547:41;544:50;541:2;;;607:1;604;597:12;541:2;307:310;;;;;:::o;622:162::-;689:20;;745:13;;738:21;728:32;;718:2;;774:1;771;764:12;789:378;;;907:3;900:4;892:6;888:17;884:27;874:2;;932:8;922;915:26;874:2;-1:-1:-1;962:20:12;;1005:18;994:30;;991:2;;;1044:8;1034;1027:26;991:2;1088:4;1080:6;1076:17;1064:29;;1140:3;1133:4;1124:6;1116;1112:19;1108:30;1105:39;1102:2;;;1157:1;1154;1147:12;1172:198;;1284:2;1272:9;1263:7;1259:23;1255:32;1252:2;;;1305:6;1297;1290:22;1252:2;1333:31;1354:9;1333:31;:::i;1375:274::-;;;1504:2;1492:9;1483:7;1479:23;1475:32;1472:2;;;1525:6;1517;1510:22;1472:2;1553:31;1574:9;1553:31;:::i;:::-;1543:41;;1603:40;1639:2;1628:9;1624:18;1603:40;:::i;:::-;1593:50;;1462:187;;;;;:::o;1654:342::-;;;;1800:2;1788:9;1779:7;1775:23;1771:32;1768:2;;;1821:6;1813;1806:22;1768:2;1849:31;1870:9;1849:31;:::i;:::-;1839:41;;1899:40;1935:2;1924:9;1920:18;1899:40;:::i;:::-;1889:50;;1986:2;1975:9;1971:18;1958:32;1948:42;;1758:238;;;;;:::o;2001:1237::-;;;;;2173:3;2161:9;2152:7;2148:23;2144:33;2141:2;;;2195:6;2187;2180:22;2141:2;2223:31;2244:9;2223:31;:::i;:::-;2213:41;;2273:2;2294:40;2330:2;2319:9;2315:18;2294:40;:::i;:::-;2284:50;;2381:2;2370:9;2366:18;2353:32;2343:42;;2436:2;2425:9;2421:18;2408:32;2459:18;2500:2;2492:6;2489:14;2486:2;;;2521:6;2513;2506:22;2486:2;2564:6;2553:9;2549:22;2539:32;;2609:7;2602:4;2598:2;2594:13;2590:27;2580:2;;2636:6;2628;2621:22;2580:2;2677;2664:16;2699:2;2695;2692:10;2689:2;;;2705:18;;:::i;:::-;2754:2;2748:9;2889:2;2819:66;2812:4;2808:2;2804:13;2800:86;2792:6;2788:99;2784:108;2942:6;2930:10;2927:22;2922:2;2910:10;2907:18;2904:46;2901:2;;;2953:18;;:::i;:::-;2989:2;2982:22;3013:18;;;3050:11;;;3046:20;;3043:33;-1:-1:-1;3040:2:12;;;3094:6;3086;3079:22;3040:2;3155;3150;3146;3142:11;3137:2;3129:6;3125:15;3112:46;3178:15;;;3174:24;;;3167:40;;;;-1:-1:-1;2131:1107:12;;;;-1:-1:-1;2131:1107:12;;-1:-1:-1;;2131:1107:12:o;3243:539::-;;;;3407:2;3395:9;3386:7;3382:23;3378:32;3375:2;;;3428:6;3420;3413:22;3375:2;3456:31;3477:9;3456:31;:::i;:::-;3446:41;;3538:2;3527:9;3523:18;3510:32;3565:18;3557:6;3554:30;3551:2;;;3602:6;3594;3587:22;3551:2;3646:76;3714:7;3705:6;3694:9;3690:22;3646:76;:::i;:::-;3365:417;;3741:8;;-1:-1:-1;3620:102:12;;-1:-1:-1;;;;3365:417:12:o;3787:268::-;;;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3934:6;3926;3919:22;3881:2;3962:31;3983:9;3962:31;:::i;:::-;3952:41;;4012:37;4045:2;4034:9;4030:18;4012:37;:::i;4060:266::-;;;4189:2;4177:9;4168:7;4164:23;4160:32;4157:2;;;4210:6;4202;4195:22;4157:2;4238:31;4259:9;4238:31;:::i;:::-;4228:41;4316:2;4301:18;;;;4288:32;;-1:-1:-1;;;4147:179:12:o;4331:463::-;;;4478:2;4466:9;4457:7;4453:23;4449:32;4446:2;;;4499:6;4491;4484:22;4446:2;4544:9;4531:23;4577:18;4569:6;4566:30;4563:2;;;4614:6;4606;4599:22;4563:2;4658:76;4726:7;4717:6;4706:9;4702:22;4658:76;:::i;:::-;4753:8;;4632:102;;-1:-1:-1;4436:358:12;-1:-1:-1;;;;4436:358:12:o;4799:815::-;;;;;4998:2;4986:9;4977:7;4973:23;4969:32;4966:2;;;5019:6;5011;5004:22;4966:2;5064:9;5051:23;5093:18;5134:2;5126:6;5123:14;5120:2;;;5155:6;5147;5140:22;5120:2;5199:76;5267:7;5258:6;5247:9;5243:22;5199:76;:::i;:::-;5294:8;;-1:-1:-1;5173:102:12;-1:-1:-1;5382:2:12;5367:18;;5354:32;;-1:-1:-1;5398:16:12;;;5395:2;;;5432:6;5424;5417:22;5395:2;;5476:78;5546:7;5535:8;5524:9;5520:24;5476:78;:::i;:::-;4956:658;;;;-1:-1:-1;5573:8:12;-1:-1:-1;;;;4956:658:12:o;5619:192::-;;5728:2;5716:9;5707:7;5703:23;5699:32;5696:2;;;5749:6;5741;5734:22;5696:2;5777:28;5795:9;5777:28;:::i;5816:533::-;;;;5977:2;5965:9;5956:7;5952:23;5948:32;5945:2;;;5998:6;5990;5983:22;5945:2;6026:28;6044:9;6026:28;:::i;6354:257::-;;6465:2;6453:9;6444:7;6440:23;6436:32;6433:2;;;6486:6;6478;6471:22;6433:2;6530:9;6517:23;6549:32;6575:5;6549:32;:::i;6616:261::-;;6738:2;6726:9;6717:7;6713:23;6709:32;6706:2;;;6759:6;6751;6744:22;6706:2;6796:9;6790:16;6815:32;6841:5;6815:32;:::i;6882:755::-;;;;;7051:2;7039:9;7030:7;7026:23;7022:32;7019:2;;;7072:6;7064;7057:22;7019:2;7117:9;7104:23;7146:18;7187:2;7179:6;7176:14;7173:2;;;7208:6;7200;7193:22;7173:2;7252:61;7305:7;7296:6;7285:9;7281:22;7252:61;:::i;:::-;7332:8;;-1:-1:-1;7226:87:12;-1:-1:-1;7420:2:12;7405:18;;7392:32;;-1:-1:-1;7436:16:12;;;7433:2;;;7470:6;7462;7455:22;7433:2;;7514:63;7569:7;7558:8;7547:9;7543:24;7514:63;:::i;7642:190::-;;7754:2;7742:9;7733:7;7729:23;7725:32;7722:2;;;7775:6;7767;7760:22;7722:2;-1:-1:-1;7803:23:12;;7712:120;-1:-1:-1;7712:120:12:o;7837:318::-;;7918:5;7912:12;7945:6;7940:3;7933:19;7961:63;8017:6;8010:4;8005:3;8001:14;7994:4;7987:5;7983:16;7961:63;:::i;:::-;8069:2;8057:15;8074:66;8053:88;8044:98;;;;8144:4;8040:109;;7888:267;-1:-1:-1;;7888:267:12:o;8160:1097::-;8247:12;;8160:1097;;8319:1;8304:17;;8340:1;8376:18;;;;8403:2;;8457:4;8449:6;8445:17;8435:27;;8403:2;8483;8531;8523:6;8520:14;8500:18;8497:38;8494:2;;;-1:-1:-1;;;8565:3:12;8558:90;8671:4;8668:1;8661:15;8701:4;8696:3;8689:17;8494:2;8732:18;8759:162;;;;8935:1;8930:321;;;;8725:526;;8759:162;8807:66;8796:9;8792:82;8787:3;8780:95;8904:6;8899:3;8895:16;8888:23;;8759:162;;8930:321;8966:38;8998:5;8966:38;:::i;:::-;9026:1;9040:165;9054:6;9051:1;9048:13;9040:165;;;9132:14;;9119:11;;;9112:35;9175:16;;;;9069:10;;9040:165;;;9044:3;;9234:6;9229:3;9225:16;9218:23;;8725:526;;;;;;;8220:1037;;;;:::o;9262:460::-;;9511:40;9547:3;9539:6;9511:40;:::i;:::-;9580:6;9574:13;9596:52;9641:6;9637:2;9630:4;9622:6;9618:17;9596:52;:::i;:::-;9664;9708:6;9704:2;9700:15;9692:6;9664:52;:::i;:::-;9657:59;9491:231;-1:-1:-1;;;;;;;9491:231:12:o;9727:205::-;9927:3;9918:14::o;9937:226::-;-1:-1:-1;;;;;10101:55:12;;;;10083:74;;10071:2;10056:18;;10038:125::o;10168:513::-;;-1:-1:-1;;;;;10472:2:12;10464:6;10460:15;10449:9;10442:34;10524:2;10516:6;10512:15;10507:2;10496:9;10492:18;10485:43;;10564:6;10559:2;10548:9;10544:18;10537:34;10607:3;10602:2;10591:9;10587:18;10580:31;10628:47;10670:3;10659:9;10655:19;10647:6;10628:47;:::i;:::-;10620:55;10371:310;-1:-1:-1;;;;;;10371:310:12:o;10686:307::-;-1:-1:-1;;;;;10872:55:12;;;;10854:74;;10971:14;10964:22;10959:2;10944:18;;10937:50;10842:2;10827:18;;10809:184::o;10998:645::-;11163:2;11215:21;;;11285:13;;11188:18;;;11307:22;;;10998:645;;11163:2;11386:15;;;;11360:2;11345:18;;;10998:645;11432:185;11446:6;11443:1;11440:13;11432:185;;;11521:13;;11514:21;11507:29;11495:42;;11592:15;;;;11557:12;;;;11468:1;11461:9;11432:185;;;-1:-1:-1;11634:3:12;;11143:500;-1:-1:-1;;;;;;11143:500:12:o;11648:635::-;11819:2;11871:21;;;11941:13;;11844:18;;;11963:22;;;11648:635;;11819:2;12042:15;;;;12016:2;12001:18;;;11648:635;12088:169;12102:6;12099:1;12096:13;12088:169;;;12163:13;;12151:26;;12232:15;;;;12197:12;;;;12124:1;12117:9;12088:169;;12288:187;12453:14;;12446:22;12428:41;;12416:2;12401:18;;12383:92::o;12480:221::-;;12629:2;12618:9;12611:21;12649:46;12691:2;12680:9;12676:18;12668:6;12649:46;:::i;12706:420::-;12908:2;12890:21;;;12947:2;12927:18;;;12920:30;12986:34;12981:2;12966:18;;12959:62;13057:26;13052:2;13037:18;;13030:54;13116:3;13101:19;;12880:246::o;13131:407::-;13333:2;13315:21;;;13372:2;13352:18;;;13345:30;13411:34;13406:2;13391:18;;13384:62;13482:13;13477:2;13462:18;;13455:41;13528:3;13513:19;;13305:233::o;13543:414::-;13745:2;13727:21;;;13784:2;13764:18;;;13757:30;13823:34;13818:2;13803:18;;13796:62;13894:20;13889:2;13874:18;;13867:48;13947:3;13932:19;;13717:240::o;13962:402::-;14164:2;14146:21;;;14203:2;14183:18;;;14176:30;14242:34;14237:2;14222:18;;14215:62;14313:8;14308:2;14293:18;;14286:36;14354:3;14339:19;;14136:228::o;14369:351::-;14571:2;14553:21;;;14610:2;14590:18;;;14583:30;14649:29;14644:2;14629:18;;14622:57;14711:2;14696:18;;14543:177::o;14725:405::-;14927:2;14909:21;;;14966:2;14946:18;;;14939:30;15005:34;15000:2;14985:18;;14978:62;15076:11;15071:2;15056:18;;15049:39;15120:3;15105:19;;14899:231::o;15135:349::-;15337:2;15319:21;;;15376:2;15356:18;;;15349:30;15415:27;15410:2;15395:18;;15388:55;15475:2;15460:18;;15309:175::o;15489:418::-;15691:2;15673:21;;;15730:2;15710:18;;;15703:30;15769:34;15764:2;15749:18;;15742:62;15840:24;15835:2;15820:18;;15813:52;15897:3;15882:19;;15663:244::o;15912:353::-;16114:2;16096:21;;;16153:2;16133:18;;;16126:30;16192:31;16187:2;16172:18;;16165:59;16256:2;16241:18;;16086:179::o;16270:408::-;16472:2;16454:21;;;16511:2;16491:18;;;16484:30;16550:34;16545:2;16530:18;;16523:62;16621:14;16616:2;16601:18;;16594:42;16668:3;16653:19;;16444:234::o;16683:416::-;16885:2;16867:21;;;16924:2;16904:18;;;16897:30;16963:34;16958:2;16943:18;;16936:62;17034:22;17029:2;17014:18;;17007:50;17089:3;17074:19;;16857:242::o;17104:408::-;17306:2;17288:21;;;17345:2;17325:18;;;17318:30;17384:34;17379:2;17364:18;;17357:62;17455:14;17450:2;17435:18;;17428:42;17502:3;17487:19;;17278:234::o;17517:402::-;17719:2;17701:21;;;17758:2;17738:18;;;17731:30;17797:34;17792:2;17777:18;;17770:62;17868:8;17863:2;17848:18;;17841:36;17909:3;17894:19;;17691:228::o;17924:355::-;18126:2;18108:21;;;18165:2;18145:18;;;18138:30;18204:33;18199:2;18184:18;;18177:61;18270:2;18255:18;;18098:181::o;18284:420::-;18486:2;18468:21;;;18525:2;18505:18;;;18498:30;18564:34;18559:2;18544:18;;18537:62;18635:26;18630:2;18615:18;;18608:54;18694:3;18679:19;;18458:246::o;18709:408::-;18911:2;18893:21;;;18950:2;18930:18;;;18923:30;18989:34;18984:2;18969:18;;18962:62;19060:14;19055:2;19040:18;;19033:42;19107:3;19092:19;;18883:234::o;19122:401::-;19324:2;19306:21;;;19363:2;19343:18;;;19336:30;19402:34;19397:2;19382:18;;19375:62;19473:7;19468:2;19453:18;;19446:35;19513:3;19498:19;;19296:227::o;19528:356::-;19730:2;19712:21;;;19749:18;;;19742:30;19808:34;19803:2;19788:18;;19781:62;19875:2;19860:18;;19702:182::o;19889:399::-;20091:2;20073:21;;;20130:2;20110:18;;;20103:30;20169:34;20164:2;20149:18;;20142:62;20240:5;20235:2;20220:18;;20213:33;20278:3;20263:19;;20063:225::o;20293:397::-;20495:2;20477:21;;;20534:2;20514:18;;;20507:30;20573:34;20568:2;20553:18;;20546:62;20644:3;20639:2;20624:18;;20617:31;20680:3;20665:19;;20467:223::o;20695:413::-;20897:2;20879:21;;;20936:2;20916:18;;;20909:30;20975:34;20970:2;20955:18;;20948:62;21046:19;21041:2;21026:18;;21019:47;21098:3;21083:19;;20869:239::o;21113:400::-;21315:2;21297:21;;;21354:2;21334:18;;;21327:30;21393:34;21388:2;21373:18;;21366:62;21464:6;21459:2;21444:18;;21437:34;21503:3;21488:19;;21287:226::o;21518:399::-;21720:2;21702:21;;;21759:2;21739:18;;;21732:30;21798:34;21793:2;21778:18;;21771:62;21869:5;21864:2;21849:18;;21842:33;21907:3;21892:19;;21692:225::o;21922:355::-;22124:2;22106:21;;;22163:2;22143:18;;;22136:30;22202:33;22197:2;22182:18;;22175:61;22268:2;22253:18;;22096:181::o;22282:409::-;22484:2;22466:21;;;22523:2;22503:18;;;22496:30;22562:34;22557:2;22542:18;;22535:62;22633:15;22628:2;22613:18;;22606:43;22681:3;22666:19;;22456:235::o;22696:177::-;22842:25;;;22830:2;22815:18;;22797:76::o;22878:129::-;;22946:17;;;22996:4;22980:21;;;22936:71::o;23012:128::-;;23083:1;23079:6;23076:1;23073:13;23070:2;;;23089:18;;:::i;:::-;-1:-1:-1;23125:9:12;;23060:80::o;23145:120::-;;23211:1;23201:2;;23216:18;;:::i;:::-;-1:-1:-1;23250:9:12;;23191:74::o;23270:125::-;;23338:1;23335;23332:8;23329:2;;;23343:18;;:::i;:::-;-1:-1:-1;23380:9:12;;23319:76::o;23400:258::-;23472:1;23482:113;23496:6;23493:1;23490:13;23482:113;;;23572:11;;;23566:18;23553:11;;;23546:39;23518:2;23511:10;23482:113;;;23613:6;23610:1;23607:13;23604:2;;;-1:-1:-1;;23648:1:12;23630:16;;23623:27;23453:205::o;23663:196::-;;23730:5;23720:2;;23739:18;;:::i;:::-;-1:-1:-1;23786:66:12;23775:78;;23710:149::o;23864:437::-;23949:1;23939:12;;23996:1;23986:12;;;24007:2;;24061:4;24053:6;24049:17;24039:27;;24007:2;24114;24106:6;24103:14;24083:18;24080:38;24077:2;;;-1:-1:-1;;;24148:1:12;24141:88;24252:4;24249:1;24242:15;24280:4;24277:1;24270:15;24077:2;;23919:382;;;:::o;24306:195::-;;24376:66;24369:5;24366:77;24363:2;;;24446:18;;:::i;:::-;-1:-1:-1;24493:1:12;24482:13;;24353:148::o;24506:112::-;;24564:1;24554:2;;24569:18;;:::i;:::-;-1:-1:-1;24603:9:12;;24544:74::o;24623:184::-;-1:-1:-1;;;24672:1:12;24665:88;24772:4;24769:1;24762:15;24796:4;24793:1;24786:15;24812:184;-1:-1:-1;;;24861:1:12;24854:88;24961:4;24958:1;24951:15;24985:4;24982:1;24975:15;25001:184;-1:-1:-1;;;25050:1:12;25043:88;25150:4;25147:1;25140:15;25174:4;25171:1;25164:15;25190:179;25277:66;25270:5;25266:78;25259:5;25256:89;25246:2;;25359:1;25356;25349:12

Swarm Source

ipfs://6f1947273b3d24531b36a3d3c135d38dac3791c7ea92e9dde0d103b148163613
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.