ETH Price: $2,434.00 (+4.45%)

Token

TheLastSamurai (TLS)
 

Overview

Max Total Supply

53 TLS

Holders

19

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 TLS
0x80c49a9e2f546b4661f6071fbf4206c4b76ffad7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TheLastSamurai

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 29 : lx_tls.sol
// SPDX-License-Identifier: MIT

/* 
 ______  __                  __                        __        ____                                                       
/\__  _\/\ \                /\ \                      /\ \__    /\  _`\                                               __    
\/_/\ \/\ \ \___      __    \ \ \         __      ____\ \ ,_\   \ \,\L\_\     __      ___ ___   __  __  _ __    __   /\_\   
   \ \ \ \ \  _ `\  /'__`\   \ \ \  __  /'__`\   /',__\\ \ \/    \/_\__ \   /'__`\  /' __` __`\/\ \/\ \/\`'__\/'__`\ \/\ \  
    \ \ \ \ \ \ \ \/\  __/    \ \ \L\ \/\ \L\.\_/\__, `\\ \ \_     /\ \L\ \/\ \L\.\_/\ \/\ \/\ \ \ \_\ \ \ \//\ \L\.\_\ \ \ 
     \ \_\ \ \_\ \_\ \____\    \ \____/\ \__/.\_\/\____/ \ \__\    \ `\____\ \__/.\_\ \_\ \_\ \_\ \____/\ \_\\ \__/.\_\\ \_\
      \/_/  \/_/\/_/\/____/     \/___/  \/__/\/_/\/___/   \/__/     \/_____/\/__/\/_/\/_/\/_/\/_/\/___/  \/_/ \/__/\/_/ \/_/                                                                                                                                                                                                                                                    
The Last Samurai is an art project composed of 1500 images of Japanese samurai in dry brush and ink style. 
The creation lasted for one and a half years. The content and emotions of each work is the non-homogeneous. 
Every piece is unique.
*/

pragma solidity ^0.8.17;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';

contract TheLastSamurai is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    bytes32 public saleMerkleRoot;
    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = false;

    constructor(
        uint256 _maxSupply,
        string memory _baseTokenURI,
        bytes32 merkleRoot
    ) ERC721('TheLastSamurai', 'TLS') {
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
        setSaleMerkleRoot(merkleRoot);
        selfMint(10);
    }

    modifier isValidMint(uint256 amount) {
        uint256 balance = balanceOf(_msgSender());
        require(!paused, 'contract is paused');
        require(balance < 5, 'mint more than 5 times');
        require(amount + balance <= 5, 'mint more than 5 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        _;
    }

    function mint(bytes32[] calldata merkleProof, uint256 amount) public payable isValidMint(amount) {
        bool inWhiteList = MerkleProof.verify(merkleProof, saleMerkleRoot, keccak256(abi.encodePacked(_msgSender())));
        uint256 balance = balanceOf(_msgSender());
        if (inWhiteList) {
            if (balance == 0) {
                require((0.0072 ether * (amount - 1)) == msg.value, 'ether value you sent not correct');
            } else {
                require((0.0072 ether * amount) == msg.value, 'ether value you sent not correct');
            }
        } else {
            require((0.0072 ether * amount) == msg.value, 'ether value you sent not correct');
        }
        for (uint256 i = 0; i < amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(_msgSender(), itemId);
        }
    }

    function selfMint(uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < _amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(_msgSender(), itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function setSaleMerkleRoot(bytes32 merkleRoot) public onlyOwner {
        saleMerkleRoot = merkleRoot;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 2 of 29 : lx_diamond_1155.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC1155/ERC1155.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/security/Pausable.sol';
import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol';

contract LZ_DIAMOND_1 is ERC1155, Ownable, Pausable, ERC1155Supply, ERC1155Burnable, ReentrancyGuard {
    struct Special {
        string name;
        uint256 num;
    }

    uint256 public constant DIA = 0;
    uint256 public maxSupply;
    string private _name;
    string private _symbol;
    uint256 private _publicPrice;

    // Mapping for the combination if used
    mapping(string => bool) private _merged;
    mapping(uint256 => bool) private _t_merged;

    // Mapping for the special objects's nums
    mapping(string => uint256) private _special;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxSupply_,
        uint256 publicPrice_,
        Special[] memory special,
        string memory uri_
    ) ERC1155(uri_) {
        _name = name_;
        _symbol = symbol_;
        maxSupply = maxSupply_;
        _publicPrice = publicPrice_;
        initSpecial(special);
    }

    function initSpecial(Special[] memory special) private {
        for (uint256 i = 0; i < special.length; i++) {
            _special[special[i].name] = special[i].num;
        }
    }

    function merge(
        string memory curStr,
        uint256 tnum,
        string[] memory specials
    ) external whenNotPaused {
        require(balanceOf(msg.sender, DIA) > 0, 'balance must bigger than 0');
        require(!_merged[curStr], 'images you choosed was merged');
        require(!_t_merged[tnum], 'your the three gates image was merged');
        for (uint256 i = 0; i < specials.length; i++) {
            require(_special[specials[i]] > 0, 'one of images is out of use');
        }
        _merged[curStr] = true;
        _t_merged[tnum] = true;
        for (uint256 i = 0; i < specials.length; i++) {
            _special[specials[i]] -= 1;
        }
        burn(msg.sender, DIA, 1);
    }

    function getNums(string[] memory specials) external view whenNotPaused returns (Special[] memory) {
        Special[] memory list = new Special[](specials.length);
        for (uint256 i = 0; i < specials.length; i++) {
            list[i] = Special(specials[i], _special[specials[i]]);
        }
        return list;
    }

    function airDrop(address[] memory addrs, uint256 amount) external onlyOwner {
        require(totalSupply(DIA) + addrs.length * amount <= maxSupply, 'exceeded max supply');
        for (uint256 i = 0; i < addrs.length; i++) {
            _mint(addrs[i], DIA, amount, '');
        }
    }

    function mint(address to) external payable whenNotPaused {
        require(balanceOf(to, DIA) < 1, 'address can not mint more than 1 times');
        require(totalSupply(DIA) <= maxSupply, 'exceeded max supply');
        require(msg.value == _publicPrice, 'cost incorrect');
        _mint(to, DIA, 1, '');
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    function setPublicPrice(uint256 price) public onlyOwner {
        _publicPrice = price;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function check(uint256 tnum) public view returns (bool) {
        return _t_merged[tnum];
    }

    function checkMerged(string memory curStr) public view returns (bool) {
        return _merged[curStr];
    }

    function selfMint(
        address account,
        uint256 amount,
        bytes memory data
    ) public onlyOwner {
        _mint(account, DIA, amount, data);
    }

    function selfMintBatch(
        address to,
        uint256 _amounts,
        bytes memory data
    ) public onlyOwner {
        uint256[] memory ids;
        uint256[] memory amounts;
        ids[0] = DIA;
        amounts[0] = _amounts;
        _mintBatch(to, ids, amounts, data);
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) whenNotPaused {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
}

File 3 of 29 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 4 of 29 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 5 of 29 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 6 of 29 : ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 8 of 29 : ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

File 9 of 29 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 10 of 29 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 29 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 12 of 29 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 13 of 29 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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 14 of 29 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 15 of 29 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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 16 of 29 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 17 of 29 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

File 18 of 29 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 19 of 29 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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 20 of 29 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 21 of 29 : nft_is_dead.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';

contract NFTISDEAD is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = true;

    constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('NFT IS DEAD?', 'NFTISDEAD') {
        setPaused(false);
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
    }

    modifier pausedMintCompliance() {
        require(!paused, 'contract is paused');
        _;
    }

    function mint(address to) public pausedMintCompliance {
        require(balanceOf(to) < 1, 'address can not mint more than 1 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        currentTokenId.increment();
        uint256 itemId = currentTokenId.current();
        _safeMint(to, itemId);
    }

    function selfMint(uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < _amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(msg.sender, itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function getAirdropList(uint256 _amount) external view onlyOwner returns (address[] memory) {
        uint256 amount = _amount < totalSupply() ? _amount : totalSupply();
        address[] memory airdropList = new address[](amount);
        for (uint256 i = 0; i < amount; i++) {
            airdropList[i] = ownerOf(i + 1);
        }
        return airdropList;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 22 of 29 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

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 23 of 29 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 24 of 29 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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

    /**
     * @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 25 of 29 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 26 of 29 : lx_prophetgamma2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';

interface Prophetgamma {
    function balanceOf(address) external view returns (uint256);
}

contract PGGameCard is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = false;
    Prophetgamma pg;

    constructor(
        uint256 _maxSupply,
        string memory _baseTokenURI,
        address pgAddress,
        address[] memory addresses
    ) ERC721('PGGameCard', 'PGGameCard') {
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
        pg = Prophetgamma(pgAddress);
        airDrop(addresses);
    }

    modifier pausedMintCompliance() {
        require(!paused, 'contract is paused');
        _;
    }

    function mint(address to) public payable pausedMintCompliance {
        require(balanceOf(to) < 5, 'address can not mint more than 5 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        if (pg.balanceOf(to) > 0 && balanceOf(to) >= 1) {
            require(0.006 ether == msg.value, 'ether value you sent not correct, own Prophetgamma');
        }
        if (pg.balanceOf(to) == 0) {
            require(0.006 ether == msg.value, 'ether value you sent not correct, not own Prophetgamma');
        }
        currentTokenId.increment();
        uint256 itemId = currentTokenId.current();
        _safeMint(to, itemId);
    }

    function airDrop(address[] memory addresses) public onlyOwner {
        require(totalSupply() < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < addresses.length; i++) {
           currentTokenId.increment();
           uint256 itemId = currentTokenId.current();
           _safeMint(addresses[i], itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 27 of 29 : lx_prophetgamma.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';

contract Prophetgamma is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = true;

    constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('Prophetgamma', 'Prophetgamma') {
        setPaused(true);
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
    }

    modifier pausedMintCompliance() {
        require(!paused, 'contract is paused');
        _;
    }

    function mint(address to) public payable pausedMintCompliance {
        require(balanceOf(to) < 1, 'address can not mint more than 1 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        if (totalSupply() > 400) {
            require(0.006 ether == msg.value, 'ether value you sent not correct');
        }
        currentTokenId.increment();
        uint256 itemId = currentTokenId.current();
        _safeMint(to, itemId);
    }

    function selfMint(uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < _amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(msg.sender, itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 28 of 29 : lx_mfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';

contract TheThreeGates is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = true;

    constructor(uint256 _maxSupply, string memory _baseTokenURI) ERC721('TheThreeGates', 'TTG') {
        setPaused(true);
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
    }

    modifier pausedMintCompliance() {
        require(!paused, 'contract is paused');
        _;
    }

    function mint(address to) public payable pausedMintCompliance {
        require(balanceOf(to) < 1, 'address can not mint more than 1 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        if (totalSupply() >= 10) {
            require(0.01 ether == msg.value, 'ether value you sent not correct');
        }
        currentTokenId.increment();
        uint256 itemId = currentTokenId.current();
        _safeMint(to, itemId);
    }

    function selfMint(uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < _amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(msg.sender, itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function getAirdropList(uint256 _amount) external view onlyOwner returns (address[] memory) {
        uint256 amount = _amount < totalSupply() ? _amount : totalSupply();
        address[] memory airdropList = new address[](amount);
        for (uint256 i = 0; i < amount; i++) {
            airdropList[i] = ownerOf(i + 1);
        }
        return airdropList;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 29 of 29 : lx_fuck_cent.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Counters.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';

contract CryptoPowell is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;

    string public baseTokenURI;
    uint256 public maxSupply;
    bool public paused = true;

    constructor(uint256 _maxSupply, uint256 _airdropMount, string memory _baseTokenURI) ERC721('CryptoPowell', 'CryptoPowell') {
        setPaused(false);
        maxSupply = _maxSupply;
        baseTokenURI = _baseTokenURI;
        selfMint(_airdropMount);
    }

    modifier pausedMintCompliance() {
        require(!paused, 'contract is paused');
        _;
    }

    function mint(address to) public pausedMintCompliance {
        require(balanceOf(to) < 1, 'address can not mint more than 1 times');
        require(totalSupply() < maxSupply, 'max supply exceeded');
        currentTokenId.increment();
        uint256 itemId = currentTokenId.current();
        _safeMint(to, itemId);
    }

    function selfMint(uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount < maxSupply, 'max supply exceeded');
        for (uint256 i = 0; i < _amount; i++) {
            currentTokenId.increment();
            uint256 itemId = currentTokenId.current();
            _safeMint(msg.sender, itemId);
        }
    }

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

    function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"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":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setSaleMerkleRoot","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000601060006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162005c0c38038062005c0c833981810160405281019062000052919062001034565b6040518060400160405280600e81526020017f5468654c61737453616d757261690000000000000000000000000000000000008152506040518060400160405280600381526020017f544c5300000000000000000000000000000000000000000000000000000000008152508160009081620000cf9190620012f0565b508060019081620000e19190620012f0565b50505062000104620000f86200015160201b60201c565b6200015960201b60201c565b6001600b8190555082600f8190555081600e9081620001249190620012f0565b5062000136816200021f60201b60201c565b62000148600a6200023960201b60201c565b505050620019c6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022f6200032660201b60201c565b80600d8190555050565b620002496200032660201b60201c565b600f54816200025d620003b760201b60201c565b62000269919062001406565b10620002ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a390620014a2565b60405180910390fd5b60005b818110156200032257620002cf600c620003c460201b6200148d1760201c565b6000620002e8600c620003da60201b620014a31760201c565b90506200030b620002fe6200015160201b60201c565b82620003e860201b60201c565b5080806200031990620014c4565b915050620002af565b5050565b620003366200015160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035c6200040e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ac9062001561565b60405180910390fd5b565b6000600880549050905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b6200040a8282604051806020016040528060008152506200043860201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200044a8383620004a660201b60201c565b6200045f60008484846200069f60201b60201c565b620004a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049890620015f9565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050f906200166b565b60405180910390fd5b62000529816200084860201b60201c565b156200056c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056390620016dd565b60405180910390fd5b6200058060008383620008b460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005d2919062001406565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200069b60008383620008d160201b60201c565b5050565b6000620006cd8473ffffffffffffffffffffffffffffffffffffffff16620008d660201b620014b11760201c565b156200083b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ff6200015160201b60201c565b8786866040518563ffffffff1660e01b8152600401620007239493929190620017b2565b6020604051808303816000875af19250505080156200076257506040513d601f19601f820116820180604052508101906200075f919062001863565b60015b620007ea573d806000811462000795576040519150601f19603f3d011682016040523d82523d6000602084013e6200079a565b606091505b506000815103620007e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d990620015f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000840565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008cc838383620008f960201b620014d41760201c565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6200091183838362000a3e60201b620015e61760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200095d57620009578162000a4360201b60201c565b620009a5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009a457620009a3838262000a8c60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620009f157620009eb8162000c0960201b60201c565b62000a39565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a385762000a37828262000ce560201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000aa68462000d7160201b620010631760201c565b62000ab2919062001895565b905060006007600084815260200190815260200160002054905081811462000b98576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000c1f919062001895565b905060006009600084815260200190815260200160002054905060006008838154811062000c525762000c51620018d0565b5b90600052602060002001549050806008838154811062000c775762000c76620018d0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000cc95762000cc8620018ff565b5b6001900381819060005260206000200160009055905550505050565b600062000cfd8362000d7160201b620010631760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ddb90620019a4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b62000e548162000e3f565b811462000e6057600080fd5b50565b60008151905062000e748162000e49565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000ecf8262000e84565b810181811067ffffffffffffffff8211171562000ef15762000ef062000e95565b5b80604052505050565b600062000f0662000e2b565b905062000f14828262000ec4565b919050565b600067ffffffffffffffff82111562000f375762000f3662000e95565b5b62000f428262000e84565b9050602081019050919050565b60005b8381101562000f6f57808201518184015260208101905062000f52565b60008484015250505050565b600062000f9262000f8c8462000f19565b62000efa565b90508281526020810184848401111562000fb15762000fb062000e7f565b5b62000fbe84828562000f4f565b509392505050565b600082601f83011262000fde5762000fdd62000e7a565b5b815162000ff084826020860162000f7b565b91505092915050565b6000819050919050565b6200100e8162000ff9565b81146200101a57600080fd5b50565b6000815190506200102e8162001003565b92915050565b60008060006060848603121562001050576200104f62000e35565b5b6000620010608682870162000e63565b935050602084015167ffffffffffffffff81111562001084576200108362000e3a565b5b620010928682870162000fc6565b9250506040620010a5868287016200101d565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200110257607f821691505b602082108103620011185762001117620010ba565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620011827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001143565b6200118e868362001143565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620011d1620011cb620011c58462000e3f565b620011a6565b62000e3f565b9050919050565b6000819050919050565b620011ed83620011b0565b62001205620011fc82620011d8565b84845462001150565b825550505050565b600090565b6200121c6200120d565b62001229818484620011e2565b505050565b5b8181101562001251576200124560008262001212565b6001810190506200122f565b5050565b601f821115620012a0576200126a816200111e565b620012758462001133565b8101602085101562001285578190505b6200129d620012948562001133565b8301826200122e565b50505b505050565b600082821c905092915050565b6000620012c560001984600802620012a5565b1980831691505092915050565b6000620012e08383620012b2565b9150826002028217905092915050565b620012fb82620010af565b67ffffffffffffffff81111562001317576200131662000e95565b5b620013238254620010e9565b6200133082828562001255565b600060209050601f83116001811462001368576000841562001353578287015190505b6200135f8582620012d2565b865550620013cf565b601f19841662001378866200111e565b60005b82811015620013a2578489015182556001820191506020850194506020810190506200137b565b86831015620013c25784890151620013be601f891682620012b2565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620014138262000e3f565b9150620014208362000e3f565b92508282019050808211156200143b576200143a620013d7565b5b92915050565b600082825260208201905092915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b60006200148a60138362001441565b9150620014978262001452565b602082019050919050565b60006020820190508181036000830152620014bd816200147b565b9050919050565b6000620014d18262000e3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015065762001505620013d7565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200154960208362001441565b9150620015568262001511565b602082019050919050565b600060208201905081810360008301526200157c816200153a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620015e160328362001441565b9150620015ee8262001583565b604082019050919050565b600060208201905081810360008301526200161481620015d2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200165360208362001441565b915062001660826200161b565b602082019050919050565b60006020820190508181036000830152620016868162001644565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000620016c5601c8362001441565b9150620016d2826200168d565b602082019050919050565b60006020820190508181036000830152620016f881620016b6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200172c82620016ff565b9050919050565b6200173e816200171f565b82525050565b6200174f8162000e3f565b82525050565b600081519050919050565b600082825260208201905092915050565b60006200177e8262001755565b6200178a818562001760565b93506200179c81856020860162000f4f565b620017a78162000e84565b840191505092915050565b6000608082019050620017c9600083018762001733565b620017d8602083018662001733565b620017e7604083018562001744565b8181036060830152620017fb818462001771565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200183d8162001806565b81146200184957600080fd5b50565b6000815190506200185d8162001832565b92915050565b6000602082840312156200187c576200187b62000e35565b5b60006200188c848285016200184c565b91505092915050565b6000620018a28262000e3f565b9150620018af8362000e3f565b9250828203905081811115620018ca57620018c9620013d7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006200198c60298362001441565b915062001999826200192e565b604082019050919050565b60006020820190508181036000830152620019bf816200197d565b9050919050565b61423680620019d66000396000f3fe6080604052600436106101c25760003560e01c80635c975abb116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610631578063e985e9c51461065c578063f2fde38b14610699578063f91eb630146106c2576101c2565b8063b88d4fde14610575578063c87b56dd1461059e578063d4a417e6146105db578063d547cfb714610606576101c2565b8063715018a6116100d1578063715018a6146104df5780638da5cb5b146104f657806395d89b4114610521578063a22cb4651461054c576101c2565b80635c975abb1461043a5780636352211e1461046557806370a08231146104a2576101c2565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a157806342842e0e146103b857806345de0d9b146103e15780634f6ccce7146103fd576101c2565b806323b872dd146103125780632f745c591461033b57806330176e1314610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630d3c69b41461029557806316c38b3c146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612931565b6106eb565b6040516101fb9190612979565b60405180910390f35b34801561021057600080fd5b506102196106fd565b6040516102269190612a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a7c565b61078f565b6040516102639190612aea565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b31565b6107d5565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612a7c565b6108ec565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612b9d565b610996565b005b3480156102f357600080fd5b506102fc6109bb565b6040516103099190612bd9565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612bf4565b6109c8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612b31565b610a28565b60405161036f9190612bd9565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612d7c565b610acd565b005b3480156103ad57600080fd5b506103b6610ae8565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612bf4565b610bc5565b005b6103fb60048036038101906103f69190612e25565b610be5565b005b34801561040957600080fd5b50610424600480360381019061041f9190612a7c565b610f2e565b6040516104319190612bd9565b60405180910390f35b34801561044657600080fd5b5061044f610f9f565b60405161045c9190612979565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612a7c565b610fb2565b6040516104999190612aea565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612e85565b611063565b6040516104d69190612bd9565b60405180910390f35b3480156104eb57600080fd5b506104f461111a565b005b34801561050257600080fd5b5061050b61112e565b6040516105189190612aea565b60405180910390f35b34801561052d57600080fd5b50610536611158565b6040516105439190612a24565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612eb2565b6111ea565b005b34801561058157600080fd5b5061059c60048036038101906105979190612f93565b611200565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190612a7c565b611262565b6040516105d29190612a24565b60405180910390f35b3480156105e757600080fd5b506105f06112ca565b6040516105fd919061302f565b60405180910390f35b34801561061257600080fd5b5061061b6112d0565b6040516106289190612a24565b60405180910390f35b34801561063d57600080fd5b5061064661135e565b6040516106539190612bd9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061304a565b611364565b6040516106909190612979565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612e85565b6113f8565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906130b6565b61147b565b005b60006106f6826115eb565b9050919050565b60606000805461070c90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461073890613112565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611665565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e082610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906131b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086f6116b0565b73ffffffffffffffffffffffffffffffffffffffff16148061089e575061089d816108986116b0565b611364565b5b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490613247565b60405180910390fd5b6108e783836116b8565b505050565b6108f4611771565b600f54816109006109bb565b61090a9190613296565b1061094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613316565b60405180910390fd5b60005b818110156109925761095f600c61148d565b600061096b600c6114a3565b905061097e6109786116b0565b826117ef565b50808061098a90613336565b91505061094d565b5050565b61099e611771565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6109d96109d36116b0565b8261180d565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906133f0565b60405180910390fd5b610a238383836118a2565b505050565b6000610a3383611063565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613482565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad5611771565b80600e9081610ae4919061364e565b5050565b610af0611771565b6002600b5403610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061376c565b60405180910390fd5b6002600b819055506000610b4761112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a906137bd565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b506001600b81905550565b610be083838360405180602001604052806000815250611200565b505050565b806000610bf8610bf36116b0565b611063565b9050601060009054906101000a900460ff1615610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c419061381e565b60405180910390fd5b60058110610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c849061388a565b60405180910390fd5b60058183610c9b9190613296565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061388a565b60405180910390fd5b600f54610ce76109bb565b10610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613316565b60405180910390fd5b6000610da4868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54610d796116b0565b604051602001610d8991906138f2565b60405160208183030381529060405280519060200120611b08565b90506000610db8610db36116b0565b611063565b90508115610e875760008103610e2d5734600186610dd6919061390d565b6619945ca2620000610de89190613941565b14610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906139cf565b60405180910390fd5b610e82565b34856619945ca2620000610e419190613941565b14610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906139cf565b60405180910390fd5b5b610edc565b34856619945ca2620000610e9b9190613941565b14610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906139cf565b60405180910390fd5b5b60005b85811015610f2457610ef1600c61148d565b6000610efd600c6114a3565b9050610f10610f0a6116b0565b826117ef565b508080610f1c90613336565b915050610edf565b5050505050505050565b6000610f386109bb565b8210610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613a61565b60405180910390fd5b60088281548110610f8d57610f8c613a81565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613afc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613b8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611122611771565b61112c6000611b1f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116790613112565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613112565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6111fc6111f56116b0565b8383611be5565b5050565b61121161120b6116b0565b8361180d565b611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906133f0565b60405180910390fd5b61125c84848484611d51565b50505050565b606061126d82611665565b6000611277611dad565b9050600081511161129757604051806020016040528060008152506112c2565b806112a184611e3f565b6040516020016112b2929190613c36565b6040516020818303038152906040525b915050919050565b600d5481565b600e80546112dd90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461130990613112565b80156113565780601f1061132b57610100808354040283529160200191611356565b820191906000526020600020905b81548152906001019060200180831161133957829003601f168201915b505050505081565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611400611771565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613cd7565b60405180910390fd5b61147881611b1f565b50565b611483611771565b80600d8190555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6114df8383836115e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115215761151c81611f9f565b611560565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461155f5761155e8382611fe8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a25761159d81612155565b6115e1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115e0576115df8282612226565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165e575061165d826122a5565b5b9050919050565b61166e81612387565b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613afc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661172b83610fb2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117796116b0565b73ffffffffffffffffffffffffffffffffffffffff1661179761112e565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613d43565b60405180910390fd5b565b6118098282604051806020016040528060008152506123f3565b5050565b60008061181983610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185b575061185a8185611364565b5b8061189957508373ffffffffffffffffffffffffffffffffffffffff166118818461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c282610fb2565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613e67565b60405180910390fd5b61199283838361244e565b61199d6000826116b8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ed919061390d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a449190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0383838361245e565b505050565b600082611b158584612463565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90613ed3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d449190612979565b60405180910390a3505050565b611d5c8484846118a2565b611d68848484846124b9565b611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613f65565b60405180910390fd5b50505050565b6060600e8054611dbc90613112565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890613112565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b5050505050905090565b606060008203611e86576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f9a565b600082905060005b60008214611eb8578080611ea190613336565b915050600a82611eb19190613fb4565b9150611e8e565b60008167ffffffffffffffff811115611ed457611ed3612c51565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b5090505b60008514611f9357600182611f1f919061390d565b9150600a85611f2e9190613fe5565b6030611f3a9190613296565b60f81b818381518110611f5057611f4f613a81565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f8c9190613fb4565b9450611f0a565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ff584611063565b611fff919061390d565b90506000600760008481526020019081526020016000205490508181146120e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612169919061390d565b905060006009600084815260200190815260200160002054905060006008838154811061219957612198613a81565b5b9060005260206000200154905080600883815481106121bb576121ba613a81565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061220a57612209614016565b5b6001900381819060005260206000200160009055905550505050565b600061223183611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612380575061237f82612640565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123fd83836126aa565b61240a60008484846124b9565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613f65565b60405180910390fd5b505050565b6124598383836114d4565b505050565b505050565b60008082905060005b84518110156124ae576124998286838151811061248c5761248b613a81565b5b6020026020010151612883565b915080806124a690613336565b91505061246c565b508091505092915050565b60006124da8473ffffffffffffffffffffffffffffffffffffffff166114b1565b15612633578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125036116b0565b8786866040518563ffffffff1660e01b8152600401612525949392919061409a565b6020604051808303816000875af192505050801561256157506040513d601f19601f8201168201806040525081019061255e91906140fb565b60015b6125e3573d8060008114612591576040519150601f19603f3d011682016040523d82523d6000602084013e612596565b606091505b5060008151036125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290613f65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612638565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614174565b60405180910390fd5b61272281612387565b15612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906141e0565b60405180910390fd5b61276e6000838361244e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127be9190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f6000838361245e565b5050565b600081831061289b5761289682846128ae565b6128a6565b6128a583836128ae565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b612b7a8161295e565b8114612b8557600080fd5b50565b600081359050612b9781612b71565b92915050565b600060208284031215612bb357612bb26128cf565b5b6000612bc184828501612b88565b91505092915050565b612bd381612a46565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b600080600060608486031215612c0d57612c0c6128cf565b5b6000612c1b86828701612b1c565b9350506020612c2c86828701612b1c565b9250506040612c3d86828701612a67565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c89826129da565b810181811067ffffffffffffffff82111715612ca857612ca7612c51565b5b80604052505050565b6000612cbb6128c5565b9050612cc78282612c80565b919050565b600067ffffffffffffffff821115612ce757612ce6612c51565b5b612cf0826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d1f612d1a84612ccc565b612cb1565b905082815260208101848484011115612d3b57612d3a612c4c565b5b612d46848285612cfd565b509392505050565b600082601f830112612d6357612d62612c47565b5b8135612d73848260208601612d0c565b91505092915050565b600060208284031215612d9257612d916128cf565b5b600082013567ffffffffffffffff811115612db057612daf6128d4565b5b612dbc84828501612d4e565b91505092915050565b600080fd5b600080fd5b60008083601f840112612de557612de4612c47565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836020820283011115612e1e57612e1d612dca565b5b9250929050565b600080600060408486031215612e3e57612e3d6128cf565b5b600084013567ffffffffffffffff811115612e5c57612e5b6128d4565b5b612e6886828701612dcf565b93509350506020612e7b86828701612a67565b9150509250925092565b600060208284031215612e9b57612e9a6128cf565b5b6000612ea984828501612b1c565b91505092915050565b60008060408385031215612ec957612ec86128cf565b5b6000612ed785828601612b1c565b9250506020612ee885828601612b88565b9150509250929050565b600067ffffffffffffffff821115612f0d57612f0c612c51565b5b612f16826129da565b9050602081019050919050565b6000612f36612f3184612ef2565b612cb1565b905082815260208101848484011115612f5257612f51612c4c565b5b612f5d848285612cfd565b509392505050565b600082601f830112612f7a57612f79612c47565b5b8135612f8a848260208601612f23565b91505092915050565b60008060008060808587031215612fad57612fac6128cf565b5b6000612fbb87828801612b1c565b9450506020612fcc87828801612b1c565b9350506040612fdd87828801612a67565b925050606085013567ffffffffffffffff811115612ffe57612ffd6128d4565b5b61300a87828801612f65565b91505092959194509250565b6000819050919050565b61302981613016565b82525050565b60006020820190506130446000830184613020565b92915050565b60008060408385031215613061576130606128cf565b5b600061306f85828601612b1c565b925050602061308085828601612b1c565b9150509250929050565b61309381613016565b811461309e57600080fd5b50565b6000813590506130b08161308a565b92915050565b6000602082840312156130cc576130cb6128cf565b5b60006130da848285016130a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312a57607f821691505b60208210810361313d5761313c6130e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061319f60218361299f565b91506131aa82613143565b604082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613231603e8361299f565b915061323c826131d5565b604082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a182612a46565b91506132ac83612a46565b92508282019050808211156132c4576132c3613267565b5b92915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061330060138361299f565b915061330b826132ca565b602082019050919050565b6000602082019050818103600083015261332f816132f3565b9050919050565b600061334182612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337357613372613267565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133da602e8361299f565b91506133e58261337e565b604082019050919050565b60006020820190508181036000830152613409816133cd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061346c602b8361299f565b915061347782613410565b604082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c7565b61350e86836134c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061354b61354661354184612a46565b613526565b612a46565b9050919050565b6000819050919050565b61356583613530565b61357961357182613552565b8484546134d4565b825550505050565b600090565b61358e613581565b61359981848461355c565b505050565b5b818110156135bd576135b2600082613586565b60018101905061359f565b5050565b601f821115613602576135d3816134a2565b6135dc846134b7565b810160208510156135eb578190505b6135ff6135f7856134b7565b83018261359e565b50505b505050565b600082821c905092915050565b600061362560001984600802613607565b1980831691505092915050565b600061363e8383613614565b9150826002028217905092915050565b61365782612994565b67ffffffffffffffff8111156136705761366f612c51565b5b61367a8254613112565b6136858282856135c1565b600060209050601f8311600181146136b857600084156136a6578287015190505b6136b08582613632565b865550613718565b601f1984166136c6866134a2565b60005b828110156136ee578489015182556001820191506020850194506020810190506136c9565b8683101561370b5784890151613707601f891682613614565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613756601f8361299f565b915061376182613720565b602082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b600081905092915050565b50565b60006137a760008361378c565b91506137b282613797565b600082019050919050565b60006137c88261379a565b9150819050919050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b600061380860128361299f565b9150613813826137d2565b602082019050919050565b60006020820190508181036000830152613837816137fb565b9050919050565b7f6d696e74206d6f7265207468616e20352074696d657300000000000000000000600082015250565b600061387460168361299f565b915061387f8261383e565b602082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b60008160601b9050919050565b60006138c2826138aa565b9050919050565b60006138d4826138b7565b9050919050565b6138ec6138e782612ac9565b6138c9565b82525050565b60006138fe82846138db565b60148201915081905092915050565b600061391882612a46565b915061392383612a46565b925082820390508181111561393b5761393a613267565b5b92915050565b600061394c82612a46565b915061395783612a46565b925082820261396581612a46565b9150828204841483151761397c5761397b613267565b5b5092915050565b7f65746865722076616c756520796f752073656e74206e6f7420636f7272656374600082015250565b60006139b960208361299f565b91506139c482613983565b602082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4b602c8361299f565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae660188361299f565b9150613af182613ab0565b602082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b7860298361299f565b9150613b8382613b1c565b604082019050919050565b60006020820190508181036000830152613ba781613b6b565b9050919050565b600081905092915050565b6000613bc482612994565b613bce8185613bae565b9350613bde8185602086016129b0565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613c20600583613bae565b9150613c2b82613bea565b600582019050919050565b6000613c428285613bb9565b9150613c4e8284613bb9565b9150613c5982613c13565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cc160268361299f565b9150613ccc82613c65565b604082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d2d60208361299f565b9150613d3882613cf7565b602082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dbf60258361299f565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5160248361299f565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ebd60198361299f565b9150613ec882613e87565b602082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f4f60328361299f565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fbf82612a46565b9150613fca83612a46565b925082613fda57613fd9613f85565b5b828204905092915050565b6000613ff082612a46565b9150613ffb83612a46565b92508261400b5761400a613f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061406c82614045565b6140768185614050565b93506140868185602086016129b0565b61408f816129da565b840191505092915050565b60006080820190506140af6000830187612adb565b6140bc6020830186612adb565b6140c96040830185612bca565b81810360608301526140db8184614061565b905095945050505050565b6000815190506140f581612905565b92915050565b600060208284031215614111576141106128cf565b5b600061411f848285016140e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061415e60208361299f565b915061416982614128565b602082019050919050565b6000602082019050818103600083015261418d81614151565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141ca601c8361299f565b91506141d582614194565b602082019050919050565b600060208201905081810360008301526141f9816141bd565b905091905056fea2646970667358221220ad1abcdbae674c00de5c3081c0ad9840113a6e40b727357f01fe84047fc8b7df64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000605f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d0000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696776656334627367706d70786d73736a79376c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a757364342f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80635c975abb116100f7578063b88d4fde11610095578063d5abeb0111610064578063d5abeb0114610631578063e985e9c51461065c578063f2fde38b14610699578063f91eb630146106c2576101c2565b8063b88d4fde14610575578063c87b56dd1461059e578063d4a417e6146105db578063d547cfb714610606576101c2565b8063715018a6116100d1578063715018a6146104df5780638da5cb5b146104f657806395d89b4114610521578063a22cb4651461054c576101c2565b80635c975abb1461043a5780636352211e1461046557806370a08231146104a2576101c2565b806323b872dd116101645780633ccfd60b1161013e5780633ccfd60b146103a157806342842e0e146103b857806345de0d9b146103e15780634f6ccce7146103fd576101c2565b806323b872dd146103125780632f745c591461033b57806330176e1314610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630d3c69b41461029557806316c38b3c146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612931565b6106eb565b6040516101fb9190612979565b60405180910390f35b34801561021057600080fd5b506102196106fd565b6040516102269190612a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612a7c565b61078f565b6040516102639190612aea565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612b31565b6107d5565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612a7c565b6108ec565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612b9d565b610996565b005b3480156102f357600080fd5b506102fc6109bb565b6040516103099190612bd9565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612bf4565b6109c8565b005b34801561034757600080fd5b50610362600480360381019061035d9190612b31565b610a28565b60405161036f9190612bd9565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612d7c565b610acd565b005b3480156103ad57600080fd5b506103b6610ae8565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612bf4565b610bc5565b005b6103fb60048036038101906103f69190612e25565b610be5565b005b34801561040957600080fd5b50610424600480360381019061041f9190612a7c565b610f2e565b6040516104319190612bd9565b60405180910390f35b34801561044657600080fd5b5061044f610f9f565b60405161045c9190612979565b60405180910390f35b34801561047157600080fd5b5061048c60048036038101906104879190612a7c565b610fb2565b6040516104999190612aea565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612e85565b611063565b6040516104d69190612bd9565b60405180910390f35b3480156104eb57600080fd5b506104f461111a565b005b34801561050257600080fd5b5061050b61112e565b6040516105189190612aea565b60405180910390f35b34801561052d57600080fd5b50610536611158565b6040516105439190612a24565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612eb2565b6111ea565b005b34801561058157600080fd5b5061059c60048036038101906105979190612f93565b611200565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190612a7c565b611262565b6040516105d29190612a24565b60405180910390f35b3480156105e757600080fd5b506105f06112ca565b6040516105fd919061302f565b60405180910390f35b34801561061257600080fd5b5061061b6112d0565b6040516106289190612a24565b60405180910390f35b34801561063d57600080fd5b5061064661135e565b6040516106539190612bd9565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e919061304a565b611364565b6040516106909190612979565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190612e85565b6113f8565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906130b6565b61147b565b005b60006106f6826115eb565b9050919050565b60606000805461070c90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461073890613112565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a82611665565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e082610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906131b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086f6116b0565b73ffffffffffffffffffffffffffffffffffffffff16148061089e575061089d816108986116b0565b611364565b5b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490613247565b60405180910390fd5b6108e783836116b8565b505050565b6108f4611771565b600f54816109006109bb565b61090a9190613296565b1061094a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094190613316565b60405180910390fd5b60005b818110156109925761095f600c61148d565b600061096b600c6114a3565b905061097e6109786116b0565b826117ef565b50808061098a90613336565b91505061094d565b5050565b61099e611771565b80601060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6109d96109d36116b0565b8261180d565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f906133f0565b60405180910390fd5b610a238383836118a2565b505050565b6000610a3383611063565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613482565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ad5611771565b80600e9081610ae4919061364e565b5050565b610af0611771565b6002600b5403610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061376c565b60405180910390fd5b6002600b819055506000610b4761112e565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a906137bd565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b506001600b81905550565b610be083838360405180602001604052806000815250611200565b505050565b806000610bf8610bf36116b0565b611063565b9050601060009054906101000a900460ff1615610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c419061381e565b60405180910390fd5b60058110610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c849061388a565b60405180910390fd5b60058183610c9b9190613296565b1115610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061388a565b60405180910390fd5b600f54610ce76109bb565b10610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613316565b60405180910390fd5b6000610da4868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54610d796116b0565b604051602001610d8991906138f2565b60405160208183030381529060405280519060200120611b08565b90506000610db8610db36116b0565b611063565b90508115610e875760008103610e2d5734600186610dd6919061390d565b6619945ca2620000610de89190613941565b14610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f906139cf565b60405180910390fd5b610e82565b34856619945ca2620000610e419190613941565b14610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906139cf565b60405180910390fd5b5b610edc565b34856619945ca2620000610e9b9190613941565b14610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906139cf565b60405180910390fd5b5b60005b85811015610f2457610ef1600c61148d565b6000610efd600c6114a3565b9050610f10610f0a6116b0565b826117ef565b508080610f1c90613336565b915050610edf565b5050505050505050565b6000610f386109bb565b8210610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090613a61565b60405180910390fd5b60088281548110610f8d57610f8c613a81565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613afc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90613b8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611122611771565b61112c6000611b1f565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116790613112565b80601f016020809104026020016040519081016040528092919081815260200182805461119390613112565b80156111e05780601f106111b5576101008083540402835291602001916111e0565b820191906000526020600020905b8154815290600101906020018083116111c357829003601f168201915b5050505050905090565b6111fc6111f56116b0565b8383611be5565b5050565b61121161120b6116b0565b8361180d565b611250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611247906133f0565b60405180910390fd5b61125c84848484611d51565b50505050565b606061126d82611665565b6000611277611dad565b9050600081511161129757604051806020016040528060008152506112c2565b806112a184611e3f565b6040516020016112b2929190613c36565b6040516020818303038152906040525b915050919050565b600d5481565b600e80546112dd90613112565b80601f016020809104026020016040519081016040528092919081815260200182805461130990613112565b80156113565780601f1061132b57610100808354040283529160200191611356565b820191906000526020600020905b81548152906001019060200180831161133957829003601f168201915b505050505081565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611400611771565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613cd7565b60405180910390fd5b61147881611b1f565b50565b611483611771565b80600d8190555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6114df8383836115e6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115215761151c81611f9f565b611560565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461155f5761155e8382611fe8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a25761159d81612155565b6115e1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115e0576115df8282612226565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061165e575061165d826122a5565b5b9050919050565b61166e81612387565b6116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a490613afc565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661172b83610fb2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117796116b0565b73ffffffffffffffffffffffffffffffffffffffff1661179761112e565b73ffffffffffffffffffffffffffffffffffffffff16146117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490613d43565b60405180910390fd5b565b6118098282604051806020016040528060008152506123f3565b5050565b60008061181983610fb2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185b575061185a8185611364565b5b8061189957508373ffffffffffffffffffffffffffffffffffffffff166118818461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c282610fb2565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613dd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613e67565b60405180910390fd5b61199283838361244e565b61199d6000826116b8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ed919061390d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a449190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b0383838361245e565b505050565b600082611b158584612463565b1490509392505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a90613ed3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d449190612979565b60405180910390a3505050565b611d5c8484846118a2565b611d68848484846124b9565b611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613f65565b60405180910390fd5b50505050565b6060600e8054611dbc90613112565b80601f0160208091040260200160405190810160405280929190818152602001828054611de890613112565b8015611e355780601f10611e0a57610100808354040283529160200191611e35565b820191906000526020600020905b815481529060010190602001808311611e1857829003601f168201915b5050505050905090565b606060008203611e86576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f9a565b600082905060005b60008214611eb8578080611ea190613336565b915050600a82611eb19190613fb4565b9150611e8e565b60008167ffffffffffffffff811115611ed457611ed3612c51565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b5090505b60008514611f9357600182611f1f919061390d565b9150600a85611f2e9190613fe5565b6030611f3a9190613296565b60f81b818381518110611f5057611f4f613a81565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f8c9190613fb4565b9450611f0a565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ff584611063565b611fff919061390d565b90506000600760008481526020019081526020016000205490508181146120e4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612169919061390d565b905060006009600084815260200190815260200160002054905060006008838154811061219957612198613a81565b5b9060005260206000200154905080600883815481106121bb576121ba613a81565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061220a57612209614016565b5b6001900381819060005260206000200160009055905550505050565b600061223183611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061237057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612380575061237f82612640565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123fd83836126aa565b61240a60008484846124b9565b612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244090613f65565b60405180910390fd5b505050565b6124598383836114d4565b505050565b505050565b60008082905060005b84518110156124ae576124998286838151811061248c5761248b613a81565b5b6020026020010151612883565b915080806124a690613336565b91505061246c565b508091505092915050565b60006124da8473ffffffffffffffffffffffffffffffffffffffff166114b1565b15612633578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125036116b0565b8786866040518563ffffffff1660e01b8152600401612525949392919061409a565b6020604051808303816000875af192505050801561256157506040513d601f19601f8201168201806040525081019061255e91906140fb565b60015b6125e3573d8060008114612591576040519150601f19603f3d011682016040523d82523d6000602084013e612596565b606091505b5060008151036125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290613f65565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612638565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614174565b60405180910390fd5b61272281612387565b15612762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612759906141e0565b60405180910390fd5b61276e6000838361244e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127be9190613296565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287f6000838361245e565b5050565b600081831061289b5761289682846128ae565b6128a6565b6128a583836128ae565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61290e816128d9565b811461291957600080fd5b50565b60008135905061292b81612905565b92915050565b600060208284031215612947576129466128cf565b5b60006129558482850161291c565b91505092915050565b60008115159050919050565b6129738161295e565b82525050565b600060208201905061298e600083018461296a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ce5780820151818401526020810190506129b3565b60008484015250505050565b6000601f19601f8301169050919050565b60006129f682612994565b612a00818561299f565b9350612a108185602086016129b0565b612a19816129da565b840191505092915050565b60006020820190508181036000830152612a3e81846129eb565b905092915050565b6000819050919050565b612a5981612a46565b8114612a6457600080fd5b50565b600081359050612a7681612a50565b92915050565b600060208284031215612a9257612a916128cf565b5b6000612aa084828501612a67565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ad482612aa9565b9050919050565b612ae481612ac9565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b612b0e81612ac9565b8114612b1957600080fd5b50565b600081359050612b2b81612b05565b92915050565b60008060408385031215612b4857612b476128cf565b5b6000612b5685828601612b1c565b9250506020612b6785828601612a67565b9150509250929050565b612b7a8161295e565b8114612b8557600080fd5b50565b600081359050612b9781612b71565b92915050565b600060208284031215612bb357612bb26128cf565b5b6000612bc184828501612b88565b91505092915050565b612bd381612a46565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b600080600060608486031215612c0d57612c0c6128cf565b5b6000612c1b86828701612b1c565b9350506020612c2c86828701612b1c565b9250506040612c3d86828701612a67565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c89826129da565b810181811067ffffffffffffffff82111715612ca857612ca7612c51565b5b80604052505050565b6000612cbb6128c5565b9050612cc78282612c80565b919050565b600067ffffffffffffffff821115612ce757612ce6612c51565b5b612cf0826129da565b9050602081019050919050565b82818337600083830152505050565b6000612d1f612d1a84612ccc565b612cb1565b905082815260208101848484011115612d3b57612d3a612c4c565b5b612d46848285612cfd565b509392505050565b600082601f830112612d6357612d62612c47565b5b8135612d73848260208601612d0c565b91505092915050565b600060208284031215612d9257612d916128cf565b5b600082013567ffffffffffffffff811115612db057612daf6128d4565b5b612dbc84828501612d4e565b91505092915050565b600080fd5b600080fd5b60008083601f840112612de557612de4612c47565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836020820283011115612e1e57612e1d612dca565b5b9250929050565b600080600060408486031215612e3e57612e3d6128cf565b5b600084013567ffffffffffffffff811115612e5c57612e5b6128d4565b5b612e6886828701612dcf565b93509350506020612e7b86828701612a67565b9150509250925092565b600060208284031215612e9b57612e9a6128cf565b5b6000612ea984828501612b1c565b91505092915050565b60008060408385031215612ec957612ec86128cf565b5b6000612ed785828601612b1c565b9250506020612ee885828601612b88565b9150509250929050565b600067ffffffffffffffff821115612f0d57612f0c612c51565b5b612f16826129da565b9050602081019050919050565b6000612f36612f3184612ef2565b612cb1565b905082815260208101848484011115612f5257612f51612c4c565b5b612f5d848285612cfd565b509392505050565b600082601f830112612f7a57612f79612c47565b5b8135612f8a848260208601612f23565b91505092915050565b60008060008060808587031215612fad57612fac6128cf565b5b6000612fbb87828801612b1c565b9450506020612fcc87828801612b1c565b9350506040612fdd87828801612a67565b925050606085013567ffffffffffffffff811115612ffe57612ffd6128d4565b5b61300a87828801612f65565b91505092959194509250565b6000819050919050565b61302981613016565b82525050565b60006020820190506130446000830184613020565b92915050565b60008060408385031215613061576130606128cf565b5b600061306f85828601612b1c565b925050602061308085828601612b1c565b9150509250929050565b61309381613016565b811461309e57600080fd5b50565b6000813590506130b08161308a565b92915050565b6000602082840312156130cc576130cb6128cf565b5b60006130da848285016130a1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061312a57607f821691505b60208210810361313d5761313c6130e3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061319f60218361299f565b91506131aa82613143565b604082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613231603e8361299f565b915061323c826131d5565b604082019050919050565b6000602082019050818103600083015261326081613224565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a182612a46565b91506132ac83612a46565b92508282019050808211156132c4576132c3613267565b5b92915050565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061330060138361299f565b915061330b826132ca565b602082019050919050565b6000602082019050818103600083015261332f816132f3565b9050919050565b600061334182612a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361337357613372613267565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133da602e8361299f565b91506133e58261337e565b604082019050919050565b60006020820190508181036000830152613409816133cd565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061346c602b8361299f565b915061347782613410565b604082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826134c7565b61350e86836134c7565b95508019841693508086168417925050509392505050565b6000819050919050565b600061354b61354661354184612a46565b613526565b612a46565b9050919050565b6000819050919050565b61356583613530565b61357961357182613552565b8484546134d4565b825550505050565b600090565b61358e613581565b61359981848461355c565b505050565b5b818110156135bd576135b2600082613586565b60018101905061359f565b5050565b601f821115613602576135d3816134a2565b6135dc846134b7565b810160208510156135eb578190505b6135ff6135f7856134b7565b83018261359e565b50505b505050565b600082821c905092915050565b600061362560001984600802613607565b1980831691505092915050565b600061363e8383613614565b9150826002028217905092915050565b61365782612994565b67ffffffffffffffff8111156136705761366f612c51565b5b61367a8254613112565b6136858282856135c1565b600060209050601f8311600181146136b857600084156136a6578287015190505b6136b08582613632565b865550613718565b601f1984166136c6866134a2565b60005b828110156136ee578489015182556001820191506020850194506020810190506136c9565b8683101561370b5784890151613707601f891682613614565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613756601f8361299f565b915061376182613720565b602082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b600081905092915050565b50565b60006137a760008361378c565b91506137b282613797565b600082019050919050565b60006137c88261379a565b9150819050919050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b600061380860128361299f565b9150613813826137d2565b602082019050919050565b60006020820190508181036000830152613837816137fb565b9050919050565b7f6d696e74206d6f7265207468616e20352074696d657300000000000000000000600082015250565b600061387460168361299f565b915061387f8261383e565b602082019050919050565b600060208201905081810360008301526138a381613867565b9050919050565b60008160601b9050919050565b60006138c2826138aa565b9050919050565b60006138d4826138b7565b9050919050565b6138ec6138e782612ac9565b6138c9565b82525050565b60006138fe82846138db565b60148201915081905092915050565b600061391882612a46565b915061392383612a46565b925082820390508181111561393b5761393a613267565b5b92915050565b600061394c82612a46565b915061395783612a46565b925082820261396581612a46565b9150828204841483151761397c5761397b613267565b5b5092915050565b7f65746865722076616c756520796f752073656e74206e6f7420636f7272656374600082015250565b60006139b960208361299f565b91506139c482613983565b602082019050919050565b600060208201905081810360008301526139e8816139ac565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4b602c8361299f565b9150613a56826139ef565b604082019050919050565b60006020820190508181036000830152613a7a81613a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae660188361299f565b9150613af182613ab0565b602082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b7860298361299f565b9150613b8382613b1c565b604082019050919050565b60006020820190508181036000830152613ba781613b6b565b9050919050565b600081905092915050565b6000613bc482612994565b613bce8185613bae565b9350613bde8185602086016129b0565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613c20600583613bae565b9150613c2b82613bea565b600582019050919050565b6000613c428285613bb9565b9150613c4e8284613bb9565b9150613c5982613c13565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cc160268361299f565b9150613ccc82613c65565b604082019050919050565b60006020820190508181036000830152613cf081613cb4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d2d60208361299f565b9150613d3882613cf7565b602082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613dbf60258361299f565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613e5160248361299f565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ebd60198361299f565b9150613ec882613e87565b602082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f4f60328361299f565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fbf82612a46565b9150613fca83612a46565b925082613fda57613fd9613f85565b5b828204905092915050565b6000613ff082612a46565b9150613ffb83612a46565b92508261400b5761400a613f85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061406c82614045565b6140768185614050565b93506140868185602086016129b0565b61408f816129da565b840191505092915050565b60006080820190506140af6000830187612adb565b6140bc6020830186612adb565b6140c96040830185612bca565b81810360608301526140db8184614061565b905095945050505050565b6000815190506140f581612905565b92915050565b600060208284031215614111576141106128cf565b5b600061411f848285016140e6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061415e60208361299f565b915061416982614128565b602082019050919050565b6000602082019050818103600083015261418d81614151565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141ca601c8361299f565b91506141d582614194565b602082019050919050565b600060208201905081810360008301526141f9816141bd565b905091905056fea2646970667358221220ad1abcdbae674c00de5c3081c0ad9840113a6e40b727357f01fe84047fc8b7df64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000605f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d0000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696776656334627367706d70786d73736a79376c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a757364342f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _maxSupply (uint256): 1500
Arg [1] : _baseTokenURI (string): ipfs://bafybeigvec4bsgpmpxmssjy7lummakktkfwq33jp5towwglnzcfcjzusd4/
Arg [2] : merkleRoot (bytes32): 0x5f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 5f5169bf56eede430e2e98a0ee5dc952366e670f025e7bf2cd026e5d84d8455d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 697066733a2f2f626166796265696776656334627367706d70786d73736a7937
Arg [5] : 6c756d6d616b6b746b66777133336a7035746f7777676c6e7a6366636a7a7573
Arg [6] : 64342f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

1803:3463:27:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5095:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2470:98:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3637:334:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4514:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4612:327:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1291:253:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4392:116:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4717:157;;;;;;;;;;;;;:::i;:::-;;5005:179:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2740:891:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1798:230:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2071:26:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2190:218:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;1201:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2632:102:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4169:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5250:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4094:292:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1974:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2009:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2041:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4388:162:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4603:108:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5095:169;5198:4;5221:36;5245:11;5221:23;:36::i;:::-;5214:43;;5095:169;;;:::o;2470:98:9:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;4071:15;:24;4087:7;4071:24;;;;;;;;;;;;;;;;;;;;;4064:31;;3935:167;;;:::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;3637:334:27:-;1094:13:0;:11;:13::i;:::-;3733:9:27::1;;3723:7;3707:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:35;3699:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:9;3776:189;3800:7;3796:1;:11;3776:189;;;3828:26;:14;:24;:26::i;:::-;3868:14;3885:24;:14;:22;:24::i;:::-;3868:41;;3923:31;3933:12;:10;:12::i;:::-;3947:6;3923:9;:31::i;:::-;3814:151;3809:3;;;;;:::i;:::-;;;;3776:189;;;;3637:334:::0;:::o;4514:83::-;1094:13:0;:11;:13::i;:::-;4583:7:27::1;4574:6;;:16;;;;;;;;;;;;;;;;;;4514:83:::0;:::o;1615:111:12:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;4612:327:9:-;4801:41;4820:12;:10;:12::i;:::-;4834:7;4801:18;:41::i;:::-;4793:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;:::-;4612:327;;;:::o;1291:253:12:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;4392:116:27:-;1094:13:0;:11;:13::i;:::-;4488::27::1;4473:12;:28;;;;;;:::i;:::-;;4392:116:::0;:::o;4717:157::-;1094:13:0;:11;:13::i;:::-;1744:1:2::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;4778:7:27::2;4799;:5;:7::i;:::-;4791:21;;4820;4791:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4777:69;;;4864:2;4856:11;;;::::0;::::2;;4767:107;1701:1:2::1;2628:7;:22;;;;4717:157:27:o:0;5005:179:9:-;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;:::-;5005:179;;;:::o;2740:891:27:-;2829:6;2438:15;2456:23;2466:12;:10;:12::i;:::-;2456:9;:23::i;:::-;2438:41;;2498:6;;;;;;;;;;;2497:7;2489:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2555:1;2545:7;:11;2537:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2621:1;2610:7;2601:6;:16;;;;:::i;:::-;:21;;2593:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:9;;2667:13;:11;:13::i;:::-;:25;2659:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2847:16:::1;2866:90;2885:11;;2866:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2898:14;;2941:12;:10;:12::i;:::-;2924:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2914:41;;;;;;2866:18;:90::i;:::-;2847:109;;2966:15;2984:23;2994:12;:10;:12::i;:::-;2984:9;:23::i;:::-;2966:41;;3021:11;3017:411;;;3063:1;3052:7;:12:::0;3048:258:::1;;3125:9;3118:1;3109:6;:10;;;;:::i;:::-;3093:12;:27;;;;:::i;:::-;3092:42;3084:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3048:258;;;3245:9;3234:6;3219:12;:21;;;;:::i;:::-;3218:36;3210:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3048:258;3017:411;;;3371:9;3360:6;3345:12;:21;;;;:::i;:::-;3344:36;3336:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3017:411;3442:9;3437:188;3461:6;3457:1;:10;3437:188;;;3488:26;:14;:24;:26::i;:::-;3528:14;3545:24;:14;:22;:24::i;:::-;3528:41;;3583:31;3593:12;:10;:12::i;:::-;3607:6;3583:9;:31::i;:::-;3474:151;3469:3;;;;;:::i;:::-;;;;3437:188;;;;2837:794;;2428:306:::0;2740:891;;;;:::o;1798:230:12:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;;1997:24;;1798:230;;;:::o;2071:26:27:-;;;;;;;;;;;;;:::o;2190:218:9:-;2262:7;2281:13;2297:7;:16;2305:7;2297:16;;;;;;;;;;;;;;;;;;;;;2281:32;;2348:1;2331:19;;:5;:19;;;2323:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2396:5;2389:12;;;2190:218;;;:::o;1929:204::-;2001:7;2045:1;2028:19;;:5;:19;;;2020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2110:9;:16;2120:5;2110:16;;;;;;;;;;;;;;;;2103:23;;1929:204;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2632:102:9:-;2688:13;2720:7;2713:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2632:102;:::o;4169:153::-;4263:52;4282:12;:10;:12::i;:::-;4296:8;4306;4263:18;:52::i;:::-;4169:153;;:::o;5250:315::-;5418:41;5437:12;:10;:12::i;:::-;5451:7;5418:18;:41::i;:::-;5410:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;:::-;5250:315;;;;:::o;4094:292:27:-;4167:13;4192:23;4207:7;4192:14;:23::i;:::-;4226:21;4250:10;:8;:10::i;:::-;4226:34;;4301:1;4283:7;4277:21;:25;:102;;;;;;;;;;;;;;;;;4329:7;4338:25;4355:7;4338:16;:25::i;:::-;4312:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4277:102;4270:109;;;4094:292;;;:::o;1974:29::-;;;;:::o;2009:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2041:24::-;;;;:::o;4388:162:9:-;4485:4;4508:18;:25;4527:5;4508:25;;;;;;;;;;;;;;;:35;4534:8;4508:35;;;;;;;;;;;;;;;;;;;;;;;;;4501:42;;4388:162;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;4603:108:27:-;1094:13:0;:11;:13::i;:::-;4694:10:27::1;4677:14;:27;;;;4603:108:::0;:::o;945:123:17:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;827:112::-;892:7;918;:14;;;911:21;;827:112;;;:::o;1175:320:15:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2624:572:12:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;13729:122:9:-;;;;:::o;990:222:12:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;11657:133:9:-;11738:16;11746:7;11738;:16::i;:::-;11730:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11657:133;:::o;640:96:16:-;693:7;719:10;712:17;;640:96;:::o;10959:171:9:-;11060:2;11033:15;:24;11049:7;11033:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11115:7;11111:2;11077:46;;11086:23;11101:7;11086:14;:23::i;:::-;11077:46;;;;;;;;;;;;10959:171;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;7908:108:9:-;7983:26;7993:2;7997:7;7983:26;;;;;;;;;;;;:9;:26::i;:::-;7908:108;;:::o;7317:261::-;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;7483:16;;:7;:16;;;:52;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7483:52;:87;;;;7563:7;7539:31;;:20;7551:7;7539:11;:20::i;:::-;:31;;;7483:87;7475:96;;;7317:261;;;;:::o;10242:605::-;10396:4;10369:31;;:23;10384:7;10369:14;:23::i;:::-;:31;;;10361:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10474:1;10460:16;;:2;:16;;;10452:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;10688:1;10669:9;:15;10679:4;10669:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10716:1;10699:9;:13;10709:2;10699:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10746:2;10727:7;:16;10735:7;10727:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10783:7;10779:2;10764:27;;10773:4;10764:27;;;;;;;;;;;;10802:38;10822:4;10828:2;10832:7;10802:19;:38::i;:::-;10242:605;;;:::o;1153:184:19:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;11266:307:9:-;11416:8;11407:17;;:5;:17;;;11399:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11502:8;11464:18;:25;11483:5;11464:25;;;;;;;;;;;;;;;:35;11490:8;11464:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11547:8;11525:41;;11540:5;11525:41;;;11557:8;11525:41;;;;;;:::i;:::-;;;;;;;;11266:307;;;:::o;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6426:305;;;;:::o;3977:111:27:-;4037:13;4069:12;4062:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3977:111;:::o;392:703:18:-;448:13;674:1;665:5;:10;661:51;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;3902:161:12:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5184:289;5150:323;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4761:889;;4680:970;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;:::i;:::-;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3564:143;3490:217;;:::o;1570:300:9:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;7034:125::-;7099:4;7150:1;7122:30;;:7;:16;7130:7;7122:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7115:37;;7034:125;;;:::o;8237:309::-;8361:18;8367:2;8371:7;8361:5;:18::i;:::-;8410:53;8441:1;8445:2;8449:7;8458:4;8410:22;:53::i;:::-;8389:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8237:309;;;:::o;4880:209:27:-;5037:45;5064:4;5070:2;5074:7;5037:26;:45::i;:::-;4880:209;;;:::o;14223:121:9:-;;;;:::o;1991:290:19:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;12342:831:9:-;12491:4;12511:15;:2;:13;;;:15::i;:::-;12507:660;;;12562:2;12546:36;;;12583:12;:10;:12::i;:::-;12597:4;12603:7;12612:4;12546:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12801:1;12784:6;:13;:18;12780:321;;12826:60;;;;;;;;;;:::i;:::-;;;;;;;;12780:321;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;12677:41;;;12667:51;;;:6;:51;;;;12660:58;;;;;12507:660;13152:4;13145:11;;12342:831;;;;;;;:::o;829:155:20:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8868:427:9:-;8961:1;8947:16;;:2;:16;;;8939:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9019:16;9027:7;9019;:16::i;:::-;9018:17;9010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;9152:1;9135:9;:13;9145:2;9135:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9182:2;9163:7;:16;9171:7;9163:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9225:7;9221:2;9200:33;;9217:1;9200:33;;;;;;;;;;;;9244:44;9272:1;9276:2;9280:7;9244:19;:44::i;:::-;8868:427;;:::o;8054:147:19:-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;8207:261::-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;7:75:29:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:116::-;4960:21;4975:5;4960:21;:::i;:::-;4953:5;4950:32;4940:60;;4996:1;4993;4986:12;4940:60;4890:116;:::o;5012:133::-;5055:5;5093:6;5080:20;5071:29;;5109:30;5133:5;5109:30;:::i;:::-;5012:133;;;;:::o;5151:323::-;5207:6;5256:2;5244:9;5235:7;5231:23;5227:32;5224:119;;;5262:79;;:::i;:::-;5224:119;5382:1;5407:50;5449:7;5440:6;5429:9;5425:22;5407:50;:::i;:::-;5397:60;;5353:114;5151:323;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:509::-;8637:6;8686:2;8674:9;8665:7;8661:23;8657:32;8654:119;;;8692:79;;:::i;:::-;8654:119;8840:1;8829:9;8825:17;8812:31;8870:18;8862:6;8859:30;8856:117;;;8892:79;;:::i;:::-;8856:117;8997:63;9052:7;9043:6;9032:9;9028:22;8997:63;:::i;:::-;8987:73;;8783:287;8568:509;;;;:::o;9083:117::-;9192:1;9189;9182:12;9206:117;9315:1;9312;9305:12;9346:568;9419:8;9429:6;9479:3;9472:4;9464:6;9460:17;9456:27;9446:122;;9487:79;;:::i;:::-;9446:122;9600:6;9587:20;9577:30;;9630:18;9622:6;9619:30;9616:117;;;9652:79;;:::i;:::-;9616:117;9766:4;9758:6;9754:17;9742:29;;9820:3;9812:4;9804:6;9800:17;9790:8;9786:32;9783:41;9780:128;;;9827:79;;:::i;:::-;9780:128;9346:568;;;;;:::o;9920:704::-;10015:6;10023;10031;10080:2;10068:9;10059:7;10055:23;10051:32;10048:119;;;10086:79;;:::i;:::-;10048:119;10234:1;10223:9;10219:17;10206:31;10264:18;10256:6;10253:30;10250:117;;;10286:79;;:::i;:::-;10250:117;10399:80;10471:7;10462:6;10451:9;10447:22;10399:80;:::i;:::-;10381:98;;;;10177:312;10528:2;10554:53;10599:7;10590:6;10579:9;10575:22;10554:53;:::i;:::-;10544:63;;10499:118;9920:704;;;;;:::o;10630:329::-;10689:6;10738:2;10726:9;10717:7;10713:23;10709:32;10706:119;;;10744:79;;:::i;:::-;10706:119;10864:1;10889:53;10934:7;10925:6;10914:9;10910:22;10889:53;:::i;:::-;10879:63;;10835:117;10630:329;;;;:::o;10965:468::-;11030:6;11038;11087:2;11075:9;11066:7;11062:23;11058:32;11055:119;;;11093:79;;:::i;:::-;11055:119;11213:1;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11184:117;11340:2;11366:50;11408:7;11399:6;11388:9;11384:22;11366:50;:::i;:::-;11356:60;;11311:115;10965:468;;;;;:::o;11439:307::-;11500:4;11590:18;11582:6;11579:30;11576:56;;;11612:18;;:::i;:::-;11576:56;11650:29;11672:6;11650:29;:::i;:::-;11642:37;;11734:4;11728;11724:15;11716:23;;11439:307;;;:::o;11752:423::-;11829:5;11854:65;11870:48;11911:6;11870:48;:::i;:::-;11854:65;:::i;:::-;11845:74;;11942:6;11935:5;11928:21;11980:4;11973:5;11969:16;12018:3;12009:6;12004:3;12000:16;11997:25;11994:112;;;12025:79;;:::i;:::-;11994:112;12115:54;12162:6;12157:3;12152;12115:54;:::i;:::-;11835:340;11752:423;;;;;:::o;12194:338::-;12249:5;12298:3;12291:4;12283:6;12279:17;12275:27;12265:122;;12306:79;;:::i;:::-;12265:122;12423:6;12410:20;12448:78;12522:3;12514:6;12507:4;12499:6;12495:17;12448:78;:::i;:::-;12439:87;;12255:277;12194:338;;;;:::o;12538:943::-;12633:6;12641;12649;12657;12706:3;12694:9;12685:7;12681:23;12677:33;12674:120;;;12713:79;;:::i;:::-;12674:120;12833:1;12858:53;12903:7;12894:6;12883:9;12879:22;12858:53;:::i;:::-;12848:63;;12804:117;12960:2;12986:53;13031:7;13022:6;13011:9;13007:22;12986:53;:::i;:::-;12976:63;;12931:118;13088:2;13114:53;13159:7;13150:6;13139:9;13135:22;13114:53;:::i;:::-;13104:63;;13059:118;13244:2;13233:9;13229:18;13216:32;13275:18;13267:6;13264:30;13261:117;;;13297:79;;:::i;:::-;13261:117;13402:62;13456:7;13447:6;13436:9;13432:22;13402:62;:::i;:::-;13392:72;;13187:287;12538:943;;;;;;;:::o;13487:77::-;13524:7;13553:5;13542:16;;13487:77;;;:::o;13570:118::-;13657:24;13675:5;13657:24;:::i;:::-;13652:3;13645:37;13570:118;;:::o;13694:222::-;13787:4;13825:2;13814:9;13810:18;13802:26;;13838:71;13906:1;13895:9;13891:17;13882:6;13838:71;:::i;:::-;13694:222;;;;:::o;13922:474::-;13990:6;13998;14047:2;14035:9;14026:7;14022:23;14018:32;14015:119;;;14053:79;;:::i;:::-;14015:119;14173:1;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14144:117;14300:2;14326:53;14371:7;14362:6;14351:9;14347:22;14326:53;:::i;:::-;14316:63;;14271:118;13922:474;;;;;:::o;14402:122::-;14475:24;14493:5;14475:24;:::i;:::-;14468:5;14465:35;14455:63;;14514:1;14511;14504:12;14455:63;14402:122;:::o;14530:139::-;14576:5;14614:6;14601:20;14592:29;;14630:33;14657:5;14630:33;:::i;:::-;14530:139;;;;:::o;14675:329::-;14734:6;14783:2;14771:9;14762:7;14758:23;14754:32;14751:119;;;14789:79;;:::i;:::-;14751:119;14909:1;14934:53;14979:7;14970:6;14959:9;14955:22;14934:53;:::i;:::-;14924:63;;14880:117;14675:329;;;;:::o;15010:180::-;15058:77;15055:1;15048:88;15155:4;15152:1;15145:15;15179:4;15176:1;15169:15;15196:320;15240:6;15277:1;15271:4;15267:12;15257:22;;15324:1;15318:4;15314:12;15345:18;15335:81;;15401:4;15393:6;15389:17;15379:27;;15335:81;15463:2;15455:6;15452:14;15432:18;15429:38;15426:84;;15482:18;;:::i;:::-;15426:84;15247:269;15196:320;;;:::o;15522:220::-;15662:34;15658:1;15650:6;15646:14;15639:58;15731:3;15726:2;15718:6;15714:15;15707:28;15522:220;:::o;15748:366::-;15890:3;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;15987:93;16076:3;15987:93;:::i;:::-;16105:2;16100:3;16096:12;16089:19;;15748:366;;;:::o;16120:419::-;16286:4;16324:2;16313:9;16309:18;16301:26;;16373:9;16367:4;16363:20;16359:1;16348:9;16344:17;16337:47;16401:131;16527:4;16401:131;:::i;:::-;16393:139;;16120:419;;;:::o;16545:249::-;16685:34;16681:1;16673:6;16669:14;16662:58;16754:32;16749:2;16741:6;16737:15;16730:57;16545:249;:::o;16800:366::-;16942:3;16963:67;17027:2;17022:3;16963:67;:::i;:::-;16956:74;;17039:93;17128:3;17039:93;:::i;:::-;17157:2;17152:3;17148:12;17141:19;;16800:366;;;:::o;17172:419::-;17338:4;17376:2;17365:9;17361:18;17353:26;;17425:9;17419:4;17415:20;17411:1;17400:9;17396:17;17389:47;17453:131;17579:4;17453:131;:::i;:::-;17445:139;;17172:419;;;:::o;17597:180::-;17645:77;17642:1;17635:88;17742:4;17739:1;17732:15;17766:4;17763:1;17756:15;17783:191;17823:3;17842:20;17860:1;17842:20;:::i;:::-;17837:25;;17876:20;17894:1;17876:20;:::i;:::-;17871:25;;17919:1;17916;17912:9;17905:16;;17940:3;17937:1;17934:10;17931:36;;;17947:18;;:::i;:::-;17931:36;17783:191;;;;:::o;17980:169::-;18120:21;18116:1;18108:6;18104:14;18097:45;17980:169;:::o;18155:366::-;18297:3;18318:67;18382:2;18377:3;18318:67;:::i;:::-;18311:74;;18394:93;18483:3;18394:93;:::i;:::-;18512:2;18507:3;18503:12;18496:19;;18155:366;;;:::o;18527:419::-;18693:4;18731:2;18720:9;18716:18;18708:26;;18780:9;18774:4;18770:20;18766:1;18755:9;18751:17;18744:47;18808:131;18934:4;18808:131;:::i;:::-;18800:139;;18527:419;;;:::o;18952:233::-;18991:3;19014:24;19032:5;19014:24;:::i;:::-;19005:33;;19060:66;19053:5;19050:77;19047:103;;19130:18;;:::i;:::-;19047:103;19177:1;19170:5;19166:13;19159:20;;18952:233;;;:::o;19191:::-;19331:34;19327:1;19319:6;19315:14;19308:58;19400:16;19395:2;19387:6;19383:15;19376:41;19191:233;:::o;19430:366::-;19572:3;19593:67;19657:2;19652:3;19593:67;:::i;:::-;19586:74;;19669:93;19758:3;19669:93;:::i;:::-;19787:2;19782:3;19778:12;19771:19;;19430:366;;;:::o;19802:419::-;19968:4;20006:2;19995:9;19991:18;19983:26;;20055:9;20049:4;20045:20;20041:1;20030:9;20026:17;20019:47;20083:131;20209:4;20083:131;:::i;:::-;20075:139;;19802:419;;;:::o;20227:230::-;20367:34;20363:1;20355:6;20351:14;20344:58;20436:13;20431:2;20423:6;20419:15;20412:38;20227:230;:::o;20463:366::-;20605:3;20626:67;20690:2;20685:3;20626:67;:::i;:::-;20619:74;;20702:93;20791:3;20702:93;:::i;:::-;20820:2;20815:3;20811:12;20804:19;;20463:366;;;:::o;20835:419::-;21001:4;21039:2;21028:9;21024:18;21016:26;;21088:9;21082:4;21078:20;21074:1;21063:9;21059:17;21052:47;21116:131;21242:4;21116:131;:::i;:::-;21108:139;;20835:419;;;:::o;21260:141::-;21309:4;21332:3;21324:11;;21355:3;21352:1;21345:14;21389:4;21386:1;21376:18;21368:26;;21260:141;;;:::o;21407:93::-;21444:6;21491:2;21486;21479:5;21475:14;21471:23;21461:33;;21407:93;;;:::o;21506:107::-;21550:8;21600:5;21594:4;21590:16;21569:37;;21506:107;;;;:::o;21619:393::-;21688:6;21738:1;21726:10;21722:18;21761:97;21791:66;21780:9;21761:97;:::i;:::-;21879:39;21909:8;21898:9;21879:39;:::i;:::-;21867:51;;21951:4;21947:9;21940:5;21936:21;21927:30;;22000:4;21990:8;21986:19;21979:5;21976:30;21966:40;;21695:317;;21619:393;;;;;:::o;22018:60::-;22046:3;22067:5;22060:12;;22018:60;;;:::o;22084:142::-;22134:9;22167:53;22185:34;22194:24;22212:5;22194:24;:::i;:::-;22185:34;:::i;:::-;22167:53;:::i;:::-;22154:66;;22084:142;;;:::o;22232:75::-;22275:3;22296:5;22289:12;;22232:75;;;:::o;22313:269::-;22423:39;22454:7;22423:39;:::i;:::-;22484:91;22533:41;22557:16;22533:41;:::i;:::-;22525:6;22518:4;22512:11;22484:91;:::i;:::-;22478:4;22471:105;22389:193;22313:269;;;:::o;22588:73::-;22633:3;22588:73;:::o;22667:189::-;22744:32;;:::i;:::-;22785:65;22843:6;22835;22829:4;22785:65;:::i;:::-;22720:136;22667:189;;:::o;22862:186::-;22922:120;22939:3;22932:5;22929:14;22922:120;;;22993:39;23030:1;23023:5;22993:39;:::i;:::-;22966:1;22959:5;22955:13;22946:22;;22922:120;;;22862:186;;:::o;23054:543::-;23155:2;23150:3;23147:11;23144:446;;;23189:38;23221:5;23189:38;:::i;:::-;23273:29;23291:10;23273:29;:::i;:::-;23263:8;23259:44;23456:2;23444:10;23441:18;23438:49;;;23477:8;23462:23;;23438:49;23500:80;23556:22;23574:3;23556:22;:::i;:::-;23546:8;23542:37;23529:11;23500:80;:::i;:::-;23159:431;;23144:446;23054:543;;;:::o;23603:117::-;23657:8;23707:5;23701:4;23697:16;23676:37;;23603:117;;;;:::o;23726:169::-;23770:6;23803:51;23851:1;23847:6;23839:5;23836:1;23832:13;23803:51;:::i;:::-;23799:56;23884:4;23878;23874:15;23864:25;;23777:118;23726:169;;;;:::o;23900:295::-;23976:4;24122:29;24147:3;24141:4;24122:29;:::i;:::-;24114:37;;24184:3;24181:1;24177:11;24171:4;24168:21;24160:29;;23900:295;;;;:::o;24200:1395::-;24317:37;24350:3;24317:37;:::i;:::-;24419:18;24411:6;24408:30;24405:56;;;24441:18;;:::i;:::-;24405:56;24485:38;24517:4;24511:11;24485:38;:::i;:::-;24570:67;24630:6;24622;24616:4;24570:67;:::i;:::-;24664:1;24688:4;24675:17;;24720:2;24712:6;24709:14;24737:1;24732:618;;;;25394:1;25411:6;25408:77;;;25460:9;25455:3;25451:19;25445:26;25436:35;;25408:77;25511:67;25571:6;25564:5;25511:67;:::i;:::-;25505:4;25498:81;25367:222;24702:887;;24732:618;24784:4;24780:9;24772:6;24768:22;24818:37;24850:4;24818:37;:::i;:::-;24877:1;24891:208;24905:7;24902:1;24899:14;24891:208;;;24984:9;24979:3;24975:19;24969:26;24961:6;24954:42;25035:1;25027:6;25023:14;25013:24;;25082:2;25071:9;25067:18;25054:31;;24928:4;24925:1;24921:12;24916:17;;24891:208;;;25127:6;25118:7;25115:19;25112:179;;;25185:9;25180:3;25176:19;25170:26;25228:48;25270:4;25262:6;25258:17;25247:9;25228:48;:::i;:::-;25220:6;25213:64;25135:156;25112:179;25337:1;25333;25325:6;25321:14;25317:22;25311:4;25304:36;24739:611;;;24702:887;;24292:1303;;;24200:1395;;:::o;25601:181::-;25741:33;25737:1;25729:6;25725:14;25718:57;25601:181;:::o;25788:366::-;25930:3;25951:67;26015:2;26010:3;25951:67;:::i;:::-;25944:74;;26027:93;26116:3;26027:93;:::i;:::-;26145:2;26140:3;26136:12;26129:19;;25788:366;;;:::o;26160:419::-;26326:4;26364:2;26353:9;26349:18;26341:26;;26413:9;26407:4;26403:20;26399:1;26388:9;26384:17;26377:47;26441:131;26567:4;26441:131;:::i;:::-;26433:139;;26160:419;;;:::o;26585:147::-;26686:11;26723:3;26708:18;;26585:147;;;;:::o;26738:114::-;;:::o;26858:398::-;27017:3;27038:83;27119:1;27114:3;27038:83;:::i;:::-;27031:90;;27130:93;27219:3;27130:93;:::i;:::-;27248:1;27243:3;27239:11;27232:18;;26858:398;;;:::o;27262:379::-;27446:3;27468:147;27611:3;27468:147;:::i;:::-;27461:154;;27632:3;27625:10;;27262:379;;;:::o;27647:168::-;27787:20;27783:1;27775:6;27771:14;27764:44;27647:168;:::o;27821:366::-;27963:3;27984:67;28048:2;28043:3;27984:67;:::i;:::-;27977:74;;28060:93;28149:3;28060:93;:::i;:::-;28178:2;28173:3;28169:12;28162:19;;27821:366;;;:::o;28193:419::-;28359:4;28397:2;28386:9;28382:18;28374:26;;28446:9;28440:4;28436:20;28432:1;28421:9;28417:17;28410:47;28474:131;28600:4;28474:131;:::i;:::-;28466:139;;28193:419;;;:::o;28618:172::-;28758:24;28754:1;28746:6;28742:14;28735:48;28618:172;:::o;28796:366::-;28938:3;28959:67;29023:2;29018:3;28959:67;:::i;:::-;28952:74;;29035:93;29124:3;29035:93;:::i;:::-;29153:2;29148:3;29144:12;29137:19;;28796:366;;;:::o;29168:419::-;29334:4;29372:2;29361:9;29357:18;29349:26;;29421:9;29415:4;29411:20;29407:1;29396:9;29392:17;29385:47;29449:131;29575:4;29449:131;:::i;:::-;29441:139;;29168:419;;;:::o;29593:94::-;29626:8;29674:5;29670:2;29666:14;29645:35;;29593:94;;;:::o;29693:::-;29732:7;29761:20;29775:5;29761:20;:::i;:::-;29750:31;;29693:94;;;:::o;29793:100::-;29832:7;29861:26;29881:5;29861:26;:::i;:::-;29850:37;;29793:100;;;:::o;29899:157::-;30004:45;30024:24;30042:5;30024:24;:::i;:::-;30004:45;:::i;:::-;29999:3;29992:58;29899:157;;:::o;30062:256::-;30174:3;30189:75;30260:3;30251:6;30189:75;:::i;:::-;30289:2;30284:3;30280:12;30273:19;;30309:3;30302:10;;30062:256;;;;:::o;30324:194::-;30364:4;30384:20;30402:1;30384:20;:::i;:::-;30379:25;;30418:20;30436:1;30418:20;:::i;:::-;30413:25;;30462:1;30459;30455:9;30447:17;;30486:1;30480:4;30477:11;30474:37;;;30491:18;;:::i;:::-;30474:37;30324:194;;;;:::o;30524:410::-;30564:7;30587:20;30605:1;30587:20;:::i;:::-;30582:25;;30621:20;30639:1;30621:20;:::i;:::-;30616:25;;30676:1;30673;30669:9;30698:30;30716:11;30698:30;:::i;:::-;30687:41;;30877:1;30868:7;30864:15;30861:1;30858:22;30838:1;30831:9;30811:83;30788:139;;30907:18;;:::i;:::-;30788:139;30572:362;30524:410;;;;:::o;30940:182::-;31080:34;31076:1;31068:6;31064:14;31057:58;30940:182;:::o;31128:366::-;31270:3;31291:67;31355:2;31350:3;31291:67;:::i;:::-;31284:74;;31367:93;31456:3;31367:93;:::i;:::-;31485:2;31480:3;31476:12;31469:19;;31128:366;;;:::o;31500:419::-;31666:4;31704:2;31693:9;31689:18;31681:26;;31753:9;31747:4;31743:20;31739:1;31728:9;31724:17;31717:47;31781:131;31907:4;31781:131;:::i;:::-;31773:139;;31500:419;;;:::o;31925:231::-;32065:34;32061:1;32053:6;32049:14;32042:58;32134:14;32129:2;32121:6;32117:15;32110:39;31925:231;:::o;32162:366::-;32304:3;32325:67;32389:2;32384:3;32325:67;:::i;:::-;32318:74;;32401:93;32490:3;32401:93;:::i;:::-;32519:2;32514:3;32510:12;32503:19;;32162:366;;;:::o;32534:419::-;32700:4;32738:2;32727:9;32723:18;32715:26;;32787:9;32781:4;32777:20;32773:1;32762:9;32758:17;32751:47;32815:131;32941:4;32815:131;:::i;:::-;32807:139;;32534:419;;;:::o;32959:180::-;33007:77;33004:1;32997:88;33104:4;33101:1;33094:15;33128:4;33125:1;33118:15;33145:174;33285:26;33281:1;33273:6;33269:14;33262:50;33145:174;:::o;33325:366::-;33467:3;33488:67;33552:2;33547:3;33488:67;:::i;:::-;33481:74;;33564:93;33653:3;33564:93;:::i;:::-;33682:2;33677:3;33673:12;33666:19;;33325:366;;;:::o;33697:419::-;33863:4;33901:2;33890:9;33886:18;33878:26;;33950:9;33944:4;33940:20;33936:1;33925:9;33921:17;33914:47;33978:131;34104:4;33978:131;:::i;:::-;33970:139;;33697:419;;;:::o;34122:228::-;34262:34;34258:1;34250:6;34246:14;34239:58;34331:11;34326:2;34318:6;34314:15;34307:36;34122:228;:::o;34356:366::-;34498:3;34519:67;34583:2;34578:3;34519:67;:::i;:::-;34512:74;;34595:93;34684:3;34595:93;:::i;:::-;34713:2;34708:3;34704:12;34697:19;;34356:366;;;:::o;34728:419::-;34894:4;34932:2;34921:9;34917:18;34909:26;;34981:9;34975:4;34971:20;34967:1;34956:9;34952:17;34945:47;35009:131;35135:4;35009:131;:::i;:::-;35001:139;;34728:419;;;:::o;35153:148::-;35255:11;35292:3;35277:18;;35153:148;;;;:::o;35307:390::-;35413:3;35441:39;35474:5;35441:39;:::i;:::-;35496:89;35578:6;35573:3;35496:89;:::i;:::-;35489:96;;35594:65;35652:6;35647:3;35640:4;35633:5;35629:16;35594:65;:::i;:::-;35684:6;35679:3;35675:16;35668:23;;35417:280;35307:390;;;;:::o;35703:155::-;35843:7;35839:1;35831:6;35827:14;35820:31;35703:155;:::o;35864:400::-;36024:3;36045:84;36127:1;36122:3;36045:84;:::i;:::-;36038:91;;36138:93;36227:3;36138:93;:::i;:::-;36256:1;36251:3;36247:11;36240:18;;35864:400;;;:::o;36270:701::-;36551:3;36573:95;36664:3;36655:6;36573:95;:::i;:::-;36566:102;;36685:95;36776:3;36767:6;36685:95;:::i;:::-;36678:102;;36797:148;36941:3;36797:148;:::i;:::-;36790:155;;36962:3;36955:10;;36270:701;;;;;:::o;36977:225::-;37117:34;37113:1;37105:6;37101:14;37094:58;37186:8;37181:2;37173:6;37169:15;37162:33;36977:225;:::o;37208:366::-;37350:3;37371:67;37435:2;37430:3;37371:67;:::i;:::-;37364:74;;37447:93;37536:3;37447:93;:::i;:::-;37565:2;37560:3;37556:12;37549:19;;37208:366;;;:::o;37580:419::-;37746:4;37784:2;37773:9;37769:18;37761:26;;37833:9;37827:4;37823:20;37819:1;37808:9;37804:17;37797:47;37861:131;37987:4;37861:131;:::i;:::-;37853:139;;37580:419;;;:::o;38005:182::-;38145:34;38141:1;38133:6;38129:14;38122:58;38005:182;:::o;38193:366::-;38335:3;38356:67;38420:2;38415:3;38356:67;:::i;:::-;38349:74;;38432:93;38521:3;38432:93;:::i;:::-;38550:2;38545:3;38541:12;38534:19;;38193:366;;;:::o;38565:419::-;38731:4;38769:2;38758:9;38754:18;38746:26;;38818:9;38812:4;38808:20;38804:1;38793:9;38789:17;38782:47;38846:131;38972:4;38846:131;:::i;:::-;38838:139;;38565:419;;;:::o;38990:224::-;39130:34;39126:1;39118:6;39114:14;39107:58;39199:7;39194:2;39186:6;39182:15;39175:32;38990:224;:::o;39220:366::-;39362:3;39383:67;39447:2;39442:3;39383:67;:::i;:::-;39376:74;;39459:93;39548:3;39459:93;:::i;:::-;39577:2;39572:3;39568:12;39561:19;;39220:366;;;:::o;39592:419::-;39758:4;39796:2;39785:9;39781:18;39773:26;;39845:9;39839:4;39835:20;39831:1;39820:9;39816:17;39809:47;39873:131;39999:4;39873:131;:::i;:::-;39865:139;;39592:419;;;:::o;40017:223::-;40157:34;40153:1;40145:6;40141:14;40134:58;40226:6;40221:2;40213:6;40209:15;40202:31;40017:223;:::o;40246:366::-;40388:3;40409:67;40473:2;40468:3;40409:67;:::i;:::-;40402:74;;40485:93;40574:3;40485:93;:::i;:::-;40603:2;40598:3;40594:12;40587:19;;40246:366;;;:::o;40618:419::-;40784:4;40822:2;40811:9;40807:18;40799:26;;40871:9;40865:4;40861:20;40857:1;40846:9;40842:17;40835:47;40899:131;41025:4;40899:131;:::i;:::-;40891:139;;40618:419;;;:::o;41043:175::-;41183:27;41179:1;41171:6;41167:14;41160:51;41043:175;:::o;41224:366::-;41366:3;41387:67;41451:2;41446:3;41387:67;:::i;:::-;41380:74;;41463:93;41552:3;41463:93;:::i;:::-;41581:2;41576:3;41572:12;41565:19;;41224:366;;;:::o;41596:419::-;41762:4;41800:2;41789:9;41785:18;41777:26;;41849:9;41843:4;41839:20;41835:1;41824:9;41820:17;41813:47;41877:131;42003:4;41877:131;:::i;:::-;41869:139;;41596:419;;;:::o;42021:237::-;42161:34;42157:1;42149:6;42145:14;42138:58;42230:20;42225:2;42217:6;42213:15;42206:45;42021:237;:::o;42264:366::-;42406:3;42427:67;42491:2;42486:3;42427:67;:::i;:::-;42420:74;;42503:93;42592:3;42503:93;:::i;:::-;42621:2;42616:3;42612:12;42605:19;;42264:366;;;:::o;42636:419::-;42802:4;42840:2;42829:9;42825:18;42817:26;;42889:9;42883:4;42879:20;42875:1;42864:9;42860:17;42853:47;42917:131;43043:4;42917:131;:::i;:::-;42909:139;;42636:419;;;:::o;43061:180::-;43109:77;43106:1;43099:88;43206:4;43203:1;43196:15;43230:4;43227:1;43220:15;43247:185;43287:1;43304:20;43322:1;43304:20;:::i;:::-;43299:25;;43338:20;43356:1;43338:20;:::i;:::-;43333:25;;43377:1;43367:35;;43382:18;;:::i;:::-;43367:35;43424:1;43421;43417:9;43412:14;;43247:185;;;;:::o;43438:176::-;43470:1;43487:20;43505:1;43487:20;:::i;:::-;43482:25;;43521:20;43539:1;43521:20;:::i;:::-;43516:25;;43560:1;43550:35;;43565:18;;:::i;:::-;43550:35;43606:1;43603;43599:9;43594:14;;43438:176;;;;:::o;43620:180::-;43668:77;43665:1;43658:88;43765:4;43762:1;43755:15;43789:4;43786:1;43779:15;43806:98;43857:6;43891:5;43885:12;43875:22;;43806:98;;;:::o;43910:168::-;43993:11;44027:6;44022:3;44015:19;44067:4;44062:3;44058:14;44043:29;;43910:168;;;;:::o;44084:373::-;44170:3;44198:38;44230:5;44198:38;:::i;:::-;44252:70;44315:6;44310:3;44252:70;:::i;:::-;44245:77;;44331:65;44389:6;44384:3;44377:4;44370:5;44366:16;44331:65;:::i;:::-;44421:29;44443:6;44421:29;:::i;:::-;44416:3;44412:39;44405:46;;44174:283;44084:373;;;;:::o;44463:640::-;44658:4;44696:3;44685:9;44681:19;44673:27;;44710:71;44778:1;44767:9;44763:17;44754:6;44710:71;:::i;:::-;44791:72;44859:2;44848:9;44844:18;44835:6;44791:72;:::i;:::-;44873;44941:2;44930:9;44926:18;44917:6;44873:72;:::i;:::-;44992:9;44986:4;44982:20;44977:2;44966:9;44962:18;44955:48;45020:76;45091:4;45082:6;45020:76;:::i;:::-;45012:84;;44463:640;;;;;;;:::o;45109:141::-;45165:5;45196:6;45190:13;45181:22;;45212:32;45238:5;45212:32;:::i;:::-;45109:141;;;;:::o;45256:349::-;45325:6;45374:2;45362:9;45353:7;45349:23;45345:32;45342:119;;;45380:79;;:::i;:::-;45342:119;45500:1;45525:63;45580:7;45571:6;45560:9;45556:22;45525:63;:::i;:::-;45515:73;;45471:127;45256:349;;;;:::o;45611:182::-;45751:34;45747:1;45739:6;45735:14;45728:58;45611:182;:::o;45799:366::-;45941:3;45962:67;46026:2;46021:3;45962:67;:::i;:::-;45955:74;;46038:93;46127:3;46038:93;:::i;:::-;46156:2;46151:3;46147:12;46140:19;;45799:366;;;:::o;46171:419::-;46337:4;46375:2;46364:9;46360:18;46352:26;;46424:9;46418:4;46414:20;46410:1;46399:9;46395:17;46388:47;46452:131;46578:4;46452:131;:::i;:::-;46444:139;;46171:419;;;:::o;46596:178::-;46736:30;46732:1;46724:6;46720:14;46713:54;46596:178;:::o;46780:366::-;46922:3;46943:67;47007:2;47002:3;46943:67;:::i;:::-;46936:74;;47019:93;47108:3;47019:93;:::i;:::-;47137:2;47132:3;47128:12;47121:19;;46780:366;;;:::o;47152:419::-;47318:4;47356:2;47345:9;47341:18;47333:26;;47405:9;47399:4;47395:20;47391:1;47380:9;47376:17;47369:47;47433:131;47559:4;47433:131;:::i;:::-;47425:139;;47152:419;;;:::o

Swarm Source

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