ETH Price: $3,245.05 (+2.34%)
Gas: 2 Gwei

Token

MoonCatPop (CAN)
 

Overview

Max Total Supply

714 CAN

Holders

160

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
inanairplane.eth
Balance
6 CAN
0xb6ffca576057f37ddfa2dd6159d56519a4ec5f21
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The MoonCats have begun launching their own brands and flavors of MoonCatPop from their own branded vending machines.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoonCatPopVendingMachine

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 14 : MCPVendingMachine.sol
// SPDX-License-Identifier: AGPL-3.0

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

interface IReverseResolver {
  function claim(address owner) external returns (bytes32);
}

interface IVendingMachineFactory {
  function moonCatVendingMachineExists(uint256 tokenId) external view returns (bool);
  function vendingMachineCanMintStart(uint256 tokenId) external view returns (uint256);
}

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
}

/**
 * @title MoonCatPop cans
 * @dev ERC721 token of a virtual can of pop.
 */
contract MoonCatPopVendingMachine is ERC721Enumerable, Ownable, Pausable {
  using Strings for uint256;

  string public baseURI;

  /* Financials */
  uint256 public constant primarySalesPercent = 80;
  uint256 public constant secondaryRoyaltiesPercent = 50;
  uint256 public constant moonCatOwnerDiscount = 0.01 ether;

  /* Vended Cans */
  uint256[256] public totalSupplyPerMachine;
  uint256 public maxCansPerMachine = 100;
  uint256 public vendingCost = 0.05 ether;

  /* External Contracts */
  address public moonCatPopVendingMachineFactory;
  address public constant moonCatAcclimatorContract = 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69;

  /* Events */
  event BaseURISet(string baseURI);

  /**
   * @dev Deploy contract.
   */
  constructor(address _factoryAddress) ERC721("MoonCatPop", "CAN") {
    moonCatPopVendingMachineFactory = _factoryAddress;
    _pause();

    // https://docs.ens.domains/contract-api-reference/reverseregistrar#claim-address
    IReverseResolver(0x084b1c3C81545d370f3634392De611CaaBFf8148)
      .claim(msg.sender);
  }

  /**
   * @dev Pause the contract.
   * Prevent minting and transferring of tokens
   */
  function paws() public onlyOwner {
      _pause();
  }

  /**
   * @dev Unpause the contract.
   * Allow minting and transferring of tokens
   */
  function unpaws() public onlyOwner {
      _unpause();
  }

  /**
   * @dev Update the base URI for token metadata.
   */
  function setBaseURI(string memory _newbaseURI) public onlyFactoryOwner() {
    baseURI = _newbaseURI;
    emit BaseURISet(_newbaseURI);
  }

  /**
    * @dev Rescue ERC20 assets sent directly to this contract.
    */
  function withdrawForeignERC20(address tokenContract) public onlyOwner {
    IERC20 token = IERC20(tokenContract);
    token.transfer(owner(), token.balanceOf(address(this)));
  }

  /**
    * @dev Rescue ERC721 assets sent directly to this contract.
    */
  function withdrawForeignERC721(address tokenContract, uint256 tokenId) public onlyOwner {
    IERC721(tokenContract).safeTransferFrom(address(this), owner(), tokenId);
  }

  /**
   * @dev Create a can of MoonCatPop
   */
  function mint(uint vendingMachineId)
    public
    payable
    returns(uint256)
  {
      uint256 cost = (IERC721(moonCatAcclimatorContract).balanceOf(_msgSender()) == 0)
          ? vendingCost
          : (vendingCost - moonCatOwnerDiscount);
      require(msg.value == cost, "Exact Change Required");
      return _mint(vendingMachineId, cost);
  }

  /**
   * @dev Create multiple cans of MoonCatPop
   */
  function batchMint(uint256[] memory vendingMachineIds)
    public
    payable
    returns(uint256[] memory)
  {
      uint256[] memory tokenIds = new uint256[](vendingMachineIds.length);
      uint256 cost = (IERC721(moonCatAcclimatorContract).balanceOf(_msgSender()) == 0)
          ? vendingCost
          : (vendingCost - moonCatOwnerDiscount);
      require(msg.value == cost * vendingMachineIds.length, "Exact Change Required");
      for (uint256 i; i < vendingMachineIds.length; i++) {
          tokenIds[i] = _mint(vendingMachineIds[i], cost);
      }
      return tokenIds;
  }

  /**
   * @dev Internal function to do shared minting actions.
   */
  function _mint(uint256 _vendingMachineId, uint256 _cost)
    internal
    whenNotPaused
    returns(uint256)
  {
    IVendingMachineFactory VMF = IVendingMachineFactory(moonCatPopVendingMachineFactory);
    require(VMF.moonCatVendingMachineExists(_vendingMachineId), "No Such Vending Machine");
    require(block.number >= VMF.vendingMachineCanMintStart(_vendingMachineId), "Can minting not open");
    require(totalSupplyPerMachine[_vendingMachineId] < maxCansPerMachine, "Can limit exceeded");
    uint256 tokenId = _vendingMachineId * maxCansPerMachine + totalSupplyPerMachine[_vendingMachineId];
    _safeMint(_msgSender(), tokenId);

    totalSupplyPerMachine[_vendingMachineId]++;

    address vendingMachineOwner = ERC721(moonCatPopVendingMachineFactory).ownerOf(_vendingMachineId);
    // Check if Owner is ERC998 contract
    // 0xed81cdda == rootOwnerOfChild(address,uint256)
    // 0xcd740db5 == ERC998 Magic Value
    (bool callSuccess, bytes memory data) = vendingMachineOwner.staticcall(abi.encodeWithSelector(0xed81cdda, moonCatPopVendingMachineFactory, _vendingMachineId));
    if (data.length != 0) {
      bytes32 dataBytes = abi.decode(data, (bytes32));
      if (callSuccess && dataBytes >> 224 == 0x00000000000000000000000000000000000000000000000000000000cd740db5) {
        // Token owner is a top-down composable
        vendingMachineOwner = address(uint160(uint256(dataBytes & 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)));
      }
    }

    uint256 vendingMachineOwnerPayment = _cost * primarySalesPercent / 100;
    (bool success,) = vendingMachineOwner.call{value:vendingMachineOwnerPayment}('');
    require(success, "Failed to transfer VM Owner payment");
    (success,) = moonCatPopVendingMachineFactory.call{value:_cost - vendingMachineOwnerPayment}('');
    require(success, "Failed to transfer Owner payment");
    return tokenId;
  }

  /**
   * @dev See {ERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
      require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
      uint256 vendingMachineId = _tokenId / maxCansPerMachine;
      uint256 canId = _tokenId % maxCansPerMachine;
      return bytes(baseURI).length > 0 ? string(abi.encodePacked(
        baseURI,
        vendingMachineId.toString(), '/',
        canId.toString(), '.json'
      )) : "";
  }

  /**
   * @dev See {ERC721-_beforeTokenTransfer}.
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override whenNotPaused {
    super._beforeTokenTransfer(from, to, tokenId);
  }

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

  /**
   * @dev Default funds-receiving method.
   */
  receive() external payable {
    payable(owner()).transfer(msg.value * secondaryRoyaltiesPercent / 100);
    (bool success,) = payable(moonCatPopVendingMachineFactory).call{value: address(this).balance}("");
    require(success,"transfer failed");
  }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 6 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 10 of 14 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

    bool private _paused;

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factoryAddress","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":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURISet","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"vendingMachineIds","type":"uint256[]"}],"name":"batchMint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCansPerMachine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vendingMachineId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"moonCatAcclimatorContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moonCatOwnerDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moonCatPopVendingMachineFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primarySalesPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondaryRoyaltiesPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupplyPerMachine","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":"unpaws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vendingCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052606461010c5566b1a2bc2ec5000061010d553480156200002357600080fd5b506040516200334638038062003346833981016040819052620000469162000337565b604080518082018252600a81526904d6f6f6e436174506f760b41b60208083019182528351808501909452600384526221a0a760e91b908401528151919291620000939160009162000291565b508051620000a990600190602084019062000291565b505050620000c6620000c06200018960201b60201c565b6200018d565b600a805460ff60a01b1916905561010e80546001600160a01b0319166001600160a01b038316179055620000f9620001df565b604051630f41a04d60e11b815233600482015273084b1c3c81545d370f3634392de611caabff814890631e83409a90602401602060405180830381600087803b1580156200014657600080fd5b505af11580156200015b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000181919062000369565b5050620003c0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001f3600a54600160a01b900460ff1690565b15620002385760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002743390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200029f9062000383565b90600052602060002090601f016020900481019282620002c357600085556200030e565b82601f10620002de57805160ff19168380011785556200030e565b828001600101855582156200030e579182015b828111156200030e578251825591602001919060010190620002f1565b506200031c92915062000320565b5090565b5b808211156200031c576000815560010162000321565b6000602082840312156200034a57600080fd5b81516001600160a01b03811681146200036257600080fd5b9392505050565b6000602082840312156200037c57600080fd5b5051919050565b600181811c908216806200039857607f821691505b60208210811415620003ba57634e487b7160e01b600052602260045260246000fd5b50919050565b612f7680620003d06000396000f3fe6080604052600436106102135760003560e01c80635fadc0f011610118578063a0712d68116100a0578063bd3f47cb1161006f578063bd3f47cb146106c3578063c87b56dd146106de578063e985e9c5146106fe578063f2fde38b14610747578063f803bf4a1461076757600080fd5b8063a0712d681461065b578063a22cb4651461066e578063ad2e22e21461068e578063b88d4fde146106a357600080fd5b806370a08231116100e757806370a08231146105d3578063715018a6146105f35780638da5cb5b146106085780638ffbe96b1461062657806395d89b411461064657600080fd5b80635fadc0f0146105725780636352211e146105875780636ac42fdf146105a75780636c0360eb146105be57600080fd5b806318160ddd1161019b578063431e60b31161016a578063431e60b3146104cb5780634f6ccce7146104f357806355f804b3146105135780635c471995146105335780635c975abb1461055357600080fd5b806318160ddd1461045657806323b872dd1461046b5780632f745c591461048b57806342842e0e146104ab57600080fd5b8063081812fc116101e2578063081812fc146103bd578063095ea7b3146103dd5780630ce06b68146103ff57806311b950c81461041f57806312a117911461043657600080fd5b806301ffc9a71461030a578063048e69cf1461033f57806306fdde031461037857806307f84f3f1461039a57600080fd5b3661030557600a546001600160a01b03166108fc6064610234603234612763565b61023e9190612798565b6040518115909202916000818181858888f19350505050158015610266573d6000803e3d6000fd5b5061010e546040516000916001600160a01b03169047908381818185875af1925050503d80600081146102b5576040519150601f19603f3d011682016040523d82523d6000602084013e6102ba565b606091505b50509050806103025760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50005b600080fd5b34801561031657600080fd5b5061032a6103253660046127c2565b61077c565b60405190151581526020015b60405180910390f35b34801561034b57600080fd5b5061010e54610360906001600160a01b031681565b6040516001600160a01b039091168152602001610336565b34801561038457600080fd5b5061038d6107a7565b6040516103369190612837565b3480156103a657600080fd5b506103af603281565b604051908152602001610336565b3480156103c957600080fd5b506103606103d836600461284a565b610839565b3480156103e957600080fd5b506103fd6103f8366004612878565b6108ce565b005b34801561040b57600080fd5b506103fd61041a366004612878565b6109e4565b34801561042b57600080fd5b506103af61010c5481565b34801561044257600080fd5b506103af61045136600461284a565b610a9b565b34801561046257600080fd5b506008546103af565b34801561047757600080fd5b506103fd6104863660046128a4565b610ab3565b34801561049757600080fd5b506103af6104a6366004612878565b610ae4565b3480156104b757600080fd5b506103fd6104c63660046128a4565b610b7a565b3480156104d757600080fd5b5061036073c3f733ca98e0dad0386979eb96fb1722a1a05e6981565b3480156104ff57600080fd5b506103af61050e36600461284a565b610b95565b34801561051f57600080fd5b506103fd61052e366004612984565b610c28565b34801561053f57600080fd5b506103fd61054e3660046129cd565b610d55565b34801561055f57600080fd5b50600a54600160a01b900460ff1661032a565b34801561057e57600080fd5b506103af605081565b34801561059357600080fd5b506103606105a236600461284a565b610e96565b3480156105b357600080fd5b506103af61010d5481565b3480156105ca57600080fd5b5061038d610f0d565b3480156105df57600080fd5b506103af6105ee3660046129cd565b610f9b565b3480156105ff57600080fd5b506103fd611022565b34801561061457600080fd5b50600a546001600160a01b0316610360565b6106396106343660046129ea565b611058565b6040516103369190612a90565b34801561065257600080fd5b5061038d611217565b6103af61066936600461284a565b611226565b34801561067a57600080fd5b506103fd610689366004612ae2565b61133a565b34801561069a57600080fd5b506103fd6113ff565b3480156106af57600080fd5b506103fd6106be366004612b1b565b611431565b3480156106cf57600080fd5b506103af662386f26fc1000081565b3480156106ea57600080fd5b5061038d6106f936600461284a565b611469565b34801561070a57600080fd5b5061032a610719366004612b9b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075357600080fd5b506103fd6107623660046129cd565b611577565b34801561077357600080fd5b506103fd611612565b60006001600160e01b0319821663780e9d6360e01b14806107a157506107a182611644565b92915050565b6060600080546107b690612bc9565b80601f01602080910402602001604051908101604052809291908181526020018280546107e290612bc9565b801561082f5780601f106108045761010080835404028352916020019161082f565b820191906000526020600020905b81548152906001019060200180831161081257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108b25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016102f9565b506000908152600460205260409020546001600160a01b031690565b60006108d982610e96565b9050806001600160a01b0316836001600160a01b031614156109475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016102f9565b336001600160a01b038216148061096357506109638133610719565b6109d55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016102f9565b6109df8383611694565b505050565b600a546001600160a01b03163314610a0e5760405162461bcd60e51b81526004016102f990612c04565b816001600160a01b03166342842e0e30610a30600a546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b505050505050565b600c816101008110610aac57600080fd5b0154905081565b610abd3382611702565b610ad95760405162461bcd60e51b81526004016102f990612c39565b6109df8383836117f5565b6000610aef83610f9b565b8210610b515760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016102f9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109df83838360405180602001604052806000815250611431565b6000610ba060085490565b8210610c035760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016102f9565b60088281548110610c1657610c16612c8a565b90600052602060002001549050919050565b61010e5460408051638da5cb5b60e01b8152905133926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b158015610c6d57600080fd5b505afa158015610c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca59190612ca0565b6001600160a01b031614610d075760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f7420666163746f7279206f6044820152633bb732b960e11b60648201526084016102f9565b8051610d1a90600b9060208401906126b4565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f681604051610d4a9190612837565b60405180910390a150565b600a546001600160a01b03163314610d7f5760405162461bcd60e51b81526004016102f990612c04565b806001600160a01b03811663a9059cbb610da1600a546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610de057600080fd5b505afa158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e189190612cbd565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610e5e57600080fd5b505af1158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612cd6565b6000818152600260205260408120546001600160a01b0316806107a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016102f9565b600b8054610f1a90612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4690612bc9565b8015610f935780601f10610f6857610100808354040283529160200191610f93565b820191906000526020600020905b815481529060010190602001808311610f7657829003601f168201915b505050505081565b60006001600160a01b0382166110065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016102f9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461104c5760405162461bcd60e51b81526004016102f990612c04565b61105660006119a0565b565b60606000825167ffffffffffffffff811115611076576110766128e5565b60405190808252806020026020018201604052801561109f578160200160208202803683370190505b509050600073c3f733ca98e0dad0386979eb96fb1722a1a05e696370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156110fe57600080fd5b505afa158015611112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111369190612cbd565b1561115657662386f26fc1000061010d546111519190612cf3565b61115b565b61010d545b905083518161116a9190612763565b34146111b05760405162461bcd60e51b8152602060048201526015602482015274115e1858dd0810da185b99d94814995c5d5a5c9959605a1b60448201526064016102f9565b60005b845181101561120e576111df8582815181106111d1576111d1612c8a565b6020026020010151836119f2565b8382815181106111f1576111f1612c8a565b60209081029190910101528061120681612d0a565b9150506111b3565b50909392505050565b6060600180546107b690612bc9565b60008073c3f733ca98e0dad0386979eb96fb1722a1a05e696370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190612cbd565b156112db57662386f26fc1000061010d546112d69190612cf3565b6112e0565b61010d545b90508034146113295760405162461bcd60e51b8152602060048201526015602482015274115e1858dd0810da185b99d94814995c5d5a5c9959605a1b60448201526064016102f9565b61133383826119f2565b9392505050565b6001600160a01b0382163314156113935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016102f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114295760405162461bcd60e51b81526004016102f990612c04565b611056611f58565b61143b3383611702565b6114575760405162461bcd60e51b81526004016102f990612c39565b61146384848484611ff5565b50505050565b6000818152600260205260409020546060906001600160a01b03166114e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016102f9565b600061010c54836114f99190612798565b9050600061010c548461150c9190612d25565b90506000600b805461151d90612bc9565b905011611539576040518060200160405280600081525061156f565b600b61154483612028565b61154d83612028565b60405160200161155f93929190612d55565b6040516020818303038152906040525b949350505050565b600a546001600160a01b031633146115a15760405162461bcd60e51b81526004016102f990612c04565b6001600160a01b0381166116065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f9565b61160f816119a0565b50565b600a546001600160a01b0316331461163c5760405162461bcd60e51b81526004016102f990612c04565b611056612126565b60006001600160e01b031982166380ac58cd60e01b148061167557506001600160e01b03198216635b5e139f60e01b145b806107a157506301ffc9a760e01b6001600160e01b03198316146107a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116c982610e96565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661177b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016102f9565b600061178683610e96565b9050806001600160a01b0316846001600160a01b031614806117c15750836001600160a01b03166117b684610839565b6001600160a01b0316145b8061156f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661156f565b826001600160a01b031661180882610e96565b6001600160a01b0316146118705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016102f9565b6001600160a01b0382166118d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016102f9565b6118dd83838361218b565b6118e8600082611694565b6001600160a01b0383166000908152600360205260408120805460019290611911908490612cf3565b90915550506001600160a01b038216600090815260036020526040812080546001929061193f908490612e2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600090600160a01b900460ff1615611a1f5760405162461bcd60e51b81526004016102f990612e42565b61010e5460405163240ffa9f60e11b8152600481018590526001600160a01b0390911690819063481ff53e9060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612cd6565b611aea5760405162461bcd60e51b815260206004820152601760248201527f4e6f20537563682056656e64696e67204d616368696e6500000000000000000060448201526064016102f9565b60405163e3c6add360e01b8152600481018590526001600160a01b0382169063e3c6add39060240160206040518083038186803b158015611b2a57600080fd5b505afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190612cbd565b431015611ba85760405162461bcd60e51b815260206004820152601460248201527321b0b71036b4b73a34b733903737ba1037b832b760611b60448201526064016102f9565b61010c54600c856101008110611bc057611bc0612c8a565b015410611c045760405162461bcd60e51b815260206004820152601260248201527110d85b881b1a5b5a5d08195e18d95959195960721b60448201526064016102f9565b6000600c856101008110611c1a57611c1a612c8a565b015461010c54611c2a9087612763565b611c349190612e2a565b9050611c4033826121c0565b600c856101008110611c5457611c54612c8a565b018054906000611c6383612d0a565b909155505061010e546040516331a9108f60e11b8152600481018790526000916001600160a01b031690636352211e9060240160206040518083038186803b158015611cae57600080fd5b505afa158015611cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce69190612ca0565b61010e54604080516001600160a01b03928316602482015260448082018b905282518083039091018152606490910182526020810180516001600160e01b03166376c0e6ed60e11b17905290519293506000928392851691611d4791612e6c565b600060405180830381855afa9150503d8060008114611d82576040519150601f19603f3d011682016040523d82523d6000602084013e611d87565b606091505b50915091508051600014611dd557600081806020019051810190611dab9190612cbd565b9050828015611dc1575063cd740db560e082901c145b15611dd3576001600160a01b03811693505b505b60006064611de460508a612763565b611dee9190612798565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5050905080611e9f5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f207472616e7366657220564d204f776e6572207061796d604482015262195b9d60ea1b60648201526084016102f9565b61010e546001600160a01b0316611eb6838b612cf3565b604051600081818185875af1925050503d8060008114611ef2576040519150601f19603f3d011682016040523d82523d6000602084013e611ef7565b606091505b50508091505080611f4a5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f207472616e73666572204f776e6572207061796d656e7460448201526064016102f9565b509398975050505050505050565b600a54600160a01b900460ff16611fa85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016102f9565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6120008484846117f5565b61200c848484846121de565b6114635760405162461bcd60e51b81526004016102f990612e88565b60608161204c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612076578061206081612d0a565b915061206f9050600a83612798565b9150612050565b60008167ffffffffffffffff811115612091576120916128e5565b6040519080825280601f01601f1916602001820160405280156120bb576020820181803683370190505b5090505b841561156f576120d0600183612cf3565b91506120dd600a86612d25565b6120e8906030612e2a565b60f81b8183815181106120fd576120fd612c8a565b60200101906001600160f81b031916908160001a90535061211f600a86612798565b94506120bf565b600a54600160a01b900460ff16156121505760405162461bcd60e51b81526004016102f990612e42565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd83390565b600a54600160a01b900460ff16156121b55760405162461bcd60e51b81526004016102f990612e42565b6109df8383836122eb565b6121da8282604051806020016040528060008152506123a3565b5050565b60006001600160a01b0384163b156122e057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612222903390899088908890600401612eda565b602060405180830381600087803b15801561223c57600080fd5b505af192505050801561226c575060408051601f3d908101601f1916820190925261226991810190612f0d565b60015b6122c6573d80801561229a576040519150601f19603f3d011682016040523d82523d6000602084013e61229f565b606091505b5080516122be5760405162461bcd60e51b81526004016102f990612e88565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061156f565b506001949350505050565b6001600160a01b0383166123465761234181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612369565b816001600160a01b0316836001600160a01b0316146123695761236983826123d6565b6001600160a01b038216612380576109df81612473565b826001600160a01b0316826001600160a01b0316146109df576109df8282612522565b6123ad8383612566565b6123ba60008484846121de565b6109df5760405162461bcd60e51b81526004016102f990612e88565b600060016123e384610f9b565b6123ed9190612cf3565b600083815260076020526040902054909150808214612440576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061248590600190612cf3565b600083815260096020526040812054600880549394509092849081106124ad576124ad612c8a565b9060005260206000200154905080600883815481106124ce576124ce612c8a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061250657612506612f2a565b6001900381819060005260206000200160009055905550505050565b600061252d83610f9b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166125bc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016102f9565b6000818152600260205260409020546001600160a01b0316156126215760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016102f9565b61262d6000838361218b565b6001600160a01b0382166000908152600360205260408120805460019290612656908490612e2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126c090612bc9565b90600052602060002090601f0160209004810192826126e25760008555612728565b82601f106126fb57805160ff1916838001178555612728565b82800160010185558215612728579182015b8281111561272857825182559160200191906001019061270d565b50612734929150612738565b5090565b5b808211156127345760008155600101612739565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561277d5761277d61274d565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127a7576127a7612782565b500490565b6001600160e01b03198116811461160f57600080fd5b6000602082840312156127d457600080fd5b8135611333816127ac565b60005b838110156127fa5781810151838201526020016127e2565b838111156114635750506000910152565b600081518084526128238160208601602086016127df565b601f01601f19169290920160200192915050565b602081526000611333602083018461280b565b60006020828403121561285c57600080fd5b5035919050565b6001600160a01b038116811461160f57600080fd5b6000806040838503121561288b57600080fd5b823561289681612863565b946020939093013593505050565b6000806000606084860312156128b957600080fd5b83356128c481612863565b925060208401356128d481612863565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612924576129246128e5565b604052919050565b600067ffffffffffffffff831115612946576129466128e5565b612959601f8401601f19166020016128fb565b905082815283838301111561296d57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561299657600080fd5b813567ffffffffffffffff8111156129ad57600080fd5b8201601f810184136129be57600080fd5b61156f8482356020840161292c565b6000602082840312156129df57600080fd5b813561133381612863565b600060208083850312156129fd57600080fd5b823567ffffffffffffffff80821115612a1557600080fd5b818501915085601f830112612a2957600080fd5b813581811115612a3b57612a3b6128e5565b8060051b9150612a4c8483016128fb565b8181529183018401918481019088841115612a6657600080fd5b938501935b83851015612a8457843582529385019390850190612a6b565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ac857835183529284019291840191600101612aac565b50909695505050505050565b801515811461160f57600080fd5b60008060408385031215612af557600080fd5b8235612b0081612863565b91506020830135612b1081612ad4565b809150509250929050565b60008060008060808587031215612b3157600080fd5b8435612b3c81612863565b93506020850135612b4c81612863565b925060408501359150606085013567ffffffffffffffff811115612b6f57600080fd5b8501601f81018713612b8057600080fd5b612b8f8782356020840161292c565b91505092959194509250565b60008060408385031215612bae57600080fd5b8235612bb981612863565b91506020830135612b1081612863565b600181811c90821680612bdd57607f821691505b60208210811415612bfe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cb257600080fd5b815161133381612863565b600060208284031215612ccf57600080fd5b5051919050565b600060208284031215612ce857600080fd5b815161133381612ad4565b600082821015612d0557612d0561274d565b500390565b6000600019821415612d1e57612d1e61274d565b5060010190565b600082612d3457612d34612782565b500690565b60008151612d4b8185602086016127df565b9290920192915050565b600080855481600182811c915080831680612d7157607f831692505b6020808410821415612d9157634e487b7160e01b86526022600452602486fd5b818015612da55760018114612db657612de3565b60ff19861689528489019650612de3565b60008c81526020902060005b86811015612ddb5781548b820152908501908301612dc2565b505084890196505b505050505050612e20612e0f612e09612dfc8489612d39565b602f60f81b815260010190565b86612d39565b64173539b7b760d91b815260050190565b9695505050505050565b60008219821115612e3d57612e3d61274d565b500190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008251612e7e8184602087016127df565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e209083018461280b565b600060208284031215612f1f57600080fd5b8151611333816127ac565b634e487b7160e01b600052603160045260246000fdfea26469706673582212207b31bffcfc4154d31793c9179f77918a6a178fa052168e1bfb0d009f4e9b8b9064736f6c6343000809003300000000000000000000000009c61c41c8c5d378cad80523044c065648eaa654

Deployed Bytecode

0x6080604052600436106102135760003560e01c80635fadc0f011610118578063a0712d68116100a0578063bd3f47cb1161006f578063bd3f47cb146106c3578063c87b56dd146106de578063e985e9c5146106fe578063f2fde38b14610747578063f803bf4a1461076757600080fd5b8063a0712d681461065b578063a22cb4651461066e578063ad2e22e21461068e578063b88d4fde146106a357600080fd5b806370a08231116100e757806370a08231146105d3578063715018a6146105f35780638da5cb5b146106085780638ffbe96b1461062657806395d89b411461064657600080fd5b80635fadc0f0146105725780636352211e146105875780636ac42fdf146105a75780636c0360eb146105be57600080fd5b806318160ddd1161019b578063431e60b31161016a578063431e60b3146104cb5780634f6ccce7146104f357806355f804b3146105135780635c471995146105335780635c975abb1461055357600080fd5b806318160ddd1461045657806323b872dd1461046b5780632f745c591461048b57806342842e0e146104ab57600080fd5b8063081812fc116101e2578063081812fc146103bd578063095ea7b3146103dd5780630ce06b68146103ff57806311b950c81461041f57806312a117911461043657600080fd5b806301ffc9a71461030a578063048e69cf1461033f57806306fdde031461037857806307f84f3f1461039a57600080fd5b3661030557600a546001600160a01b03166108fc6064610234603234612763565b61023e9190612798565b6040518115909202916000818181858888f19350505050158015610266573d6000803e3d6000fd5b5061010e546040516000916001600160a01b03169047908381818185875af1925050503d80600081146102b5576040519150601f19603f3d011682016040523d82523d6000602084013e6102ba565b606091505b50509050806103025760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064015b60405180910390fd5b50005b600080fd5b34801561031657600080fd5b5061032a6103253660046127c2565b61077c565b60405190151581526020015b60405180910390f35b34801561034b57600080fd5b5061010e54610360906001600160a01b031681565b6040516001600160a01b039091168152602001610336565b34801561038457600080fd5b5061038d6107a7565b6040516103369190612837565b3480156103a657600080fd5b506103af603281565b604051908152602001610336565b3480156103c957600080fd5b506103606103d836600461284a565b610839565b3480156103e957600080fd5b506103fd6103f8366004612878565b6108ce565b005b34801561040b57600080fd5b506103fd61041a366004612878565b6109e4565b34801561042b57600080fd5b506103af61010c5481565b34801561044257600080fd5b506103af61045136600461284a565b610a9b565b34801561046257600080fd5b506008546103af565b34801561047757600080fd5b506103fd6104863660046128a4565b610ab3565b34801561049757600080fd5b506103af6104a6366004612878565b610ae4565b3480156104b757600080fd5b506103fd6104c63660046128a4565b610b7a565b3480156104d757600080fd5b5061036073c3f733ca98e0dad0386979eb96fb1722a1a05e6981565b3480156104ff57600080fd5b506103af61050e36600461284a565b610b95565b34801561051f57600080fd5b506103fd61052e366004612984565b610c28565b34801561053f57600080fd5b506103fd61054e3660046129cd565b610d55565b34801561055f57600080fd5b50600a54600160a01b900460ff1661032a565b34801561057e57600080fd5b506103af605081565b34801561059357600080fd5b506103606105a236600461284a565b610e96565b3480156105b357600080fd5b506103af61010d5481565b3480156105ca57600080fd5b5061038d610f0d565b3480156105df57600080fd5b506103af6105ee3660046129cd565b610f9b565b3480156105ff57600080fd5b506103fd611022565b34801561061457600080fd5b50600a546001600160a01b0316610360565b6106396106343660046129ea565b611058565b6040516103369190612a90565b34801561065257600080fd5b5061038d611217565b6103af61066936600461284a565b611226565b34801561067a57600080fd5b506103fd610689366004612ae2565b61133a565b34801561069a57600080fd5b506103fd6113ff565b3480156106af57600080fd5b506103fd6106be366004612b1b565b611431565b3480156106cf57600080fd5b506103af662386f26fc1000081565b3480156106ea57600080fd5b5061038d6106f936600461284a565b611469565b34801561070a57600080fd5b5061032a610719366004612b9b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075357600080fd5b506103fd6107623660046129cd565b611577565b34801561077357600080fd5b506103fd611612565b60006001600160e01b0319821663780e9d6360e01b14806107a157506107a182611644565b92915050565b6060600080546107b690612bc9565b80601f01602080910402602001604051908101604052809291908181526020018280546107e290612bc9565b801561082f5780601f106108045761010080835404028352916020019161082f565b820191906000526020600020905b81548152906001019060200180831161081257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108b25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016102f9565b506000908152600460205260409020546001600160a01b031690565b60006108d982610e96565b9050806001600160a01b0316836001600160a01b031614156109475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016102f9565b336001600160a01b038216148061096357506109638133610719565b6109d55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016102f9565b6109df8383611694565b505050565b600a546001600160a01b03163314610a0e5760405162461bcd60e51b81526004016102f990612c04565b816001600160a01b03166342842e0e30610a30600a546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b505050505050565b600c816101008110610aac57600080fd5b0154905081565b610abd3382611702565b610ad95760405162461bcd60e51b81526004016102f990612c39565b6109df8383836117f5565b6000610aef83610f9b565b8210610b515760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016102f9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109df83838360405180602001604052806000815250611431565b6000610ba060085490565b8210610c035760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016102f9565b60088281548110610c1657610c16612c8a565b90600052602060002001549050919050565b61010e5460408051638da5cb5b60e01b8152905133926001600160a01b031691638da5cb5b916004808301926020929190829003018186803b158015610c6d57600080fd5b505afa158015610c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca59190612ca0565b6001600160a01b031614610d075760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f7420666163746f7279206f6044820152633bb732b960e11b60648201526084016102f9565b8051610d1a90600b9060208401906126b4565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f681604051610d4a9190612837565b60405180910390a150565b600a546001600160a01b03163314610d7f5760405162461bcd60e51b81526004016102f990612c04565b806001600160a01b03811663a9059cbb610da1600a546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610de057600080fd5b505afa158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e189190612cbd565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610e5e57600080fd5b505af1158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612cd6565b6000818152600260205260408120546001600160a01b0316806107a15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016102f9565b600b8054610f1a90612bc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4690612bc9565b8015610f935780601f10610f6857610100808354040283529160200191610f93565b820191906000526020600020905b815481529060010190602001808311610f7657829003601f168201915b505050505081565b60006001600160a01b0382166110065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016102f9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461104c5760405162461bcd60e51b81526004016102f990612c04565b61105660006119a0565b565b60606000825167ffffffffffffffff811115611076576110766128e5565b60405190808252806020026020018201604052801561109f578160200160208202803683370190505b509050600073c3f733ca98e0dad0386979eb96fb1722a1a05e696370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156110fe57600080fd5b505afa158015611112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111369190612cbd565b1561115657662386f26fc1000061010d546111519190612cf3565b61115b565b61010d545b905083518161116a9190612763565b34146111b05760405162461bcd60e51b8152602060048201526015602482015274115e1858dd0810da185b99d94814995c5d5a5c9959605a1b60448201526064016102f9565b60005b845181101561120e576111df8582815181106111d1576111d1612c8a565b6020026020010151836119f2565b8382815181106111f1576111f1612c8a565b60209081029190910101528061120681612d0a565b9150506111b3565b50909392505050565b6060600180546107b690612bc9565b60008073c3f733ca98e0dad0386979eb96fb1722a1a05e696370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190612cbd565b156112db57662386f26fc1000061010d546112d69190612cf3565b6112e0565b61010d545b90508034146113295760405162461bcd60e51b8152602060048201526015602482015274115e1858dd0810da185b99d94814995c5d5a5c9959605a1b60448201526064016102f9565b61133383826119f2565b9392505050565b6001600160a01b0382163314156113935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016102f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114295760405162461bcd60e51b81526004016102f990612c04565b611056611f58565b61143b3383611702565b6114575760405162461bcd60e51b81526004016102f990612c39565b61146384848484611ff5565b50505050565b6000818152600260205260409020546060906001600160a01b03166114e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016102f9565b600061010c54836114f99190612798565b9050600061010c548461150c9190612d25565b90506000600b805461151d90612bc9565b905011611539576040518060200160405280600081525061156f565b600b61154483612028565b61154d83612028565b60405160200161155f93929190612d55565b6040516020818303038152906040525b949350505050565b600a546001600160a01b031633146115a15760405162461bcd60e51b81526004016102f990612c04565b6001600160a01b0381166116065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f9565b61160f816119a0565b50565b600a546001600160a01b0316331461163c5760405162461bcd60e51b81526004016102f990612c04565b611056612126565b60006001600160e01b031982166380ac58cd60e01b148061167557506001600160e01b03198216635b5e139f60e01b145b806107a157506301ffc9a760e01b6001600160e01b03198316146107a1565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116c982610e96565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661177b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016102f9565b600061178683610e96565b9050806001600160a01b0316846001600160a01b031614806117c15750836001600160a01b03166117b684610839565b6001600160a01b0316145b8061156f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661156f565b826001600160a01b031661180882610e96565b6001600160a01b0316146118705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016102f9565b6001600160a01b0382166118d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016102f9565b6118dd83838361218b565b6118e8600082611694565b6001600160a01b0383166000908152600360205260408120805460019290611911908490612cf3565b90915550506001600160a01b038216600090815260036020526040812080546001929061193f908490612e2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600090600160a01b900460ff1615611a1f5760405162461bcd60e51b81526004016102f990612e42565b61010e5460405163240ffa9f60e11b8152600481018590526001600160a01b0390911690819063481ff53e9060240160206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612cd6565b611aea5760405162461bcd60e51b815260206004820152601760248201527f4e6f20537563682056656e64696e67204d616368696e6500000000000000000060448201526064016102f9565b60405163e3c6add360e01b8152600481018590526001600160a01b0382169063e3c6add39060240160206040518083038186803b158015611b2a57600080fd5b505afa158015611b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b629190612cbd565b431015611ba85760405162461bcd60e51b815260206004820152601460248201527321b0b71036b4b73a34b733903737ba1037b832b760611b60448201526064016102f9565b61010c54600c856101008110611bc057611bc0612c8a565b015410611c045760405162461bcd60e51b815260206004820152601260248201527110d85b881b1a5b5a5d08195e18d95959195960721b60448201526064016102f9565b6000600c856101008110611c1a57611c1a612c8a565b015461010c54611c2a9087612763565b611c349190612e2a565b9050611c4033826121c0565b600c856101008110611c5457611c54612c8a565b018054906000611c6383612d0a565b909155505061010e546040516331a9108f60e11b8152600481018790526000916001600160a01b031690636352211e9060240160206040518083038186803b158015611cae57600080fd5b505afa158015611cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce69190612ca0565b61010e54604080516001600160a01b03928316602482015260448082018b905282518083039091018152606490910182526020810180516001600160e01b03166376c0e6ed60e11b17905290519293506000928392851691611d4791612e6c565b600060405180830381855afa9150503d8060008114611d82576040519150601f19603f3d011682016040523d82523d6000602084013e611d87565b606091505b50915091508051600014611dd557600081806020019051810190611dab9190612cbd565b9050828015611dc1575063cd740db560e082901c145b15611dd3576001600160a01b03811693505b505b60006064611de460508a612763565b611dee9190612798565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5050905080611e9f5760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f207472616e7366657220564d204f776e6572207061796d604482015262195b9d60ea1b60648201526084016102f9565b61010e546001600160a01b0316611eb6838b612cf3565b604051600081818185875af1925050503d8060008114611ef2576040519150601f19603f3d011682016040523d82523d6000602084013e611ef7565b606091505b50508091505080611f4a5760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f207472616e73666572204f776e6572207061796d656e7460448201526064016102f9565b509398975050505050505050565b600a54600160a01b900460ff16611fa85760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016102f9565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6120008484846117f5565b61200c848484846121de565b6114635760405162461bcd60e51b81526004016102f990612e88565b60608161204c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612076578061206081612d0a565b915061206f9050600a83612798565b9150612050565b60008167ffffffffffffffff811115612091576120916128e5565b6040519080825280601f01601f1916602001820160405280156120bb576020820181803683370190505b5090505b841561156f576120d0600183612cf3565b91506120dd600a86612d25565b6120e8906030612e2a565b60f81b8183815181106120fd576120fd612c8a565b60200101906001600160f81b031916908160001a90535061211f600a86612798565b94506120bf565b600a54600160a01b900460ff16156121505760405162461bcd60e51b81526004016102f990612e42565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fd83390565b600a54600160a01b900460ff16156121b55760405162461bcd60e51b81526004016102f990612e42565b6109df8383836122eb565b6121da8282604051806020016040528060008152506123a3565b5050565b60006001600160a01b0384163b156122e057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612222903390899088908890600401612eda565b602060405180830381600087803b15801561223c57600080fd5b505af192505050801561226c575060408051601f3d908101601f1916820190925261226991810190612f0d565b60015b6122c6573d80801561229a576040519150601f19603f3d011682016040523d82523d6000602084013e61229f565b606091505b5080516122be5760405162461bcd60e51b81526004016102f990612e88565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061156f565b506001949350505050565b6001600160a01b0383166123465761234181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612369565b816001600160a01b0316836001600160a01b0316146123695761236983826123d6565b6001600160a01b038216612380576109df81612473565b826001600160a01b0316826001600160a01b0316146109df576109df8282612522565b6123ad8383612566565b6123ba60008484846121de565b6109df5760405162461bcd60e51b81526004016102f990612e88565b600060016123e384610f9b565b6123ed9190612cf3565b600083815260076020526040902054909150808214612440576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061248590600190612cf3565b600083815260096020526040812054600880549394509092849081106124ad576124ad612c8a565b9060005260206000200154905080600883815481106124ce576124ce612c8a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061250657612506612f2a565b6001900381819060005260206000200160009055905550505050565b600061252d83610f9b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166125bc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016102f9565b6000818152600260205260409020546001600160a01b0316156126215760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016102f9565b61262d6000838361218b565b6001600160a01b0382166000908152600360205260408120805460019290612656908490612e2a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126c090612bc9565b90600052602060002090601f0160209004810192826126e25760008555612728565b82601f106126fb57805160ff1916838001178555612728565b82800160010185558215612728579182015b8281111561272857825182559160200191906001019061270d565b50612734929150612738565b5090565b5b808211156127345760008155600101612739565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561277d5761277d61274d565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826127a7576127a7612782565b500490565b6001600160e01b03198116811461160f57600080fd5b6000602082840312156127d457600080fd5b8135611333816127ac565b60005b838110156127fa5781810151838201526020016127e2565b838111156114635750506000910152565b600081518084526128238160208601602086016127df565b601f01601f19169290920160200192915050565b602081526000611333602083018461280b565b60006020828403121561285c57600080fd5b5035919050565b6001600160a01b038116811461160f57600080fd5b6000806040838503121561288b57600080fd5b823561289681612863565b946020939093013593505050565b6000806000606084860312156128b957600080fd5b83356128c481612863565b925060208401356128d481612863565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612924576129246128e5565b604052919050565b600067ffffffffffffffff831115612946576129466128e5565b612959601f8401601f19166020016128fb565b905082815283838301111561296d57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561299657600080fd5b813567ffffffffffffffff8111156129ad57600080fd5b8201601f810184136129be57600080fd5b61156f8482356020840161292c565b6000602082840312156129df57600080fd5b813561133381612863565b600060208083850312156129fd57600080fd5b823567ffffffffffffffff80821115612a1557600080fd5b818501915085601f830112612a2957600080fd5b813581811115612a3b57612a3b6128e5565b8060051b9150612a4c8483016128fb565b8181529183018401918481019088841115612a6657600080fd5b938501935b83851015612a8457843582529385019390850190612a6b565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ac857835183529284019291840191600101612aac565b50909695505050505050565b801515811461160f57600080fd5b60008060408385031215612af557600080fd5b8235612b0081612863565b91506020830135612b1081612ad4565b809150509250929050565b60008060008060808587031215612b3157600080fd5b8435612b3c81612863565b93506020850135612b4c81612863565b925060408501359150606085013567ffffffffffffffff811115612b6f57600080fd5b8501601f81018713612b8057600080fd5b612b8f8782356020840161292c565b91505092959194509250565b60008060408385031215612bae57600080fd5b8235612bb981612863565b91506020830135612b1081612863565b600181811c90821680612bdd57607f821691505b60208210811415612bfe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cb257600080fd5b815161133381612863565b600060208284031215612ccf57600080fd5b5051919050565b600060208284031215612ce857600080fd5b815161133381612ad4565b600082821015612d0557612d0561274d565b500390565b6000600019821415612d1e57612d1e61274d565b5060010190565b600082612d3457612d34612782565b500690565b60008151612d4b8185602086016127df565b9290920192915050565b600080855481600182811c915080831680612d7157607f831692505b6020808410821415612d9157634e487b7160e01b86526022600452602486fd5b818015612da55760018114612db657612de3565b60ff19861689528489019650612de3565b60008c81526020902060005b86811015612ddb5781548b820152908501908301612dc2565b505084890196505b505050505050612e20612e0f612e09612dfc8489612d39565b602f60f81b815260010190565b86612d39565b64173539b7b760d91b815260050190565b9695505050505050565b60008219821115612e3d57612e3d61274d565b500190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008251612e7e8184602087016127df565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e209083018461280b565b600060208284031215612f1f57600080fd5b8151611333816127ac565b634e487b7160e01b600052603160045260246000fdfea26469706673582212207b31bffcfc4154d31793c9179f77918a6a178fa052168e1bfb0d009f4e9b8b9064736f6c63430008090033

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

00000000000000000000000009c61c41c8c5d378cad80523044c065648eaa654

-----Decoded View---------------
Arg [0] : _factoryAddress (address): 0x09C61c41C8C5D378CAd80523044C065648Eaa654

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000009c61c41c8c5d378cad80523044c065648eaa654


Deployed Bytecode Sourcemap

835:6615:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:6:0;;-1:-1:-1;;;;;1079:6:0;7226:70:13;7292:3;7252:37;1098:2;7252:9;:37;:::i;:::-;:43;;;;:::i;:::-;7226:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7329:31:13;;7321:79;;7304:12;;-1:-1:-1;;;;;7329:31:13;;7374:21;;7304:12;7321:79;7304:12;7321:79;7374:21;7329:31;7321:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7303:97;;;7415:7;7407:34;;;;-1:-1:-1;;;7407:34:13;;988:2:14;7407:34:13;;;970:21:14;1027:2;1007:18;;;1000:30;-1:-1:-1;;;1046:18:14;;;1039:45;1101:18;;7407:34:13;;;;;;;;;7219:228;835:6615;;;;;938:224:5;;;;;;;;;;-1:-1:-1;938:224:5;;;;;:::i;:::-;;:::i;:::-;;;1681:14:14;;1674:22;1656:41;;1644:2;1629:18;938:224:5;;;;;;;;1353:46:13;;;;;;;;;;-1:-1:-1;1353:46:13;;;;-1:-1:-1;;;;;1353:46:13;;;;;;-1:-1:-1;;;;;1872:32:14;;;1854:51;;1842:2;1827:18;1353:46:13;1708:203:14;2491:100:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1046:54:13:-;;;;;;;;;;;;1098:2;1046:54;;;;;2835:25:14;;;2823:2;2808:18;1046:54:13;2689:177:14;4050:221:2;;;;;;;;;;-1:-1:-1;4050:221:2;;;;;:::i;:::-;;:::i;3573:411::-;;;;;;;;;;-1:-1:-1;3573:411:2;;;;;:::i;:::-;;:::i;:::-;;2807:173:13;;;;;;;;;;-1:-1:-1;2807:173:13;;;;;:::i;:::-;;:::i;1236:38::-;;;;;;;;;;;;;;;;1190:41;;;;;;;;;;-1:-1:-1;1190:41:13;;;;;:::i;:::-;;:::i;1578:113:5:-;;;;;;;;;;-1:-1:-1;1666:10:5;:17;1578:113;;4940:339:2;;;;;;;;;;-1:-1:-1;4940:339:2;;;;;:::i;:::-;;:::i;1246:256:5:-;;;;;;;;;;-1:-1:-1;1246:256:5;;;;;:::i;:::-;;:::i;5350:185:2:-;;;;;;;;;;-1:-1:-1;5350:185:2;;;;;:::i;:::-;;:::i;1404:94:13:-;;;;;;;;;;;;1456:42;1404:94;;1768:233:5;;;;;;;;;;-1:-1:-1;1768:233:5;;;;;:::i;:::-;;:::i;2313:142:13:-;;;;;;;;;;-1:-1:-1;2313:142:13;;;;;:::i;:::-;;:::i;2540:181::-;;;;;;;;;;-1:-1:-1;2540:181:13;;;;;:::i;:::-;;:::i;1079:86:1:-;;;;;;;;;;-1:-1:-1;1150:7:1;;-1:-1:-1;;;1150:7:1;;;;1079:86;;993:48:13;;;;;;;;;;;;1039:2;993:48;;2185:239:2;;;;;;;;;;-1:-1:-1;2185:239:2;;;;;:::i;:::-;;:::i;1279:39:13:-;;;;;;;;;;;;;;;;945:21;;;;;;;;;;;;;:::i;1915:208:2:-;;;;;;;;;;-1:-1:-1;1915:208:2;;;;;:::i;:::-;;:::i;1657:94:0:-;;;;;;;;;;;;;:::i;1006:87::-;;;;;;;;;;-1:-1:-1;1079:6:0;;-1:-1:-1;;;;;1079:6:0;1006:87;;3466:600:13;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2660:104:2:-;;;;;;;;;;;;;:::i;3038:362:13:-;;;;;;:::i;:::-;;:::i;4343:295:2:-;;;;;;;;;;-1:-1:-1;4343:295:2;;;;;:::i;:::-;;:::i;2182:60:13:-;;;;;;;;;;;;;:::i;5606:328:2:-;;;;;;;;;;-1:-1:-1;5606:328:2;;;;;:::i;:::-;;:::i;1105:57:13:-;;;;;;;;;;;;1152:10;1105:57;;6133:492;;;;;;;;;;-1:-1:-1;6133:492:13;;;;;:::i;:::-;;:::i;4709:164:2:-;;;;;;;;;;-1:-1:-1;4709:164:2;;;;;:::i;:::-;-1:-1:-1;;;;;4830:25:2;;;4806:4;4830:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4709:164;1906:192:0;;;;;;;;;;-1:-1:-1;1906:192:0;;;;;:::i;:::-;;:::i;2026:56:13:-;;;;;;;;;;;;;:::i;938:224:5:-;1040:4;-1:-1:-1;;;;;;1064:50:5;;-1:-1:-1;;;1064:50:5;;:90;;;1118:36;1142:11;1118:23;:36::i;:::-;1057:97;938:224;-1:-1:-1;;938:224:5:o;2491:100:2:-;2545:13;2578:5;2571:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2491:100;:::o;4050:221::-;4126:7;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;4146:73;;;;-1:-1:-1;;;4146:73:2;;9383:2:14;4146:73:2;;;9365:21:14;9422:2;9402:18;;;9395:30;9461:34;9441:18;;;9434:62;-1:-1:-1;;;9512:18:14;;;9505:42;9564:19;;4146:73:2;9181:408:14;4146:73:2;-1:-1:-1;4239:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;4239:24:2;;4050:221::o;3573:411::-;3654:13;3670:23;3685:7;3670:14;:23::i;:::-;3654:39;;3718:5;-1:-1:-1;;;;;3712:11:2;:2;-1:-1:-1;;;;;3712:11:2;;;3704:57;;;;-1:-1:-1;;;3704:57:2;;9796:2:14;3704:57:2;;;9778:21:14;9835:2;9815:18;;;9808:30;9874:34;9854:18;;;9847:62;-1:-1:-1;;;9925:18:14;;;9918:31;9966:19;;3704:57:2;9594:397:14;3704:57:2;682:10:9;-1:-1:-1;;;;;3796:21:2;;;;:62;;-1:-1:-1;3821:37:2;3838:5;682:10:9;4709:164:2;:::i;3821:37::-;3774:168;;;;-1:-1:-1;;;3774:168:2;;10198:2:14;3774:168:2;;;10180:21:14;10237:2;10217:18;;;10210:30;10276:34;10256:18;;;10249:62;10347:26;10327:18;;;10320:54;10391:19;;3774:168:2;9996:420:14;3774:168:2;3955:21;3964:2;3968:7;3955:8;:21::i;:::-;3643:341;3573:411;;:::o;2807:173:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2910:13:13::1;-1:-1:-1::0;;;;;2902:39:13::1;;2950:4;2957:7;1079:6:0::0;;-1:-1:-1;;;;;1079:6:0;;1006:87;2957:7:13::1;2902:72;::::0;-1:-1:-1;;;;;;2902:72:13::1;::::0;;;;;;-1:-1:-1;;;;;11040:15:14;;;2902:72:13::1;::::0;::::1;11022:34:14::0;11092:15;;11072:18;;;11065:43;11124:18;;;11117:34;;;10957:18;;2902:72:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2807:173:::0;;:::o;1190:41::-;;;;;;;;;;;;;;;-1:-1:-1;1190:41:13;:::o;4940:339:2:-;5135:41;682:10:9;5168:7:2;5135:18;:41::i;:::-;5127:103;;;;-1:-1:-1;;;5127:103:2;;;;;;;:::i;:::-;5243:28;5253:4;5259:2;5263:7;5243:9;:28::i;1246:256:5:-;1343:7;1379:23;1396:5;1379:16;:23::i;:::-;1371:5;:31;1363:87;;;;-1:-1:-1;;;1363:87:5;;11782:2:14;1363:87:5;;;11764:21:14;11821:2;11801:18;;;11794:30;11860:34;11840:18;;;11833:62;-1:-1:-1;;;11911:18:14;;;11904:41;11962:19;;1363:87:5;11580:407:14;1363:87:5;-1:-1:-1;;;;;;1468:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1246:256::o;5350:185:2:-;5488:39;5505:4;5511:2;5515:7;5488:39;;;;;;;;;;;;:16;:39::i;1768:233:5:-;1843:7;1879:30;1666:10;:17;;1578:113;1879:30;1871:5;:38;1863:95;;;;-1:-1:-1;;;1863:95:5;;12194:2:14;1863:95:5;;;12176:21:14;12233:2;12213:18;;;12206:30;12272:34;12252:18;;;12245:62;-1:-1:-1;;;12323:18:14;;;12316:42;12375:19;;1863:95:5;11992:408:14;1863:95:5;1976:10;1987:5;1976:17;;;;;;;;:::i;:::-;;;;;;;;;1969:24;;1768:233;;;:::o;2313:142:13:-;7018:31;;7010:48;;;-1:-1:-1;;;7010:48:13;;;;682:10:9;;-1:-1:-1;;;;;7018:31:13;;7010:46;;:48;;;;;;;;;;;;;;7018:31;7010:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7010:64:13;;7002:113;;;;-1:-1:-1;;;7002:113:13;;12995:2:14;7002:113:13;;;12977:21:14;13034:2;13014:18;;;13007:30;13073:34;13053:18;;;13046:62;-1:-1:-1;;;13124:18:14;;;13117:34;13168:19;;7002:113:13;12793:400:14;7002:113:13;2393:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2426:23;2437:11;2426:23;;;;;;:::i;:::-;;;;;;;;2313:142:::0;:::o;2540:181::-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2639:13:13;-1:-1:-1;;;;;2660:14:13;::::1;;2675:7;1079:6:0::0;;-1:-1:-1;;;;;1079:6:0;;1006:87;2675:7:13::1;2684:30;::::0;-1:-1:-1;;;2684:30:13;;2708:4:::1;2684:30;::::0;::::1;1854:51:14::0;-1:-1:-1;;;;;2684:15:13;::::1;::::0;::::1;::::0;1827:18:14;;2684:30:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2660:55;::::0;-1:-1:-1;;;;;;2660:55:13::1;::::0;;;;;;-1:-1:-1;;;;;13579:32:14;;;2660:55:13::1;::::0;::::1;13561:51:14::0;13628:18;;;13621:34;13534:18;;2660:55:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2185:239:2:-:0;2257:7;2293:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2293:16:2;2328:19;2320:73;;;;-1:-1:-1;;;2320:73:2;;14118:2:14;2320:73:2;;;14100:21:14;14157:2;14137:18;;;14130:30;14196:34;14176:18;;;14169:62;-1:-1:-1;;;14247:18:14;;;14240:39;14296:19;;2320:73:2;13916:405:14;945:21:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1915:208:2:-;1987:7;-1:-1:-1;;;;;2015:19:2;;2007:74;;;;-1:-1:-1;;;2007:74:2;;14528:2:14;2007:74:2;;;14510:21:14;14567:2;14547:18;;;14540:30;14606:34;14586:18;;;14579:62;-1:-1:-1;;;14657:18:14;;;14650:40;14707:19;;2007:74:2;14326:406:14;2007:74:2;-1:-1:-1;;;;;;2099:16:2;;;;;:9;:16;;;;;;;1915:208::o;1657:94:0:-;1079:6;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;1722:21:::1;1740:1;1722:9;:21::i;:::-;1657:94::o:0;3466:600:13:-;3559:16;3589:25;3631:17;:24;3617:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3617:39:13;-1:-1:-1;3589:67:13;-1:-1:-1;3665:12:13;1456:42;3681:44;682:10:9;3681:58:13;;-1:-1:-1;;;;;;3681:58:13;;;;;;;-1:-1:-1;;;;;1872:32:14;;;3681:58:13;;;1854:51:14;1827:18;;3681:58:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;3680:140;;1152:10;3785:11;;:34;;;;:::i;:::-;3680:140;;;3759:11;;3680:140;3665:155;;3857:17;:24;3850:4;:31;;;;:::i;:::-;3837:9;:44;3829:78;;;;-1:-1:-1;;;3829:78:13;;15069:2:14;3829:78:13;;;15051:21:14;15108:2;15088:18;;;15081:30;-1:-1:-1;;;15127:18:14;;;15120:51;15188:18;;3829:78:13;14867:345:14;3829:78:13;3921:9;3916:121;3936:17;:24;3932:1;:28;3916:121;;;3994:33;4000:17;4018:1;4000:20;;;;;;;;:::i;:::-;;;;;;;4022:4;3994:5;:33::i;:::-;3980:8;3989:1;3980:11;;;;;;;;:::i;:::-;;;;;;;;;;:47;3962:3;;;;:::i;:::-;;;;3916:121;;;-1:-1:-1;4052:8:13;;3466:600;-1:-1:-1;;;3466:600:13:o;2660:104:2:-;2716:13;2749:7;2742:14;;;;;:::i;3038:362:13:-;3113:7;;1456:42;3150:44;682:10:9;3150:58:13;;-1:-1:-1;;;;;;3150:58:13;;;;;;;-1:-1:-1;;;;;1872:32:14;;;3150:58:13;;;1854:51:14;1827:18;;3150:58:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;3149:140;;1152:10;3254:11;;:34;;;;:::i;:::-;3149:140;;;3228:11;;3149:140;3134:155;;3319:4;3306:9;:17;3298:51;;;;-1:-1:-1;;;3298:51:13;;15069:2:14;3298:51:13;;;15051:21:14;15108:2;15088:18;;;15081:30;-1:-1:-1;;;15127:18:14;;;15120:51;15188:18;;3298:51:13;14867:345:14;3298:51:13;3365:29;3371:16;3389:4;3365:5;:29::i;:::-;3358:36;3038:362;-1:-1:-1;;;3038:362:13:o;4343:295:2:-;-1:-1:-1;;;;;4446:24:2;;682:10:9;4446:24:2;;4438:62;;;;-1:-1:-1;;;4438:62:2;;15559:2:14;4438:62:2;;;15541:21:14;15598:2;15578:18;;;15571:30;15637:27;15617:18;;;15610:55;15682:18;;4438:62:2;15357:349:14;4438:62:2;682:10:9;4513:32:2;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4513:42:2;;;;;;;;;;;;:53;;-1:-1:-1;;4513:53:2;;;;;;;;;;4582:48;;1656:41:14;;;4513:42:2;;682:10:9;4582:48:2;;1629:18:14;4582:48:2;;;;;;;4343:295;;:::o;2182:60:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2226:10:13::1;:8;:10::i;5606:328:2:-:0;5781:41;682:10:9;5814:7:2;5781:18;:41::i;:::-;5773:103;;;;-1:-1:-1;;;5773:103:2;;;;;;;:::i;:::-;5887:39;5901:4;5907:2;5911:7;5920:5;5887:13;:39::i;:::-;5606:328;;;;:::o;6133:492:13:-;7509:4:2;7533:16;;;:7;:16;;;;;;6219:13:13;;-1:-1:-1;;;;;7533:16:2;6246:77:13;;;;-1:-1:-1;;;6246:77:13;;15913:2:14;6246:77:13;;;15895:21:14;15952:2;15932:18;;;15925:30;15991:34;15971:18;;;15964:62;-1:-1:-1;;;16042:18:14;;;16035:45;16097:19;;6246:77:13;15711:411:14;6246:77:13;6332:24;6370:17;;6359:8;:28;;;;:::i;:::-;6332:55;;6396:13;6423:17;;6412:8;:28;;;;:::i;:::-;6396:44;;6480:1;6462:7;6456:21;;;;;:::i;:::-;;;:25;:163;;;;;;;;;;;;;;;;;6518:7;6536:27;:16;:25;:27::i;:::-;6579:16;:5;:14;:16::i;:::-;6491:122;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6456:163;6449:170;6133:492;-1:-1:-1;;;;6133:492:13:o;1906:192:0:-;1079:6;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1995:22:0;::::1;1987:73;;;::::0;-1:-1:-1;;;1987:73:0;;18512:2:14;1987:73:0::1;::::0;::::1;18494:21:14::0;18551:2;18531:18;;;18524:30;18590:34;18570:18;;;18563:62;-1:-1:-1;;;18641:18:14;;;18634:36;18687:19;;1987:73:0::1;18310:402:14::0;1987:73:0::1;2071:19;2081:8;2071:9;:19::i;:::-;1906:192:::0;:::o;2026:56:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2068:8:13::1;:6;:8::i;1546:305:2:-:0;1648:4;-1:-1:-1;;;;;;1685:40:2;;-1:-1:-1;;;1685:40:2;;:105;;-1:-1:-1;;;;;;;1742:48:2;;-1:-1:-1;;;1742:48:2;1685:105;:158;;;-1:-1:-1;;;;;;;;;;896:40:11;;;1807:36:2;787:157:11;11426:174:2;11501:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11501:29:2;-1:-1:-1;;;;;11501:29:2;;;;;;;;:24;;11555:23;11501:24;11555:14;:23::i;:::-;-1:-1:-1;;;;;11546:46:2;;;;;;;;;;;11426:174;;:::o;7738:348::-;7831:4;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;7848:73;;;;-1:-1:-1;;;7848:73:2;;18919:2:14;7848:73:2;;;18901:21:14;18958:2;18938:18;;;18931:30;18997:34;18977:18;;;18970:62;-1:-1:-1;;;19048:18:14;;;19041:42;19100:19;;7848:73:2;18717:408:14;7848:73:2;7932:13;7948:23;7963:7;7948:14;:23::i;:::-;7932:39;;8001:5;-1:-1:-1;;;;;7990:16:2;:7;-1:-1:-1;;;;;7990:16:2;;:51;;;;8034:7;-1:-1:-1;;;;;8010:31:2;:20;8022:7;8010:11;:20::i;:::-;-1:-1:-1;;;;;8010:31:2;;7990:51;:87;;;-1:-1:-1;;;;;;4830:25:2;;;4806:4;4830:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8045:32;4709:164;10730:578;10889:4;-1:-1:-1;;;;;10862:31:2;:23;10877:7;10862:14;:23::i;:::-;-1:-1:-1;;;;;10862:31:2;;10854:85;;;;-1:-1:-1;;;10854:85:2;;19332:2:14;10854:85:2;;;19314:21:14;19371:2;19351:18;;;19344:30;19410:34;19390:18;;;19383:62;-1:-1:-1;;;19461:18:14;;;19454:39;19510:19;;10854:85:2;19130:405:14;10854:85:2;-1:-1:-1;;;;;10958:16:2;;10950:65;;;;-1:-1:-1;;;10950:65:2;;19742:2:14;10950:65:2;;;19724:21:14;19781:2;19761:18;;;19754:30;19820:34;19800:18;;;19793:62;-1:-1:-1;;;19871:18:14;;;19864:34;19915:19;;10950:65:2;19540:400:14;10950:65:2;11028:39;11049:4;11055:2;11059:7;11028:20;:39::i;:::-;11132:29;11149:1;11153:7;11132:8;:29::i;:::-;-1:-1:-1;;;;;11174:15:2;;;;;;:9;:15;;;;;:20;;11193:1;;11174:15;:20;;11193:1;;11174:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11205:13:2;;;;;;:9;:13;;;;;:18;;11222:1;;11205:13;:18;;11222:1;;11205:18;:::i;:::-;;;;-1:-1:-1;;11234:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11234:21:2;-1:-1:-1;;;;;11234:21:2;;;;;;;;;11273:27;;11234:16;;11273:27;;;;;;;10730:578;;;:::o;2106:173:0:-;2181:6;;;-1:-1:-1;;;;;2198:17:0;;;-1:-1:-1;;;;;;2198:17:0;;;;;;;2231:40;;2181:6;;;2198:17;2181:6;;2231:40;;2162:16;;2231:40;2151:128;2106:173;:::o;4145:1926:13:-;1150:7:1;;4248::13;;-1:-1:-1;;;1150:7:1;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:1;;;;;;;:::i;:::-;4319:31:13::1;::::0;4366:50:::1;::::0;-1:-1:-1;;;4366:50:13;;::::1;::::0;::::1;2835:25:14::0;;;-1:-1:-1;;;;;4319:31:13;;::::1;::::0;;;4366::::1;::::0;2808:18:14;;4366:50:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4358:86;;;::::0;-1:-1:-1;;;4358:86:13;;20625:2:14;4358:86:13::1;::::0;::::1;20607:21:14::0;20664:2;20644:18;;;20637:30;20703:25;20683:18;;;20676:53;20746:18;;4358:86:13::1;20423:347:14::0;4358:86:13::1;4475:49;::::0;-1:-1:-1;;;4475:49:13;;::::1;::::0;::::1;2835:25:14::0;;;-1:-1:-1;;;;;4475:30:13;::::1;::::0;::::1;::::0;2808:18:14;;4475:49:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4459:12;:65;;4451:98;;;::::0;-1:-1:-1;;;4451:98:13;;20977:2:14;4451:98:13::1;::::0;::::1;20959:21:14::0;21016:2;20996:18;;;20989:30;-1:-1:-1;;;21035:18:14;;;21028:50;21095:18;;4451:98:13::1;20775:344:14::0;4451:98:13::1;4607:17;;4564:21;4586:17;4564:40;;;;;;;:::i;:::-;;;:60;4556:91;;;::::0;-1:-1:-1;;;4556:91:13;;21326:2:14;4556:91:13::1;::::0;::::1;21308:21:14::0;21365:2;21345:18;;;21338:30;-1:-1:-1;;;21384:18:14;;;21377:48;21442:18;;4556:91:13::1;21124:342:14::0;4556:91:13::1;4654:15;4712:21;4734:17;4712:40;;;;;;;:::i;:::-;;::::0;4692:17:::1;::::0;4672:37:::1;::::0;:17;:37:::1;:::i;:::-;:80;;;;:::i;:::-;4654:98:::0;-1:-1:-1;4759:32:13::1;682:10:9::0;4783:7:13::1;4759:9;:32::i;:::-;4800:21;4822:17;4800:40;;;;;;;:::i;:::-;;:42:::0;;;:40:::1;:42;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;4888:31:13::1;::::0;4881:66:::1;::::0;-1:-1:-1;;;4881:66:13;;::::1;::::0;::::1;2835:25:14::0;;;4851:27:13::1;::::0;-1:-1:-1;;;;;4888:31:13::1;::::0;4881:47:::1;::::0;2808:18:14;;4881:66:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5199:31;::::0;5164:86:::1;::::0;;-1:-1:-1;;;;;5199:31:13;;::::1;5164:86;::::0;::::1;13561:51:14::0;13628:18;;;;13621:34;;;5164:86:13;;;;;;;;;;13534:18:14;;;;5164:86:13;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;5164:86:13::1;-1:-1:-1::0;;;5164:86:13::1;::::0;;5133:118;;4851:96;;-1:-1:-1;;;;;5133:30:13;::::1;::::0;:118:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5093:158;;;;5262:4;:11;5277:1;5262:16;5258:398;;5289:17;5320:4;5309:27;;;;;;;;;;;;:::i;:::-;5289:47;;5349:11;:101;;;;-1:-1:-1::0;5384:66:13::1;5377:3;5364:16:::0;;::::1;:86;5349:101;5345:304;;;-1:-1:-1::0;;;;;5558:78:13;::::1;::::0;-1:-1:-1;5345:304:13::1;5280:376;5258:398;5664:34;5731:3;5701:27;1039:2;5701:5:::0;:27:::1;:::i;:::-;:33;;;;:::i;:::-;5664:70;;5742:12;5759:19;-1:-1:-1::0;;;;;5759:24:13::1;5790:26;5759:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5741:80;;;5836:7;5828:55;;;::::0;-1:-1:-1;;;5828:55:13;;22141:2:14;5828:55:13::1;::::0;::::1;22123:21:14::0;22180:2;22160:18;;;22153:30;22219:34;22199:18;;;22192:62;-1:-1:-1;;;22270:18:14;;;22263:33;22313:19;;5828:55:13::1;21939:399:14::0;5828:55:13::1;5903:31;::::0;-1:-1:-1;;;;;5903:31:13::1;5946:34;5954:26:::0;5946:5;:34:::1;:::i;:::-;5903:82;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5890:95;;;;;6000:7;5992:52;;;::::0;-1:-1:-1;;;5992:52:13;;22545:2:14;5992:52:13::1;::::0;::::1;22527:21:14::0;;;22564:18;;;22557:30;22623:34;22603:18;;;22596:62;22675:18;;5992:52:13::1;22343:356:14::0;5992:52:13::1;-1:-1:-1::0;6058:7:13;;4145:1926;-1:-1:-1;;;;;;;;4145:1926:13:o;2138:120:1:-;1150:7;;-1:-1:-1;;;1150:7:1;;;;1674:41;;;;-1:-1:-1;;;1674:41:1;;22906:2:14;1674:41:1;;;22888:21:14;22945:2;22925:18;;;22918:30;-1:-1:-1;;;22964:18:14;;;22957:50;23024:18;;1674:41:1;22704:344:14;1674:41:1;2197:7:::1;:15:::0;;-1:-1:-1;;;;2197:15:1::1;::::0;;2228:22:::1;682:10:9::0;2237:12:1::1;2228:22;::::0;-1:-1:-1;;;;;1872:32:14;;;1854:51;;1842:2;1827:18;2228:22:1::1;;;;;;;2138:120::o:0;6816:315:2:-;6973:28;6983:4;6989:2;6993:7;6973:9;:28::i;:::-;7020:48;7043:4;7049:2;7053:7;7062:5;7020:22;:48::i;:::-;7012:111;;;;-1:-1:-1;;;7012:111:2;;;;;;;:::i;288:723:10:-;344:13;565:10;561:53;;-1:-1:-1;;592:10:10;;;;;;;;;;;;-1:-1:-1;;;592:10:10;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:10;;-1:-1:-1;744:2:10;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:10;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:10;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:10;;;;;;;;-1:-1:-1;949:11:10;958:2;949:11;;:::i;:::-;;;818:154;;1879:118:1;1150:7;;-1:-1:-1;;;1150:7:1;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:1;;;;;;;:::i;:::-;1939:7:::1;:14:::0;;-1:-1:-1;;;;1939:14:1::1;-1:-1:-1::0;;;1939:14:1::1;::::0;;1969:20:::1;1976:12;682:10:9::0;;602:98;6691:183:13;1150:7:1;;-1:-1:-1;;;1150:7:1;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:1;;;;;;;:::i;:::-;6823:45:13::1;6850:4;6856:2;6860:7;6823:26;:45::i;8428:110:2:-:0;8504:26;8514:2;8518:7;8504:26;;;;;;;;;;;;:9;:26::i;:::-;8428:110;;:::o;12165:799::-;12320:4;-1:-1:-1;;;;;12341:13:2;;1066:20:8;1114:8;12337:620:2;;12377:72;;-1:-1:-1;;;12377:72:2;;-1:-1:-1;;;;;12377:36:2;;;;;:72;;682:10:9;;12428:4:2;;12434:7;;12443:5;;12377:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12377:72:2;;;;;;;;-1:-1:-1;;12377:72:2;;;;;;;;;;;;:::i;:::-;;;12373:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12619:13:2;;12615:272;;12662:60;;-1:-1:-1;;;12662:60:2;;;;;;;:::i;12615:272::-;12837:6;12831:13;12822:6;12818:2;12814:15;12807:38;12373:529;-1:-1:-1;;;;;;12500:51:2;-1:-1:-1;;;12500:51:2;;-1:-1:-1;12493:58:2;;12337:620;-1:-1:-1;12941:4:2;12165:799;;;;;;:::o;2614:589:5:-;-1:-1:-1;;;;;2820:18:5;;2816:187;;2855:40;2887:7;4030:10;:17;;4003:24;;;;:15;:24;;;;;:44;;;4058:24;;;;;;;;;;;;3926:164;2855:40;2816:187;;;2925:2;-1:-1:-1;;;;;2917:10:5;:4;-1:-1:-1;;;;;2917:10:5;;2913:90;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3017:16:5;;3013:183;;3050:45;3087:7;3050:36;:45::i;3013:183::-;3123:4;-1:-1:-1;;;;;3117:10:5;:2;-1:-1:-1;;;;;3117:10:5;;3113:83;;3144:40;3172:2;3176:7;3144:27;:40::i;8765:321:2:-;8895:18;8901:2;8905:7;8895:5;:18::i;:::-;8946:54;8977:1;8981:2;8985:7;8994:5;8946:22;:54::i;:::-;8924:154;;;;-1:-1:-1;;;8924:154:2;;;;;;;:::i;4717:988:5:-;4983:22;5033:1;5008:22;5025:4;5008:16;:22::i;:::-;:26;;;;:::i;:::-;5045:18;5066:26;;;:17;:26;;;;;;4983:51;;-1:-1:-1;5199:28:5;;;5195:328;;-1:-1:-1;;;;;5266:18:5;;5244:19;5266:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5317:30;;;;;;:44;;;5434:30;;:17;:30;;;;;:43;;;5195:328;-1:-1:-1;5619:26:5;;;;:17;:26;;;;;;;;5612:33;;;-1:-1:-1;;;;;5663:18:5;;;;;:12;:18;;;;;:34;;;;;;;5656:41;4717:988::o;6000:1079::-;6278:10;:17;6253:22;;6278:21;;6298:1;;6278:21;:::i;:::-;6310:18;6331:24;;;:15;:24;;;;;;6704:10;:26;;6253:46;;-1:-1:-1;6331:24:5;;6253:46;;6704:26;;;;;;:::i;:::-;;;;;;;;;6682:48;;6768:11;6743:10;6754;6743:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6848:28;;;:15;:28;;;;;;;:41;;;7020:24;;;;;7013:31;7055:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6071:1008;;;6000:1079;:::o;3504:221::-;3589:14;3606:20;3623:2;3606:16;:20::i;:::-;-1:-1:-1;;;;;3637:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3682:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3504:221:5:o;9422:382:2:-;-1:-1:-1;;;;;9502:16:2;;9494:61;;;;-1:-1:-1;;;9494:61:2;;24565:2:14;9494:61:2;;;24547:21:14;;;24584:18;;;24577:30;24643:34;24623:18;;;24616:62;24695:18;;9494:61:2;24363:356:14;9494:61:2;7509:4;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;:30;9566:58;;;;-1:-1:-1;;;9566:58:2;;24926:2:14;9566:58:2;;;24908:21:14;24965:2;24945:18;;;24938:30;25004;24984:18;;;24977:58;25052:18;;9566:58:2;24724:352:14;9566:58:2;9637:45;9666:1;9670:2;9674:7;9637:20;:45::i;:::-;-1:-1:-1;;;;;9695:13:2;;;;;;:9;:13;;;;;:18;;9712:1;;9695:13;:18;;9712:1;;9695:18;:::i;:::-;;;;-1:-1:-1;;9724:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9724:21:2;-1:-1:-1;;;;;9724:21:2;;;;;;;;9763:33;;9724:16;;;9763:33;;9724:16;;9763:33;9422:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:14;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:168;186:7;252:1;248;244:6;240:14;237:1;234:21;229:1;222:9;215:17;211:45;208:71;;;259:18;;:::i;:::-;-1:-1:-1;299:9:14;;146:168::o;319:127::-;380:10;375:3;371:20;368:1;361:31;411:4;408:1;401:15;435:4;432:1;425:15;451:120;491:1;517;507:35;;522:18;;:::i;:::-;-1:-1:-1;556:9:14;;451:120::o;1130:131::-;-1:-1:-1;;;;;;1204:32:14;;1194:43;;1184:71;;1251:1;1248;1241:12;1266:245;1324:6;1377:2;1365:9;1356:7;1352:23;1348:32;1345:52;;;1393:1;1390;1383:12;1345:52;1432:9;1419:23;1451:30;1475:5;1451:30;:::i;1916:258::-;1988:1;1998:113;2012:6;2009:1;2006:13;1998:113;;;2088:11;;;2082:18;2069:11;;;2062:39;2034:2;2027:10;1998:113;;;2129:6;2126:1;2123:13;2120:48;;;-1:-1:-1;;2164:1:14;2146:16;;2139:27;1916:258::o;2179:269::-;2232:3;2270:5;2264:12;2297:6;2292:3;2285:19;2313:63;2369:6;2362:4;2357:3;2353:14;2346:4;2339:5;2335:16;2313:63;:::i;:::-;2430:2;2409:15;-1:-1:-1;;2405:29:14;2396:39;;;;2437:4;2392:50;;2179:269;-1:-1:-1;;2179:269:14:o;2453:231::-;2602:2;2591:9;2584:21;2565:4;2622:56;2674:2;2663:9;2659:18;2651:6;2622:56;:::i;2871:180::-;2930:6;2983:2;2971:9;2962:7;2958:23;2954:32;2951:52;;;2999:1;2996;2989:12;2951:52;-1:-1:-1;3022:23:14;;2871:180;-1:-1:-1;2871:180:14:o;3056:131::-;-1:-1:-1;;;;;3131:31:14;;3121:42;;3111:70;;3177:1;3174;3167:12;3192:315;3260:6;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:52;;;3337:1;3334;3327:12;3289:52;3376:9;3363:23;3395:31;3420:5;3395:31;:::i;:::-;3445:5;3497:2;3482:18;;;;3469:32;;-1:-1:-1;;;3192:315:14:o;3512:456::-;3589:6;3597;3605;3658:2;3646:9;3637:7;3633:23;3629:32;3626:52;;;3674:1;3671;3664:12;3626:52;3713:9;3700:23;3732:31;3757:5;3732:31;:::i;:::-;3782:5;-1:-1:-1;3839:2:14;3824:18;;3811:32;3852:33;3811:32;3852:33;:::i;:::-;3512:456;;3904:7;;-1:-1:-1;;;3958:2:14;3943:18;;;;3930:32;;3512:456::o;3973:127::-;4034:10;4029:3;4025:20;4022:1;4015:31;4065:4;4062:1;4055:15;4089:4;4086:1;4079:15;4105:275;4176:2;4170:9;4241:2;4222:13;;-1:-1:-1;;4218:27:14;4206:40;;4276:18;4261:34;;4297:22;;;4258:62;4255:88;;;4323:18;;:::i;:::-;4359:2;4352:22;4105:275;;-1:-1:-1;4105:275:14:o;4385:407::-;4450:5;4484:18;4476:6;4473:30;4470:56;;;4506:18;;:::i;:::-;4544:57;4589:2;4568:15;;-1:-1:-1;;4564:29:14;4595:4;4560:40;4544:57;:::i;:::-;4535:66;;4624:6;4617:5;4610:21;4664:3;4655:6;4650:3;4646:16;4643:25;4640:45;;;4681:1;4678;4671:12;4640:45;4730:6;4725:3;4718:4;4711:5;4707:16;4694:43;4784:1;4777:4;4768:6;4761:5;4757:18;4753:29;4746:40;4385:407;;;;;:::o;4797:451::-;4866:6;4919:2;4907:9;4898:7;4894:23;4890:32;4887:52;;;4935:1;4932;4925:12;4887:52;4975:9;4962:23;5008:18;5000:6;4997:30;4994:50;;;5040:1;5037;5030:12;4994:50;5063:22;;5116:4;5108:13;;5104:27;-1:-1:-1;5094:55:14;;5145:1;5142;5135:12;5094:55;5168:74;5234:7;5229:2;5216:16;5211:2;5207;5203:11;5168:74;:::i;5253:247::-;5312:6;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;5420:9;5407:23;5439:31;5464:5;5439:31;:::i;5505:946::-;5589:6;5620:2;5663;5651:9;5642:7;5638:23;5634:32;5631:52;;;5679:1;5676;5669:12;5631:52;5719:9;5706:23;5748:18;5789:2;5781:6;5778:14;5775:34;;;5805:1;5802;5795:12;5775:34;5843:6;5832:9;5828:22;5818:32;;5888:7;5881:4;5877:2;5873:13;5869:27;5859:55;;5910:1;5907;5900:12;5859:55;5946:2;5933:16;5968:2;5964;5961:10;5958:36;;;5974:18;;:::i;:::-;6020:2;6017:1;6013:10;6003:20;;6043:28;6067:2;6063;6059:11;6043:28;:::i;:::-;6105:15;;;6175:11;;;6171:20;;;6136:12;;;;6203:19;;;6200:39;;;6235:1;6232;6225:12;6200:39;6259:11;;;;6279:142;6295:6;6290:3;6287:15;6279:142;;;6361:17;;6349:30;;6312:12;;;;6399;;;;6279:142;;;6440:5;5505:946;-1:-1:-1;;;;;;;;5505:946:14:o;6456:632::-;6627:2;6679:21;;;6749:13;;6652:18;;;6771:22;;;6598:4;;6627:2;6850:15;;;;6824:2;6809:18;;;6598:4;6893:169;6907:6;6904:1;6901:13;6893:169;;;6968:13;;6956:26;;7037:15;;;;7002:12;;;;6929:1;6922:9;6893:169;;;-1:-1:-1;7079:3:14;;6456:632;-1:-1:-1;;;;;;6456:632:14:o;7093:118::-;7179:5;7172:13;7165:21;7158:5;7155:32;7145:60;;7201:1;7198;7191:12;7216:382;7281:6;7289;7342:2;7330:9;7321:7;7317:23;7313:32;7310:52;;;7358:1;7355;7348:12;7310:52;7397:9;7384:23;7416:31;7441:5;7416:31;:::i;:::-;7466:5;-1:-1:-1;7523:2:14;7508:18;;7495:32;7536:30;7495:32;7536:30;:::i;:::-;7585:7;7575:17;;;7216:382;;;;;:::o;7603:795::-;7698:6;7706;7714;7722;7775:3;7763:9;7754:7;7750:23;7746:33;7743:53;;;7792:1;7789;7782:12;7743:53;7831:9;7818:23;7850:31;7875:5;7850:31;:::i;:::-;7900:5;-1:-1:-1;7957:2:14;7942:18;;7929:32;7970:33;7929:32;7970:33;:::i;:::-;8022:7;-1:-1:-1;8076:2:14;8061:18;;8048:32;;-1:-1:-1;8131:2:14;8116:18;;8103:32;8158:18;8147:30;;8144:50;;;8190:1;8187;8180:12;8144:50;8213:22;;8266:4;8258:13;;8254:27;-1:-1:-1;8244:55:14;;8295:1;8292;8285:12;8244:55;8318:74;8384:7;8379:2;8366:16;8361:2;8357;8353:11;8318:74;:::i;:::-;8308:84;;;7603:795;;;;;;;:::o;8403:388::-;8471:6;8479;8532:2;8520:9;8511:7;8507:23;8503:32;8500:52;;;8548:1;8545;8538:12;8500:52;8587:9;8574:23;8606:31;8631:5;8606:31;:::i;:::-;8656:5;-1:-1:-1;8713:2:14;8698:18;;8685:32;8726:33;8685:32;8726:33;:::i;8796:380::-;8875:1;8871:12;;;;8918;;;8939:61;;8993:4;8985:6;8981:17;8971:27;;8939:61;9046:2;9038:6;9035:14;9015:18;9012:38;9009:161;;;9092:10;9087:3;9083:20;9080:1;9073:31;9127:4;9124:1;9117:15;9155:4;9152:1;9145:15;9009:161;;8796:380;;;:::o;10421:356::-;10623:2;10605:21;;;10642:18;;;10635:30;10701:34;10696:2;10681:18;;10674:62;10768:2;10753:18;;10421:356::o;11162:413::-;11364:2;11346:21;;;11403:2;11383:18;;;11376:30;11442:34;11437:2;11422:18;;11415:62;-1:-1:-1;;;11508:2:14;11493:18;;11486:47;11565:3;11550:19;;11162:413::o;12405:127::-;12466:10;12461:3;12457:20;12454:1;12447:31;12497:4;12494:1;12487:15;12521:4;12518:1;12511:15;12537:251;12607:6;12660:2;12648:9;12639:7;12635:23;12631:32;12628:52;;;12676:1;12673;12666:12;12628:52;12708:9;12702:16;12727:31;12752:5;12727:31;:::i;13198:184::-;13268:6;13321:2;13309:9;13300:7;13296:23;13292:32;13289:52;;;13337:1;13334;13327:12;13289:52;-1:-1:-1;13360:16:14;;13198:184;-1:-1:-1;13198:184:14:o;13666:245::-;13733:6;13786:2;13774:9;13765:7;13761:23;13757:32;13754:52;;;13802:1;13799;13792:12;13754:52;13834:9;13828:16;13853:28;13875:5;13853:28;:::i;14737:125::-;14777:4;14805:1;14802;14799:8;14796:34;;;14810:18;;:::i;:::-;-1:-1:-1;14847:9:14;;14737:125::o;15217:135::-;15256:3;-1:-1:-1;;15277:17:14;;15274:43;;;15297:18;;:::i;:::-;-1:-1:-1;15344:1:14;15333:13;;15217:135::o;16127:112::-;16159:1;16185;16175:35;;16190:18;;:::i;:::-;-1:-1:-1;16224:9:14;;16127:112::o;16370:185::-;16412:3;16450:5;16444:12;16465:52;16510:6;16505:3;16498:4;16491:5;16487:16;16465:52;:::i;:::-;16533:16;;;;;16370:185;-1:-1:-1;;16370:185:14:o;16797:1508::-;17223:3;17252:1;17285:6;17279:13;17315:3;17337:1;17365:9;17361:2;17357:18;17347:28;;17425:2;17414:9;17410:18;17447;17437:61;;17491:4;17483:6;17479:17;17469:27;;17437:61;17517:2;17565;17557:6;17554:14;17534:18;17531:38;17528:165;;;-1:-1:-1;;;17592:33:14;;17648:4;17645:1;17638:15;17678:4;17599:3;17666:17;17528:165;17709:18;17736:104;;;;17854:1;17849:320;;;;17702:467;;17736:104;-1:-1:-1;;17769:24:14;;17757:37;;17814:16;;;;-1:-1:-1;17736:104:14;;17849:320;16317:1;16310:14;;;16354:4;16341:18;;17944:1;17958:165;17972:6;17969:1;17966:13;17958:165;;;18050:14;;18037:11;;;18030:35;18093:16;;;;17987:10;;17958:165;;;17962:3;;18152:6;18147:3;18143:16;18136:23;;17702:467;;;;;;;18185:114;18210:88;18236:61;18266:30;18292:3;18284:6;18266:30;:::i;:::-;-1:-1:-1;;;16625:16:14;;16666:1;16657:11;;16560:114;18236:61;18228:6;18210:88;:::i;:::-;-1:-1:-1;;;16739:20:14;;16784:1;16775:11;;16679:113;18185:114;18178:121;16797:1508;-1:-1:-1;;;;;;16797:1508:14:o;19945:128::-;19985:3;20016:1;20012:6;20009:1;20006:13;20003:39;;;20022:18;;:::i;:::-;-1:-1:-1;20058:9:14;;19945:128::o;20078:340::-;20280:2;20262:21;;;20319:2;20299:18;;;20292:30;-1:-1:-1;;;20353:2:14;20338:18;;20331:46;20409:2;20394:18;;20078:340::o;21471:274::-;21600:3;21638:6;21632:13;21654:53;21700:6;21695:3;21688:4;21680:6;21676:17;21654:53;:::i;:::-;21723:16;;;;;21471:274;-1:-1:-1;;21471:274:14:o;23053:414::-;23255:2;23237:21;;;23294:2;23274:18;;;23267:30;23333:34;23328:2;23313:18;;23306:62;-1:-1:-1;;;23399:2:14;23384:18;;23377:48;23457:3;23442:19;;23053:414::o;23472:500::-;-1:-1:-1;;;;;23741:15:14;;;23723:34;;23793:15;;23788:2;23773:18;;23766:43;23840:2;23825:18;;23818:34;;;23888:3;23883:2;23868:18;;23861:31;;;23666:4;;23909:57;;23946:19;;23938:6;23909:57;:::i;23977:249::-;24046:6;24099:2;24087:9;24078:7;24074:23;24070:32;24067:52;;;24115:1;24112;24105:12;24067:52;24147:9;24141:16;24166:30;24190:5;24166:30;:::i;24231:127::-;24292:10;24287:3;24283:20;24280:1;24273:31;24323:4;24320:1;24313:15;24347:4;24344:1;24337:15

Swarm Source

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