ETH Price: $2,873.01 (+6.78%)
 

Overview

Max Total Supply

4,021 Tiger Club

Holders

2,830

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Tiger Club
0xfc41b442b44d1329fdce7446fccc497a13a73b65
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:
TigerTigerTiger

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 16 of 16: TigerTigerTiger.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/****************************************
 * @author: tiger_nft                 *
 * @team:   L.E.V.O                *
 ****************************************
 *   L.E.V.O-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/

import './Delegated.sol';
import './ERC721EnumerableT.sol';
import "./Strings.sol";
import "./ReentrancyGuard.sol";

contract TigerTigerTiger is ERC721EnumerableT, Delegated, ReentrancyGuard {
  using Strings for uint;


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

  /**
     *    @notice Keep track of each user and their info
     */
    struct Staker {
        mapping(address => uint256[]) stakedTokens;
        mapping(address => uint256) timeStaked;
        uint256 amountStaked;
    }


    
    // @notice mapping of a staker to its current properties
    mapping(address => Staker) public stakers;

    // Mapping from token ID to owner address
    mapping(uint256 => address) public originalStakeOwner;

     // @notice event emitted when a user has staked a token
    event Staked(address owner, uint256 tokenId);

    // @notice event emitted when a user has unstaked a token
    event Unstaked(address owner, uint256 tokenId);

  bool public revealed = false;
 

  uint public MAX_SUPPLY   = 5000;
  uint public PRICE        = 0.005 ether;
  uint public MAX_QTY = 2;
  
  Moon[] public moons;

  bool public isWhitelistActive = false;
  bool public isMintActive = false;

  mapping(address => uint) public mintNum;

  mapping(address => uint) public accessList;

  bool public isStakeActive   = false;

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

  constructor() 
    ERC721T("Tiger Tiger Tiger", "Tiger Club"){
  }
  
/**
  * @dev Returns the number of tokens in ``owners``'s account.
  */
  function balanceOf(address account) public view override returns (uint) {
    require(account != address(0), "Tiger: 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 override returns( bool ){
    for(uint i; i < tokenIds.length; ++i ){
      if( moons[ tokenIds[i] -1 ].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), "Tiger: 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 override returns (uint) {
    require(index <= totalSupply(), "Tiger: 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 override returns (uint tokenId) {
    uint count;
    for( uint i; i <= moons.length; ++i ){
      if( owner == moons[i].owner ){
        if( count == index )
          return i;
        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), "Tiger: 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 override returns( uint totalSupply_ ){
    return moons.length;
  }



/**
  * @dev Returns the list of tokenIds stored by the owner's account.
  */
  function walletOfOwner( address account ) external view override 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 Owner sets the Staking contract address.
  */
  function setRevealState(bool reveal_) external onlyDelegates {
      revealed = reveal_;
  }



 /**
  * @dev mints token based on the number of qty specified.
  */
  function mint( uint quantity ) external payable nonReentrant {
    require(isMintActive == true,"Tiger: Minting needs to be enabled.");
    //If whitelist is active, people in WL can mint 
    //based on the allowable qty limit set by owner/delegates.
    if( isWhitelistActive ){
      require( accessList[ msg.sender ] >= quantity, "Tiger: Account is less than the qty limit");
      accessList[ msg.sender ] -= quantity;
    } else { 
      //For public, MAX_QTY limit will be applied. 
      //MAX_QTY is determined by the owner/delegates
      require(mintNum[msg.sender]+quantity <= MAX_QTY,"Tiger:Quantity must be less than or equal MAX_QTY");
      if(mintNum[msg.sender]+quantity>1){
         require( msg.value >= PRICE , "Tiger: Ether sent is not correct" );
      }
    }

    uint supply = totalSupply();
    require( supply + quantity <= MAX_SUPPLY, "Tiger: Mint/order exceeds supply" );
    mintNum[msg.sender] = mintNum[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 onlyDelegates{
    require(quantity.length == recipient.length, "Tiger: 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, "Tiger: 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 Whitelist active flag.
  */
  function setWhitelistAddress(address[] calldata accounts, uint allowed) external onlyDelegates{
    for(uint i; i < accounts.length; ++i){
      accessList[ accounts[i] ] = allowed;
    }
  }

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

/**
  * @dev Owner/Delegate sets the Whitelist active flag.
  */
  function setWhitelistActive(bool isWhitelistActive_) external onlyDelegates{
    require( isWhitelistActive != isWhitelistActive_ , "Tiger: New value matches old" );
    isWhitelistActive = isWhitelistActive_;
  }

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

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

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

/**
  * @dev Owner/Delegate sets the minting price.
  */
  function setPrice(uint price) external onlyDelegates{
    require( PRICE != price, "Tiger: 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 onlyDelegates {
        //update logic to update the MoonType
        for(uint i=0; i < tokenIds.length; i++) {
            require(_exists(tokenIds[i]), "Tiger: 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, "Tiger: 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);
  }

  /**
    * @dev Get the tokens staked by a user
    */
    function getStakedTokens(address _user) public view returns (uint256[] memory tokenIds) {
        Staker storage staker = stakers[_user];
        return staker.stakedTokens[_user]; 
    }

/**
  * @dev Stake the NFT based on array of tokenIds
  */
    function stake( uint[] calldata tokenIds ) external {
        require( isStakeActive, "Tiger: Staking is not active" );
        
        Moon storage moon;
        //Check if TokenIds exist and the moon owner is the msge sender
        for( uint i; i < tokenIds.length; ++i ){
            require( _exists(tokenIds[i]-1), "Tiger: Query for nonexistent token" );
            moon = moons[ tokenIds[i]-1 ];
            require(moon.owner == msg.sender, "Tiger: Staking token that is not owned");

            _stake(msg.sender, tokenIds[i]);
        }
    }

    /**
    * @dev For internal access to stake the NFT based tokenId
    */
    function _stake( address _user, uint256 _tokenId ) internal {

        Staker storage staker = stakers[_user];

        staker.amountStaked += 1;
        staker.timeStaked[_user] = block.timestamp;
        staker.stakedTokens[_user].push(_tokenId);

        originalStakeOwner[_tokenId] = msg.sender;

        _transfer(_user,address(this), _tokenId);
      
        emit Staked(_user, _tokenId);

        
    }

/**
  * @dev Unstake the token based on array of tokenIds
  */
    function unStake( uint[] calldata tokenIds ) external {
        require( isStakeActive, "Tiger: Staking is not active" );
        //Check if TokenIds exist
        for( uint i; i < tokenIds.length; ++i ){
            require( originalStakeOwner[tokenIds[i]] == msg.sender, 
            "Tiger._unstake: Sender must have staked tokenID");
            _unstake(msg.sender,tokenIds[i]);        
        }
    }

    /**
    * @dev For internal access to unstake the NFT based tokenId
    */
    function _unstake( address _user, uint256 _tokenId) internal {

        Staker storage staker = stakers[_user];

        _removeElement(_user, _tokenId);

        delete originalStakeOwner[_tokenId];
        staker.timeStaked[_user] = block.timestamp;
        staker.amountStaked -= 1;

        if(staker.amountStaked == 0) {
            delete stakers[_user];
        }

        _transfer(address(this),_user, _tokenId);
        
        emit Unstaked(_user, _tokenId);
        
    }

  /**
    * @dev Owner/Delegate sets the Whitelist active flag.
    */
    function setStakeActive( bool isActive_ ) external onlyDelegates {
      require( isStakeActive != isActive_ , "Tiger: New value matches old" );
      isStakeActive = isActive_;
    }

    /**
    *   @notice remove given elements from array
    *   @dev usable only if _array contains unique elements only
     */
    function _removeElement(address _user, uint256 _element) internal {
        Staker storage staker = stakers[_user];
        for (uint256 i; i<staker.stakedTokens[_user].length; i++) {
            if (staker.stakedTokens[_user][i] == _element) {
                staker.stakedTokens[_user][i] = staker.stakedTokens[_user][staker.stakedTokens[_user].length - 1];
                staker.stakedTokens[_user].pop();
                break;
            }
        }
    }
}

File 1 of 16: 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 16: 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 16: Delegated.sol
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity ^0.8.0;

/***********************
* @author: squeebo_nft *
************************/

import "./Ownable.sol";

contract Delegated is Ownable {
  mapping(address => bool) internal _delegates;

  constructor(){
    _delegates[owner()] = true;
  }

  modifier onlyDelegates {
    require(_delegates[msg.sender], "Invalid delegate" );
    _;
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns ( bool ){
    return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{
    _delegates[addr] = isDelegate_;
  }

  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _delegates[newOwner] = true;
    super.transferOwnership( newOwner );
  }
}

File 4 of 16: 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 5 of 16: ERC721EnumerableT.sol
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity ^0.8.0;

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

import "./ERC721T.sol";
import "./IERC721Batch.sol";
import "./IERC721Enumerable.sol";

abstract contract ERC721EnumerableT is ERC721T, IERC721Batch, IERC721Enumerable {
    function balanceOf( address owner ) public view virtual override( IERC721, ERC721T ) returns( uint );

    function isOwnerOf( address account, uint[] calldata tokenIds ) external view virtual override returns( bool );

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

    function tokenOfOwnerByIndex(address owner, uint index) public view virtual override returns( uint tokenId );

    function tokenByIndex(uint index) external view virtual override returns (uint) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return index;
    }

    function totalSupply() public view virtual override returns( uint );

    function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external override{
        for(uint i; i < tokenIds.length; ++i ){
            safeTransferFrom( from, to, tokenIds[i], data );
        }
    }

    function walletOfOwner( address account ) external view virtual override 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;
    }
}

File 6 of 16: 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 7 of 16: 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 8 of 16: 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 9 of 16: IERC721Batch.sol
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity ^0.8.0;

interface IERC721Batch {
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool );
  function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external;
  function walletOfOwner( address account ) external view returns( uint[] memory );
}

File 10 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 16: 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 12 of 16: 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 13 of 16: 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 14 of 16: 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 15 of 16: 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":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Staked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unstaked","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":"","type":"address"}],"name":"accessList","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":"_user","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","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":[],"name":"isStakeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistActive","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":"address","name":"","type":"address"}],"name":"mintNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"originalStakeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","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":"bool","name":"reveal_","type":"bool"}],"name":"setRevealState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setStakeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isWhitelistActive_","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"amountStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferBatch","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unStake","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"}]

6009805460ff19908116909155611388600a556611c37937e08000600b556002600c55600e805461ffff1916905560118054909116905560e0604052603660808181529062003e3e60a03980516200006091601391602090910190620001d4565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200008f91601491620001d4565b503480156200009d57600080fd5b5060408051808201825260118152702a34b3b2b9102a34b3b2b9102a34b3b2b960791b60208083019182528351808501909452600a8452692a34b3b2b91021b63ab160b11b908401528151919291620000f991600091620001d4565b5080516200010f906001906020840190620001d4565b5050506200012c620001266200016f60201b60201c565b62000173565b6001600560006200013c620001c5565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001600655620002b7565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6004546001600160a01b031690565b828054620001e2906200027a565b90600052602060002090601f01602090048101928262000206576000855562000251565b82601f106200022157805160ff191683800117855562000251565b8280016001018555821562000251579182015b828111156200025157825182559160200191906001019062000234565b506200025f92915062000263565b5090565b5b808211156200025f576000815560010162000264565b6002810460018216806200028f57607f821691505b60208210811415620002b157634e487b7160e01b600052602260045260246000fd5b50919050565b613b7780620002c76000396000f3fe6080604052600436106103355760003560e01c806363c28db1116101ab578063a0712d68116100f7578063c3b754dc11610095578063d04ef2851161006f578063d04ef28514610945578063e985e9c514610965578063f2fde38b14610985578063fd4444c3146109a557610335565b8063c3b754dc146108e5578063c87b56dd14610905578063d01be3d01461092557610335565b8063abe8d620116100d1578063abe8d62014610865578063b10dcc9314610885578063b534a5c4146108a5578063b88d4fde146108c557610335565b8063a0712d6814610805578063a22cb46514610818578063aae4ff941461083857610335565b806387a5b67c116101645780638da5cb5b1161013e5780638da5cb5b1461079b5780639168ae72146107b057806391b7f5ed146107d057806395d89b41146107f057610335565b806387a5b67c146107465780638b2e9809146107665780638d859f3e1461078657610335565b806363c28db1146106915780636790a9de146106b15780636f8b44b0146106d157806370a08231146106f1578063715018a6146107115780637c0ba74f1461072657610335565b806332cb6b0c116102855780634f6ccce7116102235780635b92ac0d116101fd5780635b92ac0d146106275780635ecc02221461063c5780635ff162ca146106515780636352211e1461067157610335565b80634f6ccce7146105dd57806351830227146105fd578063524513d61461061257610335565b806345a15d641161025f57806345a15d641461055a5780634a994eef1461056f5780634d44660c1461058f5780634ee6bb23146105af57610335565b806332cb6b0c146104f857806342842e0e1461050d578063438b63001461052d57610335565b80630fbf0a93116102f257806323b872dd116102cc57806323b872dd14610478578063272ff248146104985780632e1a7d4d146104b85780632f745c59146104d857610335565b80630fbf0a931461042157806318160ddd146104415780631c96cae91461046357610335565b806301ffc9a71461033a57806306fdde03146103705780630777962714610392578063081812fc146103b2578063095ea7b3146103df5780630d84d1b114610401575b600080fd5b34801561034657600080fd5b5061035a610355366004612ee8565b6109c5565b6040516103679190613191565b60405180910390f35b34801561037c57600080fd5b506103856109f2565b604051610367919061319c565b34801561039e57600080fd5b5061035a6103ad366004612b26565b610a84565b3480156103be57600080fd5b506103d26103cd366004612f7c565b610aed565b604051610367919061308e565b3480156103eb57600080fd5b506103ff6103fa366004612d7e565b610b30565b005b34801561040d57600080fd5b506103d261041c366004612f7c565b610bc8565b34801561042d57600080fd5b506103ff61043c366004612df0565b610be3565b34801561044d57600080fd5b50610456610d38565b60405161036791906139e4565b34801561046f57600080fd5b50610456610d3e565b34801561048457600080fd5b506103ff610493366004612bff565b610d44565b3480156104a457600080fd5b506103ff6104b3366004612f7c565b610d7c565b3480156104c457600080fd5b506103ff6104d3366004612f7c565b610dd2565b3480156104e457600080fd5b506104566104f3366004612d7e565b610ea5565b34801561050457600080fd5b50610456610f40565b34801561051957600080fd5b506103ff610528366004612bff565b610f46565b34801561053957600080fd5b5061054d610548366004612b26565b610f61565b6040516103679190613159565b34801561056657600080fd5b5061035a61101c565b34801561057b57600080fd5b506103ff61058a366004612d55565b611025565b34801561059b57600080fd5b5061035a6105aa366004612d05565b61108f565b3480156105bb57600080fd5b506105cf6105ca366004612f7c565b611139565b6040516103679291906130df565b3480156105e957600080fd5b506104566105f8366004612f7c565b61116e565b34801561060957600080fd5b5061035a61119b565b34801561061e57600080fd5b5061035a6111a4565b34801561063357600080fd5b5061035a6111ad565b34801561064857600080fd5b506104566111bb565b34801561065d57600080fd5b506103ff61066c366004612e97565b6111bf565b34801561067d57600080fd5b506103d261068c366004612f7c565b61122a565b34801561069d57600080fd5b5061054d6106ac366004612b26565b61128c565b3480156106bd57600080fd5b506103ff6106cc366004612f20565b6112ff565b3480156106dd57600080fd5b506103ff6106ec366004612f7c565b61134e565b3480156106fd57600080fd5b5061045661070c366004612b26565b6113cb565b34801561071d57600080fd5b506103ff61140f565b34801561073257600080fd5b506103ff610741366004612e2f565b61145a565b34801561075257600080fd5b50610456610761366004612b26565b6115e4565b34801561077257600080fd5b506103ff610781366004612e97565b6115f6565b34801561079257600080fd5b50610456611638565b3480156107a757600080fd5b506103d261163e565b3480156107bc57600080fd5b506104566107cb366004612b26565b61164d565b3480156107dc57600080fd5b506103ff6107eb366004612f7c565b611662565b3480156107fc57600080fd5b506103856116b8565b6103ff610813366004612f7c565b6116c7565b34801561082457600080fd5b506103ff610833366004612d55565b6118a8565b34801561084457600080fd5b50610858610853366004612df0565b611976565b6040516103679190613113565b34801561087157600080fd5b506103ff610880366004612eb1565b611a87565b34801561089157600080fd5b506103ff6108a0366004612df0565b611b97565b3480156108b157600080fd5b506103ff6108c0366004612b72565b611c69565b3480156108d157600080fd5b506103ff6108e0366004612c3a565b611cec565b3480156108f157600080fd5b506103ff610900366004612e97565b611d25565b34801561091157600080fd5b50610385610920366004612f7c565b611d90565b34801561093157600080fd5b506103ff610940366004612da7565b611dec565b34801561095157600080fd5b506103ff610960366004612e97565b611e8a565b34801561097157600080fd5b5061035a610980366004612b40565b611f02565b34801561099157600080fd5b506103ff6109a0366004612b26565b611f30565b3480156109b157600080fd5b506104566109c0366004612b26565b611f9e565b60006001600160e01b0319821663780e9d6360e01b14806109ea57506109ea82611fb0565b90505b919050565b606060008054610a0190613a7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90613a7f565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000610a8e611ff0565b6001600160a01b0316610a9f61163e565b6001600160a01b031614610ace5760405162461bcd60e51b8152600401610ac59061369e565b60405180910390fd5b506001600160a01b031660009081526005602052604090205460ff1690565b6000610af882611ff4565b610b145760405162461bcd60e51b8152600401610ac590613652565b506000908152600260205260409020546001600160a01b031690565b6000610b3b8261122a565b9050806001600160a01b0316836001600160a01b03161415610b6f5760405162461bcd60e51b8152600401610ac590613772565b806001600160a01b0316610b81611ff0565b6001600160a01b03161480610b9d5750610b9d81610980611ff0565b610bb95760405162461bcd60e51b8152600401610ac5906135c0565b610bc38383612058565b505050565b6008602052600090815260409020546001600160a01b031681565b60115460ff16610c055760405162461bcd60e51b8152600401610ac5906134f6565b6000805b82811015610d3257610c4c6001858584818110610c3657634e487b7160e01b600052603260045260246000fd5b90506020020135610c479190613a25565b611ff4565b610c685760405162461bcd60e51b8152600401610ac59061332a565b600d6001858584818110610c8c57634e487b7160e01b600052603260045260246000fd5b90506020020135610c9d9190613a25565b81548110610cbb57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180549092506001600160a01b03163314610cf25760405162461bcd60e51b8152600401610ac59061382b565b610d2233858584818110610d1657634e487b7160e01b600052603260045260246000fd5b905060200201356120c6565b610d2b81613aba565b9050610c09565b50505050565b600d5490565b600c5481565b610d55610d4f611ff0565b82612194565b610d715760405162461bcd60e51b8152600401610ac5906138ba565b610bc3838383612219565b3360009081526005602052604090205460ff16610dab5760405162461bcd60e51b8152600401610ac5906131af565b80600c541415610dcd5760405162461bcd60e51b8152600401610ac5906131d9565b600c55565b610dda611ff0565b6001600160a01b0316610deb61163e565b6001600160a01b031614610e115760405162461bcd60e51b8152600401610ac59061369e565b80471015610e315760405162461bcd60e51b8152600401610ac590613473565b6000610e3b61163e565b6001600160a01b031682604051610e519061308b565b60006040518083038185875af1925050503d8060008114610e8e576040519150601f19603f3d011682016040523d82523d6000602084013e610e93565b606091505b5050905080610ea157600080fd5b5050565b60008060005b600d548111610f2157600d8181548110610ed557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610f115783821415610f05579150610f3a9050565b610f0e82613aba565b91505b610f1a81613aba565b9050610eab565b5060405162461bcd60e51b8152600401610ac590613247565b92915050565b600a5481565b610bc383838360405180602001604052806000815250611cec565b60606000610f6e836113cb565b90506000816001600160401b03811115610f9857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc1578160200160208202803683370190505b50905060005b8281101561101457610fd98582610ea5565b828281518110610ff957634e487b7160e01b600052603260045260246000fd5b602090810291909101015261100d81613aba565b9050610fc7565b509392505050565b60115460ff1681565b61102d611ff0565b6001600160a01b031661103e61163e565b6001600160a01b0316146110645760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561112c57846001600160a01b0316600d60018686858181106110c957634e487b7160e01b600052603260045260246000fd5b905060200201356110da9190613a25565b815481106110f857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161461111c576000915050611132565b61112581613aba565b9050611093565b50600190505b9392505050565b600d818154811061114957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000611178610d38565b8211156111975760405162461bcd60e51b8152600401610ac5906133b2565b5090565b60095460ff1681565b600e5460ff1681565b600e54610100900460ff1681565b4790565b3360009081526005602052604090205460ff166111ee5760405162461bcd60e51b8152600401610ac5906131af565b60115460ff16151581151514156112175760405162461bcd60e51b8152600401610ac5906131d9565b6011805460ff1916911515919091179055565b600080600d61123a600185613a25565b8154811061125857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806109ea5760405162461bcd60e51b8152600401610ac59061352d565b6001600160a01b0381166000908152600760209081526040808320808352928190208054825181850281018501909352808352606094938301828280156112f257602002820191906000526020600020905b8154815260200190600101908083116112de575b5050505050915050919050565b3360009081526005602052604090205460ff1661132e5760405162461bcd60e51b8152600401610ac5906131af565b61133a601385856129e8565b50611347601483836129e8565b5050505050565b3360009081526005602052604090205460ff1661137d5760405162461bcd60e51b8152600401610ac5906131af565b80600a54141561139f5760405162461bcd60e51b8152600401610ac5906131d9565b6113a7610d38565b8110156113c65760405162461bcd60e51b8152600401610ac5906136d3565b600a55565b60006001600160a01b0382166113f35760405162461bcd60e51b8152600401610ac590613871565b506001600160a01b031660009081526012602052604090205490565b611417611ff0565b6001600160a01b031661142861163e565b6001600160a01b03161461144e5760405162461bcd60e51b8152600401610ac59061369e565b611458600061231b565b565b3360009081526005602052604090205460ff166114895760405162461bcd60e51b8152600401610ac5906131af565b8281146114a85760405162461bcd60e51b8152600401610ac590613942565b6000806114b3610d38565b905060005b85811015611504578686828181106114e057634e487b7160e01b600052603260045260246000fd5b90506020020135836114f291906139f9565b92506114fd81613aba565b90506114b8565b50600a5461151283836139f9565b1061152f5760405162461bcd60e51b8152600401610ac5906137f6565b60005b838110156115db5760005b87878381811061155d57634e487b7160e01b600052603260045260246000fd5b905060200201358110156115ca57600061157684613aba565b93508390506115b987878581811061159e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115b39190612b26565b8261236d565b506115c381613aba565b905061153d565b506115d481613aba565b9050611532565b50505050505050565b60106020526000908152604090205481565b3360009081526005602052604090205460ff166116255760405162461bcd60e51b8152600401610ac5906131af565b6009805460ff1916911515919091179055565b600b5481565b6004546001600160a01b031690565b60076020526000908152604090206002015481565b3360009081526005602052604090205460ff166116915760405162461bcd60e51b8152600401610ac5906131af565b80600b5414156116b35760405162461bcd60e51b8152600401610ac5906131d9565b600b55565b606060018054610a0190613a7f565b600260065414156116ea5760405162461bcd60e51b8152600401610ac59061390b565b6002600655600e5460ff61010090910416151560011461171c5760405162461bcd60e51b8152600401610ac5906137b3565b600e5460ff161561178057336000908152601060205260409020548111156117565760405162461bcd60e51b8152600401610ac5906133f3565b3360009081526010602052604081208054839290611775908490613a25565b909155506118029050565b600c54336000908152600f602052604090205461179e9083906139f9565b11156117bc5760405162461bcd60e51b8152600401610ac59061356f565b336000908152600f60205260409020546001906117da9083906139f9565b111561180257600b543410156118025760405162461bcd60e51b8152600401610ac59061361d565b600061180c610d38565b600a5490915061181c83836139f9565b111561183a5760405162461bcd60e51b8152600401610ac5906137f6565b336000908152600f60205260409020546118559083906139f9565b336000908152600f60205260408120919091555b8281101561189e57600061187c83613aba565b925082905061188b338261236d565b508061189681613aba565b915050611869565b5050600160065550565b6118b0611ff0565b6001600160a01b0316826001600160a01b031614156118e15760405162461bcd60e51b8152600401610ac59061343c565b80600360006118ee611ff0565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611932611ff0565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196a9190613191565b60405180910390a35050565b60606000826001600160401b038111156119a057634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119c9578160200160208202803683370190505b50905060005b8381101561101457600d60018686848181106119fb57634e487b7160e01b600052603260045260246000fd5b90506020020135611a0c9190613a25565b81548110611a2a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160149054906101000a900460ff16828281518110611a6557634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015280611a7f81613aba565b9150506119cf565b3360009081526005602052604090205460ff16611ab65760405162461bcd60e51b8152600401610ac5906131af565b60005b81811015610d3257611af0838383818110611ae457634e487b7160e01b600052603260045260246000fd5b90506020020135611ff4565b611b0c5760405162461bcd60e51b8152600401610ac590613210565b83600d6001858585818110611b3157634e487b7160e01b600052603260045260246000fd5b90506020020135611b429190613a25565b81548110611b6057634e487b7160e01b600052603260045260246000fd5b60009182526020909120018054911515600160a01b0260ff60a01b1990921691909117905580611b8f81613aba565b915050611ab9565b60115460ff16611bb95760405162461bcd60e51b8152600401610ac5906134f6565b60005b81811015610bc3573360086000858585818110611be957634e487b7160e01b600052603260045260246000fd5b60209081029290920135835250810191909152604001600020546001600160a01b031614611c295760405162461bcd60e51b8152600401610ac590613995565b611c5933848484818110611c4d57634e487b7160e01b600052603260045260246000fd5b9050602002013561242a565b611c6281613aba565b9050611bbc565b60005b838110156115db57611cdc8787878785818110611c9957634e487b7160e01b600052603260045260246000fd5b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cec92505050565b611ce581613aba565b9050611c6c565b611cfd611cf7611ff0565b83612194565b611d195760405162461bcd60e51b8152600401610ac5906138ba565b610d3284848484612500565b3360009081526005602052604090205460ff16611d545760405162461bcd60e51b8152600401610ac5906131af565b600e5460ff1615158115151415611d7d5760405162461bcd60e51b8152600401610ac5906131d9565b600e805460ff1916911515919091179055565b6060611d9b82611ff4565b611db75760405162461bcd60e51b8152600401610ac590613292565b6013611dc283612533565b6014604051602001611dd693929190613058565b6040516020818303038152906040529050919050565b3360009081526005602052604090205460ff16611e1b5760405162461bcd60e51b8152600401610ac5906131af565b60005b82811015610d32578160106000868685818110611e4b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e609190612b26565b6001600160a01b03168152602081019190915260400160002055611e8381613aba565b9050611e1e565b3360009081526005602052604090205460ff16611eb95760405162461bcd60e51b8152600401610ac5906131af565b600e5460ff6101009091041615158115151415611ee85760405162461bcd60e51b8152600401610ac5906131d9565b600e80549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b611f38611ff0565b6001600160a01b0316611f4961163e565b6001600160a01b031614611f6f5760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b0381166000908152600560205260409020805460ff19166001179055611f9b8161264d565b50565b600f6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480611fe157506001600160e01b03198216635b5e139f60e01b145b806109ea57506109ea826126bb565b3390565b600080821180156120075750600d548211155b80156109ea57506000600d61201d600185613a25565b8154811061203b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080546001600160a01b0319166001600160a01b038416908117909155819061208d8261122a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216600090815260076020526040812060028101805491926001926120f49084906139f9565b90915550506001600160a01b038316600090815260018083016020908152604080842042905584825280842080549384018155845281842090920185905584835260089052902080546001600160a01b03191633179055612156833084612219565b7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83836040516121879291906130fa565b60405180910390a1505050565b600061219f82611ff4565b6121bb5760405162461bcd60e51b8152600401610ac5906134aa565b60006121c68361122a565b9050806001600160a01b0316846001600160a01b031614806122015750836001600160a01b03166121f684610aed565b6001600160a01b0316145b8061221157506122118185611f02565b949350505050565b6001600160a01b038316600d612230600184613a25565b8154811061224e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146122805760405162461bcd60e51b8152600401610ac590613728565b61228b600082612058565b61229583836126d4565b81600d6122a3600184613a25565b815481106122c157634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123786000836126d4565b6040805180820182526001600160a01b03808516808352600060208401818152600d805460018101825590835294517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5909501805491511515600160a01b0260ff60a01b19969095166001600160a01b031990921691909117949094169290921790925591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038216600090815260076020526040902061244c838361274b565b600082815260086020908152604080832080546001600160a01b03191690556001600160a01b03861683526001848101909252822042905560028301805491929091612499908490613a25565b909155505060028101546124c4576001600160a01b0383166000908152600760205260408120600201555b6124cf308484612219565b7f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7583836040516121879291906130fa565b61250b848484612219565b612517848484846128c7565b610d325760405162461bcd60e51b8152600401610ac5906132d8565b60608161255857506040805180820190915260018152600360fc1b60208201526109ed565b8160005b8115612582578061256c81613aba565b915061257b9050600a83613a11565b915061255c565b6000816001600160401b038111156125aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125d4576020820181803683370190505b5090505b8415612211576125e9600183613a25565b91506125f6600a86613ad5565b6126019060306139f9565b60f81b81838151811061262457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612646600a86613a11565b94506125d8565b612655611ff0565b6001600160a01b031661266661163e565b6001600160a01b03161461268c5760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b0381166126b25760405162461bcd60e51b8152600401610ac59061336c565b611f9b8161231b565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382161561270e576001600160a01b0382166000908152601260205260408120805490919061270990613a68565b909155505b6001600160a01b03811615610ea1576001600160a01b0381166000908152601260205260408120805490919061274390613aba565b909155505050565b6001600160a01b0382166000908152600760205260408120905b6001600160a01b038416600090815260208390526040902054811015610d32576001600160a01b03841660009081526020839052604090208054849190839081106127c057634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156128b5576001600160a01b038416600090815260208390526040902080546127f790600190613a25565b8154811061281557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b038716835290849052604090912080548390811061285857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152908390526040902080548061289a57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055610d32565b806128bf81613aba565b915050612765565b60006128db846001600160a01b03166129e2565b156129d757836001600160a01b031663150b7a026128f7611ff0565b8786866040518563ffffffff1660e01b815260040161291994939291906130a2565b602060405180830381600087803b15801561293357600080fd5b505af1925050508015612963575060408051601f3d908101601f1916820190925261296091810190612f04565b60015b6129bd573d808015612991576040519150601f19603f3d011682016040523d82523d6000602084013e612996565b606091505b5080516129b55760405162461bcd60e51b8152600401610ac5906132d8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612211565b506001949350505050565b3b151590565b8280546129f490613a7f565b90600052602060002090601f016020900481019282612a165760008555612a5c565b82601f10612a2f5782800160ff19823516178555612a5c565b82800160010185558215612a5c579182015b82811115612a5c578235825591602001919060010190612a41565b506111979291505b808211156111975760008155600101612a64565b80356001600160a01b03811681146109ed57600080fd5b60008083601f840112612aa0578081fd5b5081356001600160401b03811115612ab6578182fd5b6020830191508360208083028501011115612ad057600080fd5b9250929050565b803580151581146109ed57600080fd5b60008083601f840112612af8578182fd5b5081356001600160401b03811115612b0e578182fd5b602083019150836020828501011115612ad057600080fd5b600060208284031215612b37578081fd5b61113282612a78565b60008060408385031215612b52578081fd5b612b5b83612a78565b9150612b6960208401612a78565b90509250929050565b60008060008060008060808789031215612b8a578182fd5b612b9387612a78565b9550612ba160208801612a78565b945060408701356001600160401b0380821115612bbc578384fd5b612bc88a838b01612a8f565b90965094506060890135915080821115612be0578384fd5b50612bed89828a01612ae7565b979a9699509497509295939492505050565b600080600060608486031215612c13578283fd5b612c1c84612a78565b9250612c2a60208501612a78565b9150604084013590509250925092565b60008060008060808587031215612c4f578384fd5b612c5885612a78565b93506020612c67818701612a78565b93506040860135925060608601356001600160401b0380821115612c89578384fd5b818801915088601f830112612c9c578384fd5b813581811115612cae57612cae613b15565b604051601f8201601f1916810185018381118282101715612cd157612cd1613b15565b60405281815283820185018b1015612ce7578586fd5b81858501868301379081019093019390935250939692955090935050565b600080600060408486031215612d19578283fd5b612d2284612a78565b925060208401356001600160401b03811115612d3c578283fd5b612d4886828701612a8f565b9497909650939450505050565b60008060408385031215612d67578182fd5b612d7083612a78565b9150612b6960208401612ad7565b60008060408385031215612d90578182fd5b612d9983612a78565b946020939093013593505050565b600080600060408486031215612dbb578283fd5b83356001600160401b03811115612dd0578384fd5b612ddc86828701612a8f565b909790965060209590950135949350505050565b60008060208385031215612e02578182fd5b82356001600160401b03811115612e17578283fd5b612e2385828601612a8f565b90969095509350505050565b60008060008060408587031215612e44578182fd5b84356001600160401b0380821115612e5a578384fd5b612e6688838901612a8f565b90965094506020870135915080821115612e7e578384fd5b50612e8b87828801612a8f565b95989497509550505050565b600060208284031215612ea8578081fd5b61113282612ad7565b600080600060408486031215612ec5578081fd5b612ece84612ad7565b925060208401356001600160401b03811115612d3c578182fd5b600060208284031215612ef9578081fd5b813561113281613b2b565b600060208284031215612f15578081fd5b815161113281613b2b565b60008060008060408587031215612f35578182fd5b84356001600160401b0380821115612f4b578384fd5b612f5788838901612ae7565b90965094506020870135915080821115612f6f578384fd5b50612e8b87828801612ae7565b600060208284031215612f8d578081fd5b5035919050565b60008151808452612fac816020860160208601613a3c565b601f01601f19169290920160200192915050565b805460009060028104600180831680612fda57607f831692505b6020808410821415612ffa57634e487b7160e01b86526022600452602486fd5b81801561300e576001811461301f5761304c565b60ff1986168952848901965061304c565b613028886139ed565b60005b868110156130445781548b82015290850190830161302b565b505084890196505b50505050505092915050565b60006130648286612fc0565b8451613074818360208901613a3c565b61308081830186612fc0565b979650505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130d590830184612f94565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561314d57835115158352928401929184019160010161312f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561314d57835183529284019291840191600101613175565b901515815260200190565b6000602082526111326020830184612f94565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b6020808252601c908201527f54696765723a204e65772076616c7565206d617463686573206f6c6400000000604082015260600190565b60208082526018908201527f54696765723a20546f6b656e4964206e6f742065786973740000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526026908201527f54696765723a2055524920717565727920666f72206e6f6e6578697374656e74604082015265103a37b5b2b760d11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526022908201527f54696765723a20517565727920666f72206e6f6e6578697374656e7420746f6b60408201526132b760f11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f54696765723a20676c6f62616c20696e646578206f7574206f6620626f756e646040820152607360f81b606082015260800190565b60208082526029908201527f54696765723a204163636f756e74206973206c657373207468616e20746865206040820152681c5d1e481b1a5b5a5d60ba1b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601c908201527f54696765723a205374616b696e67206973206e6f742061637469766500000000604082015260600190565b60208082526022908201527f54696765723a20717565727920666f72206e6f6e6578697374656e7420746f6b60408201526132b760f11b606082015260800190565b60208082526031908201527f54696765723a5175616e74697479206d757374206265206c657373207468616e604082015270206f7220657175616c204d41585f51545960781b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f54696765723a2045746865722073656e74206973206e6f7420636f7272656374604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526035908201527f54696765723a2053706563696669656420737570706c79206973206c6f776572604082015274207468616e2063757272656e742062616c616e636560581b606082015260800190565b6020808252602a908201527f54696765723a207472616e73666572206f6620746f6b656e2074686174206973604082015269081b9bdd081bdddb995960b21b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526023908201527f54696765723a204d696e74696e67206e6565647320746f20626520656e61626c60408201526232b21760e91b606082015260800190565b6020808252818101527f54696765723a204d696e742f6f72646572206578636565647320737570706c79604082015260600190565b60208082526026908201527f54696765723a205374616b696e6720746f6b656e2074686174206973206e6f74604082015265081bdddb995960d21b606082015260800190565b60208082526029908201527f54696765723a2062616c616e636520717565727920666f7220746865207a65726040820152686f206164647265737360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526033908201527f54696765723a204d7573742070726f7669646520657175616c207175616e74696040820152727469657320616e6420726563697069656e747360681b606082015260800190565b6020808252602f908201527f54696765722e5f756e7374616b653a2053656e646572206d757374206861766560408201526e081cdd185ad959081d1bdad95b9251608a1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115613a0c57613a0c613ae9565b500190565b600082613a2057613a20613aff565b500490565b600082821015613a3757613a37613ae9565b500390565b60005b83811015613a57578181015183820152602001613a3f565b83811115610d325750506000910152565b600081613a7757613a77613ae9565b506000190190565b600281046001821680613a9357607f821691505b60208210811415613ab457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ace57613ace613ae9565b5060010190565b600082613ae457613ae4613aff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f9b57600080fdfea264697066735822122009fa913df8ab97db5927fa573e16ff07db177f2f8de295e7574ce52c876a32ce64736f6c63430008000033697066733a2f2f516d5a5151503837693576797434574c377944776e416f3446734e6a386134484e516648697a726762564d3576752f

Deployed Bytecode

0x6080604052600436106103355760003560e01c806363c28db1116101ab578063a0712d68116100f7578063c3b754dc11610095578063d04ef2851161006f578063d04ef28514610945578063e985e9c514610965578063f2fde38b14610985578063fd4444c3146109a557610335565b8063c3b754dc146108e5578063c87b56dd14610905578063d01be3d01461092557610335565b8063abe8d620116100d1578063abe8d62014610865578063b10dcc9314610885578063b534a5c4146108a5578063b88d4fde146108c557610335565b8063a0712d6814610805578063a22cb46514610818578063aae4ff941461083857610335565b806387a5b67c116101645780638da5cb5b1161013e5780638da5cb5b1461079b5780639168ae72146107b057806391b7f5ed146107d057806395d89b41146107f057610335565b806387a5b67c146107465780638b2e9809146107665780638d859f3e1461078657610335565b806363c28db1146106915780636790a9de146106b15780636f8b44b0146106d157806370a08231146106f1578063715018a6146107115780637c0ba74f1461072657610335565b806332cb6b0c116102855780634f6ccce7116102235780635b92ac0d116101fd5780635b92ac0d146106275780635ecc02221461063c5780635ff162ca146106515780636352211e1461067157610335565b80634f6ccce7146105dd57806351830227146105fd578063524513d61461061257610335565b806345a15d641161025f57806345a15d641461055a5780634a994eef1461056f5780634d44660c1461058f5780634ee6bb23146105af57610335565b806332cb6b0c146104f857806342842e0e1461050d578063438b63001461052d57610335565b80630fbf0a93116102f257806323b872dd116102cc57806323b872dd14610478578063272ff248146104985780632e1a7d4d146104b85780632f745c59146104d857610335565b80630fbf0a931461042157806318160ddd146104415780631c96cae91461046357610335565b806301ffc9a71461033a57806306fdde03146103705780630777962714610392578063081812fc146103b2578063095ea7b3146103df5780630d84d1b114610401575b600080fd5b34801561034657600080fd5b5061035a610355366004612ee8565b6109c5565b6040516103679190613191565b60405180910390f35b34801561037c57600080fd5b506103856109f2565b604051610367919061319c565b34801561039e57600080fd5b5061035a6103ad366004612b26565b610a84565b3480156103be57600080fd5b506103d26103cd366004612f7c565b610aed565b604051610367919061308e565b3480156103eb57600080fd5b506103ff6103fa366004612d7e565b610b30565b005b34801561040d57600080fd5b506103d261041c366004612f7c565b610bc8565b34801561042d57600080fd5b506103ff61043c366004612df0565b610be3565b34801561044d57600080fd5b50610456610d38565b60405161036791906139e4565b34801561046f57600080fd5b50610456610d3e565b34801561048457600080fd5b506103ff610493366004612bff565b610d44565b3480156104a457600080fd5b506103ff6104b3366004612f7c565b610d7c565b3480156104c457600080fd5b506103ff6104d3366004612f7c565b610dd2565b3480156104e457600080fd5b506104566104f3366004612d7e565b610ea5565b34801561050457600080fd5b50610456610f40565b34801561051957600080fd5b506103ff610528366004612bff565b610f46565b34801561053957600080fd5b5061054d610548366004612b26565b610f61565b6040516103679190613159565b34801561056657600080fd5b5061035a61101c565b34801561057b57600080fd5b506103ff61058a366004612d55565b611025565b34801561059b57600080fd5b5061035a6105aa366004612d05565b61108f565b3480156105bb57600080fd5b506105cf6105ca366004612f7c565b611139565b6040516103679291906130df565b3480156105e957600080fd5b506104566105f8366004612f7c565b61116e565b34801561060957600080fd5b5061035a61119b565b34801561061e57600080fd5b5061035a6111a4565b34801561063357600080fd5b5061035a6111ad565b34801561064857600080fd5b506104566111bb565b34801561065d57600080fd5b506103ff61066c366004612e97565b6111bf565b34801561067d57600080fd5b506103d261068c366004612f7c565b61122a565b34801561069d57600080fd5b5061054d6106ac366004612b26565b61128c565b3480156106bd57600080fd5b506103ff6106cc366004612f20565b6112ff565b3480156106dd57600080fd5b506103ff6106ec366004612f7c565b61134e565b3480156106fd57600080fd5b5061045661070c366004612b26565b6113cb565b34801561071d57600080fd5b506103ff61140f565b34801561073257600080fd5b506103ff610741366004612e2f565b61145a565b34801561075257600080fd5b50610456610761366004612b26565b6115e4565b34801561077257600080fd5b506103ff610781366004612e97565b6115f6565b34801561079257600080fd5b50610456611638565b3480156107a757600080fd5b506103d261163e565b3480156107bc57600080fd5b506104566107cb366004612b26565b61164d565b3480156107dc57600080fd5b506103ff6107eb366004612f7c565b611662565b3480156107fc57600080fd5b506103856116b8565b6103ff610813366004612f7c565b6116c7565b34801561082457600080fd5b506103ff610833366004612d55565b6118a8565b34801561084457600080fd5b50610858610853366004612df0565b611976565b6040516103679190613113565b34801561087157600080fd5b506103ff610880366004612eb1565b611a87565b34801561089157600080fd5b506103ff6108a0366004612df0565b611b97565b3480156108b157600080fd5b506103ff6108c0366004612b72565b611c69565b3480156108d157600080fd5b506103ff6108e0366004612c3a565b611cec565b3480156108f157600080fd5b506103ff610900366004612e97565b611d25565b34801561091157600080fd5b50610385610920366004612f7c565b611d90565b34801561093157600080fd5b506103ff610940366004612da7565b611dec565b34801561095157600080fd5b506103ff610960366004612e97565b611e8a565b34801561097157600080fd5b5061035a610980366004612b40565b611f02565b34801561099157600080fd5b506103ff6109a0366004612b26565b611f30565b3480156109b157600080fd5b506104566109c0366004612b26565b611f9e565b60006001600160e01b0319821663780e9d6360e01b14806109ea57506109ea82611fb0565b90505b919050565b606060008054610a0190613a7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2d90613a7f565b8015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000610a8e611ff0565b6001600160a01b0316610a9f61163e565b6001600160a01b031614610ace5760405162461bcd60e51b8152600401610ac59061369e565b60405180910390fd5b506001600160a01b031660009081526005602052604090205460ff1690565b6000610af882611ff4565b610b145760405162461bcd60e51b8152600401610ac590613652565b506000908152600260205260409020546001600160a01b031690565b6000610b3b8261122a565b9050806001600160a01b0316836001600160a01b03161415610b6f5760405162461bcd60e51b8152600401610ac590613772565b806001600160a01b0316610b81611ff0565b6001600160a01b03161480610b9d5750610b9d81610980611ff0565b610bb95760405162461bcd60e51b8152600401610ac5906135c0565b610bc38383612058565b505050565b6008602052600090815260409020546001600160a01b031681565b60115460ff16610c055760405162461bcd60e51b8152600401610ac5906134f6565b6000805b82811015610d3257610c4c6001858584818110610c3657634e487b7160e01b600052603260045260246000fd5b90506020020135610c479190613a25565b611ff4565b610c685760405162461bcd60e51b8152600401610ac59061332a565b600d6001858584818110610c8c57634e487b7160e01b600052603260045260246000fd5b90506020020135610c9d9190613a25565b81548110610cbb57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180549092506001600160a01b03163314610cf25760405162461bcd60e51b8152600401610ac59061382b565b610d2233858584818110610d1657634e487b7160e01b600052603260045260246000fd5b905060200201356120c6565b610d2b81613aba565b9050610c09565b50505050565b600d5490565b600c5481565b610d55610d4f611ff0565b82612194565b610d715760405162461bcd60e51b8152600401610ac5906138ba565b610bc3838383612219565b3360009081526005602052604090205460ff16610dab5760405162461bcd60e51b8152600401610ac5906131af565b80600c541415610dcd5760405162461bcd60e51b8152600401610ac5906131d9565b600c55565b610dda611ff0565b6001600160a01b0316610deb61163e565b6001600160a01b031614610e115760405162461bcd60e51b8152600401610ac59061369e565b80471015610e315760405162461bcd60e51b8152600401610ac590613473565b6000610e3b61163e565b6001600160a01b031682604051610e519061308b565b60006040518083038185875af1925050503d8060008114610e8e576040519150601f19603f3d011682016040523d82523d6000602084013e610e93565b606091505b5050905080610ea157600080fd5b5050565b60008060005b600d548111610f2157600d8181548110610ed557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0386811691161415610f115783821415610f05579150610f3a9050565b610f0e82613aba565b91505b610f1a81613aba565b9050610eab565b5060405162461bcd60e51b8152600401610ac590613247565b92915050565b600a5481565b610bc383838360405180602001604052806000815250611cec565b60606000610f6e836113cb565b90506000816001600160401b03811115610f9857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc1578160200160208202803683370190505b50905060005b8281101561101457610fd98582610ea5565b828281518110610ff957634e487b7160e01b600052603260045260246000fd5b602090810291909101015261100d81613aba565b9050610fc7565b509392505050565b60115460ff1681565b61102d611ff0565b6001600160a01b031661103e61163e565b6001600160a01b0316146110645760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561112c57846001600160a01b0316600d60018686858181106110c957634e487b7160e01b600052603260045260246000fd5b905060200201356110da9190613a25565b815481106110f857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161461111c576000915050611132565b61112581613aba565b9050611093565b50600190505b9392505050565b600d818154811061114957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000611178610d38565b8211156111975760405162461bcd60e51b8152600401610ac5906133b2565b5090565b60095460ff1681565b600e5460ff1681565b600e54610100900460ff1681565b4790565b3360009081526005602052604090205460ff166111ee5760405162461bcd60e51b8152600401610ac5906131af565b60115460ff16151581151514156112175760405162461bcd60e51b8152600401610ac5906131d9565b6011805460ff1916911515919091179055565b600080600d61123a600185613a25565b8154811061125857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806109ea5760405162461bcd60e51b8152600401610ac59061352d565b6001600160a01b0381166000908152600760209081526040808320808352928190208054825181850281018501909352808352606094938301828280156112f257602002820191906000526020600020905b8154815260200190600101908083116112de575b5050505050915050919050565b3360009081526005602052604090205460ff1661132e5760405162461bcd60e51b8152600401610ac5906131af565b61133a601385856129e8565b50611347601483836129e8565b5050505050565b3360009081526005602052604090205460ff1661137d5760405162461bcd60e51b8152600401610ac5906131af565b80600a54141561139f5760405162461bcd60e51b8152600401610ac5906131d9565b6113a7610d38565b8110156113c65760405162461bcd60e51b8152600401610ac5906136d3565b600a55565b60006001600160a01b0382166113f35760405162461bcd60e51b8152600401610ac590613871565b506001600160a01b031660009081526012602052604090205490565b611417611ff0565b6001600160a01b031661142861163e565b6001600160a01b03161461144e5760405162461bcd60e51b8152600401610ac59061369e565b611458600061231b565b565b3360009081526005602052604090205460ff166114895760405162461bcd60e51b8152600401610ac5906131af565b8281146114a85760405162461bcd60e51b8152600401610ac590613942565b6000806114b3610d38565b905060005b85811015611504578686828181106114e057634e487b7160e01b600052603260045260246000fd5b90506020020135836114f291906139f9565b92506114fd81613aba565b90506114b8565b50600a5461151283836139f9565b1061152f5760405162461bcd60e51b8152600401610ac5906137f6565b60005b838110156115db5760005b87878381811061155d57634e487b7160e01b600052603260045260246000fd5b905060200201358110156115ca57600061157684613aba565b93508390506115b987878581811061159e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115b39190612b26565b8261236d565b506115c381613aba565b905061153d565b506115d481613aba565b9050611532565b50505050505050565b60106020526000908152604090205481565b3360009081526005602052604090205460ff166116255760405162461bcd60e51b8152600401610ac5906131af565b6009805460ff1916911515919091179055565b600b5481565b6004546001600160a01b031690565b60076020526000908152604090206002015481565b3360009081526005602052604090205460ff166116915760405162461bcd60e51b8152600401610ac5906131af565b80600b5414156116b35760405162461bcd60e51b8152600401610ac5906131d9565b600b55565b606060018054610a0190613a7f565b600260065414156116ea5760405162461bcd60e51b8152600401610ac59061390b565b6002600655600e5460ff61010090910416151560011461171c5760405162461bcd60e51b8152600401610ac5906137b3565b600e5460ff161561178057336000908152601060205260409020548111156117565760405162461bcd60e51b8152600401610ac5906133f3565b3360009081526010602052604081208054839290611775908490613a25565b909155506118029050565b600c54336000908152600f602052604090205461179e9083906139f9565b11156117bc5760405162461bcd60e51b8152600401610ac59061356f565b336000908152600f60205260409020546001906117da9083906139f9565b111561180257600b543410156118025760405162461bcd60e51b8152600401610ac59061361d565b600061180c610d38565b600a5490915061181c83836139f9565b111561183a5760405162461bcd60e51b8152600401610ac5906137f6565b336000908152600f60205260409020546118559083906139f9565b336000908152600f60205260408120919091555b8281101561189e57600061187c83613aba565b925082905061188b338261236d565b508061189681613aba565b915050611869565b5050600160065550565b6118b0611ff0565b6001600160a01b0316826001600160a01b031614156118e15760405162461bcd60e51b8152600401610ac59061343c565b80600360006118ee611ff0565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611932611ff0565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161196a9190613191565b60405180910390a35050565b60606000826001600160401b038111156119a057634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119c9578160200160208202803683370190505b50905060005b8381101561101457600d60018686848181106119fb57634e487b7160e01b600052603260045260246000fd5b90506020020135611a0c9190613a25565b81548110611a2a57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160000160149054906101000a900460ff16828281518110611a6557634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015280611a7f81613aba565b9150506119cf565b3360009081526005602052604090205460ff16611ab65760405162461bcd60e51b8152600401610ac5906131af565b60005b81811015610d3257611af0838383818110611ae457634e487b7160e01b600052603260045260246000fd5b90506020020135611ff4565b611b0c5760405162461bcd60e51b8152600401610ac590613210565b83600d6001858585818110611b3157634e487b7160e01b600052603260045260246000fd5b90506020020135611b429190613a25565b81548110611b6057634e487b7160e01b600052603260045260246000fd5b60009182526020909120018054911515600160a01b0260ff60a01b1990921691909117905580611b8f81613aba565b915050611ab9565b60115460ff16611bb95760405162461bcd60e51b8152600401610ac5906134f6565b60005b81811015610bc3573360086000858585818110611be957634e487b7160e01b600052603260045260246000fd5b60209081029290920135835250810191909152604001600020546001600160a01b031614611c295760405162461bcd60e51b8152600401610ac590613995565b611c5933848484818110611c4d57634e487b7160e01b600052603260045260246000fd5b9050602002013561242a565b611c6281613aba565b9050611bbc565b60005b838110156115db57611cdc8787878785818110611c9957634e487b7160e01b600052603260045260246000fd5b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cec92505050565b611ce581613aba565b9050611c6c565b611cfd611cf7611ff0565b83612194565b611d195760405162461bcd60e51b8152600401610ac5906138ba565b610d3284848484612500565b3360009081526005602052604090205460ff16611d545760405162461bcd60e51b8152600401610ac5906131af565b600e5460ff1615158115151415611d7d5760405162461bcd60e51b8152600401610ac5906131d9565b600e805460ff1916911515919091179055565b6060611d9b82611ff4565b611db75760405162461bcd60e51b8152600401610ac590613292565b6013611dc283612533565b6014604051602001611dd693929190613058565b6040516020818303038152906040529050919050565b3360009081526005602052604090205460ff16611e1b5760405162461bcd60e51b8152600401610ac5906131af565b60005b82811015610d32578160106000868685818110611e4b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e609190612b26565b6001600160a01b03168152602081019190915260400160002055611e8381613aba565b9050611e1e565b3360009081526005602052604090205460ff16611eb95760405162461bcd60e51b8152600401610ac5906131af565b600e5460ff6101009091041615158115151415611ee85760405162461bcd60e51b8152600401610ac5906131d9565b600e80549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b611f38611ff0565b6001600160a01b0316611f4961163e565b6001600160a01b031614611f6f5760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b0381166000908152600560205260409020805460ff19166001179055611f9b8161264d565b50565b600f6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480611fe157506001600160e01b03198216635b5e139f60e01b145b806109ea57506109ea826126bb565b3390565b600080821180156120075750600d548211155b80156109ea57506000600d61201d600185613a25565b8154811061203b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080546001600160a01b0319166001600160a01b038416908117909155819061208d8261122a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216600090815260076020526040812060028101805491926001926120f49084906139f9565b90915550506001600160a01b038316600090815260018083016020908152604080842042905584825280842080549384018155845281842090920185905584835260089052902080546001600160a01b03191633179055612156833084612219565b7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83836040516121879291906130fa565b60405180910390a1505050565b600061219f82611ff4565b6121bb5760405162461bcd60e51b8152600401610ac5906134aa565b60006121c68361122a565b9050806001600160a01b0316846001600160a01b031614806122015750836001600160a01b03166121f684610aed565b6001600160a01b0316145b8061221157506122118185611f02565b949350505050565b6001600160a01b038316600d612230600184613a25565b8154811061224e57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146122805760405162461bcd60e51b8152600401610ac590613728565b61228b600082612058565b61229583836126d4565b81600d6122a3600184613a25565b815481106122c157634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123786000836126d4565b6040805180820182526001600160a01b03808516808352600060208401818152600d805460018101825590835294517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5909501805491511515600160a01b0260ff60a01b19969095166001600160a01b031990921691909117949094169290921790925591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038216600090815260076020526040902061244c838361274b565b600082815260086020908152604080832080546001600160a01b03191690556001600160a01b03861683526001848101909252822042905560028301805491929091612499908490613a25565b909155505060028101546124c4576001600160a01b0383166000908152600760205260408120600201555b6124cf308484612219565b7f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7583836040516121879291906130fa565b61250b848484612219565b612517848484846128c7565b610d325760405162461bcd60e51b8152600401610ac5906132d8565b60608161255857506040805180820190915260018152600360fc1b60208201526109ed565b8160005b8115612582578061256c81613aba565b915061257b9050600a83613a11565b915061255c565b6000816001600160401b038111156125aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125d4576020820181803683370190505b5090505b8415612211576125e9600183613a25565b91506125f6600a86613ad5565b6126019060306139f9565b60f81b81838151811061262457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612646600a86613a11565b94506125d8565b612655611ff0565b6001600160a01b031661266661163e565b6001600160a01b03161461268c5760405162461bcd60e51b8152600401610ac59061369e565b6001600160a01b0381166126b25760405162461bcd60e51b8152600401610ac59061336c565b611f9b8161231b565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382161561270e576001600160a01b0382166000908152601260205260408120805490919061270990613a68565b909155505b6001600160a01b03811615610ea1576001600160a01b0381166000908152601260205260408120805490919061274390613aba565b909155505050565b6001600160a01b0382166000908152600760205260408120905b6001600160a01b038416600090815260208390526040902054811015610d32576001600160a01b03841660009081526020839052604090208054849190839081106127c057634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156128b5576001600160a01b038416600090815260208390526040902080546127f790600190613a25565b8154811061281557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b038716835290849052604090912080548390811061285857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152908390526040902080548061289a57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055610d32565b806128bf81613aba565b915050612765565b60006128db846001600160a01b03166129e2565b156129d757836001600160a01b031663150b7a026128f7611ff0565b8786866040518563ffffffff1660e01b815260040161291994939291906130a2565b602060405180830381600087803b15801561293357600080fd5b505af1925050508015612963575060408051601f3d908101601f1916820190925261296091810190612f04565b60015b6129bd573d808015612991576040519150601f19603f3d011682016040523d82523d6000602084013e612996565b606091505b5080516129b55760405162461bcd60e51b8152600401610ac5906132d8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612211565b506001949350505050565b3b151590565b8280546129f490613a7f565b90600052602060002090601f016020900481019282612a165760008555612a5c565b82601f10612a2f5782800160ff19823516178555612a5c565b82800160010185558215612a5c579182015b82811115612a5c578235825591602001919060010190612a41565b506111979291505b808211156111975760008155600101612a64565b80356001600160a01b03811681146109ed57600080fd5b60008083601f840112612aa0578081fd5b5081356001600160401b03811115612ab6578182fd5b6020830191508360208083028501011115612ad057600080fd5b9250929050565b803580151581146109ed57600080fd5b60008083601f840112612af8578182fd5b5081356001600160401b03811115612b0e578182fd5b602083019150836020828501011115612ad057600080fd5b600060208284031215612b37578081fd5b61113282612a78565b60008060408385031215612b52578081fd5b612b5b83612a78565b9150612b6960208401612a78565b90509250929050565b60008060008060008060808789031215612b8a578182fd5b612b9387612a78565b9550612ba160208801612a78565b945060408701356001600160401b0380821115612bbc578384fd5b612bc88a838b01612a8f565b90965094506060890135915080821115612be0578384fd5b50612bed89828a01612ae7565b979a9699509497509295939492505050565b600080600060608486031215612c13578283fd5b612c1c84612a78565b9250612c2a60208501612a78565b9150604084013590509250925092565b60008060008060808587031215612c4f578384fd5b612c5885612a78565b93506020612c67818701612a78565b93506040860135925060608601356001600160401b0380821115612c89578384fd5b818801915088601f830112612c9c578384fd5b813581811115612cae57612cae613b15565b604051601f8201601f1916810185018381118282101715612cd157612cd1613b15565b60405281815283820185018b1015612ce7578586fd5b81858501868301379081019093019390935250939692955090935050565b600080600060408486031215612d19578283fd5b612d2284612a78565b925060208401356001600160401b03811115612d3c578283fd5b612d4886828701612a8f565b9497909650939450505050565b60008060408385031215612d67578182fd5b612d7083612a78565b9150612b6960208401612ad7565b60008060408385031215612d90578182fd5b612d9983612a78565b946020939093013593505050565b600080600060408486031215612dbb578283fd5b83356001600160401b03811115612dd0578384fd5b612ddc86828701612a8f565b909790965060209590950135949350505050565b60008060208385031215612e02578182fd5b82356001600160401b03811115612e17578283fd5b612e2385828601612a8f565b90969095509350505050565b60008060008060408587031215612e44578182fd5b84356001600160401b0380821115612e5a578384fd5b612e6688838901612a8f565b90965094506020870135915080821115612e7e578384fd5b50612e8b87828801612a8f565b95989497509550505050565b600060208284031215612ea8578081fd5b61113282612ad7565b600080600060408486031215612ec5578081fd5b612ece84612ad7565b925060208401356001600160401b03811115612d3c578182fd5b600060208284031215612ef9578081fd5b813561113281613b2b565b600060208284031215612f15578081fd5b815161113281613b2b565b60008060008060408587031215612f35578182fd5b84356001600160401b0380821115612f4b578384fd5b612f5788838901612ae7565b90965094506020870135915080821115612f6f578384fd5b50612e8b87828801612ae7565b600060208284031215612f8d578081fd5b5035919050565b60008151808452612fac816020860160208601613a3c565b601f01601f19169290920160200192915050565b805460009060028104600180831680612fda57607f831692505b6020808410821415612ffa57634e487b7160e01b86526022600452602486fd5b81801561300e576001811461301f5761304c565b60ff1986168952848901965061304c565b613028886139ed565b60005b868110156130445781548b82015290850190830161302b565b505084890196505b50505050505092915050565b60006130648286612fc0565b8451613074818360208901613a3c565b61308081830186612fc0565b979650505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130d590830184612f94565b9695505050505050565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561314d57835115158352928401929184019160010161312f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561314d57835183529284019291840191600101613175565b901515815260200190565b6000602082526111326020830184612f94565b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b6020808252601c908201527f54696765723a204e65772076616c7565206d617463686573206f6c6400000000604082015260600190565b60208082526018908201527f54696765723a20546f6b656e4964206e6f742065786973740000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526026908201527f54696765723a2055524920717565727920666f72206e6f6e6578697374656e74604082015265103a37b5b2b760d11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526022908201527f54696765723a20517565727920666f72206e6f6e6578697374656e7420746f6b60408201526132b760f11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f54696765723a20676c6f62616c20696e646578206f7574206f6620626f756e646040820152607360f81b606082015260800190565b60208082526029908201527f54696765723a204163636f756e74206973206c657373207468616e20746865206040820152681c5d1e481b1a5b5a5d60ba1b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601c908201527f54696765723a205374616b696e67206973206e6f742061637469766500000000604082015260600190565b60208082526022908201527f54696765723a20717565727920666f72206e6f6e6578697374656e7420746f6b60408201526132b760f11b606082015260800190565b60208082526031908201527f54696765723a5175616e74697479206d757374206265206c657373207468616e604082015270206f7220657175616c204d41585f51545960781b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f54696765723a2045746865722073656e74206973206e6f7420636f7272656374604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526035908201527f54696765723a2053706563696669656420737570706c79206973206c6f776572604082015274207468616e2063757272656e742062616c616e636560581b606082015260800190565b6020808252602a908201527f54696765723a207472616e73666572206f6620746f6b656e2074686174206973604082015269081b9bdd081bdddb995960b21b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526023908201527f54696765723a204d696e74696e67206e6565647320746f20626520656e61626c60408201526232b21760e91b606082015260800190565b6020808252818101527f54696765723a204d696e742f6f72646572206578636565647320737570706c79604082015260600190565b60208082526026908201527f54696765723a205374616b696e6720746f6b656e2074686174206973206e6f74604082015265081bdddb995960d21b606082015260800190565b60208082526029908201527f54696765723a2062616c616e636520717565727920666f7220746865207a65726040820152686f206164647265737360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526033908201527f54696765723a204d7573742070726f7669646520657175616c207175616e74696040820152727469657320616e6420726563697069656e747360681b606082015260800190565b6020808252602f908201527f54696765722e5f756e7374616b653a2053656e646572206d757374206861766560408201526e081cdd185ad959081d1bdad95b9251608a1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115613a0c57613a0c613ae9565b500190565b600082613a2057613a20613aff565b500490565b600082821015613a3757613a37613ae9565b500390565b60005b83811015613a57578181015183820152602001613a3f565b83811115610d325750506000910152565b600081613a7757613a77613ae9565b506000190190565b600281046001821680613a9357607f821691505b60208210811415613ab457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ace57613ace613ae9565b5060010190565b600082613ae457613ae4613aff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f9b57600080fdfea264697066735822122009fa913df8ab97db5927fa573e16ff07db177f2f8de295e7574ce52c876a32ce64736f6c63430008000033

Deployed Bytecode Sourcemap

464:13883:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;719:223:4;;;;;;;;;;-1:-1:-1;719:223:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1038:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;417:110:2:-;;;;;;;;;;-1:-1:-1;417:110:2;;;;;:::i;:::-;;:::i;2182:213:5:-;;;;;;;;;;-1:-1:-1;2182:213:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1783:393::-;;;;;;;;;;-1:-1:-1;1783:393:5;;;;;:::i;:::-;;:::i;:::-;;1072:53:15;;;;;;;;;;-1:-1:-1;1072:53:15;;;;;:::i;:::-;;:::i;11391:555::-;;;;;;;;;;-1:-1:-1;11391:555:15;;;;;:::i;:::-;;:::i;4149:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1469:23::-;;;;;;;;;;;;;:::i;2866:326:5:-;;;;;;;;;;-1:-1:-1;2866:326:5;;;;;:::i;:::-;;:::i;8810:147:15:-;;;;;;;;;;-1:-1:-1;8810:147:15;;;;;:::i;:::-;;:::i;6201:530::-;;;;;;;;;;-1:-1:-1;6201:530:15;;;;;:::i;:::-;;:::i;3374:356::-;;;;;;;;;;-1:-1:-1;3374:356:15;;;;;:::i;:::-;;:::i;1392:31::-;;;;;;;;;;;;;:::i;3198:178:5:-;;;;;;;;;;-1:-1:-1;3198:178:5;;;;;:::i;:::-;;:::i;4335:305:15:-;;;;;;;;;;-1:-1:-1;4335:305:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1692:35::-;;;;;;;;;;;;;:::i;531:114:2:-;;;;;;;;;;-1:-1:-1;531:114:2;;;;;:::i;:::-;;:::i;2342:250:15:-;;;;;;;;;;-1:-1:-1;2342:250:15;;;;;:::i;:::-;;:::i;1499:19::-;;;;;;;;;;-1:-1:-1;1499:19:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3038:169::-;;;;;;;;;;-1:-1:-1;3038:169:15;;;;;:::i;:::-;;:::i;1357:28::-;;;;;;;;;;;;;:::i;1523:37::-;;;;;;;;;;;;;:::i;1564:32::-;;;;;;;;;;;;;:::i;6029:103::-;;;;;;;;;;;;;:::i;13564:183::-;;;;;;;;;;-1:-1:-1;13564:183:15;;;;;:::i;:::-;;:::i;2660:218::-;;;;;;;;;;-1:-1:-1;2660:218:15;;;;;:::i;:::-;;:::i;11139:187::-;;;;;;;;;;-1:-1:-1;11139:187:15;;;;;:::i;:::-;;:::i;8263:155::-;;;;;;;;;;-1:-1:-1;8263:155:15;;;;;:::i;:::-;;:::i;8489:265::-;;;;;;;;;;-1:-1:-1;8489:265:15;;;;;:::i;:::-;;:::i;2059:189::-;;;;;;;;;;-1:-1:-1;2059:189:15;;;;;:::i;:::-;;:::i;1598:92:12:-;;;;;;;;;;;;;:::i;6807:609:15:-;;;;;;;;;;-1:-1:-1;6807:609:15;;;;;:::i;:::-;;:::i;1645:42::-;;;;;;;;;;-1:-1:-1;1645:42:15;;;;;:::i;:::-;;:::i;4703:92::-;;;;;;;;;;-1:-1:-1;4703:92:15;;;;;:::i;:::-;;:::i;1427:38::-;;;;;;;;;;;;;:::i;966:85:12:-;;;;;;;;;;;;;:::i;978:41:15:-;;;;;;;;;;-1:-1:-1;978:41:15;;;;;:::i;:::-;;:::i;9018:139::-;;;;;;;;;;-1:-1:-1;9018:139:15;;;;;:::i;:::-;;:::i;1534:104:5:-;;;;;;;;;;;;;:::i;4870:1083:15:-;;;;;;:::i;:::-;;:::i;2569:291:5:-;;;;;;;;;;-1:-1:-1;2569:291:5;;;;;:::i;:::-;;:::i;10320:336:15:-;;;;;;;;;;-1:-1:-1;10320:336:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9923:330::-;;;;;;;;;;-1:-1:-1;9923:330:15;;;;;:::i;:::-;;:::i;12510:407::-;;;;;;;;;;-1:-1:-1;12510:407:15;;;;;:::i;:::-;;:::i;1340:241:4:-;;;;;;;;;;-1:-1:-1;1340:241:4;;;;;:::i;:::-;;:::i;3382:317:5:-;;;;;;;;;;-1:-1:-1;3382:317:5;;;;;:::i;:::-;;:::i;7986:213:15:-;;;;;;;;;;-1:-1:-1;7986:213:15;;;;;:::i;:::-;;:::i;3820:248::-;;;;;;;;;;-1:-1:-1;3820:248:15;;;;;:::i;:::-;;:::i;7485:191::-;;;;;;;;;;-1:-1:-1;7485:191:15;;;;;:::i;:::-;;:::i;7736:181::-;;;;;;;;;;-1:-1:-1;7736:181:15;;;;;:::i;:::-;;:::i;2401:162:5:-;;;;;;;;;;-1:-1:-1;2401:162:5;;;;;:::i;:::-;;:::i;649:158:2:-;;;;;;;;;;-1:-1:-1;649:158:2;;;;;:::i;:::-;;:::i;1601:39:15:-;;;;;;;;;;-1:-1:-1;1601:39:15;;;;;:::i;:::-;;:::i;719:223:4:-;822:4;-1:-1:-1;;;;;;845:50:4;;-1:-1:-1;;;845:50:4;;:90;;;899:36;923:11;899:23;:36::i;:::-;838:97;;719:223;;;;:::o;1038:100:5:-;1094:13;1126:5;1119:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1038:100;:::o;417:110:2:-;487:4;1189:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;;506:16:2::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;::::0;417:110::o;2182:213:5:-;2255:7;2282:16;2290:7;2282;:16::i;:::-;2274:73;;;;-1:-1:-1;;;2274:73:5;;;;;;;:::i;:::-;-1:-1:-1;2364:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;2364:24:5;;2182:213::o;1783:393::-;1862:13;1878:16;1886:7;1878;:16::i;:::-;1862:32;;1918:5;-1:-1:-1;;;;;1912:11:5;:2;-1:-1:-1;;;;;1912:11:5;;;1904:57;;;;-1:-1:-1;;;1904:57:5;;;;;;;:::i;:::-;2009:5;-1:-1:-1;;;;;1993:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;1993:21:5;;:62;;;;2018:37;2035:5;2042:12;:10;:12::i;2018:37::-;1972:165;;;;-1:-1:-1;;;1972:165:5;;;;;;;:::i;:::-;2148:21;2157:2;2161:7;2148:8;:21::i;:::-;1783:393;;;:::o;1072:53:15:-;;;;;;;;;;;;-1:-1:-1;;;;;1072:53:15;;:::o;11391:555::-;11462:13;;;;11453:56;;;;-1:-1:-1;;;11453:56:15;;;;;;;:::i;:::-;11528:17;11632:6;11627:313;11640:19;;;11627:313;;;11689:22;11709:1;11697:8;;11706:1;11697:11;;;;;-1:-1:-1;;;11697:11:15;;;;;;;;;;;;;;;:13;;;;:::i;:::-;11689:7;:22::i;:::-;11680:71;;;;-1:-1:-1;;;11680:71:15;;;;;;;:::i;:::-;11772:5;11791:1;11779:8;;11788:1;11779:11;;;;;-1:-1:-1;;;11779:11:15;;;;;;;;;;;;;;;:13;;;;:::i;:::-;11772:22;;;;;;-1:-1:-1;;;11772:22:15;;;;;;;;;;;;;;;;;;11816:10;;11772:22;;-1:-1:-1;;;;;;11816:10:15;11830;11816:24;11808:75;;;;-1:-1:-1;;;11808:75:15;;;;;;;:::i;:::-;11898:31;11905:10;11917:8;;11926:1;11917:11;;;;;-1:-1:-1;;;11917:11:15;;;;;;;;;;;;;;;11898:6;:31::i;:::-;11661:3;;;:::i;:::-;;;11627:313;;;;11391:555;;;:::o;4149:102::-;4234:5;:12;4149:102;:::o;1469:23::-;;;;:::o;2866:326:5:-;3052:41;3071:12;:10;:12::i;:::-;3085:7;3052:18;:41::i;:::-;3044:103;;;;-1:-1:-1;;;3044:103:5;;;;;;;:::i;:::-;3157:28;3167:4;3173:2;3177:7;3157:9;:28::i;8810:147:15:-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;8890:6:15::1;8879:7;;:17;;8870:60;;;;-1:-1:-1::0;;;8870:60:15::1;;;;;;;:::i;:::-;8936:7;:16:::0;8810:147::o;6201:530::-;1189:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;6292:7:15::1;6267:21;:32;;6259:74;;;;-1:-1:-1::0;;;6259:74:15::1;;;;;;;:::i;:::-;6570:7;6591;:5;:7::i;:::-;-1:-1:-1::0;;;;;6583:21:15::1;6612:7;6583:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6569:55;;;6638:2;6630:11;;;::::0;::::1;;1248:1:12;6201:530:15::0;:::o;3374:356::-;3460:12;3480:10;3501:6;3496:170;3514:5;:12;3509:17;;3496:170;;3554:5;3560:1;3554:8;;;;;;-1:-1:-1;;;3554:8:15;;;;;;;;;;;;;;;;;;:14;-1:-1:-1;;;;;3545:23:15;;;3554:14;;3545:23;3541:119;;;3593:5;3584;:14;3580:71;;;3618:1;-1:-1:-1;3611:8:15;;-1:-1:-1;3611:8:15;3580:71;3644:7;;;:::i;:::-;;;3580:71;3528:3;;;:::i;:::-;;;3496:170;;;;3672:53;;-1:-1:-1;;;3672:53:15;;;;;;;:::i;3374:356::-;;;;;:::o;1392:31::-;;;;:::o;3198:178:5:-;3330:39;3347:4;3353:2;3357:7;3330:39;;;;;;;;;;;;:16;:39::i;4335:305:15:-;4409:13;4430;4446:20;4457:7;4446:9;:20::i;:::-;4430:36;;4472:20;4507:8;-1:-1:-1;;;;;4495:22:15;;;;;-1:-1:-1;;;4495:22:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4495:22:15;;4472:45;;4528:6;4523:94;4540:8;4536:1;:12;4523:94;;;4577:33;4598:7;4607:1;4577:19;:33::i;:::-;4565:6;4572:1;4565:9;;;;;;-1:-1:-1;;;4565:9:15;;;;;;;;;;;;;;;;;;:45;4550:3;;;:::i;:::-;;;4523:94;;;-1:-1:-1;4629:6:15;4335:305;-1:-1:-1;;;4335:305:15:o;1692:35::-;;;;;;:::o;531:114:2:-;1189:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;610:16:2;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;610:30:2::1;::::0;::::1;;::::0;;;::::1;::::0;;531:114::o;2342:250:15:-;2438:4;2454:6;2450:120;2462:19;;;2450:120;;;2533:7;-1:-1:-1;;;;;2500:40:15;:5;2520:1;2507:8;;2516:1;2507:11;;;;;-1:-1:-1;;;2507:11:15;;;;;;;;;;;;;;;:14;;;;:::i;:::-;2500:23;;;;;;-1:-1:-1;;;2500:23:15;;;;;;;;;;;;;;;;;;:29;-1:-1:-1;;;;;2500:29:15;:40;2496:67;;2558:5;2551:12;;;;;2496:67;2483:3;;;:::i;:::-;;;2450:120;;;;2583:4;2576:11;;2342:250;;;;;;:::o;1499:19::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1499:19:15;;;-1:-1:-1;;;;1499:19:15;;;;;:::o;3038:169::-;3104:4;3133:13;:11;:13::i;:::-;3124:5;:22;;3116:68;;;;-1:-1:-1;;;3116:68:15;;;;;;;:::i;:::-;-1:-1:-1;3197:5:15;3038:169::o;1357:28::-;;;;;;:::o;1523:37::-;;;;;;:::o;1564:32::-;;;;;;;;;:::o;6029:103::-;6106:21;6029:103;:::o;13564:183::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;13646:13:15::1;::::0;::::1;;:26;;::::0;::::1;;;;13637:70;;;;-1:-1:-1::0;;;13637:70:15::1;;;;;;;:::i;:::-;13715:13;:25:::0;;-1:-1:-1;;13715:25:15::1;::::0;::::1;;::::0;;;::::1;::::0;;13564:183::o;2660:218::-;2723:14;;2761:5;2767:9;2775:1;2767:7;:9;:::i;:::-;2761:16;;;;;;-1:-1:-1;;;2761:16:15;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;2761:22:15;;-1:-1:-1;2797:19:15;2789:66;;;;-1:-1:-1;;;2789:66:15;;;;;;;:::i;11139:187::-;-1:-1:-1;;;;;11261:14:15;;11237:21;11261:14;;;:7;:14;;;;;;;;11292:26;;;;;;;11285:33;;;;;;;;;;;;;;;;;11200:25;;11261:14;11285:33;;11292:26;11285:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11139:187;;;:::o;8263:155::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;8359:24:15::1;:15;8377:6:::0;;8359:24:::1;:::i;:::-;-1:-1:-1::0;8389:24:15::1;:15;8407:6:::0;;8389:24:::1;:::i;:::-;;8263:155:::0;;;;:::o;8489:265::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;8578:9:15::1;8564:10;;:23;;8555:66;;;;-1:-1:-1::0;;;8555:66:15::1;;;;;;;:::i;:::-;8649:13;:11;:13::i;:::-;8636:9;:26;;8627:94;;;;-1:-1:-1::0;;;8627:94:15::1;;;;;;;:::i;:::-;8727:10;:22:::0;8489:265::o;2059:189::-;2125:4;-1:-1:-1;;;;;2145:21:15;;2137:75;;;;-1:-1:-1;;;2137:75:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2225:18:15;;;;;:9;:18;;;;;;;2059:189::o;1598:92:12:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;6807:609:15:-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;6916:35:15;;::::1;6908:100;;;;-1:-1:-1::0;;;6908:100:15::1;;;;;;;:::i;:::-;7015:18;7039:11:::0;7053:13:::1;:11;:13::i;:::-;7039:27;;7076:6;7072:80;7084:19:::0;;::::1;7072:80;;;7134:8;;7143:1;7134:11;;;;;-1:-1:-1::0;;;7134:11:15::1;;;;;;;;;;;;;;;7117:28;;;;;:::i;:::-;::::0;-1:-1:-1;7105:3:15::1;::::0;::::1;:::i;:::-;;;7072:80;;;-1:-1:-1::0;7191:10:15::1;::::0;7166:22:::1;7175:13:::0;7166:6;:22:::1;:::i;:::-;:35;7157:82;;;;-1:-1:-1::0;;;7157:82:15::1;;;;;;;:::i;:::-;7250:6;7246:166;7258:20:::0;;::::1;7246:166;;;7296:6;7292:114;7308:8;;7317:1;7308:11;;;;;-1:-1:-1::0;;;7308:11:15::1;;;;;;;;;;;;;;;7304:1;:15;7292:114;;;7335:12;7350:8;::::0;::::1;:::i;:::-;;;;7335:23;;7368:29;7375:9;;7385:1;7375:12;;;;;-1:-1:-1::0;;;7375:12:15::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7389:7;7368:5;:29::i;:::-;-1:-1:-1::0;7321:3:15::1;::::0;::::1;:::i;:::-;;;7292:114;;;-1:-1:-1::0;7280:3:15::1;::::0;::::1;:::i;:::-;;;7246:166;;;;393:1:2;;6807:609:15::0;;;;:::o;1645:42::-;;;;;;;;;;;;;:::o;4703:92::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;4772:8:15::1;:18:::0;;-1:-1:-1;;4772:18:15::1;::::0;::::1;;::::0;;;::::1;::::0;;4703:92::o;1427:38::-;;;;:::o;966:85:12:-;1038:6;;-1:-1:-1;;;;;1038:6:12;966:85;:::o;978:41:15:-;;;;;;;;;;;;;;;:::o;9018:139::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;9094:5:15::1;9085;;:14;;9076:57;;;;-1:-1:-1::0;;;9076:57:15::1;;;;;;;:::i;:::-;9139:5;:13:::0;9018:139::o;1534:104:5:-;1592:13;1624:7;1617:14;;;;;:::i;4870:1083:15:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;4945:12:15::1;::::0;::::1;;::::0;;::::1;;:20;;:12;:20;4937:67;;;;-1:-1:-1::0;;;4937:67:15::1;;;;;;;:::i;:::-;5130:17;::::0;::::1;;5126:527;;;5178:10;5166:24;::::0;;;:10:::1;:24;::::0;;;;;:36;-1:-1:-1;5166:36:15::1;5157:91;;;;-1:-1:-1::0;;;5157:91:15::1;;;;;;;:::i;:::-;5268:10;5256:24;::::0;;;:10:::1;:24;::::0;;;;:36;;5284:8;;5256:24;:36:::1;::::0;5284:8;;5256:36:::1;:::i;:::-;::::0;;;-1:-1:-1;5126:527:15::1;::::0;-1:-1:-1;5126:527:15::1;;5459:7;::::0;5435:10:::1;5427:19;::::0;;;:7:::1;:19;::::0;;;;;:28:::1;::::0;5447:8;;5427:28:::1;:::i;:::-;:39;;5419:100;;;;-1:-1:-1::0;;;5419:100:15::1;;;;;;;:::i;:::-;5538:10;5530:19;::::0;;;:7:::1;:19;::::0;;;;;5559:1:::1;::::0;5530:28:::1;::::0;5550:8;;5530:28:::1;:::i;:::-;:30;5527:120;;;5594:5;;5581:9;:18;;5572:66;;;;-1:-1:-1::0;;;5572:66:15::1;;;;;;;:::i;:::-;5659:11;5673:13;:11;:13::i;:::-;5722:10;::::0;5659:27;;-1:-1:-1;5701:17:15::1;5710:8:::0;5659:27;5701:17:::1;:::i;:::-;:31;;5692:78;;;;-1:-1:-1::0;;;5692:78:15::1;;;;;;;:::i;:::-;5806:10;5798:19;::::0;;;:7:::1;:19;::::0;;;;;:30:::1;::::0;5820:8;;5798:30:::1;:::i;:::-;5784:10;5776:19;::::0;;;:7:::1;:19;::::0;;;;:52;;;;5834:107:::1;5850:8;5846:1;:12;5834:107;;;5873:12;5889:8;::::0;::::1;:::i;:::-;;;;5873:24;;5906:28;5913:10;5925:7;5906:5;:28::i;:::-;-1:-1:-1::0;5860:3:15;::::1;::::0;::::1;:::i;:::-;;;;5834:107;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;-1:-1:-1;4870:1083:15:o;2569:291:5:-;2685:12;:10;:12::i;:::-;-1:-1:-1;;;;;2673:24:5;:8;-1:-1:-1;;;;;2673:24:5;;;2665:62;;;;-1:-1:-1;;;2665:62:5;;;;;;;:::i;:::-;2782:8;2737:18;:32;2756:12;:10;:12::i;:::-;-1:-1:-1;;;;;2737:32:5;;;;;;;;;;;;;;;;;-1:-1:-1;2737:32:5;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;2737:53:5;;;;;;;;;;;2820:12;:10;:12::i;:::-;-1:-1:-1;;;;;2805:48:5;;2844:8;2805:48;;;;;;:::i;:::-;;;;;;;;2569:291;;:::o;10320:336:15:-;10389:23;10458:24;10496:8;-1:-1:-1;;;;;10485:27:15;;;;;-1:-1:-1;;;10485:27:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10485:27:15;;10458:54;;10524:6;10520:107;10532:19;;;10520:107;;;10584:5;10602:1;10590:8;;10599:1;10590:11;;;;;-1:-1:-1;;;10590:11:15;;;;;;;;;;;;;;;:13;;;;:::i;:::-;10584:20;;;;;;-1:-1:-1;;;10584:20:15;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;10568:10;10579:1;10568:13;;;;;;-1:-1:-1;;;10568:13:15;;;;;;;;;:50;;;:13;;;;;;;;;;;:50;10553:3;;;;:::i;:::-;;;;10520:107;;9923:330;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;10072:6:15::1;10068:181;10082:19:::0;;::::1;10068:181;;;10130:20;10138:8;;10147:1;10138:11;;;;;-1:-1:-1::0;;;10138:11:15::1;;;;;;;;;;;;;;;10130:7;:20::i;:::-;10122:57;;;;-1:-1:-1::0;;;10122:57:15::1;;;;;;;:::i;:::-;10230:8;10193:5;10211:1;10199:8;;10208:1;10199:11;;;;;-1:-1:-1::0;;;10199:11:15::1;;;;;;;;;;;;;;;:13;;;;:::i;:::-;10193:20;;;;;;-1:-1:-1::0;;;10193:20:15::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:45:::0;;;::::1;;-1:-1:-1::0;;;10193:45:15::1;-1:-1:-1::0;;;;10193:45:15;;::::1;::::0;;;::::1;::::0;;10103:3;::::1;::::0;::::1;:::i;:::-;;;;10068:181;;12510:407:::0;12583:13;;;;12574:56;;;;-1:-1:-1;;;12574:56:15;;;;;;;:::i;:::-;12679:6;12674:237;12687:19;;;12674:237;;;12771:10;12736:18;:31;12755:8;;12764:1;12755:11;;;;;-1:-1:-1;;;12755:11:15;;;;;;;;;;;;;;;;;;12736:31;;-1:-1:-1;12736:31:15;;;;;;;;-1:-1:-1;12736:31:15;;-1:-1:-1;;;;;12736:31:15;:45;12727:119;;;;-1:-1:-1;;;12727:119:15;;;;;;;:::i;:::-;12860:32;12869:10;12880:8;;12889:1;12880:11;;;;;-1:-1:-1;;;12880:11:15;;;;;;;;;;;;;;;12860:8;:32::i;:::-;12708:3;;;:::i;:::-;;;12674:237;;1340:241:4;1469:6;1465:110;1477:19;;;1465:110;;;1517:47;1535:4;1541:2;1545:8;;1554:1;1545:11;;;;;-1:-1:-1;;;1545:11:4;;;;;;;;;;;;;;;1558:4;;1517:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1517:16:4;;-1:-1:-1;;;1517:47:4:i;:::-;1498:3;;;:::i;:::-;;;1465:110;;3382:317:5;3548:41;3567:12;:10;:12::i;:::-;3581:7;3548:18;:41::i;:::-;3540:103;;;;-1:-1:-1;;;3540:103:5;;;;;;;:::i;:::-;3653:39;3667:4;3673:2;3677:7;3686:5;3653:13;:39::i;7986:213:15:-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;8076:17:15::1;::::0;::::1;;:39;;::::0;::::1;;;;8067:83;;;;-1:-1:-1::0;;;8067:83:15::1;;;;;;;:::i;:::-;8156:17;:38:::0;;-1:-1:-1;;8156:38:15::1;::::0;::::1;;::::0;;;::::1;::::0;;7986:213::o;3820:248::-;3884:13;3913:16;3921:7;3913;:16::i;:::-;3905:67;;;;-1:-1:-1;;;3905:67:15;;;;;;;:::i;:::-;4009:15;4026:18;:7;:16;:18::i;:::-;4046:15;3992:70;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3978:85;;3820:248;;;:::o;7485:191::-;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;7589:6:15::1;7585:87;7597:19:::0;;::::1;7585:87;;;7658:7;7630:10;:25;7642:8;;7651:1;7642:11;;;;;-1:-1:-1::0;;;7642:11:15::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7630:25:15::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7630:25:15;:35;7618:3:::1;::::0;::::1;:::i;:::-;;;7585:87;;7736:181:::0;354:10:2;343:22;;;;:10;:22;;;;;;;;335:52;;;;-1:-1:-1;;;335:52:2;;;;;;;:::i;:::-;7818:12:15::1;::::0;::::1;;::::0;;::::1;;:27;;::::0;::::1;;;;7809:71;;;;-1:-1:-1::0;;;7809:71:15::1;;;;;;;:::i;:::-;7886:12;:26:::0;;;::::1;;;;-1:-1:-1::0;;7886:26:15;;::::1;::::0;;;::::1;::::0;;7736:181::o;2401:162:5:-;-1:-1:-1;;;;;2521:25:5;;;2498:4;2521:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;2401:162::o;649:158:2:-;1189:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;734:20:2;::::1;;::::0;;;:10:::1;:20;::::0;;;;:27;;-1:-1:-1;;734:27:2::1;757:4;734:27;::::0;;767:35:::1;745:8:::0;767:23:::1;:35::i;:::-;649:158:::0;:::o;1601:39:15:-;;;;;;;;;;;;;:::o;1228:300:5:-;1330:4;-1:-1:-1;;;;;;1365:40:5;;-1:-1:-1;;;1365:40:5;;:104;;-1:-1:-1;;;;;;;1421:48:5;;-1:-1:-1;;;1421:48:5;1365:104;:156;;;;1485:36;1509:11;1485:23;:36::i;587:96:1:-;666:10;587:96;:::o;9479:163:15:-;9542:4;9569:1;9561:7;:9;:36;;;;-1:-1:-1;9585:5:15;:12;9574:23;;;9561:36;:76;;;;-1:-1:-1;9635:1:15;9601:5;9607:9;9615:1;9607:7;:9;:::i;:::-;9601:16;;;;;;-1:-1:-1;;;9601:16:15;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;9601:22:15;:36;;;9479:163;-1:-1:-1;;9479:163:15:o;3721:161:5:-;3792:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;3792:29:5;-1:-1:-1;;;;;3792:29:5;;;;;;;;:24;;3845:16;3792:24;3845:7;:16::i;:::-;-1:-1:-1;;;;;3836:39:5;;;;;;;;;;;3721:161;;:::o;12029:412:15:-;-1:-1:-1;;;;;12124:14:15;;12100:21;12124:14;;;:7;:14;;;;;12149:19;;;:24;;12124:14;;12172:1;;12149:24;;12172:1;;12149:24;:::i;:::-;;;;-1:-1:-1;;;;;;;12183:24:15;;;;;;:17;;;;:24;;;;;;;;12210:15;12183:42;;12235:26;;;;;;:41;;;;;;;;;;;;;;;;;;12287:28;;;:18;:28;;;;:41;;-1:-1:-1;;;;;;12287:41:15;12318:10;12287:41;;;12339:40;12201:5;12363:4;12267:8;12339:9;:40::i;:::-;12401:23;12408:5;12415:8;12401:23;;;;;;;:::i;:::-;;;;;;;;12029:412;;;:::o;4743:334:5:-;4833:4;4857:16;4865:7;4857;:16::i;:::-;4849:73;;;;-1:-1:-1;;;4849:73:5;;;;;;;:::i;:::-;4932:13;4948:16;4956:7;4948;:16::i;:::-;4932:32;;4993:5;-1:-1:-1;;;;;4982:16:5;:7;-1:-1:-1;;;;;4982:16:5;;:51;;;;5026:7;-1:-1:-1;;;;;5002:31:5;:20;5014:7;5002:11;:20::i;:::-;-1:-1:-1;;;;;5002:31:5;;4982:51;:87;;;;5037:32;5054:5;5061:7;5037:16;:32::i;:::-;4974:96;4743:334;-1:-1:-1;;;;4743:334:5:o;10713:364:15:-;-1:-1:-1;;;;;10804:30:15;;:5;10810:9;10818:1;10810:7;:9;:::i;:::-;10804:16;;;;;;-1:-1:-1;;;10804:16:15;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;10804:22:15;:30;10796:85;;;;-1:-1:-1;;;10796:85:15;;;;;;;:::i;:::-;10935:29;10952:1;10956:7;10935:8;:29::i;:::-;10970:30;10991:4;10997:2;10970:20;:30::i;:::-;11032:2;11007:5;11013:9;11021:1;11013:7;:9;:::i;:::-;11007:16;;;;;;-1:-1:-1;;;11007:16:15;;;;;;;;;;;;;;;;;:27;;-1:-1:-1;;;;;;11007:27:15;-1:-1:-1;;;;;11007:27:15;;;;;;11045;;11064:7;;11045:27;;;;;;;;;;11007:16;11045:27;10713:364;;;:::o;2034:169:12:-;2108:6;;;-1:-1:-1;;;;;2124:17:12;;;-1:-1:-1;;;;;;2124:17:12;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;9702:173:15:-;9758:36;9787:1;9791:2;9758:20;:36::i;:::-;9811:14;;;;;;;;-1:-1:-1;;;;;9811:14:15;;;;;;-1:-1:-1;9811:14:15;;;;;;9800:5;:26;;9811:14;9800:26;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9800:26:15;-1:-1:-1;;;;9800:26:15;;;;-1:-1:-1;;;;;;9800:26:15;;;;;;;;;;;;;;;;;;9837:33;;9862:7;;-1:-1:-1;9837:33:15;;-1:-1:-1;;9837:33:15;9702:173;;:::o;13002:485::-;-1:-1:-1;;;;;13098:14:15;;13074:21;13098:14;;;:7;:14;;;;;13123:31;13106:5;13145:8;13123:14;:31::i;:::-;13172:28;;;;:18;:28;;;;;;;;13165:35;;-1:-1:-1;;;;;;13165:35:15;;;-1:-1:-1;;;;;13210:24:15;;;;13165:35;13210:17;;;:24;;;;;13237:15;13210:42;;13262:19;;;:24;;13165:35;;13262:19;;:24;;13165:35;;13262:24;:::i;:::-;;;;-1:-1:-1;;13300:19:15;;;;13297:75;;-1:-1:-1;;;;;13347:14:15;;;;;;:7;:14;;;;;13340:21;;;13297:75;13382:40;13400:4;13406:5;13413:8;13382:9;:40::i;:::-;13446:25;13455:5;13462:8;13446:25;;;;;;;:::i;5083:304:5:-;5231:28;5241:4;5247:2;5251:7;5231:9;:28::i;:::-;5277:48;5300:4;5306:2;5310:7;5319:5;5277:22;:48::i;:::-;5269:111;;;;-1:-1:-1;;;5269:111:5;;;;;;;:::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;627:10:14;;;;;;;;;;;;-1:-1:-1;;;627:10:14;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;-1:-1:-1;;;;;817:17:14;;;;;-1:-1:-1;;;817:17:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:14;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:14;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;1839:189:12;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:12;;1170:68;;;;-1:-1:-1;;;1170:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:12;::::1;1919:73;;;;-1:-1:-1::0;;;1919:73:12::1;;;;;;;:::i;:::-;2002:19;2012:8;2002:9;:19::i;763:155:3:-:0;-1:-1:-1;;;;;;871:40:3;;-1:-1:-1;;;871:40:3;763:155;;;:::o;9243:179:15:-;-1:-1:-1;;;;;9318:18:15;;;9314:50;;-1:-1:-1;;;;;9347:17:15;;;;;;:9;:17;;;;;9345:19;;9347:17;;;9345:19;;;:::i;:::-;;;;-1:-1:-1;9314:50:15;-1:-1:-1;;;;;9375:16:15;;;9371:46;;-1:-1:-1;;;;;9402:15:15;;;;;;:9;:15;;;;;9400:17;;9402:15;;;9400:17;;;:::i;:::-;;;;-1:-1:-1;9243:179:15;;:::o;13883:462::-;-1:-1:-1;;;;;13983:14:15;;13959:21;13983:14;;;:7;:14;;;;;;14007:332;-1:-1:-1;;;;;14025:26:15;;:19;:26;;;;;;;;;;:33;14023:35;;14007:332;;;-1:-1:-1;;;;;14083:26:15;;:19;:26;;;;;;;;;;:29;;14116:8;;14083:26;14110:1;;14083:29;;;;-1:-1:-1;;;14083:29:15;;;;;;;;;;;;;;;;;:41;14079:250;;;-1:-1:-1;;;;;14176:26:15;;:19;:26;;;;;;;;;;14203:33;;:37;;14239:1;;14203:37;:::i;:::-;14176:65;;;;;;-1:-1:-1;;;14176:65:15;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14144:26:15;;;;;;;;;;;;:29;;14171:1;;14144:29;;;;-1:-1:-1;;;14144:29:15;;;;;;;;;;;;;;;;;;;;:97;;;;-1:-1:-1;;;;;14259:26:15;;;;;;;;;;;:32;;;;;-1:-1:-1;;;14259:32:15;;;;;;;;;;;;;;;;;;;;;;;;;;14309:5;;14079:250;14060:3;;;;:::i;:::-;;;;14007:332;;3888:775:5;4035:4;4055:15;:2;-1:-1:-1;;;;;4055:13:5;;:15::i;:::-;4051:606;;;4106:2;-1:-1:-1;;;;;4090:36:5;;4127:12;:10;:12::i;:::-;4141:4;4147:7;4156:5;4090:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4090:72:5;;;;;;;;-1:-1:-1;;4090:72:5;;;;;;;;;;;;:::i;:::-;;;4086:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4329:13:5;;4325:266;;4371:60;;-1:-1:-1;;;4371:60:5;;;;;;;:::i;4325:266::-;4543:6;4537:13;4528:6;4524:2;4520:15;4513:38;4086:519;-1:-1:-1;;;;;;4212:51:5;-1:-1:-1;;;4212:51:5;;-1:-1:-1;4205:58:5;;4051:606;-1:-1:-1;4642:4:5;3888:775;;;;;;:::o;718:377:0:-;1034:20;1080:8;;;718:377::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:175:16;84:20;;-1:-1:-1;;;;;133:31:16;;123:42;;113:2;;179:1;176;169:12;194:400;;;327:3;320:4;312:6;308:17;304:27;294:2;;350:6;342;335:22;294:2;-1:-1:-1;378:20:16;;-1:-1:-1;;;;;410:30:16;;407:2;;;460:8;450;443:26;407:2;504:4;496:6;492:17;480:29;;567:3;560:4;552;544:6;540:17;532:6;528:30;524:41;521:50;518:2;;;584:1;581;574:12;518:2;284:310;;;;;:::o;599:162::-;666:20;;722:13;;715:21;705:32;;695:2;;751:1;748;741:12;766:377;;;883:3;876:4;868:6;864:17;860:27;850:2;;908:8;898;891:26;850:2;-1:-1:-1;938:20:16;;-1:-1:-1;;;;;970:30:16;;967:2;;;1020:8;1010;1003:26;967:2;1064:4;1056:6;1052:17;1040:29;;1116:3;1109:4;1100:6;1092;1088:19;1084:30;1081:39;1078:2;;;1133:1;1130;1123:12;1148:198;;1260:2;1248:9;1239:7;1235:23;1231:32;1228:2;;;1281:6;1273;1266:22;1228:2;1309:31;1330:9;1309:31;:::i;1351:274::-;;;1480:2;1468:9;1459:7;1455:23;1451:32;1448:2;;;1501:6;1493;1486:22;1448:2;1529:31;1550:9;1529:31;:::i;:::-;1519:41;;1579:40;1615:2;1604:9;1600:18;1579:40;:::i;:::-;1569:50;;1438:187;;;;;:::o;1630:936::-;;;;;;;1847:3;1835:9;1826:7;1822:23;1818:33;1815:2;;;1869:6;1861;1854:22;1815:2;1897:31;1918:9;1897:31;:::i;:::-;1887:41;;1947:40;1983:2;1972:9;1968:18;1947:40;:::i;:::-;1937:50;;2038:2;2027:9;2023:18;2010:32;-1:-1:-1;;;;;2102:2:16;2094:6;2091:14;2088:2;;;2123:6;2115;2108:22;2088:2;2167:76;2235:7;2226:6;2215:9;2211:22;2167:76;:::i;:::-;2262:8;;-1:-1:-1;2141:102:16;-1:-1:-1;2350:2:16;2335:18;;2322:32;;-1:-1:-1;2366:16:16;;;2363:2;;;2400:6;2392;2385:22;2363:2;;2444:62;2498:7;2487:8;2476:9;2472:24;2444:62;:::i;:::-;1805:761;;;;-1:-1:-1;1805:761:16;;-1:-1:-1;1805:761:16;;2525:8;;1805:761;-1:-1:-1;;;1805:761:16:o;2571:342::-;;;;2717:2;2705:9;2696:7;2692:23;2688:32;2685:2;;;2738:6;2730;2723:22;2685:2;2766:31;2787:9;2766:31;:::i;:::-;2756:41;;2816:40;2852:2;2841:9;2837:18;2816:40;:::i;:::-;2806:50;;2903:2;2892:9;2888:18;2875:32;2865:42;;2675:238;;;;;:::o;2918:1178::-;;;;;3090:3;3078:9;3069:7;3065:23;3061:33;3058:2;;;3112:6;3104;3097:22;3058:2;3140:31;3161:9;3140:31;:::i;:::-;3130:41;;3190:2;3211:40;3247:2;3236:9;3232:18;3211:40;:::i;:::-;3201:50;;3298:2;3287:9;3283:18;3270:32;3260:42;;3353:2;3342:9;3338:18;3325:32;-1:-1:-1;;;;;3417:2:16;3409:6;3406:14;3403:2;;;3438:6;3430;3423:22;3403:2;3481:6;3470:9;3466:22;3456:32;;3526:7;3519:4;3515:2;3511:13;3507:27;3497:2;;3553:6;3545;3538:22;3497:2;3594;3581:16;3616:2;3612;3609:10;3606:2;;;3622:18;;:::i;:::-;3671:2;3665:9;3740:2;3721:13;;-1:-1:-1;;3717:27:16;3705:40;;3701:49;;3765:18;;;3785:22;;;3762:46;3759:2;;;3811:18;;:::i;:::-;3847:2;3840:22;3871:18;;;3908:11;;;3904:20;;3901:33;-1:-1:-1;3898:2:16;;;3952:6;3944;3937:22;3898:2;4013;4008;4004;4000:11;3995:2;3987:6;3983:15;3970:46;4036:15;;;4032:24;;;4025:40;;;;-1:-1:-1;3048:1048:16;;;;-1:-1:-1;3048:1048:16;;-1:-1:-1;;3048:1048:16:o;4101:539::-;;;;4265:2;4253:9;4244:7;4240:23;4236:32;4233:2;;;4286:6;4278;4271:22;4233:2;4314:31;4335:9;4314:31;:::i;:::-;4304:41;;4396:2;4385:9;4381:18;4368:32;-1:-1:-1;;;;;4415:6:16;4412:30;4409:2;;;4460:6;4452;4445:22;4409:2;4504:76;4572:7;4563:6;4552:9;4548:22;4504:76;:::i;:::-;4223:417;;4599:8;;-1:-1:-1;4478:102:16;;-1:-1:-1;;;;4223:417:16:o;4645:268::-;;;4771:2;4759:9;4750:7;4746:23;4742:32;4739:2;;;4792:6;4784;4777:22;4739:2;4820:31;4841:9;4820:31;:::i;:::-;4810:41;;4870:37;4903:2;4892:9;4888:18;4870:37;:::i;4918:266::-;;;5047:2;5035:9;5026:7;5022:23;5018:32;5015:2;;;5068:6;5060;5053:22;5015:2;5096:31;5117:9;5096:31;:::i;:::-;5086:41;5174:2;5159:18;;;;5146:32;;-1:-1:-1;;;5005:179:16:o;5189:531::-;;;;5353:2;5341:9;5332:7;5328:23;5324:32;5321:2;;;5374:6;5366;5359:22;5321:2;5419:9;5406:23;-1:-1:-1;;;;;5444:6:16;5441:30;5438:2;;;5489:6;5481;5474:22;5438:2;5533:76;5601:7;5592:6;5581:9;5577:22;5533:76;:::i;:::-;5628:8;;5507:102;;-1:-1:-1;5710:2:16;5695:18;;;;5682:32;;5311:409;-1:-1:-1;;;;5311:409:16:o;5725:463::-;;;5872:2;5860:9;5851:7;5847:23;5843:32;5840:2;;;5893:6;5885;5878:22;5840:2;5938:9;5925:23;-1:-1:-1;;;;;5963:6:16;5960:30;5957:2;;;6008:6;6000;5993:22;5957:2;6052:76;6120:7;6111:6;6100:9;6096:22;6052:76;:::i;:::-;6147:8;;6026:102;;-1:-1:-1;5830:358:16;-1:-1:-1;;;;5830:358:16:o;6193:815::-;;;;;6392:2;6380:9;6371:7;6367:23;6363:32;6360:2;;;6413:6;6405;6398:22;6360:2;6458:9;6445:23;-1:-1:-1;;;;;6528:2:16;6520:6;6517:14;6514:2;;;6549:6;6541;6534:22;6514:2;6593:76;6661:7;6652:6;6641:9;6637:22;6593:76;:::i;:::-;6688:8;;-1:-1:-1;6567:102:16;-1:-1:-1;6776:2:16;6761:18;;6748:32;;-1:-1:-1;6792:16:16;;;6789:2;;;6826:6;6818;6811:22;6789:2;;6870:78;6940:7;6929:8;6918:9;6914:24;6870:78;:::i;:::-;6350:658;;;;-1:-1:-1;6967:8:16;-1:-1:-1;;;;6350:658:16:o;7013:192::-;;7122:2;7110:9;7101:7;7097:23;7093:32;7090:2;;;7143:6;7135;7128:22;7090:2;7171:28;7189:9;7171:28;:::i;7210:533::-;;;;7371:2;7359:9;7350:7;7346:23;7342:32;7339:2;;;7392:6;7384;7377:22;7339:2;7420:28;7438:9;7420:28;:::i;:::-;7410:38;;7499:2;7488:9;7484:18;7471:32;-1:-1:-1;;;;;7518:6:16;7515:30;7512:2;;;7563:6;7555;7548:22;7748:257;;7859:2;7847:9;7838:7;7834:23;7830:32;7827:2;;;7880:6;7872;7865:22;7827:2;7924:9;7911:23;7943:32;7969:5;7943:32;:::i;8010:261::-;;8132:2;8120:9;8111:7;8107:23;8103:32;8100:2;;;8153:6;8145;8138:22;8100:2;8190:9;8184:16;8209:32;8235:5;8209:32;:::i;8276:753::-;;;;;8445:2;8433:9;8424:7;8420:23;8416:32;8413:2;;;8466:6;8458;8451:22;8413:2;8511:9;8498:23;-1:-1:-1;;;;;8581:2:16;8573:6;8570:14;8567:2;;;8602:6;8594;8587:22;8567:2;8646:60;8698:7;8689:6;8678:9;8674:22;8646:60;:::i;:::-;8725:8;;-1:-1:-1;8620:86:16;-1:-1:-1;8813:2:16;8798:18;;8785:32;;-1:-1:-1;8829:16:16;;;8826:2;;;8863:6;8855;8848:22;8826:2;;8907:62;8961:7;8950:8;8939:9;8935:24;8907:62;:::i;9034:190::-;;9146:2;9134:9;9125:7;9121:23;9117:32;9114:2;;;9167:6;9159;9152:22;9114:2;-1:-1:-1;9195:23:16;;9104:120;-1:-1:-1;9104:120:16:o;9229:259::-;;9310:5;9304:12;9337:6;9332:3;9325:19;9353:63;9409:6;9402:4;9397:3;9393:14;9386:4;9379:5;9375:16;9353:63;:::i;:::-;9470:2;9449:15;-1:-1:-1;;9445:29:16;9436:39;;;;9477:4;9432:50;;9280:208;-1:-1:-1;;9280:208:16:o;9493:982::-;9580:12;;9493:982;;9652:1;9637:17;;9673:1;9709:18;;;;9736:2;;9790:4;9782:6;9778:17;9768:27;;9736:2;9816;9864;9856:6;9853:14;9833:18;9830:38;9827:2;;;-1:-1:-1;;;9891:33:16;;9947:4;9944:1;9937:15;9977:4;9898:3;9965:17;9827:2;10008:18;10035:104;;;;10153:1;10148:321;;;;10001:468;;10035:104;-1:-1:-1;;10068:24:16;;10056:37;;10113:16;;;;-1:-1:-1;10035:104:16;;10148:321;10184:38;10216:5;10184:38;:::i;:::-;10244:1;10258:165;10272:6;10269:1;10266:13;10258:165;;;10350:14;;10337:11;;;10330:35;10393:16;;;;10287:10;;10258:165;;;10262:3;;10452:6;10447:3;10443:16;10436:23;;10001:468;;;;;;;9553:922;;;;:::o;10480:460::-;;10729:40;10765:3;10757:6;10729:40;:::i;:::-;10798:6;10792:13;10814:52;10859:6;10855:2;10848:4;10840:6;10836:17;10814:52;:::i;:::-;10882;10926:6;10922:2;10918:15;10910:6;10882:52;:::i;:::-;10875:59;10709:231;-1:-1:-1;;;;;;;10709:231:16:o;10945:205::-;11145:3;11136:14::o;11155:203::-;-1:-1:-1;;;;;11319:32:16;;;;11301:51;;11289:2;11274:18;;11256:102::o;11363:490::-;-1:-1:-1;;;;;11632:15:16;;;11614:34;;11684:15;;11679:2;11664:18;;11657:43;11731:2;11716:18;;11709:34;;;11779:3;11774:2;11759:18;;11752:31;;;11363:490;;11800:47;;11827:19;;11819:6;11800:47;:::i;:::-;11792:55;11566:287;-1:-1:-1;;;;;;11566:287:16:o;11858:284::-;-1:-1:-1;;;;;12044:32:16;;;;12026:51;;12120:14;12113:22;12108:2;12093:18;;12086:50;12014:2;11999:18;;11981:161::o;12147:274::-;-1:-1:-1;;;;;12339:32:16;;;;12321:51;;12403:2;12388:18;;12381:34;12309:2;12294:18;;12276:145::o;12426:645::-;12591:2;12643:21;;;12713:13;;12616:18;;;12735:22;;;12426:645;;12591:2;12814:15;;;;12788:2;12773:18;;;12426:645;12860:185;12874:6;12871:1;12868:13;12860:185;;;12949:13;;12942:21;12935:29;12923:42;;13020:15;;;;12985:12;;;;12896:1;12889:9;12860:185;;;-1:-1:-1;13062:3:16;;12571:500;-1:-1:-1;;;;;;12571:500:16:o;13076:635::-;13247:2;13299:21;;;13369:13;;13272:18;;;13391:22;;;13076:635;;13247:2;13470:15;;;;13444:2;13429:18;;;13076:635;13516:169;13530:6;13527:1;13524:13;13516:169;;;13591:13;;13579:26;;13660:15;;;;13625:12;;;;13552:1;13545:9;13516:169;;13716:187;13881:14;;13874:22;13856:41;;13844:2;13829:18;;13811:92::o;13908:221::-;;14057:2;14046:9;14039:21;14077:46;14119:2;14108:9;14104:18;14096:6;14077:46;:::i;14134:340::-;14336:2;14318:21;;;14375:2;14355:18;;;14348:30;-1:-1:-1;;;14409:2:16;14394:18;;14387:46;14465:2;14450:18;;14308:166::o;14479:352::-;14681:2;14663:21;;;14720:2;14700:18;;;14693:30;14759;14754:2;14739:18;;14732:58;14822:2;14807:18;;14653:178::o;14836:348::-;15038:2;15020:21;;;15077:2;15057:18;;;15050:30;15116:26;15111:2;15096:18;;15089:54;15175:2;15160:18;;15010:174::o;15189:407::-;15391:2;15373:21;;;15430:2;15410:18;;;15403:30;15469:34;15464:2;15449:18;;15442:62;-1:-1:-1;;;15535:2:16;15520:18;;15513:41;15586:3;15571:19;;15363:233::o;15601:402::-;15803:2;15785:21;;;15842:2;15822:18;;;15815:30;15881:34;15876:2;15861:18;;15854:62;-1:-1:-1;;;15947:2:16;15932:18;;15925:36;15993:3;15978:19;;15775:228::o;16008:414::-;16210:2;16192:21;;;16249:2;16229:18;;;16222:30;16288:34;16283:2;16268:18;;16261:62;-1:-1:-1;;;16354:2:16;16339:18;;16332:48;16412:3;16397:19;;16182:240::o;16427:398::-;16629:2;16611:21;;;16668:2;16648:18;;;16641:30;16707:34;16702:2;16687:18;;16680:62;-1:-1:-1;;;16773:2:16;16758:18;;16751:32;16815:3;16800:19;;16601:224::o;16830:402::-;17032:2;17014:21;;;17071:2;17051:18;;;17044:30;17110:34;17105:2;17090:18;;17083:62;-1:-1:-1;;;17176:2:16;17161:18;;17154:36;17222:3;17207:19;;17004:228::o;17237:397::-;17439:2;17421:21;;;17478:2;17458:18;;;17451:30;17517:34;17512:2;17497:18;;17490:62;-1:-1:-1;;;17583:2:16;17568:18;;17561:31;17624:3;17609:19;;17411:223::o;17639:405::-;17841:2;17823:21;;;17880:2;17860:18;;;17853:30;17919:34;17914:2;17899:18;;17892:62;-1:-1:-1;;;17985:2:16;17970:18;;17963:39;18034:3;18019:19;;17813:231::o;18049:349::-;18251:2;18233:21;;;18290:2;18270:18;;;18263:30;18329:27;18324:2;18309:18;;18302:55;18389:2;18374:18;;18223:175::o;18403:353::-;18605:2;18587:21;;;18644:2;18624:18;;;18617:30;18683:31;18678:2;18663:18;;18656:59;18747:2;18732:18;;18577:179::o;18761:408::-;18963:2;18945:21;;;19002:2;18982:18;;;18975:30;19041:34;19036:2;19021:18;;19014:62;-1:-1:-1;;;19107:2:16;19092:18;;19085:42;19159:3;19144:19;;18935:234::o;19174:352::-;19376:2;19358:21;;;19415:2;19395:18;;;19388:30;19454;19449:2;19434:18;;19427:58;19517:2;19502:18;;19348:178::o;19531:398::-;19733:2;19715:21;;;19772:2;19752:18;;;19745:30;19811:34;19806:2;19791:18;;19784:62;-1:-1:-1;;;19877:2:16;19862:18;;19855:32;19919:3;19904:19;;19705:224::o;19934:413::-;20136:2;20118:21;;;20175:2;20155:18;;;20148:30;20214:34;20209:2;20194:18;;20187:62;-1:-1:-1;;;20280:2:16;20265:18;;20258:47;20337:3;20322:19;;20108:239::o;20352:420::-;20554:2;20536:21;;;20593:2;20573:18;;;20566:30;20632:34;20627:2;20612:18;;20605:62;20703:26;20698:2;20683:18;;20676:54;20762:3;20747:19;;20526:246::o;20777:356::-;20979:2;20961:21;;;20998:18;;;20991:30;21057:34;21052:2;21037:18;;21030:62;21124:2;21109:18;;20951:182::o;21138:408::-;21340:2;21322:21;;;21379:2;21359:18;;;21352:30;21418:34;21413:2;21398:18;;21391:62;-1:-1:-1;;;21484:2:16;21469:18;;21462:42;21536:3;21521:19;;21312:234::o;21551:356::-;21753:2;21735:21;;;21772:18;;;21765:30;21831:34;21826:2;21811:18;;21804:62;21898:2;21883:18;;21725:182::o;21912:417::-;22114:2;22096:21;;;22153:2;22133:18;;;22126:30;22192:34;22187:2;22172:18;;22165:62;-1:-1:-1;;;22258:2:16;22243:18;;22236:51;22319:3;22304:19;;22086:243::o;22334:406::-;22536:2;22518:21;;;22575:2;22555:18;;;22548:30;22614:34;22609:2;22594:18;;22587:62;-1:-1:-1;;;22680:2:16;22665:18;;22658:40;22730:3;22715:19;;22508:232::o;22745:397::-;22947:2;22929:21;;;22986:2;22966:18;;;22959:30;23025:34;23020:2;23005:18;;22998:62;-1:-1:-1;;;23091:2:16;23076:18;;23069:31;23132:3;23117:19;;22919:223::o;23147:399::-;23349:2;23331:21;;;23388:2;23368:18;;;23361:30;23427:34;23422:2;23407:18;;23400:62;-1:-1:-1;;;23493:2:16;23478:18;;23471:33;23536:3;23521:19;;23321:225::o;23551:356::-;23753:2;23735:21;;;23772:18;;;23765:30;23831:34;23826:2;23811:18;;23804:62;23898:2;23883:18;;23725:182::o;23912:402::-;24114:2;24096:21;;;24153:2;24133:18;;;24126:30;24192:34;24187:2;24172:18;;24165:62;-1:-1:-1;;;24258:2:16;24243:18;;24236:36;24304:3;24289:19;;24086:228::o;24319:405::-;24521:2;24503:21;;;24560:2;24540:18;;;24533:30;24599:34;24594:2;24579:18;;24572:62;-1:-1:-1;;;24665:2:16;24650:18;;24643:39;24714:3;24699:19;;24493:231::o;24729:413::-;24931:2;24913:21;;;24970:2;24950:18;;;24943:30;25009:34;25004:2;24989:18;;24982:62;-1:-1:-1;;;25075:2:16;25060:18;;25053:47;25132:3;25117:19;;24903:239::o;25147:355::-;25349:2;25331:21;;;25388:2;25368:18;;;25361:30;25427:33;25422:2;25407:18;;25400:61;25493:2;25478:18;;25321:181::o;25507:415::-;25709:2;25691:21;;;25748:2;25728:18;;;25721:30;25787:34;25782:2;25767:18;;25760:62;-1:-1:-1;;;25853:2:16;25838:18;;25831:49;25912:3;25897:19;;25681:241::o;25927:411::-;26129:2;26111:21;;;26168:2;26148:18;;;26141:30;26207:34;26202:2;26187:18;;26180:62;-1:-1:-1;;;26273:2:16;26258:18;;26251:45;26328:3;26313:19;;26101:237::o;26343:177::-;26489:25;;;26477:2;26462:18;;26444:76::o;26525:129::-;;26593:17;;;26643:4;26627:21;;;26583:71::o;26659:128::-;;26730:1;26726:6;26723:1;26720:13;26717:2;;;26736:18;;:::i;:::-;-1:-1:-1;26772:9:16;;26707:80::o;26792:120::-;;26858:1;26848:2;;26863:18;;:::i;:::-;-1:-1:-1;26897:9:16;;26838:74::o;26917:125::-;;26985:1;26982;26979:8;26976:2;;;26990:18;;:::i;:::-;-1:-1:-1;27027:9:16;;26966:76::o;27047:258::-;27119:1;27129:113;27143:6;27140:1;27137:13;27129:113;;;27219:11;;;27213:18;27200:11;;;27193:39;27165:2;27158:10;27129:113;;;27260:6;27257:1;27254:13;27251:2;;;-1:-1:-1;;27295:1:16;27277:16;;27270:27;27100:205::o;27310:136::-;;27377:5;27367:2;;27386:18;;:::i;:::-;-1:-1:-1;;;27422:18:16;;27357:89::o;27451:380::-;27536:1;27526:12;;27583:1;27573:12;;;27594:2;;27648:4;27640:6;27636:17;27626:27;;27594:2;27701;27693:6;27690:14;27670:18;27667:38;27664:2;;;27747:10;27742:3;27738:20;27735:1;27728:31;27782:4;27779:1;27772:15;27810:4;27807:1;27800:15;27664:2;;27506:325;;;:::o;27836:135::-;;-1:-1:-1;;27896:17:16;;27893:2;;;27916:18;;:::i;:::-;-1:-1:-1;27963:1:16;27952:13;;27883:88::o;27976:112::-;;28034:1;28024:2;;28039:18;;:::i;:::-;-1:-1:-1;28073:9:16;;28014:74::o;28093:127::-;28154:10;28149:3;28145:20;28142:1;28135:31;28185:4;28182:1;28175:15;28209:4;28206:1;28199:15;28225:127;28286:10;28281:3;28277:20;28274:1;28267:31;28317:4;28314:1;28307:15;28341:4;28338:1;28331:15;28357:127;28418:10;28413:3;28409:20;28406:1;28399:31;28449:4;28446:1;28439:15;28473:4;28470:1;28463:15;28489:133;-1:-1:-1;;;;;;28565:32:16;;28555:43;;28545:2;;28612:1;28609;28602:12

Swarm Source

ipfs://09fa913df8ab97db5927fa573e16ff07db177f2f8de295e7574ce52c876a32ce
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.