ETH Price: $3,376.98 (-1.14%)
Gas: 11 Gwei

Token

AI42 Loops (LOOP)
 

Overview

Max Total Supply

5,327 LOOP

Holders

1,756

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
525960.eth
Balance
2 LOOP
0x97013995b4866f7279e2bf6dbd7677529b21a762
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

AI generating NFT collectibles for Humans.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Loops

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 14 of 17: Loops.sol
pragma solidity ^0.8.1;

//   █████ ██ ██ ██   ██  ███████
//   ██    ██ ██ ██   ██       ██    █   ███ ███ ███   ███ ███ █ ██ ███ ███ ███ ███ ███
//   ██ █████ ██ ██ █████ ██ ████    █   █ █ █ █ █ █   █   █ █ █ ██  █  █ █ █ █ █    █
//   ██    ██ ██      ██  ██         █   █ █ █ █ ███   █   █ █ ██ █  █  ██  ███ █    █
//   ██    ██ ██      ██  ███████    ███ ███ ███ █     ███ ███ █  █  █  █ █ █ █ ███  █

import "./Address.sol";
import "./EnumerableMap.sol";
import "./EnumerableSet.sol";
import "./SafeMath.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./Strings.sol";

import "./IERC165.sol";
import "./ERC165Storage.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Metadata.sol";
import "./IERC721Receiver.sol";
import "./IERC20.sol";
import "./IDUST.sol";

/**
 * @dev Loops (a ERC721 non-fungible token)
 */
contract Loops is Context, Ownable, ERC165Storage, IERC721Enumerable, IERC721Metadata {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;

    // Public variables
    string  public constant LOOPS_PROOF             = "9a87b113c77c7cdfedbbf644194914432a704073c836f9783a79696b088c62fa";
    uint256 public constant LOOP_SALESTART_TS       = 1617460944; // Sat Apr 03 2021 14:42:24 UTC
    uint256 public constant LOOP_CHANGE_NAME_PRICE  = 1024000000000000000000;
    uint256 public constant LOOP_MINT_REWARD        = 2048000000000000000000;
    uint256 public constant LOOP_DESTROY_REWARD     = 4096000000000000000000;
    uint256 public constant LOOP_MAX_SUPPLY         = 10101;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Mapping from token ID to name
    mapping (uint256 => string) private _tokenName;

    // Mapping if certain Loop is currently hidden from public
    mapping (uint256 => bool) private _loopHidden;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // DUST Token address
    address private _dustAddress;

    // Number of burned loops
    uint256 private _burnedLoops;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     * 0x5b5e139f ===
     *     bytes4(keccak256('name()')) ^
     *     bytes4(keccak256('symbol()')) ^
     *     bytes4(keccak256('tokenURI(uint256)'))
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    // Events
    event ChangedLoopName(uint256 indexed loopId, string newName);
    event MintedLoops(address minter, uint256 loopId, uint256 count);
    event DestroyedLoop(uint256 indexed loopId, address destroyer, string lastWords);
    event HiddenLoop(uint256 indexed loopId, bool isHidden);

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory cname, string memory csymbol, address dustAddress) {
        _name = cname;
        _symbol = csymbol;
        _dustAddress = dustAddress;
        _burnedLoops = 0;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Returns base token URI 
     */
    function baseTokenURI() public pure returns (string memory) {
        return "https://app.ai42.art/api/loop/";
    }

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
      require(_exists(tokenId));
      return string(abi.encodePacked(baseTokenURI(), Strings.toString(tokenId)));
    }

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

        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

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

    function mintedSupply() public view returns (uint256) {
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev Returns name of the NFT at index.
     */
    function tokenNameByIndex(uint256 index) public view returns (string memory) {
        return _tokenName[index];
    }

    /**
     * @dev check if the loop is hidden or not
     */
    function isHidden(uint256 index) public view returns(bool) {
        return _loopHidden[index];
    }

    /**
     * @dev Returns the current price for a Loop
     */
    function getCurrentPrice(uint256 count) public view returns (uint256) {
	require(block.timestamp >= LOOP_SALESTART_TS, "ERROR: sale not started yet");
        require((count > 0) && (count < 17), "ERROR: number of Loops must be between 1 and 16");
        require(mintedSupply() < LOOP_MAX_SUPPLY, "ERROR: all loops have been sold");

        uint currentNumOfLoops = mintedSupply();
        uint256 price;

        if (currentNumOfLoops < 1024) {         price = 80000000000000000;     // 0-1023     ... 0.08E
        } else if (currentNumOfLoops < 2048) {  price = 160000000000000000;    // 1023-2047  ... 0.16E
        } else if (currentNumOfLoops < 4096) {  price = 320000000000000000;    // 2048-4095  ... 0.32E
        } else if (currentNumOfLoops < 8192) {  price = 640000000000000000;    // 4096-8191  ... 0.64E
        } else if (currentNumOfLoops < 9216) {  price = 1280000000000000000;   // 8192-9215  ... 1.28E
        } else {                                price = 2560000000000000000;   // 9216-10100 ....2.56E
        }

        return price.mul(count);
    } 

    /**
    * @dev Buy a Loop
    */
    function mintLoop(uint256 count) public payable {
        require((count > 0) && (count < 17), "Number of Loops must be between 1 and 16");
        require(msg.value >= getCurrentPrice(count) , "Payment not enough for loops");

	uint mintStart = mintedSupply();

        for (uint i = 0; i < count; i++) {
            require(LOOP_MAX_SUPPLY >= mintedSupply().add(count), "Not enough Loops left");
            _safeMint(msg.sender, mintedSupply());
        }

        IDUST(_dustAddress).mint(msg.sender, count.mul(LOOP_MINT_REWARD));

        emit MintedLoops(msg.sender, mintStart, count);
    }

    /**
     * @dev hides or unhides a loop
     */
    function hideLoop(uint256 tokenId, bool hide) external {
        require(_msgSender() == ownerOf(tokenId), "ERC721: caller is not the owner");
        _loopHidden[tokenId] = hide;

        emit HiddenLoop(tokenId, hide);
    }


    /**
     * @dev Changes the Loop name, optimized for gas
     */
    function changeLoopName(uint256 tokenId, string memory newName) external {
        require(_msgSender() == ownerOf(tokenId), "ERC721: caller is not the owner");
        require(checkName(newName) == true, "ERROR: name does not follow rules");
        require(keccak256(bytes(newName)) != keccak256(bytes(_tokenName[tokenId])), "ERROR: name is the same");

        IDUST(_dustAddress).transferFrom(msg.sender, address(this), LOOP_CHANGE_NAME_PRICE);
        _tokenName[tokenId] = newName;
        IDUST(_dustAddress).burn(LOOP_CHANGE_NAME_PRICE);

        emit ChangedLoopName(tokenId, newName);
    }

    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     * - Last words must be supplied.
     */
    function burn(uint256 tokenId, string memory lastWords) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        require(checkName(lastWords) == true, "ERROR: name does not follow rules");

        _tokenName[tokenId] = lastWords;
        _burn(tokenId);
        IDUST(_dustAddress).mint(msg.sender, LOOP_DESTROY_REWARD);

	emit DestroyedLoop(tokenId, _msgSender(), lastWords);
    }

    /**
     * @dev Withdraw ether from this contract (Callable by owner)
    */
    function withdraw() external onlyOwner {
        address payable ownerPay = payable(owner());
        ownerPay.transfer(address(this).balance);
    }

    /**
     * @dev Withdraw stuck ERC20s from this contract (Callable by owner)
    */
    function withdrawStuckERC20(address token, uint256 amount) external onlyOwner {
        require(token != _dustAddress, 'ERROR: cannot remove dust tokens');
        IERC20(token).transfer(owner(), amount);
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view 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 returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.set(tokenId, address(0));

	_burnedLoops++;

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }


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

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev check if name is valid (ascii range 0x20-0x7E without leading/trailing spaces)
     */
    function checkName(string memory str) public pure returns (bool){
        bytes memory b = bytes(str);
        if (b.length == 0) return false; // not empty
        if (b.length > 24) return false; // max 24 chars 
        if (b[0] == 0x20) return false;  // no leading space
        if (b[b.length - 1] == 0x20) return false; // no trailing space

        for(uint i; i < b.length; i++) { // asci range 0x20 to 0x7E
	    if (b[i] > 0x7E || b[i] < 0x20)
		return false;
        }
        return true;
    }
}


File 1 of 17: Address.sol
// SPDX-License-Identifier: MIT
// from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 17: EnumerableMap.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./EnumerableSet.sol";

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    using EnumerableSet for EnumerableSet.Bytes32Set;

    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;

        mapping (bytes32 => bytes32) _values;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        map._values[key] = value;
        return map._keys.add(key);
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        delete map._values[key];
        return map._keys.remove(key);
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._keys.contains(key);
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._keys.length();
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        bytes32 key = map._keys.at(index);
        return (key, map._values[key]);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        bytes32 value = map._values[key];
        if (value == bytes32(0)) {
            return (_contains(map, key), bytes32(0));
        } else {
            return (true, value);
        }
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key");
        return value;
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || _contains(map, key), errorMessage);
        return value;
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

File 4 of 17: EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 5 of 17: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 17: ERC165Storage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC165.sol";

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


File 7 of 17: IDUST.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IDUST {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * allows dust to be burned...
     */
    function burn(uint256 amount) external returns (bool);

    /**
     * and minted
     */
    function mint(address to, uint256 amount) external returns (bool);

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

File 8 of 17: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 17: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * allows dust to be burned...
     */
    function burn(uint256 amount) external returns (bool);

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

File 10 of 17: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 17: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 12 of 17: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    //function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 17: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 15 of 17: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 16 of 17: SafeMath.sol
// SPDX-License-Identifier: MIT
// from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol
pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 17 of 17: Strings.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"cname","type":"string"},{"internalType":"string","name":"csymbol","type":"string"},{"internalType":"address","name":"dustAddress","type":"address"}],"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":"uint256","name":"loopId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"ChangedLoopName","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loopId","type":"uint256"},{"indexed":false,"internalType":"address","name":"destroyer","type":"address"},{"indexed":false,"internalType":"string","name":"lastWords","type":"string"}],"name":"DestroyedLoop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loopId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isHidden","type":"bool"}],"name":"HiddenLoop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"loopId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"MintedLoops","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LOOPS_PROOF","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOOP_CHANGE_NAME_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOOP_DESTROY_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOOP_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOOP_MINT_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOOP_SALESTART_TS","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"lastWords","type":"string"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeLoopName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"checkName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"hide","type":"bool"}],"name":"hideLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isHidden","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintLoop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620058a6380380620058a68339818101604052810190620000379190620003cc565b600062000049620001b360201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600a9080519060200190620000ff92919062000293565b5081600b90805190602001906200011892919062000293565b5080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d819055506200017a6380ac58cd60e01b620001bb60201b60201c565b62000192635b5e139f60e01b620001bb60201b60201c565b620001aa63780e9d6360e01b620001bb60201b60201c565b50505062000695565b600033905090565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021e906200047b565b60405180910390fd5b6001806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054620002a19062000577565b90600052602060002090601f016020900481019282620002c5576000855562000311565b82601f10620002e057805160ff191683800117855562000311565b8280016001018555821562000311579182015b8281111562000310578251825591602001919060010190620002f3565b5b50905062000320919062000324565b5090565b5b808211156200033f57600081600090555060010162000325565b5090565b60006200035a6200035484620004c6565b6200049d565b9050828152602081018484840111156200037357600080fd5b6200038084828562000541565b509392505050565b60008151905062000399816200067b565b92915050565b600082601f830112620003b157600080fd5b8151620003c384826020860162000343565b91505092915050565b600080600060608486031215620003e257600080fd5b600084015167ffffffffffffffff811115620003fd57600080fd5b6200040b868287016200039f565b935050602084015167ffffffffffffffff8111156200042957600080fd5b62000437868287016200039f565b92505060406200044a8682870162000388565b9150509250925092565b600062000463601c83620004fc565b9150620004708262000652565b602082019050919050565b60006020820190508181036000830152620004968162000454565b9050919050565b6000620004a9620004bc565b9050620004b78282620005ad565b919050565b6000604051905090565b600067ffffffffffffffff821115620004e457620004e362000612565b5b620004ef8262000641565b9050602081019050919050565b600082825260208201905092915050565b60006200051a8262000521565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200056157808201518184015260208101905062000544565b8381111562000571576000848401525b50505050565b600060028204905060018216806200059057607f821691505b60208210811415620005a757620005a6620005e3565b5b50919050565b620005b88262000641565b810181811067ffffffffffffffff82111715620005da57620005d962000612565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b62000686816200050d565b81146200069257600080fd5b50565b61520180620006a56000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063c1bd8cf9116100ab578063e856e4481161006f578063e856e448146107fe578063e8b0ddc614610827578063e985e9c514610852578063f2fde38b1461088f578063f8d877dc146108b85761021a565b8063c1bd8cf914610703578063c55d0f561461072e578063c87b56dd1461076b578063d4877972146107a8578063d547cfb7146107d35761021a565b80638da5cb5b116100f25780638da5cb5b1461063057806395d89b411461065b578063a22cb46514610686578063b88d4fde146106af578063b95e4a32146106d85761021a565b8063715018a61461059a57806373a06852146105b15780637641e6f3146105dc5780637f04bdb5146106055761021a565b80632f745c59116101a657806343c9f97a1161017557806343c9f97a146104695780634f6ccce7146104a65780636352211e146104e35780636d5224181461052057806370a082311461055d5761021a565b80632f745c59146103d0578063318939af1461040d5780633ccfd60b1461042957806342842e0e146104405761021a565b80631400d1e4116101ed5780631400d1e4146102ed57806318160ddd1461032a57806323b872dd1461035557806326f730e41461037e5780632c58bb88146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906139a1565b6108e3565b60405161025391906141c1565b60405180910390f35b34801561026857600080fd5b5061027161095b565b60405161027e91906141dc565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613a34565b6109ed565b6040516102bb9190614093565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061393c565b610a72565b005b3480156102f957600080fd5b50610314600480360381019061030f91906139f3565b610b8a565b60405161032191906141c1565b60405180910390f35b34801561033657600080fd5b5061033f610dd6565b60405161034c919061457e565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613836565b610dfb565b005b34801561038a57600080fd5b506103a560048036038101906103a09190613a5d565b610e5b565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061393c565b610f3f565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061393c565b6110e5565b604051610404919061457e565b60405180910390f35b61042760048036038101906104229190613a34565b611140565b005b34801561043557600080fd5b5061043e61137e565b005b34801561044c57600080fd5b5061046760048036038101906104629190613836565b611450565b005b34801561047557600080fd5b50610490600480360381019061048b9190613a34565b611470565b60405161049d91906141c1565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190613a34565b61149a565b6040516104da919061457e565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613a34565b6114bd565b6040516105179190614093565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190613a34565b6114f4565b60405161055491906141dc565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906137d1565b611599565b604051610591919061457e565b60405180910390f35b3480156105a657600080fd5b506105af611658565b005b3480156105bd57600080fd5b506105c6611792565b6040516105d3919061457e565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613a99565b61179f565b005b34801561061157600080fd5b5061061a61196c565b60405161062791906141dc565b60405180910390f35b34801561063c57600080fd5b50610645611988565b6040516106529190614093565b60405180910390f35b34801561066757600080fd5b506106706119b1565b60405161067d91906141dc565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613900565b611a43565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613885565b611bc4565b005b3480156106e457600080fd5b506106ed611c26565b6040516106fa919061457e565b60405180910390f35b34801561070f57600080fd5b50610718611c2e565b604051610725919061457e565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613a34565b611c3f565b604051610762919061457e565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613a34565b611dde565b60405161079f91906141dc565b60405180910390f35b3480156107b457600080fd5b506107bd611e2a565b6040516107ca919061457e565b60405180910390f35b3480156107df57600080fd5b506107e8611e37565b6040516107f591906141dc565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613a99565b611e74565b005b34801561083357600080fd5b5061083c612187565b604051610849919061457e565b60405180910390f35b34801561085e57600080fd5b50610879600480360381019061087491906137fa565b61218d565b60405161088691906141c1565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b191906137d1565b612221565b005b3480156108c457600080fd5b506108cd6123ca565b6040516108da919061457e565b60405180910390f35b60006108ee826123d7565b80610954575060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b6060600a805461096a9061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546109969061484e565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882612441565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e906143de565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7d826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae59061447e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0d61245e565b73ffffffffffffffffffffffffffffffffffffffff161480610b3c5750610b3b81610b3661245e565b61218d565b5b610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b729061433e565b60405180910390fd5b610b858383612466565b505050565b600080829050600081511415610ba4576000915050610dd1565b601881511115610bb8576000915050610dd1565b602060f81b81600081518110610bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610c34576000915050610dd1565b602060f81b8160018351610c489190614764565b81518110610c7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610cbc576000915050610dd1565b60005b8151811015610dca57607e60f81b828281518110610d06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161180610da75750602060f81b828281518110610d78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b15610db757600092505050610dd1565b8080610dc2906148b1565b915050610cbf565b5060019150505b919050565b6000610df6600d54610de8600361251f565b61253490919063ffffffff16565b905090565b610e0c610e0661245e565b8261254a565b610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e42906144be565b60405180910390fd5b610e56838383612628565b505050565b610e64826114bd565b73ffffffffffffffffffffffffffffffffffffffff16610e8261245e565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf9061421e565b60405180910390fd5b806008600084815260200190815260200160002060006101000a81548160ff021916908315150217905550817fe8b3d8b96801b544957a27f8e7d0d80cd4cc167716c723499d0f18786ae3a0cb82604051610f3391906141c1565b60405180910390a25050565b610f4761245e565b73ffffffffffffffffffffffffffffffffffffffff16610f65611988565b73ffffffffffffffffffffffffffffffffffffffff1614610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb2906143fe565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061449e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611070611988565b836040518363ffffffff1660e01b815260040161108e929190614161565b602060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e09190613978565b505050565b600061113882600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283f90919063ffffffff16565b905092915050565b6000811180156111505750601181105b61118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061439e565b60405180910390fd5b61119881611c3f565b3410156111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d19061435e565b60405180910390fd5b60006111e4611c2e565b905060005b828110156112735761120b836111fd611c2e565b61285990919063ffffffff16565b612775101561124f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112469061429e565b60405180910390fd5b6112603361125b611c2e565b61286f565b808061126b906148b1565b9150506111e9565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336112cf686f05b59d3b200000008661288d90919063ffffffff16565b6040518363ffffffff1660e01b81526004016112ec929190614161565b602060405180830381600087803b15801561130657600080fd5b505af115801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190613978565b507f6c5f99e9b299370275044dd6c0d33cc94c198f0de83a09bb16eabd18969e85a63382846040516113729392919061418a565b60405180910390a15050565b61138661245e565b73ffffffffffffffffffffffffffffffffffffffff166113a4611988565b73ffffffffffffffffffffffffffffffffffffffff16146113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906143fe565b60405180910390fd5b6000611404611988565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561144c573d6000803e3d6000fd5b5050565b61146b83838360405180602001604052806000815250611bc4565b505050565b60006008600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806114b18360036128a390919063ffffffff16565b50905080915050919050565b60006114ed826040518060600160405280602981526020016151a36029913960036128cf9092919063ffffffff16565b9050919050565b60606007600083815260200190815260200160002080546115149061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546115409061484e565b801561158d5780601f106115625761010080835404028352916020019161158d565b820191906000526020600020905b81548152906001019060200180831161157057829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561160a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116019061437e565b60405180910390fd5b611651600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128ee565b9050919050565b61166061245e565b73ffffffffffffffffffffffffffffffffffffffff1661167e611988565b73ffffffffffffffffffffffffffffffffffffffff16146116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906143fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b686f05b59d3b2000000081565b6117b06117aa61245e565b8361254a565b6117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e69061453e565b60405180910390fd5b600115156117fc82610b8a565b15151461183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061445e565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906118659291906135e0565b5061186f82612903565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f193368de0b6b3a76400000006040518363ffffffff1660e01b81526004016118d5929190614161565b602060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190613978565b50817ef03c21ffa65ce7b7dca0a81d3dd1ba9616f942d4083cf5c180c6027cad694c61195161245e565b83604051611960929190614131565b60405180910390a25050565b6040518060600160405280604081526020016151636040913981565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600b80546119c09061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec9061484e565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050905090565b611a4b61245e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab0906142de565b60405180910390fd5b8060096000611ac661245e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b7361245e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb891906141c1565b60405180910390a35050565b611bd5611bcf61245e565b8361254a565b611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b906144be565b60405180910390fd5b611c2084848484612a09565b50505050565b6360687ed081565b6000611c3a600361251f565b905090565b60006360687ed0421015611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f906144fe565b60405180910390fd5b600082118015611c985750601182105b611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061441e565b60405180910390fd5b612775611ce2611c2e565b10611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d199061451e565b60405180910390fd5b6000611d2c611c2e565b90506000610400821015611d4a5767011c37937e0800009050611dc2565b610800821015611d64576702386f26fc1000009050611dc1565b611000821015611d7e57670470de4df82000009050611dc0565b612000821015611d98576708e1bc9bf04000009050611dbf565b612400821015611db2576711c37937e08000009050611dbe565b672386f26fc100000090505b5b5b5b5b611dd5848261288d90919063ffffffff16565b92505050919050565b6060611de982612441565b611df257600080fd5b611dfa611e37565b611e0383612a65565b604051602001611e1492919061406f565b6040516020818303038152906040529050919050565b68de0b6b3a764000000081565b60606040518060400160405280601e81526020017f68747470733a2f2f6170702e616934322e6172742f6170692f6c6f6f702f0000815250905090565b611e7d826114bd565b73ffffffffffffffffffffffffffffffffffffffff16611e9b61245e565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee89061421e565b60405180910390fd5b60011515611efe82610b8a565b151514611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f379061445e565b60405180910390fd5b60076000838152602001908152602001600020604051611f609190614058565b604051809103902081805190602001201415611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa89061455e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330683782dace9d900000006040518463ffffffff1660e01b8152600401612019939291906140ae565b602060405180830381600087803b15801561203357600080fd5b505af1158015612047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206b9190613978565b50806007600084815260200190815260200160002090805190602001906120939291906135e0565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68683782dace9d900000006040518263ffffffff1660e01b81526004016120f8919061457e565b602060405180830381600087803b15801561211257600080fd5b505af1158015612126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214a9190613978565b50817f4016327ecf782cf225eb29956fafc98d5e8e9c5271ae929cdbfe4f176951a9358260405161217b91906141dc565b60405180910390a25050565b61277581565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61222961245e565b73ffffffffffffffffffffffffffffffffffffffff16612247611988565b73ffffffffffffffffffffffffffffffffffffffff161461229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906143fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561230d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123049061425e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b683782dace9d9000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612457826003612c1290919063ffffffff16565b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d9836114bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061252d82600001612c2c565b9050919050565b600081836125429190614764565b905092915050565b600061255582612441565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b9061431e565b60405180910390fd5b600061259f836114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260e57508373ffffffffffffffffffffffffffffffffffffffff166125f6846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061261f575061261e818561218d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612648826114bd565b73ffffffffffffffffffffffffffffffffffffffff161461269e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126959061443e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612705906142be565b60405180910390fd5b612719838383612c41565b612724600082612466565b61277581600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4690919063ffffffff16565b506127c781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6090919063ffffffff16565b506127de81836003612c7a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061284e8360000183612caf565b60001c905092915050565b600081836128679190614683565b905092915050565b612889828260405180602001604052806000815250612d49565b5050565b6000818361289b919061470a565b905092915050565b6000806000806128b68660000186612da4565b915091508160001c8160001c9350935050509250929050565b60006128e2846000018460001b84612de4565b60001c90509392505050565b60006128fc82600001612e65565b9050919050565b600061290e826114bd565b905061291c81600084612c41565b612927600083612466565b61297882600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4690919063ffffffff16565b506129908260006003612c7a9092919063ffffffff16565b50600d60008154809291906129a4906148b1565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a14848484612628565b612a2084848484612e76565b612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a569061423e565b60405180910390fd5b50505050565b60606000821415612aad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c0d565b600082905060005b60008214612adf578080612ac8906148b1565b915050600a82612ad891906146d9565b9150612ab5565b60008167ffffffffffffffff811115612b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b535781602001600182028036833780820191505090505b5090505b60008514612c0657600182612b6c9190614764565b9150600a85612b7b91906148fa565b6030612b879190614683565b60f81b818381518110612bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bff91906146d9565b9450612b57565b8093505050505b919050565b6000612c24836000018360001b612fda565b905092915050565b6000612c3a82600001612ffa565b9050919050565b505050565b6000612c58836000018360001b61300f565b905092915050565b6000612c72836000018360001b613199565b905092915050565b6000612ca6846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613209565b90509392505050565b600081836000018054905011612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf1906141fe565b60405180910390fd5b826000018281548110612d36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b612d538383613244565b612d606000848484612e76565b612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d969061423e565b60405180910390fd5b505050565b6000806000612dbf84866000016133d290919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b81141580612e175750612e168585612fda565b5b8390612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5091906141dc565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b6000612e978473ffffffffffffffffffffffffffffffffffffffff166133e9565b612ea45760019050612fd2565b6000612f6b63150b7a0260e01b612eb961245e565b888787604051602401612ecf94939291906140e5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615131603291398773ffffffffffffffffffffffffffffffffffffffff166133fc9092919063ffffffff16565b9050600081806020019051810190612f8391906139ca565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000612ff2828460000161341490919063ffffffff16565b905092915050565b600061300882600001612e65565b9050919050565b6000808360010160008481526020019081526020016000205490506000811461318d5760006001826130419190614764565b90506000600186600001805490506130599190614764565b90506000866000018281548110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106130e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836130fe9190614683565b8760010160008381526020019081526020016000208190555086600001805480613151577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613193565b60009150505b92915050565b60006131a5838361342b565b6131fe578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613203565b600090505b92915050565b6000818460020160008581526020019081526020016000208190555061323b838560000161344e90919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ab906143be565b60405180910390fd5b6132bd81612441565b156132fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f49061427e565b60405180910390fd5b61330960008383612c41565b61335a81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6090919063ffffffff16565b5061337181836003612c7a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133e18360000183612caf565b905092915050565b600080823b905060008111915050919050565b606061340b8484600085613465565b90509392505050565b6000613423836000018361342b565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600061345d8360000183613199565b905092915050565b6060824710156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a1906142fe565b60405180910390fd5b6134b3856133e9565b6134f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e9906144de565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161351b9190614041565b60006040518083038185875af1925050503d8060008114613558576040519150601f19603f3d011682016040523d82523d6000602084013e61355d565b606091505b509150915061356d828286613579565b92505050949350505050565b60608315613589578290506135d9565b60008351111561359c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d091906141dc565b60405180910390fd5b9392505050565b8280546135ec9061484e565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757805160ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578251825591602001919060010190613639565b5b5090506136629190613666565b5090565b5b8082111561367f576000816000905550600101613667565b5090565b6000613696613691846145be565b614599565b9050828152602081018484840111156136ae57600080fd5b6136b984828561480c565b509392505050565b60006136d46136cf846145ef565b614599565b9050828152602081018484840111156136ec57600080fd5b6136f784828561480c565b509392505050565b60008135905061370e816150d4565b92915050565b600081359050613723816150eb565b92915050565b600081519050613738816150eb565b92915050565b60008135905061374d81615102565b92915050565b60008151905061376281615102565b92915050565b600082601f83011261377957600080fd5b8135613789848260208601613683565b91505092915050565b600082601f8301126137a357600080fd5b81356137b38482602086016136c1565b91505092915050565b6000813590506137cb81615119565b92915050565b6000602082840312156137e357600080fd5b60006137f1848285016136ff565b91505092915050565b6000806040838503121561380d57600080fd5b600061381b858286016136ff565b925050602061382c858286016136ff565b9150509250929050565b60008060006060848603121561384b57600080fd5b6000613859868287016136ff565b935050602061386a868287016136ff565b925050604061387b868287016137bc565b9150509250925092565b6000806000806080858703121561389b57600080fd5b60006138a9878288016136ff565b94505060206138ba878288016136ff565b93505060406138cb878288016137bc565b925050606085013567ffffffffffffffff8111156138e857600080fd5b6138f487828801613768565b91505092959194509250565b6000806040838503121561391357600080fd5b6000613921858286016136ff565b925050602061393285828601613714565b9150509250929050565b6000806040838503121561394f57600080fd5b600061395d858286016136ff565b925050602061396e858286016137bc565b9150509250929050565b60006020828403121561398a57600080fd5b600061399884828501613729565b91505092915050565b6000602082840312156139b357600080fd5b60006139c18482850161373e565b91505092915050565b6000602082840312156139dc57600080fd5b60006139ea84828501613753565b91505092915050565b600060208284031215613a0557600080fd5b600082013567ffffffffffffffff811115613a1f57600080fd5b613a2b84828501613792565b91505092915050565b600060208284031215613a4657600080fd5b6000613a54848285016137bc565b91505092915050565b60008060408385031215613a7057600080fd5b6000613a7e858286016137bc565b9250506020613a8f85828601613714565b9150509250929050565b60008060408385031215613aac57600080fd5b6000613aba858286016137bc565b925050602083013567ffffffffffffffff811115613ad757600080fd5b613ae385828601613792565b9150509250929050565b613af681614798565b82525050565b613b05816147aa565b82525050565b6000613b1682614635565b613b20818561464b565b9350613b3081856020860161481b565b613b39816149e7565b840191505092915050565b6000613b4f82614635565b613b59818561465c565b9350613b6981856020860161481b565b80840191505092915050565b60008154613b828161484e565b613b8c818661465c565b94506001821660008114613ba75760018114613bb857613beb565b60ff19831686528186019350613beb565b613bc185614620565b60005b83811015613be357815481890152600182019150602081019050613bc4565b838801955050505b50505092915050565b6000613bff82614640565b613c098185614667565b9350613c1981856020860161481b565b613c22816149e7565b840191505092915050565b6000613c3882614640565b613c428185614678565b9350613c5281856020860161481b565b80840191505092915050565b6000613c6b602283614667565b9150613c76826149f8565b604082019050919050565b6000613c8e601f83614667565b9150613c9982614a47565b602082019050919050565b6000613cb1603283614667565b9150613cbc82614a70565b604082019050919050565b6000613cd4602683614667565b9150613cdf82614abf565b604082019050919050565b6000613cf7601c83614667565b9150613d0282614b0e565b602082019050919050565b6000613d1a601583614667565b9150613d2582614b37565b602082019050919050565b6000613d3d602483614667565b9150613d4882614b60565b604082019050919050565b6000613d60601983614667565b9150613d6b82614baf565b602082019050919050565b6000613d83602683614667565b9150613d8e82614bd8565b604082019050919050565b6000613da6602c83614667565b9150613db182614c27565b604082019050919050565b6000613dc9603883614667565b9150613dd482614c76565b604082019050919050565b6000613dec601c83614667565b9150613df782614cc5565b602082019050919050565b6000613e0f602a83614667565b9150613e1a82614cee565b604082019050919050565b6000613e32602883614667565b9150613e3d82614d3d565b604082019050919050565b6000613e55602083614667565b9150613e6082614d8c565b602082019050919050565b6000613e78602c83614667565b9150613e8382614db5565b604082019050919050565b6000613e9b602083614667565b9150613ea682614e04565b602082019050919050565b6000613ebe602f83614667565b9150613ec982614e2d565b604082019050919050565b6000613ee1602983614667565b9150613eec82614e7c565b604082019050919050565b6000613f04602183614667565b9150613f0f82614ecb565b604082019050919050565b6000613f27602183614667565b9150613f3282614f1a565b604082019050919050565b6000613f4a602083614667565b9150613f5582614f69565b602082019050919050565b6000613f6d603183614667565b9150613f7882614f92565b604082019050919050565b6000613f90601d83614667565b9150613f9b82614fe1565b602082019050919050565b6000613fb3601b83614667565b9150613fbe8261500a565b602082019050919050565b6000613fd6601f83614667565b9150613fe182615033565b602082019050919050565b6000613ff9603083614667565b91506140048261505c565b604082019050919050565b600061401c601783614667565b9150614027826150ab565b602082019050919050565b61403b81614802565b82525050565b600061404d8284613b44565b915081905092915050565b60006140648284613b75565b915081905092915050565b600061407b8285613c2d565b91506140878284613c2d565b91508190509392505050565b60006020820190506140a86000830184613aed565b92915050565b60006060820190506140c36000830186613aed565b6140d06020830185613aed565b6140dd6040830184614032565b949350505050565b60006080820190506140fa6000830187613aed565b6141076020830186613aed565b6141146040830185614032565b81810360608301526141268184613b0b565b905095945050505050565b60006040820190506141466000830185613aed565b81810360208301526141588184613bf4565b90509392505050565b60006040820190506141766000830185613aed565b6141836020830184614032565b9392505050565b600060608201905061419f6000830186613aed565b6141ac6020830185614032565b6141b96040830184614032565b949350505050565b60006020820190506141d66000830184613afc565b92915050565b600060208201905081810360008301526141f68184613bf4565b905092915050565b6000602082019050818103600083015261421781613c5e565b9050919050565b6000602082019050818103600083015261423781613c81565b9050919050565b6000602082019050818103600083015261425781613ca4565b9050919050565b6000602082019050818103600083015261427781613cc7565b9050919050565b6000602082019050818103600083015261429781613cea565b9050919050565b600060208201905081810360008301526142b781613d0d565b9050919050565b600060208201905081810360008301526142d781613d30565b9050919050565b600060208201905081810360008301526142f781613d53565b9050919050565b6000602082019050818103600083015261431781613d76565b9050919050565b6000602082019050818103600083015261433781613d99565b9050919050565b6000602082019050818103600083015261435781613dbc565b9050919050565b6000602082019050818103600083015261437781613ddf565b9050919050565b6000602082019050818103600083015261439781613e02565b9050919050565b600060208201905081810360008301526143b781613e25565b9050919050565b600060208201905081810360008301526143d781613e48565b9050919050565b600060208201905081810360008301526143f781613e6b565b9050919050565b6000602082019050818103600083015261441781613e8e565b9050919050565b6000602082019050818103600083015261443781613eb1565b9050919050565b6000602082019050818103600083015261445781613ed4565b9050919050565b6000602082019050818103600083015261447781613ef7565b9050919050565b6000602082019050818103600083015261449781613f1a565b9050919050565b600060208201905081810360008301526144b781613f3d565b9050919050565b600060208201905081810360008301526144d781613f60565b9050919050565b600060208201905081810360008301526144f781613f83565b9050919050565b6000602082019050818103600083015261451781613fa6565b9050919050565b6000602082019050818103600083015261453781613fc9565b9050919050565b6000602082019050818103600083015261455781613fec565b9050919050565b600060208201905081810360008301526145778161400f565b9050919050565b60006020820190506145936000830184614032565b92915050565b60006145a36145b4565b90506145af8282614880565b919050565b6000604051905090565b600067ffffffffffffffff8211156145d9576145d86149b8565b5b6145e2826149e7565b9050602081019050919050565b600067ffffffffffffffff82111561460a576146096149b8565b5b614613826149e7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061468e82614802565b915061469983614802565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146ce576146cd61492b565b5b828201905092915050565b60006146e482614802565b91506146ef83614802565b9250826146ff576146fe61495a565b5b828204905092915050565b600061471582614802565b915061472083614802565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147595761475861492b565b5b828202905092915050565b600061476f82614802565b915061477a83614802565b92508282101561478d5761478c61492b565b5b828203905092915050565b60006147a3826147e2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561483957808201518184015260208101905061481e565b83811115614848576000848401525b50505050565b6000600282049050600182168061486657607f821691505b6020821081141561487a57614879614989565b5b50919050565b614889826149e7565b810181811067ffffffffffffffff821117156148a8576148a76149b8565b5b80604052505050565b60006148bc82614802565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ef576148ee61492b565b5b600182019050919050565b600061490582614802565b915061491083614802565b9250826149205761491f61495a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768204c6f6f7073206c6566740000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5061796d656e74206e6f7420656e6f75676820666f72206c6f6f707300000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f66204c6f6f7073206d757374206265206265747765656e2060008201527f3120616e64203136000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552524f523a206e756d626572206f66204c6f6f7073206d757374206265206260008201527f65747765656e203120616e642031360000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552524f523a206e616d6520646f6573206e6f7420666f6c6c6f772072756c6560008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552524f523a2063616e6e6f742072656d6f7665206475737420746f6b656e73600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4552524f523a2073616c65206e6f742073746172746564207965740000000000600082015250565b7f4552524f523a20616c6c206c6f6f70732068617665206265656e20736f6c6400600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552524f523a206e616d65206973207468652073616d65000000000000000000600082015250565b6150dd81614798565b81146150e857600080fd5b50565b6150f4816147aa565b81146150ff57600080fd5b50565b61510b816147b6565b811461511657600080fd5b50565b61512281614802565b811461512d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572396138376231313363373763376364666564626266363434313934393134343332613730343037336338333666393738336137393639366230383863363266614552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122071812b3563a4df82420086dfb9ab85510e90fb99acf648925a0e861c4862b22564736f6c63430008010033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000424242115b5bbdc12a1f5c06dd8dd0ddd03c321d000000000000000000000000000000000000000000000000000000000000000a41493432204c6f6f70730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c4f4f5000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063c1bd8cf9116100ab578063e856e4481161006f578063e856e448146107fe578063e8b0ddc614610827578063e985e9c514610852578063f2fde38b1461088f578063f8d877dc146108b85761021a565b8063c1bd8cf914610703578063c55d0f561461072e578063c87b56dd1461076b578063d4877972146107a8578063d547cfb7146107d35761021a565b80638da5cb5b116100f25780638da5cb5b1461063057806395d89b411461065b578063a22cb46514610686578063b88d4fde146106af578063b95e4a32146106d85761021a565b8063715018a61461059a57806373a06852146105b15780637641e6f3146105dc5780637f04bdb5146106055761021a565b80632f745c59116101a657806343c9f97a1161017557806343c9f97a146104695780634f6ccce7146104a65780636352211e146104e35780636d5224181461052057806370a082311461055d5761021a565b80632f745c59146103d0578063318939af1461040d5780633ccfd60b1461042957806342842e0e146104405761021a565b80631400d1e4116101ed5780631400d1e4146102ed57806318160ddd1461032a57806323b872dd1461035557806326f730e41461037e5780632c58bb88146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906139a1565b6108e3565b60405161025391906141c1565b60405180910390f35b34801561026857600080fd5b5061027161095b565b60405161027e91906141dc565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613a34565b6109ed565b6040516102bb9190614093565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e6919061393c565b610a72565b005b3480156102f957600080fd5b50610314600480360381019061030f91906139f3565b610b8a565b60405161032191906141c1565b60405180910390f35b34801561033657600080fd5b5061033f610dd6565b60405161034c919061457e565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613836565b610dfb565b005b34801561038a57600080fd5b506103a560048036038101906103a09190613a5d565b610e5b565b005b3480156103b357600080fd5b506103ce60048036038101906103c9919061393c565b610f3f565b005b3480156103dc57600080fd5b506103f760048036038101906103f2919061393c565b6110e5565b604051610404919061457e565b60405180910390f35b61042760048036038101906104229190613a34565b611140565b005b34801561043557600080fd5b5061043e61137e565b005b34801561044c57600080fd5b5061046760048036038101906104629190613836565b611450565b005b34801561047557600080fd5b50610490600480360381019061048b9190613a34565b611470565b60405161049d91906141c1565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190613a34565b61149a565b6040516104da919061457e565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613a34565b6114bd565b6040516105179190614093565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190613a34565b6114f4565b60405161055491906141dc565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f91906137d1565b611599565b604051610591919061457e565b60405180910390f35b3480156105a657600080fd5b506105af611658565b005b3480156105bd57600080fd5b506105c6611792565b6040516105d3919061457e565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613a99565b61179f565b005b34801561061157600080fd5b5061061a61196c565b60405161062791906141dc565b60405180910390f35b34801561063c57600080fd5b50610645611988565b6040516106529190614093565b60405180910390f35b34801561066757600080fd5b506106706119b1565b60405161067d91906141dc565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613900565b611a43565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613885565b611bc4565b005b3480156106e457600080fd5b506106ed611c26565b6040516106fa919061457e565b60405180910390f35b34801561070f57600080fd5b50610718611c2e565b604051610725919061457e565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190613a34565b611c3f565b604051610762919061457e565b60405180910390f35b34801561077757600080fd5b50610792600480360381019061078d9190613a34565b611dde565b60405161079f91906141dc565b60405180910390f35b3480156107b457600080fd5b506107bd611e2a565b6040516107ca919061457e565b60405180910390f35b3480156107df57600080fd5b506107e8611e37565b6040516107f591906141dc565b60405180910390f35b34801561080a57600080fd5b5061082560048036038101906108209190613a99565b611e74565b005b34801561083357600080fd5b5061083c612187565b604051610849919061457e565b60405180910390f35b34801561085e57600080fd5b50610879600480360381019061087491906137fa565b61218d565b60405161088691906141c1565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b191906137d1565b612221565b005b3480156108c457600080fd5b506108cd6123ca565b6040516108da919061457e565b60405180910390f35b60006108ee826123d7565b80610954575060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b6060600a805461096a9061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546109969061484e565b80156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b60006109f882612441565b610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e906143de565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7d826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae59061447e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0d61245e565b73ffffffffffffffffffffffffffffffffffffffff161480610b3c5750610b3b81610b3661245e565b61218d565b5b610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b729061433e565b60405180910390fd5b610b858383612466565b505050565b600080829050600081511415610ba4576000915050610dd1565b601881511115610bb8576000915050610dd1565b602060f81b81600081518110610bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610c34576000915050610dd1565b602060f81b8160018351610c489190614764565b81518110610c7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610cbc576000915050610dd1565b60005b8151811015610dca57607e60f81b828281518110610d06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161180610da75750602060f81b828281518110610d78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b15610db757600092505050610dd1565b8080610dc2906148b1565b915050610cbf565b5060019150505b919050565b6000610df6600d54610de8600361251f565b61253490919063ffffffff16565b905090565b610e0c610e0661245e565b8261254a565b610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e42906144be565b60405180910390fd5b610e56838383612628565b505050565b610e64826114bd565b73ffffffffffffffffffffffffffffffffffffffff16610e8261245e565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf9061421e565b60405180910390fd5b806008600084815260200190815260200160002060006101000a81548160ff021916908315150217905550817fe8b3d8b96801b544957a27f8e7d0d80cd4cc167716c723499d0f18786ae3a0cb82604051610f3391906141c1565b60405180910390a25050565b610f4761245e565b73ffffffffffffffffffffffffffffffffffffffff16610f65611988565b73ffffffffffffffffffffffffffffffffffffffff1614610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb2906143fe565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061449e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611070611988565b836040518363ffffffff1660e01b815260040161108e929190614161565b602060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e09190613978565b505050565b600061113882600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283f90919063ffffffff16565b905092915050565b6000811180156111505750601181105b61118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061439e565b60405180910390fd5b61119881611c3f565b3410156111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d19061435e565b60405180910390fd5b60006111e4611c2e565b905060005b828110156112735761120b836111fd611c2e565b61285990919063ffffffff16565b612775101561124f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112469061429e565b60405180910390fd5b6112603361125b611c2e565b61286f565b808061126b906148b1565b9150506111e9565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336112cf686f05b59d3b200000008661288d90919063ffffffff16565b6040518363ffffffff1660e01b81526004016112ec929190614161565b602060405180830381600087803b15801561130657600080fd5b505af115801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190613978565b507f6c5f99e9b299370275044dd6c0d33cc94c198f0de83a09bb16eabd18969e85a63382846040516113729392919061418a565b60405180910390a15050565b61138661245e565b73ffffffffffffffffffffffffffffffffffffffff166113a4611988565b73ffffffffffffffffffffffffffffffffffffffff16146113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f1906143fe565b60405180910390fd5b6000611404611988565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561144c573d6000803e3d6000fd5b5050565b61146b83838360405180602001604052806000815250611bc4565b505050565b60006008600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806114b18360036128a390919063ffffffff16565b50905080915050919050565b60006114ed826040518060600160405280602981526020016151a36029913960036128cf9092919063ffffffff16565b9050919050565b60606007600083815260200190815260200160002080546115149061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546115409061484e565b801561158d5780601f106115625761010080835404028352916020019161158d565b820191906000526020600020905b81548152906001019060200180831161157057829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561160a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116019061437e565b60405180910390fd5b611651600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128ee565b9050919050565b61166061245e565b73ffffffffffffffffffffffffffffffffffffffff1661167e611988565b73ffffffffffffffffffffffffffffffffffffffff16146116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906143fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b686f05b59d3b2000000081565b6117b06117aa61245e565b8361254a565b6117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e69061453e565b60405180910390fd5b600115156117fc82610b8a565b15151461183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061445e565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906118659291906135e0565b5061186f82612903565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f193368de0b6b3a76400000006040518363ffffffff1660e01b81526004016118d5929190614161565b602060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190613978565b50817ef03c21ffa65ce7b7dca0a81d3dd1ba9616f942d4083cf5c180c6027cad694c61195161245e565b83604051611960929190614131565b60405180910390a25050565b6040518060600160405280604081526020016151636040913981565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600b80546119c09061484e565b80601f01602080910402602001604051908101604052809291908181526020018280546119ec9061484e565b8015611a395780601f10611a0e57610100808354040283529160200191611a39565b820191906000526020600020905b815481529060010190602001808311611a1c57829003601f168201915b5050505050905090565b611a4b61245e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab0906142de565b60405180910390fd5b8060096000611ac661245e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b7361245e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb891906141c1565b60405180910390a35050565b611bd5611bcf61245e565b8361254a565b611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b906144be565b60405180910390fd5b611c2084848484612a09565b50505050565b6360687ed081565b6000611c3a600361251f565b905090565b60006360687ed0421015611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f906144fe565b60405180910390fd5b600082118015611c985750601182105b611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061441e565b60405180910390fd5b612775611ce2611c2e565b10611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d199061451e565b60405180910390fd5b6000611d2c611c2e565b90506000610400821015611d4a5767011c37937e0800009050611dc2565b610800821015611d64576702386f26fc1000009050611dc1565b611000821015611d7e57670470de4df82000009050611dc0565b612000821015611d98576708e1bc9bf04000009050611dbf565b612400821015611db2576711c37937e08000009050611dbe565b672386f26fc100000090505b5b5b5b5b611dd5848261288d90919063ffffffff16565b92505050919050565b6060611de982612441565b611df257600080fd5b611dfa611e37565b611e0383612a65565b604051602001611e1492919061406f565b6040516020818303038152906040529050919050565b68de0b6b3a764000000081565b60606040518060400160405280601e81526020017f68747470733a2f2f6170702e616934322e6172742f6170692f6c6f6f702f0000815250905090565b611e7d826114bd565b73ffffffffffffffffffffffffffffffffffffffff16611e9b61245e565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee89061421e565b60405180910390fd5b60011515611efe82610b8a565b151514611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f379061445e565b60405180910390fd5b60076000838152602001908152602001600020604051611f609190614058565b604051809103902081805190602001201415611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa89061455e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330683782dace9d900000006040518463ffffffff1660e01b8152600401612019939291906140ae565b602060405180830381600087803b15801561203357600080fd5b505af1158015612047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206b9190613978565b50806007600084815260200190815260200160002090805190602001906120939291906135e0565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68683782dace9d900000006040518263ffffffff1660e01b81526004016120f8919061457e565b602060405180830381600087803b15801561211257600080fd5b505af1158015612126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214a9190613978565b50817f4016327ecf782cf225eb29956fafc98d5e8e9c5271ae929cdbfe4f176951a9358260405161217b91906141dc565b60405180910390a25050565b61277581565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61222961245e565b73ffffffffffffffffffffffffffffffffffffffff16612247611988565b73ffffffffffffffffffffffffffffffffffffffff161461229d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612294906143fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561230d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123049061425e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b683782dace9d9000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612457826003612c1290919063ffffffff16565b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d9836114bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061252d82600001612c2c565b9050919050565b600081836125429190614764565b905092915050565b600061255582612441565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b9061431e565b60405180910390fd5b600061259f836114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260e57508373ffffffffffffffffffffffffffffffffffffffff166125f6846109ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061261f575061261e818561218d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612648826114bd565b73ffffffffffffffffffffffffffffffffffffffff161461269e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126959061443e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612705906142be565b60405180910390fd5b612719838383612c41565b612724600082612466565b61277581600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4690919063ffffffff16565b506127c781600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6090919063ffffffff16565b506127de81836003612c7a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061284e8360000183612caf565b60001c905092915050565b600081836128679190614683565b905092915050565b612889828260405180602001604052806000815250612d49565b5050565b6000818361289b919061470a565b905092915050565b6000806000806128b68660000186612da4565b915091508160001c8160001c9350935050509250929050565b60006128e2846000018460001b84612de4565b60001c90509392505050565b60006128fc82600001612e65565b9050919050565b600061290e826114bd565b905061291c81600084612c41565b612927600083612466565b61297882600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c4690919063ffffffff16565b506129908260006003612c7a9092919063ffffffff16565b50600d60008154809291906129a4906148b1565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612a14848484612628565b612a2084848484612e76565b612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a569061423e565b60405180910390fd5b50505050565b60606000821415612aad576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c0d565b600082905060005b60008214612adf578080612ac8906148b1565b915050600a82612ad891906146d9565b9150612ab5565b60008167ffffffffffffffff811115612b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b535781602001600182028036833780820191505090505b5090505b60008514612c0657600182612b6c9190614764565b9150600a85612b7b91906148fa565b6030612b879190614683565b60f81b818381518110612bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bff91906146d9565b9450612b57565b8093505050505b919050565b6000612c24836000018360001b612fda565b905092915050565b6000612c3a82600001612ffa565b9050919050565b505050565b6000612c58836000018360001b61300f565b905092915050565b6000612c72836000018360001b613199565b905092915050565b6000612ca6846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613209565b90509392505050565b600081836000018054905011612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf1906141fe565b60405180910390fd5b826000018281548110612d36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b612d538383613244565b612d606000848484612e76565b612d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d969061423e565b60405180910390fd5b505050565b6000806000612dbf84866000016133d290919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b81141580612e175750612e168585612fda565b5b8390612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5091906141dc565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b6000612e978473ffffffffffffffffffffffffffffffffffffffff166133e9565b612ea45760019050612fd2565b6000612f6b63150b7a0260e01b612eb961245e565b888787604051602401612ecf94939291906140e5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615131603291398773ffffffffffffffffffffffffffffffffffffffff166133fc9092919063ffffffff16565b9050600081806020019051810190612f8391906139ca565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000612ff2828460000161341490919063ffffffff16565b905092915050565b600061300882600001612e65565b9050919050565b6000808360010160008481526020019081526020016000205490506000811461318d5760006001826130419190614764565b90506000600186600001805490506130599190614764565b90506000866000018281548110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050808760000184815481106130e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836130fe9190614683565b8760010160008381526020019081526020016000208190555086600001805480613151577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613193565b60009150505b92915050565b60006131a5838361342b565b6131fe578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613203565b600090505b92915050565b6000818460020160008581526020019081526020016000208190555061323b838560000161344e90919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ab906143be565b60405180910390fd5b6132bd81612441565b156132fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f49061427e565b60405180910390fd5b61330960008383612c41565b61335a81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6090919063ffffffff16565b5061337181836003612c7a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006133e18360000183612caf565b905092915050565b600080823b905060008111915050919050565b606061340b8484600085613465565b90509392505050565b6000613423836000018361342b565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600061345d8360000183613199565b905092915050565b6060824710156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a1906142fe565b60405180910390fd5b6134b3856133e9565b6134f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e9906144de565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161351b9190614041565b60006040518083038185875af1925050503d8060008114613558576040519150601f19603f3d011682016040523d82523d6000602084013e61355d565b606091505b509150915061356d828286613579565b92505050949350505050565b60608315613589578290506135d9565b60008351111561359c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d091906141dc565b60405180910390fd5b9392505050565b8280546135ec9061484e565b90600052602060002090601f01602090048101928261360e5760008555613655565b82601f1061362757805160ff1916838001178555613655565b82800160010185558215613655579182015b82811115613654578251825591602001919060010190613639565b5b5090506136629190613666565b5090565b5b8082111561367f576000816000905550600101613667565b5090565b6000613696613691846145be565b614599565b9050828152602081018484840111156136ae57600080fd5b6136b984828561480c565b509392505050565b60006136d46136cf846145ef565b614599565b9050828152602081018484840111156136ec57600080fd5b6136f784828561480c565b509392505050565b60008135905061370e816150d4565b92915050565b600081359050613723816150eb565b92915050565b600081519050613738816150eb565b92915050565b60008135905061374d81615102565b92915050565b60008151905061376281615102565b92915050565b600082601f83011261377957600080fd5b8135613789848260208601613683565b91505092915050565b600082601f8301126137a357600080fd5b81356137b38482602086016136c1565b91505092915050565b6000813590506137cb81615119565b92915050565b6000602082840312156137e357600080fd5b60006137f1848285016136ff565b91505092915050565b6000806040838503121561380d57600080fd5b600061381b858286016136ff565b925050602061382c858286016136ff565b9150509250929050565b60008060006060848603121561384b57600080fd5b6000613859868287016136ff565b935050602061386a868287016136ff565b925050604061387b868287016137bc565b9150509250925092565b6000806000806080858703121561389b57600080fd5b60006138a9878288016136ff565b94505060206138ba878288016136ff565b93505060406138cb878288016137bc565b925050606085013567ffffffffffffffff8111156138e857600080fd5b6138f487828801613768565b91505092959194509250565b6000806040838503121561391357600080fd5b6000613921858286016136ff565b925050602061393285828601613714565b9150509250929050565b6000806040838503121561394f57600080fd5b600061395d858286016136ff565b925050602061396e858286016137bc565b9150509250929050565b60006020828403121561398a57600080fd5b600061399884828501613729565b91505092915050565b6000602082840312156139b357600080fd5b60006139c18482850161373e565b91505092915050565b6000602082840312156139dc57600080fd5b60006139ea84828501613753565b91505092915050565b600060208284031215613a0557600080fd5b600082013567ffffffffffffffff811115613a1f57600080fd5b613a2b84828501613792565b91505092915050565b600060208284031215613a4657600080fd5b6000613a54848285016137bc565b91505092915050565b60008060408385031215613a7057600080fd5b6000613a7e858286016137bc565b9250506020613a8f85828601613714565b9150509250929050565b60008060408385031215613aac57600080fd5b6000613aba858286016137bc565b925050602083013567ffffffffffffffff811115613ad757600080fd5b613ae385828601613792565b9150509250929050565b613af681614798565b82525050565b613b05816147aa565b82525050565b6000613b1682614635565b613b20818561464b565b9350613b3081856020860161481b565b613b39816149e7565b840191505092915050565b6000613b4f82614635565b613b59818561465c565b9350613b6981856020860161481b565b80840191505092915050565b60008154613b828161484e565b613b8c818661465c565b94506001821660008114613ba75760018114613bb857613beb565b60ff19831686528186019350613beb565b613bc185614620565b60005b83811015613be357815481890152600182019150602081019050613bc4565b838801955050505b50505092915050565b6000613bff82614640565b613c098185614667565b9350613c1981856020860161481b565b613c22816149e7565b840191505092915050565b6000613c3882614640565b613c428185614678565b9350613c5281856020860161481b565b80840191505092915050565b6000613c6b602283614667565b9150613c76826149f8565b604082019050919050565b6000613c8e601f83614667565b9150613c9982614a47565b602082019050919050565b6000613cb1603283614667565b9150613cbc82614a70565b604082019050919050565b6000613cd4602683614667565b9150613cdf82614abf565b604082019050919050565b6000613cf7601c83614667565b9150613d0282614b0e565b602082019050919050565b6000613d1a601583614667565b9150613d2582614b37565b602082019050919050565b6000613d3d602483614667565b9150613d4882614b60565b604082019050919050565b6000613d60601983614667565b9150613d6b82614baf565b602082019050919050565b6000613d83602683614667565b9150613d8e82614bd8565b604082019050919050565b6000613da6602c83614667565b9150613db182614c27565b604082019050919050565b6000613dc9603883614667565b9150613dd482614c76565b604082019050919050565b6000613dec601c83614667565b9150613df782614cc5565b602082019050919050565b6000613e0f602a83614667565b9150613e1a82614cee565b604082019050919050565b6000613e32602883614667565b9150613e3d82614d3d565b604082019050919050565b6000613e55602083614667565b9150613e6082614d8c565b602082019050919050565b6000613e78602c83614667565b9150613e8382614db5565b604082019050919050565b6000613e9b602083614667565b9150613ea682614e04565b602082019050919050565b6000613ebe602f83614667565b9150613ec982614e2d565b604082019050919050565b6000613ee1602983614667565b9150613eec82614e7c565b604082019050919050565b6000613f04602183614667565b9150613f0f82614ecb565b604082019050919050565b6000613f27602183614667565b9150613f3282614f1a565b604082019050919050565b6000613f4a602083614667565b9150613f5582614f69565b602082019050919050565b6000613f6d603183614667565b9150613f7882614f92565b604082019050919050565b6000613f90601d83614667565b9150613f9b82614fe1565b602082019050919050565b6000613fb3601b83614667565b9150613fbe8261500a565b602082019050919050565b6000613fd6601f83614667565b9150613fe182615033565b602082019050919050565b6000613ff9603083614667565b91506140048261505c565b604082019050919050565b600061401c601783614667565b9150614027826150ab565b602082019050919050565b61403b81614802565b82525050565b600061404d8284613b44565b915081905092915050565b60006140648284613b75565b915081905092915050565b600061407b8285613c2d565b91506140878284613c2d565b91508190509392505050565b60006020820190506140a86000830184613aed565b92915050565b60006060820190506140c36000830186613aed565b6140d06020830185613aed565b6140dd6040830184614032565b949350505050565b60006080820190506140fa6000830187613aed565b6141076020830186613aed565b6141146040830185614032565b81810360608301526141268184613b0b565b905095945050505050565b60006040820190506141466000830185613aed565b81810360208301526141588184613bf4565b90509392505050565b60006040820190506141766000830185613aed565b6141836020830184614032565b9392505050565b600060608201905061419f6000830186613aed565b6141ac6020830185614032565b6141b96040830184614032565b949350505050565b60006020820190506141d66000830184613afc565b92915050565b600060208201905081810360008301526141f68184613bf4565b905092915050565b6000602082019050818103600083015261421781613c5e565b9050919050565b6000602082019050818103600083015261423781613c81565b9050919050565b6000602082019050818103600083015261425781613ca4565b9050919050565b6000602082019050818103600083015261427781613cc7565b9050919050565b6000602082019050818103600083015261429781613cea565b9050919050565b600060208201905081810360008301526142b781613d0d565b9050919050565b600060208201905081810360008301526142d781613d30565b9050919050565b600060208201905081810360008301526142f781613d53565b9050919050565b6000602082019050818103600083015261431781613d76565b9050919050565b6000602082019050818103600083015261433781613d99565b9050919050565b6000602082019050818103600083015261435781613dbc565b9050919050565b6000602082019050818103600083015261437781613ddf565b9050919050565b6000602082019050818103600083015261439781613e02565b9050919050565b600060208201905081810360008301526143b781613e25565b9050919050565b600060208201905081810360008301526143d781613e48565b9050919050565b600060208201905081810360008301526143f781613e6b565b9050919050565b6000602082019050818103600083015261441781613e8e565b9050919050565b6000602082019050818103600083015261443781613eb1565b9050919050565b6000602082019050818103600083015261445781613ed4565b9050919050565b6000602082019050818103600083015261447781613ef7565b9050919050565b6000602082019050818103600083015261449781613f1a565b9050919050565b600060208201905081810360008301526144b781613f3d565b9050919050565b600060208201905081810360008301526144d781613f60565b9050919050565b600060208201905081810360008301526144f781613f83565b9050919050565b6000602082019050818103600083015261451781613fa6565b9050919050565b6000602082019050818103600083015261453781613fc9565b9050919050565b6000602082019050818103600083015261455781613fec565b9050919050565b600060208201905081810360008301526145778161400f565b9050919050565b60006020820190506145936000830184614032565b92915050565b60006145a36145b4565b90506145af8282614880565b919050565b6000604051905090565b600067ffffffffffffffff8211156145d9576145d86149b8565b5b6145e2826149e7565b9050602081019050919050565b600067ffffffffffffffff82111561460a576146096149b8565b5b614613826149e7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061468e82614802565b915061469983614802565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146ce576146cd61492b565b5b828201905092915050565b60006146e482614802565b91506146ef83614802565b9250826146ff576146fe61495a565b5b828204905092915050565b600061471582614802565b915061472083614802565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147595761475861492b565b5b828202905092915050565b600061476f82614802565b915061477a83614802565b92508282101561478d5761478c61492b565b5b828203905092915050565b60006147a3826147e2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561483957808201518184015260208101905061481e565b83811115614848576000848401525b50505050565b6000600282049050600182168061486657607f821691505b6020821081141561487a57614879614989565b5b50919050565b614889826149e7565b810181811067ffffffffffffffff821117156148a8576148a76149b8565b5b80604052505050565b60006148bc82614802565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148ef576148ee61492b565b5b600182019050919050565b600061490582614802565b915061491083614802565b9250826149205761491f61495a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768204c6f6f7073206c6566740000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f5061796d656e74206e6f7420656e6f75676820666f72206c6f6f707300000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f66204c6f6f7073206d757374206265206265747765656e2060008201527f3120616e64203136000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552524f523a206e756d626572206f66204c6f6f7073206d757374206265206260008201527f65747765656e203120616e642031360000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552524f523a206e616d6520646f6573206e6f7420666f6c6c6f772072756c6560008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552524f523a2063616e6e6f742072656d6f7665206475737420746f6b656e73600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4552524f523a2073616c65206e6f742073746172746564207965740000000000600082015250565b7f4552524f523a20616c6c206c6f6f70732068617665206265656e20736f6c6400600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552524f523a206e616d65206973207468652073616d65000000000000000000600082015250565b6150dd81614798565b81146150e857600080fd5b50565b6150f4816147aa565b81146150ff57600080fd5b50565b61510b816147b6565b811461511657600080fd5b50565b61512281614802565b811461512d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572396138376231313363373763376364666564626266363434313934393134343332613730343037336338333666393738336137393639366230383863363266614552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122071812b3563a4df82420086dfb9ab85510e90fb99acf648925a0e861c4862b22564736f6c63430008010033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000424242115b5bbdc12a1f5c06dd8dd0ddd03c321d000000000000000000000000000000000000000000000000000000000000000a41493432204c6f6f70730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c4f4f5000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : cname (string): AI42 Loops
Arg [1] : csymbol (string): LOOP
Arg [2] : dustAddress (address): 0x424242115B5BbDc12A1f5C06Dd8DD0dDd03c321D

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000424242115b5bbdc12a1f5c06dd8dd0ddd03c321d
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 41493432204c6f6f707300000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4c4f4f5000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

1205:20849:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;523:188:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6699:90:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12580:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12138:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21546:506;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7249:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13428:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9913:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11871:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7026:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9258:597;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11628:149;;;;;;;;;;;;;:::i;:::-;;13794;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7967:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7551:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6470:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7780:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6202:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:14;;;;;;;;;;;;;:::i;:::-;;1794:72:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11026:515;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1496:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:85:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6853:94:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12856:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14009:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1618:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7380:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:1075;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5948:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1872:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5633:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10215:600;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1950:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13212:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1716:72:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;523:188:3;608:4;631:36;655:11;631:23;:36::i;:::-;:73;;;;671:20;:33;692:11;671:33;;;;;;;;;;;;;;;;;;;;;;;;;;;631:73;624:80;;523:188;;;:::o;6699:90:13:-;6745:13;6777:5;6770:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6699:90;:::o;12580:209::-;12648:7;12675:16;12683:7;12675;:16::i;:::-;12667:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12758:15;:24;12774:7;12758:24;;;;;;;;;;;;;;;;;;;;;12751:31;;12580:209;;;:::o;12138:381::-;12218:13;12234:16;12242:7;12234;:16::i;:::-;12218:32;;12274:5;12268:11;;:2;:11;;;;12260:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;12352:5;12336:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;12361:37;12378:5;12385:12;:10;:12::i;:::-;12361:16;:37::i;:::-;12336:62;12328:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;12491:21;12500:2;12504:7;12491:8;:21::i;:::-;12138:381;;;:::o;21546:506::-;21605:4;21620:14;21643:3;21620:27;;21673:1;21661;:8;:13;21657:31;;;21683:5;21676:12;;;;;21657:31;21726:2;21715:1;:8;:13;21711:31;;;21737:5;21730:12;;;;;21711:31;21781:4;21773:12;;:1;21775;21773:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;21769:30;;;21794:5;21787:12;;;;;21769:30;21853:4;21834:23;;:1;21847;21836;:8;:12;;;;:::i;:::-;21834:15;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;21830:41;;;21866:5;21859:12;;;;;21830:41;21907:6;21903:122;21919:1;:8;21915:1;:12;21903:122;;;21979:4;21972:11;;:1;21974;21972:4;;;;;;;;;;;;;;;;;;;;;;;;:11;;;;:26;;;;21994:4;21987:11;;:1;21989;21987:4;;;;;;;;;;;;;;;;;;;;;;;;:11;;;;21972:26;21968:46;;;22009:5;22002:12;;;;;;21968:46;21929:3;;;;;:::i;:::-;;;;21903:122;;;;22041:4;22034:11;;;21546:506;;;;:::o;7249:125::-;7302:7;7328:39;7354:12;;7328:21;:12;:19;:21::i;:::-;:25;;:39;;;;:::i;:::-;7321:46;;7249:125;:::o;13428:300::-;13587:41;13606:12;:10;:12::i;:::-;13620:7;13587:18;:41::i;:::-;13579:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13693:28;13703:4;13709:2;13713:7;13693:9;:28::i;:::-;13428:300;;;:::o;9913:226::-;10002:16;10010:7;10002;:16::i;:::-;9986:32;;:12;:10;:12::i;:::-;:32;;;9978:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;10087:4;10064:11;:20;10076:7;10064:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;10118:7;10107:25;10127:4;10107:25;;;;;;:::i;:::-;;;;;;;;9913:226;;:::o;11871:210::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11976:12:13::1;;;;;;;;;;;11967:21;;:5;:21;;;;11959:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;12042:5;12035:22;;;12058:7;:5;:7::i;:::-;12067:6;12035:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11871:210:::0;;:::o;7026:152::-;7115:7;7141:30;7165:5;7141:13;:20;7155:5;7141:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;7134:37;;7026:152;;;;:::o;9258:597::-;9333:1;9325:5;:9;9324:27;;;;;9348:2;9340:5;:10;9324:27;9316:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;9427:22;9443:5;9427:15;:22::i;:::-;9414:9;:35;;9406:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;9487:14;9504;:12;:14::i;:::-;9487:31;;9534:6;9529:187;9550:5;9546:1;:9;9529:187;;;9603:25;9622:5;9603:14;:12;:14::i;:::-;:18;;:25;;;;:::i;:::-;2000:5;9584:44;;9576:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9668:37;9678:10;9690:14;:12;:14::i;:::-;9668:9;:37::i;:::-;9557:3;;;;;:::i;:::-;;;;9529:187;;;;9732:12;;;;;;;;;;;9726:24;;;9751:10;9763:27;1844:22;9763:5;:9;;:27;;;;:::i;:::-;9726:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9807:41;9819:10;9831:9;9842:5;9807:41;;;;;;;;:::i;:::-;;;;;;;;9258:597;;:::o;11628:149::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11677:24:13::1;11712:7;:5;:7::i;:::-;11677:43;;11730:8;:17;;:40;11748:21;11730:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1343:1:14;11628:149:13:o:0;13794:::-;13897:39;13914:4;13920:2;13924:7;13897:39;;;;;;;;;;;;:16;:39::i;:::-;13794:149;;;:::o;7967:101::-;8020:4;8043:11;:18;8055:5;8043:18;;;;;;;;;;;;;;;;;;;;;8036:25;;7967:101;;;:::o;7551:161::-;7618:7;7638:15;7659:22;7675:5;7659:12;:15;;:22;;;;:::i;:::-;7637:44;;;7698:7;7691:14;;;7551:161;;;:::o;6470:167::-;6534:7;6560:70;6577:7;6560:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;6553:77;;6470:167;;;:::o;7780:118::-;7842:13;7874:10;:17;7885:5;7874:17;;;;;;;;;;;7867:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7780:118;;;:::o;6202:211::-;6266:7;6310:1;6293:19;;:5;:19;;;;6285:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;6377:29;:13;:20;6391:5;6377:20;;;;;;;;;;;;;;;:27;:29::i;:::-;6370:36;;6202:211;;;:::o;1693:145:14:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;::::0;::::1;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;1794:72:13:-;1844:22;1794:72;:::o;11026:515::-;11167:41;11186:12;:10;:12::i;:::-;11200:7;11167:18;:41::i;:::-;11159:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;11303:4;11279:28;;:20;11289:9;11279;:20::i;:::-;:28;;;11271:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11378:9;11356:10;:19;11367:7;11356:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;11397:14;11403:7;11397:5;:14::i;:::-;11427:12;;;;;;;;;;;11421:24;;;11446:10;1922:22;11421:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11501:7;11487:47;11510:12;:10;:12::i;:::-;11524:9;11487:47;;;;;;;:::i;:::-;;;;;;;;11026:515;;:::o;1496:116::-;;;;;;;;;;;;;;;;;;;:::o;1061:85:14:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;6853:94:13:-;6901:13;6933:7;6926:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6853:94;:::o;12856:290::-;12970:12;:10;:12::i;:::-;12958:24;;:8;:24;;;;12950:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;13068:8;13023:18;:32;13042:12;:10;:12::i;:::-;13023:32;;;;;;;;;;;;;;;:42;13056:8;13023:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;13120:8;13091:48;;13106:12;:10;:12::i;:::-;13091:48;;;13130:8;13091:48;;;;;;:::i;:::-;;;;;;;;12856:290;;:::o;14009:282::-;14140:41;14159:12;:10;:12::i;:::-;14173:7;14140:18;:41::i;:::-;14132:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;14245:39;14259:4;14265:2;14269:7;14278:5;14245:13;:39::i;:::-;14009:282;;;;:::o;1618:60::-;1668:10;1618:60;:::o;7380:99::-;7425:7;7451:21;:12;:19;:21::i;:::-;7444:28;;7380:99;:::o;8139:1075::-;8200:7;1668:10;8220:15;:36;;8212:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;8315:1;8307:5;:9;8306:27;;;;;8330:2;8322:5;:10;8306:27;8298:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:5;8403:14;:12;:14::i;:::-;:32;8395:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;8482:22;8507:14;:12;:14::i;:::-;8482:39;;8531:13;8579:4;8559:17;:24;8555:619;;;8603:17;8595:25;;8555:619;;;8689:4;8669:17;:24;8665:509;;;8706:18;8698:26;;8665:509;;;8792:4;8772:17;:24;8768:406;;;8809:18;8801:26;;8768:406;;;8895:4;8875:17;:24;8871:303;;;8912:18;8904:26;;8871:303;;;8998:4;8978:17;:24;8974:200;;;9015:19;9007:27;;8974:200;;;9118:19;9110:27;;8974:200;8871:303;8768:406;8665:509;8555:619;9191:16;9201:5;9191;:9;;:16;;;;:::i;:::-;9184:23;;;;8139:1075;;;:::o;5948:195::-;6006:13;6037:16;6045:7;6037;:16::i;:::-;6029:25;;;;;;6093:14;:12;:14::i;:::-;6109:25;6126:7;6109:16;:25::i;:::-;6076:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6062:74;;5948:195;;;:::o;1872:72::-;1922:22;1872:72;:::o;5633:116::-;5678:13;5703:39;;;;;;;;;;;;;;;;;;;5633:116;:::o;10215:600::-;10322:16;10330:7;10322;:16::i;:::-;10306:32;;:12;:10;:12::i;:::-;:32;;;10298:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;10414:4;10392:26;;:18;10402:7;10392:9;:18::i;:::-;:26;;;10384:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;10519:10;:19;10530:7;10519:19;;;;;;;;;;;10503:37;;;;;;:::i;:::-;;;;;;;;10490:7;10474:25;;;;;;:66;;10466:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;10585:12;;;;;;;;;;;10579:32;;;10612:10;10632:4;1766:22;10579:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10694:7;10672:10;:19;10683:7;10672:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;10717:12;;;;;;;;;;;10711:24;;;1766:22;10711:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10791:7;10775:33;10800:7;10775:33;;;;;;:::i;:::-;;;;;;;;10215:600;;:::o;1950:55::-;2000:5;1950:55;:::o;13212:154::-;13301:4;13324:18;:25;13343:5;13324:25;;;;;;;;;;;;;;;:35;13350:8;13324:35;;;;;;;;;;;;;;;;;;;;;;;;;13317:42;;13212:154;;;;:::o;1987:240:14:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;::::0;::::1;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;1716:72:13:-;1766:22;1716:72;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;15725:117:13:-;15782:4;15805:30;15827:7;15805:12;:21;;:30;;;;:::i;:::-;15798:37;;15725:117;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;20589:155:13:-;20681:2;20654:15;:24;20670:7;20654:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20729:7;20725:2;20698:39;;20707:16;20715:7;20707;:16::i;:::-;20698:39;;;;;;;;;;;;20589:155;;:::o;5520:121:4:-;5589:7;5615:19;5623:3;:10;;5615:7;:19::i;:::-;5608:26;;5520:121;;;:::o;3148:96:15:-;3206:7;3236:1;3232;:5;;;;:::i;:::-;3225:12;;3148:96;;;;:::o;16000:329:13:-;16085:4;16109:16;16117:7;16109;:16::i;:::-;16101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16184:13;16200:16;16208:7;16200;:16::i;:::-;16184:32;;16245:5;16234:16;;:7;:16;;;:51;;;;16278:7;16254:31;;:20;16266:7;16254:11;:20::i;:::-;:31;;;16234:51;:87;;;;16289:32;16306:5;16313:7;16289:16;:32::i;:::-;16234:87;16226:96;;;16000:329;;;;:::o;18881:559::-;18998:4;18978:24;;:16;18986:7;18978;:16::i;:::-;:24;;;18970:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;19080:1;19066:16;;:2;:16;;;;19058:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19134:39;19155:4;19161:2;19165:7;19134:20;:39::i;:::-;19235:29;19252:1;19256:7;19235:8;:29::i;:::-;19275:35;19302:7;19275:13;:19;19289:4;19275:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;19320:30;19342:7;19320:13;:17;19334:2;19320:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;19361:29;19378:7;19387:2;19361:12;:16;;:29;;;;;:::i;:::-;;19425:7;19421:2;19406:27;;19415:4;19406:27;;;;;;;;;;;;18881:559;;;:::o;9242:135:5:-;9313:7;9347:22;9351:3;:10;;9363:5;9347:3;:22::i;:::-;9339:31;;9332:38;;9242:135;;;;:::o;2781:96:15:-;2839:7;2869:1;2865;:5;;;;:::i;:::-;2858:12;;2781:96;;;;:::o;16660:108:13:-;16735:26;16745:2;16749:7;16735:26;;;;;;;;;;;;:9;:26::i;:::-;16660:108;;:::o;3491:96:15:-;3549:7;3579:1;3575;:5;;;;:::i;:::-;3568:12;;3491:96;;;;:::o;5969:233:4:-;6049:7;6058;6078:11;6091:13;6108:22;6112:3;:10;;6124:5;6108:3;:22::i;:::-;6077:53;;;;6156:3;6148:12;;6186:5;6178:14;;6140:55;;;;;;5969:233;;;;;:::o;7222:211::-;7329:7;7379:44;7384:3;:10;;7404:3;7396:12;;7410;7379:4;:44::i;:::-;7371:53;;7348:78;;7222:211;;;;;:::o;8798:112:5:-;8858:7;8884:19;8892:3;:10;;8884:7;:19::i;:::-;8877:26;;8798:112;;;:::o;18168:389:13:-;18227:13;18243:16;18251:7;18243;:16::i;:::-;18227:32;;18270:48;18291:5;18306:1;18310:7;18270:20;:48::i;:::-;18356:29;18373:1;18377:7;18356:8;:29::i;:::-;18396:36;18424:7;18396:13;:20;18410:5;18396:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;18443:37;18460:7;18477:1;18443:12;:16;;:37;;;;;:::i;:::-;;18484:12;;:14;;;;;;;;;:::i;:::-;;;;;;18542:7;18538:1;18514:36;;18523:5;18514:36;;;;;;;;;;;;18168:389;;:::o;15153:269::-;15266:28;15276:4;15282:2;15286:7;15266:9;:28::i;:::-;15312:48;15335:4;15341:2;15345:7;15354:5;15312:22;:48::i;:::-;15304:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;15153:269;;;;:::o;169:684:16:-;225:13;448:1;439:5;:10;435:49;;;464:10;;;;;;;;;;;;;;;;;;;;;435:49;492:12;507:5;492:20;;521:14;544:72;559:1;551:4;:9;544:72;;575:8;;;;;:::i;:::-;;;;604:2;596:10;;;;;:::i;:::-;;;544:72;;;624:19;656:6;646:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;624:39;;672:146;688:1;679:5;:10;672:146;;714:1;704:11;;;;;:::i;:::-;;;779:2;771:5;:10;;;;:::i;:::-;758:2;:24;;;;:::i;:::-;745:39;;728:6;735;728:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;806:2;797:11;;;;;:::i;:::-;;;672:146;;;840:6;826:21;;;;;169:684;;;;:::o;5288:149:4:-;5372:4;5395:35;5405:3;:10;;5425:3;5417:12;;5395:9;:35::i;:::-;5388:42;;5288:149;;;;:::o;2462:107::-;2518:7;2544:18;:3;:9;;:16;:18::i;:::-;2537:25;;2462:107;;;:::o;21340:93:13:-;;;;:::o;8357:135:5:-;8427:4;8450:35;8458:3;:10;;8478:5;8470:14;;8450:7;:35::i;:::-;8443:42;;8357:135;;;;:::o;8060:129::-;8127:4;8150:32;8155:3;:10;;8175:5;8167:14;;8150:4;:32::i;:::-;8143:39;;8060:129;;;;:::o;4727:183:4:-;4816:4;4839:64;4844:3;:10;;4864:3;4856:12;;4894:5;4878:23;;4870:32;;4839:4;:64::i;:::-;4832:71;;4727:183;;;;;:::o;4444:201:5:-;4511:7;4559:5;4538:3;:11;;:18;;;;:26;4530:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4620:3;:11;;4632:5;4620:18;;;;;;;;;;;;;;;;;;;;;;;;4613:25;;4444:201;;;;:::o;16989:247:13:-;17084:18;17090:2;17094:7;17084:5;:18::i;:::-;17120:54;17151:1;17155:2;17159:7;17168:5;17120:22;:54::i;:::-;17112:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;16989:247;;;:::o;2912:175:4:-;2979:7;2988;3007:11;3021:19;3034:5;3021:3;:9;;:12;;:19;;;;:::i;:::-;3007:33;;3058:3;3063;:11;;:16;3075:3;3063:16;;;;;;;;;;;;3050:30;;;;;2912:175;;;;;:::o;4178:240::-;4272:7;4291:13;4307:3;:11;;:16;4319:3;4307:16;;;;;;;;;;;;4291:32;;4350:1;4341:10;;:5;:10;;:33;;;;4355:19;4365:3;4370;4355:9;:19::i;:::-;4341:33;4376:12;4333:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4406:5;4399:12;;;4178:240;;;;;:::o;4005:107:5:-;4061:7;4087:3;:11;;:18;;;;4080:25;;4005:107;;;:::o;19994:589:13:-;20114:4;20139:15;:2;:13;;;:15::i;:::-;20134:58;;20177:4;20170:11;;;;20134:58;20201:23;20227:246;20279:45;;;20338:12;:10;:12::i;:::-;20364:4;20382:7;20403:5;20243:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20227:246;;;;;;;;;;;;;;;;;:2;:15;;;;:246;;;;;:::i;:::-;20201:272;;20483:13;20510:10;20499:32;;;;;;;;;;;;:::i;:::-;20483:48;;2227:10;20559:16;;20549:26;;;:6;:26;;;;20541:35;;;;19994:589;;;;;;;:::o;2248:124:4:-;2319:4;2342:23;2361:3;2342;:9;;:18;;:23;;;;:::i;:::-;2335:30;;2248:124;;;;:::o;5605:115:5:-;5668:7;5694:19;5702:3;:10;;5694:7;:19::i;:::-;5687:26;;5605:115;;;:::o;2204:1512::-;2270:4;2386:18;2407:3;:12;;:19;2420:5;2407:19;;;;;;;;;;;;2386:40;;2455:1;2441:10;:15;2437:1273;;2798:21;2835:1;2822:10;:14;;;;:::i;:::-;2798:38;;2850:17;2891:1;2870:3;:11;;:18;;;;:22;;;;:::i;:::-;2850:42;;3132:17;3152:3;:11;;3164:9;3152:22;;;;;;;;;;;;;;;;;;;;;;;;3132:42;;3295:9;3266:3;:11;;3278:13;3266:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3412:1;3396:13;:17;;;;:::i;:::-;3370:3;:12;;:23;3383:9;3370:23;;;;;;;;;;;:43;;;;3519:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3611:3;:12;;:19;3624:5;3611:19;;;;;;;;;;;3604:26;;;3652:4;3645:11;;;;;;;;2437:1273;3694:5;3687:12;;;2204:1512;;;;;:::o;1632:404::-;1695:4;1716:21;1726:3;1731:5;1716:9;:21::i;:::-;1711:319;;1753:3;:11;;1770:5;1753:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1933:3;:11;;:18;;;;1911:3;:12;;:19;1924:5;1911:19;;;;;;;;;;;:40;;;;1972:4;1965:11;;;;1711:319;2014:5;2007:12;;1632:404;;;;;:::o;1695:158:4:-;1771:4;1806:5;1787:3;:11;;:16;1799:3;1787:16;;;;;;;;;;;:24;;;;1828:18;1842:3;1828;:9;;:13;;:18;;;;:::i;:::-;1821:25;;1695:158;;;;;:::o;17558:393:13:-;17651:1;17637:16;;:2;:16;;;;17629:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;17709:16;17717:7;17709;:16::i;:::-;17708:17;17700:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;17769:45;17798:1;17802:2;17806:7;17769:20;:45::i;:::-;17825:30;17847:7;17825:13;:17;17839:2;17825:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;17866:29;17883:7;17892:2;17866:12;:16;;:29;;;;;:::i;:::-;;17936:7;17932:2;17911:33;;17928:1;17911:33;;;;;;;;;;;;17558:393;;:::o;6052:129:5:-;6126:7;6152:22;6156:3;:10;;6168:5;6152:3;:22::i;:::-;6145:29;;6052:129;;;;:::o;822:413:0:-;882:4;1085:12;1194:7;1182:20;1174:28;;1227:1;1220:4;:8;1213:15;;;822:413;;;:::o;3677:193::-;3780:12;3811:52;3833:6;3841:4;3847:1;3850:12;3811:21;:52::i;:::-;3804:59;;3677:193;;;;;:::o;5386:138:5:-;5466:4;5489:28;5499:3;:10;;5511:5;5489:9;:28::i;:::-;5482:35;;5386:138;;;;:::o;3797:127::-;3870:4;3916:1;3893:3;:12;;:19;3906:5;3893:19;;;;;;;;;;;;:24;;3886:31;;3797:127;;;;:::o;4885:123::-;4955:4;4978:23;4983:3;:10;;4995:5;4978:4;:23::i;:::-;4971:30;;4885:123;;;;:::o;4704:523:0:-;4831:12;4888:5;4863:21;:30;;4855:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4954:18;4965:6;4954:10;:18::i;:::-;4946:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5077:12;5091:23;5118:6;:11;;5138:5;5146:4;5118:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5076:75;;;;5168:52;5186:7;5195:10;5207:12;5168:17;:52::i;:::-;5161:59;;;;4704:523;;;;;;:::o;7187:725::-;7302:12;7330:7;7326:580;;;7360:10;7353:17;;;;7326:580;7491:1;7471:10;:17;:21;7467:429;;;7729:10;7723:17;7789:15;7776:10;7772:2;7768:19;7761:44;7678:145;7868:12;7861:20;;;;;;;;;;;:::i;:::-;;;;;;;;7187:725;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:17:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1076:6;1070:13;1061:22;;1092:30;1116:5;1092:30;:::i;:::-;1051:77;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:262::-;;2260:2;2248:9;2239:7;2235:23;2231:32;2228:2;;;2276:1;2273;2266:12;2228:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2218:196;;;;:::o;2420:407::-;;;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2731:2;2757:53;2802:7;2793:6;2782:9;2778:22;2757:53;:::i;:::-;2747:63;;2702:118;2503:324;;;;;:::o;2833:552::-;;;;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;3289:2;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3260:118;2933:452;;;;;:::o;3391:809::-;;;;;3559:3;3547:9;3538:7;3534:23;3530:33;3527:2;;;3576:1;3573;3566:12;3527:2;3619:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3590:117;3746:2;3772:53;3817:7;3808:6;3797:9;3793:22;3772:53;:::i;:::-;3762:63;;3717:118;3874:2;3900:53;3945:7;3936:6;3925:9;3921:22;3900:53;:::i;:::-;3890:63;;3845:118;4030:2;4019:9;4015:18;4002:32;4061:18;4053:6;4050:30;4047:2;;;4093:1;4090;4083:12;4047:2;4121:62;4175:7;4166:6;4155:9;4151:22;4121:62;:::i;:::-;4111:72;;3973:220;3517:683;;;;;;;:::o;4206:401::-;;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:50;4582:7;4573:6;4562:9;4558:22;4540:50;:::i;:::-;4530:60;;4485:115;4286:321;;;;;:::o;4613:407::-;;;4738:2;4726:9;4717:7;4713:23;4709:32;4706:2;;;4754:1;4751;4744:12;4706:2;4797:1;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4768:117;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;4696:324;;;;;:::o;5026:278::-;;5142:2;5130:9;5121:7;5117:23;5113:32;5110:2;;;5158:1;5155;5148:12;5110:2;5201:1;5226:61;5279:7;5270:6;5259:9;5255:22;5226:61;:::i;:::-;5216:71;;5172:125;5100:204;;;;:::o;5310:260::-;;5417:2;5405:9;5396:7;5392:23;5388:32;5385:2;;;5433:1;5430;5423:12;5385:2;5476:1;5501:52;5545:7;5536:6;5525:9;5521:22;5501:52;:::i;:::-;5491:62;;5447:116;5375:195;;;;:::o;5576:282::-;;5694:2;5682:9;5673:7;5669:23;5665:32;5662:2;;;5710:1;5707;5700:12;5662:2;5753:1;5778:63;5833:7;5824:6;5813:9;5809:22;5778:63;:::i;:::-;5768:73;;5724:127;5652:206;;;;:::o;5864:375::-;;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;5998:1;5995;5988:12;5950:2;6069:1;6058:9;6054:17;6041:31;6099:18;6091:6;6088:30;6085:2;;;6131:1;6128;6121:12;6085:2;6159:63;6214:7;6205:6;6194:9;6190:22;6159:63;:::i;:::-;6149:73;;6012:220;5940:299;;;;:::o;6245:262::-;;6353:2;6341:9;6332:7;6328:23;6324:32;6321:2;;;6369:1;6366;6359:12;6321:2;6412:1;6437:53;6482:7;6473:6;6462:9;6458:22;6437:53;:::i;:::-;6427:63;;6383:117;6311:196;;;;:::o;6513:401::-;;;6635:2;6623:9;6614:7;6610:23;6606:32;6603:2;;;6651:1;6648;6641:12;6603:2;6694:1;6719:53;6764:7;6755:6;6744:9;6740:22;6719:53;:::i;:::-;6709:63;;6665:117;6821:2;6847:50;6889:7;6880:6;6869:9;6865:22;6847:50;:::i;:::-;6837:60;;6792:115;6593:321;;;;;:::o;6920:520::-;;;7055:2;7043:9;7034:7;7030:23;7026:32;7023:2;;;7071:1;7068;7061:12;7023:2;7114:1;7139:53;7184:7;7175:6;7164:9;7160:22;7139:53;:::i;:::-;7129:63;;7085:117;7269:2;7258:9;7254:18;7241:32;7300:18;7292:6;7289:30;7286:2;;;7332:1;7329;7322:12;7286:2;7360:63;7415:7;7406:6;7395:9;7391:22;7360:63;:::i;:::-;7350:73;;7212:221;7013:427;;;;;:::o;7446:118::-;7533:24;7551:5;7533:24;:::i;:::-;7528:3;7521:37;7511:53;;:::o;7570:109::-;7651:21;7666:5;7651:21;:::i;:::-;7646:3;7639:34;7629:50;;:::o;7685:360::-;;7799:38;7831:5;7799:38;:::i;:::-;7853:70;7916:6;7911:3;7853:70;:::i;:::-;7846:77;;7932:52;7977:6;7972:3;7965:4;7958:5;7954:16;7932:52;:::i;:::-;8009:29;8031:6;8009:29;:::i;:::-;8004:3;8000:39;7993:46;;7775:270;;;;;:::o;8051:373::-;;8183:38;8215:5;8183:38;:::i;:::-;8237:88;8318:6;8313:3;8237:88;:::i;:::-;8230:95;;8334:52;8379:6;8374:3;8367:4;8360:5;8356:16;8334:52;:::i;:::-;8411:6;8406:3;8402:16;8395:23;;8159:265;;;;;:::o;8452:849::-;;8594:5;8588:12;8623:36;8649:9;8623:36;:::i;:::-;8675:88;8756:6;8751:3;8675:88;:::i;:::-;8668:95;;8794:1;8783:9;8779:17;8810:1;8805:137;;;;8956:1;8951:344;;;;8772:523;;8805:137;8889:4;8885:9;8874;8870:25;8865:3;8858:38;8925:6;8920:3;8916:16;8909:23;;8805:137;;8951:344;9018:41;9053:5;9018:41;:::i;:::-;9081:1;9095:154;9109:6;9106:1;9103:13;9095:154;;;9183:7;9177:14;9173:1;9168:3;9164:11;9157:35;9233:1;9224:7;9220:15;9209:26;;9131:4;9128:1;9124:12;9119:17;;9095:154;;;9278:6;9273:3;9269:16;9262:23;;8958:337;;8772:523;;8561:740;;;;;;:::o;9307:364::-;;9423:39;9456:5;9423:39;:::i;:::-;9478:71;9542:6;9537:3;9478:71;:::i;:::-;9471:78;;9558:52;9603:6;9598:3;9591:4;9584:5;9580:16;9558:52;:::i;:::-;9635:29;9657:6;9635:29;:::i;:::-;9630:3;9626:39;9619:46;;9399:272;;;;;:::o;9677:377::-;;9811:39;9844:5;9811:39;:::i;:::-;9866:89;9948:6;9943:3;9866:89;:::i;:::-;9859:96;;9964:52;10009:6;10004:3;9997:4;9990:5;9986:16;9964:52;:::i;:::-;10041:6;10036:3;10032:16;10025:23;;9787:267;;;;;:::o;10060:366::-;;10223:67;10287:2;10282:3;10223:67;:::i;:::-;10216:74;;10299:93;10388:3;10299:93;:::i;:::-;10417:2;10412:3;10408:12;10401:19;;10206:220;;;:::o;10432:366::-;;10595:67;10659:2;10654:3;10595:67;:::i;:::-;10588:74;;10671:93;10760:3;10671:93;:::i;:::-;10789:2;10784:3;10780:12;10773:19;;10578:220;;;:::o;10804:366::-;;10967:67;11031:2;11026:3;10967:67;:::i;:::-;10960:74;;11043:93;11132:3;11043:93;:::i;:::-;11161:2;11156:3;11152:12;11145:19;;10950:220;;;:::o;11176:366::-;;11339:67;11403:2;11398:3;11339:67;:::i;:::-;11332:74;;11415:93;11504:3;11415:93;:::i;:::-;11533:2;11528:3;11524:12;11517:19;;11322:220;;;:::o;11548:366::-;;11711:67;11775:2;11770:3;11711:67;:::i;:::-;11704:74;;11787:93;11876:3;11787:93;:::i;:::-;11905:2;11900:3;11896:12;11889:19;;11694:220;;;:::o;11920:366::-;;12083:67;12147:2;12142:3;12083:67;:::i;:::-;12076:74;;12159:93;12248:3;12159:93;:::i;:::-;12277:2;12272:3;12268:12;12261:19;;12066:220;;;:::o;12292:366::-;;12455:67;12519:2;12514:3;12455:67;:::i;:::-;12448:74;;12531:93;12620:3;12531:93;:::i;:::-;12649:2;12644:3;12640:12;12633:19;;12438:220;;;:::o;12664:366::-;;12827:67;12891:2;12886:3;12827:67;:::i;:::-;12820:74;;12903:93;12992:3;12903:93;:::i;:::-;13021:2;13016:3;13012:12;13005:19;;12810:220;;;:::o;13036:366::-;;13199:67;13263:2;13258:3;13199:67;:::i;:::-;13192:74;;13275:93;13364:3;13275:93;:::i;:::-;13393:2;13388:3;13384:12;13377:19;;13182:220;;;:::o;13408:366::-;;13571:67;13635:2;13630:3;13571:67;:::i;:::-;13564:74;;13647:93;13736:3;13647:93;:::i;:::-;13765:2;13760:3;13756:12;13749:19;;13554:220;;;:::o;13780:366::-;;13943:67;14007:2;14002:3;13943:67;:::i;:::-;13936:74;;14019:93;14108:3;14019:93;:::i;:::-;14137:2;14132:3;14128:12;14121:19;;13926:220;;;:::o;14152:366::-;;14315:67;14379:2;14374:3;14315:67;:::i;:::-;14308:74;;14391:93;14480:3;14391:93;:::i;:::-;14509:2;14504:3;14500:12;14493:19;;14298:220;;;:::o;14524:366::-;;14687:67;14751:2;14746:3;14687:67;:::i;:::-;14680:74;;14763:93;14852:3;14763:93;:::i;:::-;14881:2;14876:3;14872:12;14865:19;;14670:220;;;:::o;14896:366::-;;15059:67;15123:2;15118:3;15059:67;:::i;:::-;15052:74;;15135:93;15224:3;15135:93;:::i;:::-;15253:2;15248:3;15244:12;15237:19;;15042:220;;;:::o;15268:366::-;;15431:67;15495:2;15490:3;15431:67;:::i;:::-;15424:74;;15507:93;15596:3;15507:93;:::i;:::-;15625:2;15620:3;15616:12;15609:19;;15414:220;;;:::o;15640:366::-;;15803:67;15867:2;15862:3;15803:67;:::i;:::-;15796:74;;15879:93;15968:3;15879:93;:::i;:::-;15997:2;15992:3;15988:12;15981:19;;15786:220;;;:::o;16012:366::-;;16175:67;16239:2;16234:3;16175:67;:::i;:::-;16168:74;;16251:93;16340:3;16251:93;:::i;:::-;16369:2;16364:3;16360:12;16353:19;;16158:220;;;:::o;16384:366::-;;16547:67;16611:2;16606:3;16547:67;:::i;:::-;16540:74;;16623:93;16712:3;16623:93;:::i;:::-;16741:2;16736:3;16732:12;16725:19;;16530:220;;;:::o;16756:366::-;;16919:67;16983:2;16978:3;16919:67;:::i;:::-;16912:74;;16995:93;17084:3;16995:93;:::i;:::-;17113:2;17108:3;17104:12;17097:19;;16902:220;;;:::o;17128:366::-;;17291:67;17355:2;17350:3;17291:67;:::i;:::-;17284:74;;17367:93;17456:3;17367:93;:::i;:::-;17485:2;17480:3;17476:12;17469:19;;17274:220;;;:::o;17500:366::-;;17663:67;17727:2;17722:3;17663:67;:::i;:::-;17656:74;;17739:93;17828:3;17739:93;:::i;:::-;17857:2;17852:3;17848:12;17841:19;;17646:220;;;:::o;17872:366::-;;18035:67;18099:2;18094:3;18035:67;:::i;:::-;18028:74;;18111:93;18200:3;18111:93;:::i;:::-;18229:2;18224:3;18220:12;18213:19;;18018:220;;;:::o;18244:366::-;;18407:67;18471:2;18466:3;18407:67;:::i;:::-;18400:74;;18483:93;18572:3;18483:93;:::i;:::-;18601:2;18596:3;18592:12;18585:19;;18390:220;;;:::o;18616:366::-;;18779:67;18843:2;18838:3;18779:67;:::i;:::-;18772:74;;18855:93;18944:3;18855:93;:::i;:::-;18973:2;18968:3;18964:12;18957:19;;18762:220;;;:::o;18988:366::-;;19151:67;19215:2;19210:3;19151:67;:::i;:::-;19144:74;;19227:93;19316:3;19227:93;:::i;:::-;19345:2;19340:3;19336:12;19329:19;;19134:220;;;:::o;19360:366::-;;19523:67;19587:2;19582:3;19523:67;:::i;:::-;19516:74;;19599:93;19688:3;19599:93;:::i;:::-;19717:2;19712:3;19708:12;19701:19;;19506:220;;;:::o;19732:366::-;;19895:67;19959:2;19954:3;19895:67;:::i;:::-;19888:74;;19971:93;20060:3;19971:93;:::i;:::-;20089:2;20084:3;20080:12;20073:19;;19878:220;;;:::o;20104:366::-;;20267:67;20331:2;20326:3;20267:67;:::i;:::-;20260:74;;20343:93;20432:3;20343:93;:::i;:::-;20461:2;20456:3;20452:12;20445:19;;20250:220;;;:::o;20476:118::-;20563:24;20581:5;20563:24;:::i;:::-;20558:3;20551:37;20541:53;;:::o;20600:271::-;;20752:93;20841:3;20832:6;20752:93;:::i;:::-;20745:100;;20862:3;20855:10;;20734:137;;;;:::o;20877:273::-;;21030:94;21120:3;21111:6;21030:94;:::i;:::-;21023:101;;21141:3;21134:10;;21012:138;;;;:::o;21156:435::-;;21358:95;21449:3;21440:6;21358:95;:::i;:::-;21351:102;;21470:95;21561:3;21552:6;21470:95;:::i;:::-;21463:102;;21582:3;21575:10;;21340:251;;;;;:::o;21597:222::-;;21728:2;21717:9;21713:18;21705:26;;21741:71;21809:1;21798:9;21794:17;21785:6;21741:71;:::i;:::-;21695:124;;;;:::o;21825:442::-;;22012:2;22001:9;21997:18;21989:26;;22025:71;22093:1;22082:9;22078:17;22069:6;22025:71;:::i;:::-;22106:72;22174:2;22163:9;22159:18;22150:6;22106:72;:::i;:::-;22188;22256:2;22245:9;22241:18;22232:6;22188:72;:::i;:::-;21979:288;;;;;;:::o;22273:640::-;;22506:3;22495:9;22491:19;22483:27;;22520:71;22588:1;22577:9;22573:17;22564:6;22520:71;:::i;:::-;22601:72;22669:2;22658:9;22654:18;22645:6;22601:72;:::i;:::-;22683;22751:2;22740:9;22736:18;22727:6;22683:72;:::i;:::-;22802:9;22796:4;22792:20;22787:2;22776:9;22772:18;22765:48;22830:76;22901:4;22892:6;22830:76;:::i;:::-;22822:84;;22473:440;;;;;;;:::o;22919:423::-;;23098:2;23087:9;23083:18;23075:26;;23111:71;23179:1;23168:9;23164:17;23155:6;23111:71;:::i;:::-;23229:9;23223:4;23219:20;23214:2;23203:9;23199:18;23192:48;23257:78;23330:4;23321:6;23257:78;:::i;:::-;23249:86;;23065:277;;;;;:::o;23348:332::-;;23507:2;23496:9;23492:18;23484:26;;23520:71;23588:1;23577:9;23573:17;23564:6;23520:71;:::i;:::-;23601:72;23669:2;23658:9;23654:18;23645:6;23601:72;:::i;:::-;23474:206;;;;;:::o;23686:442::-;;23873:2;23862:9;23858:18;23850:26;;23886:71;23954:1;23943:9;23939:17;23930:6;23886:71;:::i;:::-;23967:72;24035:2;24024:9;24020:18;24011:6;23967:72;:::i;:::-;24049;24117:2;24106:9;24102:18;24093:6;24049:72;:::i;:::-;23840:288;;;;;;:::o;24134:210::-;;24259:2;24248:9;24244:18;24236:26;;24272:65;24334:1;24323:9;24319:17;24310:6;24272:65;:::i;:::-;24226:118;;;;:::o;24350:313::-;;24501:2;24490:9;24486:18;24478:26;;24550:9;24544:4;24540:20;24536:1;24525:9;24521:17;24514:47;24578:78;24651:4;24642:6;24578:78;:::i;:::-;24570:86;;24468:195;;;;:::o;24669:419::-;;24873:2;24862:9;24858:18;24850:26;;24922:9;24916:4;24912:20;24908:1;24897:9;24893:17;24886:47;24950:131;25076:4;24950:131;:::i;:::-;24942:139;;24840:248;;;:::o;25094:419::-;;25298:2;25287:9;25283:18;25275:26;;25347:9;25341:4;25337:20;25333:1;25322:9;25318:17;25311:47;25375:131;25501:4;25375:131;:::i;:::-;25367:139;;25265:248;;;:::o;25519:419::-;;25723:2;25712:9;25708:18;25700:26;;25772:9;25766:4;25762:20;25758:1;25747:9;25743:17;25736:47;25800:131;25926:4;25800:131;:::i;:::-;25792:139;;25690:248;;;:::o;25944:419::-;;26148:2;26137:9;26133:18;26125:26;;26197:9;26191:4;26187:20;26183:1;26172:9;26168:17;26161:47;26225:131;26351:4;26225:131;:::i;:::-;26217:139;;26115:248;;;:::o;26369:419::-;;26573:2;26562:9;26558:18;26550:26;;26622:9;26616:4;26612:20;26608:1;26597:9;26593:17;26586:47;26650:131;26776:4;26650:131;:::i;:::-;26642:139;;26540:248;;;:::o;26794:419::-;;26998:2;26987:9;26983:18;26975:26;;27047:9;27041:4;27037:20;27033:1;27022:9;27018:17;27011:47;27075:131;27201:4;27075:131;:::i;:::-;27067:139;;26965:248;;;:::o;27219:419::-;;27423:2;27412:9;27408:18;27400:26;;27472:9;27466:4;27462:20;27458:1;27447:9;27443:17;27436:47;27500:131;27626:4;27500:131;:::i;:::-;27492:139;;27390:248;;;:::o;27644:419::-;;27848:2;27837:9;27833:18;27825:26;;27897:9;27891:4;27887:20;27883:1;27872:9;27868:17;27861:47;27925:131;28051:4;27925:131;:::i;:::-;27917:139;;27815:248;;;:::o;28069:419::-;;28273:2;28262:9;28258:18;28250:26;;28322:9;28316:4;28312:20;28308:1;28297:9;28293:17;28286:47;28350:131;28476:4;28350:131;:::i;:::-;28342:139;;28240:248;;;:::o;28494:419::-;;28698:2;28687:9;28683:18;28675:26;;28747:9;28741:4;28737:20;28733:1;28722:9;28718:17;28711:47;28775:131;28901:4;28775:131;:::i;:::-;28767:139;;28665:248;;;:::o;28919:419::-;;29123:2;29112:9;29108:18;29100:26;;29172:9;29166:4;29162:20;29158:1;29147:9;29143:17;29136:47;29200:131;29326:4;29200:131;:::i;:::-;29192:139;;29090:248;;;:::o;29344:419::-;;29548:2;29537:9;29533:18;29525:26;;29597:9;29591:4;29587:20;29583:1;29572:9;29568:17;29561:47;29625:131;29751:4;29625:131;:::i;:::-;29617:139;;29515:248;;;:::o;29769:419::-;;29973:2;29962:9;29958:18;29950:26;;30022:9;30016:4;30012:20;30008:1;29997:9;29993:17;29986:47;30050:131;30176:4;30050:131;:::i;:::-;30042:139;;29940:248;;;:::o;30194:419::-;;30398:2;30387:9;30383:18;30375:26;;30447:9;30441:4;30437:20;30433:1;30422:9;30418:17;30411:47;30475:131;30601:4;30475:131;:::i;:::-;30467:139;;30365:248;;;:::o;30619:419::-;;30823:2;30812:9;30808:18;30800:26;;30872:9;30866:4;30862:20;30858:1;30847:9;30843:17;30836:47;30900:131;31026:4;30900:131;:::i;:::-;30892:139;;30790:248;;;:::o;31044:419::-;;31248:2;31237:9;31233:18;31225:26;;31297:9;31291:4;31287:20;31283:1;31272:9;31268:17;31261:47;31325:131;31451:4;31325:131;:::i;:::-;31317:139;;31215:248;;;:::o;31469:419::-;;31673:2;31662:9;31658:18;31650:26;;31722:9;31716:4;31712:20;31708:1;31697:9;31693:17;31686:47;31750:131;31876:4;31750:131;:::i;:::-;31742:139;;31640:248;;;:::o;31894:419::-;;32098:2;32087:9;32083:18;32075:26;;32147:9;32141:4;32137:20;32133:1;32122:9;32118:17;32111:47;32175:131;32301:4;32175:131;:::i;:::-;32167:139;;32065:248;;;:::o;32319:419::-;;32523:2;32512:9;32508:18;32500:26;;32572:9;32566:4;32562:20;32558:1;32547:9;32543:17;32536:47;32600:131;32726:4;32600:131;:::i;:::-;32592:139;;32490:248;;;:::o;32744:419::-;;32948:2;32937:9;32933:18;32925:26;;32997:9;32991:4;32987:20;32983:1;32972:9;32968:17;32961:47;33025:131;33151:4;33025:131;:::i;:::-;33017:139;;32915:248;;;:::o;33169:419::-;;33373:2;33362:9;33358:18;33350:26;;33422:9;33416:4;33412:20;33408:1;33397:9;33393:17;33386:47;33450:131;33576:4;33450:131;:::i;:::-;33442:139;;33340:248;;;:::o;33594:419::-;;33798:2;33787:9;33783:18;33775:26;;33847:9;33841:4;33837:20;33833:1;33822:9;33818:17;33811:47;33875:131;34001:4;33875:131;:::i;:::-;33867:139;;33765:248;;;:::o;34019:419::-;;34223:2;34212:9;34208:18;34200:26;;34272:9;34266:4;34262:20;34258:1;34247:9;34243:17;34236:47;34300:131;34426:4;34300:131;:::i;:::-;34292:139;;34190:248;;;:::o;34444:419::-;;34648:2;34637:9;34633:18;34625:26;;34697:9;34691:4;34687:20;34683:1;34672:9;34668:17;34661:47;34725:131;34851:4;34725:131;:::i;:::-;34717:139;;34615:248;;;:::o;34869:419::-;;35073:2;35062:9;35058:18;35050:26;;35122:9;35116:4;35112:20;35108:1;35097:9;35093:17;35086:47;35150:131;35276:4;35150:131;:::i;:::-;35142:139;;35040:248;;;:::o;35294:419::-;;35498:2;35487:9;35483:18;35475:26;;35547:9;35541:4;35537:20;35533:1;35522:9;35518:17;35511:47;35575:131;35701:4;35575:131;:::i;:::-;35567:139;;35465:248;;;:::o;35719:419::-;;35923:2;35912:9;35908:18;35900:26;;35972:9;35966:4;35962:20;35958:1;35947:9;35943:17;35936:47;36000:131;36126:4;36000:131;:::i;:::-;35992:139;;35890:248;;;:::o;36144:419::-;;36348:2;36337:9;36333:18;36325:26;;36397:9;36391:4;36387:20;36383:1;36372:9;36368:17;36361:47;36425:131;36551:4;36425:131;:::i;:::-;36417:139;;36315:248;;;:::o;36569:222::-;;36700:2;36689:9;36685:18;36677:26;;36713:71;36781:1;36770:9;36766:17;36757:6;36713:71;:::i;:::-;36667:124;;;;:::o;36797:129::-;;36858:20;;:::i;:::-;36848:30;;36887:33;36915:4;36907:6;36887:33;:::i;:::-;36838:88;;;:::o;36932:75::-;;36998:2;36992:9;36982:19;;36972:35;:::o;37013:307::-;;37164:18;37156:6;37153:30;37150:2;;;37186:18;;:::i;:::-;37150:2;37224:29;37246:6;37224:29;:::i;:::-;37216:37;;37308:4;37302;37298:15;37290:23;;37079:241;;;:::o;37326:308::-;;37478:18;37470:6;37467:30;37464:2;;;37500:18;;:::i;:::-;37464:2;37538:29;37560:6;37538:29;:::i;:::-;37530:37;;37622:4;37616;37612:15;37604:23;;37393:241;;;:::o;37640:144::-;;37715:3;37707:11;;37738:3;37735:1;37728:14;37772:4;37769:1;37759:18;37751:26;;37697:87;;;:::o;37790:98::-;;37875:5;37869:12;37859:22;;37848:40;;;:::o;37894:99::-;;37980:5;37974:12;37964:22;;37953:40;;;:::o;37999:168::-;;38116:6;38111:3;38104:19;38156:4;38151:3;38147:14;38132:29;;38094:73;;;;:::o;38173:147::-;;38311:3;38296:18;;38286:34;;;;:::o;38326:169::-;;38444:6;38439:3;38432:19;38484:4;38479:3;38475:14;38460:29;;38422:73;;;;:::o;38501:148::-;;38640:3;38625:18;;38615:34;;;;:::o;38655:305::-;;38714:20;38732:1;38714:20;:::i;:::-;38709:25;;38748:20;38766:1;38748:20;:::i;:::-;38743:25;;38902:1;38834:66;38830:74;38827:1;38824:81;38821:2;;;38908:18;;:::i;:::-;38821:2;38952:1;38949;38945:9;38938:16;;38699:261;;;;:::o;38966:185::-;;39023:20;39041:1;39023:20;:::i;:::-;39018:25;;39057:20;39075:1;39057:20;:::i;:::-;39052:25;;39096:1;39086:2;;39101:18;;:::i;:::-;39086:2;39143:1;39140;39136:9;39131:14;;39008:143;;;;:::o;39157:348::-;;39220:20;39238:1;39220:20;:::i;:::-;39215:25;;39254:20;39272:1;39254:20;:::i;:::-;39249:25;;39442:1;39374:66;39370:74;39367:1;39364:81;39359:1;39352:9;39345:17;39341:105;39338:2;;;39449:18;;:::i;:::-;39338:2;39497:1;39494;39490:9;39479:20;;39205:300;;;;:::o;39511:191::-;;39571:20;39589:1;39571:20;:::i;:::-;39566:25;;39605:20;39623:1;39605:20;:::i;:::-;39600:25;;39644:1;39641;39638:8;39635:2;;;39649:18;;:::i;:::-;39635:2;39694:1;39691;39687:9;39679:17;;39556:146;;;;:::o;39708:96::-;;39774:24;39792:5;39774:24;:::i;:::-;39763:35;;39753:51;;;:::o;39810:90::-;;39887:5;39880:13;39873:21;39862:32;;39852:48;;;:::o;39906:149::-;;39982:66;39975:5;39971:78;39960:89;;39950:105;;;:::o;40061:126::-;;40138:42;40131:5;40127:54;40116:65;;40106:81;;;:::o;40193:77::-;;40259:5;40248:16;;40238:32;;;:::o;40276:154::-;40360:6;40355:3;40350;40337:30;40422:1;40413:6;40408:3;40404:16;40397:27;40327:103;;;:::o;40436:307::-;40504:1;40514:113;40528:6;40525:1;40522:13;40514:113;;;40613:1;40608:3;40604:11;40598:18;40594:1;40589:3;40585:11;40578:39;40550:2;40547:1;40543:10;40538:15;;40514:113;;;40645:6;40642:1;40639:13;40636:2;;;40725:1;40716:6;40711:3;40707:16;40700:27;40636:2;40485:258;;;;:::o;40749:320::-;;40830:1;40824:4;40820:12;40810:22;;40877:1;40871:4;40867:12;40898:18;40888:2;;40954:4;40946:6;40942:17;40932:27;;40888:2;41016;41008:6;41005:14;40985:18;40982:38;40979:2;;;41035:18;;:::i;:::-;40979:2;40800:269;;;;:::o;41075:281::-;41158:27;41180:4;41158:27;:::i;:::-;41150:6;41146:40;41288:6;41276:10;41273:22;41252:18;41240:10;41237:34;41234:62;41231:2;;;41299:18;;:::i;:::-;41231:2;41339:10;41335:2;41328:22;41118:238;;;:::o;41362:233::-;;41424:24;41442:5;41424:24;:::i;:::-;41415:33;;41470:66;41463:5;41460:77;41457:2;;;41540:18;;:::i;:::-;41457:2;41587:1;41580:5;41576:13;41569:20;;41405:190;;;:::o;41601:176::-;;41650:20;41668:1;41650:20;:::i;:::-;41645:25;;41684:20;41702:1;41684:20;:::i;:::-;41679:25;;41723:1;41713:2;;41728:18;;:::i;:::-;41713:2;41769:1;41766;41762:9;41757:14;;41635:142;;;;:::o;41783:180::-;41831:77;41828:1;41821:88;41928:4;41925:1;41918:15;41952:4;41949:1;41942:15;41969:180;42017:77;42014:1;42007:88;42114:4;42111:1;42104:15;42138:4;42135:1;42128:15;42155:180;42203:77;42200:1;42193:88;42300:4;42297:1;42290:15;42324:4;42321:1;42314:15;42341:180;42389:77;42386:1;42379:88;42486:4;42483:1;42476:15;42510:4;42507:1;42500:15;42527:102;;42619:2;42615:7;42610:2;42603:5;42599:14;42595:28;42585:38;;42575:54;;;:::o;42635:221::-;42775:34;42771:1;42763:6;42759:14;42752:58;42844:4;42839:2;42831:6;42827:15;42820:29;42741:115;:::o;42862:181::-;43002:33;42998:1;42990:6;42986:14;42979:57;42968:75;:::o;43049:237::-;43189:34;43185:1;43177:6;43173:14;43166:58;43258:20;43253:2;43245:6;43241:15;43234:45;43155:131;:::o;43292:225::-;43432:34;43428:1;43420:6;43416:14;43409:58;43501:8;43496:2;43488:6;43484:15;43477:33;43398:119;:::o;43523:178::-;43663:30;43659:1;43651:6;43647:14;43640:54;43629:72;:::o;43707:171::-;43847:23;43843:1;43835:6;43831:14;43824:47;43813:65;:::o;43884:223::-;44024:34;44020:1;44012:6;44008:14;44001:58;44093:6;44088:2;44080:6;44076:15;44069:31;43990:117;:::o;44113:175::-;44253:27;44249:1;44241:6;44237:14;44230:51;44219:69;:::o;44294:225::-;44434:34;44430:1;44422:6;44418:14;44411:58;44503:8;44498:2;44490:6;44486:15;44479:33;44400:119;:::o;44525:231::-;44665:34;44661:1;44653:6;44649:14;44642:58;44734:14;44729:2;44721:6;44717:15;44710:39;44631:125;:::o;44762:243::-;44902:34;44898:1;44890:6;44886:14;44879:58;44971:26;44966:2;44958:6;44954:15;44947:51;44868:137;:::o;45011:178::-;45151:30;45147:1;45139:6;45135:14;45128:54;45117:72;:::o;45195:229::-;45335:34;45331:1;45323:6;45319:14;45312:58;45404:12;45399:2;45391:6;45387:15;45380:37;45301:123;:::o;45430:227::-;45570:34;45566:1;45558:6;45554:14;45547:58;45639:10;45634:2;45626:6;45622:15;45615:35;45536:121;:::o;45663:182::-;45803:34;45799:1;45791:6;45787:14;45780:58;45769:76;:::o;45851:231::-;45991:34;45987:1;45979:6;45975:14;45968:58;46060:14;46055:2;46047:6;46043:15;46036:39;45957:125;:::o;46088:182::-;46228:34;46224:1;46216:6;46212:14;46205:58;46194:76;:::o;46276:234::-;46416:34;46412:1;46404:6;46400:14;46393:58;46485:17;46480:2;46472:6;46468:15;46461:42;46382:128;:::o;46516:228::-;46656:34;46652:1;46644:6;46640:14;46633:58;46725:11;46720:2;46712:6;46708:15;46701:36;46622:122;:::o;46750:220::-;46890:34;46886:1;46878:6;46874:14;46867:58;46959:3;46954:2;46946:6;46942:15;46935:28;46856:114;:::o;46976:220::-;47116:34;47112:1;47104:6;47100:14;47093:58;47185:3;47180:2;47172:6;47168:15;47161:28;47082:114;:::o;47202:182::-;47342:34;47338:1;47330:6;47326:14;47319:58;47308:76;:::o;47390:236::-;47530:34;47526:1;47518:6;47514:14;47507:58;47599:19;47594:2;47586:6;47582:15;47575:44;47496:130;:::o;47632:179::-;47772:31;47768:1;47760:6;47756:14;47749:55;47738:73;:::o;47817:177::-;47957:29;47953:1;47945:6;47941:14;47934:53;47923:71;:::o;48000:181::-;48140:33;48136:1;48128:6;48124:14;48117:57;48106:75;:::o;48187:235::-;48327:34;48323:1;48315:6;48311:14;48304:58;48396:18;48391:2;48383:6;48379:15;48372:43;48293:129;:::o;48428:173::-;48568:25;48564:1;48556:6;48552:14;48545:49;48534:67;:::o;48607:122::-;48680:24;48698:5;48680:24;:::i;:::-;48673:5;48670:35;48660:2;;48719:1;48716;48709:12;48660:2;48650:79;:::o;48735:116::-;48805:21;48820:5;48805:21;:::i;:::-;48798:5;48795:32;48785:2;;48841:1;48838;48831:12;48785:2;48775:76;:::o;48857:120::-;48929:23;48946:5;48929:23;:::i;:::-;48922:5;48919:34;48909:2;;48967:1;48964;48957:12;48909:2;48899:78;:::o;48983:122::-;49056:24;49074:5;49056:24;:::i;:::-;49049:5;49046:35;49036:2;;49095:1;49092;49085:12;49036:2;49026:79;:::o

Swarm Source

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