ETH Price: $2,450.54 (-2.41%)

Token

Belvedere & arteQ - The Kiss by Gustav... (BelvedereAndArteQTheKissByGustavKlimt)
 

Overview

Max Total Supply

0 BelvedereAndArteQTheKissByGustavKlimt

Holders

1,821

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BelvedereAndArteQTheKissByGustavKlimt
0x3ab2893d35309b91a210fcb665ffb54ea8791ea1
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:
arteQArtDrop

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 16 : arteQArtDrop.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://arteq.io).
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
// SPDX-License-Identifier: GNU General Public License v3.0

pragma solidity 0.8.0;

import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "./ERC721URIStorage.sol";
import "./ERC721.sol";
import "./IarteQTaskFinalizer.sol";

/// @author Kam Amini <[email protected]> <[email protected]>
///
/// @notice Use at your own risk
contract arteQArtDrop is ERC721URIStorage, IERC2981 {

    string private constant DEFAULT_TOKEN_URI = "DEFAULT_TOKEN_URI";

    uint256 public constant MAX_NR_TOKENS_PER_ACCOUNT = 5;
    uint256 public constant MAX_RESERVATIONS_COUNT = 10000;

    int256 public constant LOCKED_STAGE = 0;
    int256 public constant WHITELISTING_STAGE = 2;
    int256 public constant RESERVATION_STAGE = 3;
    int256 public constant DISTRIBUTION_STAGE = 4;

    // Counter for token IDs
    uint256 private _tokenIdCounter;

    // Counter for pre-minted token IDs
    uint256 private _preMintedTokenIdCounter;

    // number of tokens owned by the contract
    uint256 _contractBalance;

    address private _adminContract;

    // in wei
    uint256 private _pricePerToken;
    // in wei
    uint256 private _serviceFee;

    string private _defaultTokenURI;

    address _royaltyWallet;
    uint256 _royaltyPercentage;

    // The current art drop stage. It can have the following values:
    //
    //   0: Locked / Read-only mode
    //   2: Selection of the registered wallets (whitelisting)
    //   3: Reservation / Purchase stage
    //   4: Distribution of the tokens / Drop stage
    //
    // * 1 is missing from the above list. That's to keep the off-chain
    //   and on-chain states in sync.
    // * Only admin accounts with a quorum of votes can change the
    //   current stage.
    // * Some functions only work in certain stages.
    // * When the 4th stage (last stage) is finished, the contract
    //   will be put back into locked mode (stage 0).
    // * Admins can only advance/retreat the current stage by movements of +1 or -1.
    int256 private _stage;

    // A mapping from the whitelisted addresses to the maximum number of tokens they can obtain
    mapping(address => uint256) _whitelistedAccounts;

    // Counts the number of whitelisted accounts
    uint256 _whitelistedAccountsCounter;

    // Counts the number of reserved tokens
    uint256 _reservedTokensCounter;

    // Enabled reservations without a need to be whitelisted
    bool _canReserveWithoutBeingWhitelisted;

    // An operator which is allowed to perform certain operations such as adding whitelisted
    // accounts, removing them, or doing the token reservation for credit card payments. These
    // accounts can only be defined by a quorom of votes among admins.
    mapping(address => uint256) _operators;

    event WhitelistedAccountAdded(address doer, address account, uint256 maxNrOfTokensToObtain);
    event WhitelistedAccountRemoved(address doer, address account);
    event PricePerTokenChanged(address doer, uint256 adminTaskId, uint256 oldValue, uint256 newValue);
    event ServiceFeeChanged(address doer, uint256 adminTaskId, uint256 oldValue, uint256 newValue);
    event StageChanged(address doer, uint256 adminTaskId, int256 oldValue, int256 newValue);
    event OperatorAdded(address doer, uint256 adminTaskId, address toBeOperatorAccount);
    event OperatorRemoved(address doer, uint256 adminTaskId, address toBeRemovedOperatorAccount);
    event DefaultTokenURIChanged(address doer, uint256 adminTaskId, string newValue);
    event TokensReserved(address doer, address target, uint256 nrOfTokensToReserve);
    event Deposited(address doer, uint256 priceOfTokens, uint256 serviceFee, uint256 totalValue);
    event Returned(address doer, address target, uint256 returnedValue);
    event Withdrawn(address doer, address target, uint256 amount);
    event TokenURIChanged(address doer, uint256 tokenId, string newValue);
    event GenesisTokenURIChanged(address doer, uint256 adminTaskId, string newValue);
    event RoyaltyWalletChanged(address doer, uint256 adminTaskId, address newRoyaltyWallet);
    event RoyaltyPercentageChanged(address doer, uint256 adminTaskId, uint256 newRoyaltyPercentage);
    event CanReserveWithoutBeingWhitelistedChanged(address doer, uint256 adminTaskId, bool newValue);

    modifier adminApprovalRequired(uint256 adminTaskId) {
        _;
        // This must succeed otherwise the tx gets reverted
        IarteQTaskFinalizer(_adminContract).finalizeTask(msg.sender, adminTaskId);
    }

    modifier onlyLockedStage() {
        require(_stage == LOCKED_STAGE, "arteQArtDrop: only callable in locked stage");
        _;
    }

    modifier onlyWhitelistingStage() {
        require(_stage == WHITELISTING_STAGE, "arteQArtDrop: only callable in whitelisting stage");
        _;
    }

    modifier onlyReservationStage() {
        require(_stage == RESERVATION_STAGE, "arteQArtDrop: only callable in reservation stage");
        _;
    }

    modifier onlyReservationAndDistributionStages() {
        require(_stage == RESERVATION_STAGE || _stage == DISTRIBUTION_STAGE, "arteQArtDrop: only callable in reservation and distribution stage");
        _;
    }

    modifier onlyDistributionStage() {
        require(_stage == DISTRIBUTION_STAGE, "arteQArtDrop: only callable in distribution stage");
        _;
    }

    modifier onlyWhenNotLocked() {
        require(_stage > 1, "arteQArtDrop: only callable in not-locked stages");
        _;
    }

    modifier onlyWhenNotInReservationStage() {
        require(_stage != RESERVATION_STAGE, "arteQArtDrop: only callable in a non-reservation stage");
        _;
    }

    modifier onlyOperator() {
        require(_operators[msg.sender] > 0, "arteQArtDrop: not an operator account");
        _;
    }

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

    constructor(
        address adminContract,
        string memory name,
        string memory symbol,
        uint256 initialPricePerToken,
        uint256 initialServiceFee,
        string memory initialDefaultTokenURI,
        string memory initialGenesisTokenURI
    ) ERC721(name, symbol) {

        require(adminContract != address(0), "arteQArtDrop: admin contract cannot be zero");
        require(adminContract.code.length > 0, "arteQArtDrop: non-contract account for admin contract");
        require(initialPricePerToken > 0, "arteQArtDrop: zero initial price per token");
        require(bytes(initialDefaultTokenURI).length > 0, "arteQArtDrop: invalid default token uri");
        require(bytes(initialGenesisTokenURI).length > 0, "arteQArtDrop: invalid genesis token uri");

        _adminContract = adminContract;

        _pricePerToken = initialPricePerToken;
        emit PricePerTokenChanged(msg.sender, 0, 0, _pricePerToken);

        _serviceFee = initialServiceFee;
        emit ServiceFeeChanged(msg.sender, 0, 0, _serviceFee);

        _defaultTokenURI = initialDefaultTokenURI;
        emit DefaultTokenURIChanged(msg.sender, 0, _defaultTokenURI);

        _tokenIdCounter = 1;
        _preMintedTokenIdCounter = 1;
        _contractBalance = 0;

        _whitelistedAccountsCounter = 0;
        _reservedTokensCounter = 0;

        // Contract is locked/read-only by default.
        _stage = 0;
        emit StageChanged(msg.sender, 0, 0, _stage);

        // Mint genesis token. Contract will be the eternal owner of the genesis token.
        _mint(address(0), address(this), 0);
        _setTokenURI(0, initialGenesisTokenURI);
        _contractBalance += 1;
        emit GenesisTokenURIChanged(msg.sender, 0, initialGenesisTokenURI);

        _royaltyWallet = address(this);
        emit RoyaltyWalletChanged(msg.sender, 0, _royaltyWallet);

        _royaltyPercentage = 10;
        emit RoyaltyPercentageChanged(msg.sender, 0, _royaltyPercentage);

        _canReserveWithoutBeingWhitelisted = false;
        emit CanReserveWithoutBeingWhitelistedChanged(msg.sender, 0, _canReserveWithoutBeingWhitelisted);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (_exists(tokenId)) {
            string memory tokenURIValue = super.tokenURI(tokenId);
            if (keccak256(bytes(tokenURIValue)) == keccak256(bytes(DEFAULT_TOKEN_URI))) {
                return _defaultTokenURI;
            }
            return tokenURIValue;
        }
        if (tokenId >= 1 && tokenId < _preMintedTokenIdCounter) {
            return _defaultTokenURI;
        }
        revert("arteQArtDrop: token id does not exist");
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        if (_exists(tokenId)) {
            return super.ownerOf(tokenId);
        }
        if (tokenId >= 1 && tokenId < _preMintedTokenIdCounter) {
            return address(this);
        }
        revert("arteQArtDrop: token is does not exist");
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(this)) {
            return _contractBalance;
        }
        return super.balanceOf(owner);
    }

    function preMint(uint256 nr) external
      onlyOperator {
        for (uint256 i = 0; i < nr; i++) {
            require(_preMintedTokenIdCounter <= MAX_RESERVATIONS_COUNT, "arteQArtDrop: cannot pre-mint more");
            emit Transfer(address(0), address(this), _preMintedTokenIdCounter);
            _preMintedTokenIdCounter += 1;
        }
        _contractBalance += nr;
    }

    function pricePerToken() external view returns (uint256) {
        return _pricePerToken;
    }

    function serviceFee() external view returns (uint256) {
        return _serviceFee;
    }

    function defaultTokenURI() external view returns (string memory) {
        return _defaultTokenURI;
    }

    function nrPreMintedTokens() external view returns (uint256) {
        return _preMintedTokenIdCounter - 1;
    }

    function stage() external view returns (int256) {
        return _stage;
    }

    function royaltyPercentage() external view returns (uint256) {
        return _royaltyPercentage;
    }

    function royaltyWallet() external view returns (address) {
        return _royaltyWallet;
    }

    function nrOfWhitelistedAccounts() external view returns (uint256) {
        return _whitelistedAccountsCounter;
    }

    function nrOfReservedTokens() external view returns (uint256) {
        return _reservedTokensCounter;
    }

    function canReserveWithoutBeingWhitelisted() external view returns (bool) {
        return _canReserveWithoutBeingWhitelisted;
    }

    function setPricePerToken(uint256 adminTaskId, uint256 newValue) external
      onlyWhenNotLocked
      onlyWhenNotInReservationStage
      adminApprovalRequired(adminTaskId) {
        require(newValue > 0, "arteQArtDrop: new price cannot be zero");
        uint256 oldValue = _pricePerToken;
        _pricePerToken = newValue;
        emit PricePerTokenChanged(msg.sender, adminTaskId, oldValue, _pricePerToken);
    }

    function setServiceFee(uint256 adminTaskId, uint256 newValue) external
      onlyWhenNotLocked
      onlyWhenNotInReservationStage
      adminApprovalRequired(adminTaskId) {
        require(newValue > 0, "arteQArtDrop: new price cannot be zero");
        uint256 oldValue = _serviceFee;
        _serviceFee = newValue;
        emit ServiceFeeChanged(msg.sender, adminTaskId, oldValue, _serviceFee);
    }

    function setDefaultTokenURI(uint256 adminTaskId, string memory newValue) external
      onlyWhenNotLocked
      onlyWhenNotInReservationStage
      adminApprovalRequired(adminTaskId) {
        require(bytes(newValue).length > 0, "arteQArtDrop: empty string");
        _defaultTokenURI = newValue;
        emit DefaultTokenURIChanged(msg.sender, adminTaskId, _defaultTokenURI);
    }

    function setGenesisTokenURI(uint256 adminTaskId, string memory newValue) external
      onlyLockedStage
      adminApprovalRequired(adminTaskId) {
        require(bytes(newValue).length > 0, "arteQArtDrop: empty string");
        _setTokenURI(0, newValue);
        emit GenesisTokenURIChanged(msg.sender, adminTaskId, newValue);
    }

    function setRoyaltyWallet(uint256 adminTaskId, address newRoyaltyWallet) external
      adminApprovalRequired(adminTaskId) {
        require(newRoyaltyWallet != address(0), "arteQArtDrop: invalid royalty wallet");
        _royaltyWallet = newRoyaltyWallet;
        emit RoyaltyWalletChanged(msg.sender, adminTaskId, newRoyaltyWallet);
    }

    function setRoyaltyPercentage(uint256 adminTaskId, uint256 newRoyaltyPercentage) external
      adminApprovalRequired(adminTaskId) {
        require(newRoyaltyPercentage >= 0 && newRoyaltyPercentage <= 75, "arteQArtDrop: invalid royalty percentage");
        _royaltyPercentage = newRoyaltyPercentage;
        emit RoyaltyPercentageChanged(msg.sender, adminTaskId, newRoyaltyPercentage);
    }

    function setCanReserveWithoutBeingWhitelisted(uint256 adminTaskId, bool newValue) external
      adminApprovalRequired(adminTaskId) {
        _canReserveWithoutBeingWhitelisted = newValue;
        emit CanReserveWithoutBeingWhitelistedChanged(msg.sender, adminTaskId, newValue);
    }

    function retreatStage(uint256 adminTaskId) external
      adminApprovalRequired(adminTaskId) {
        int256 oldStage = _stage;
        _stage -= 1;
        if (_stage == -1) {
            _stage = 4;
        } else if (_stage == 1) {
            _stage = 0;
        }
        emit StageChanged(msg.sender, adminTaskId, oldStage, _stage);
    }

    function advanceStage(uint256 adminTaskId) external
      adminApprovalRequired(adminTaskId) {
        int256 oldStage = _stage;
        _stage += 1;
        if (_stage == 5) {
            _stage = 0;
        } else if (_stage == 1) {
            _stage = 2;
        }
        emit StageChanged(msg.sender, adminTaskId, oldStage, _stage);
    }

    function addOperator(uint256 adminTaskId, address toBeOperatorAccount) external
      adminApprovalRequired(adminTaskId) {
        require(toBeOperatorAccount != address(0), "arteQArtDrop: cannot set zero as operator");
        require(_operators[toBeOperatorAccount] == 0, "arteQArtDrop: already an operator");
        _operators[toBeOperatorAccount] = 1;
        emit OperatorAdded(msg.sender, adminTaskId, toBeOperatorAccount);
    }

    function removeOperator(uint256 adminTaskId, address toBeRemovedOperatorAccount) external
      adminApprovalRequired(adminTaskId) {
        require(toBeRemovedOperatorAccount != address(0), "arteQArtDrop: cannot remove zero as operator");
        require(_operators[toBeRemovedOperatorAccount] == 1, "arteQArtDrop: not an operator");
        _operators[toBeRemovedOperatorAccount] = 0;
        emit OperatorRemoved(msg.sender, adminTaskId, toBeRemovedOperatorAccount);
    }

    function isOperator(address account) external view returns(bool) {
        return _operators[account] == 1;
    }

    function addToWhitelistedAccounts(
      address[] memory accounts,
      uint[] memory listOfMaxNrOfTokensToObtain
    ) external
      onlyOperator
      onlyWhitelistingStage {
        require(accounts.length > 0, "arteQArtDrop: zero length");
        require(listOfMaxNrOfTokensToObtain.length > 0, "arteQArtDrop: zero length");
        require(accounts.length == listOfMaxNrOfTokensToObtain.length, "arteQArtDrop: different lengths");
        for (uint256 i = 0; i < accounts.length; i++) {
            address account = accounts[i];
            uint256 maxNrOfTokensToObtain = listOfMaxNrOfTokensToObtain[i];

            require(account != address(0), "arteQArtDrop: cannot whitelist zero address");
            require(maxNrOfTokensToObtain >= 1 && maxNrOfTokensToObtain <= MAX_NR_TOKENS_PER_ACCOUNT,
                "arteQArtDrop: invalid nr of tokens to obtain");
            require(account.code.length == 0, "arteQArtDrop: cannot whitelist a contract");
            require(_whitelistedAccounts[account] == 0, "arteQArtDrop: already whitelisted");

            _whitelistedAccounts[account] = maxNrOfTokensToObtain;
            _whitelistedAccountsCounter += 1;

            emit WhitelistedAccountAdded(msg.sender, account, maxNrOfTokensToObtain);
        }
    }

    function removeFromWhitelistedAccounts(address[] memory accounts) external
      onlyOperator
      onlyWhitelistingStage {
        require(accounts.length > 0, "arteQArtDrop: zero length");
        for (uint256 i = 0; i < accounts.length; i++) {
            address account = accounts[i];

            require(account != address(0), "arteQArtDrop: cannot remove zero address");
            require(_whitelistedAccounts[account] > 0, "arteQArtDrop: account is not whitelisted");

            _whitelistedAccounts[account] = 0;
            _whitelistedAccountsCounter -= 1;

            emit WhitelistedAccountRemoved(msg.sender, account);
        }
    }

    function whitelistedNrOfTokens(address account) external view returns (uint256) {
        if (!_canReserveWithoutBeingWhitelisted) {
            return _whitelistedAccounts[account];
        }
        if (_whitelistedAccounts[account] == 0) {
            return MAX_NR_TOKENS_PER_ACCOUNT;
        }
        return _whitelistedAccounts[account];
    }

    // Only callable by a whitelisted account
    //
    // * Account must have sent enough ETH to cover the price of all tokens + service fee
    // * Account cannot reserve more than what has been whitelisted for
    function reserveTokens(uint256 nrOfTokensToReserve) external payable
      onlyReservationAndDistributionStages {
        require(msg.value > 0, "arteQArtDrop: zero funds");
        require(nrOfTokensToReserve > 0, "arteQArtDrop: zero tokens to reserve");

        if (_canReserveWithoutBeingWhitelisted && _whitelistedAccounts[msg.sender] == 0) {
            _whitelistedAccounts[msg.sender] = 5;
        }

        require(_whitelistedAccounts[msg.sender] > 0, "arteQArtDrop: not a whitelisted account");
        require(nrOfTokensToReserve <= _whitelistedAccounts[msg.sender],
              "arteQArtDrop: exceeding the reservation allowance");
        require((_reservedTokensCounter + nrOfTokensToReserve) <= MAX_RESERVATIONS_COUNT,
                "arteQArtDrop: exceeding max number of reservations");

        // Handle payments
        uint256 priceOfTokens = nrOfTokensToReserve * _pricePerToken;
        uint256 priceToPay = priceOfTokens + _serviceFee;
        require(msg.value >= priceToPay, "arteQArtDrop: insufficient funds");
        uint256 remainder = msg.value - priceToPay;
        if (remainder > 0) {
            (bool success, ) = msg.sender.call{value: remainder}(new bytes(0));
            require(success, "arteQArtDrop: failed to send the remainder");
            emit Returned(msg.sender, msg.sender, remainder);
        }
        emit Deposited(msg.sender, priceOfTokens, _serviceFee, priceToPay);

        _reserveTokens(msg.sender, nrOfTokensToReserve);
    }

    // This method is called by an operator to complete the reservation of fiat payments
    // such as credit card, iDeal, etc.
    function reserveTokensForAccounts(
      address[] memory accounts,
      uint256[] memory listOfNrOfTokensToReserve
    ) external
      onlyOperator
      onlyReservationAndDistributionStages {
        require(accounts.length > 0, "arteQArtDrop: zero length");
        require(listOfNrOfTokensToReserve.length > 0, "arteQArtDrop: zero length");
        require(accounts.length == listOfNrOfTokensToReserve.length, "arteQArtDrop: different lengths");
        for (uint256 i = 0; i < accounts.length; i++) {
            address account = accounts[i];
            uint256 nrOfTokensToReserve = listOfNrOfTokensToReserve[i];

            require(account != address(0), "arteQArtDrop: cannot be zero address");

            if (_canReserveWithoutBeingWhitelisted && _whitelistedAccounts[account] == 0) {
                _whitelistedAccounts[account] = 5;
            }

            require(_whitelistedAccounts[account] > 0, "arteQArtDrop: not a whitelisted account");
            require(nrOfTokensToReserve <= _whitelistedAccounts[account],
                  "arteQArtDrop: exceeding the reservation allowance");

            _reserveTokens(account, nrOfTokensToReserve);
        }
    }

    function updateTokenURIs(uint256[] memory tokenIds, string[] memory newTokenURIs) external
      onlyOperator
      onlyDistributionStage {
        require(tokenIds.length > 0, "arteQArtDrop: zero length");
        require(newTokenURIs.length > 0, "arteQArtDrop: zero length");
        require(tokenIds.length == newTokenURIs.length, "arteQArtDrop: different lengths");
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            string memory newTokenURI = newTokenURIs[i];

            require(tokenId > 0, "arteQArtDrop: cannot alter genesis token");
            require(bytes(newTokenURI).length > 0, "arteQArtDrop: empty string");

            _setTokenURI(tokenId, newTokenURI);
            emit TokenURIChanged(msg.sender, tokenId, newTokenURI);
        }
    }

    function transferTo(address target, uint256 amount) external
      onlyOperator {
        require(target != address(0), "arteQArtDrop: target cannot be zero");
        require(amount > 0, "arteQArtDrop: cannot transfer zero");
        require(amount <= address(this).balance, "arteQArtDrop: transfer more than balance");

        (bool success, ) = target.call{value: amount}(new bytes(0));
        require(success, "arteQArtDrop: failed to transfer");

        emit Withdrawn(msg.sender, target, amount);
    }

    function royaltyInfo(uint256, uint256 salePrice) external view virtual override returns (address, uint256) {
        uint256 royalty = (salePrice * _royaltyPercentage) / 100;
        return (_royaltyWallet, royalty);
    }

    function _reserveTokens(address target, uint256 nrOfTokensToReserve) internal {
        for (uint256 i = 1; i <= nrOfTokensToReserve; i++) {
            uint256 newTokenId = _tokenIdCounter;
            _mint(address(this), target, newTokenId);
            _setTokenURI(newTokenId, DEFAULT_TOKEN_URI);
            _tokenIdCounter += 1;
            require(_reservedTokensCounter <= MAX_RESERVATIONS_COUNT,
                    "arteQArtDrop: exceeding max number of reservations");
            _reservedTokensCounter += 1;
        }
        if ((_contractBalance - 1) > nrOfTokensToReserve) {
            _contractBalance -= nrOfTokensToReserve;
        } else {
            _contractBalance = 1; // eventually, the contract must only own the genesis token
        }
        require(_contractBalance >= 1, "arteQArtDrop: contract balance went below 1");
        _whitelistedAccounts[target] -= nrOfTokensToReserve;
        require(_whitelistedAccounts[target] >= 0, "arteQArtDrop: should not happen");
        emit TokensReserved(msg.sender, target, nrOfTokensToReserve);
    }

    receive() external payable {
        revert("arteQArtDrop: cannot accept ether");
    }

    fallback() external payable {
        revert("arteQArtDrop: cannot accept ether");
    }
}

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

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 4 of 16 : ERC721URIStorage.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts).
 * Copyright (c) 2021 BillionBuild (2B) Team.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
// SPDX-License-Identifier: GNU General Public License v3.0
// Based on OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity 0.8.0;

import "./ERC721.sol";

 /**
  * @author Modified by Kam Amini <[email protected]> <[email protected]> <[email protected]>
  *
  * @notice Use at your own risk
  *
  * Note: 2B has modified the original code to cover its needs as
  * part of artèQ Investment Fund ecosystem
  *
  * @dev ERC721 token with storage based token URI management.
  */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 5 of 16 : ERC721.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts).
 * Copyright (c) 2021 BillionBuild (2B) Team.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
// SPDX-License-Identifier: GNU General Public License v3.0

pragma solidity 0.8.0;

import "@openzeppelin/contracts/interfaces/IERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

 /**
  * @author Modified by Kam Amini <[email protected]> <[email protected]> <[email protected]>
  *
  * @notice Use at your own risk
  *
  * Note: 2B has modified the original code to cover its needs as
  * part of artèQ Investment Fund ecosystem
  *
  * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
  * the Metadata extension, but not including the Enumerable extension, which is available separately as
  * {ERC721Enumerable}.
  */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

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

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(address(0), to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address from, address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(from, to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.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;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 16 : IarteQTaskFinalizer.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://github.com/billionbuild/arteq-contracts).
 * Copyright (c) 2021 BillionBuild (2B) Team.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
// SPDX-License-Identifier: GNU General Public License v3.0

pragma solidity 0.8.0;

/// @author Kam Amini <[email protected]> <[email protected]> <[email protected]>
/// @title The interface for finalizing tasks. Mainly used by artèQ contracts to
/// perform administrative tasks in conjuction with admin contract.
interface IarteQTaskFinalizer {

    event TaskFinalized(address finalizer, address origin, uint256 taskId);

    function finalizeTask(address origin, uint256 taskId) external;
}

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 "../token/ERC721/IERC721.sol";

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

pragma solidity ^0.8.0;

import "../token/ERC721/IERC721Receiver.sol";

File 10 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 11 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 12 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 13 of 16 : Strings.sol
// SPDX-License-Identifier: MIT

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);
    }
}

File 14 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 15 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 16 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 2000,
    "details": {
      "yul": true,
      "yulDetails": {
        "stackAllocation": true,
        "optimizerSteps": "dhfoDgvulfnTUtnIf"
      }
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"adminContract","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialPricePerToken","type":"uint256"},{"internalType":"uint256","name":"initialServiceFee","type":"uint256"},{"internalType":"string","name":"initialDefaultTokenURI","type":"string"},{"internalType":"string","name":"initialGenesisTokenURI","type":"string"}],"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":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"CanReserveWithoutBeingWhitelistedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"DefaultTokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"priceOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"serviceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"GenesisTokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"toBeOperatorAccount","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"toBeRemovedOperatorAccount","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"PricePerTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"returnedValue","type":"uint256"}],"name":"Returned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"RoyaltyPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newRoyaltyWallet","type":"address"}],"name":"RoyaltyWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"ServiceFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"oldValue","type":"int256"},{"indexed":false,"internalType":"int256","name":"newValue","type":"int256"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"TokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"nrOfTokensToReserve","type":"uint256"}],"name":"TokensReserved","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":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxNrOfTokensToObtain","type":"uint256"}],"name":"WhitelistedAccountAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAccountRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"doer","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DISTRIBUTION_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKED_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NR_TOKENS_PER_ACCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVATIONS_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVATION_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELISTING_STAGE","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeOperatorAccount","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"listOfMaxNrOfTokensToObtain","type":"uint256[]"}],"name":"addToWhitelistedAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"advanceStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canReserveWithoutBeingWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrOfReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrOfWhitelistedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nrPreMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nr","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeFromWhitelistedAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeRemovedOperatorAccount","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nrOfTokensToReserve","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"listOfNrOfTokensToReserve","type":"uint256[]"}],"name":"reserveTokensForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"retreatStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"setCanReserveWithoutBeingWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"setDefaultTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"setGenesisTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setPricePerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"newRoyaltyWallet","type":"address"}],"name":"setRoyaltyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"int256","name":"","type":"int256"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"newTokenURIs","type":"string[]"}],"name":"updateTokenURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"whitelistedNrOfTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620061fb380380620061fb8339810160408190526200003491620006a3565b8551869086906200004d9060009060208501906200056d565b508051620000639060019060208401906200056d565b5050506001600160a01b038716620000985760405162461bcd60e51b81526004016200008f9062000c7c565b60405180910390fd5b6000876001600160a01b0316803b806020016040519081016040528181526000908060200190933c5111620000e15760405162461bcd60e51b81526004016200008f9062000c58565b60008411620001045760405162461bcd60e51b81526004016200008f9062000cd6565b6000825111620001285760405162461bcd60e51b81526004016200008f9062000cc4565b60008151116200014c5760405162461bcd60e51b81526004016200008f9062000c8e565b600a80546001600160a01b0319166001600160a01b038916179055600b8490556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90620001a59033906000908190899062000b7e565b60405180910390a1600c8390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90620001eb9033906000908190889062000b7e565b60405180910390a181516200020890600d9060208501906200056d565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de1336000600d604051620002409392919062000bf7565b60405180910390a160016007819055600855600060098190556012819055601381905560108190556040517f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad5916200029f913391908190819062000b7e565b60405180910390a1620002b56000308162000413565b620002c260008262000500565b600160096000828254620002d7919062000d5a565b90915550506040517ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a89062000313903390600090859062000bc4565b60405180910390a1600e80546001600160a01b0319163017908190556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d91620003719133916000916001600160a01b03919091169062000b22565b60405180910390a1600a600f8190556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e91620003b591339160009162000c2a565b60405180910390a16014805460ff191690556040517f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890620003fe903390600090819062000b50565b60405180910390a15050505050505062000e92565b6001600160a01b0382166200043c5760405162461bcd60e51b81526004016200008f9062000cb2565b620004478162000550565b15620004675760405162461bcd60e51b81526004016200008f9062000c6a565b620004748383836200054b565b6001600160a01b03821660009081526003602052604081208054600192906200049f90849062000d5a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6200050b8262000550565b6200052a5760405162461bcd60e51b81526004016200008f9062000ca0565b600082815260066020908152604090912082516200054b928401906200056d565b505050565b6000908152600260205260409020546001600160a01b0316151590565b8280546200057b9062000df0565b90600052602060002090601f0160209004810192826200059f5760008555620005ea565b82601f10620005ba57805160ff1916838001178555620005ea565b82800160010185558215620005ea579182015b82811115620005ea578251825591602001919060010190620005cd565b50620005f8929150620005fc565b5090565b5b80821115620005f85760008155600101620005fd565b60006200062a620006248462000d14565b62000ce8565b9050828152602081018484840111156200064357600080fd5b6200065084828562000dbd565b509392505050565b8051620006658162000e6d565b92915050565b600082601f8301126200067c578081fd5b81516200068e84826020860162000613565b949350505050565b8051620006658162000e87565b600080600080600080600060e0888a031215620006be578283fd5b620006cc89848a0162000658565b60208901519097506001600160401b03811115620006e8578384fd5b620006f68a828b016200066b565b60408a015190975090506001600160401b0381111562000714578384fd5b620007228a828b016200066b565b9550506060620007358a828b0162000696565b9450506080620007488a828b0162000696565b60a08a015190945090506001600160401b0381111562000766578283fd5b620007748a828b016200066b565b60c08a015190935090506001600160401b0381111562000792578182fd5b620007a08a828b016200066b565b91505092959891949750929550565b620007ba8162000d8f565b82525050565b620007ba8162000d9c565b620007ba8162000da1565b620007ba8162000db0565b6000620007ee8262000d4d565b620007fa818562000d51565b93506200080c81856020860162000dbd565b620008178162000e63565b9093019392505050565b60008154620008308162000df0565b6200083c818662000d51565b94506001821680156200085857600181146200086b576200089d565b60ff19831686526020860193506200089d565b620008768562000d41565b60005b83811015620008975781548882015260019091019060200162000879565b87019450505b50505092915050565b6000620008b560358362000d51565b7f617274655141727444726f703a206e6f6e2d636f6e7472616374206163636f75918101919091527f6e7420666f722061646d696e20636f6e747261637400000000000000000000006020820152604001919050565b60006200091a601c8362000d51565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b600062000959602b8362000d51565b7f617274655141727444726f703a2061646d696e20636f6e74726163742063616e918101919091526a6e6f74206265207a65726f60a81b6020820152604001919050565b6000620009ac60278362000d51565b7f617274655141727444726f703a20696e76616c69642067656e6573697320746f91810191909152666b656e2075726960c81b6020820152604001919050565b6000620009fb602e8362000d51565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091526d32bc34b9ba32b73a103a37b5b2b760911b6020820152604001919050565b600062000a5160208362000d51565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b600062000a9060278362000d51565b7f617274655141727444726f703a20696e76616c69642064656661756c7420746f91810191909152666b656e2075726960c81b6020820152604001919050565b600062000adf602a8362000d51565b7f617274655141727444726f703a207a65726f20696e697469616c2070726963659181019190915269103832b9103a37b5b2b760b11b6020820152604001919050565b6060810162000b328286620007af565b62000b416020830185620007d6565b6200068e6040830184620007af565b6060810162000b608286620007af565b62000b6f6020830185620007d6565b6200068e6040830184620007c0565b6080810162000b8e8287620007af565b62000b9d6020830186620007d6565b62000bac6040830185620007d6565b62000bbb6060830184620007cb565b95945050505050565b6060810162000bd48286620007af565b62000be36020830185620007d6565b818103604083015262000bbb8184620007e1565b6060810162000c078286620007af565b62000c166020830185620007d6565b818103604083015262000bbb818462000821565b6060810162000c3a8286620007af565b62000c496020830185620007d6565b6200068e6040830184620007cb565b602080825281016200066581620008a6565b6020808252810162000665816200090b565b6020808252810162000665816200094a565b6020808252810162000665816200099d565b602080825281016200066581620009ec565b60208082528101620006658162000a42565b60208082528101620006658162000a81565b60208082528101620006658162000ad0565b6040518181016001600160401b038111828210171562000d0c5762000d0c62000e4d565b604052919050565b60006001600160401b0382111562000d305762000d3062000e4d565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b600062000d678262000da1565b915062000d748362000da1565b9250821982111562000d8a5762000d8a62000e21565b500190565b6000620006658262000da4565b151590565b90565b6001600160a01b031690565b6000620006658262000da1565b60005b8381101562000dda57818101518382015260200162000dc0565b8381111562000dea576000848401525b50505050565b60028104600182168062000e0557607f821691505b6020821081141562000e1b5762000e1b62000e37565b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b62000e788162000d8f565b811462000e8457600080fd5b50565b62000e788162000da1565b6153598062000ea26000396000f3fe60806040526004361061032d5760003560e01c80637b8e7710116101a5578063a22cb465116100ec578063bf71113a11610095578063d031370b1161006f578063d031370b146108bd578063e1217108146108d0578063e8755d00146108e5578063e985e9c51461090557610353565b8063bf71113a14610873578063c040e6b814610888578063c87b56dd1461089d57610353565b8063b15f00d5116100c6578063b15f00d514610813578063b735b1ec14610833578063b88d4fde1461085357610353565b8063a22cb465146107b3578063a76089ee146107d3578063ac1251e0146107f357610353565b80638ad433ac1161014e57806395d89b411161012857806395d89b4114610774578063960a021414610789578063963bfe121461079e57610353565b80638ad433ac1461071f5780638b4627c61461073f578063954a21881461075f57610353565b806388b8178e1161017f57806388b8178e146106e05780638a71bb2d146106f55780638abdf5aa1461070a57610353565b80637b8e77101461068b5780637d46a713146106a057806383045b68146106c057610353565b80632a55205a11610274578063454f98581161021d5780636508da03116101f75780636508da03146106215780636d70f7ae1461063657806370a08231146106565780637b1b1de61461067657610353565b8063454f9858146105cc5780636352211e146105ec5780636454aa8d1461060c57610353565b80633f0d2ec11161024e5780633f0d2ec11461057757806341d6f9c21461058c57806342842e0e146105ac57610353565b80632a55205a146105095780632ccb1b30146105375780632e534dff1461055757610353565b80630c06b056116102d657806319350e10116102b057806319350e10146104b45780632246f98b146104d457806323b872dd146104e957610353565b80630c06b056146104545780630d18d07a146104745780631018d8c41461049457610353565b8063081812fc11610307578063081812fc146103e5578063095ea7b314610412578063096f4ccb1461043457610353565b806301ffc9a71461036b57806306fdde03146103a15780630748c178146103c357610353565b366103535760405162461bcd60e51b815260040161034a90614ea0565b60405180910390fd5b60405162461bcd60e51b815260040161034a90614ea0565b34801561037757600080fd5b5061038b610386366004613354565b610925565b6040516103989190614b83565b60405180910390f35b3480156103ad57600080fd5b506103b6610983565b6040516103989190614b9f565b3480156103cf57600080fd5b506103d8610a15565b6040516103989190614b91565b3480156103f157600080fd5b5061040561040036600461338e565b610a2b565b60405161039891906149d0565b34801561041e57600080fd5b5061043261042d366004613235565b610a6e565b005b34801561044057600080fd5b5061043261044f3660046133c9565b610b06565b34801561046057600080fd5b5061043261046f366004613298565b610bbb565b34801561048057600080fd5b5061043261048f3660046133ab565b610de6565b3480156104a057600080fd5b506103d86104af3660046130f1565b610e94565b3480156104c057600080fd5b506104326104cf3660046132f6565b610f01565b3480156104e057600080fd5b506103d86110b1565b3480156104f557600080fd5b50610432610504366004613146565b6110b6565b34801561051557600080fd5b5061052961052436600461342c565b6110ee565b604051610398929190614a65565b34801561054357600080fd5b50610432610552366004613235565b611124565b34801561056357600080fd5b5061043261057236600461338e565b611283565b34801561058357600080fd5b5061040561136b565b34801561059857600080fd5b506104326105a736600461342c565b61137a565b3480156105b857600080fd5b506104326105c7366004613146565b6113d5565b3480156105d857600080fd5b506104326105e736600461338e565b6113f0565b3480156105f857600080fd5b5061040561060736600461338e565b611467565b34801561061857600080fd5b506103d86114bd565b34801561062d57600080fd5b506103d86114c2565b34801561064257600080fd5b5061038b6106513660046130f1565b6114c7565b34801561066257600080fd5b506103d86106713660046130f1565b6114e5565b34801561068257600080fd5b506103d861150a565b34801561069757600080fd5b506103d8611510565b3480156106ac57600080fd5b506104326106bb3660046133ab565b611515565b3480156106cc57600080fd5b506104326106db366004613298565b6115c2565b3480156106ec57600080fd5b506103d8611836565b34801561070157600080fd5b506103d861183c565b34801561071657600080fd5b506103d8611842565b34801561072b57600080fd5b5061043261073a36600461338e565b611848565b34801561074b57600080fd5b5061043261075a3660046133e7565b611919565b34801561076b57600080fd5b506103d8611999565b34801561078057600080fd5b506103b661199f565b34801561079557600080fd5b5061038b6119ae565b3480156107aa57600080fd5b506103b66119b7565b3480156107bf57600080fd5b506104326107ce366004613207565b6119c6565b3480156107df57600080fd5b506104326107ee366004613263565b611a94565b3480156107ff57600080fd5b5061043261080e36600461342c565b611c27565b34801561081f57600080fd5b5061043261082e3660046133e7565b611d06565b34801561083f57600080fd5b5061043261084e3660046133ab565b611db5565b34801561085f57600080fd5b5061043261086e366004613191565b611e38565b34801561087f57600080fd5b506103d8611e77565b34801561089457600080fd5b506103d8611e7c565b3480156108a957600080fd5b506103b66108b836600461338e565b611e82565b6104326108cb36600461338e565b612056565b3480156108dc57600080fd5b506103d86122e9565b3480156108f157600080fd5b5061043261090036600461342c565b6122ef565b34801561091157600080fd5b5061038b61092036600461310e565b612393565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061097b575061097b826123c3565b90505b919050565b60606000805461099290615212565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90615212565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b60006001600854610a26919061516e565b905090565b6000610a3682612465565b610a525760405162461bcd60e51b815260040161034a90614dd0565b506000908152600460205260409020546001600160a01b031690565b6000610a7982612482565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161034a90614e60565b806001600160a01b0316610abf6124b7565b6001600160a01b03161480610adb5750610adb816109206124b7565b610af75760405162461bcd60e51b815260040161034a90614d30565b610b0183836124bb565b505050565b6014805460ff191682151517905560405182907f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890610b4a90339084908690614aa8565b60405180910390a1600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b50505050505050565b33600090815260156020526040902054610be75760405162461bcd60e51b815260040161034a90614c50565b60036010541480610bfa57506004601054145b610c165760405162461bcd60e51b815260040161034a90614df0565b6000825111610c375760405162461bcd60e51b815260040161034a90614c30565b6000815111610c585760405162461bcd60e51b815260040161034a90614c30565b8051825114610c795760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610ca757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000838381518110610cd357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b03161415610d105760405162461bcd60e51b815260040161034a90614c90565b60145460ff168015610d3857506001600160a01b038216600090815260116020526040902054155b15610d5a576001600160a01b0382166000908152601160205260409020600590555b6001600160a01b038216600090815260116020526040902054610d8f5760405162461bcd60e51b815260040161034a90614bb0565b6001600160a01b038216600090815260116020526040902054811115610dc75760405162461bcd60e51b815260040161034a90614be0565b610dd18282612536565b50508080610dde9061523f565b915050610c7c565b816001600160a01b038216610e0d5760405162461bcd60e51b815260040161034a90614e50565b6001600160a01b038216600090815260156020526040902054600114610e455760405162461bcd60e51b815260040161034a90614ec0565b6001600160a01b03821660009081526015602052604080822091909155517fc57d50f4db59caf96f35b762a67c51826b60c25014200dbc625849eda5ebeafe90610b4a90339086908690614a80565b60145460009060ff16610ec057506001600160a01b03811660009081526011602052604090205461097e565b6001600160a01b038216600090815260116020526040902054610ee55750600561097e565b506001600160a01b031660009081526011602052604090205490565b33600090815260156020526040902054610f2d5760405162461bcd60e51b815260040161034a90614c50565b600460105414610f4f5760405162461bcd60e51b815260040161034a90614c10565b6000825111610f705760405162461bcd60e51b815260040161034a90614c30565b6000815111610f915760405162461bcd60e51b815260040161034a90614c30565b8051825114610fb25760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610fe057634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061100c57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600082116110365760405162461bcd60e51b815260040161034a90614f30565b60008151116110575760405162461bcd60e51b815260040161034a90614d10565b61106182826126d1565b7f8b781fcc9d1a958b4e7e04390a81f45bdec2dc61341e7b423a537074275dc70d33838360405161109493929190614b0e565b60405180910390a1505080806110a99061523f565b915050610fb5565b600381565b6110c76110c16124b7565b82612715565b6110e35760405162461bcd60e51b815260040161034a90614e80565b610b0183838361279a565b60008060006064600f548561110391906150af565b61110d9190615085565b600e546001600160a01b0316969095509350505050565b336000908152601560205260409020546111505760405162461bcd60e51b815260040161034a90614c50565b6001600160a01b0382166111765760405162461bcd60e51b815260040161034a90614e00565b600081116111965760405162461bcd60e51b815260040161034a90614d20565b478111156111b65760405162461bcd60e51b815260040161034a90614ef0565b604080516000808252602082019092526001600160a01b0384169083906040516111e091906149ac565b60006040518083038185875af1925050503d806000811461121d576040519150601f19603f3d011682016040523d82523d6000602084013e611222565b606091505b50509050806112435760405162461bcd60e51b815260040161034a90614d90565b7fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb338484604051611276939291906149f9565b60405180910390a1505050565b60108054829160019060006112988385614fd2565b9091555050601054600514156112b25760006010556112c3565b601054600114156112c35760026010555b7f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff92906113359033908590600401614a65565b600060405180830381600087803b15801561134f57600080fd5b505af1158015611363573d6000803e3d6000fd5b505050505050565b600e546001600160a01b031690565b81604b82111561139c5760405162461bcd60e51b815260040161034a90614bd0565b600f8290556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e90610b4a90339086908690614b68565b610b0183838360405180602001604052806000815250611e38565b601080548291600190600061140583856150e4565b909155505060105460001914156114205760046010556112c3565b601054600114156112c35760006010557f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b600061147282612465565b156114875761148082612482565b905061097e565b60018210158015611499575060085482105b156114a557503061097e565b60405162461bcd60e51b815260040161034a90614cc0565b600481565b600281565b6001600160a01b031660009081526015602052604090205460011490565b60006001600160a01b038216301415611501575060095461097e565b61097b826128d4565b600b5490565b600081565b816001600160a01b03821661153c5760405162461bcd60e51b815260040161034a90614d40565b6001600160a01b038216600090815260156020526040902054156115725760405162461bcd60e51b815260040161034a90614e10565b6001600160a01b0382166000908152601560205260409081902060019055517f99e4b7a7ced34a944c9792d0cd08b555d2a3f0db9bd4e8fa401d6e3c9fb621fc90610b4a90339086908690614a80565b336000908152601560205260409020546115ee5760405162461bcd60e51b815260040161034a90614c50565b6002601054146116105760405162461bcd60e51b815260040161034a90614cf0565b60008251116116315760405162461bcd60e51b815260040161034a90614c30565b60008151116116525760405162461bcd60e51b815260040161034a90614c30565b80518251146116735760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b015760008382815181106116a157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106116cd57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b0316141561170a5760405162461bcd60e51b815260040161034a90614ce0565b6001811015801561171c575060058111155b6117385760405162461bcd60e51b815260040161034a90614f20565b816001600160a01b0316803b806020016040519081016040528181526000908060200190933c511561177c5760405162461bcd60e51b815260040161034a90614e70565b6001600160a01b038216600090815260116020526040902054156117b25760405162461bcd60e51b815260040161034a90614de0565b6001600160a01b038216600090815260116020526040812082905560128054600192906117e090849061505c565b90915550506040517f446ecc2d2851a96cb2b0265c02cbb648b2d913382f9f98dd8e923e1277e1571f90611819903390859085906149f9565b60405180910390a15050808061182e9061523f565b915050611676565b61271081565b600f5490565b600c5490565b336000908152601560205260409020546118745760405162461bcd60e51b815260040161034a90614c50565b60005b818110156118fe5761271060085411156118a35760405162461bcd60e51b815260040161034a90614ca0565b60085460405130906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600860008282546118e6919061505c565b909155508190506118f68161523f565b915050611877565b508060096000828254611911919061505c565b909155505050565b601054156119395760405162461bcd60e51b815260040161034a90614c60565b81600082511161195b5760405162461bcd60e51b815260040161034a90614d10565b6119666000836126d1565b7ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a8338484604051610b4a93929190614b0e565b60135490565b60606001805461099290615212565b60145460ff1690565b6060600d805461099290615212565b6119ce6124b7565b6001600160a01b0316826001600160a01b031614156119ff5760405162461bcd60e51b815260040161034a90614c80565b8060056000611a0c6124b7565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a506124b7565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190614b83565b60405180910390a35050565b33600090815260156020526040902054611ac05760405162461bcd60e51b815260040161034a90614c50565b600260105414611ae25760405162461bcd60e51b815260040161034a90614cf0565b6000815111611b035760405162461bcd60e51b815260040161034a90614c30565b60005b8151811015611c23576000828281518110611b3157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611b6e5760405162461bcd60e51b815260040161034a90614f10565b6001600160a01b038116600090815260116020526040902054611ba35760405162461bcd60e51b815260040161034a90614f00565b6001600160a01b03811660009081526011602052604081208190556012805460019290611bd190849061516e565b90915550506040517f38659fb1f550e06bc69d12bed51d9be3a02f37b36bf36eae35b87ae438353d3d90611c0890339084906149de565b60405180910390a15080611c1b8161523f565b915050611b06565b5050565b600160105413611c495760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611c6c5760405162461bcd60e51b815260040161034a90614bf0565b8160008211611c8d5760405162461bcd60e51b815260040161034a90614ee0565b600b8054908390556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90611ccb903390879085908890614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600160105413611d285760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611d4b5760405162461bcd60e51b815260040161034a90614bf0565b816000825111611d6d5760405162461bcd60e51b815260040161034a90614d10565b8151611d8090600d906020850190612e64565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de13384600d604051610b4a93929190614b3b565b816001600160a01b038216611ddc5760405162461bcd60e51b815260040161034a90614c40565b600e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d90610b4a90339086908690614a80565b611e49611e436124b7565b83612715565b611e655760405162461bcd60e51b815260040161034a90614e80565b611e7184848484612918565b50505050565b600581565b60105490565b6060611e8d82612465565b15611f95576000611e9d8361294b565b60408051808201909152601181527f44454641554c545f544f4b454e5f5552490000000000000000000000000000006020918201528151908201209091507fdab376b119f20c9aada0a9f71c7ad4b725b4bf4a650ecfe7a8e84eacf2d9d6b9141561148057600d8054611f0f90615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3b90615212565b8015611f885780601f10611f5d57610100808354040283529160200191611f88565b820191906000526020600020905b815481529060010190602001808311611f6b57829003601f168201915b505050505091505061097e565b60018210158015611fa7575060085482105b1561203e57600d8054611fb990615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe590615212565b80156120325780601f1061200757610100808354040283529160200191612032565b820191906000526020600020905b81548152906001019060200180831161201557829003601f168201915b5050505050905061097e565b60405162461bcd60e51b815260040161034a90614e40565b6003601054148061206957506004601054145b6120855760405162461bcd60e51b815260040161034a90614df0565b600034116120a55760405162461bcd60e51b815260040161034a90614d80565b600081116120c55760405162461bcd60e51b815260040161034a90614d00565b60145460ff1680156120e4575033600090815260116020526040902054155b156120fd57336000908152601160205260409020600590555b336000908152601160205260409020546121295760405162461bcd60e51b815260040161034a90614bb0565b336000908152601160205260409020548111156121585760405162461bcd60e51b815260040161034a90614be0565b61271081601354612169919061505c565b11156121875760405162461bcd60e51b815260040161034a90614eb0565b6000600b548261219791906150af565b90506000600c54826121a9919061505c565b9050803410156121cb5760405162461bcd60e51b815260040161034a90614cb0565b60006121d7823461516e565b905080156122a057604080516000808252602082019092523390839060405161220091906149ac565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b50509050806122635760405162461bcd60e51b815260040161034a90614e90565b7f9968789f2b0cc53b435225867b7d718de6eebc4b48088763c07439fb172865be333384604051612296939291906149f9565b60405180910390a1505b7f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada33384600c54856040516122d79493929190614ad0565b60405180910390a1611e713385612536565b60125490565b6001601054136123115760405162461bcd60e51b815260040161034a90614ed0565b600360105414156123345760405162461bcd60e51b815260040161034a90614bf0565b81600082116123555760405162461bcd60e51b815260040161034a90614ee0565b600c8054908390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90611ccb903390879085908890614ad0565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061245657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061097b575061097b82612a64565b6000908152600260205260409020546001600160a01b0316151590565b6000818152600260205260408120546001600160a01b03168061097b5760405162461bcd60e51b815260040161034a90614d60565b3390565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124fd82612482565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60015b8181116125f65760075461254e308583612aae565b61258d816040518060400160405280601181526020017f44454641554c545f544f4b454e5f5552490000000000000000000000000000008152506126d1565b6001600760008282546125a0919061505c565b909155505060135461271010156125c95760405162461bcd60e51b815260040161034a90614eb0565b6001601360008282546125dc919061505c565b909155508291506125ee90508161523f565b915050612539565b50806001600954612607919061516e565b111561262a57806009600082825461261f919061516e565b909155506126309050565b60016009555b600160095410156126535760405162461bcd60e51b815260040161034a90614dc0565b6001600160a01b0382166000908152601160205260408120805483929061267b90849061516e565b90915550506001600160a01b03821660005260116020527fbdf1d6c0740e266493fa759ede2b8a30466a9d030811c565b76aff5d9b6f66c83383836040516126c5939291906149f9565b60405180910390a15050565b6126da82612465565b6126f65760405162461bcd60e51b815260040161034a90614d70565b60008281526006602090815260409091208251610b0192840190612e64565b600061272082612465565b61273c5760405162461bcd60e51b815260040161034a90614cd0565b600061274783612482565b9050806001600160a01b0316846001600160a01b031614806127825750836001600160a01b031661277784610a2b565b6001600160a01b0316145b8061279257506127928185612393565b949350505050565b826001600160a01b03166127ad82612482565b6001600160a01b0316146127d35760405162461bcd60e51b815260040161034a90614e20565b6001600160a01b0382166127f95760405162461bcd60e51b815260040161034a90614c70565b612804838383610b01565b61280f6000826124bb565b6001600160a01b038316600090815260036020526040812080546001929061283890849061516e565b90915550506001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0382166128fc5760405162461bcd60e51b815260040161034a90614d50565b506001600160a01b031660009081526003602052604090205490565b61292384848461279a565b61292f84848484612b2e565b611e715760405162461bcd60e51b815260040161034a90614c00565b606061295682612465565b6129725760405162461bcd60e51b815260040161034a90614db0565b6000828152600660205260408120805461298b90615212565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615212565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b505050505090506000612a15612c7a565b9050805160001415612a295750905061097e565b815115612a5b578082604051602001612a439291906149b8565b6040516020818303038152906040529250505061097e565b61279284612c8c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6001600160a01b038216612ad45760405162461bcd60e51b815260040161034a90614da0565b612add81612465565b15612afa5760405162461bcd60e51b815260040161034a90614c20565b612b05838383610b01565b6001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b6000612b42846001600160a01b0316612d0f565b15612c6f57836001600160a01b031663150b7a02612b5e6124b7565b8786866040518563ffffffff1660e01b8152600401612b809493929190614a21565b602060405180830381600087803b158015612b9a57600080fd5b505af1925050508015612bca575060408051601f3d908101601f19168201909252612bc791810190613371565b60015b612c24573d808015612bf8576040519150601f19603f3d011682016040523d82523d6000602084013e612bfd565b606091505b508051612c1c5760405162461bcd60e51b815260040161034a90614c00565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612792565b506001949350505050565b60408051602081019091526000815290565b6060612c9782612465565b612cb35760405162461bcd60e51b815260040161034a90614e30565b6000612cbd612c7a565b90506000815111612cdd5760405180602001604052806000815250612d08565b80612ce784612d15565b604051602001612cf89291906149b8565b6040516020818303038152906040525b9392505050565b3b151590565b606081612d56575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261097e565b8160005b8115612d805780612d6a8161523f565b9150612d799050600a83615085565b9150612d5a565b60008167ffffffffffffffff811115612da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dd3576020820181803683370190505b5090505b841561279257612de860018361516e565b9150612df5600a86615265565b612e0090603061505c565b60f81b818381518110612e2357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e5d600a86615085565b9450612dd7565b828054612e7090615212565b90600052602060002090601f016020900481019282612e925760008555612ed8565b82601f10612eab57805160ff1916838001178555612ed8565b82800160010185558215612ed8579182015b82811115612ed8578251825591602001919060010190612ebd565b50612ee4929150612ee8565b5090565b5b80821115612ee45760008155600101612ee9565b6000612f10612f0b84614f6a565b614f40565b90508083825260208201905082856020860285011115612f2f57600080fd5b60005b85811015612f5957612f44878361303a565b83526020928301929190910190600101612f32565b5050509392505050565b6000612f71612f0b84614f6a565b8381529050602081018260005b85811015612f595781358501612f9488826130c6565b8452506020928301929190910190600101612f7e565b6000612fb8612f0b84614f6a565b90508083825260208201905082856020860285011115612fd757600080fd5b60005b85811015612f5957612fec87836130e6565b83526020928301929190910190600101612fda565b600061300f612f0b84614f8e565b90508281526020810184848401111561302757600080fd5b6130328482856151da565b509392505050565b80356123bd816152f1565b600082601f830112613055578081fd5b8135612792848260208601612efd565b600082601f830112613075578081fd5b8135612792848260208601612f63565b600082601f830112613095578081fd5b8135612792848260208601612faa565b80356123bd81615308565b80356123bd81615311565b80516123bd81615311565b600082601f8301126130d6578081fd5b8135612792848260208601613001565b80356123bd8161531a565b600060208284031215613102578081fd5b612d088382840161303a565b60008060408385031215613120578081fd5b61312c8482850161303a565b9150602061313c8582860161303a565b9150509250929050565b60008060006060848603121561315a578081fd5b6131668582860161303a565b925060206131768682870161303a565b9250506040613187868287016130e6565b9150509250925092565b600080600080608085870312156131a6578081fd5b6131b28682870161303a565b935060206131c28782880161303a565b93505060406131d3878288016130e6565b925050606085013567ffffffffffffffff8111156131ef578182fd5b6131fb878288016130c6565b91505092959194509250565b60008060408385031215613219578182fd5b6132258483850161303a565b9150602061313c858286016130a5565b60008060408385031215613247578182fd5b6132538483850161303a565b9150602061313c858286016130e6565b600060208284031215613274578081fd5b8082013567ffffffffffffffff81111561328c578182fd5b61279284828501613045565b600080604083850312156132aa578182fd5b8183013567ffffffffffffffff8111156132c2578283fd5b6132ce85828601613045565b925050602083013567ffffffffffffffff8111156132ea578182fd5b61313c85828601613085565b60008060408385031215613308578182fd5b8183013567ffffffffffffffff811115613320578283fd5b61332c85828601613085565b925050602083013567ffffffffffffffff811115613348578182fd5b61313c85828601613065565b600060208284031215613365578081fd5b612d08838284016130b0565b600060208284031215613382578081fd5b612d08838284016130bb565b60006020828403121561339f578081fd5b612d08838284016130e6565b600080604083850312156133bd578182fd5b61312c848385016130e6565b600080604083850312156133db578182fd5b613225848385016130e6565b600080604083850312156133f9578182fd5b613405848385016130e6565b9150602083013567ffffffffffffffff811115613420578182fd5b61313c858286016130c6565b6000806040838503121561343e578182fd5b613253848385016130e6565b61345381615196565b82525050565b613453816151a1565b600061346d82614fc5565b6134778185614fc9565b93506134878185602086016151e6565b613490816152e7565b9093019392505050565b60006134a582614fc5565b6134af818561097e565b93506134bf8185602086016151e6565b9290920192915050565b613453816151cb565b600081546134df81615212565b6134e98186614fc9565b9450600182168015613502576001811461351457613542565b60ff1983168652602086019350613542565b61351d85614fb9565b60005b8381101561353c57815488820152600190910190602001613520565b87019450505b50505092915050565b6000613558602783614fc9565b7f617274655141727444726f703a206e6f7420612077686974656c697374656420918101919091527f6163636f756e74000000000000000000000000000000000000000000000000006020820152604001919050565b60006135bb601f83614fc9565b7f617274655141727444726f703a20646966666572656e74206c656e677468730091810191909152602001919050565b60006135f8602883614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207065918101919091527f7263656e746167650000000000000000000000000000000000000000000000006020820152604001919050565b600061365b603183614fc9565b7f617274655141727444726f703a20657863656564696e67207468652072657365918101919091527f72766174696f6e20616c6c6f77616e63650000000000000000000000000000006020820152604001919050565b60006136be603683614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2061918101919091527f206e6f6e2d7265736572766174696f6e207374616765000000000000000000006020820152604001919050565b6000613721603283614fc9565b7f4552433732313a207472616e7366657220746f206e6f6e204552433732315265918101919091527f63656976657220696d706c656d656e74657200000000000000000000000000006020820152604001919050565b6000613784603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2064918101919091527f6973747269627574696f6e2073746167650000000000000000000000000000006020820152604001919050565b60006137e7601c83614fc9565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b6000613824601983614fc9565b7f617274655141727444726f703a207a65726f206c656e6774680000000000000091810191909152602001919050565b6000613861602483614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207761918101919091527f6c6c6574000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006138c4602583614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f72206163918101919091527f636f756e740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613927602b83614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206c918101919091527f6f636b65642073746167650000000000000000000000000000000000000000006020820152604001919050565b600061398a602483614fc9565b7f4552433732313a207472616e7366657220746f20746865207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006139ed601983614fc9565b7f4552433732313a20617070726f766520746f2063616c6c65720000000000000091810191909152602001919050565b6000613a2a602483614fc9565b7f617274655141727444726f703a2063616e6e6f74206265207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613a8d602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207072652d6d696e74206d6f918101919091527f72650000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613af0602083614fc9565b7f617274655141727444726f703a20696e73756666696369656e742066756e647391810191909152602001919050565b6000613b2d602583614fc9565b7f617274655141727444726f703a20746f6b656e20697320646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613b90602c83614fc9565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b6000613bf3602b83614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c697374207a918101919091527f65726f20616464726573730000000000000000000000000000000000000000006020820152604001919050565b6000613c56603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2077918101919091527f686974656c697374696e672073746167650000000000000000000000000000006020820152604001919050565b6000613cb9602483614fc9565b7f617274655141727444726f703a207a65726f20746f6b656e7320746f20726573918101919091527f65727665000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613d1c601a83614fc9565b7f617274655141727444726f703a20656d70747920737472696e6700000000000091810191909152602001919050565b6000613d59602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207472616e73666572207a65918101919091527f726f0000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613dbc603883614fc9565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f77918101919091527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020820152604001919050565b6000613e1f602983614fc9565b7f617274655141727444726f703a2063616e6e6f7420736574207a65726f206173918101919091527f206f70657261746f7200000000000000000000000000000000000000000000006020820152604001919050565b6000613e82602a83614fc9565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65918101919091527f726f2061646472657373000000000000000000000000000000000000000000006020820152604001919050565b6000613ee5602983614fc9565b7f4552433732313a206f776e657220717565727920666f72206e6f6e6578697374918101919091527f656e7420746f6b656e00000000000000000000000000000000000000000000006020820152604001919050565b6000613f48602e83614fc9565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020820152604001919050565b6000613fab601883614fc9565b7f617274655141727444726f703a207a65726f2066756e6473000000000000000091810191909152602001919050565b6000613fe8602083614fc9565b7f617274655141727444726f703a206661696c656420746f207472616e7366657291810191909152602001919050565b6000614025602083614fc9565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b6000614062603183614fc9565b7f45524337323155524953746f726167653a2055524920717565727920666f7220918101919091527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020820152604001919050565b60006140c5602b83614fc9565b7f617274655141727444726f703a20636f6e74726163742062616c616e63652077918101919091527f656e742062656c6f7720310000000000000000000000000000000000000000006020820152604001919050565b6000614128602c83614fc9565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b600061418b602183614fc9565b7f617274655141727444726f703a20616c72656164792077686974656c69737465918101919091527f64000000000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006141ee604183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2072918101919091527f65736572766174696f6e20616e6420646973747269627574696f6e207374616760208201527f65000000000000000000000000000000000000000000000000000000000000006040820152606001919050565b6000614277602383614fc9565b7f617274655141727444726f703a207461726765742063616e6e6f74206265207a918101919091527f65726f00000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006142da602183614fc9565b7f617274655141727444726f703a20616c726561647920616e206f70657261746f91810191909152603960f91b6020820152604001919050565b6000614321602983614fc9565b7f4552433732313a207472616e73666572206f6620746f6b656e20746861742069918101919091527f73206e6f74206f776e00000000000000000000000000000000000000000000006020820152604001919050565b6000614384602f83614fc9565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f918101919091527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020820152604001919050565b60006143e7602583614fc9565b7f617274655141727444726f703a20746f6b656e20696420646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b600061444a602c83614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f206173206f70657261746f7200000000000000000000000000000000000000006020820152604001919050565b60006144ad602183614fc9565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6591810191909152603960f91b6020820152604001919050565b60006144f4602983614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c6973742061918101919091527f20636f6e747261637400000000000000000000000000000000000000000000006020820152604001919050565b6000614557603183614fc9565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f918101919091527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020820152604001919050565b60006145ba602a83614fc9565b7f617274655141727444726f703a206661696c656420746f2073656e6420746865918101919091527f2072656d61696e646572000000000000000000000000000000000000000000006020820152604001919050565b600061461d602183614fc9565b7f617274655141727444726f703a2063616e6e6f7420616363657074206574686591810191909152603960f91b6020820152604001919050565b6000614664603283614fc9565b7f617274655141727444726f703a20657863656564696e67206d6178206e756d62918101919091527f6572206f66207265736572766174696f6e7300000000000000000000000000006020820152604001919050565b60006146c7601d83614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f7200000091810191909152602001919050565b6000614704603083614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206e918101919091527f6f742d6c6f636b656420737461676573000000000000000000000000000000006020820152604001919050565b6000614767602683614fc9565b7f617274655141727444726f703a206e65772070726963652063616e6e6f742062918101919091527f65207a65726f00000000000000000000000000000000000000000000000000006020820152604001919050565b60006147ca602883614fc9565b7f617274655141727444726f703a207472616e73666572206d6f7265207468616e918101919091527f2062616c616e63650000000000000000000000000000000000000000000000006020820152604001919050565b600061482d602883614fc9565b7f617274655141727444726f703a206163636f756e74206973206e6f7420776869918101919091527f74656c69737465640000000000000000000000000000000000000000000000006020820152604001919050565b6000614890602883614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f20616464726573730000000000000000000000000000000000000000000000006020820152604001919050565b60006148f3602c83614fc9565b7f617274655141727444726f703a20696e76616c6964206e72206f6620746f6b65918101919091527f6e7320746f206f627461696e00000000000000000000000000000000000000006020820152604001919050565b6000614956602883614fc9565b7f617274655141727444726f703a2063616e6e6f7420616c7465722067656e6573918101919091527f697320746f6b656e0000000000000000000000000000000000000000000000006020820152604001919050565b6000612d08828461349a565b60006149c4828561349a565b9150612792828461349a565b602081016123bd828461344a565b604081016149ec828561344a565b612d08602083018461344a565b60608101614a07828661344a565b614a14602083018561344a565b61279260408301846134c9565b60808101614a2f828761344a565b614a3c602083018661344a565b614a4960408301856134c9565b8181036060830152614a5b8184613462565b9695505050505050565b60408101614a73828561344a565b612d0860208301846134c9565b60608101614a8e828661344a565b614a9b60208301856134c9565b612792604083018461344a565b60608101614ab6828661344a565b614ac360208301856134c9565b6127926040830184613459565b60808101614ade828761344a565b614aeb60208301866134c9565b614af860408301856134c9565b614b0560608301846134c9565b95945050505050565b60608101614b1c828661344a565b614b2960208301856134c9565b8181036040830152614b058184613462565b60608101614b49828661344a565b614b5660208301856134c9565b8181036040830152614b0581846134d2565b60608101614b76828661344a565b614a1460208301856134c9565b602081016123bd8284613459565b602081016123bd82846134c9565b60208082528101612d088184613462565b6020808252810161097b8161354b565b6020808252810161097b816135ae565b6020808252810161097b816135eb565b6020808252810161097b8161364e565b6020808252810161097b816136b1565b6020808252810161097b81613714565b6020808252810161097b81613777565b6020808252810161097b816137da565b6020808252810161097b81613817565b6020808252810161097b81613854565b6020808252810161097b816138b7565b6020808252810161097b8161391a565b6020808252810161097b8161397d565b6020808252810161097b816139e0565b6020808252810161097b81613a1d565b6020808252810161097b81613a80565b6020808252810161097b81613ae3565b6020808252810161097b81613b20565b6020808252810161097b81613b83565b6020808252810161097b81613be6565b6020808252810161097b81613c49565b6020808252810161097b81613cac565b6020808252810161097b81613d0f565b6020808252810161097b81613d4c565b6020808252810161097b81613daf565b6020808252810161097b81613e12565b6020808252810161097b81613e75565b6020808252810161097b81613ed8565b6020808252810161097b81613f3b565b6020808252810161097b81613f9e565b6020808252810161097b81613fdb565b6020808252810161097b81614018565b6020808252810161097b81614055565b6020808252810161097b816140b8565b6020808252810161097b8161411b565b6020808252810161097b8161417e565b6020808252810161097b816141e1565b6020808252810161097b8161426a565b6020808252810161097b816142cd565b6020808252810161097b81614314565b6020808252810161097b81614377565b6020808252810161097b816143da565b6020808252810161097b8161443d565b6020808252810161097b816144a0565b6020808252810161097b816144e7565b6020808252810161097b8161454a565b6020808252810161097b816145ad565b6020808252810161097b81614610565b6020808252810161097b81614657565b6020808252810161097b816146ba565b6020808252810161097b816146f7565b6020808252810161097b8161475a565b6020808252810161097b816147bd565b6020808252810161097b81614820565b6020808252810161097b81614883565b6020808252810161097b816148e6565b6020808252810161097b81614949565b60405181810167ffffffffffffffff81118282101715614f6257614f626152d1565b604052919050565b600067ffffffffffffffff821115614f8457614f846152d1565b5060209081020190565b600067ffffffffffffffff821115614fa857614fa86152d1565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b6000614fdd826151cb565b9150614fe8836151cb565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383138183121516156150215761502161528f565b817f800000000000000000000000000000000000000000000000000000000000000003831281831216156150575761505761528f565b500190565b6000615067826151cb565b9150615072836151cb565b925082198211156150575761505761528f565b6000615090826151cb565b915061509b836151cb565b9250826150aa576150aa6152a5565b500490565b60006150ba826151cb565b91506150c5836151cb565b92508160001904831182151516156150df576150df61528f565b500290565b60006150ef826151cb565b91506150fa836151cb565b9250827f80000000000000000000000000000000000000000000000000000000000000000182128184121516156151335761513361528f565b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821381841216156151695761516961528f565b500390565b6000615179826151cb565b9150615184836151cb565b9250828210156151695761516961528f565b600061097b826151ce565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90565b6001600160a01b031690565b82818337506000910152565b60005b838110156152015781810151838201526020016151e9565b83811115611e715750506000910152565b60028104600182168061522657607f821691505b60208210811415615239576152396152bb565b50919050565b600061524a826151cb565b915060001982141561525e5761525e61528f565b5060010190565b6000615270826151cb565b915061527b836151cb565b92508261528a5761528a6152a5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b6152fa81615196565b811461530557600080fd5b50565b6152fa816151a1565b6152fa816151a6565b6152fa816151cb56fea264697066735822122068530d9e8886897419e0dd2ae38849abbfd5d01e1c59b2d22f28c54dfc9cf64764736f6c63430008000033000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000905438e60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000002c42656c7665646572652026206172746551202d20546865204b69737320627920477573746176204b6c696d740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002542656c766564657265416e6441727465515468654b69737342794775737461764b6c696d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d6577367939514c767153554a32525a793978325558526663584a6d6e77444532507a525a564e4e65766f765a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838545961627a744846573871626a6b487000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061032d5760003560e01c80637b8e7710116101a5578063a22cb465116100ec578063bf71113a11610095578063d031370b1161006f578063d031370b146108bd578063e1217108146108d0578063e8755d00146108e5578063e985e9c51461090557610353565b8063bf71113a14610873578063c040e6b814610888578063c87b56dd1461089d57610353565b8063b15f00d5116100c6578063b15f00d514610813578063b735b1ec14610833578063b88d4fde1461085357610353565b8063a22cb465146107b3578063a76089ee146107d3578063ac1251e0146107f357610353565b80638ad433ac1161014e57806395d89b411161012857806395d89b4114610774578063960a021414610789578063963bfe121461079e57610353565b80638ad433ac1461071f5780638b4627c61461073f578063954a21881461075f57610353565b806388b8178e1161017f57806388b8178e146106e05780638a71bb2d146106f55780638abdf5aa1461070a57610353565b80637b8e77101461068b5780637d46a713146106a057806383045b68146106c057610353565b80632a55205a11610274578063454f98581161021d5780636508da03116101f75780636508da03146106215780636d70f7ae1461063657806370a08231146106565780637b1b1de61461067657610353565b8063454f9858146105cc5780636352211e146105ec5780636454aa8d1461060c57610353565b80633f0d2ec11161024e5780633f0d2ec11461057757806341d6f9c21461058c57806342842e0e146105ac57610353565b80632a55205a146105095780632ccb1b30146105375780632e534dff1461055757610353565b80630c06b056116102d657806319350e10116102b057806319350e10146104b45780632246f98b146104d457806323b872dd146104e957610353565b80630c06b056146104545780630d18d07a146104745780631018d8c41461049457610353565b8063081812fc11610307578063081812fc146103e5578063095ea7b314610412578063096f4ccb1461043457610353565b806301ffc9a71461036b57806306fdde03146103a15780630748c178146103c357610353565b366103535760405162461bcd60e51b815260040161034a90614ea0565b60405180910390fd5b60405162461bcd60e51b815260040161034a90614ea0565b34801561037757600080fd5b5061038b610386366004613354565b610925565b6040516103989190614b83565b60405180910390f35b3480156103ad57600080fd5b506103b6610983565b6040516103989190614b9f565b3480156103cf57600080fd5b506103d8610a15565b6040516103989190614b91565b3480156103f157600080fd5b5061040561040036600461338e565b610a2b565b60405161039891906149d0565b34801561041e57600080fd5b5061043261042d366004613235565b610a6e565b005b34801561044057600080fd5b5061043261044f3660046133c9565b610b06565b34801561046057600080fd5b5061043261046f366004613298565b610bbb565b34801561048057600080fd5b5061043261048f3660046133ab565b610de6565b3480156104a057600080fd5b506103d86104af3660046130f1565b610e94565b3480156104c057600080fd5b506104326104cf3660046132f6565b610f01565b3480156104e057600080fd5b506103d86110b1565b3480156104f557600080fd5b50610432610504366004613146565b6110b6565b34801561051557600080fd5b5061052961052436600461342c565b6110ee565b604051610398929190614a65565b34801561054357600080fd5b50610432610552366004613235565b611124565b34801561056357600080fd5b5061043261057236600461338e565b611283565b34801561058357600080fd5b5061040561136b565b34801561059857600080fd5b506104326105a736600461342c565b61137a565b3480156105b857600080fd5b506104326105c7366004613146565b6113d5565b3480156105d857600080fd5b506104326105e736600461338e565b6113f0565b3480156105f857600080fd5b5061040561060736600461338e565b611467565b34801561061857600080fd5b506103d86114bd565b34801561062d57600080fd5b506103d86114c2565b34801561064257600080fd5b5061038b6106513660046130f1565b6114c7565b34801561066257600080fd5b506103d86106713660046130f1565b6114e5565b34801561068257600080fd5b506103d861150a565b34801561069757600080fd5b506103d8611510565b3480156106ac57600080fd5b506104326106bb3660046133ab565b611515565b3480156106cc57600080fd5b506104326106db366004613298565b6115c2565b3480156106ec57600080fd5b506103d8611836565b34801561070157600080fd5b506103d861183c565b34801561071657600080fd5b506103d8611842565b34801561072b57600080fd5b5061043261073a36600461338e565b611848565b34801561074b57600080fd5b5061043261075a3660046133e7565b611919565b34801561076b57600080fd5b506103d8611999565b34801561078057600080fd5b506103b661199f565b34801561079557600080fd5b5061038b6119ae565b3480156107aa57600080fd5b506103b66119b7565b3480156107bf57600080fd5b506104326107ce366004613207565b6119c6565b3480156107df57600080fd5b506104326107ee366004613263565b611a94565b3480156107ff57600080fd5b5061043261080e36600461342c565b611c27565b34801561081f57600080fd5b5061043261082e3660046133e7565b611d06565b34801561083f57600080fd5b5061043261084e3660046133ab565b611db5565b34801561085f57600080fd5b5061043261086e366004613191565b611e38565b34801561087f57600080fd5b506103d8611e77565b34801561089457600080fd5b506103d8611e7c565b3480156108a957600080fd5b506103b66108b836600461338e565b611e82565b6104326108cb36600461338e565b612056565b3480156108dc57600080fd5b506103d86122e9565b3480156108f157600080fd5b5061043261090036600461342c565b6122ef565b34801561091157600080fd5b5061038b61092036600461310e565b612393565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061097b575061097b826123c3565b90505b919050565b60606000805461099290615212565b80601f01602080910402602001604051908101604052809291908181526020018280546109be90615212565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b60006001600854610a26919061516e565b905090565b6000610a3682612465565b610a525760405162461bcd60e51b815260040161034a90614dd0565b506000908152600460205260409020546001600160a01b031690565b6000610a7982612482565b9050806001600160a01b0316836001600160a01b03161415610aad5760405162461bcd60e51b815260040161034a90614e60565b806001600160a01b0316610abf6124b7565b6001600160a01b03161480610adb5750610adb816109206124b7565b610af75760405162461bcd60e51b815260040161034a90614d30565b610b0183836124bb565b505050565b6014805460ff191682151517905560405182907f14816ec37cc478314876b923fdf81ed5a093e5666d98f333b59879f24e98c00890610b4a90339084908690614aa8565b60405180910390a1600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600060405180830381600087803b158015610b9e57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b50505050505050565b33600090815260156020526040902054610be75760405162461bcd60e51b815260040161034a90614c50565b60036010541480610bfa57506004601054145b610c165760405162461bcd60e51b815260040161034a90614df0565b6000825111610c375760405162461bcd60e51b815260040161034a90614c30565b6000815111610c585760405162461bcd60e51b815260040161034a90614c30565b8051825114610c795760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610ca757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000838381518110610cd357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b03161415610d105760405162461bcd60e51b815260040161034a90614c90565b60145460ff168015610d3857506001600160a01b038216600090815260116020526040902054155b15610d5a576001600160a01b0382166000908152601160205260409020600590555b6001600160a01b038216600090815260116020526040902054610d8f5760405162461bcd60e51b815260040161034a90614bb0565b6001600160a01b038216600090815260116020526040902054811115610dc75760405162461bcd60e51b815260040161034a90614be0565b610dd18282612536565b50508080610dde9061523f565b915050610c7c565b816001600160a01b038216610e0d5760405162461bcd60e51b815260040161034a90614e50565b6001600160a01b038216600090815260156020526040902054600114610e455760405162461bcd60e51b815260040161034a90614ec0565b6001600160a01b03821660009081526015602052604080822091909155517fc57d50f4db59caf96f35b762a67c51826b60c25014200dbc625849eda5ebeafe90610b4a90339086908690614a80565b60145460009060ff16610ec057506001600160a01b03811660009081526011602052604090205461097e565b6001600160a01b038216600090815260116020526040902054610ee55750600561097e565b506001600160a01b031660009081526011602052604090205490565b33600090815260156020526040902054610f2d5760405162461bcd60e51b815260040161034a90614c50565b600460105414610f4f5760405162461bcd60e51b815260040161034a90614c10565b6000825111610f705760405162461bcd60e51b815260040161034a90614c30565b6000815111610f915760405162461bcd60e51b815260040161034a90614c30565b8051825114610fb25760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b01576000838281518110610fe057634e487b7160e01b600052603260045260246000fd5b60200260200101519050600083838151811061100c57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600082116110365760405162461bcd60e51b815260040161034a90614f30565b60008151116110575760405162461bcd60e51b815260040161034a90614d10565b61106182826126d1565b7f8b781fcc9d1a958b4e7e04390a81f45bdec2dc61341e7b423a537074275dc70d33838360405161109493929190614b0e565b60405180910390a1505080806110a99061523f565b915050610fb5565b600381565b6110c76110c16124b7565b82612715565b6110e35760405162461bcd60e51b815260040161034a90614e80565b610b0183838361279a565b60008060006064600f548561110391906150af565b61110d9190615085565b600e546001600160a01b0316969095509350505050565b336000908152601560205260409020546111505760405162461bcd60e51b815260040161034a90614c50565b6001600160a01b0382166111765760405162461bcd60e51b815260040161034a90614e00565b600081116111965760405162461bcd60e51b815260040161034a90614d20565b478111156111b65760405162461bcd60e51b815260040161034a90614ef0565b604080516000808252602082019092526001600160a01b0384169083906040516111e091906149ac565b60006040518083038185875af1925050503d806000811461121d576040519150601f19603f3d011682016040523d82523d6000602084013e611222565b606091505b50509050806112435760405162461bcd60e51b815260040161034a90614d90565b7fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb338484604051611276939291906149f9565b60405180910390a1505050565b60108054829160019060006112988385614fd2565b9091555050601054600514156112b25760006010556112c3565b601054600114156112c35760026010555b7f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff92906113359033908590600401614a65565b600060405180830381600087803b15801561134f57600080fd5b505af1158015611363573d6000803e3d6000fd5b505050505050565b600e546001600160a01b031690565b81604b82111561139c5760405162461bcd60e51b815260040161034a90614bd0565b600f8290556040517f87bb6a3fca7ca05c3df23c1ab520027b6b15e82d010346ea1b25d5cce99bcc1e90610b4a90339086908690614b68565b610b0183838360405180602001604052806000815250611e38565b601080548291600190600061140583856150e4565b909155505060105460001914156114205760046010556112c3565b601054600114156112c35760006010557f273157957c4a6687c81f49e179d2f9c2c966633fbbcf5fe5dc8c2dbbf5f7dad53384836010546040516112fa9493929190614ad0565b600061147282612465565b156114875761148082612482565b905061097e565b60018210158015611499575060085482105b156114a557503061097e565b60405162461bcd60e51b815260040161034a90614cc0565b600481565b600281565b6001600160a01b031660009081526015602052604090205460011490565b60006001600160a01b038216301415611501575060095461097e565b61097b826128d4565b600b5490565b600081565b816001600160a01b03821661153c5760405162461bcd60e51b815260040161034a90614d40565b6001600160a01b038216600090815260156020526040902054156115725760405162461bcd60e51b815260040161034a90614e10565b6001600160a01b0382166000908152601560205260409081902060019055517f99e4b7a7ced34a944c9792d0cd08b555d2a3f0db9bd4e8fa401d6e3c9fb621fc90610b4a90339086908690614a80565b336000908152601560205260409020546115ee5760405162461bcd60e51b815260040161034a90614c50565b6002601054146116105760405162461bcd60e51b815260040161034a90614cf0565b60008251116116315760405162461bcd60e51b815260040161034a90614c30565b60008151116116525760405162461bcd60e51b815260040161034a90614c30565b80518251146116735760405162461bcd60e51b815260040161034a90614bc0565b60005b8251811015610b015760008382815181106116a157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106116cd57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316826001600160a01b0316141561170a5760405162461bcd60e51b815260040161034a90614ce0565b6001811015801561171c575060058111155b6117385760405162461bcd60e51b815260040161034a90614f20565b816001600160a01b0316803b806020016040519081016040528181526000908060200190933c511561177c5760405162461bcd60e51b815260040161034a90614e70565b6001600160a01b038216600090815260116020526040902054156117b25760405162461bcd60e51b815260040161034a90614de0565b6001600160a01b038216600090815260116020526040812082905560128054600192906117e090849061505c565b90915550506040517f446ecc2d2851a96cb2b0265c02cbb648b2d913382f9f98dd8e923e1277e1571f90611819903390859085906149f9565b60405180910390a15050808061182e9061523f565b915050611676565b61271081565b600f5490565b600c5490565b336000908152601560205260409020546118745760405162461bcd60e51b815260040161034a90614c50565b60005b818110156118fe5761271060085411156118a35760405162461bcd60e51b815260040161034a90614ca0565b60085460405130906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600860008282546118e6919061505c565b909155508190506118f68161523f565b915050611877565b508060096000828254611911919061505c565b909155505050565b601054156119395760405162461bcd60e51b815260040161034a90614c60565b81600082511161195b5760405162461bcd60e51b815260040161034a90614d10565b6119666000836126d1565b7ff202233811d16424434fab47c96a165efa73189e31b2b0772004cfc2576ed0a8338484604051610b4a93929190614b0e565b60135490565b60606001805461099290615212565b60145460ff1690565b6060600d805461099290615212565b6119ce6124b7565b6001600160a01b0316826001600160a01b031614156119ff5760405162461bcd60e51b815260040161034a90614c80565b8060056000611a0c6124b7565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a506124b7565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a889190614b83565b60405180910390a35050565b33600090815260156020526040902054611ac05760405162461bcd60e51b815260040161034a90614c50565b600260105414611ae25760405162461bcd60e51b815260040161034a90614cf0565b6000815111611b035760405162461bcd60e51b815260040161034a90614c30565b60005b8151811015611c23576000828281518110611b3157634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611b6e5760405162461bcd60e51b815260040161034a90614f10565b6001600160a01b038116600090815260116020526040902054611ba35760405162461bcd60e51b815260040161034a90614f00565b6001600160a01b03811660009081526011602052604081208190556012805460019290611bd190849061516e565b90915550506040517f38659fb1f550e06bc69d12bed51d9be3a02f37b36bf36eae35b87ae438353d3d90611c0890339084906149de565b60405180910390a15080611c1b8161523f565b915050611b06565b5050565b600160105413611c495760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611c6c5760405162461bcd60e51b815260040161034a90614bf0565b8160008211611c8d5760405162461bcd60e51b815260040161034a90614ee0565b600b8054908390556040517fd5a3c346eedfec1fe93a050614e3631ca4147adbdfa23709b930a9621563c9ca90611ccb903390879085908890614ad0565b60405180910390a150600a5460405163241bffc960e11b81526001600160a01b0390911690634837ff9290610b849033908590600401614a65565b600160105413611d285760405162461bcd60e51b815260040161034a90614ed0565b60036010541415611d4b5760405162461bcd60e51b815260040161034a90614bf0565b816000825111611d6d5760405162461bcd60e51b815260040161034a90614d10565b8151611d8090600d906020850190612e64565b507f4760f7d799cd559ad408ea60133bf414b4242d1faf5b16a8a162e0e001963de13384600d604051610b4a93929190614b3b565b816001600160a01b038216611ddc5760405162461bcd60e51b815260040161034a90614c40565b600e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790556040517fd87828fc86de61149a558942899a7321fdaf4d89e462f752f681c23edcc3bc3d90610b4a90339086908690614a80565b611e49611e436124b7565b83612715565b611e655760405162461bcd60e51b815260040161034a90614e80565b611e7184848484612918565b50505050565b600581565b60105490565b6060611e8d82612465565b15611f95576000611e9d8361294b565b60408051808201909152601181527f44454641554c545f544f4b454e5f5552490000000000000000000000000000006020918201528151908201209091507fdab376b119f20c9aada0a9f71c7ad4b725b4bf4a650ecfe7a8e84eacf2d9d6b9141561148057600d8054611f0f90615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3b90615212565b8015611f885780601f10611f5d57610100808354040283529160200191611f88565b820191906000526020600020905b815481529060010190602001808311611f6b57829003601f168201915b505050505091505061097e565b60018210158015611fa7575060085482105b1561203e57600d8054611fb990615212565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe590615212565b80156120325780601f1061200757610100808354040283529160200191612032565b820191906000526020600020905b81548152906001019060200180831161201557829003601f168201915b5050505050905061097e565b60405162461bcd60e51b815260040161034a90614e40565b6003601054148061206957506004601054145b6120855760405162461bcd60e51b815260040161034a90614df0565b600034116120a55760405162461bcd60e51b815260040161034a90614d80565b600081116120c55760405162461bcd60e51b815260040161034a90614d00565b60145460ff1680156120e4575033600090815260116020526040902054155b156120fd57336000908152601160205260409020600590555b336000908152601160205260409020546121295760405162461bcd60e51b815260040161034a90614bb0565b336000908152601160205260409020548111156121585760405162461bcd60e51b815260040161034a90614be0565b61271081601354612169919061505c565b11156121875760405162461bcd60e51b815260040161034a90614eb0565b6000600b548261219791906150af565b90506000600c54826121a9919061505c565b9050803410156121cb5760405162461bcd60e51b815260040161034a90614cb0565b60006121d7823461516e565b905080156122a057604080516000808252602082019092523390839060405161220091906149ac565b60006040518083038185875af1925050503d806000811461223d576040519150601f19603f3d011682016040523d82523d6000602084013e612242565b606091505b50509050806122635760405162461bcd60e51b815260040161034a90614e90565b7f9968789f2b0cc53b435225867b7d718de6eebc4b48088763c07439fb172865be333384604051612296939291906149f9565b60405180910390a1505b7f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada33384600c54856040516122d79493929190614ad0565b60405180910390a1611e713385612536565b60125490565b6001601054136123115760405162461bcd60e51b815260040161034a90614ed0565b600360105414156123345760405162461bcd60e51b815260040161034a90614bf0565b81600082116123555760405162461bcd60e51b815260040161034a90614ee0565b600c8054908390556040517f16315d3c0057f3aef9aad8acbc80bd05fc4e8e51f36488479f817dc5b99085bd90611ccb903390879085908890614ad0565b6001600160a01b0380831660009081526005602090815260408083209385168352929052205460ff165b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061245657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061097b575061097b82612a64565b6000908152600260205260409020546001600160a01b0316151590565b6000818152600260205260408120546001600160a01b03168061097b5760405162461bcd60e51b815260040161034a90614d60565b3390565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906124fd82612482565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60015b8181116125f65760075461254e308583612aae565b61258d816040518060400160405280601181526020017f44454641554c545f544f4b454e5f5552490000000000000000000000000000008152506126d1565b6001600760008282546125a0919061505c565b909155505060135461271010156125c95760405162461bcd60e51b815260040161034a90614eb0565b6001601360008282546125dc919061505c565b909155508291506125ee90508161523f565b915050612539565b50806001600954612607919061516e565b111561262a57806009600082825461261f919061516e565b909155506126309050565b60016009555b600160095410156126535760405162461bcd60e51b815260040161034a90614dc0565b6001600160a01b0382166000908152601160205260408120805483929061267b90849061516e565b90915550506001600160a01b03821660005260116020527fbdf1d6c0740e266493fa759ede2b8a30466a9d030811c565b76aff5d9b6f66c83383836040516126c5939291906149f9565b60405180910390a15050565b6126da82612465565b6126f65760405162461bcd60e51b815260040161034a90614d70565b60008281526006602090815260409091208251610b0192840190612e64565b600061272082612465565b61273c5760405162461bcd60e51b815260040161034a90614cd0565b600061274783612482565b9050806001600160a01b0316846001600160a01b031614806127825750836001600160a01b031661277784610a2b565b6001600160a01b0316145b8061279257506127928185612393565b949350505050565b826001600160a01b03166127ad82612482565b6001600160a01b0316146127d35760405162461bcd60e51b815260040161034a90614e20565b6001600160a01b0382166127f95760405162461bcd60e51b815260040161034a90614c70565b612804838383610b01565b61280f6000826124bb565b6001600160a01b038316600090815260036020526040812080546001929061283890849061516e565b90915550506001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0382166128fc5760405162461bcd60e51b815260040161034a90614d50565b506001600160a01b031660009081526003602052604090205490565b61292384848461279a565b61292f84848484612b2e565b611e715760405162461bcd60e51b815260040161034a90614c00565b606061295682612465565b6129725760405162461bcd60e51b815260040161034a90614db0565b6000828152600660205260408120805461298b90615212565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615212565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b505050505090506000612a15612c7a565b9050805160001415612a295750905061097e565b815115612a5b578082604051602001612a439291906149b8565b6040516020818303038152906040529250505061097e565b61279284612c8c565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b6001600160a01b038216612ad45760405162461bcd60e51b815260040161034a90614da0565b612add81612465565b15612afa5760405162461bcd60e51b815260040161034a90614c20565b612b05838383610b01565b6001600160a01b038216600090815260036020526040812080546001929061286690849061505c565b6000612b42846001600160a01b0316612d0f565b15612c6f57836001600160a01b031663150b7a02612b5e6124b7565b8786866040518563ffffffff1660e01b8152600401612b809493929190614a21565b602060405180830381600087803b158015612b9a57600080fd5b505af1925050508015612bca575060408051601f3d908101601f19168201909252612bc791810190613371565b60015b612c24573d808015612bf8576040519150601f19603f3d011682016040523d82523d6000602084013e612bfd565b606091505b508051612c1c5760405162461bcd60e51b815260040161034a90614c00565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612792565b506001949350505050565b60408051602081019091526000815290565b6060612c9782612465565b612cb35760405162461bcd60e51b815260040161034a90614e30565b6000612cbd612c7a565b90506000815111612cdd5760405180602001604052806000815250612d08565b80612ce784612d15565b604051602001612cf89291906149b8565b6040516020818303038152906040525b9392505050565b3b151590565b606081612d56575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261097e565b8160005b8115612d805780612d6a8161523f565b9150612d799050600a83615085565b9150612d5a565b60008167ffffffffffffffff811115612da957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dd3576020820181803683370190505b5090505b841561279257612de860018361516e565b9150612df5600a86615265565b612e0090603061505c565b60f81b818381518110612e2357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e5d600a86615085565b9450612dd7565b828054612e7090615212565b90600052602060002090601f016020900481019282612e925760008555612ed8565b82601f10612eab57805160ff1916838001178555612ed8565b82800160010185558215612ed8579182015b82811115612ed8578251825591602001919060010190612ebd565b50612ee4929150612ee8565b5090565b5b80821115612ee45760008155600101612ee9565b6000612f10612f0b84614f6a565b614f40565b90508083825260208201905082856020860285011115612f2f57600080fd5b60005b85811015612f5957612f44878361303a565b83526020928301929190910190600101612f32565b5050509392505050565b6000612f71612f0b84614f6a565b8381529050602081018260005b85811015612f595781358501612f9488826130c6565b8452506020928301929190910190600101612f7e565b6000612fb8612f0b84614f6a565b90508083825260208201905082856020860285011115612fd757600080fd5b60005b85811015612f5957612fec87836130e6565b83526020928301929190910190600101612fda565b600061300f612f0b84614f8e565b90508281526020810184848401111561302757600080fd5b6130328482856151da565b509392505050565b80356123bd816152f1565b600082601f830112613055578081fd5b8135612792848260208601612efd565b600082601f830112613075578081fd5b8135612792848260208601612f63565b600082601f830112613095578081fd5b8135612792848260208601612faa565b80356123bd81615308565b80356123bd81615311565b80516123bd81615311565b600082601f8301126130d6578081fd5b8135612792848260208601613001565b80356123bd8161531a565b600060208284031215613102578081fd5b612d088382840161303a565b60008060408385031215613120578081fd5b61312c8482850161303a565b9150602061313c8582860161303a565b9150509250929050565b60008060006060848603121561315a578081fd5b6131668582860161303a565b925060206131768682870161303a565b9250506040613187868287016130e6565b9150509250925092565b600080600080608085870312156131a6578081fd5b6131b28682870161303a565b935060206131c28782880161303a565b93505060406131d3878288016130e6565b925050606085013567ffffffffffffffff8111156131ef578182fd5b6131fb878288016130c6565b91505092959194509250565b60008060408385031215613219578182fd5b6132258483850161303a565b9150602061313c858286016130a5565b60008060408385031215613247578182fd5b6132538483850161303a565b9150602061313c858286016130e6565b600060208284031215613274578081fd5b8082013567ffffffffffffffff81111561328c578182fd5b61279284828501613045565b600080604083850312156132aa578182fd5b8183013567ffffffffffffffff8111156132c2578283fd5b6132ce85828601613045565b925050602083013567ffffffffffffffff8111156132ea578182fd5b61313c85828601613085565b60008060408385031215613308578182fd5b8183013567ffffffffffffffff811115613320578283fd5b61332c85828601613085565b925050602083013567ffffffffffffffff811115613348578182fd5b61313c85828601613065565b600060208284031215613365578081fd5b612d08838284016130b0565b600060208284031215613382578081fd5b612d08838284016130bb565b60006020828403121561339f578081fd5b612d08838284016130e6565b600080604083850312156133bd578182fd5b61312c848385016130e6565b600080604083850312156133db578182fd5b613225848385016130e6565b600080604083850312156133f9578182fd5b613405848385016130e6565b9150602083013567ffffffffffffffff811115613420578182fd5b61313c858286016130c6565b6000806040838503121561343e578182fd5b613253848385016130e6565b61345381615196565b82525050565b613453816151a1565b600061346d82614fc5565b6134778185614fc9565b93506134878185602086016151e6565b613490816152e7565b9093019392505050565b60006134a582614fc5565b6134af818561097e565b93506134bf8185602086016151e6565b9290920192915050565b613453816151cb565b600081546134df81615212565b6134e98186614fc9565b9450600182168015613502576001811461351457613542565b60ff1983168652602086019350613542565b61351d85614fb9565b60005b8381101561353c57815488820152600190910190602001613520565b87019450505b50505092915050565b6000613558602783614fc9565b7f617274655141727444726f703a206e6f7420612077686974656c697374656420918101919091527f6163636f756e74000000000000000000000000000000000000000000000000006020820152604001919050565b60006135bb601f83614fc9565b7f617274655141727444726f703a20646966666572656e74206c656e677468730091810191909152602001919050565b60006135f8602883614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207065918101919091527f7263656e746167650000000000000000000000000000000000000000000000006020820152604001919050565b600061365b603183614fc9565b7f617274655141727444726f703a20657863656564696e67207468652072657365918101919091527f72766174696f6e20616c6c6f77616e63650000000000000000000000000000006020820152604001919050565b60006136be603683614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2061918101919091527f206e6f6e2d7265736572766174696f6e207374616765000000000000000000006020820152604001919050565b6000613721603283614fc9565b7f4552433732313a207472616e7366657220746f206e6f6e204552433732315265918101919091527f63656976657220696d706c656d656e74657200000000000000000000000000006020820152604001919050565b6000613784603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2064918101919091527f6973747269627574696f6e2073746167650000000000000000000000000000006020820152604001919050565b60006137e7601c83614fc9565b7f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000091810191909152602001919050565b6000613824601983614fc9565b7f617274655141727444726f703a207a65726f206c656e6774680000000000000091810191909152602001919050565b6000613861602483614fc9565b7f617274655141727444726f703a20696e76616c696420726f79616c7479207761918101919091527f6c6c6574000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006138c4602583614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f72206163918101919091527f636f756e740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613927602b83614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206c918101919091527f6f636b65642073746167650000000000000000000000000000000000000000006020820152604001919050565b600061398a602483614fc9565b7f4552433732313a207472616e7366657220746f20746865207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006139ed601983614fc9565b7f4552433732313a20617070726f766520746f2063616c6c65720000000000000091810191909152602001919050565b6000613a2a602483614fc9565b7f617274655141727444726f703a2063616e6e6f74206265207a65726f20616464918101919091527f72657373000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613a8d602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207072652d6d696e74206d6f918101919091527f72650000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613af0602083614fc9565b7f617274655141727444726f703a20696e73756666696369656e742066756e647391810191909152602001919050565b6000613b2d602583614fc9565b7f617274655141727444726f703a20746f6b656e20697320646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613b90602c83614fc9565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b6000613bf3602b83614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c697374207a918101919091527f65726f20616464726573730000000000000000000000000000000000000000006020820152604001919050565b6000613c56603183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2077918101919091527f686974656c697374696e672073746167650000000000000000000000000000006020820152604001919050565b6000613cb9602483614fc9565b7f617274655141727444726f703a207a65726f20746f6b656e7320746f20726573918101919091527f65727665000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613d1c601a83614fc9565b7f617274655141727444726f703a20656d70747920737472696e6700000000000091810191909152602001919050565b6000613d59602283614fc9565b7f617274655141727444726f703a2063616e6e6f74207472616e73666572207a65918101919091527f726f0000000000000000000000000000000000000000000000000000000000006020820152604001919050565b6000613dbc603883614fc9565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f77918101919091527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020820152604001919050565b6000613e1f602983614fc9565b7f617274655141727444726f703a2063616e6e6f7420736574207a65726f206173918101919091527f206f70657261746f7200000000000000000000000000000000000000000000006020820152604001919050565b6000613e82602a83614fc9565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a65918101919091527f726f2061646472657373000000000000000000000000000000000000000000006020820152604001919050565b6000613ee5602983614fc9565b7f4552433732313a206f776e657220717565727920666f72206e6f6e6578697374918101919091527f656e7420746f6b656e00000000000000000000000000000000000000000000006020820152604001919050565b6000613f48602e83614fc9565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e918101919091527f6578697374656e7420746f6b656e0000000000000000000000000000000000006020820152604001919050565b6000613fab601883614fc9565b7f617274655141727444726f703a207a65726f2066756e6473000000000000000091810191909152602001919050565b6000613fe8602083614fc9565b7f617274655141727444726f703a206661696c656420746f207472616e7366657291810191909152602001919050565b6000614025602083614fc9565b7f4552433732313a206d696e7420746f20746865207a65726f206164647265737391810191909152602001919050565b6000614062603183614fc9565b7f45524337323155524953746f726167653a2055524920717565727920666f7220918101919091527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020820152604001919050565b60006140c5602b83614fc9565b7f617274655141727444726f703a20636f6e74726163742062616c616e63652077918101919091527f656e742062656c6f7720310000000000000000000000000000000000000000006020820152604001919050565b6000614128602c83614fc9565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e6578918101919091527f697374656e7420746f6b656e00000000000000000000000000000000000000006020820152604001919050565b600061418b602183614fc9565b7f617274655141727444726f703a20616c72656164792077686974656c69737465918101919091527f64000000000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006141ee604183614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e2072918101919091527f65736572766174696f6e20616e6420646973747269627574696f6e207374616760208201527f65000000000000000000000000000000000000000000000000000000000000006040820152606001919050565b6000614277602383614fc9565b7f617274655141727444726f703a207461726765742063616e6e6f74206265207a918101919091527f65726f00000000000000000000000000000000000000000000000000000000006020820152604001919050565b60006142da602183614fc9565b7f617274655141727444726f703a20616c726561647920616e206f70657261746f91810191909152603960f91b6020820152604001919050565b6000614321602983614fc9565b7f4552433732313a207472616e73666572206f6620746f6b656e20746861742069918101919091527f73206e6f74206f776e00000000000000000000000000000000000000000000006020820152604001919050565b6000614384602f83614fc9565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f918101919091527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020820152604001919050565b60006143e7602583614fc9565b7f617274655141727444726f703a20746f6b656e20696420646f6573206e6f7420918101919091527f65786973740000000000000000000000000000000000000000000000000000006020820152604001919050565b600061444a602c83614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f206173206f70657261746f7200000000000000000000000000000000000000006020820152604001919050565b60006144ad602183614fc9565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6591810191909152603960f91b6020820152604001919050565b60006144f4602983614fc9565b7f617274655141727444726f703a2063616e6e6f742077686974656c6973742061918101919091527f20636f6e747261637400000000000000000000000000000000000000000000006020820152604001919050565b6000614557603183614fc9565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f918101919091527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020820152604001919050565b60006145ba602a83614fc9565b7f617274655141727444726f703a206661696c656420746f2073656e6420746865918101919091527f2072656d61696e646572000000000000000000000000000000000000000000006020820152604001919050565b600061461d602183614fc9565b7f617274655141727444726f703a2063616e6e6f7420616363657074206574686591810191909152603960f91b6020820152604001919050565b6000614664603283614fc9565b7f617274655141727444726f703a20657863656564696e67206d6178206e756d62918101919091527f6572206f66207265736572766174696f6e7300000000000000000000000000006020820152604001919050565b60006146c7601d83614fc9565b7f617274655141727444726f703a206e6f7420616e206f70657261746f7200000091810191909152602001919050565b6000614704603083614fc9565b7f617274655141727444726f703a206f6e6c792063616c6c61626c6520696e206e918101919091527f6f742d6c6f636b656420737461676573000000000000000000000000000000006020820152604001919050565b6000614767602683614fc9565b7f617274655141727444726f703a206e65772070726963652063616e6e6f742062918101919091527f65207a65726f00000000000000000000000000000000000000000000000000006020820152604001919050565b60006147ca602883614fc9565b7f617274655141727444726f703a207472616e73666572206d6f7265207468616e918101919091527f2062616c616e63650000000000000000000000000000000000000000000000006020820152604001919050565b600061482d602883614fc9565b7f617274655141727444726f703a206163636f756e74206973206e6f7420776869918101919091527f74656c69737465640000000000000000000000000000000000000000000000006020820152604001919050565b6000614890602883614fc9565b7f617274655141727444726f703a2063616e6e6f742072656d6f7665207a65726f918101919091527f20616464726573730000000000000000000000000000000000000000000000006020820152604001919050565b60006148f3602c83614fc9565b7f617274655141727444726f703a20696e76616c6964206e72206f6620746f6b65918101919091527f6e7320746f206f627461696e00000000000000000000000000000000000000006020820152604001919050565b6000614956602883614fc9565b7f617274655141727444726f703a2063616e6e6f7420616c7465722067656e6573918101919091527f697320746f6b656e0000000000000000000000000000000000000000000000006020820152604001919050565b6000612d08828461349a565b60006149c4828561349a565b9150612792828461349a565b602081016123bd828461344a565b604081016149ec828561344a565b612d08602083018461344a565b60608101614a07828661344a565b614a14602083018561344a565b61279260408301846134c9565b60808101614a2f828761344a565b614a3c602083018661344a565b614a4960408301856134c9565b8181036060830152614a5b8184613462565b9695505050505050565b60408101614a73828561344a565b612d0860208301846134c9565b60608101614a8e828661344a565b614a9b60208301856134c9565b612792604083018461344a565b60608101614ab6828661344a565b614ac360208301856134c9565b6127926040830184613459565b60808101614ade828761344a565b614aeb60208301866134c9565b614af860408301856134c9565b614b0560608301846134c9565b95945050505050565b60608101614b1c828661344a565b614b2960208301856134c9565b8181036040830152614b058184613462565b60608101614b49828661344a565b614b5660208301856134c9565b8181036040830152614b0581846134d2565b60608101614b76828661344a565b614a1460208301856134c9565b602081016123bd8284613459565b602081016123bd82846134c9565b60208082528101612d088184613462565b6020808252810161097b8161354b565b6020808252810161097b816135ae565b6020808252810161097b816135eb565b6020808252810161097b8161364e565b6020808252810161097b816136b1565b6020808252810161097b81613714565b6020808252810161097b81613777565b6020808252810161097b816137da565b6020808252810161097b81613817565b6020808252810161097b81613854565b6020808252810161097b816138b7565b6020808252810161097b8161391a565b6020808252810161097b8161397d565b6020808252810161097b816139e0565b6020808252810161097b81613a1d565b6020808252810161097b81613a80565b6020808252810161097b81613ae3565b6020808252810161097b81613b20565b6020808252810161097b81613b83565b6020808252810161097b81613be6565b6020808252810161097b81613c49565b6020808252810161097b81613cac565b6020808252810161097b81613d0f565b6020808252810161097b81613d4c565b6020808252810161097b81613daf565b6020808252810161097b81613e12565b6020808252810161097b81613e75565b6020808252810161097b81613ed8565b6020808252810161097b81613f3b565b6020808252810161097b81613f9e565b6020808252810161097b81613fdb565b6020808252810161097b81614018565b6020808252810161097b81614055565b6020808252810161097b816140b8565b6020808252810161097b8161411b565b6020808252810161097b8161417e565b6020808252810161097b816141e1565b6020808252810161097b8161426a565b6020808252810161097b816142cd565b6020808252810161097b81614314565b6020808252810161097b81614377565b6020808252810161097b816143da565b6020808252810161097b8161443d565b6020808252810161097b816144a0565b6020808252810161097b816144e7565b6020808252810161097b8161454a565b6020808252810161097b816145ad565b6020808252810161097b81614610565b6020808252810161097b81614657565b6020808252810161097b816146ba565b6020808252810161097b816146f7565b6020808252810161097b8161475a565b6020808252810161097b816147bd565b6020808252810161097b81614820565b6020808252810161097b81614883565b6020808252810161097b816148e6565b6020808252810161097b81614949565b60405181810167ffffffffffffffff81118282101715614f6257614f626152d1565b604052919050565b600067ffffffffffffffff821115614f8457614f846152d1565b5060209081020190565b600067ffffffffffffffff821115614fa857614fa86152d1565b506020601f91909101601f19160190565b60009081526020902090565b5190565b90815260200190565b6000614fdd826151cb565b9150614fe8836151cb565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383138183121516156150215761502161528f565b817f800000000000000000000000000000000000000000000000000000000000000003831281831216156150575761505761528f565b500190565b6000615067826151cb565b9150615072836151cb565b925082198211156150575761505761528f565b6000615090826151cb565b915061509b836151cb565b9250826150aa576150aa6152a5565b500490565b60006150ba826151cb565b91506150c5836151cb565b92508160001904831182151516156150df576150df61528f565b500290565b60006150ef826151cb565b91506150fa836151cb565b9250827f80000000000000000000000000000000000000000000000000000000000000000182128184121516156151335761513361528f565b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821381841216156151695761516961528f565b500390565b6000615179826151cb565b9150615184836151cb565b9250828210156151695761516961528f565b600061097b826151ce565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90565b6001600160a01b031690565b82818337506000910152565b60005b838110156152015781810151838201526020016151e9565b83811115611e715750506000910152565b60028104600182168061522657607f821691505b60208210811415615239576152396152bb565b50919050565b600061524a826151cb565b915060001982141561525e5761525e61528f565b5060010190565b6000615270826151cb565b915061527b836151cb565b92508261528a5761528a6152a5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f01601f191690565b6152fa81615196565b811461530557600080fd5b50565b6152fa816151a1565b6152fa816151a6565b6152fa816151cb56fea264697066735822122068530d9e8886897419e0dd2ae38849abbfd5d01e1c59b2d22f28c54dfc9cf64764736f6c63430008000033

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

000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000905438e60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000002c42656c7665646572652026206172746551202d20546865204b69737320627920477573746176204b6c696d740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002542656c766564657265416e6441727465515468654b69737342794775737461764b6c696d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d6577367939514c767153554a32525a793978325558526663584a6d6e77444532507a525a564e4e65766f765a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838545961627a744846573871626a6b487000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : adminContract (address): 0x554823B9dDB01304252b84DAfedFB2214e7E5FD8
Arg [1] : name (string): Belvedere & arteQ - The Kiss by Gustav Klimt
Arg [2] : symbol (string): BelvedereAndArteQTheKissByGustavKlimt
Arg [3] : initialPricePerToken (uint256): 650000000000000000
Arg [4] : initialServiceFee (uint256): 0
Arg [5] : initialDefaultTokenURI (string): https://arteq.mypinata.cloud/ipfs/Qmew6y9QLvqSUJ2RZy9x2UXRfcXJmnwDE2PzRZVNNevovZ
Arg [6] : initialGenesisTokenURI (string): https://arteq.mypinata.cloud/ipfs/QmcPJzwyWArooPr8neSGQvGwKeAQX8TYabztHFW8qbjkHp

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 000000000000000000000000554823b9ddb01304252b84dafedfb2214e7e5fd8
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000905438e60010000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [8] : 42656c7665646572652026206172746551202d20546865204b69737320627920
Arg [9] : 477573746176204b6c696d740000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [11] : 42656c766564657265416e6441727465515468654b6973734279477573746176
Arg [12] : 4b6c696d74000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [14] : 68747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066
Arg [15] : 732f516d6577367939514c767153554a32525a793978325558526663584a6d6e
Arg [16] : 77444532507a525a564e4e65766f765a00000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [18] : 68747470733a2f2f61727465712e6d7970696e6174612e636c6f75642f697066
Arg [19] : 732f516d63504a7a77795741726f6f5072386e655347517647774b6541515838
Arg [20] : 545961627a744846573871626a6b487000000000000000000000000000000000


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.