ETH Price: $3,260.82 (+2.83%)
Gas: 1 Gwei

Token

GrugsVX (GRUGVX)
 

Overview

Max Total Supply

129 GRUGVX

Holders

127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kcaryths.eth
Balance
1 GRUGVX
0x279a3fdbd6d6252afc5c422439c7d7859a51a05e
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:
GrugVX

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 18 : GrugV1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

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

contract GrugVX is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;

    // ============ PRIVATE ============
    Counters.Counter private _tokenIdCounter;

    // ============ PUBLIC ============
    string public baseURI;
    uint256 public maxGrugs;
    uint256 public startTime;
    uint256 public constant PUBLIC_SALE_PRICE = 0.03 ether;
    uint256 public constant OG_MINT_TIME = 14 days;
    bool public isOGSaleActive;
    bool public fixedURI;

    // ============ MERKLE ROOTS ============
    bytes32 public oGMerkleRoot;

    // ============ MAPS ============
    mapping(address => bool) public hasMinted;

    // ============ ACCESS CONTROL ============

    modifier oGSaleActive() {
        require(isOGSaleActive, "OG sale is not open");
        _;
    }

    modifier canMintGrugs(uint256 numberOfTokens) {
        require(
            _tokenIdCounter.current() + numberOfTokens <= maxGrugs,
            "No Grugs Left"
        );
        _;
    }
    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist on list"
        );
        _;
    }
    modifier hasNotMinted() {
        require(!hasMinted[msg.sender], "Already Minted");
        _;
    }

    constructor(uint256 _maxGrugs) ERC721("GrugsVX", "GRUGVX") {
        maxGrugs = _maxGrugs;
    }

    // ============ MINT FUNCTIONS ==================

    function GrugMint(bytes32[] calldata merkleProof)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(1)
        hasNotMinted
        isValidMerkleProof(merkleProof, oGMerkleRoot)
    {
        hasMinted[msg.sender] = true;
        _safeMint(msg.sender, nextTokenId());
    }

    function mint(uint8 numberOfTokens)
        external
        payable
        nonReentrant
        canMintGrugs(numberOfTokens)
        isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens)
    {
        require(
            block.timestamp > startTime + OG_MINT_TIME,
            "public mint not started"
        );
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    function ownerMint(uint8 numberOfTokens)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(numberOfTokens)
        onlyOwner
    {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    // ============ SUPPORTING FUNCTIONS ============
    function setMaxGrugs(uint256 _value) external onlyOwner {
        maxGrugs = _value;
    }

    function setIsOgSaleActive(bool _value) external onlyOwner {
        isOGSaleActive = _value;
        startTime = block.timestamp;
    }

    function setOgMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        oGMerkleRoot = _merkleRoot;
    }

    function setFixedURI(bool _fixedURI) external onlyOwner {
        fixedURI = _fixedURI;
    }

    function setTokenURI(string memory _tokenURI) external onlyOwner {
        baseURI = _tokenURI;
    }

    function nextTokenId() private returns (uint256) {
        _tokenIdCounter.increment();
        return _tokenIdCounter.current();
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }

    // ============ OVERRIDES ============

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Nonexistent token");

        if (fixedURI) {
            return string(abi.encodePacked(baseURI, "/10000000"));
        } else {
            return
                string(
                    abi.encodePacked(baseURI, "/", Strings.toString(tokenId))
                );
        }
    }

    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 18 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @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 3 of 18 : 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 4 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/IERC20.sol";

File 5 of 18 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

File 6 of 18 : 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 7 of 18 : 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 8 of 18 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 9 of 18 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * 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 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 10 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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 11 of 18 : 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 12 of 18 : 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 13 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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

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

File 14 of 18 : 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 15 of 18 : 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 16 of 18 : 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 17 of 18 : 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 18 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_maxGrugs","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"GrugMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OG_MINT_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOGSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGrugs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oGMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_fixedURI","type":"bool"}],"name":"setFixedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setIsOgSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxGrugs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setOgMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005169380380620051698339818101604052810190620000379190620002cb565b6040518060400160405280600781526020017f47727567735658000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f47525547565800000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001db565b508060019080519060200190620000d4929190620001db565b505050620000f7620000eb6200010d60201b60201c565b6200011560201b60201c565b6001600b8190555080600e819055505062000362565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e9906200032c565b90600052602060002090601f0160209004810192826200020d576000855562000259565b82601f106200022857805160ff191683800117855562000259565b8280016001018555821562000259579182015b82811115620002585782518255916020019190600101906200023b565b5b5090506200026891906200026c565b5090565b5b80821115620002875760008160009055506001016200026d565b5090565b600080fd5b6000819050919050565b620002a58162000290565b8114620002b157600080fd5b50565b600081519050620002c5816200029a565b92915050565b600060208284031215620002e457620002e36200028b565b5b6000620002f484828501620002b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034557607f821691505b602082108114156200035c576200035b620002fd565b5b50919050565b614df780620003726000396000f3fe6080604052600436106102245760003560e01c806366db608411610123578063b308ff33116100ab578063e0df5b6f1161006f578063e0df5b6f146107dd578063e985e9c514610806578063eb79505814610843578063ef9788271461086c578063f2fde38b1461089757610224565b8063b308ff3314610707578063b83e134614610723578063b88d4fde1461074e578063c87b56dd14610777578063d8a7ab89146107b457610224565b8063715018a6116100f2578063715018a61461064657806378e979251461065d5780638da5cb5b1461068857806395d89b41146106b3578063a22cb465146106de57610224565b806366db6084146105975780636c0360eb146105c25780636ecd2306146105ed57806370a082311461060957610224565b80632796d139116101b157806349df728c1161017557806349df728c146104af5780634aac41e6146104d85780634e2d1c86146105015780634f6ccce71461051d5780636352211e1461055a57610224565b80632796d139146103ca5780632f745c59146103f557806338e21cce146104325780633ccfd60b1461046f57806342842e0e1461048657610224565b8063081812fc116101f8578063081812fc146102e5578063095ea7b31461032257806318160ddd1461034b5780631959d9f81461037657806323b872dd146103a157610224565b80629a46fd1461022957806301ffc9a71461025257806306fdde031461028f57806307e89ec0146102ba575b600080fd5b34801561023557600080fd5b50610250600480360381019061024b9190613256565b6108c0565b005b34801561025e57600080fd5b50610279600480360381019061027491906132db565b610960565b6040516102869190613317565b60405180910390f35b34801561029b57600080fd5b506102a4610972565b6040516102b191906133cb565b60405180910390f35b3480156102c657600080fd5b506102cf610a04565b6040516102dc9190613406565b60405180910390f35b3480156102f157600080fd5b5061030c6004803603810190610307919061344d565b610a0f565b60405161031991906134bb565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613502565b610a94565b005b34801561035757600080fd5b50610360610bac565b60405161036d9190613406565b60405180910390f35b34801561038257600080fd5b5061038b610bb9565b6040516103989190613317565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613542565b610bcc565b005b3480156103d657600080fd5b506103df610c2c565b6040516103ec9190613406565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613502565b610c33565b6040516104299190613406565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613595565b610cd8565b6040516104669190613317565b60405180910390f35b34801561047b57600080fd5b50610484610cf8565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613542565b610dc3565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613600565b610de3565b005b3480156104e457600080fd5b506104ff60048036038101906104fa919061344d565b610f60565b005b61051b60048036038101906105169190613692565b610fe6565b005b34801561052957600080fd5b50610544600480360381019061053f919061344d565b61129a565b6040516105519190613406565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c919061344d565b61130b565b60405161058e91906134bb565b60405180910390f35b3480156105a357600080fd5b506105ac6113bd565b6040516105b99190613317565b60405180910390f35b3480156105ce57600080fd5b506105d76113d0565b6040516105e491906133cb565b60405180910390f35b61060760048036038101906106029190613718565b61145e565b005b34801561061557600080fd5b50610630600480360381019061062b9190613595565b6115f5565b60405161063d9190613406565b60405180910390f35b34801561065257600080fd5b5061065b6116ad565b005b34801561066957600080fd5b50610672611735565b60405161067f9190613406565b60405180910390f35b34801561069457600080fd5b5061069d61173b565b6040516106aa91906134bb565b60405180910390f35b3480156106bf57600080fd5b506106c8611765565b6040516106d591906133cb565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613745565b6117f7565b005b610721600480360381019061071c9190613718565b61180d565b005b34801561072f57600080fd5b506107386119c2565b604051610745919061379e565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906138e9565b6119c8565b005b34801561078357600080fd5b5061079e6004803603810190610799919061344d565b611a2a565b6040516107ab91906133cb565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d69190613998565b611ae4565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613a66565b611b6a565b005b34801561081257600080fd5b5061082d60048036038101906108289190613aaf565b611c00565b60405161083a9190613317565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190613256565b611c94565b005b34801561087857600080fd5b50610881611d2d565b60405161088e9190613406565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b99190613595565b611d33565b005b6108c8611e2b565b73ffffffffffffffffffffffffffffffffffffffff166108e661173b565b73ffffffffffffffffffffffffffffffffffffffff161461093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390613b3b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555042600f8190555050565b600061096b82611e33565b9050919050565b60606000805461098190613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546109ad90613b8a565b80156109fa5780601f106109cf576101008083540402835291602001916109fa565b820191906000526020600020905b8154815290600101906020018083116109dd57829003601f168201915b5050505050905090565b666a94d74f43000081565b6000610a1a82611ead565b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090613c2e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9f8261130b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790613cc0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2f611e2b565b73ffffffffffffffffffffffffffffffffffffffff161480610b5e5750610b5d81610b58611e2b565b611c00565b5b610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490613d52565b60405180910390fd5b610ba78383611f19565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610bdd610bd7611e2b565b82611fd2565b610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613de4565b60405180910390fd5b610c278383836120b0565b505050565b6212750081565b6000610c3e836115f5565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690613e76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60126020528060005260406000206000915054906101000a900460ff1681565b610d00611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610d1e61173b565b73ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90613b3b565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dbf573d6000803e3d6000fd5b5050565b610dde838383604051806020016040528060008152506119c8565b505050565b610deb611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610e0961173b565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613b3b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9a91906134bb565b602060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190613eab565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610f18929190613ed8565b6020604051808303816000875af1158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190613f16565b505050565b610f68611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610f8661173b565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390613b3b565b60405180910390fd5b80600e8190555050565b6002600b54141561102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613f8f565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a90613ffb565b60405180910390fd5b6001600e5481611093600c612317565b61109d919061404a565b11156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d5906140ec565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614158565b60405180910390fd5b82826011546111e2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016111c791906141c0565b60405160208183030381529060405280519060200120612325565b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614227565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061128a3361128561233c565b612357565b505050506001600b819055505050565b60006112a4610bac565b82106112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc906142b9565b60405180910390fd5b600882815481106112f9576112f86142d9565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061437a565b60405180910390fd5b80915050919050565b601060019054906101000a900460ff1681565b600d80546113dd90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461140990613b8a565b80156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b505050505081565b6002600b5414156114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90613f8f565b60405180910390fd5b6002600b819055508060ff16600e54816114be600c612317565b6114c8919061404a565b1115611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906140ec565b60405180910390fd5b666a94d74f4300008260ff16348183611522919061439a565b14611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990614440565b60405180910390fd5b62127500600f54611573919061404a565b42116115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906144ac565b60405180910390fd5b60005b8460ff168110156115e6576115d3336115ce61233c565b612357565b80806115de906144cc565b9150506115b7565b505050506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d90614587565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b5611e2b565b73ffffffffffffffffffffffffffffffffffffffff166116d361173b565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090613b3b565b60405180910390fd5b6117336000612375565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461177490613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546117a090613b8a565b80156117ed5780601f106117c2576101008083540402835291602001916117ed565b820191906000526020600020905b8154815290600101906020018083116117d057829003601f168201915b5050505050905090565b611809611802611e2b565b838361243b565b5050565b6002600b541415611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613f8f565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff166118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613ffb565b60405180910390fd5b8060ff16600e54816118bc600c612317565b6118c6919061404a565b1115611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe906140ec565b60405180910390fd5b61190f611e2b565b73ffffffffffffffffffffffffffffffffffffffff1661192d61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613b3b565b60405180910390fd5b60005b8260ff168110156119b5576119a23361199d61233c565b612357565b80806119ad906144cc565b915050611986565b50506001600b8190555050565b60115481565b6119d96119d3611e2b565b83611fd2565b611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90613de4565b60405180910390fd5b611a24848484846125a8565b50505050565b6060611a3582611ead565b611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906145f3565b60405180910390fd5b601060019054906101000a900460ff1615611ab157600d604051602001611a9b91906146fe565b6040516020818303038152906040529050611adf565b600d611abc83612604565b604051602001611acd92919061479d565b60405160208183030381529060405290505b919050565b611aec611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611b0a61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613b3b565b60405180910390fd5b8060118190555050565b611b72611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611b9061173b565b73ffffffffffffffffffffffffffffffffffffffff1614611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90613b3b565b60405180910390fd5b80600d9080519060200190611bfc929190613167565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9c611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611cba61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613b3b565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b600e5481565b611d3b611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611d5961173b565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e169061483e565b60405180910390fd5b611e2881612375565b50565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ea65750611ea582612765565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f8c8361130b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fdd82611ead565b61201c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612013906148d0565b60405180910390fd5b60006120278361130b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206957506120688185611c00565b5b806120a757508373ffffffffffffffffffffffffffffffffffffffff1661208f84610a0f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d08261130b565b73ffffffffffffffffffffffffffffffffffffffff1614612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d90614962565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d906149f4565b60405180910390fd5b6121a1838383612847565b6121ac600082611f19565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fc9190614a14565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612253919061404a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612312838383612857565b505050565b600081600001549050919050565b600082612332858461285c565b1490509392505050565b6000612348600c6128d1565b612352600c612317565b905090565b6123718282604051806020016040528060008152506128e7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614a94565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161259b9190613317565b60405180910390a3505050565b6125b38484846120b0565b6125bf84848484612942565b6125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614b26565b60405180910390fd5b50505050565b6060600082141561264c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612760565b600082905060005b6000821461267e578080612667906144cc565b915050600a826126779190614b75565b9150612654565b60008167ffffffffffffffff81111561269a576126996137be565b5b6040519080825280601f01601f1916602001820160405280156126cc5781602001600182028036833780820191505090505b5090505b60008514612759576001826126e59190614a14565b9150600a856126f49190614ba6565b6030612700919061404a565b60f81b818381518110612716576127156142d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127529190614b75565b94506126d0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061283057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612840575061283f82612aca565b5b9050919050565b612852838383612b34565b505050565b505050565b60008082905060005b84518110156128c6576000858281518110612883576128826142d9565b5b602002602001015190508083116128a55761289e8382612c48565b92506128b2565b6128af8184612c48565b92505b5080806128be906144cc565b915050612865565b508091505092915050565b6001816000016000828254019250508190555050565b6128f18383612c5f565b6128fe6000848484612942565b61293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293490614b26565b60405180910390fd5b505050565b60006129638473ffffffffffffffffffffffffffffffffffffffff16612e39565b15612abd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261298c611e2b565b8786866040518563ffffffff1660e01b81526004016129ae9493929190614c2c565b6020604051808303816000875af19250505080156129ea57506040513d601f19601f820116820180604052508101906129e79190614c8d565b60015b612a6d573d8060008114612a1a576040519150601f19603f3d011682016040523d82523d6000602084013e612a1f565b606091505b50600081511415612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614b26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ac2565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b3f838383612e5c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b8257612b7d81612e61565b612bc1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bc057612bbf8382612eaa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c0457612bff81613017565b612c43565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c4257612c4182826130e8565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc690614d06565b60405180910390fd5b612cd881611ead565b15612d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0f90614d72565b60405180910390fd5b612d2460008383612847565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d74919061404a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3560008383612857565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eb7846115f5565b612ec19190614a14565b9050600060076000848152602001908152602001600020549050818114612fa6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061302b9190614a14565b905060006009600084815260200190815260200160002054905060006008838154811061305b5761305a6142d9565b5b90600052602060002001549050806008838154811061307d5761307c6142d9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130cc576130cb614d92565b5b6001900381819060005260206000200160009055905550505050565b60006130f3836115f5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461317390613b8a565b90600052602060002090601f01602090048101928261319557600085556131dc565b82601f106131ae57805160ff19168380011785556131dc565b828001600101855582156131dc579182015b828111156131db5782518255916020019190600101906131c0565b5b5090506131e991906131ed565b5090565b5b808211156132065760008160009055506001016131ee565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6132338161321e565b811461323e57600080fd5b50565b6000813590506132508161322a565b92915050565b60006020828403121561326c5761326b613214565b5b600061327a84828501613241565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132b881613283565b81146132c357600080fd5b50565b6000813590506132d5816132af565b92915050565b6000602082840312156132f1576132f0613214565b5b60006132ff848285016132c6565b91505092915050565b6133118161321e565b82525050565b600060208201905061332c6000830184613308565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561336c578082015181840152602081019050613351565b8381111561337b576000848401525b50505050565b6000601f19601f8301169050919050565b600061339d82613332565b6133a7818561333d565b93506133b781856020860161334e565b6133c081613381565b840191505092915050565b600060208201905081810360008301526133e58184613392565b905092915050565b6000819050919050565b613400816133ed565b82525050565b600060208201905061341b60008301846133f7565b92915050565b61342a816133ed565b811461343557600080fd5b50565b60008135905061344781613421565b92915050565b60006020828403121561346357613462613214565b5b600061347184828501613438565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134a58261347a565b9050919050565b6134b58161349a565b82525050565b60006020820190506134d060008301846134ac565b92915050565b6134df8161349a565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b6000806040838503121561351957613518613214565b5b6000613527858286016134ed565b925050602061353885828601613438565b9150509250929050565b60008060006060848603121561355b5761355a613214565b5b6000613569868287016134ed565b935050602061357a868287016134ed565b925050604061358b86828701613438565b9150509250925092565b6000602082840312156135ab576135aa613214565b5b60006135b9848285016134ed565b91505092915050565b60006135cd8261349a565b9050919050565b6135dd816135c2565b81146135e857600080fd5b50565b6000813590506135fa816135d4565b92915050565b60006020828403121561361657613615613214565b5b6000613624848285016135eb565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136525761365161362d565b5b8235905067ffffffffffffffff81111561366f5761366e613632565b5b60208301915083602082028301111561368b5761368a613637565b5b9250929050565b600080602083850312156136a9576136a8613214565b5b600083013567ffffffffffffffff8111156136c7576136c6613219565b5b6136d38582860161363c565b92509250509250929050565b600060ff82169050919050565b6136f5816136df565b811461370057600080fd5b50565b600081359050613712816136ec565b92915050565b60006020828403121561372e5761372d613214565b5b600061373c84828501613703565b91505092915050565b6000806040838503121561375c5761375b613214565b5b600061376a858286016134ed565b925050602061377b85828601613241565b9150509250929050565b6000819050919050565b61379881613785565b82525050565b60006020820190506137b3600083018461378f565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137f682613381565b810181811067ffffffffffffffff82111715613815576138146137be565b5b80604052505050565b600061382861320a565b905061383482826137ed565b919050565b600067ffffffffffffffff821115613854576138536137be565b5b61385d82613381565b9050602081019050919050565b82818337600083830152505050565b600061388c61388784613839565b61381e565b9050828152602081018484840111156138a8576138a76137b9565b5b6138b384828561386a565b509392505050565b600082601f8301126138d0576138cf61362d565b5b81356138e0848260208601613879565b91505092915050565b6000806000806080858703121561390357613902613214565b5b6000613911878288016134ed565b9450506020613922878288016134ed565b935050604061393387828801613438565b925050606085013567ffffffffffffffff81111561395457613953613219565b5b613960878288016138bb565b91505092959194509250565b61397581613785565b811461398057600080fd5b50565b6000813590506139928161396c565b92915050565b6000602082840312156139ae576139ad613214565b5b60006139bc84828501613983565b91505092915050565b600067ffffffffffffffff8211156139e0576139df6137be565b5b6139e982613381565b9050602081019050919050565b6000613a09613a04846139c5565b61381e565b905082815260208101848484011115613a2557613a246137b9565b5b613a3084828561386a565b509392505050565b600082601f830112613a4d57613a4c61362d565b5b8135613a5d8482602086016139f6565b91505092915050565b600060208284031215613a7c57613a7b613214565b5b600082013567ffffffffffffffff811115613a9a57613a99613219565b5b613aa684828501613a38565b91505092915050565b60008060408385031215613ac657613ac5613214565b5b6000613ad4858286016134ed565b9250506020613ae5858286016134ed565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b2560208361333d565b9150613b3082613aef565b602082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ba257607f821691505b60208210811415613bb657613bb5613b5b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c18602c8361333d565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613caa60218361333d565b9150613cb582613c4e565b604082019050919050565b60006020820190508181036000830152613cd981613c9d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d3c60388361333d565b9150613d4782613ce0565b604082019050919050565b60006020820190508181036000830152613d6b81613d2f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613dce60318361333d565b9150613dd982613d72565b604082019050919050565b60006020820190508181036000830152613dfd81613dc1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e60602b8361333d565b9150613e6b82613e04565b604082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b600081519050613ea581613421565b92915050565b600060208284031215613ec157613ec0613214565b5b6000613ecf84828501613e96565b91505092915050565b6000604082019050613eed60008301856134ac565b613efa60208301846133f7565b9392505050565b600081519050613f108161322a565b92915050565b600060208284031215613f2c57613f2b613214565b5b6000613f3a84828501613f01565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f79601f8361333d565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4f472073616c65206973206e6f74206f70656e00000000000000000000000000600082015250565b6000613fe560138361333d565b9150613ff082613faf565b602082019050919050565b6000602082019050818103600083015261401481613fd8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614055826133ed565b9150614060836133ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140955761409461401b565b5b828201905092915050565b7f4e6f204772756773204c65667400000000000000000000000000000000000000600082015250565b60006140d6600d8361333d565b91506140e1826140a0565b602082019050919050565b60006020820190508181036000830152614105816140c9565b9050919050565b7f416c7265616479204d696e746564000000000000000000000000000000000000600082015250565b6000614142600e8361333d565b915061414d8261410c565b602082019050919050565b6000602082019050818103600083015261417181614135565b9050919050565b60008160601b9050919050565b600061419082614178565b9050919050565b60006141a282614185565b9050919050565b6141ba6141b58261349a565b614197565b82525050565b60006141cc82846141a9565b60148201915081905092915050565b7f4164647265737320646f6573206e6f74206578697374206f6e206c6973740000600082015250565b6000614211601e8361333d565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142a3602c8361333d565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061436460298361333d565b915061436f82614308565b604082019050919050565b6000602082019050818103600083015261439381614357565b9050919050565b60006143a5826133ed565b91506143b0836133ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e9576143e861401b565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061442a60188361333d565b9150614435826143f4565b602082019050919050565b600060208201905081810360008301526144598161441d565b9050919050565b7f7075626c6963206d696e74206e6f742073746172746564000000000000000000600082015250565b600061449660178361333d565b91506144a182614460565b602082019050919050565b600060208201905081810360008301526144c581614489565b9050919050565b60006144d7826133ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450a5761450961401b565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614571602a8361333d565b915061457c82614515565b604082019050919050565b600060208201905081810360008301526145a081614564565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006145dd60118361333d565b91506145e8826145a7565b602082019050919050565b6000602082019050818103600083015261460c816145d0565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461464081613b8a565b61464a8186614613565b945060018216600081146146655760018114614676576146a9565b60ff198316865281860193506146a9565b61467f8561461e565b60005b838110156146a157815481890152600182019150602081019050614682565b838801955050505b50505092915050565b7f2f31303030303030300000000000000000000000000000000000000000000000600082015250565b60006146e8600983614613565b91506146f3826146b2565b600982019050919050565b600061470a8284614633565b9150614715826146db565b915081905092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614756600183614613565b915061476182614720565b600182019050919050565b600061477782613332565b6147818185614613565b935061479181856020860161334e565b80840191505092915050565b60006147a98285614633565b91506147b482614749565b91506147c0828461476c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061482860268361333d565b9150614833826147cc565b604082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006148ba602c8361333d565b91506148c58261485e565b604082019050919050565b600060208201905081810360008301526148e9816148ad565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061494c60258361333d565b9150614957826148f0565b604082019050919050565b6000602082019050818103600083015261497b8161493f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149de60248361333d565b91506149e982614982565b604082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b6000614a1f826133ed565b9150614a2a836133ed565b925082821015614a3d57614a3c61401b565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a7e60198361333d565b9150614a8982614a48565b602082019050919050565b60006020820190508181036000830152614aad81614a71565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b1060328361333d565b9150614b1b82614ab4565b604082019050919050565b60006020820190508181036000830152614b3f81614b03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b80826133ed565b9150614b8b836133ed565b925082614b9b57614b9a614b46565b5b828204905092915050565b6000614bb1826133ed565b9150614bbc836133ed565b925082614bcc57614bcb614b46565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614bfe82614bd7565b614c088185614be2565b9350614c1881856020860161334e565b614c2181613381565b840191505092915050565b6000608082019050614c4160008301876134ac565b614c4e60208301866134ac565b614c5b60408301856133f7565b8181036060830152614c6d8184614bf3565b905095945050505050565b600081519050614c87816132af565b92915050565b600060208284031215614ca357614ca2613214565b5b6000614cb184828501614c78565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614cf060208361333d565b9150614cfb82614cba565b602082019050919050565b60006020820190508181036000830152614d1f81614ce3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d5c601c8361333d565b9150614d6782614d26565b602082019050919050565b60006020820190508181036000830152614d8b81614d4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c35bcbf9c84f315fbc451419b3b80084cdec7768a5cb7b44e9f3c5e82661f36e64736f6c634300080a003300000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106102245760003560e01c806366db608411610123578063b308ff33116100ab578063e0df5b6f1161006f578063e0df5b6f146107dd578063e985e9c514610806578063eb79505814610843578063ef9788271461086c578063f2fde38b1461089757610224565b8063b308ff3314610707578063b83e134614610723578063b88d4fde1461074e578063c87b56dd14610777578063d8a7ab89146107b457610224565b8063715018a6116100f2578063715018a61461064657806378e979251461065d5780638da5cb5b1461068857806395d89b41146106b3578063a22cb465146106de57610224565b806366db6084146105975780636c0360eb146105c25780636ecd2306146105ed57806370a082311461060957610224565b80632796d139116101b157806349df728c1161017557806349df728c146104af5780634aac41e6146104d85780634e2d1c86146105015780634f6ccce71461051d5780636352211e1461055a57610224565b80632796d139146103ca5780632f745c59146103f557806338e21cce146104325780633ccfd60b1461046f57806342842e0e1461048657610224565b8063081812fc116101f8578063081812fc146102e5578063095ea7b31461032257806318160ddd1461034b5780631959d9f81461037657806323b872dd146103a157610224565b80629a46fd1461022957806301ffc9a71461025257806306fdde031461028f57806307e89ec0146102ba575b600080fd5b34801561023557600080fd5b50610250600480360381019061024b9190613256565b6108c0565b005b34801561025e57600080fd5b50610279600480360381019061027491906132db565b610960565b6040516102869190613317565b60405180910390f35b34801561029b57600080fd5b506102a4610972565b6040516102b191906133cb565b60405180910390f35b3480156102c657600080fd5b506102cf610a04565b6040516102dc9190613406565b60405180910390f35b3480156102f157600080fd5b5061030c6004803603810190610307919061344d565b610a0f565b60405161031991906134bb565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613502565b610a94565b005b34801561035757600080fd5b50610360610bac565b60405161036d9190613406565b60405180910390f35b34801561038257600080fd5b5061038b610bb9565b6040516103989190613317565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613542565b610bcc565b005b3480156103d657600080fd5b506103df610c2c565b6040516103ec9190613406565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613502565b610c33565b6040516104299190613406565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613595565b610cd8565b6040516104669190613317565b60405180910390f35b34801561047b57600080fd5b50610484610cf8565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613542565b610dc3565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613600565b610de3565b005b3480156104e457600080fd5b506104ff60048036038101906104fa919061344d565b610f60565b005b61051b60048036038101906105169190613692565b610fe6565b005b34801561052957600080fd5b50610544600480360381019061053f919061344d565b61129a565b6040516105519190613406565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c919061344d565b61130b565b60405161058e91906134bb565b60405180910390f35b3480156105a357600080fd5b506105ac6113bd565b6040516105b99190613317565b60405180910390f35b3480156105ce57600080fd5b506105d76113d0565b6040516105e491906133cb565b60405180910390f35b61060760048036038101906106029190613718565b61145e565b005b34801561061557600080fd5b50610630600480360381019061062b9190613595565b6115f5565b60405161063d9190613406565b60405180910390f35b34801561065257600080fd5b5061065b6116ad565b005b34801561066957600080fd5b50610672611735565b60405161067f9190613406565b60405180910390f35b34801561069457600080fd5b5061069d61173b565b6040516106aa91906134bb565b60405180910390f35b3480156106bf57600080fd5b506106c8611765565b6040516106d591906133cb565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190613745565b6117f7565b005b610721600480360381019061071c9190613718565b61180d565b005b34801561072f57600080fd5b506107386119c2565b604051610745919061379e565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906138e9565b6119c8565b005b34801561078357600080fd5b5061079e6004803603810190610799919061344d565b611a2a565b6040516107ab91906133cb565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d69190613998565b611ae4565b005b3480156107e957600080fd5b5061080460048036038101906107ff9190613a66565b611b6a565b005b34801561081257600080fd5b5061082d60048036038101906108289190613aaf565b611c00565b60405161083a9190613317565b60405180910390f35b34801561084f57600080fd5b5061086a60048036038101906108659190613256565b611c94565b005b34801561087857600080fd5b50610881611d2d565b60405161088e9190613406565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b99190613595565b611d33565b005b6108c8611e2b565b73ffffffffffffffffffffffffffffffffffffffff166108e661173b565b73ffffffffffffffffffffffffffffffffffffffff161461093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390613b3b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555042600f8190555050565b600061096b82611e33565b9050919050565b60606000805461098190613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546109ad90613b8a565b80156109fa5780601f106109cf576101008083540402835291602001916109fa565b820191906000526020600020905b8154815290600101906020018083116109dd57829003601f168201915b5050505050905090565b666a94d74f43000081565b6000610a1a82611ead565b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090613c2e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9f8261130b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790613cc0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2f611e2b565b73ffffffffffffffffffffffffffffffffffffffff161480610b5e5750610b5d81610b58611e2b565b611c00565b5b610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490613d52565b60405180910390fd5b610ba78383611f19565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610bdd610bd7611e2b565b82611fd2565b610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390613de4565b60405180910390fd5b610c278383836120b0565b505050565b6212750081565b6000610c3e836115f5565b8210610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690613e76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60126020528060005260406000206000915054906101000a900460ff1681565b610d00611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610d1e61173b565b73ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90613b3b565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dbf573d6000803e3d6000fd5b5050565b610dde838383604051806020016040528060008152506119c8565b505050565b610deb611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610e0961173b565b73ffffffffffffffffffffffffffffffffffffffff1614610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690613b3b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e9a91906134bb565b602060405180830381865afa158015610eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edb9190613eab565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610f18929190613ed8565b6020604051808303816000875af1158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190613f16565b505050565b610f68611e2b565b73ffffffffffffffffffffffffffffffffffffffff16610f8661173b565b73ffffffffffffffffffffffffffffffffffffffff1614610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390613b3b565b60405180910390fd5b80600e8190555050565b6002600b54141561102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613f8f565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a90613ffb565b60405180910390fd5b6001600e5481611093600c612317565b61109d919061404a565b11156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d5906140ec565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614158565b60405180910390fd5b82826011546111e2838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082336040516020016111c791906141c0565b60405160208183030381529060405280519060200120612325565b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890614227565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061128a3361128561233c565b612357565b505050506001600b819055505050565b60006112a4610bac565b82106112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc906142b9565b60405180910390fd5b600882815481106112f9576112f86142d9565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab9061437a565b60405180910390fd5b80915050919050565b601060019054906101000a900460ff1681565b600d80546113dd90613b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461140990613b8a565b80156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b505050505081565b6002600b5414156114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90613f8f565b60405180910390fd5b6002600b819055508060ff16600e54816114be600c612317565b6114c8919061404a565b1115611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906140ec565b60405180910390fd5b666a94d74f4300008260ff16348183611522919061439a565b14611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990614440565b60405180910390fd5b62127500600f54611573919061404a565b42116115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906144ac565b60405180910390fd5b60005b8460ff168110156115e6576115d3336115ce61233c565b612357565b80806115de906144cc565b9150506115b7565b505050506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d90614587565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b5611e2b565b73ffffffffffffffffffffffffffffffffffffffff166116d361173b565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090613b3b565b60405180910390fd5b6117336000612375565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461177490613b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546117a090613b8a565b80156117ed5780601f106117c2576101008083540402835291602001916117ed565b820191906000526020600020905b8154815290600101906020018083116117d057829003601f168201915b5050505050905090565b611809611802611e2b565b838361243b565b5050565b6002600b541415611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613f8f565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff166118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613ffb565b60405180910390fd5b8060ff16600e54816118bc600c612317565b6118c6919061404a565b1115611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe906140ec565b60405180910390fd5b61190f611e2b565b73ffffffffffffffffffffffffffffffffffffffff1661192d61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613b3b565b60405180910390fd5b60005b8260ff168110156119b5576119a23361199d61233c565b612357565b80806119ad906144cc565b915050611986565b50506001600b8190555050565b60115481565b6119d96119d3611e2b565b83611fd2565b611a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0f90613de4565b60405180910390fd5b611a24848484846125a8565b50505050565b6060611a3582611ead565b611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b906145f3565b60405180910390fd5b601060019054906101000a900460ff1615611ab157600d604051602001611a9b91906146fe565b6040516020818303038152906040529050611adf565b600d611abc83612604565b604051602001611acd92919061479d565b60405160208183030381529060405290505b919050565b611aec611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611b0a61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613b3b565b60405180910390fd5b8060118190555050565b611b72611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611b9061173b565b73ffffffffffffffffffffffffffffffffffffffff1614611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90613b3b565b60405180910390fd5b80600d9080519060200190611bfc929190613167565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9c611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611cba61173b565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613b3b565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b600e5481565b611d3b611e2b565b73ffffffffffffffffffffffffffffffffffffffff16611d5961173b565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613b3b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e169061483e565b60405180910390fd5b611e2881612375565b50565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ea65750611ea582612765565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f8c8361130b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fdd82611ead565b61201c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612013906148d0565b60405180910390fd5b60006120278361130b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206957506120688185611c00565b5b806120a757508373ffffffffffffffffffffffffffffffffffffffff1661208f84610a0f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d08261130b565b73ffffffffffffffffffffffffffffffffffffffff1614612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d90614962565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d906149f4565b60405180910390fd5b6121a1838383612847565b6121ac600082611f19565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121fc9190614a14565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612253919061404a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612312838383612857565b505050565b600081600001549050919050565b600082612332858461285c565b1490509392505050565b6000612348600c6128d1565b612352600c612317565b905090565b6123718282604051806020016040528060008152506128e7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614a94565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161259b9190613317565b60405180910390a3505050565b6125b38484846120b0565b6125bf84848484612942565b6125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614b26565b60405180910390fd5b50505050565b6060600082141561264c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612760565b600082905060005b6000821461267e578080612667906144cc565b915050600a826126779190614b75565b9150612654565b60008167ffffffffffffffff81111561269a576126996137be565b5b6040519080825280601f01601f1916602001820160405280156126cc5781602001600182028036833780820191505090505b5090505b60008514612759576001826126e59190614a14565b9150600a856126f49190614ba6565b6030612700919061404a565b60f81b818381518110612716576127156142d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127529190614b75565b94506126d0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061283057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612840575061283f82612aca565b5b9050919050565b612852838383612b34565b505050565b505050565b60008082905060005b84518110156128c6576000858281518110612883576128826142d9565b5b602002602001015190508083116128a55761289e8382612c48565b92506128b2565b6128af8184612c48565b92505b5080806128be906144cc565b915050612865565b508091505092915050565b6001816000016000828254019250508190555050565b6128f18383612c5f565b6128fe6000848484612942565b61293d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293490614b26565b60405180910390fd5b505050565b60006129638473ffffffffffffffffffffffffffffffffffffffff16612e39565b15612abd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261298c611e2b565b8786866040518563ffffffff1660e01b81526004016129ae9493929190614c2c565b6020604051808303816000875af19250505080156129ea57506040513d601f19601f820116820180604052508101906129e79190614c8d565b60015b612a6d573d8060008114612a1a576040519150601f19603f3d011682016040523d82523d6000602084013e612a1f565b606091505b50600081511415612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614b26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ac2565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b3f838383612e5c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b8257612b7d81612e61565b612bc1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bc057612bbf8382612eaa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c0457612bff81613017565b612c43565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c4257612c4182826130e8565b5b5b505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc690614d06565b60405180910390fd5b612cd881611ead565b15612d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0f90614d72565b60405180910390fd5b612d2460008383612847565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d74919061404a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3560008383612857565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eb7846115f5565b612ec19190614a14565b9050600060076000848152602001908152602001600020549050818114612fa6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061302b9190614a14565b905060006009600084815260200190815260200160002054905060006008838154811061305b5761305a6142d9565b5b90600052602060002001549050806008838154811061307d5761307c6142d9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130cc576130cb614d92565b5b6001900381819060005260206000200160009055905550505050565b60006130f3836115f5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461317390613b8a565b90600052602060002090601f01602090048101928261319557600085556131dc565b82601f106131ae57805160ff19168380011785556131dc565b828001600101855582156131dc579182015b828111156131db5782518255916020019190600101906131c0565b5b5090506131e991906131ed565b5090565b5b808211156132065760008160009055506001016131ee565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6132338161321e565b811461323e57600080fd5b50565b6000813590506132508161322a565b92915050565b60006020828403121561326c5761326b613214565b5b600061327a84828501613241565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132b881613283565b81146132c357600080fd5b50565b6000813590506132d5816132af565b92915050565b6000602082840312156132f1576132f0613214565b5b60006132ff848285016132c6565b91505092915050565b6133118161321e565b82525050565b600060208201905061332c6000830184613308565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561336c578082015181840152602081019050613351565b8381111561337b576000848401525b50505050565b6000601f19601f8301169050919050565b600061339d82613332565b6133a7818561333d565b93506133b781856020860161334e565b6133c081613381565b840191505092915050565b600060208201905081810360008301526133e58184613392565b905092915050565b6000819050919050565b613400816133ed565b82525050565b600060208201905061341b60008301846133f7565b92915050565b61342a816133ed565b811461343557600080fd5b50565b60008135905061344781613421565b92915050565b60006020828403121561346357613462613214565b5b600061347184828501613438565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134a58261347a565b9050919050565b6134b58161349a565b82525050565b60006020820190506134d060008301846134ac565b92915050565b6134df8161349a565b81146134ea57600080fd5b50565b6000813590506134fc816134d6565b92915050565b6000806040838503121561351957613518613214565b5b6000613527858286016134ed565b925050602061353885828601613438565b9150509250929050565b60008060006060848603121561355b5761355a613214565b5b6000613569868287016134ed565b935050602061357a868287016134ed565b925050604061358b86828701613438565b9150509250925092565b6000602082840312156135ab576135aa613214565b5b60006135b9848285016134ed565b91505092915050565b60006135cd8261349a565b9050919050565b6135dd816135c2565b81146135e857600080fd5b50565b6000813590506135fa816135d4565b92915050565b60006020828403121561361657613615613214565b5b6000613624848285016135eb565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136525761365161362d565b5b8235905067ffffffffffffffff81111561366f5761366e613632565b5b60208301915083602082028301111561368b5761368a613637565b5b9250929050565b600080602083850312156136a9576136a8613214565b5b600083013567ffffffffffffffff8111156136c7576136c6613219565b5b6136d38582860161363c565b92509250509250929050565b600060ff82169050919050565b6136f5816136df565b811461370057600080fd5b50565b600081359050613712816136ec565b92915050565b60006020828403121561372e5761372d613214565b5b600061373c84828501613703565b91505092915050565b6000806040838503121561375c5761375b613214565b5b600061376a858286016134ed565b925050602061377b85828601613241565b9150509250929050565b6000819050919050565b61379881613785565b82525050565b60006020820190506137b3600083018461378f565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137f682613381565b810181811067ffffffffffffffff82111715613815576138146137be565b5b80604052505050565b600061382861320a565b905061383482826137ed565b919050565b600067ffffffffffffffff821115613854576138536137be565b5b61385d82613381565b9050602081019050919050565b82818337600083830152505050565b600061388c61388784613839565b61381e565b9050828152602081018484840111156138a8576138a76137b9565b5b6138b384828561386a565b509392505050565b600082601f8301126138d0576138cf61362d565b5b81356138e0848260208601613879565b91505092915050565b6000806000806080858703121561390357613902613214565b5b6000613911878288016134ed565b9450506020613922878288016134ed565b935050604061393387828801613438565b925050606085013567ffffffffffffffff81111561395457613953613219565b5b613960878288016138bb565b91505092959194509250565b61397581613785565b811461398057600080fd5b50565b6000813590506139928161396c565b92915050565b6000602082840312156139ae576139ad613214565b5b60006139bc84828501613983565b91505092915050565b600067ffffffffffffffff8211156139e0576139df6137be565b5b6139e982613381565b9050602081019050919050565b6000613a09613a04846139c5565b61381e565b905082815260208101848484011115613a2557613a246137b9565b5b613a3084828561386a565b509392505050565b600082601f830112613a4d57613a4c61362d565b5b8135613a5d8482602086016139f6565b91505092915050565b600060208284031215613a7c57613a7b613214565b5b600082013567ffffffffffffffff811115613a9a57613a99613219565b5b613aa684828501613a38565b91505092915050565b60008060408385031215613ac657613ac5613214565b5b6000613ad4858286016134ed565b9250506020613ae5858286016134ed565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b2560208361333d565b9150613b3082613aef565b602082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ba257607f821691505b60208210811415613bb657613bb5613b5b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c18602c8361333d565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613caa60218361333d565b9150613cb582613c4e565b604082019050919050565b60006020820190508181036000830152613cd981613c9d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d3c60388361333d565b9150613d4782613ce0565b604082019050919050565b60006020820190508181036000830152613d6b81613d2f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613dce60318361333d565b9150613dd982613d72565b604082019050919050565b60006020820190508181036000830152613dfd81613dc1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e60602b8361333d565b9150613e6b82613e04565b604082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b600081519050613ea581613421565b92915050565b600060208284031215613ec157613ec0613214565b5b6000613ecf84828501613e96565b91505092915050565b6000604082019050613eed60008301856134ac565b613efa60208301846133f7565b9392505050565b600081519050613f108161322a565b92915050565b600060208284031215613f2c57613f2b613214565b5b6000613f3a84828501613f01565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f79601f8361333d565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4f472073616c65206973206e6f74206f70656e00000000000000000000000000600082015250565b6000613fe560138361333d565b9150613ff082613faf565b602082019050919050565b6000602082019050818103600083015261401481613fd8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614055826133ed565b9150614060836133ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140955761409461401b565b5b828201905092915050565b7f4e6f204772756773204c65667400000000000000000000000000000000000000600082015250565b60006140d6600d8361333d565b91506140e1826140a0565b602082019050919050565b60006020820190508181036000830152614105816140c9565b9050919050565b7f416c7265616479204d696e746564000000000000000000000000000000000000600082015250565b6000614142600e8361333d565b915061414d8261410c565b602082019050919050565b6000602082019050818103600083015261417181614135565b9050919050565b60008160601b9050919050565b600061419082614178565b9050919050565b60006141a282614185565b9050919050565b6141ba6141b58261349a565b614197565b82525050565b60006141cc82846141a9565b60148201915081905092915050565b7f4164647265737320646f6573206e6f74206578697374206f6e206c6973740000600082015250565b6000614211601e8361333d565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142a3602c8361333d565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061436460298361333d565b915061436f82614308565b604082019050919050565b6000602082019050818103600083015261439381614357565b9050919050565b60006143a5826133ed565b91506143b0836133ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e9576143e861401b565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061442a60188361333d565b9150614435826143f4565b602082019050919050565b600060208201905081810360008301526144598161441d565b9050919050565b7f7075626c6963206d696e74206e6f742073746172746564000000000000000000600082015250565b600061449660178361333d565b91506144a182614460565b602082019050919050565b600060208201905081810360008301526144c581614489565b9050919050565b60006144d7826133ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450a5761450961401b565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614571602a8361333d565b915061457c82614515565b604082019050919050565b600060208201905081810360008301526145a081614564565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006145dd60118361333d565b91506145e8826145a7565b602082019050919050565b6000602082019050818103600083015261460c816145d0565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461464081613b8a565b61464a8186614613565b945060018216600081146146655760018114614676576146a9565b60ff198316865281860193506146a9565b61467f8561461e565b60005b838110156146a157815481890152600182019150602081019050614682565b838801955050505b50505092915050565b7f2f31303030303030300000000000000000000000000000000000000000000000600082015250565b60006146e8600983614613565b91506146f3826146b2565b600982019050919050565b600061470a8284614633565b9150614715826146db565b915081905092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614756600183614613565b915061476182614720565b600182019050919050565b600061477782613332565b6147818185614613565b935061479181856020860161334e565b80840191505092915050565b60006147a98285614633565b91506147b482614749565b91506147c0828461476c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061482860268361333d565b9150614833826147cc565b604082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006148ba602c8361333d565b91506148c58261485e565b604082019050919050565b600060208201905081810360008301526148e9816148ad565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061494c60258361333d565b9150614957826148f0565b604082019050919050565b6000602082019050818103600083015261497b8161493f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149de60248361333d565b91506149e982614982565b604082019050919050565b60006020820190508181036000830152614a0d816149d1565b9050919050565b6000614a1f826133ed565b9150614a2a836133ed565b925082821015614a3d57614a3c61401b565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a7e60198361333d565b9150614a8982614a48565b602082019050919050565b60006020820190508181036000830152614aad81614a71565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b1060328361333d565b9150614b1b82614ab4565b604082019050919050565b60006020820190508181036000830152614b3f81614b03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b80826133ed565b9150614b8b836133ed565b925082614b9b57614b9a614b46565b5b828204905092915050565b6000614bb1826133ed565b9150614bbc836133ed565b925082614bcc57614bcb614b46565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614bfe82614bd7565b614c088185614be2565b9350614c1881856020860161334e565b614c2181613381565b840191505092915050565b6000608082019050614c4160008301876134ac565b614c4e60208301866134ac565b614c5b60408301856133f7565b8181036060830152614c6d8184614bf3565b905095945050505050565b600081519050614c87816132af565b92915050565b600060208284031215614ca357614ca2613214565b5b6000614cb184828501614c78565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614cf060208361333d565b9150614cfb82614cba565b602082019050919050565b60006020820190508181036000830152614d1f81614ce3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d5c601c8361333d565b9150614d6782614d26565b602082019050919050565b60006020820190508181036000830152614d8b81614d4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c35bcbf9c84f315fbc451419b3b80084cdec7768a5cb7b44e9f3c5e82661f36e64736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _maxGrugs (uint256): 1000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

542:4873:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3569:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5208:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;874:54:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4000:217:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3538:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;986:26:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4727:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;934:46:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1291:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1163:41:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4172:140;;;;;;;;;;;;;:::i;:::-;;5123:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4318:165:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3473:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2350:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1798:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2191:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1018:20:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;788:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2675:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1929:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;844:24:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4284:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3116:297:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1091:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5368:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4533:454:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3711:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3924:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4503:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3825:93:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;815:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3569:136:17;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3655:6:17::1;3638:14;;:23;;;;;;;;;;;;;;;;;;3683:15;3671:9;:27;;;;3569:136:::0;:::o;5208:205::-;5343:4;5370:36;5394:11;5370:23;:36::i;:::-;5363:43;;5208:205;;;:::o;2488:98:4:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;874:54:17:-;918:10;874:54;:::o;4000:217:4:-;4076:7;4103:16;4111:7;4103;:16::i;:::-;4095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4186:15;:24;4202:7;4186:24;;;;;;;;;;;;;;;;;;;;;4179:31;;4000:217;;;:::o;3538:401::-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;3675:11;;:2;:11;;;;3667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3772:5;3756:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3781:37;3798:5;3805:12;:10;:12::i;:::-;3781:16;:37::i;:::-;3756:62;3735:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3608:331;3538:401;;:::o;1615:111:7:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;986:26:17:-;;;;;;;;;;;;;:::o;4727:330:4:-;4916:41;4935:12;:10;:12::i;:::-;4949:7;4916:18;:41::i;:::-;4908:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;:::-;4727:330;;;:::o;934:46:17:-;973:7;934:46;:::o;1291:253:7:-;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;1163:41:17:-;;;;;;;;;;;;;;;;;;;;;;:::o;4172:140::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4219:15:17::1;4237:21;4219:39;;4276:10;4268:28;;:37;4297:7;4268:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4209:103;4172:140::o:0;5123:179:4:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;:::-;5123:179;;;:::o;4318:165:17:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4383:15:17::1;4401:5;:15;;;4425:4;4401:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4383:48;;4441:5;:14;;;4456:10;4468:7;4441:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4373:110;4318:165:::0;:::o;3473:90::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3550:6:17::1;3539:8;:17;;;;3473:90:::0;:::o;2350:319::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1302:14:17::1;;;;;;;;;;;1294:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2496:1:::2;1487:8;;1469:14;1441:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1420:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;2129:9:::3;:21;2139:10;2129:21;;;;;;;;;;;;;;;;;;;;;;;;;2128:22;2120:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;2547:11:::4;;2560:12;;1867:140;1903:11;;1867:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1932:4;1981:10;1964:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1954:39;;;;;;1867:18;:140::i;:::-;1846:217;;;;;;;;;;;;:::i;:::-;;;;;;;;;2612:4:::5;2588:9;:21;2598:10;2588:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2626:36;2636:10;2648:13;:11;:13::i;:::-;2626:9;:36::i;:::-;2179:1:::4;;;1350::::2;1701::2::0;2628:7;:22;;;;2350:319:17;;:::o;1798:230:7:-;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;2191:235:4:-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;1018:20:17:-;;;;;;;;;;;;;:::o;788:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2675:435::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2786:14:17::1;1364:188;;1487:8;;1469:14;1441:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1420:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;918:10:::2;2846:14;1557:199;;1679:9;1661:14;1653:5;:22;;;;:::i;:::-;:35;1632:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;973:7:::3;2915:9;;:24;;;;:::i;:::-;2897:15;:42;2876:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;3003:9;2998:106;3022:14;3018:18;;:1;:18;2998:106;;;3057:36;3067:10;3079:13;:11;:13::i;:::-;3057:9;:36::i;:::-;3038:3;;;;;:::i;:::-;;;;2998:106;;;;1544:1:::2;;2484::2::1;1701::::0;2628:7;:22;;;;2675:435:17;:::o;1929:205:4:-;2001:7;2045:1;2028:19;;:5;:19;;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;844:24:17:-;;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2650:102:4:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;4284:153::-;4378:52;4397:12;:10;:12::i;:::-;4411:8;4421;4378:18;:52::i;:::-;4284:153;;:::o;3116:297:17:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1302:14:17::1;;;;;;;;;;;1294:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3253:14:::2;1364:188;;1487:8;;1469:14;1441:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1420:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1259:12:0::3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3306:9:17::4;3301:106;3325:14;3321:18;;:1;:18;3301:106;;;3360:36;3370:10;3382:13;:11;:13::i;:::-;3360:9;:36::i;:::-;3341:3;;;;;:::i;:::-;;;;3301:106;;;;1350:1:::2;1701::2::0;2628:7;:22;;;;3116:297:17;:::o;1091:27::-;;;;:::o;5368:320:4:-;5537:41;5556:12;:10;:12::i;:::-;5570:7;5537:18;:41::i;:::-;5529:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;4533:454:17:-;4646:13;4683:16;4691:7;4683;:16::i;:::-;4675:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4736:8;;;;;;;;;;;4732:249;;;4791:7;4774:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;4760:53;;;;4732:249;4912:7;4926:25;4943:7;4926:16;:25::i;:::-;4895:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4844:126;;4533:454;;;;:::o;3711:108::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3801:11:17::1;3786:12;:26;;;;3711:108:::0;:::o;3924:101::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4009:9:17::1;3999:7;:19;;;;;;;;;;;;:::i;:::-;;3924:101:::0;:::o;4503:162:4:-;4600:4;4623:18;:25;4642:5;4623:25;;;;;;;;;;;;;;;:35;4649:8;4623:35;;;;;;;;;;;;;;;;;;;;;;;;;4616:42;;4503:162;;;;:::o;3825:93:17:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3902:9:17::1;3891:8;;:20;;;;;;;;;;;;;;;;;;3825:93:::0;:::o;815:23::-;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;990:222:7:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;7160:125:4:-;7225:4;7276:1;7248:30;;:7;:16;7256:7;7248:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7241:37;;7160:125;;;:::o;11169:171::-;11270:2;11243:15;:24;11259:7;11243:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11325:7;11321:2;11287:46;;11296:23;11311:7;11296:14;:23::i;:::-;11287:46;;;;;;;;;;;;11169:171;;:::o;7443:344::-;7536:4;7560:16;7568:7;7560;:16::i;:::-;7552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;7692:16;;:7;:16;;;:52;;;;7712:32;7729:5;7736:7;7712:16;:32::i;:::-;7692:52;:87;;;;7772:7;7748:31;;:20;7760:7;7748:11;:20::i;:::-;:31;;;7692:87;7684:96;;;7443:344;;;;:::o;10453:605::-;10607:4;10580:31;;:23;10595:7;10580:14;:23::i;:::-;:31;;;10572:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10685:1;10671:16;;:2;:16;;;;10663:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;10899:1;10880:9;:15;10890:4;10880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10927:1;10910:9;:13;10920:2;10910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10957:2;10938:7;:16;10946:7;10938:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10994:7;10990:2;10975:27;;10984:4;10975:27;;;;;;;;;;;;11013:38;11033:4;11039:2;11043:7;11013:19;:38::i;:::-;10453:605;;;:::o;827:112:12:-;892:7;918;:14;;;911:21;;827:112;;;:::o;1154:184:14:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;4031:135:17:-;4071:7;4090:27;:15;:25;:27::i;:::-;4134:25;:15;:23;:25::i;:::-;4127:32;;4031:135;:::o;8117:108:4:-;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;:::-;8117:108;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;11475:307:4:-;11625:8;11616:17;;:5;:17;;;;11608:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11711:8;11673:18;:25;11692:5;11673:25;;;;;;;;;;;;;;;:35;11699:8;11673:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11756:8;11734:41;;11749:5;11734:41;;;11766:8;11734:41;;;;;;:::i;:::-;;;;;;;;11475:307;;;:::o;6550:::-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6550:307;;;;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1570:300:4:-;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;4993:209:17:-;5150:45;5177:4;5183:2;5187:7;5150:26;:45::i;:::-;4993:209;;;:::o;14163:121:4:-;;;;:::o;1689:662:14:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;945:123:12:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8446:311:4:-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8446:311;;;:::o;12335:778::-;12485:4;12505:15;:2;:13;;;:15::i;:::-;12501:606;;;12556:2;12540:36;;;12577:12;:10;:12::i;:::-;12591:4;12597:7;12606:5;12540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12796:1;12779:6;:13;:18;12775:266;;;12821:60;;;;;;;;;;:::i;:::-;;;;;;;;12775:266;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;12672:41;;;12662:51;;;:6;:51;;;;12655:58;;;;;12501:606;13092:4;13085:11;;12335:778;;;;;;;:::o;829:155:15:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2624:572:7:-;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;2357:218:14:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;9079:427:4:-;9172:1;9158:16;;:2;:16;;;;9150:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;9363:1;9346:9;:13;9356:2;9346:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9393:2;9374:7;:16;9382:7;9374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9436:7;9432:2;9411:33;;9428:1;9411:33;;;;;;;;;;;;9455:44;9483:1;9487:2;9491:7;9455:19;:44::i;:::-;9079:427;;:::o;1175:320:10:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;13669:122:4:-;;;;:::o;3902:161:7:-;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;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;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:90;368:7;411:5;404:13;397:21;386:32;;334:90;;;:::o;430:116::-;500:21;515:5;500:21;:::i;:::-;493:5;490:32;480:60;;536:1;533;526:12;480:60;430:116;:::o;552:133::-;595:5;633:6;620:20;611:29;;649:30;673:5;649:30;:::i;:::-;552:133;;;;:::o;691:323::-;747:6;796:2;784:9;775:7;771:23;767:32;764:119;;;802:79;;:::i;:::-;764:119;922:1;947:50;989:7;980:6;969:9;965:22;947:50;:::i;:::-;937:60;;893:114;691:323;;;;:::o;1020:149::-;1056:7;1096:66;1089:5;1085:78;1074:89;;1020:149;;;:::o;1175:120::-;1247:23;1264:5;1247:23;:::i;:::-;1240:5;1237:34;1227:62;;1285:1;1282;1275:12;1227:62;1175:120;:::o;1301:137::-;1346:5;1384:6;1371:20;1362:29;;1400:32;1426:5;1400:32;:::i;:::-;1301:137;;;;:::o;1444:327::-;1502:6;1551:2;1539:9;1530:7;1526:23;1522:32;1519:119;;;1557:79;;:::i;:::-;1519:119;1677:1;1702:52;1746:7;1737:6;1726:9;1722:22;1702:52;:::i;:::-;1692:62;;1648:116;1444:327;;;;:::o;1777:109::-;1858:21;1873:5;1858:21;:::i;:::-;1853:3;1846:34;1777:109;;:::o;1892:210::-;1979:4;2017:2;2006:9;2002:18;1994:26;;2030:65;2092:1;2081:9;2077:17;2068:6;2030:65;:::i;:::-;1892:210;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:118::-;3668:24;3686:5;3668:24;:::i;:::-;3663:3;3656:37;3581:118;;:::o;3705:222::-;3798:4;3836:2;3825:9;3821:18;3813:26;;3849:71;3917:1;3906:9;3902:17;3893:6;3849:71;:::i;:::-;3705:222;;;;:::o;3933:122::-;4006:24;4024:5;4006:24;:::i;:::-;3999:5;3996:35;3986:63;;4045:1;4042;4035:12;3986:63;3933:122;:::o;4061:139::-;4107:5;4145:6;4132:20;4123:29;;4161:33;4188:5;4161:33;:::i;:::-;4061:139;;;;:::o;4206:329::-;4265:6;4314:2;4302:9;4293:7;4289:23;4285:32;4282:119;;;4320:79;;:::i;:::-;4282:119;4440:1;4465:53;4510:7;4501:6;4490:9;4486:22;4465:53;:::i;:::-;4455:63;;4411:117;4206:329;;;;:::o;4541:126::-;4578:7;4618:42;4611:5;4607:54;4596:65;;4541:126;;;:::o;4673:96::-;4710:7;4739:24;4757:5;4739:24;:::i;:::-;4728:35;;4673:96;;;:::o;4775:118::-;4862:24;4880:5;4862:24;:::i;:::-;4857:3;4850:37;4775:118;;:::o;4899:222::-;4992:4;5030:2;5019:9;5015:18;5007:26;;5043:71;5111:1;5100:9;5096:17;5087:6;5043:71;:::i;:::-;4899:222;;;;:::o;5127:122::-;5200:24;5218:5;5200:24;:::i;:::-;5193:5;5190:35;5180:63;;5239:1;5236;5229:12;5180:63;5127:122;:::o;5255:139::-;5301:5;5339:6;5326:20;5317:29;;5355:33;5382:5;5355:33;:::i;:::-;5255:139;;;;:::o;5400:474::-;5468:6;5476;5525:2;5513:9;5504:7;5500:23;5496:32;5493:119;;;5531:79;;:::i;:::-;5493:119;5651:1;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5622:117;5778:2;5804:53;5849:7;5840:6;5829:9;5825:22;5804:53;:::i;:::-;5794:63;;5749:118;5400:474;;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:110::-;6891:7;6920:24;6938:5;6920:24;:::i;:::-;6909:35;;6840:110;;;:::o;6956:150::-;7043:38;7075:5;7043:38;:::i;:::-;7036:5;7033:49;7023:77;;7096:1;7093;7086:12;7023:77;6956:150;:::o;7112:167::-;7172:5;7210:6;7197:20;7188:29;;7226:47;7267:5;7226:47;:::i;:::-;7112:167;;;;:::o;7285:357::-;7358:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:119;;;7413:79;;:::i;:::-;7375:119;7533:1;7558:67;7617:7;7608:6;7597:9;7593:22;7558:67;:::i;:::-;7548:77;;7504:131;7285:357;;;;:::o;7648:117::-;7757:1;7754;7747:12;7771:117;7880:1;7877;7870:12;7894:117;8003:1;8000;7993:12;8034:568;8107:8;8117:6;8167:3;8160:4;8152:6;8148:17;8144:27;8134:122;;8175:79;;:::i;:::-;8134:122;8288:6;8275:20;8265:30;;8318:18;8310:6;8307:30;8304:117;;;8340:79;;:::i;:::-;8304:117;8454:4;8446:6;8442:17;8430:29;;8508:3;8500:4;8492:6;8488:17;8478:8;8474:32;8471:41;8468:128;;;8515:79;;:::i;:::-;8468:128;8034:568;;;;;:::o;8608:559::-;8694:6;8702;8751:2;8739:9;8730:7;8726:23;8722:32;8719:119;;;8757:79;;:::i;:::-;8719:119;8905:1;8894:9;8890:17;8877:31;8935:18;8927:6;8924:30;8921:117;;;8957:79;;:::i;:::-;8921:117;9070:80;9142:7;9133:6;9122:9;9118:22;9070:80;:::i;:::-;9052:98;;;;8848:312;8608:559;;;;;:::o;9173:86::-;9208:7;9248:4;9241:5;9237:16;9226:27;;9173:86;;;:::o;9265:118::-;9336:22;9352:5;9336:22;:::i;:::-;9329:5;9326:33;9316:61;;9373:1;9370;9363:12;9316:61;9265:118;:::o;9389:135::-;9433:5;9471:6;9458:20;9449:29;;9487:31;9512:5;9487:31;:::i;:::-;9389:135;;;;:::o;9530:325::-;9587:6;9636:2;9624:9;9615:7;9611:23;9607:32;9604:119;;;9642:79;;:::i;:::-;9604:119;9762:1;9787:51;9830:7;9821:6;9810:9;9806:22;9787:51;:::i;:::-;9777:61;;9733:115;9530:325;;;;:::o;9861:468::-;9926:6;9934;9983:2;9971:9;9962:7;9958:23;9954:32;9951:119;;;9989:79;;:::i;:::-;9951:119;10109:1;10134:53;10179:7;10170:6;10159:9;10155:22;10134:53;:::i;:::-;10124:63;;10080:117;10236:2;10262:50;10304:7;10295:6;10284:9;10280:22;10262:50;:::i;:::-;10252:60;;10207:115;9861:468;;;;;:::o;10335:77::-;10372:7;10401:5;10390:16;;10335:77;;;:::o;10418:118::-;10505:24;10523:5;10505:24;:::i;:::-;10500:3;10493:37;10418:118;;:::o;10542:222::-;10635:4;10673:2;10662:9;10658:18;10650:26;;10686:71;10754:1;10743:9;10739:17;10730:6;10686:71;:::i;:::-;10542:222;;;;:::o;10770:117::-;10879:1;10876;10869:12;10893:180;10941:77;10938:1;10931:88;11038:4;11035:1;11028:15;11062:4;11059:1;11052:15;11079:281;11162:27;11184:4;11162:27;:::i;:::-;11154:6;11150:40;11292:6;11280:10;11277:22;11256:18;11244:10;11241:34;11238:62;11235:88;;;11303:18;;:::i;:::-;11235:88;11343:10;11339:2;11332:22;11122:238;11079:281;;:::o;11366:129::-;11400:6;11427:20;;:::i;:::-;11417:30;;11456:33;11484:4;11476:6;11456:33;:::i;:::-;11366:129;;;:::o;11501:307::-;11562:4;11652:18;11644:6;11641:30;11638:56;;;11674:18;;:::i;:::-;11638:56;11712:29;11734:6;11712:29;:::i;:::-;11704:37;;11796:4;11790;11786:15;11778:23;;11501:307;;;:::o;11814:154::-;11898:6;11893:3;11888;11875:30;11960:1;11951:6;11946:3;11942:16;11935:27;11814:154;;;:::o;11974:410::-;12051:5;12076:65;12092:48;12133:6;12092:48;:::i;:::-;12076:65;:::i;:::-;12067:74;;12164:6;12157:5;12150:21;12202:4;12195:5;12191:16;12240:3;12231:6;12226:3;12222:16;12219:25;12216:112;;;12247:79;;:::i;:::-;12216:112;12337:41;12371:6;12366:3;12361;12337:41;:::i;:::-;12057:327;11974:410;;;;;:::o;12403:338::-;12458:5;12507:3;12500:4;12492:6;12488:17;12484:27;12474:122;;12515:79;;:::i;:::-;12474:122;12632:6;12619:20;12657:78;12731:3;12723:6;12716:4;12708:6;12704:17;12657:78;:::i;:::-;12648:87;;12464:277;12403:338;;;;:::o;12747:943::-;12842:6;12850;12858;12866;12915:3;12903:9;12894:7;12890:23;12886:33;12883:120;;;12922:79;;:::i;:::-;12883:120;13042:1;13067:53;13112:7;13103:6;13092:9;13088:22;13067:53;:::i;:::-;13057:63;;13013:117;13169:2;13195:53;13240:7;13231:6;13220:9;13216:22;13195:53;:::i;:::-;13185:63;;13140:118;13297:2;13323:53;13368:7;13359:6;13348:9;13344:22;13323:53;:::i;:::-;13313:63;;13268:118;13453:2;13442:9;13438:18;13425:32;13484:18;13476:6;13473:30;13470:117;;;13506:79;;:::i;:::-;13470:117;13611:62;13665:7;13656:6;13645:9;13641:22;13611:62;:::i;:::-;13601:72;;13396:287;12747:943;;;;;;;:::o;13696:122::-;13769:24;13787:5;13769:24;:::i;:::-;13762:5;13759:35;13749:63;;13808:1;13805;13798:12;13749:63;13696:122;:::o;13824:139::-;13870:5;13908:6;13895:20;13886:29;;13924:33;13951:5;13924:33;:::i;:::-;13824:139;;;;:::o;13969:329::-;14028:6;14077:2;14065:9;14056:7;14052:23;14048:32;14045:119;;;14083:79;;:::i;:::-;14045:119;14203:1;14228:53;14273:7;14264:6;14253:9;14249:22;14228:53;:::i;:::-;14218:63;;14174:117;13969:329;;;;:::o;14304:308::-;14366:4;14456:18;14448:6;14445:30;14442:56;;;14478:18;;:::i;:::-;14442:56;14516:29;14538:6;14516:29;:::i;:::-;14508:37;;14600:4;14594;14590:15;14582:23;;14304:308;;;:::o;14618:412::-;14696:5;14721:66;14737:49;14779:6;14737:49;:::i;:::-;14721:66;:::i;:::-;14712:75;;14810:6;14803:5;14796:21;14848:4;14841:5;14837:16;14886:3;14877:6;14872:3;14868:16;14865:25;14862:112;;;14893:79;;:::i;:::-;14862:112;14983:41;15017:6;15012:3;15007;14983:41;:::i;:::-;14702:328;14618:412;;;;;:::o;15050:340::-;15106:5;15155:3;15148:4;15140:6;15136:17;15132:27;15122:122;;15163:79;;:::i;:::-;15122:122;15280:6;15267:20;15305:79;15380:3;15372:6;15365:4;15357:6;15353:17;15305:79;:::i;:::-;15296:88;;15112:278;15050:340;;;;:::o;15396:509::-;15465:6;15514:2;15502:9;15493:7;15489:23;15485:32;15482:119;;;15520:79;;:::i;:::-;15482:119;15668:1;15657:9;15653:17;15640:31;15698:18;15690:6;15687:30;15684:117;;;15720:79;;:::i;:::-;15684:117;15825:63;15880:7;15871:6;15860:9;15856:22;15825:63;:::i;:::-;15815:73;;15611:287;15396:509;;;;:::o;15911:474::-;15979:6;15987;16036:2;16024:9;16015:7;16011:23;16007:32;16004:119;;;16042:79;;:::i;:::-;16004:119;16162:1;16187:53;16232:7;16223:6;16212:9;16208:22;16187:53;:::i;:::-;16177:63;;16133:117;16289:2;16315:53;16360:7;16351:6;16340:9;16336:22;16315:53;:::i;:::-;16305:63;;16260:118;15911:474;;;;;:::o;16391:182::-;16531:34;16527:1;16519:6;16515:14;16508:58;16391:182;:::o;16579:366::-;16721:3;16742:67;16806:2;16801:3;16742:67;:::i;:::-;16735:74;;16818:93;16907:3;16818:93;:::i;:::-;16936:2;16931:3;16927:12;16920:19;;16579:366;;;:::o;16951:419::-;17117:4;17155:2;17144:9;17140:18;17132:26;;17204:9;17198:4;17194:20;17190:1;17179:9;17175:17;17168:47;17232:131;17358:4;17232:131;:::i;:::-;17224:139;;16951:419;;;:::o;17376:180::-;17424:77;17421:1;17414:88;17521:4;17518:1;17511:15;17545:4;17542:1;17535:15;17562:320;17606:6;17643:1;17637:4;17633:12;17623:22;;17690:1;17684:4;17680:12;17711:18;17701:81;;17767:4;17759:6;17755:17;17745:27;;17701:81;17829:2;17821:6;17818:14;17798:18;17795:38;17792:84;;;17848:18;;:::i;:::-;17792:84;17613:269;17562:320;;;:::o;17888:231::-;18028:34;18024:1;18016:6;18012:14;18005:58;18097:14;18092:2;18084:6;18080:15;18073:39;17888:231;:::o;18125:366::-;18267:3;18288:67;18352:2;18347:3;18288:67;:::i;:::-;18281:74;;18364:93;18453:3;18364:93;:::i;:::-;18482:2;18477:3;18473:12;18466:19;;18125:366;;;:::o;18497:419::-;18663:4;18701:2;18690:9;18686:18;18678:26;;18750:9;18744:4;18740:20;18736:1;18725:9;18721:17;18714:47;18778:131;18904:4;18778:131;:::i;:::-;18770:139;;18497:419;;;:::o;18922:220::-;19062:34;19058:1;19050:6;19046:14;19039:58;19131:3;19126:2;19118:6;19114:15;19107:28;18922:220;:::o;19148:366::-;19290:3;19311:67;19375:2;19370:3;19311:67;:::i;:::-;19304:74;;19387:93;19476:3;19387:93;:::i;:::-;19505:2;19500:3;19496:12;19489:19;;19148:366;;;:::o;19520:419::-;19686:4;19724:2;19713:9;19709:18;19701:26;;19773:9;19767:4;19763:20;19759:1;19748:9;19744:17;19737:47;19801:131;19927:4;19801:131;:::i;:::-;19793:139;;19520:419;;;:::o;19945:243::-;20085:34;20081:1;20073:6;20069:14;20062:58;20154:26;20149:2;20141:6;20137:15;20130:51;19945:243;:::o;20194:366::-;20336:3;20357:67;20421:2;20416:3;20357:67;:::i;:::-;20350:74;;20433:93;20522:3;20433:93;:::i;:::-;20551:2;20546:3;20542:12;20535:19;;20194:366;;;:::o;20566:419::-;20732:4;20770:2;20759:9;20755:18;20747:26;;20819:9;20813:4;20809:20;20805:1;20794:9;20790:17;20783:47;20847:131;20973:4;20847:131;:::i;:::-;20839:139;;20566:419;;;:::o;20991:236::-;21131:34;21127:1;21119:6;21115:14;21108:58;21200:19;21195:2;21187:6;21183:15;21176:44;20991:236;:::o;21233:366::-;21375:3;21396:67;21460:2;21455:3;21396:67;:::i;:::-;21389:74;;21472:93;21561:3;21472:93;:::i;:::-;21590:2;21585:3;21581:12;21574:19;;21233:366;;;:::o;21605:419::-;21771:4;21809:2;21798:9;21794:18;21786:26;;21858:9;21852:4;21848:20;21844:1;21833:9;21829:17;21822:47;21886:131;22012:4;21886:131;:::i;:::-;21878:139;;21605:419;;;:::o;22030:230::-;22170:34;22166:1;22158:6;22154:14;22147:58;22239:13;22234:2;22226:6;22222:15;22215:38;22030:230;:::o;22266:366::-;22408:3;22429:67;22493:2;22488:3;22429:67;:::i;:::-;22422:74;;22505:93;22594:3;22505:93;:::i;:::-;22623:2;22618:3;22614:12;22607:19;;22266:366;;;:::o;22638:419::-;22804:4;22842:2;22831:9;22827:18;22819:26;;22891:9;22885:4;22881:20;22877:1;22866:9;22862:17;22855:47;22919:131;23045:4;22919:131;:::i;:::-;22911:139;;22638:419;;;:::o;23063:143::-;23120:5;23151:6;23145:13;23136:22;;23167:33;23194:5;23167:33;:::i;:::-;23063:143;;;;:::o;23212:351::-;23282:6;23331:2;23319:9;23310:7;23306:23;23302:32;23299:119;;;23337:79;;:::i;:::-;23299:119;23457:1;23482:64;23538:7;23529:6;23518:9;23514:22;23482:64;:::i;:::-;23472:74;;23428:128;23212:351;;;;:::o;23569:332::-;23690:4;23728:2;23717:9;23713:18;23705:26;;23741:71;23809:1;23798:9;23794:17;23785:6;23741:71;:::i;:::-;23822:72;23890:2;23879:9;23875:18;23866:6;23822:72;:::i;:::-;23569:332;;;;;:::o;23907:137::-;23961:5;23992:6;23986:13;23977:22;;24008:30;24032:5;24008:30;:::i;:::-;23907:137;;;;:::o;24050:345::-;24117:6;24166:2;24154:9;24145:7;24141:23;24137:32;24134:119;;;24172:79;;:::i;:::-;24134:119;24292:1;24317:61;24370:7;24361:6;24350:9;24346:22;24317:61;:::i;:::-;24307:71;;24263:125;24050:345;;;;:::o;24401:181::-;24541:33;24537:1;24529:6;24525:14;24518:57;24401:181;:::o;24588:366::-;24730:3;24751:67;24815:2;24810:3;24751:67;:::i;:::-;24744:74;;24827:93;24916:3;24827:93;:::i;:::-;24945:2;24940:3;24936:12;24929:19;;24588:366;;;:::o;24960:419::-;25126:4;25164:2;25153:9;25149:18;25141:26;;25213:9;25207:4;25203:20;25199:1;25188:9;25184:17;25177:47;25241:131;25367:4;25241:131;:::i;:::-;25233:139;;24960:419;;;:::o;25385:169::-;25525:21;25521:1;25513:6;25509:14;25502:45;25385:169;:::o;25560:366::-;25702:3;25723:67;25787:2;25782:3;25723:67;:::i;:::-;25716:74;;25799:93;25888:3;25799:93;:::i;:::-;25917:2;25912:3;25908:12;25901:19;;25560:366;;;:::o;25932:419::-;26098:4;26136:2;26125:9;26121:18;26113:26;;26185:9;26179:4;26175:20;26171:1;26160:9;26156:17;26149:47;26213:131;26339:4;26213:131;:::i;:::-;26205:139;;25932:419;;;:::o;26357:180::-;26405:77;26402:1;26395:88;26502:4;26499:1;26492:15;26526:4;26523:1;26516:15;26543:305;26583:3;26602:20;26620:1;26602:20;:::i;:::-;26597:25;;26636:20;26654:1;26636:20;:::i;:::-;26631:25;;26790:1;26722:66;26718:74;26715:1;26712:81;26709:107;;;26796:18;;:::i;:::-;26709:107;26840:1;26837;26833:9;26826:16;;26543:305;;;;:::o;26854:163::-;26994:15;26990:1;26982:6;26978:14;26971:39;26854:163;:::o;27023:366::-;27165:3;27186:67;27250:2;27245:3;27186:67;:::i;:::-;27179:74;;27262:93;27351:3;27262:93;:::i;:::-;27380:2;27375:3;27371:12;27364:19;;27023:366;;;:::o;27395:419::-;27561:4;27599:2;27588:9;27584:18;27576:26;;27648:9;27642:4;27638:20;27634:1;27623:9;27619:17;27612:47;27676:131;27802:4;27676:131;:::i;:::-;27668:139;;27395:419;;;:::o;27820:164::-;27960:16;27956:1;27948:6;27944:14;27937:40;27820:164;:::o;27990:366::-;28132:3;28153:67;28217:2;28212:3;28153:67;:::i;:::-;28146:74;;28229:93;28318:3;28229:93;:::i;:::-;28347:2;28342:3;28338:12;28331:19;;27990:366;;;:::o;28362:419::-;28528:4;28566:2;28555:9;28551:18;28543:26;;28615:9;28609:4;28605:20;28601:1;28590:9;28586:17;28579:47;28643:131;28769:4;28643:131;:::i;:::-;28635:139;;28362:419;;;:::o;28787:94::-;28820:8;28868:5;28864:2;28860:14;28839:35;;28787:94;;;:::o;28887:::-;28926:7;28955:20;28969:5;28955:20;:::i;:::-;28944:31;;28887:94;;;:::o;28987:100::-;29026:7;29055:26;29075:5;29055:26;:::i;:::-;29044:37;;28987:100;;;:::o;29093:157::-;29198:45;29218:24;29236:5;29218:24;:::i;:::-;29198:45;:::i;:::-;29193:3;29186:58;29093:157;;:::o;29256:256::-;29368:3;29383:75;29454:3;29445:6;29383:75;:::i;:::-;29483:2;29478:3;29474:12;29467:19;;29503:3;29496:10;;29256:256;;;;:::o;29518:180::-;29658:32;29654:1;29646:6;29642:14;29635:56;29518:180;:::o;29704:366::-;29846:3;29867:67;29931:2;29926:3;29867:67;:::i;:::-;29860:74;;29943:93;30032:3;29943:93;:::i;:::-;30061:2;30056:3;30052:12;30045:19;;29704:366;;;:::o;30076:419::-;30242:4;30280:2;30269:9;30265:18;30257:26;;30329:9;30323:4;30319:20;30315:1;30304:9;30300:17;30293:47;30357:131;30483:4;30357:131;:::i;:::-;30349:139;;30076:419;;;:::o;30501:231::-;30641:34;30637:1;30629:6;30625:14;30618:58;30710:14;30705:2;30697:6;30693:15;30686:39;30501:231;:::o;30738:366::-;30880:3;30901:67;30965:2;30960:3;30901:67;:::i;:::-;30894:74;;30977:93;31066:3;30977:93;:::i;:::-;31095:2;31090:3;31086:12;31079:19;;30738:366;;;:::o;31110:419::-;31276:4;31314:2;31303:9;31299:18;31291:26;;31363:9;31357:4;31353:20;31349:1;31338:9;31334:17;31327:47;31391:131;31517:4;31391:131;:::i;:::-;31383:139;;31110:419;;;:::o;31535:180::-;31583:77;31580:1;31573:88;31680:4;31677:1;31670:15;31704:4;31701:1;31694:15;31721:228;31861:34;31857:1;31849:6;31845:14;31838:58;31930:11;31925:2;31917:6;31913:15;31906:36;31721:228;:::o;31955:366::-;32097:3;32118:67;32182:2;32177:3;32118:67;:::i;:::-;32111:74;;32194:93;32283:3;32194:93;:::i;:::-;32312:2;32307:3;32303:12;32296:19;;31955:366;;;:::o;32327:419::-;32493:4;32531:2;32520:9;32516:18;32508:26;;32580:9;32574:4;32570:20;32566:1;32555:9;32551:17;32544:47;32608:131;32734:4;32608:131;:::i;:::-;32600:139;;32327:419;;;:::o;32752:348::-;32792:7;32815:20;32833:1;32815:20;:::i;:::-;32810:25;;32849:20;32867:1;32849:20;:::i;:::-;32844:25;;33037:1;32969:66;32965:74;32962:1;32959:81;32954:1;32947:9;32940:17;32936:105;32933:131;;;33044:18;;:::i;:::-;32933:131;33092:1;33089;33085:9;33074:20;;32752:348;;;;:::o;33106:174::-;33246:26;33242:1;33234:6;33230:14;33223:50;33106:174;:::o;33286:366::-;33428:3;33449:67;33513:2;33508:3;33449:67;:::i;:::-;33442:74;;33525:93;33614:3;33525:93;:::i;:::-;33643:2;33638:3;33634:12;33627:19;;33286:366;;;:::o;33658:419::-;33824:4;33862:2;33851:9;33847:18;33839:26;;33911:9;33905:4;33901:20;33897:1;33886:9;33882:17;33875:47;33939:131;34065:4;33939:131;:::i;:::-;33931:139;;33658:419;;;:::o;34083:173::-;34223:25;34219:1;34211:6;34207:14;34200:49;34083:173;:::o;34262:366::-;34404:3;34425:67;34489:2;34484:3;34425:67;:::i;:::-;34418:74;;34501:93;34590:3;34501:93;:::i;:::-;34619:2;34614:3;34610:12;34603:19;;34262:366;;;:::o;34634:419::-;34800:4;34838:2;34827:9;34823:18;34815:26;;34887:9;34881:4;34877:20;34873:1;34862:9;34858:17;34851:47;34915:131;35041:4;34915:131;:::i;:::-;34907:139;;34634:419;;;:::o;35059:233::-;35098:3;35121:24;35139:5;35121:24;:::i;:::-;35112:33;;35167:66;35160:5;35157:77;35154:103;;;35237:18;;:::i;:::-;35154:103;35284:1;35277:5;35273:13;35266:20;;35059:233;;;:::o;35298:229::-;35438:34;35434:1;35426:6;35422:14;35415:58;35507:12;35502:2;35494:6;35490:15;35483:37;35298:229;:::o;35533:366::-;35675:3;35696:67;35760:2;35755:3;35696:67;:::i;:::-;35689:74;;35772:93;35861:3;35772:93;:::i;:::-;35890:2;35885:3;35881:12;35874:19;;35533:366;;;:::o;35905:419::-;36071:4;36109:2;36098:9;36094:18;36086:26;;36158:9;36152:4;36148:20;36144:1;36133:9;36129:17;36122:47;36186:131;36312:4;36186:131;:::i;:::-;36178:139;;35905:419;;;:::o;36330:167::-;36470:19;36466:1;36458:6;36454:14;36447:43;36330:167;:::o;36503:366::-;36645:3;36666:67;36730:2;36725:3;36666:67;:::i;:::-;36659:74;;36742:93;36831:3;36742:93;:::i;:::-;36860:2;36855:3;36851:12;36844:19;;36503:366;;;:::o;36875:419::-;37041:4;37079:2;37068:9;37064:18;37056:26;;37128:9;37122:4;37118:20;37114:1;37103:9;37099:17;37092:47;37156:131;37282:4;37156:131;:::i;:::-;37148:139;;36875:419;;;:::o;37300:148::-;37402:11;37439:3;37424:18;;37300:148;;;;:::o;37454:141::-;37503:4;37526:3;37518:11;;37549:3;37546:1;37539:14;37583:4;37580:1;37570:18;37562:26;;37454:141;;;:::o;37625:845::-;37728:3;37765:5;37759:12;37794:36;37820:9;37794:36;:::i;:::-;37846:89;37928:6;37923:3;37846:89;:::i;:::-;37839:96;;37966:1;37955:9;37951:17;37982:1;37977:137;;;;38128:1;38123:341;;;;37944:520;;37977:137;38061:4;38057:9;38046;38042:25;38037:3;38030:38;38097:6;38092:3;38088:16;38081:23;;37977:137;;38123:341;38190:38;38222:5;38190:38;:::i;:::-;38250:1;38264:154;38278:6;38275:1;38272:13;38264:154;;;38352:7;38346:14;38342:1;38337:3;38333:11;38326:35;38402:1;38393:7;38389:15;38378:26;;38300:4;38297:1;38293:12;38288:17;;38264:154;;;38447:6;38442:3;38438:16;38431:23;;38130:334;;37944:520;;37732:738;;37625:845;;;;:::o;38476:159::-;38616:11;38612:1;38604:6;38600:14;38593:35;38476:159;:::o;38641:400::-;38801:3;38822:84;38904:1;38899:3;38822:84;:::i;:::-;38815:91;;38915:93;39004:3;38915:93;:::i;:::-;39033:1;39028:3;39024:11;39017:18;;38641:400;;;:::o;39047:535::-;39277:3;39299:92;39387:3;39378:6;39299:92;:::i;:::-;39292:99;;39408:148;39552:3;39408:148;:::i;:::-;39401:155;;39573:3;39566:10;;39047:535;;;;:::o;39588:151::-;39728:3;39724:1;39716:6;39712:14;39705:27;39588:151;:::o;39745:400::-;39905:3;39926:84;40008:1;40003:3;39926:84;:::i;:::-;39919:91;;40019:93;40108:3;40019:93;:::i;:::-;40137:1;40132:3;40128:11;40121:18;;39745:400;;;:::o;40151:377::-;40257:3;40285:39;40318:5;40285:39;:::i;:::-;40340:89;40422:6;40417:3;40340:89;:::i;:::-;40333:96;;40438:52;40483:6;40478:3;40471:4;40464:5;40460:16;40438:52;:::i;:::-;40515:6;40510:3;40506:16;40499:23;;40261:267;40151:377;;;;:::o;40534:695::-;40812:3;40834:92;40922:3;40913:6;40834:92;:::i;:::-;40827:99;;40943:148;41087:3;40943:148;:::i;:::-;40936:155;;41108:95;41199:3;41190:6;41108:95;:::i;:::-;41101:102;;41220:3;41213:10;;40534:695;;;;;:::o;41235:225::-;41375:34;41371:1;41363:6;41359:14;41352:58;41444:8;41439:2;41431:6;41427:15;41420:33;41235:225;:::o;41466:366::-;41608:3;41629:67;41693:2;41688:3;41629:67;:::i;:::-;41622:74;;41705:93;41794:3;41705:93;:::i;:::-;41823:2;41818:3;41814:12;41807:19;;41466:366;;;:::o;41838:419::-;42004:4;42042:2;42031:9;42027:18;42019:26;;42091:9;42085:4;42081:20;42077:1;42066:9;42062:17;42055:47;42119:131;42245:4;42119:131;:::i;:::-;42111:139;;41838:419;;;:::o;42263:231::-;42403:34;42399:1;42391:6;42387:14;42380:58;42472:14;42467:2;42459:6;42455:15;42448:39;42263:231;:::o;42500:366::-;42642:3;42663:67;42727:2;42722:3;42663:67;:::i;:::-;42656:74;;42739:93;42828:3;42739:93;:::i;:::-;42857:2;42852:3;42848:12;42841:19;;42500:366;;;:::o;42872:419::-;43038:4;43076:2;43065:9;43061:18;43053:26;;43125:9;43119:4;43115:20;43111:1;43100:9;43096:17;43089:47;43153:131;43279:4;43153:131;:::i;:::-;43145:139;;42872:419;;;:::o;43297:224::-;43437:34;43433:1;43425:6;43421:14;43414:58;43506:7;43501:2;43493:6;43489:15;43482:32;43297:224;:::o;43527:366::-;43669:3;43690:67;43754:2;43749:3;43690:67;:::i;:::-;43683:74;;43766:93;43855:3;43766:93;:::i;:::-;43884:2;43879:3;43875:12;43868:19;;43527:366;;;:::o;43899:419::-;44065:4;44103:2;44092:9;44088:18;44080:26;;44152:9;44146:4;44142:20;44138:1;44127:9;44123:17;44116:47;44180:131;44306:4;44180:131;:::i;:::-;44172:139;;43899:419;;;:::o;44324:223::-;44464:34;44460:1;44452:6;44448:14;44441:58;44533:6;44528:2;44520:6;44516:15;44509:31;44324:223;:::o;44553:366::-;44695:3;44716:67;44780:2;44775:3;44716:67;:::i;:::-;44709:74;;44792:93;44881:3;44792:93;:::i;:::-;44910:2;44905:3;44901:12;44894:19;;44553:366;;;:::o;44925:419::-;45091:4;45129:2;45118:9;45114:18;45106:26;;45178:9;45172:4;45168:20;45164:1;45153:9;45149:17;45142:47;45206:131;45332:4;45206:131;:::i;:::-;45198:139;;44925:419;;;:::o;45350:191::-;45390:4;45410:20;45428:1;45410:20;:::i;:::-;45405:25;;45444:20;45462:1;45444:20;:::i;:::-;45439:25;;45483:1;45480;45477:8;45474:34;;;45488:18;;:::i;:::-;45474:34;45533:1;45530;45526:9;45518:17;;45350:191;;;;:::o;45547:175::-;45687:27;45683:1;45675:6;45671:14;45664:51;45547:175;:::o;45728:366::-;45870:3;45891:67;45955:2;45950:3;45891:67;:::i;:::-;45884:74;;45967:93;46056:3;45967:93;:::i;:::-;46085:2;46080:3;46076:12;46069:19;;45728:366;;;:::o;46100:419::-;46266:4;46304:2;46293:9;46289:18;46281:26;;46353:9;46347:4;46343:20;46339:1;46328:9;46324:17;46317:47;46381:131;46507:4;46381:131;:::i;:::-;46373:139;;46100:419;;;:::o;46525:237::-;46665:34;46661:1;46653:6;46649:14;46642:58;46734:20;46729:2;46721:6;46717:15;46710:45;46525:237;:::o;46768:366::-;46910:3;46931:67;46995:2;46990:3;46931:67;:::i;:::-;46924:74;;47007:93;47096:3;47007:93;:::i;:::-;47125:2;47120:3;47116:12;47109:19;;46768:366;;;:::o;47140:419::-;47306:4;47344:2;47333:9;47329:18;47321:26;;47393:9;47387:4;47383:20;47379:1;47368:9;47364:17;47357:47;47421:131;47547:4;47421:131;:::i;:::-;47413:139;;47140:419;;;:::o;47565:180::-;47613:77;47610:1;47603:88;47710:4;47707:1;47700:15;47734:4;47731:1;47724:15;47751:185;47791:1;47808:20;47826:1;47808:20;:::i;:::-;47803:25;;47842:20;47860:1;47842:20;:::i;:::-;47837:25;;47881:1;47871:35;;47886:18;;:::i;:::-;47871:35;47928:1;47925;47921:9;47916:14;;47751:185;;;;:::o;47942:176::-;47974:1;47991:20;48009:1;47991:20;:::i;:::-;47986:25;;48025:20;48043:1;48025:20;:::i;:::-;48020:25;;48064:1;48054:35;;48069:18;;:::i;:::-;48054:35;48110:1;48107;48103:9;48098:14;;47942:176;;;;:::o;48124:98::-;48175:6;48209:5;48203:12;48193:22;;48124:98;;;:::o;48228:168::-;48311:11;48345:6;48340:3;48333:19;48385:4;48380:3;48376:14;48361:29;;48228:168;;;;:::o;48402:360::-;48488:3;48516:38;48548:5;48516:38;:::i;:::-;48570:70;48633:6;48628:3;48570:70;:::i;:::-;48563:77;;48649:52;48694:6;48689:3;48682:4;48675:5;48671:16;48649:52;:::i;:::-;48726:29;48748:6;48726:29;:::i;:::-;48721:3;48717:39;48710:46;;48492:270;48402:360;;;;:::o;48768:640::-;48963:4;49001:3;48990:9;48986:19;48978:27;;49015:71;49083:1;49072:9;49068:17;49059:6;49015:71;:::i;:::-;49096:72;49164:2;49153:9;49149:18;49140:6;49096:72;:::i;:::-;49178;49246:2;49235:9;49231:18;49222:6;49178:72;:::i;:::-;49297:9;49291:4;49287:20;49282:2;49271:9;49267:18;49260:48;49325:76;49396:4;49387:6;49325:76;:::i;:::-;49317:84;;48768:640;;;;;;;:::o;49414:141::-;49470:5;49501:6;49495:13;49486:22;;49517:32;49543:5;49517:32;:::i;:::-;49414:141;;;;:::o;49561:349::-;49630:6;49679:2;49667:9;49658:7;49654:23;49650:32;49647:119;;;49685:79;;:::i;:::-;49647:119;49805:1;49830:63;49885:7;49876:6;49865:9;49861:22;49830:63;:::i;:::-;49820:73;;49776:127;49561:349;;;;:::o;49916:182::-;50056:34;50052:1;50044:6;50040:14;50033:58;49916:182;:::o;50104:366::-;50246:3;50267:67;50331:2;50326:3;50267:67;:::i;:::-;50260:74;;50343:93;50432:3;50343:93;:::i;:::-;50461:2;50456:3;50452:12;50445:19;;50104:366;;;:::o;50476:419::-;50642:4;50680:2;50669:9;50665:18;50657:26;;50729:9;50723:4;50719:20;50715:1;50704:9;50700:17;50693:47;50757:131;50883:4;50757:131;:::i;:::-;50749:139;;50476:419;;;:::o;50901:178::-;51041:30;51037:1;51029:6;51025:14;51018:54;50901:178;:::o;51085:366::-;51227:3;51248:67;51312:2;51307:3;51248:67;:::i;:::-;51241:74;;51324:93;51413:3;51324:93;:::i;:::-;51442:2;51437:3;51433:12;51426:19;;51085:366;;;:::o;51457:419::-;51623:4;51661:2;51650:9;51646:18;51638:26;;51710:9;51704:4;51700:20;51696:1;51685:9;51681:17;51674:47;51738:131;51864:4;51738:131;:::i;:::-;51730:139;;51457:419;;;:::o;51882:180::-;51930:77;51927:1;51920:88;52027:4;52024:1;52017:15;52051:4;52048:1;52041:15

Swarm Source

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