ETH Price: $3,304.15 (-3.14%)
Gas: 12 Gwei

Token

SharkCat Planet (SCP)
 

Overview

Max Total Supply

2,787 SCP

Holders

717

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SCP
0xc68a79ce1d9f0d7972e941711b798069d72527ce
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

SharkCat is a unique species of 9,999 characters living on their new planet where it’s now the era of an NFT uprising hosted by Opensea. Visit [www.sharkcatnft.io](https://www.sharkcatnft.io/) to learn more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SharkCatPlanet

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 14: SharkCatPlanet.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./MerkleProof.sol";

contract SharkCatPlanet is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 9999;
    uint256 public reservedGiveaway = 99; // Reserved last 99 SharkCats for giveaway (ID 9901 - 9999)
    uint256 public limitMintPerTx = 20;
    uint256 private maxCashbackPerToken;
    string public baseURI;
    string public baseExtension = ".json";
    bool public paused = true;
    bool private cashback = true;

    enum SaleRound {
        OG,
        WL,
        Public,
        Closed
    }

    SaleRound public saleRound = SaleRound.Closed;

    mapping(SaleRound => uint256) public salePrice;
    mapping(SaleRound => bytes32) private rootPreSaleWhiteList;
    mapping(SaleRound => mapping(address => uint256)) public preSaleMintAddressesMintedCount;

    constructor(string memory _initBaseURI, uint256 _initMaxCashbackPerToken) ERC721("SharkCat Planet", "SCP") {
        setBaseURI(_initBaseURI);
        setMaxCashbackPerToken(_initMaxCashbackPerToken);
        setSalePrice(SaleRound.OG, 0.065 ether);
        setSalePrice(SaleRound.WL, 0.075 ether);
        setSalePrice(SaleRound.Public, 0.085 ether);
    }

    modifier saleOpen(uint256 _mintAmount) {
        require(!paused, "Sales paused");
        require(saleRound != SaleRound.Closed, "Sales closed");
        require(
            totalSupply() + _mintAmount <= MAX_SUPPLY - reservedGiveaway,
            "Exceeds maximum SharkCats limit"
        );
        require(
            _mintAmount <= limitMintPerTx || limitMintPerTx == 0,
            "Mint SharkCats per tx exceeded"
        );
        _;
    }

    function isWhitelisted(SaleRound _round, bytes32[] memory _proof) private view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(address(this), msg.sender));
        return MerkleProof.verify(_proof, rootPreSaleWhiteList[_round], leaf);
    }

    function preSaleMint(uint256 _mintAmount, bytes32[] memory _proof) public payable saleOpen(_mintAmount) {
        uint256 startGas = gasleft();
        uint256 supply = totalSupply();
        require(saleRound == SaleRound.OG || saleRound == SaleRound.WL, "Pre sales not open");
        if (saleRound == SaleRound.OG) {
            require(isWhitelisted(SaleRound.OG, _proof), "Not whitelisted");
            require(
                preSaleMintAddressesMintedCount[saleRound][msg.sender] + _mintAmount <= 4,
                "Mint SharkCat per address exceeded, come back again next round"
            );
        } else if (saleRound == SaleRound.WL) {
            require(
                isWhitelisted(SaleRound.WL, _proof) || isWhitelisted(SaleRound.OG, _proof),
                "Not whitelisted"
            );
            require(
                preSaleMintAddressesMintedCount[saleRound][msg.sender] + _mintAmount <= 2,
                "Mint SharkCat per address exceeded, come back again next round"
            );
        }
        require(msg.value >= salePrice[saleRound] * _mintAmount, "Value below price");

        preSaleMintAddressesMintedCount[saleRound][msg.sender] += _mintAmount;
        uint256 cashbackAmount = 0;
        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + i - (99 - reservedGiveaway);
            _safeMint(msg.sender, tokenId);

            if (cashback && tokenId <= 3000) {
                cashbackAmount = (startGas - gasleft()) * tx.gasprice;
                if (cashbackAmount > maxCashbackPerToken * i) {
                    cashbackAmount = maxCashbackPerToken * i;
                }
            }
        }

        if (cashbackAmount > 0) {
            _withdraw(msg.sender, cashbackAmount);
        }
    }

    function mint(uint256 _mintAmount) public payable saleOpen(_mintAmount) {
        uint256 startGas = gasleft();
        uint256 supply = totalSupply();
        require(saleRound == SaleRound.Public, "Sales not open");
        require(msg.value >= salePrice[SaleRound.Public] * _mintAmount, "Value below price");

        uint256 cashbackAmount = 0;
        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + i - (99 - reservedGiveaway);
            _safeMint(msg.sender, tokenId);

            if (cashback && tokenId <= 3000) {
                cashbackAmount = (startGas - gasleft()) * tx.gasprice;
                if (cashbackAmount > maxCashbackPerToken * i) {
                    cashbackAmount = maxCashbackPerToken * i;
                }
            }
        }

        if (cashbackAmount > 0) {
            _withdraw(msg.sender, cashbackAmount);
        }
    }

    function mintUnsoldToken(address _to, uint256 _mintAmount) public onlyOwner {
        uint256 supply = totalSupply();
        require(!paused, "Paused");
        require(saleRound == SaleRound.Closed, "Sales not closed");
        require(supply + _mintAmount <= MAX_SUPPLY - reservedGiveaway, "Exceeds maximum SharkCats limit");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            uint256 tokenId = supply + i - (99 - reservedGiveaway);
            _safeMint(_to, tokenId);
        }
    }

    function giveAway(address _to, uint256[] memory _tokensId) public onlyOwner {
        uint256 supply = totalSupply();
        require(_tokensId.length > 0);
        require(_tokensId.length <= reservedGiveaway, "Exceeds reserved giveaway limit");
        require(supply + _tokensId.length <= MAX_SUPPLY, "Exceeds maximum SharkCats limit");

        for (uint256 i = 0; i < _tokensId.length; i++) {
            require(_tokensId[i] >= 9901 && _tokensId[i] <= MAX_SUPPLY, "Token ID out of range");
            require(!_exists(_tokensId[i]), "Token already exists");
        }

        reservedGiveaway -= _tokensId.length;
        for (uint256 i = 0; i < _tokensId.length; i++) {
            _safeMint(_to, _tokensId[i]);
        }
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent SharkCat"
        );

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

    function setSalePrice(SaleRound _round, uint256 _newPrice) public onlyOwner {
        salePrice[_round] = _newPrice;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function setRootPreSaleWhitelist(SaleRound _round, bytes32 _root) public onlyOwner {
        rootPreSaleWhiteList[_round] = _root;
    }

    function setLimitMintPerTx(uint256 _newLimitAmount) public onlyOwner {
        limitMintPerTx = _newLimitAmount;
    }

    function setSaleRound(SaleRound _round) public onlyOwner {
        saleRound = _round;
    }

    function pause(bool _pause) public onlyOwner {
        paused = _pause;
    }

    function setCashback(bool _cashback) public onlyOwner {
        cashback = _cashback;
    }

    function setMaxCashbackPerToken(uint256 _amount) public onlyOwner {
        maxCashbackPerToken = _amount;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ether");
        _withdraw(owner(), balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = payable(_address).call{value: _amount}("");
        require(success, "Transfer failed");
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @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 {
        _setApprovalForAll(_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(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 to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

        emit Transfer(address(0), 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 5 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

import "./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 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 9 of 14: 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 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 11 of 14: MerkleProof.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 14 of 14: 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_initMaxCashbackPerToken","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokensId","type":"uint256[]"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintUnsoldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"preSaleMintAddressesMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"","type":"uint8"}],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleRound","outputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"","type":"uint8"}],"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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_cashback","type":"bool"}],"name":"setCashback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimitAmount","type":"uint256"}],"name":"setLimitMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxCashbackPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"_round","type":"uint8"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRootPreSaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"_round","type":"uint8"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SharkCatPlanet.SaleRound","name":"_round","type":"uint8"}],"name":"setSaleRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6063600b556014600c5560c06040526005608081905264173539b7b760d91b60a09081526200003291600f9190620002f1565b506010805462ffffff1916620301011790553480156200005157600080fd5b5060405162003ccd38038062003ccd8339810160408190526200007491620003c3565b604080518082018252600f81526e14da185c9ad0d85d08141b185b995d608a1b60208083019182528351808501909452600384526205343560ec1b908401528151919291620000c691600091620002f1565b508051620000dc906001906020840190620002f1565b505050620000f9620000f36200015560201b60201c565b62000159565b6200010482620001ab565b6200010f8162000213565b62000123600066e6ed27d666800062000263565b62000138600167010a741a4627800062000263565b6200014d600267012dfb0cb5e8800062000263565b5050620004e5565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001fa5760405162461bcd60e51b8152602060048201819052602482015260008051602062003cad83398151915260448201526064015b60405180910390fd5b80516200020f90600e906020840190620002f1565b5050565b600a546001600160a01b031633146200025e5760405162461bcd60e51b8152602060048201819052602482015260008051602062003cad8339815191526044820152606401620001f1565b600d55565b600a546001600160a01b03163314620002ae5760405162461bcd60e51b8152602060048201819052602482015260008051602062003cad8339815191526044820152606401620001f1565b8060116000846003811115620002c857620002c862000397565b6003811115620002dc57620002dc62000397565b81526020810191909152604001600020555050565b828054620002ff90620004a8565b90600052602060002090601f0160209004810192826200032357600085556200036e565b82601f106200033e57805160ff19168380011785556200036e565b828001600101855582156200036e579182015b828111156200036e57825182559160200191906001019062000351565b506200037c92915062000380565b5090565b5b808211156200037c576000815560010162000381565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620003d757600080fd5b82516001600160401b0380821115620003ef57600080fd5b818501915085601f8301126200040457600080fd5b815181811115620004195762000419620003ad565b604051601f8201601f19908116603f01168101908382118183101715620004445762000444620003ad565b816040528281526020935088848487010111156200046157600080fd5b600091505b8282101562000485578482018401518183018501529083019062000466565b82821115620004975760008484830101525b969092015195979596505050505050565b600181811c90821680620004bd57607f821691505b60208210811415620004df57634e487b7160e01b600052602260045260246000fd5b50919050565b6137b880620004f56000396000f3fe6080604052600436106102715760003560e01c80636c0360eb11610149578063a0712d68116100c6578063c66828621161008a578063e4e9275a11610064578063e4e9275a14610727578063e985e9c514610754578063f2fde38b1461079d57600080fd5b8063c6682862146106d2578063c87b56dd146106e7578063da3ef23f1461070757600080fd5b8063a0712d6814610649578063a22cb4651461065c578063b733b4b31461067c578063b88d4fde14610692578063bceaa5e5146106b257600080fd5b8063853828b61161010d578063853828b6146105ce5780638a2ad202146105d65780638da5cb5b146105f657806395d89b41146106145780639d95c9301461062957600080fd5b80636c0360eb1461054e57806370a0823114610563578063715018a6146105835780637677382e1461059857806377b116bb146105b857600080fd5b806332cb6b0c116101f2578063515b2d7f116101b65780635c975abb116101905780635c975abb146104f45780635daeab891461050e5780636352211e1461052e57600080fd5b8063515b2d7f1461049457806355f804b3146104b457806359a5e8bc146104d457600080fd5b806332cb6b0c146103fe57806338af39e81461041457806342842e0e146104415780634c220f6e146104615780634f6ccce71461047457600080fd5b806318160ddd1161023957806318160ddd1461034757806323b872dd1461036657806325756e851461038657806328c5e3a4146103a65780632f745c59146103de57600080fd5b806301ffc9a71461027657806302329a29146102ab57806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327575b600080fd5b34801561028257600080fd5b50610296610291366004613058565b6107bd565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b506102cb6102c636600461308a565b6107e8565b005b3480156102d957600080fd5b506102e2610848565b6040516102a291906130fd565b3480156102fb57600080fd5b5061030f61030a366004613110565b6108da565b6040516001600160a01b0390911681526020016102a2565b34801561033357600080fd5b506102cb610342366004613140565b61096f565b34801561035357600080fd5b506008545b6040519081526020016102a2565b34801561037257600080fd5b506102cb61038136600461316a565b610a85565b34801561039257600080fd5b506102cb6103a1366004613110565b610b00565b3480156103b257600080fd5b506103586103c13660046131b5565b601360209081526000928352604080842090915290825290205481565b3480156103ea57600080fd5b506103586103f9366004613140565b610b4d565b34801561040a57600080fd5b5061035861270f81565b34801561042057600080fd5b5061035861042f3660046131e8565b60116020526000908152604090205481565b34801561044d57600080fd5b506102cb61045c36600461316a565b610be3565b6102cb61046f36600461326e565b610bfe565b34801561048057600080fd5b5061035861048f366004613110565b611282565b3480156104a057600080fd5b506102cb6104af366004613110565b611315565b3480156104c057600080fd5b506102cb6104cf366004613368565b611362565b3480156104e057600080fd5b506102cb6104ef3660046131e8565b6113c1565b34801561050057600080fd5b506010546102969060ff1681565b34801561051a57600080fd5b506102cb610529366004613140565b611434565b34801561053a57600080fd5b5061030f610549366004613110565b6115ed565b34801561055a57600080fd5b506102e2611664565b34801561056f57600080fd5b5061035861057e3660046133b1565b6116f2565b34801561058f57600080fd5b506102cb611779565b3480156105a457600080fd5b506102cb6105b336600461308a565b6117cd565b3480156105c457600080fd5b50610358600c5481565b6102cb61182f565b3480156105e257600080fd5b506102cb6105f13660046133cc565b6118ce565b34801561060257600080fd5b50600a546001600160a01b031661030f565b34801561062057600080fd5b506102e2611953565b34801561063557600080fd5b506102cb6106443660046133cc565b611962565b6102cb610657366004613110565b6119c1565b34801561066857600080fd5b506102cb6106773660046133e8565b611ceb565b34801561068857600080fd5b50610358600b5481565b34801561069e57600080fd5b506102cb6106ad366004613412565b611cf6565b3480156106be57600080fd5b506102cb6106cd36600461348e565b611d72565b3480156106de57600080fd5b506102e2612018565b3480156106f357600080fd5b506102e2610702366004613110565b612025565b34801561071357600080fd5b506102cb610722366004613368565b612111565b34801561073357600080fd5b506010546107479062010000900460ff1681565b6040516102a291906134dd565b34801561076057600080fd5b5061029661076f366004613505565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a957600080fd5b506102cb6107b83660046133b1565b61216c565b60006001600160e01b0319821663780e9d6360e01b14806107e257506107e282612222565b92915050565b600a546001600160a01b031633146108355760405162461bcd60e51b8152602060048201819052602482015260008051602061376383398151915260448201526064015b60405180910390fd5b6010805460ff1916911515919091179055565b60606000805461085790613521565b80601f016020809104026020016040519081016040528092919081815260200182805461088390613521565b80156108d05780601f106108a5576101008083540402835291602001916108d0565b820191906000526020600020905b8154815290600101906020018083116108b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082c565b506000908152600460205260409020546001600160a01b031690565b600061097a826115ed565b9050806001600160a01b0316836001600160a01b031614156109e85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082c565b336001600160a01b0382161480610a045750610a04813361076f565b610a765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082c565b610a808383612272565b505050565b610a8f33826122e0565b610af55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161082c565b610a808383836123d7565b600a546001600160a01b03163314610b485760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600c55565b6000610b58836116f2565b8210610bba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161082c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610a8083838360405180602001604052806000815250611cf6565b601054829060ff1615610c425760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc81c185d5cd95960a21b604482015260640161082c565b600360105462010000900460ff166003811115610c6157610c616134c7565b1415610c9e5760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc818db1bdcd95960a21b604482015260640161082c565b600b54610cad9061270f613572565b81610cb760085490565b610cc19190613589565b1115610d0f5760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b600c5481111580610d205750600c54155b610d6c5760405162461bcd60e51b815260206004820152601e60248201527f4d696e7420536861726b43617473207065722074782065786365656465640000604482015260640161082c565b60005a90506000610d7c60085490565b9050600060105462010000900460ff166003811115610d9d57610d9d6134c7565b1480610dc55750600160105462010000900460ff166003811115610dc357610dc36134c7565b145b610e115760405162461bcd60e51b815260206004820152601260248201527f5072652073616c6573206e6f74206f70656e0000000000000000000000000000604482015260640161082c565b600060105462010000900460ff166003811115610e3057610e306134c7565b1415610f5957610e41600085612582565b610e7f5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161082c565b60048560136000601060029054906101000a900460ff166003811115610ea757610ea76134c7565b6003811115610eb857610eb86134c7565b815260208082019290925260409081016000908120338252909252902054610ee09190613589565b1115610f545760405162461bcd60e51b815260206004820152603e60248201527f4d696e7420536861726b4361742070657220616464726573732065786365656460448201527f65642c20636f6d65206261636b20616761696e206e65787420726f756e640000606482015260840161082c565b6110ad565b600160105462010000900460ff166003811115610f7857610f786134c7565b14156110ad57610f89600185612582565b80610f9a5750610f9a600085612582565b610fd85760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161082c565b60028560136000601060029054906101000a900460ff166003811115611000576110006134c7565b6003811115611011576110116134c7565b8152602080820192909252604090810160009081203382529092529020546110399190613589565b11156110ad5760405162461bcd60e51b815260206004820152603e60248201527f4d696e7420536861726b4361742070657220616464726573732065786365656460448201527f65642c20636f6d65206261636b20616761696e206e65787420726f756e640000606482015260840161082c565b8460116000601060029054906101000a900460ff1660038111156110d3576110d36134c7565b60038111156110e4576110e46134c7565b8152602001908152602001600020546110fd91906135a1565b3410156111405760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b604482015260640161082c565b8460136000601060029054906101000a900460ff166003811115611166576111666134c7565b6003811115611177576111776134c7565b81526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111b79190613589565b909155506000905060015b868111611269576000600b5460636111da9190613572565b6111e48386613589565b6111ee9190613572565b90506111fa3382612609565b601054610100900460ff1680156112135750610bb88111155b15611256573a5a6112249087613572565b61122e91906135a1565b925081600d5461123e91906135a1565b8311156112565781600d5461125391906135a1565b92505b5080611261816135c0565b9150506111c2565b50801561127a5761127a3382612623565b505050505050565b600061128d60085490565b82106112f05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161082c565b60088281548110611303576113036135db565b90600052602060002001549050919050565b600a546001600160a01b0316331461135d5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600d55565b600a546001600160a01b031633146113aa5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b80516113bd90600e906020840190612fa9565b5050565b600a546001600160a01b031633146114095760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6010805482919062ff000019166201000083600381111561142c5761142c6134c7565b021790555050565b600a546001600160a01b0316331461147c5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600061148760085490565b60105490915060ff16156114c65760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161082c565b600360105462010000900460ff1660038111156114e5576114e56134c7565b146115325760405162461bcd60e51b815260206004820152601060248201527f53616c6573206e6f7420636c6f73656400000000000000000000000000000000604482015260640161082c565b600b546115419061270f613572565b61154b8383613589565b11156115995760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b60015b8281116115e7576000600b5460636115b49190613572565b6115be8385613589565b6115c89190613572565b90506115d48582612609565b50806115df816135c0565b91505061159c565b50505050565b6000818152600260205260408120546001600160a01b0316806107e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082c565b600e805461167190613521565b80601f016020809104026020016040519081016040528092919081815260200182805461169d90613521565b80156116ea5780601f106116bf576101008083540402835291602001916116ea565b820191906000526020600020905b8154815290600101906020018083116116cd57829003601f168201915b505050505081565b60006001600160a01b03821661175d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117c15760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6117cb60006126c6565b565b600a546001600160a01b031633146118155760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b601080549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146118775760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b47806118b05760405162461bcd60e51b815260206004820152600860248201526727379032ba3432b960c11b604482015260640161082c565b6118cb6118c5600a546001600160a01b031690565b82612623565b50565b600a546001600160a01b031633146119165760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b806012600084600381111561192d5761192d6134c7565b600381111561193e5761193e6134c7565b81526020810191909152604001600020555050565b60606001805461085790613521565b600a546001600160a01b031633146119aa5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b806011600084600381111561192d5761192d6134c7565b601054819060ff1615611a055760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc81c185d5cd95960a21b604482015260640161082c565b600360105462010000900460ff166003811115611a2457611a246134c7565b1415611a615760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc818db1bdcd95960a21b604482015260640161082c565b600b54611a709061270f613572565b81611a7a60085490565b611a849190613589565b1115611ad25760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b600c5481111580611ae35750600c54155b611b2f5760405162461bcd60e51b815260206004820152601e60248201527f4d696e7420536861726b43617473207065722074782065786365656465640000604482015260640161082c565b60005a90506000611b3f60085490565b9050600260105462010000900460ff166003811115611b6057611b606134c7565b14611bad5760405162461bcd60e51b815260206004820152600e60248201527f53616c6573206e6f74206f70656e000000000000000000000000000000000000604482015260640161082c565b600260005260116020527f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62854611be49085906135a1565b341015611c275760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b604482015260640161082c565b600060015b858111611cd3576000600b546063611c449190613572565b611c4e8386613589565b611c589190613572565b9050611c643382612609565b601054610100900460ff168015611c7d5750610bb88111155b15611cc0573a5a611c8e9087613572565b611c9891906135a1565b925081600d54611ca891906135a1565b831115611cc05781600d54611cbd91906135a1565b92505b5080611ccb816135c0565b915050611c2c565b508015611ce457611ce43382612623565b5050505050565b6113bd338383612718565b611d0033836122e0565b611d665760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161082c565b6115e7848484846127e7565b600a546001600160a01b03163314611dba5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6000611dc560085490565b90506000825111611dd557600080fd5b600b5482511115611e285760405162461bcd60e51b815260206004820152601f60248201527f45786365656473207265736572766564206769766561776179206c696d697400604482015260640161082c565b61270f825182611e389190613589565b1115611e865760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b60005b8251811015611fbd576126ad838281518110611ea757611ea76135db565b602002602001015110158015611ed8575061270f838281518110611ecd57611ecd6135db565b602002602001015111155b611f245760405162461bcd60e51b815260206004820152601560248201527f546f6b656e204944206f7574206f662072616e67650000000000000000000000604482015260640161082c565b611f5e838281518110611f3957611f396135db565b60200260200101516000908152600260205260409020546001600160a01b0316151590565b15611fab5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20616c726561647920657869737473000000000000000000000000604482015260640161082c565b80611fb5816135c0565b915050611e89565b508151600b6000828254611fd19190613572565b90915550600090505b82518110156115e75761200684848381518110611ff957611ff96135db565b6020026020010151612609565b80612010816135c0565b915050611fda565b600f805461167190613521565b6000818152600260205260409020546060906001600160a01b03166120b25760405162461bcd60e51b815260206004820152603260248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420536861726b4361740000000000000000000000000000606482015260840161082c565b60006120bc612865565b905060008151116120dc576040518060200160405280600081525061210a565b806120e684612874565b600f6040516020016120fa939291906135f1565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146121595760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b80516113bd90600f906020840190612fa9565b600a546001600160a01b031633146121b45760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6001600160a01b0381166122195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082c565b6118cb816126c6565b60006001600160e01b031982166380ac58cd60e01b148061225357506001600160e01b03198216635b5e139f60e01b145b806107e257506301ffc9a760e01b6001600160e01b03198316146107e2565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122a7826115ed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166123595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082c565b6000612364836115ed565b9050806001600160a01b0316846001600160a01b0316148061239f5750836001600160a01b0316612394846108da565b6001600160a01b0316145b806123cf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166123ea826115ed565b6001600160a01b0316146124525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082c565b6001600160a01b0382166124b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082c565b6124bf83838361298a565b6124ca600082612272565b6001600160a01b03831660009081526003602052604081208054600192906124f3908490613572565b90915550506001600160a01b0382166000908152600360205260408120805460019290612521908490613589565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b16603482015260009081906048016040516020818303038152906040528051906020012090506123cf83601260008760038111156125e3576125e36134c7565b60038111156125f4576125f46134c7565b81526020019081526020016000205483612a42565b6113bd828260405180602001604052806000815250612a58565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612670576040519150601f19603f3d011682016040523d82523d6000602084013e612675565b606091505b5050905080610a805760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161082c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561277a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127f28484846123d7565b6127fe84848484612ad6565b6115e75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b6060600e805461085790613521565b6060816128985750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128c257806128ac816135c0565b91506128bb9050600a836136cb565b915061289c565b60008167ffffffffffffffff8111156128dd576128dd613203565b6040519080825280601f01601f191660200182016040528015612907576020820181803683370190505b5090505b84156123cf5761291c600183613572565b9150612929600a866136df565b612934906030613589565b60f81b818381518110612949576129496135db565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612983600a866136cb565b945061290b565b6001600160a01b0383166129e5576129e081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a08565b816001600160a01b0316836001600160a01b031614612a0857612a088382612c1f565b6001600160a01b038216612a1f57610a8081612cbc565b826001600160a01b0316826001600160a01b031614610a8057610a808282612d6b565b600082612a4f8584612daf565b14949350505050565b612a628383612e5b565b612a6f6000848484612ad6565b610a805760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b60006001600160a01b0384163b15612c1457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b1a9033908990889088906004016136f3565b6020604051808303816000875af1925050508015612b55575060408051601f3d908101601f19168201909252612b529181019061372f565b60015b612bfa573d808015612b83576040519150601f19603f3d011682016040523d82523d6000602084013e612b88565b606091505b508051612bf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123cf565b506001949350505050565b60006001612c2c846116f2565b612c369190613572565b600083815260076020526040902054909150808214612c89576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612cce90600190613572565b60008381526009602052604081205460088054939450909284908110612cf657612cf66135db565b906000526020600020015490508060088381548110612d1757612d176135db565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d4f57612d4f61374c565b6001900381819060005260206000200160009055905550505050565b6000612d76836116f2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b8451811015612e53576000858281518110612dd157612dd16135db565b60200260200101519050808311612e13576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612e40565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612e4b816135c0565b915050612db4565b509392505050565b6001600160a01b038216612eb15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082c565b6000818152600260205260409020546001600160a01b031615612f165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082c565b612f226000838361298a565b6001600160a01b0382166000908152600360205260408120805460019290612f4b908490613589565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612fb590613521565b90600052602060002090601f016020900481019282612fd7576000855561301d565b82601f10612ff057805160ff191683800117855561301d565b8280016001018555821561301d579182015b8281111561301d578251825591602001919060010190613002565b5061302992915061302d565b5090565b5b80821115613029576000815560010161302e565b6001600160e01b0319811681146118cb57600080fd5b60006020828403121561306a57600080fd5b813561210a81613042565b8035801515811461308557600080fd5b919050565b60006020828403121561309c57600080fd5b61210a82613075565b60005b838110156130c05781810151838201526020016130a8565b838111156115e75750506000910152565b600081518084526130e98160208601602086016130a5565b601f01601f19169290920160200192915050565b60208152600061210a60208301846130d1565b60006020828403121561312257600080fd5b5035919050565b80356001600160a01b038116811461308557600080fd5b6000806040838503121561315357600080fd5b61315c83613129565b946020939093013593505050565b60008060006060848603121561317f57600080fd5b61318884613129565b925061319660208501613129565b9150604084013590509250925092565b80356004811061308557600080fd5b600080604083850312156131c857600080fd5b6131d1836131a6565b91506131df60208401613129565b90509250929050565b6000602082840312156131fa57600080fd5b61210a826131a6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561324257613242613203565b604052919050565b600067ffffffffffffffff82111561326457613264613203565b5060051b60200190565b6000806040838503121561328157600080fd5b8235915060208084013567ffffffffffffffff8111156132a057600080fd5b8401601f810186136132b157600080fd5b80356132c46132bf8261324a565b613219565b81815260059190911b820183019083810190888311156132e357600080fd5b928401925b82841015613301578335825292840192908401906132e8565b80955050505050509250929050565b600067ffffffffffffffff83111561332a5761332a613203565b61333d601f8401601f1916602001613219565b905082815283838301111561335157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561337a57600080fd5b813567ffffffffffffffff81111561339157600080fd5b8201601f810184136133a257600080fd5b6123cf84823560208401613310565b6000602082840312156133c357600080fd5b61210a82613129565b600080604083850312156133df57600080fd5b61315c836131a6565b600080604083850312156133fb57600080fd5b61340483613129565b91506131df60208401613075565b6000806000806080858703121561342857600080fd5b61343185613129565b935061343f60208601613129565b925060408501359150606085013567ffffffffffffffff81111561346257600080fd5b8501601f8101871361347357600080fd5b61348287823560208401613310565b91505092959194509250565b600080604083850312156134a157600080fd5b6134aa83613129565b915060208084013567ffffffffffffffff8111156132a057600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600483106134ff57634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561351857600080fd5b6131d183613129565b600181811c9082168061353557607f821691505b6020821081141561355657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156135845761358461355c565b500390565b6000821982111561359c5761359c61355c565b500190565b60008160001904831182151516156135bb576135bb61355c565b500290565b60006000198214156135d4576135d461355c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000845160206136048285838a016130a5565b8551918401916136178184848a016130a5565b8554920191600090600181811c908083168061363457607f831692505b85831081141561365257634e487b7160e01b85526022600452602485fd5b8080156136665760018114613677576136a4565b60ff198516885283880195506136a4565b60008b81526020902060005b8581101561369c5781548a820152908401908801613683565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826136da576136da6136b5565b500490565b6000826136ee576136ee6136b5565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372560808301846130d1565b9695505050505050565b60006020828403121561374157600080fd5b815161210a81613042565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220d8666ea32dd65a5b905ffafcc544d3cfc508eecfd0a2dedd0c2640d8889a741264736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e7476353545375458356a326d776f336b51625971416870696872664a6b4a336b344a797677486a634d787a2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102715760003560e01c80636c0360eb11610149578063a0712d68116100c6578063c66828621161008a578063e4e9275a11610064578063e4e9275a14610727578063e985e9c514610754578063f2fde38b1461079d57600080fd5b8063c6682862146106d2578063c87b56dd146106e7578063da3ef23f1461070757600080fd5b8063a0712d6814610649578063a22cb4651461065c578063b733b4b31461067c578063b88d4fde14610692578063bceaa5e5146106b257600080fd5b8063853828b61161010d578063853828b6146105ce5780638a2ad202146105d65780638da5cb5b146105f657806395d89b41146106145780639d95c9301461062957600080fd5b80636c0360eb1461054e57806370a0823114610563578063715018a6146105835780637677382e1461059857806377b116bb146105b857600080fd5b806332cb6b0c116101f2578063515b2d7f116101b65780635c975abb116101905780635c975abb146104f45780635daeab891461050e5780636352211e1461052e57600080fd5b8063515b2d7f1461049457806355f804b3146104b457806359a5e8bc146104d457600080fd5b806332cb6b0c146103fe57806338af39e81461041457806342842e0e146104415780634c220f6e146104615780634f6ccce71461047457600080fd5b806318160ddd1161023957806318160ddd1461034757806323b872dd1461036657806325756e851461038657806328c5e3a4146103a65780632f745c59146103de57600080fd5b806301ffc9a71461027657806302329a29146102ab57806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327575b600080fd5b34801561028257600080fd5b50610296610291366004613058565b6107bd565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b506102cb6102c636600461308a565b6107e8565b005b3480156102d957600080fd5b506102e2610848565b6040516102a291906130fd565b3480156102fb57600080fd5b5061030f61030a366004613110565b6108da565b6040516001600160a01b0390911681526020016102a2565b34801561033357600080fd5b506102cb610342366004613140565b61096f565b34801561035357600080fd5b506008545b6040519081526020016102a2565b34801561037257600080fd5b506102cb61038136600461316a565b610a85565b34801561039257600080fd5b506102cb6103a1366004613110565b610b00565b3480156103b257600080fd5b506103586103c13660046131b5565b601360209081526000928352604080842090915290825290205481565b3480156103ea57600080fd5b506103586103f9366004613140565b610b4d565b34801561040a57600080fd5b5061035861270f81565b34801561042057600080fd5b5061035861042f3660046131e8565b60116020526000908152604090205481565b34801561044d57600080fd5b506102cb61045c36600461316a565b610be3565b6102cb61046f36600461326e565b610bfe565b34801561048057600080fd5b5061035861048f366004613110565b611282565b3480156104a057600080fd5b506102cb6104af366004613110565b611315565b3480156104c057600080fd5b506102cb6104cf366004613368565b611362565b3480156104e057600080fd5b506102cb6104ef3660046131e8565b6113c1565b34801561050057600080fd5b506010546102969060ff1681565b34801561051a57600080fd5b506102cb610529366004613140565b611434565b34801561053a57600080fd5b5061030f610549366004613110565b6115ed565b34801561055a57600080fd5b506102e2611664565b34801561056f57600080fd5b5061035861057e3660046133b1565b6116f2565b34801561058f57600080fd5b506102cb611779565b3480156105a457600080fd5b506102cb6105b336600461308a565b6117cd565b3480156105c457600080fd5b50610358600c5481565b6102cb61182f565b3480156105e257600080fd5b506102cb6105f13660046133cc565b6118ce565b34801561060257600080fd5b50600a546001600160a01b031661030f565b34801561062057600080fd5b506102e2611953565b34801561063557600080fd5b506102cb6106443660046133cc565b611962565b6102cb610657366004613110565b6119c1565b34801561066857600080fd5b506102cb6106773660046133e8565b611ceb565b34801561068857600080fd5b50610358600b5481565b34801561069e57600080fd5b506102cb6106ad366004613412565b611cf6565b3480156106be57600080fd5b506102cb6106cd36600461348e565b611d72565b3480156106de57600080fd5b506102e2612018565b3480156106f357600080fd5b506102e2610702366004613110565b612025565b34801561071357600080fd5b506102cb610722366004613368565b612111565b34801561073357600080fd5b506010546107479062010000900460ff1681565b6040516102a291906134dd565b34801561076057600080fd5b5061029661076f366004613505565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107a957600080fd5b506102cb6107b83660046133b1565b61216c565b60006001600160e01b0319821663780e9d6360e01b14806107e257506107e282612222565b92915050565b600a546001600160a01b031633146108355760405162461bcd60e51b8152602060048201819052602482015260008051602061376383398151915260448201526064015b60405180910390fd5b6010805460ff1916911515919091179055565b60606000805461085790613521565b80601f016020809104026020016040519081016040528092919081815260200182805461088390613521565b80156108d05780601f106108a5576101008083540402835291602001916108d0565b820191906000526020600020905b8154815290600101906020018083116108b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082c565b506000908152600460205260409020546001600160a01b031690565b600061097a826115ed565b9050806001600160a01b0316836001600160a01b031614156109e85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082c565b336001600160a01b0382161480610a045750610a04813361076f565b610a765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082c565b610a808383612272565b505050565b610a8f33826122e0565b610af55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161082c565b610a808383836123d7565b600a546001600160a01b03163314610b485760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600c55565b6000610b58836116f2565b8210610bba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161082c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610a8083838360405180602001604052806000815250611cf6565b601054829060ff1615610c425760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc81c185d5cd95960a21b604482015260640161082c565b600360105462010000900460ff166003811115610c6157610c616134c7565b1415610c9e5760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc818db1bdcd95960a21b604482015260640161082c565b600b54610cad9061270f613572565b81610cb760085490565b610cc19190613589565b1115610d0f5760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b600c5481111580610d205750600c54155b610d6c5760405162461bcd60e51b815260206004820152601e60248201527f4d696e7420536861726b43617473207065722074782065786365656465640000604482015260640161082c565b60005a90506000610d7c60085490565b9050600060105462010000900460ff166003811115610d9d57610d9d6134c7565b1480610dc55750600160105462010000900460ff166003811115610dc357610dc36134c7565b145b610e115760405162461bcd60e51b815260206004820152601260248201527f5072652073616c6573206e6f74206f70656e0000000000000000000000000000604482015260640161082c565b600060105462010000900460ff166003811115610e3057610e306134c7565b1415610f5957610e41600085612582565b610e7f5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161082c565b60048560136000601060029054906101000a900460ff166003811115610ea757610ea76134c7565b6003811115610eb857610eb86134c7565b815260208082019290925260409081016000908120338252909252902054610ee09190613589565b1115610f545760405162461bcd60e51b815260206004820152603e60248201527f4d696e7420536861726b4361742070657220616464726573732065786365656460448201527f65642c20636f6d65206261636b20616761696e206e65787420726f756e640000606482015260840161082c565b6110ad565b600160105462010000900460ff166003811115610f7857610f786134c7565b14156110ad57610f89600185612582565b80610f9a5750610f9a600085612582565b610fd85760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161082c565b60028560136000601060029054906101000a900460ff166003811115611000576110006134c7565b6003811115611011576110116134c7565b8152602080820192909252604090810160009081203382529092529020546110399190613589565b11156110ad5760405162461bcd60e51b815260206004820152603e60248201527f4d696e7420536861726b4361742070657220616464726573732065786365656460448201527f65642c20636f6d65206261636b20616761696e206e65787420726f756e640000606482015260840161082c565b8460116000601060029054906101000a900460ff1660038111156110d3576110d36134c7565b60038111156110e4576110e46134c7565b8152602001908152602001600020546110fd91906135a1565b3410156111405760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b604482015260640161082c565b8460136000601060029054906101000a900460ff166003811115611166576111666134c7565b6003811115611177576111776134c7565b81526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111b79190613589565b909155506000905060015b868111611269576000600b5460636111da9190613572565b6111e48386613589565b6111ee9190613572565b90506111fa3382612609565b601054610100900460ff1680156112135750610bb88111155b15611256573a5a6112249087613572565b61122e91906135a1565b925081600d5461123e91906135a1565b8311156112565781600d5461125391906135a1565b92505b5080611261816135c0565b9150506111c2565b50801561127a5761127a3382612623565b505050505050565b600061128d60085490565b82106112f05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161082c565b60088281548110611303576113036135db565b90600052602060002001549050919050565b600a546001600160a01b0316331461135d5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600d55565b600a546001600160a01b031633146113aa5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b80516113bd90600e906020840190612fa9565b5050565b600a546001600160a01b031633146114095760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6010805482919062ff000019166201000083600381111561142c5761142c6134c7565b021790555050565b600a546001600160a01b0316331461147c5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b600061148760085490565b60105490915060ff16156114c65760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015260640161082c565b600360105462010000900460ff1660038111156114e5576114e56134c7565b146115325760405162461bcd60e51b815260206004820152601060248201527f53616c6573206e6f7420636c6f73656400000000000000000000000000000000604482015260640161082c565b600b546115419061270f613572565b61154b8383613589565b11156115995760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b60015b8281116115e7576000600b5460636115b49190613572565b6115be8385613589565b6115c89190613572565b90506115d48582612609565b50806115df816135c0565b91505061159c565b50505050565b6000818152600260205260408120546001600160a01b0316806107e25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082c565b600e805461167190613521565b80601f016020809104026020016040519081016040528092919081815260200182805461169d90613521565b80156116ea5780601f106116bf576101008083540402835291602001916116ea565b820191906000526020600020905b8154815290600101906020018083116116cd57829003601f168201915b505050505081565b60006001600160a01b03821661175d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117c15760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6117cb60006126c6565b565b600a546001600160a01b031633146118155760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b601080549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146118775760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b47806118b05760405162461bcd60e51b815260206004820152600860248201526727379032ba3432b960c11b604482015260640161082c565b6118cb6118c5600a546001600160a01b031690565b82612623565b50565b600a546001600160a01b031633146119165760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b806012600084600381111561192d5761192d6134c7565b600381111561193e5761193e6134c7565b81526020810191909152604001600020555050565b60606001805461085790613521565b600a546001600160a01b031633146119aa5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b806011600084600381111561192d5761192d6134c7565b601054819060ff1615611a055760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc81c185d5cd95960a21b604482015260640161082c565b600360105462010000900460ff166003811115611a2457611a246134c7565b1415611a615760405162461bcd60e51b815260206004820152600c60248201526b14d85b195cc818db1bdcd95960a21b604482015260640161082c565b600b54611a709061270f613572565b81611a7a60085490565b611a849190613589565b1115611ad25760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b600c5481111580611ae35750600c54155b611b2f5760405162461bcd60e51b815260206004820152601e60248201527f4d696e7420536861726b43617473207065722074782065786365656465640000604482015260640161082c565b60005a90506000611b3f60085490565b9050600260105462010000900460ff166003811115611b6057611b606134c7565b14611bad5760405162461bcd60e51b815260206004820152600e60248201527f53616c6573206e6f74206f70656e000000000000000000000000000000000000604482015260640161082c565b600260005260116020527f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62854611be49085906135a1565b341015611c275760405162461bcd60e51b815260206004820152601160248201527056616c75652062656c6f7720707269636560781b604482015260640161082c565b600060015b858111611cd3576000600b546063611c449190613572565b611c4e8386613589565b611c589190613572565b9050611c643382612609565b601054610100900460ff168015611c7d5750610bb88111155b15611cc0573a5a611c8e9087613572565b611c9891906135a1565b925081600d54611ca891906135a1565b831115611cc05781600d54611cbd91906135a1565b92505b5080611ccb816135c0565b915050611c2c565b508015611ce457611ce43382612623565b5050505050565b6113bd338383612718565b611d0033836122e0565b611d665760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606482015260840161082c565b6115e7848484846127e7565b600a546001600160a01b03163314611dba5760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6000611dc560085490565b90506000825111611dd557600080fd5b600b5482511115611e285760405162461bcd60e51b815260206004820152601f60248201527f45786365656473207265736572766564206769766561776179206c696d697400604482015260640161082c565b61270f825182611e389190613589565b1115611e865760405162461bcd60e51b815260206004820152601f60248201527f45786365656473206d6178696d756d20536861726b43617473206c696d697400604482015260640161082c565b60005b8251811015611fbd576126ad838281518110611ea757611ea76135db565b602002602001015110158015611ed8575061270f838281518110611ecd57611ecd6135db565b602002602001015111155b611f245760405162461bcd60e51b815260206004820152601560248201527f546f6b656e204944206f7574206f662072616e67650000000000000000000000604482015260640161082c565b611f5e838281518110611f3957611f396135db565b60200260200101516000908152600260205260409020546001600160a01b0316151590565b15611fab5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20616c726561647920657869737473000000000000000000000000604482015260640161082c565b80611fb5816135c0565b915050611e89565b508151600b6000828254611fd19190613572565b90915550600090505b82518110156115e75761200684848381518110611ff957611ff96135db565b6020026020010151612609565b80612010816135c0565b915050611fda565b600f805461167190613521565b6000818152600260205260409020546060906001600160a01b03166120b25760405162461bcd60e51b815260206004820152603260248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420536861726b4361740000000000000000000000000000606482015260840161082c565b60006120bc612865565b905060008151116120dc576040518060200160405280600081525061210a565b806120e684612874565b600f6040516020016120fa939291906135f1565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146121595760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b80516113bd90600f906020840190612fa9565b600a546001600160a01b031633146121b45760405162461bcd60e51b81526020600482018190526024820152600080516020613763833981519152604482015260640161082c565b6001600160a01b0381166122195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082c565b6118cb816126c6565b60006001600160e01b031982166380ac58cd60e01b148061225357506001600160e01b03198216635b5e139f60e01b145b806107e257506301ffc9a760e01b6001600160e01b03198316146107e2565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122a7826115ed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166123595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082c565b6000612364836115ed565b9050806001600160a01b0316846001600160a01b0316148061239f5750836001600160a01b0316612394846108da565b6001600160a01b0316145b806123cf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166123ea826115ed565b6001600160a01b0316146124525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082c565b6001600160a01b0382166124b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082c565b6124bf83838361298a565b6124ca600082612272565b6001600160a01b03831660009081526003602052604081208054600192906124f3908490613572565b90915550506001600160a01b0382166000908152600360205260408120805460019290612521908490613589565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b16603482015260009081906048016040516020818303038152906040528051906020012090506123cf83601260008760038111156125e3576125e36134c7565b60038111156125f4576125f46134c7565b81526020019081526020016000205483612a42565b6113bd828260405180602001604052806000815250612a58565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612670576040519150601f19603f3d011682016040523d82523d6000602084013e612675565b606091505b5050905080610a805760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161082c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561277a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6127f28484846123d7565b6127fe84848484612ad6565b6115e75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b6060600e805461085790613521565b6060816128985750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128c257806128ac816135c0565b91506128bb9050600a836136cb565b915061289c565b60008167ffffffffffffffff8111156128dd576128dd613203565b6040519080825280601f01601f191660200182016040528015612907576020820181803683370190505b5090505b84156123cf5761291c600183613572565b9150612929600a866136df565b612934906030613589565b60f81b818381518110612949576129496135db565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612983600a866136cb565b945061290b565b6001600160a01b0383166129e5576129e081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a08565b816001600160a01b0316836001600160a01b031614612a0857612a088382612c1f565b6001600160a01b038216612a1f57610a8081612cbc565b826001600160a01b0316826001600160a01b031614610a8057610a808282612d6b565b600082612a4f8584612daf565b14949350505050565b612a628383612e5b565b612a6f6000848484612ad6565b610a805760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b60006001600160a01b0384163b15612c1457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b1a9033908990889088906004016136f3565b6020604051808303816000875af1925050508015612b55575060408051601f3d908101601f19168201909252612b529181019061372f565b60015b612bfa573d808015612b83576040519150601f19603f3d011682016040523d82523d6000602084013e612b88565b606091505b508051612bf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161082c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506123cf565b506001949350505050565b60006001612c2c846116f2565b612c369190613572565b600083815260076020526040902054909150808214612c89576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612cce90600190613572565b60008381526009602052604081205460088054939450909284908110612cf657612cf66135db565b906000526020600020015490508060088381548110612d1757612d176135db565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d4f57612d4f61374c565b6001900381819060005260206000200160009055905550505050565b6000612d76836116f2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b8451811015612e53576000858281518110612dd157612dd16135db565b60200260200101519050808311612e13576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612e40565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612e4b816135c0565b915050612db4565b509392505050565b6001600160a01b038216612eb15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082c565b6000818152600260205260409020546001600160a01b031615612f165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082c565b612f226000838361298a565b6001600160a01b0382166000908152600360205260408120805460019290612f4b908490613589565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612fb590613521565b90600052602060002090601f016020900481019282612fd7576000855561301d565b82601f10612ff057805160ff191683800117855561301d565b8280016001018555821561301d579182015b8281111561301d578251825591602001919060010190613002565b5061302992915061302d565b5090565b5b80821115613029576000815560010161302e565b6001600160e01b0319811681146118cb57600080fd5b60006020828403121561306a57600080fd5b813561210a81613042565b8035801515811461308557600080fd5b919050565b60006020828403121561309c57600080fd5b61210a82613075565b60005b838110156130c05781810151838201526020016130a8565b838111156115e75750506000910152565b600081518084526130e98160208601602086016130a5565b601f01601f19169290920160200192915050565b60208152600061210a60208301846130d1565b60006020828403121561312257600080fd5b5035919050565b80356001600160a01b038116811461308557600080fd5b6000806040838503121561315357600080fd5b61315c83613129565b946020939093013593505050565b60008060006060848603121561317f57600080fd5b61318884613129565b925061319660208501613129565b9150604084013590509250925092565b80356004811061308557600080fd5b600080604083850312156131c857600080fd5b6131d1836131a6565b91506131df60208401613129565b90509250929050565b6000602082840312156131fa57600080fd5b61210a826131a6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561324257613242613203565b604052919050565b600067ffffffffffffffff82111561326457613264613203565b5060051b60200190565b6000806040838503121561328157600080fd5b8235915060208084013567ffffffffffffffff8111156132a057600080fd5b8401601f810186136132b157600080fd5b80356132c46132bf8261324a565b613219565b81815260059190911b820183019083810190888311156132e357600080fd5b928401925b82841015613301578335825292840192908401906132e8565b80955050505050509250929050565b600067ffffffffffffffff83111561332a5761332a613203565b61333d601f8401601f1916602001613219565b905082815283838301111561335157600080fd5b828260208301376000602084830101529392505050565b60006020828403121561337a57600080fd5b813567ffffffffffffffff81111561339157600080fd5b8201601f810184136133a257600080fd5b6123cf84823560208401613310565b6000602082840312156133c357600080fd5b61210a82613129565b600080604083850312156133df57600080fd5b61315c836131a6565b600080604083850312156133fb57600080fd5b61340483613129565b91506131df60208401613075565b6000806000806080858703121561342857600080fd5b61343185613129565b935061343f60208601613129565b925060408501359150606085013567ffffffffffffffff81111561346257600080fd5b8501601f8101871361347357600080fd5b61348287823560208401613310565b91505092959194509250565b600080604083850312156134a157600080fd5b6134aa83613129565b915060208084013567ffffffffffffffff8111156132a057600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600483106134ff57634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561351857600080fd5b6131d183613129565b600181811c9082168061353557607f821691505b6020821081141561355657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156135845761358461355c565b500390565b6000821982111561359c5761359c61355c565b500190565b60008160001904831182151516156135bb576135bb61355c565b500290565b60006000198214156135d4576135d461355c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000845160206136048285838a016130a5565b8551918401916136178184848a016130a5565b8554920191600090600181811c908083168061363457607f831692505b85831081141561365257634e487b7160e01b85526022600452602485fd5b8080156136665760018114613677576136a4565b60ff198516885283880195506136a4565b60008b81526020902060005b8581101561369c5781548a820152908401908801613683565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826136da576136da6136b5565b500490565b6000826136ee576136ee6136b5565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261372560808301846130d1565b9695505050505050565b60006020828403121561374157600080fd5b815161210a81613042565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220d8666ea32dd65a5b905ffafcc544d3cfc508eecfd0a2dedd0c2640d8889a741264736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e7476353545375458356a326d776f336b51625971416870696872664a6b4a336b344a797677486a634d787a2f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmNtv55E7TX5j2mwo3kQbYqAhpihrfJkJ3k4JyvwHjcMxz/
Arg [1] : _initMaxCashbackPerToken (uint256): 30000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000000000000000000000000000006a94d74f430000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d4e7476353545375458356a326d776f336b516259714168
Arg [4] : 70696872664a6b4a336b344a797677486a634d787a2f00000000000000000000


Deployed Bytecode Sourcemap

151:7791:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:222:4;;;;;;;;;;-1:-1:-1;909:222:4;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;909:222:4;;;;;;;;7156:77:12;;;;;;;;;;-1:-1:-1;7156:77:12;;;;;:::i;:::-;;:::i;:::-;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;;;;;-1:-1:-1;3860:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2042:55:14;;;2024:74;;2012:2;1997:18;3860:217:3;1878:226:14;3398:401:3;;;;;;;;;;-1:-1:-1;3398:401:3;;;;;:::i;:::-;;:::i;1534:111:4:-;;;;;;;;;;-1:-1:-1;1621:10:4;:17;1534:111;;;2715:25:14;;;2703:2;2688:18;1534:111:4;2569:177:14;4587:330:3;;;;;;;;;;-1:-1:-1;4587:330:3;;;;;:::i;:::-;;:::i;6934:118:12:-;;;;;;;;;;-1:-1:-1;6934:118:12;;;;;:::i;:::-;;:::i;859:88::-;;;;;;;;;;-1:-1:-1;859:88:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1210:253:4;;;;;;;;;;-1:-1:-1;1210:253:4;;;;;:::i;:::-;;:::i;242:41:12:-;;;;;;;;;;;;279:4;242:41;;743:46;;;;;;;;;;-1:-1:-1;743:46:12;;;;;:::i;:::-;;;;;;;;;;;;;;4983:179:3;;;;;;;;;;-1:-1:-1;4983:179:3;;;;;:::i;:::-;;:::i;2038:1789:12:-;;;;;;:::i;:::-;;:::i;1717:230:4:-;;;;;;;;;;-1:-1:-1;1717:230:4;;;;;:::i;:::-;;:::i;7336:112:12:-;;;;;;;;;;-1:-1:-1;7336:112:12;;;;;:::i;:::-;;:::i;6552:102::-;;;;;;;;;;-1:-1:-1;6552:102:12;;;;;:::i;:::-;;:::i;7058:92::-;;;;;;;;;;-1:-1:-1;7058:92:12;;;;;:::i;:::-;;:::i;542:25::-;;;;;;;;;;-1:-1:-1;542:25:12;;;;;;;;4741:503;;;;;;;;;;-1:-1:-1;4741:503:12;;;;;:::i;:::-;;:::i;2052:235:3:-;;;;;;;;;;-1:-1:-1;2052:235:3;;;;;:::i;:::-;;:::i;472:21:12:-;;;;;;;;;;;;;:::i;1790:205:3:-;;;;;;;;;;-1:-1:-1;1790:205:3;;;;;:::i;:::-;;:::i;1607:101:11:-;;;;;;;;;;;;;:::i;7239:91:12:-;;;;;;;;;;-1:-1:-1;7239:91:12;;;;;:::i;:::-;;:::i;391:34::-;;;;;;;;;;;;;;;;7454:183;;;:::i;6792:136::-;;;;;;;;;;-1:-1:-1;6792:136:12;;;;;:::i;:::-;;:::i;975:85:11:-;;;;;;;;;;-1:-1:-1;1047:6:11;;-1:-1:-1;;;;;1047:6:11;975:85;;2511:102:3;;;;;;;;;;;;;:::i;6424:122:12:-;;;;;;;;;;-1:-1:-1;6424:122:12;;;;;:::i;:::-;;:::i;3833:902::-;;;;;;:::i;:::-;;:::i;4144:153:3:-;;;;;;;;;;-1:-1:-1;4144:153:3;;;;;:::i;:::-;;:::i;289:36:12:-;;;;;;;;;;;;;;;;5228:320:3;;;;;;;;;;-1:-1:-1;5228:320:3;;;;;:::i;:::-;;:::i;5250:736:12:-;;;;;;;;;;-1:-1:-1;5250:736:12;;;;;:::i;:::-;;:::i;499:37::-;;;;;;;;;;;;;:::i;5992:426::-;;;;;;;;;;-1:-1:-1;5992:426:12;;;;;:::i;:::-;;:::i;6660:126::-;;;;;;;;;;-1:-1:-1;6660:126:12;;;;;:::i;:::-;;:::i;691:45::-;;;;;;;;;;-1:-1:-1;691:45:12;;;;;;;;;;;;;;;;;;:::i;4363:162:3:-;;;;;;;;;;-1:-1:-1;4363:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4483:25:3;;;4460:4;4483:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4363:162;1857:198:11;;;;;;;;;;-1:-1:-1;1857:198:11;;;;;:::i;:::-;;:::i;909:222:4:-;1011:4;-1:-1:-1;;;;;;1034:50:4;;-1:-1:-1;;;1034:50:4;;:90;;;1088:36;1112:11;1088:23;:36::i;:::-;1027:97;909:222;-1:-1:-1;;909:222:4:o;7156:77:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;;;;;;;;;7211:6:12::1;:15:::0;;-1:-1:-1;;7211:15:12::1;::::0;::::1;;::::0;;;::::1;::::0;;7156:77::o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;7108:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7108:16:3;3955:73;;;;-1:-1:-1;;;3955:73:3;;10513:2:14;3955:73:3;;;10495:21:14;10552:2;10532:18;;;10525:30;10591:34;10571:18;;;10564:62;-1:-1:-1;;;10642:18:14;;;10635:42;10694:19;;3955:73:3;10311:408:14;3955:73:3;-1:-1:-1;4046:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:3;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:3;:2;-1:-1:-1;;;;;3535:11:3;;;3527:57;;;;-1:-1:-1;;;3527:57:3;;10926:2:14;3527:57:3;;;10908:21:14;10965:2;10945:18;;;10938:30;11004:34;10984:18;;;10977:62;-1:-1:-1;;;11055:18:14;;;11048:31;11096:19;;3527:57:3;10724:397:14;3527:57:3;666:10:1;-1:-1:-1;;;;;3616:21:3;;;;:62;;-1:-1:-1;3641:37:3;3658:5;666:10:1;4363:162:3;:::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:3;;11328:2:14;3595:165:3;;;11310:21:14;11367:2;11347:18;;;11340:30;11406:34;11386:18;;;11379:62;11477:26;11457:18;;;11450:54;11521:19;;3595:165:3;11126:420:14;3595:165:3;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;4587:330::-;4776:41;666:10:1;4809:7:3;4776:18;:41::i;:::-;4768:103;;;;-1:-1:-1;;;4768:103:3;;11753:2:14;4768:103:3;;;11735:21:14;11792:2;11772:18;;;11765:30;11831:34;11811:18;;;11804:62;-1:-1:-1;;;11882:18:14;;;11875:47;11939:19;;4768:103:3;11551:413:14;4768:103:3;4882:28;4892:4;4898:2;4902:7;4882:9;:28::i;6934:118:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;7013:14:12::1;:32:::0;6934:118::o;1210:253:4:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:4;;12171:2:14;1326:87:4;;;12153:21:14;12210:2;12190:18;;;12183:30;12249:34;12229:18;;;12222:62;-1:-1:-1;;;12300:18:14;;;12293:41;12351:19;;1326:87:4;11969:407:14;1326:87:4;-1:-1:-1;;;;;;1430:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253::o;4983:179:3:-;5116:39;5133:4;5139:2;5143:7;5116:39;;;;;;;;;;;;:16;:39::i;2038:1789:12:-;1375:6;;2129:11;;1375:6;;1374:7;1366:32;;;;-1:-1:-1;;;1366:32:12;;12583:2:14;1366:32:12;;;12565:21:14;12622:2;12602:18;;;12595:30;-1:-1:-1;;;12641:18:14;;;12634:42;12693:18;;1366:32:12;12381:336:14;1366:32:12;1429:16;1416:9;;;;;;;:29;;;;;;;;:::i;:::-;;;1408:54;;;;-1:-1:-1;;;1408:54:12;;12924:2:14;1408:54:12;;;12906:21:14;12963:2;12943:18;;;12936:30;-1:-1:-1;;;12982:18:14;;;12975:42;13034:18;;1408:54:12;12722:336:14;1408:54:12;1537:16;;1524:29;;279:4;1524:29;:::i;:::-;1509:11;1493:13;1621:10:4;:17;;1534:111;1493:13:12;:27;;;;:::i;:::-;:60;;1472:138;;;;-1:-1:-1;;;1472:138:12;;13660:2:14;1472:138:12;;;13642:21:14;13699:2;13679:18;;;13672:30;13738:33;13718:18;;;13711:61;13789:18;;1472:138:12;13458:355:14;1472:138:12;1656:14;;1641:11;:29;;:52;;;-1:-1:-1;1674:14:12;;:19;1641:52;1620:129;;;;-1:-1:-1;;;1620:129:12;;14020:2:14;1620:129:12;;;14002:21:14;14059:2;14039:18;;;14032:30;14098:32;14078:18;;;14071:60;14148:18;;1620:129:12;13818:354:14;1620:129:12;2152:16:::1;2171:9;2152:28;;2190:14;2207:13;1621:10:4::0;:17;;1534:111;2207:13:12::1;2190:30:::0;-1:-1:-1;2251:12:12::1;2238:9;::::0;;;::::1;;;:25;::::0;::::1;;;;;;:::i;:::-;;:54;;;-1:-1:-1::0;2280:12:12::1;2267:9;::::0;;;::::1;;;:25;::::0;::::1;;;;;;:::i;:::-;;2238:54;2230:85;;;::::0;-1:-1:-1;;;2230:85:12;;14379:2:14;2230:85:12::1;::::0;::::1;14361:21:14::0;14418:2;14398:18;;;14391:30;14457:20;14437:18;;;14430:48;14495:18;;2230:85:12::1;14177:342:14::0;2230:85:12::1;2342:12;2329:9;::::0;;;::::1;;;:25;::::0;::::1;;;;;;:::i;:::-;;2325:745;;;2378:35;2392:12;2406:6;2378:13;:35::i;:::-;2370:63;;;::::0;-1:-1:-1;;;2370:63:12;;14726:2:14;2370:63:12::1;::::0;::::1;14708:21:14::0;14765:2;14745:18;;;14738:30;-1:-1:-1;;;14784:18:14;;;14777:45;14839:18;;2370:63:12::1;14524:339:14::0;2370:63:12::1;2544:1;2529:11;2472:31;:42;2504:9;;;;;;;;;;;2472:42;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;2472:42:12;;;2515:10:::1;2472:54:::0;;;;;;;;:68:::1;::::0;;::::1;:::i;:::-;:73;;2447:194;;;::::0;-1:-1:-1;;;2447:194:12;;15070:2:14;2447:194:12::1;::::0;::::1;15052:21:14::0;15109:2;15089:18;;;15082:30;15148:34;15128:18;;;15121:62;15219:32;15199:18;;;15192:60;15269:19;;2447:194:12::1;14868:426:14::0;2447:194:12::1;2325:745;;;2675:12;2662:9;::::0;;;::::1;;;:25;::::0;::::1;;;;;;:::i;:::-;;2658:412;;;2728:35;2742:12;2756:6;2728:13;:35::i;:::-;:74;;;;2767:35;2781:12;2795:6;2767:13;:35::i;:::-;2703:148;;;::::0;-1:-1:-1;;;2703:148:12;;14726:2:14;2703:148:12::1;::::0;::::1;14708:21:14::0;14765:2;14745:18;;;14738:30;-1:-1:-1;;;14784:18:14;;;14777:45;14839:18;;2703:148:12::1;14524:339:14::0;2703:148:12::1;2962:1;2947:11;2890:31;:42;2922:9;;;;;;;;;;;2890:42;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;2890:42:12;;;2933:10:::1;2890:54:::0;;;;;;;;:68:::1;::::0;;::::1;:::i;:::-;:73;;2865:194;;;::::0;-1:-1:-1;;;2865:194:12;;15070:2:14;2865:194:12::1;::::0;::::1;15052:21:14::0;15109:2;15089:18;;;15082:30;15148:34;15128:18;;;15121:62;15219:32;15199:18;;;15192:60;15269:19;;2865:194:12::1;14868:426:14::0;2865:194:12::1;3123:11;3100:9;:20;3110:9;;;;;;;;;;;3100:20;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;:::i;:::-;3087:9;:47;;3079:77;;;::::0;-1:-1:-1;;;3079:77:12;;15674:2:14;3079:77:12::1;::::0;::::1;15656:21:14::0;15713:2;15693:18;;;15686:30;-1:-1:-1;;;15732:18:14;;;15725:47;15789:18;;3079:77:12::1;15472:341:14::0;3079:77:12::1;3225:11;3167:31;:42;3199:9;;;;;;;;;;;3167:42;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:54;3210:10;-1:-1:-1::0;;;;;3167:54:12::1;-1:-1:-1::0;;;;;3167:54:12::1;;;;;;;;;;;;;:69;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;3246:22:12::1;::::0;-1:-1:-1;3299:1:12::1;3282:443;3307:11;3302:1;:16;3282:443;;3339:15;3376:16;;3371:2;:21;;;;:::i;:::-;3357:10;3366:1:::0;3357:6;:10:::1;:::i;:::-;:36;;;;:::i;:::-;3339:54;;3407:30;3417:10;3429:7;3407:9;:30::i;:::-;3456:8;::::0;::::1;::::0;::::1;;;:27:::0;::::1;;;;3479:4;3468:7;:15;;3456:27;3452:263;;;3545:11;3532:9;3521:20;::::0;:8;:20:::1;:::i;:::-;3520:36;;;;:::i;:::-;3503:53;;3617:1;3595:19;;:23;;;;:::i;:::-;3578:14;:40;3574:127;;;3681:1;3659:19;;:23;;;;:::i;:::-;3642:40;;3574:127;-1:-1:-1::0;3320:3:12;::::1;::::0;::::1;:::i;:::-;;;;3282:443;;;-1:-1:-1::0;3739:18:12;;3735:86:::1;;3773:37;3783:10;3795:14;3773:9;:37::i;:::-;2142:1685;;;2038:1789:::0;;;:::o;1717:230:4:-;1792:7;1827:30;1621:10;:17;;1534:111;1827:30;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:4;;16160:2:14;1811:95:4;;;16142:21:14;16199:2;16179:18;;;16172:30;16238:34;16218:18;;;16211:62;-1:-1:-1;;;16289:18:14;;;16282:42;16341:19;;1811:95:4;15958:408:14;1811:95:4;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;1916:24;;1717:230;;;:::o;7336:112:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;7412:19:12::1;:29:::0;7336:112::o;6552:102::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;6626:21:12;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;6552:102:::0;:::o;7058:92::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;7125:9:12::1;:18:::0;;7137:6;;7125:9;-1:-1:-1;;7125:18:12::1;::::0;7137:6;7125:18:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;7058:92:::0;:::o;4741:503::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;4827:14:12::1;4844:13;1621:10:4::0;:17;;1534:111;4844:13:12::1;4876:6;::::0;4827:30;;-1:-1:-1;4876:6:12::1;;4875:7;4867:26;;;::::0;-1:-1:-1;;;4867:26:12;;16705:2:14;4867:26:12::1;::::0;::::1;16687:21:14::0;16744:1;16724:18;;;16717:29;-1:-1:-1;;;16762:18:14;;;16755:36;16808:18;;4867:26:12::1;16503:329:14::0;4867:26:12::1;4924:16;4911:9;::::0;;;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;4903:58;;;::::0;-1:-1:-1;;;4903:58:12;;17039:2:14;4903:58:12::1;::::0;::::1;17021:21:14::0;17078:2;17058:18;;;17051:30;17117:18;17097;;;17090:46;17153:18;;4903:58:12::1;16837:340:14::0;4903:58:12::1;5016:16;::::0;5003:29:::1;::::0;279:4:::1;5003:29;:::i;:::-;4979:20;4988:11:::0;4979:6;:20:::1;:::i;:::-;:53;;4971:97;;;::::0;-1:-1:-1;;;4971:97:12;;13660:2:14;4971:97:12::1;::::0;::::1;13642:21:14::0;13699:2;13679:18;;;13672:30;13738:33;13718:18;;;13711:61;13789:18;;4971:97:12::1;13458:355:14::0;4971:97:12::1;5096:1;5079:159;5104:11;5099:1;:16;5079:159;;5136:15;5173:16;;5168:2;:21;;;;:::i;:::-;5154:10;5163:1:::0;5154:6;:10:::1;:::i;:::-;:36;;;;:::i;:::-;5136:54;;5204:23;5214:3;5219:7;5204:9;:23::i;:::-;-1:-1:-1::0;5117:3:12;::::1;::::0;::::1;:::i;:::-;;;;5079:159;;;;4817:427;4741:503:::0;;:::o;2052:235:3:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:3;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:3;;17384:2:14;2185:73:3;;;17366:21:14;17423:2;17403:18;;;17396:30;17462:34;17442:18;;;17435:62;-1:-1:-1;;;17513:18:14;;;17506:39;17562:19;;2185:73:3;17182:405:14;472:21:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1790:205:3:-;1862:7;-1:-1:-1;;;;;1889:19:3;;1881:74;;;;-1:-1:-1;;;1881:74:3;;17794:2:14;1881:74:3;;;17776:21:14;17833:2;17813:18;;;17806:30;17872:34;17852:18;;;17845:62;-1:-1:-1;;;17923:18:14;;;17916:40;17973:19;;1881:74:3;17592:406:14;1881:74:3;-1:-1:-1;;;;;;1972:16:3;;;;;:9;:16;;;;;;;1790:205::o;1607:101:11:-;1047:6;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;1671:30:::1;1698:1;1671:18;:30::i;:::-;1607:101::o:0;7239:91:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;7303:8:12::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;7303:20:12;;::::1;::::0;;;::::1;::::0;;7239:91::o;7454:183::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;7530:21:12::1;7569:11:::0;7561:32:::1;;;::::0;-1:-1:-1;;;7561:32:12;;18205:2:14;7561:32:12::1;::::0;::::1;18187:21:14::0;18244:1;18224:18;;;18217:29;-1:-1:-1;;;18262:18:14;;;18255:38;18310:18;;7561:32:12::1;18003:331:14::0;7561:32:12::1;7603:27;7613:7;1047:6:11::0;;-1:-1:-1;;;;;1047:6:11;;975:85;7613:7:12::1;7622;7603:9;:27::i;:::-;7502:135;7454:183::o:0;6792:136::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;6916:5:12::1;6885:20;:28;6906:6;6885:28;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;6885:28:12;:36;-1:-1:-1;;6792:136:12:o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;6424:122:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;6530:9:12::1;6510;:17;6520:6;6510:17;;;;;;;;:::i;3833:902::-:0;1375:6;;3892:11;;1375:6;;1374:7;1366:32;;;;-1:-1:-1;;;1366:32:12;;12583:2:14;1366:32:12;;;12565:21:14;12622:2;12602:18;;;12595:30;-1:-1:-1;;;12641:18:14;;;12634:42;12693:18;;1366:32:12;12381:336:14;1366:32:12;1429:16;1416:9;;;;;;;:29;;;;;;;;:::i;:::-;;;1408:54;;;;-1:-1:-1;;;1408:54:12;;12924:2:14;1408:54:12;;;12906:21:14;12963:2;12943:18;;;12936:30;-1:-1:-1;;;12982:18:14;;;12975:42;13034:18;;1408:54:12;12722:336:14;1408:54:12;1537:16;;1524:29;;279:4;1524:29;:::i;:::-;1509:11;1493:13;1621:10:4;:17;;1534:111;1493:13:12;:27;;;;:::i;:::-;:60;;1472:138;;;;-1:-1:-1;;;1472:138:12;;13660:2:14;1472:138:12;;;13642:21:14;13699:2;13679:18;;;13672:30;13738:33;13718:18;;;13711:61;13789:18;;1472:138:12;13458:355:14;1472:138:12;1656:14;;1641:11;:29;;:52;;;-1:-1:-1;1674:14:12;;:19;1641:52;1620:129;;;;-1:-1:-1;;;1620:129:12;;14020:2:14;1620:129:12;;;14002:21:14;14059:2;14039:18;;;14032:30;14098:32;14078:18;;;14071:60;14148:18;;1620:129:12;13818:354:14;1620:129:12;3915:16:::1;3934:9;3915:28;;3953:14;3970:13;1621:10:4::0;:17;;1534:111;3970:13:12::1;3953:30:::0;-1:-1:-1;4014:16:12::1;4001:9;::::0;;;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;3993:56;;;::::0;-1:-1:-1;;;3993:56:12;;18541:2:14;3993:56:12::1;::::0;::::1;18523:21:14::0;18580:2;18560:18;;;18553:30;18619:16;18599:18;;;18592:44;18653:18;;3993:56:12::1;18339:338:14::0;3993:56:12::1;4090:16;4080:27;::::0;:9:::1;:27;::::0;;;:41:::1;::::0;4110:11;;4080:41:::1;:::i;:::-;4067:9;:54;;4059:84;;;::::0;-1:-1:-1;;;4059:84:12;;15674:2:14;4059:84:12::1;::::0;::::1;15656:21:14::0;15713:2;15693:18;;;15686:30;-1:-1:-1;;;15732:18:14;;;15725:47;15789:18;;4059:84:12::1;15472:341:14::0;4059:84:12::1;4154:22;4207:1;4190:443;4215:11;4210:1;:16;4190:443;;4247:15;4284:16;;4279:2;:21;;;;:::i;:::-;4265:10;4274:1:::0;4265:6;:10:::1;:::i;:::-;:36;;;;:::i;:::-;4247:54;;4315:30;4325:10;4337:7;4315:9;:30::i;:::-;4364:8;::::0;::::1;::::0;::::1;;;:27:::0;::::1;;;;4387:4;4376:7;:15;;4364:27;4360:263;;;4453:11;4440:9;4429:20;::::0;:8;:20:::1;:::i;:::-;4428:36;;;;:::i;:::-;4411:53;;4525:1;4503:19;;:23;;;;:::i;:::-;4486:14;:40;4482:127;;;4589:1;4567:19;;:23;;;;:::i;:::-;4550:40;;4482:127;-1:-1:-1::0;4228:3:12;::::1;::::0;::::1;:::i;:::-;;;;4190:443;;;-1:-1:-1::0;4647:18:12;;4643:86:::1;;4681:37;4691:10;4703:14;4681:9;:37::i;:::-;3905:830;;;3833:902:::0;;:::o;4144:153:3:-;4238:52;666:10:1;4271:8:3;4281;4238:18;:52::i;5228:320::-;5397:41;666:10:1;5430:7:3;5397:18;:41::i;:::-;5389:103;;;;-1:-1:-1;;;5389:103:3;;11753:2:14;5389:103:3;;;11735:21:14;11792:2;11772:18;;;11765:30;11831:34;11811:18;;;11804:62;-1:-1:-1;;;11882:18:14;;;11875:47;11939:19;;5389:103:3;11551:413:14;5389:103:3;5502:39;5516:4;5522:2;5526:7;5535:5;5502:13;:39::i;5250:736:12:-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;5336:14:12::1;5353:13;1621:10:4::0;:17;;1534:111;5353:13:12::1;5336:30;;5403:1;5384:9;:16;:20;5376:29;;;::::0;::::1;;5443:16;;5423:9;:16;:36;;5415:80;;;::::0;-1:-1:-1;;;5415:80:12;;18884:2:14;5415:80:12::1;::::0;::::1;18866:21:14::0;18923:2;18903:18;;;18896:30;18962:33;18942:18;;;18935:61;19013:18;;5415:80:12::1;18682:355:14::0;5415:80:12::1;279:4;5522:9;:16;5513:6;:25;;;;:::i;:::-;:39;;5505:83;;;::::0;-1:-1:-1;;;5505:83:12;;13660:2:14;5505:83:12::1;::::0;::::1;13642:21:14::0;13699:2;13679:18;;;13672:30;13738:33;13718:18;;;13711:61;13789:18;;5505:83:12::1;13458:355:14::0;5505:83:12::1;5604:9;5599:225;5623:9;:16;5619:1;:20;5599:225;;;5684:4;5668:9;5678:1;5668:12;;;;;;;;:::i;:::-;;;;;;;:20;;:50;;;;;279:4;5692:9;5702:1;5692:12;;;;;;;;:::i;:::-;;;;;;;:26;;5668:50;5660:84;;;::::0;-1:-1:-1;;;5660:84:12;;19244:2:14;5660:84:12::1;::::0;::::1;19226:21:14::0;19283:2;19263:18;;;19256:30;19322:23;19302:18;;;19295:51;19363:18;;5660:84:12::1;19042:345:14::0;5660:84:12::1;5767:21;5775:9;5785:1;5775:12;;;;;;;;:::i;:::-;;;;;;;7085:4:3::0;7108:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7108:16:3;:30;;;7020:125;5767:21:12::1;5766:22;5758:55;;;::::0;-1:-1:-1;;;5758:55:12;;19594:2:14;5758:55:12::1;::::0;::::1;19576:21:14::0;19633:2;19613:18;;;19606:30;19672:22;19652:18;;;19645:50;19712:18;;5758:55:12::1;19392:344:14::0;5758:55:12::1;5641:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5599:225;;;;5854:9;:16;5834;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;5885:9:12::1;::::0;-1:-1:-1;5880:100:12::1;5904:9;:16;5900:1;:20;5880:100;;;5941:28;5951:3;5956:9;5966:1;5956:12;;;;;;;;:::i;:::-;;;;;;;5941:9;:28::i;:::-;5922:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5880:100;;499:37:::0;;;;;;;:::i;5992:426::-;7085:4:3;7108:16;;;:7;:16;;;;;;6065:13:12;;-1:-1:-1;;;;;7108:16:3;6090:113:12;;;;-1:-1:-1;;;6090:113:12;;19943:2:14;6090:113:12;;;19925:21:14;19982:2;19962:18;;;19955:30;20021:34;20001:18;;;19994:62;20092:20;20072:18;;;20065:48;20130:19;;6090:113:12;19741:414:14;6090:113:12;6214:28;6245:10;:8;:10::i;:::-;6214:41;;6303:1;6278:14;6272:28;:32;:139;;;;;;;;;;;;;;;;;6343:14;6359:18;:7;:16;:18::i;:::-;6379:13;6326:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6272:139;6265:146;5992:426;-1:-1:-1;;;5992:426:12:o;6660:126::-;1047:6:11;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;6746:33:12;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;1857:198:11:-:0;1047:6;;-1:-1:-1;;;;;1047:6:11;666:10:1;1187:23:11;1179:68;;;;-1:-1:-1;;;1179:68:11;;9767:2:14;1179:68:11;;;9749:21:14;;;9786:18;;;9779:30;-1:-1:-1;;;;;;;;;;;9825:18:14;;;9818:62;9897:18;;1179:68:11;9565:356:14;1179:68:11;-1:-1:-1;;;;;1945:22:11;::::1;1937:73;;;::::0;-1:-1:-1;;;1937:73:11;;22020:2:14;1937:73:11::1;::::0;::::1;22002:21:14::0;22059:2;22039:18;;;22032:30;22098:34;22078:18;;;22071:62;-1:-1:-1;;;22149:18:14;;;22142:36;22195:19;;1937:73:11::1;21818:402:14::0;1937:73:11::1;2020:28;2039:8;2020:18;:28::i;1431:300:3:-:0;1533:4;-1:-1:-1;;;;;;1568:40:3;;-1:-1:-1;;;1568:40:3;;:104;;-1:-1:-1;;;;;;;1624:48:3;;-1:-1:-1;;;1624:48:3;1568:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:2;;;1688:36:3;763:155:2;10871:171:3;10945:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10945:29:3;-1:-1:-1;;;;;10945:29:3;;;;;;;;:24;;10998:23;10945:24;10998:14;:23::i;:::-;-1:-1:-1;;;;;10989:46:3;;;;;;;;;;;10871:171;;:::o;7303:344::-;7396:4;7108:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7108:16:3;7412:73;;;;-1:-1:-1;;;7412:73:3;;22427:2:14;7412:73:3;;;22409:21:14;22466:2;22446:18;;;22439:30;22505:34;22485:18;;;22478:62;-1:-1:-1;;;22556:18:14;;;22549:42;22608:19;;7412:73:3;22225:408:14;7412:73:3;7495:13;7511:23;7526:7;7511:14;:23::i;:::-;7495:39;;7563:5;-1:-1:-1;;;;;7552:16:3;:7;-1:-1:-1;;;;;7552:16:3;;:51;;;;7596:7;-1:-1:-1;;;;;7572:31:3;:20;7584:7;7572:11;:20::i;:::-;-1:-1:-1;;;;;7572:31:3;;7552:51;:87;;;-1:-1:-1;;;;;;4483:25:3;;;4460:4;4483:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7607:32;7544:96;7303:344;-1:-1:-1;;;;7303:344:3:o;10200:560::-;10354:4;-1:-1:-1;;;;;10327:31:3;:23;10342:7;10327:14;:23::i;:::-;-1:-1:-1;;;;;10327:31:3;;10319:85;;;;-1:-1:-1;;;10319:85:3;;22840:2:14;10319:85:3;;;22822:21:14;22879:2;22859:18;;;22852:30;22918:34;22898:18;;;22891:62;-1:-1:-1;;;22969:18:14;;;22962:39;23018:19;;10319:85:3;22638:405:14;10319:85:3;-1:-1:-1;;;;;10422:16:3;;10414:65;;;;-1:-1:-1;;;10414:65:3;;23250:2:14;10414:65:3;;;23232:21:14;23289:2;23269:18;;;23262:30;23328:34;23308:18;;;23301:62;-1:-1:-1;;;23379:18:14;;;23372:34;23423:19;;10414:65:3;23048:400:14;10414:65:3;10490:39;10511:4;10517:2;10521:7;10490:20;:39::i;:::-;10591:29;10608:1;10612:7;10591:8;:29::i;:::-;-1:-1:-1;;;;;10631:15:3;;;;;;:9;:15;;;;;:20;;10650:1;;10631:15;:20;;10650:1;;10631:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10661:13:3;;;;;;:9;:13;;;;;:18;;10678:1;;10661:13;:18;;10678:1;;10661:18;:::i;:::-;;;;-1:-1:-1;;10689:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10689:21:3;-1:-1:-1;;;;;10689:21:3;;;;;;;;;10726:27;;10689:16;;10726:27;;;;;;;10200:560;;;:::o;1773:259:12:-;1902:43;;-1:-1:-1;;1927:4:12;23680:2:14;23676:15;;;23672:24;;1902:43:12;;;23660:37:14;1934:10:12;23731:15:14;;23727:24;23713:12;;;23706:46;1861:4:12;;;;23768:12:14;;1902:43:12;;;;;;;;;;;;1892:54;;;;;;1877:69;;1963:62;1982:6;1990:20;:28;2011:6;1990:28;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2020:4;1963:18;:62::i;7977:108:3:-;8052:26;8062:2;8066:7;8052:26;;;;;;;;;;;;:9;:26::i;7643:185:12:-;7716:12;7742:8;-1:-1:-1;;;;;7734:22:12;7764:7;7734:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7715:61;;;7794:7;7786:35;;;;-1:-1:-1;;;7786:35:12;;24203:2:14;7786:35:12;;;24185:21:14;24242:2;24222:18;;;24215:30;24281:17;24261:18;;;24254:45;24316:18;;7786:35:12;24001:339:14;2209:187:11;2301:6;;;-1:-1:-1;;;;;2317:17:11;;;-1:-1:-1;;;;;;2317:17:11;;;;;;;2349:40;;2301:6;;;2317:17;2301:6;;2349:40;;2282:16;;2349:40;2272:124;2209:187;:::o;11177:307:3:-;11327:8;-1:-1:-1;;;;;11318:17:3;:5;-1:-1:-1;;;;;11318:17:3;;;11310:55;;;;-1:-1:-1;;;11310:55:3;;24547:2:14;11310:55:3;;;24529:21:14;24586:2;24566:18;;;24559:30;24625:27;24605:18;;;24598:55;24670:18;;11310:55:3;24345:349:14;11310:55:3;-1:-1:-1;;;;;11375:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11375:46:3;;;;;;;;;;11436:41;;540::14;;;11436::3;;513:18:14;11436:41:3;;;;;;;11177:307;;;:::o;6410:::-;6561:28;6571:4;6577:2;6581:7;6561:9;:28::i;:::-;6607:48;6630:4;6636:2;6640:7;6649:5;6607:22;:48::i;:::-;6599:111;;;;-1:-1:-1;;;6599:111:3;;24901:2:14;6599:111:3;;;24883:21:14;24940:2;24920:18;;;24913:30;24979:34;24959:18;;;24952:62;-1:-1:-1;;;25030:18:14;;;25023:48;25088:19;;6599:111:3;24699:414:14;7834:106:12;7894:13;7926:7;7919:14;;;;;:::i;275:703:13:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:13;;;;;;;;;;;;-1:-1:-1;;;574:10:13;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:13;;-1:-1:-1;720:2:13;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:13;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:13;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;919:11:13;928:2;919:11;;:::i;:::-;;;791:150;;2543:572:4;-1:-1:-1;;;;;2742:18:4;;2738:183;;2776:40;2808:7;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161;2776:40;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:4;:4;-1:-1:-1;;;;;2837:10:4;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:4;;2930:179;;2966:45;3003:7;2966:36;:45::i;2930:179::-;3038:4;-1:-1:-1;;;;;3032:10:4;:2;-1:-1:-1;;;;;3032:10:4;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;777:184:10:-;898:4;950;921:25;934:5;941:4;921:12;:25::i;:::-;:33;;777:184;-1:-1:-1;;;;777:184:10:o;8306:311:3:-;8431:18;8437:2;8441:7;8431:5;:18::i;:::-;8480:54;8511:1;8515:2;8519:7;8528:5;8480:22;:54::i;:::-;8459:151;;;;-1:-1:-1;;;8459:151:3;;24901:2:14;8459:151:3;;;24883:21:14;24940:2;24920:18;;;24913:30;24979:34;24959:18;;;24952:62;-1:-1:-1;;;25030:18:14;;;25023:48;25088:19;;8459:151:3;24699:414:14;12037:778:3;12187:4;-1:-1:-1;;;;;12207:13:3;;1034:20:0;1080:8;12203:606:3;;12242:72;;-1:-1:-1;;;12242:72:3;;-1:-1:-1;;;;;12242:36:3;;;;;:72;;666:10:1;;12293:4:3;;12299:7;;12308:5;;12242:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12242:72:3;;;;;;;;-1:-1:-1;;12242:72:3;;;;;;;;;;;;:::i;:::-;;;12238:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12481:13:3;;12477:266;;12523:60;;-1:-1:-1;;;12523:60:3;;24901:2:14;12523:60:3;;;24883:21:14;24940:2;24920:18;;;24913:30;24979:34;24959:18;;;24952:62;-1:-1:-1;;;25030:18:14;;;25023:48;25088:19;;12523:60:3;24699:414:14;12477:266:3;12695:6;12689:13;12680:6;12676:2;12672:15;12665:38;12238:519;-1:-1:-1;;;;;;12364:51:3;-1:-1:-1;;;12364:51:3;;-1:-1:-1;12357:58:3;;12203:606;-1:-1:-1;12794:4:3;12037:778;;;;;;:::o;4599:970:4:-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:4;;;5069:323;;-1:-1:-1;;;;;5139:18:4;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:4;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:4;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:4;;6106:46;;6551:26;;;;;;:::i;:::-;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:4:o;1313:688:10:-;1396:7;1438:4;1396:7;1452:514;1476:5;:12;1472:1;:16;1452:514;;;1509:20;1532:5;1538:1;1532:8;;;;;;;;:::i;:::-;;;;;;;1509:31;;1574:12;1558;:28;1554:402;;1709:44;;;;;;26552:19:14;;;26587:12;;;26580:28;;;26624:12;;1709:44:10;;;;;;;;;;;;1699:55;;;;;;1684:70;;1554:402;;;1896:44;;;;;;26552:19:14;;;26587:12;;;26580:28;;;26624:12;;1896:44:10;;;;;;;;;;;;1886:55;;;;;;1871:70;;1554:402;-1:-1:-1;1490:3:10;;;;:::i;:::-;;;;1452:514;;;-1:-1:-1;1982:12:10;1313:688;-1:-1:-1;;;1313:688:10:o;8939:372:3:-;-1:-1:-1;;;;;9018:16:3;;9010:61;;;;-1:-1:-1;;;9010:61:3;;26849:2:14;9010:61:3;;;26831:21:14;;;26868:18;;;26861:30;26927:34;26907:18;;;26900:62;26979:18;;9010:61:3;26647:356:14;9010:61:3;7085:4;7108:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7108:16:3;:30;9081:58;;;;-1:-1:-1;;;9081:58:3;;27210:2:14;9081:58:3;;;27192:21:14;27249:2;27229:18;;;27222:30;27288;27268:18;;;27261:58;27336:18;;9081:58:3;27008:352:14;9081:58:3;9150:45;9179:1;9183:2;9187:7;9150:20;:45::i;:::-;-1:-1:-1;;;;;9206:13:3;;;;;;:9;:13;;;;;:18;;9223:1;;9206:13;:18;;9223:1;;9206:18;:::i;:::-;;;;-1:-1:-1;;9234:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9234:21:3;-1:-1:-1;;;;;9234:21:3;;;;;;;;9271:33;;9234:16;;;9271:33;;9234:16;;9271:33;8939:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;686:60;592:160;;;:::o;757:180::-;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:258::-;1014:1;1024:113;1038:6;1035:1;1032:13;1024:113;;;1114:11;;;1108:18;1095:11;;;1088:39;1060:2;1053:10;1024:113;;;1155:6;1152:1;1149:13;1146:48;;;-1:-1:-1;;1190:1:14;1172:16;;1165:27;942:258::o;1205:::-;1247:3;1285:5;1279:12;1312:6;1307:3;1300:19;1328:63;1384:6;1377:4;1372:3;1368:14;1361:4;1354:5;1350:16;1328:63;:::i;:::-;1445:2;1424:15;-1:-1:-1;;1420:29:14;1411:39;;;;1452:4;1407:50;;1205:258;-1:-1:-1;;1205:258:14:o;1468:220::-;1617:2;1606:9;1599:21;1580:4;1637:45;1678:2;1667:9;1663:18;1655:6;1637:45;:::i;1693:180::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;-1:-1:-1;1844:23:14;;1693:180;-1:-1:-1;1693:180:14:o;2109:196::-;2177:20;;-1:-1:-1;;;;;2226:54:14;;2216:65;;2206:93;;2295:1;2292;2285:12;2310:254;2378:6;2386;2439:2;2427:9;2418:7;2414:23;2410:32;2407:52;;;2455:1;2452;2445:12;2407:52;2478:29;2497:9;2478:29;:::i;:::-;2468:39;2554:2;2539:18;;;;2526:32;;-1:-1:-1;;;2310:254:14:o;2751:328::-;2828:6;2836;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;2936:29;2955:9;2936:29;:::i;:::-;2926:39;;2984:38;3018:2;3007:9;3003:18;2984:38;:::i;:::-;2974:48;;3069:2;3058:9;3054:18;3041:32;3031:42;;2751:328;;;;;:::o;3084:150::-;3159:20;;3208:1;3198:12;;3188:40;;3224:1;3221;3214:12;3239:281;3321:6;3329;3382:2;3370:9;3361:7;3357:23;3353:32;3350:52;;;3398:1;3395;3388:12;3350:52;3421:36;3447:9;3421:36;:::i;:::-;3411:46;;3476:38;3510:2;3499:9;3495:18;3476:38;:::i;:::-;3466:48;;3239:281;;;;;:::o;3525:207::-;3598:6;3651:2;3639:9;3630:7;3626:23;3622:32;3619:52;;;3667:1;3664;3657:12;3619:52;3690:36;3716:9;3690:36;:::i;3737:127::-;3798:10;3793:3;3789:20;3786:1;3779:31;3829:4;3826:1;3819:15;3853:4;3850:1;3843:15;3869:275;3940:2;3934:9;4005:2;3986:13;;-1:-1:-1;;3982:27:14;3970:40;;4040:18;4025:34;;4061:22;;;4022:62;4019:88;;;4087:18;;:::i;:::-;4123:2;4116:22;3869:275;;-1:-1:-1;3869:275:14:o;4149:183::-;4209:4;4242:18;4234:6;4231:30;4228:56;;;4264:18;;:::i;:::-;-1:-1:-1;4309:1:14;4305:14;4321:4;4301:25;;4149:183::o;4337:959::-;4430:6;4438;4491:2;4479:9;4470:7;4466:23;4462:32;4459:52;;;4507:1;4504;4497:12;4459:52;4543:9;4530:23;4520:33;;4572:2;4625;4614:9;4610:18;4597:32;4652:18;4644:6;4641:30;4638:50;;;4684:1;4681;4674:12;4638:50;4707:22;;4760:4;4752:13;;4748:27;-1:-1:-1;4738:55:14;;4789:1;4786;4779:12;4738:55;4825:2;4812:16;4848:60;4864:43;4904:2;4864:43;:::i;:::-;4848:60;:::i;:::-;4942:15;;;5024:1;5020:10;;;;5012:19;;5008:28;;;4973:12;;;;5048:19;;;5045:39;;;5080:1;5077;5070:12;5045:39;5104:11;;;;5124:142;5140:6;5135:3;5132:15;5124:142;;;5206:17;;5194:30;;5157:12;;;;5244;;;;5124:142;;;5285:5;5275:15;;;;;;;4337:959;;;;;:::o;5301:407::-;5366:5;5400:18;5392:6;5389:30;5386:56;;;5422:18;;:::i;:::-;5460:57;5505:2;5484:15;;-1:-1:-1;;5480:29:14;5511:4;5476:40;5460:57;:::i;:::-;5451:66;;5540:6;5533:5;5526:21;5580:3;5571:6;5566:3;5562:16;5559:25;5556:45;;;5597:1;5594;5587:12;5556:45;5646:6;5641:3;5634:4;5627:5;5623:16;5610:43;5700:1;5693:4;5684:6;5677:5;5673:18;5669:29;5662:40;5301:407;;;;;:::o;5713:451::-;5782:6;5835:2;5823:9;5814:7;5810:23;5806:32;5803:52;;;5851:1;5848;5841:12;5803:52;5891:9;5878:23;5924:18;5916:6;5913:30;5910:50;;;5956:1;5953;5946:12;5910:50;5979:22;;6032:4;6024:13;;6020:27;-1:-1:-1;6010:55:14;;6061:1;6058;6051:12;6010:55;6084:74;6150:7;6145:2;6132:16;6127:2;6123;6119:11;6084:74;:::i;6169:186::-;6228:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:52;;;6297:1;6294;6287:12;6249:52;6320:29;6339:9;6320:29;:::i;6360:275::-;6442:6;6450;6503:2;6491:9;6482:7;6478:23;6474:32;6471:52;;;6519:1;6516;6509:12;6471:52;6542:36;6568:9;6542:36;:::i;6920:254::-;6985:6;6993;7046:2;7034:9;7025:7;7021:23;7017:32;7014:52;;;7062:1;7059;7052:12;7014:52;7085:29;7104:9;7085:29;:::i;:::-;7075:39;;7133:35;7164:2;7153:9;7149:18;7133:35;:::i;7179:667::-;7274:6;7282;7290;7298;7351:3;7339:9;7330:7;7326:23;7322:33;7319:53;;;7368:1;7365;7358:12;7319:53;7391:29;7410:9;7391:29;:::i;:::-;7381:39;;7439:38;7473:2;7462:9;7458:18;7439:38;:::i;:::-;7429:48;;7524:2;7513:9;7509:18;7496:32;7486:42;;7579:2;7568:9;7564:18;7551:32;7606:18;7598:6;7595:30;7592:50;;;7638:1;7635;7628:12;7592:50;7661:22;;7714:4;7706:13;;7702:27;-1:-1:-1;7692:55:14;;7743:1;7740;7733:12;7692:55;7766:74;7832:7;7827:2;7814:16;7809:2;7805;7801:11;7766:74;:::i;:::-;7756:84;;;7179:667;;;;;;;:::o;7851:965::-;7944:6;7952;8005:2;7993:9;7984:7;7980:23;7976:32;7973:52;;;8021:1;8018;8011:12;7973:52;8044:29;8063:9;8044:29;:::i;:::-;8034:39;;8092:2;8145;8134:9;8130:18;8117:32;8172:18;8164:6;8161:30;8158:50;;;8204:1;8201;8194:12;8821:127;8882:10;8877:3;8873:20;8870:1;8863:31;8913:4;8910:1;8903:15;8937:4;8934:1;8927:15;8953:342;9099:2;9084:18;;9132:1;9121:13;;9111:144;;9177:10;9172:3;9168:20;9165:1;9158:31;9212:4;9209:1;9202:15;9240:4;9237:1;9230:15;9111:144;9264:25;;;8953:342;:::o;9300:260::-;9368:6;9376;9429:2;9417:9;9408:7;9404:23;9400:32;9397:52;;;9445:1;9442;9435:12;9397:52;9468:29;9487:9;9468:29;:::i;9926:380::-;10005:1;10001:12;;;;10048;;;10069:61;;10123:4;10115:6;10111:17;10101:27;;10069:61;10176:2;10168:6;10165:14;10145:18;10142:38;10139:161;;;10222:10;10217:3;10213:20;10210:1;10203:31;10257:4;10254:1;10247:15;10285:4;10282:1;10275:15;10139:161;;9926:380;;;:::o;13063:127::-;13124:10;13119:3;13115:20;13112:1;13105:31;13155:4;13152:1;13145:15;13179:4;13176:1;13169:15;13195:125;13235:4;13263:1;13260;13257:8;13254:34;;;13268:18;;:::i;:::-;-1:-1:-1;13305:9:14;;13195:125::o;13325:128::-;13365:3;13396:1;13392:6;13389:1;13386:13;13383:39;;;13402:18;;:::i;:::-;-1:-1:-1;13438:9:14;;13325:128::o;15299:168::-;15339:7;15405:1;15401;15397:6;15393:14;15390:1;15387:21;15382:1;15375:9;15368:17;15364:45;15361:71;;;15412:18;;:::i;:::-;-1:-1:-1;15452:9:14;;15299:168::o;15818:135::-;15857:3;-1:-1:-1;;15878:17:14;;15875:43;;;15898:18;;:::i;:::-;-1:-1:-1;15945:1:14;15934:13;;15818:135::o;16371:127::-;16432:10;16427:3;16423:20;16420:1;16413:31;16463:4;16460:1;16453:15;16487:4;16484:1;16477:15;20286:1527;20510:3;20548:6;20542:13;20574:4;20587:51;20631:6;20626:3;20621:2;20613:6;20609:15;20587:51;:::i;:::-;20701:13;;20660:16;;;;20723:55;20701:13;20660:16;20745:15;;;20723:55;:::i;:::-;20867:13;;20800:20;;;20840:1;;20927;20949:18;;;;21002;;;;21029:93;;21107:4;21097:8;21093:19;21081:31;;21029:93;21170:2;21160:8;21157:16;21137:18;21134:40;21131:167;;;-1:-1:-1;;;21197:33:14;;21253:4;21250:1;21243:15;21283:4;21204:3;21271:17;21131:167;21314:18;21341:110;;;;21465:1;21460:328;;;;21307:481;;21341:110;-1:-1:-1;;21376:24:14;;21362:39;;21421:20;;;;-1:-1:-1;21341:110:14;;21460:328;20233:1;20226:14;;;20270:4;20257:18;;21555:1;21569:169;21583:8;21580:1;21577:15;21569:169;;;21665:14;;21650:13;;;21643:37;21708:16;;;;21600:10;;21569:169;;;21573:3;;21769:8;21762:5;21758:20;21751:27;;21307:481;-1:-1:-1;21804:3:14;;20286:1527;-1:-1:-1;;;;;;;;;;;20286:1527:14:o;25118:127::-;25179:10;25174:3;25170:20;25167:1;25160:31;25210:4;25207:1;25200:15;25234:4;25231:1;25224:15;25250:120;25290:1;25316;25306:35;;25321:18;;:::i;:::-;-1:-1:-1;25355:9:14;;25250:120::o;25375:112::-;25407:1;25433;25423:35;;25438:18;;:::i;:::-;-1:-1:-1;25472:9:14;;25375:112::o;25492:512::-;25686:4;-1:-1:-1;;;;;25796:2:14;25788:6;25784:15;25773:9;25766:34;25848:2;25840:6;25836:15;25831:2;25820:9;25816:18;25809:43;;25888:6;25883:2;25872:9;25868:18;25861:34;25931:3;25926:2;25915:9;25911:18;25904:31;25952:46;25993:3;25982:9;25978:19;25970:6;25952:46;:::i;:::-;25944:54;25492:512;-1:-1:-1;;;;;;25492:512:14:o;26009:249::-;26078:6;26131:2;26119:9;26110:7;26106:23;26102:32;26099:52;;;26147:1;26144;26137:12;26099:52;26179:9;26173:16;26198:30;26222:5;26198:30;:::i;26263:127::-;26324:10;26319:3;26315:20;26312:1;26305:31;26355:4;26352:1;26345:15;26379:4;26376:1;26369:15

Swarm Source

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