ETH Price: $3,484.94 (+4.53%)
Gas: 6.08 Gwei

Token

InscrutableApes (IAPES)
 

Overview

Max Total Supply

70 IAPES

Holders

46

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 IAPES
0x5df3855d94419569c2941861e4b2b328fdfceec3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
InscrutableApes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-24
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}


abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

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

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

library Address {

    function isContract(address account) internal view returns (bool) {

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

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {

            if (returndata.length > 0) {

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

interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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())) : "";
    }

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

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

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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

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

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        _approve(address(0), tokenId);

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

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

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

        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

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

    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];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

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

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

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

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

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; 
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }


        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

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

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @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 override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: 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 override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

contract ERC721Holder is IERC721Receiver {

    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

contract InscrutableApes is ERC721A, ERC721Holder, Ownable, ReentrancyGuard{
    
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant PRICE_PUBLIC = 0.1 ether;
    uint256 public constant PRICE_PRESALE = 0.07 ether;
    uint256 public constant PRICE_PREORDER = 0.07 ether;

    uint256 public maxPresale = 3;
    uint256 public maxPublicTx = 10;

    bool public _isActive = false;
    bool public _presaleActive = false;

    mapping(address => uint256) private presales;
    mapping(address => bool) private preorders;
    uint public preordersQty;
    string private _baseTokenURI;
    
    using Strings for uint256;

    constructor() ERC721A("InscrutableApes", "IAPES", maxPublicTx, MAX_SUPPLY)  {}

    function mint(uint256 _count) public payable nonReentrant {
        require(_isActive, "Public mint is not active");
        require(totalSupply() + _count <= MAX_SUPPLY - preordersQty, "Purchase would exceed max supply of Tokens");
        require(_count <= maxPublicTx, "Exceeded max available to transaction");
        require(msg.value == _count * PRICE_PUBLIC, "Incorrect funds");
        _safeMint(_msgSender(), _count);
    }

    function premint(uint256 _count) public payable nonReentrant {
        require(_presaleActive, "Pre mint is not active");
        require(totalSupply() + _count <= MAX_SUPPLY - preordersQty, "Purchase would exceed max supply of Tokens");
        require(_count <= maxPresale - presales[_msgSender()], "Insufficient mints left");
        require(msg.value == PRICE_PRESALE * _count, "Incorrect funds");
        presales[_msgSender()] += _count;
        _safeMint(_msgSender(), _count);
    }

    function mintPreorder() public nonReentrant{
        require(totalSupply() < MAX_SUPPLY, "Sale end");
        uint256 _preorders = PREORDERS(0x5dE205a8D983d56223464b74Cab536EbA9433D67).preordersAtAddress(msg.sender);
        require(_preorders > 0, "No preorders");
        require(!preorders[msg.sender], "No preorders");
        _safeMint(msg.sender, _preorders);
        preordersQty -= _preorders;
        preorders[msg.sender] = true;
    }

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

    function presalesAtAddress(address _address) external view returns(uint256) {
        return presales[_address];
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory) {
        uint tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint i = 0; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function ownerMint(address _to, uint256 _count) public onlyOwner {
        require(totalSupply() + _count <= MAX_SUPPLY - preordersQty, "Purchase would exceed max supply of Tokens");
        require(_count <= maxPublicTx, "Exceeded max available to transaction");
        _safeMint(_to, _count);
    }

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

    function activatePresale() public onlyOwner {
      _isActive = false;
      _presaleActive = true;
    }

    function activatePublicSale() public onlyOwner {
      _isActive = true;
      _presaleActive = false;
    }

    function withdrawAll() public payable {
      address cf = 0x8Ab740f1B3A5ff13c85724227dA4BAcEaD992248;
      require(msg.sender == owner() || msg.sender == cf);
      uint256 cf_value = address(this).balance / 100 * 50;
      uint256 owner_value = address(this).balance - cf_value;
      require(payable(cf).send(cf_value));
      require(payable(owner()).send(owner_value));
    }

    function updatePreorderData() public onlyOwner{
      preordersQty = PREORDERS(0x5dE205a8D983d56223464b74Cab536EbA9433D67).preordersQty();
    }

}

interface PREORDERS{
    function preordersQty() external view returns (uint256);
    function preordersAtAddress(address _address) external view returns (uint256);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PREORDER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activatePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPreorder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preordersQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"presalesAtAddress","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePreorderData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526000805560006007556003600a55600a600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055503480156200005a57600080fd5b506040518060400160405280600f81526020017f496e736372757461626c654170657300000000000000000000000000000000008152506040518060400160405280600581526020017f4941504553000000000000000000000000000000000000000000000000000000815250600b546127106000811162000113576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010a90620003bb565b60405180910390fd5b6000821162000159576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001509062000399565b60405180910390fd5b8360019080519060200190620001719291906200029b565b5082600290805190602001906200018a9291906200029b565b508160a08181525050806080818152505050505050620001bf620001b3620001cd60201b60201c565b620001d560201b60201c565b6001600981905550620004f1565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a990620003ee565b90600052602060002090601f016020900481019282620002cd576000855562000319565b82601f10620002e857805160ff191683800117855562000319565b8280016001018555821562000319579182015b8281111562000318578251825591602001919060010190620002fb565b5b5090506200032891906200032c565b5090565b5b80821115620003475760008160009055506001016200032d565b5090565b60006200035a602783620003dd565b9150620003678262000453565b604082019050919050565b600062000381602e83620003dd565b91506200038e82620004a2565b604082019050919050565b60006020820190508181036000830152620003b4816200034b565b9050919050565b60006020820190508181036000830152620003d68162000372565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200040757607f821691505b602082108114156200041e576200041d62000424565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a0516152316200052260003960008181612a9a01528181612ac301526131660152600050506152316000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c85d6b0e1161007a578063c85d6b0e14610831578063c87b56dd1461085c578063d7224ba014610899578063e985e9c5146108c4578063f2fde38b14610901578063f9911ae61461092a57610246565b8063a22cb46514610772578063a56d77301461079b578063afa6c735146107c6578063b68e8c91146107f1578063b88d4fde1461080857610246565b80638ec89e4f116100fd5780638ec89e4f146106b957806395d89b41146106e457806396ae80eb1461070f5780639d5aef301461073a578063a0712d681461075657610246565b8063715018a61461061957806383ebaa19146106305780638462151c14610647578063853828b6146106845780638da5cb5b1461068e57610246565b806332cb6b0c116101c7578063533906bd1161018b578063533906bd1461052057806355f804b31461054b5780636352211e146105745780636b0a1176146105b157806370a08231146105dc57610246565b806332cb6b0c1461042957806342842e0e14610454578063484b973c1461047d5780634a106b0f146104a65780634f6ccce7146104e357610246565b8063150b7a021161020e578063150b7a021461033057806318160ddd1461036d5780632142ab291461039857806323b872dd146103c35780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311eb304714610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613995565b610941565b60405161027f919061409a565b60405180910390f35b34801561029457600080fd5b5061029d610a8b565b6040516102aa91906140d0565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a38565b610b1d565b6040516102e79190614011565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613955565b610ba2565b005b34801561032557600080fd5b5061032e610cbb565b005b34801561033c57600080fd5b5061035760048036038101906103529190613892565b610d6f565b60405161036491906140b5565b60405180910390f35b34801561037957600080fd5b50610382610d83565b60405161038f9190614492565b60405180910390f35b3480156103a457600080fd5b506103ad610d8c565b6040516103ba9190614492565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e5919061383f565b610d92565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613955565b610da2565b6040516104209190614492565b60405180910390f35b34801561043557600080fd5b5061043e610fa0565b60405161044b9190614492565b60405180910390f35b34801561046057600080fd5b5061047b6004803603810190610476919061383f565b610fa6565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613955565b610fc6565b005b3480156104b257600080fd5b506104cd60048036038101906104c891906137d2565b6110f9565b6040516104da9190614492565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613a38565b611142565b6040516105179190614492565b60405180910390f35b34801561052c57600080fd5b50610535611195565b6040516105429190614492565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906139ef565b6111a0565b005b34801561058057600080fd5b5061059b60048036038101906105969190613a38565b611236565b6040516105a89190614011565b60405180910390f35b3480156105bd57600080fd5b506105c661124c565b6040516105d3919061409a565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe91906137d2565b61125f565b6040516106109190614492565b60405180910390f35b34801561062557600080fd5b5061062e611348565b005b34801561063c57600080fd5b506106456113d0565b005b34801561065357600080fd5b5061066e600480360381019061066991906137d2565b611660565b60405161067b9190614078565b60405180910390f35b61068c61170e565b005b34801561069a57600080fd5b506106a3611851565b6040516106b09190614011565b60405180910390f35b3480156106c557600080fd5b506106ce61187b565b6040516106db919061409a565b60405180910390f35b3480156106f057600080fd5b506106f961188e565b60405161070691906140d0565b60405180910390f35b34801561071b57600080fd5b50610724611920565b6040516107319190614492565b60405180910390f35b610754600480360381019061074f9190613a38565b611926565b005b610770600480360381019061076b9190613a38565b611b8a565b005b34801561077e57600080fd5b5061079960048036038101906107949190613915565b611d41565b005b3480156107a757600080fd5b506107b0611ec2565b6040516107bd9190614492565b60405180910390f35b3480156107d257600080fd5b506107db611ece565b6040516107e89190614492565b60405180910390f35b3480156107fd57600080fd5b50610806611ed9565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613892565b611f8d565b005b34801561083d57600080fd5b50610846611fe9565b6040516108539190614492565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613a38565b611fef565b60405161089091906140d0565b60405180910390f35b3480156108a557600080fd5b506108ae612096565b6040516108bb9190614492565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906137ff565b61209c565b6040516108f8919061409a565b60405180910390f35b34801561090d57600080fd5b50610928600480360381019061092391906137d2565b612130565b005b34801561093657600080fd5b5061093f612228565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a845750610a838261233e565b5b9050919050565b606060018054610a9a9061483b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac69061483b565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050905090565b6000610b28826123a8565b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90614432565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bad82611236565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590614312565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3d6123b5565b73ffffffffffffffffffffffffffffffffffffffff161480610c6c5750610c6b81610c666123b5565b61209c565b5b610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906141f2565b60405180910390fd5b610cb68383836123bd565b505050565b610cc36123b5565b73ffffffffffffffffffffffffffffffffffffffff16610ce1611851565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614272565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b600063150b7a0260e01b9050949350505050565b60008054905090565b600a5481565b610d9d83838361246f565b505050565b6000610dad8361125f565b8210610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906140f2565b60405180910390fd5b6000610df8610d83565b905060008060005b83811015610f5e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4a5786841415610f3b578195505050505050610f9a565b8380610f469061489e565b9450505b508080610f569061489e565b915050610e00565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f91906143b2565b60405180910390fd5b92915050565b61271081565b610fc183838360405180602001604052806000815250611f8d565b505050565b610fce6123b5565b73ffffffffffffffffffffffffffffffffffffffff16610fec611851565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614272565b60405180910390fd5b600f54612710611052919061470b565b8161105b610d83565b61106591906145f6565b11156110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d90614172565b60405180910390fd5b600b548111156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614152565b60405180910390fd5b6110f58282612a28565b5050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061114c610d83565b821061118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614192565b60405180910390fd5b819050919050565b66f8b0a10e47000081565b6111a86123b5565b73ffffffffffffffffffffffffffffffffffffffff166111c6611851565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614272565b60405180910390fd5b8060109080519060200190611232929190613597565b5050565b600061124182612a46565b600001519050919050565b600c60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614212565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113506123b5565b73ffffffffffffffffffffffffffffffffffffffff1661136e611851565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614272565b60405180910390fd5b6113ce6000612c49565b565b60026009541415611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d906143d2565b60405180910390fd5b6002600981905550612710611429610d83565b10611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614232565b60405180910390fd5b6000735de205a8d983d56223464b74cab536eba9433d6773ffffffffffffffffffffffffffffffffffffffff166352bad912336040518263ffffffff1660e01b81526004016114b89190614011565b60206040518083038186803b1580156114d057600080fd5b505afa1580156114e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115089190613a65565b90506000811161154d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611544906141d2565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d1906141d2565b60405180910390fd5b6115e43382612a28565b80600f60008282546115f6919061470b565b925050819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600981905550565b6060600061166d8361125f565b905060008167ffffffffffffffff81111561168b5761168a6149d4565b5b6040519080825280602002602001820160405280156116b95781602001602082028036833780820191505090505b50905060005b82811015611703576116d18582610da2565b8282815181106116e4576116e36149a5565b5b60200260200101818152505080806116fb9061489e565b9150506116bf565b508092505050919050565b6000738ab740f1b3a5ff13c85724227da4bacead992248905061172f611851565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061179357508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61179c57600080fd5b600060326064476117ad919061464c565b6117b7919061467d565b9050600081476117c7919061470b565b90508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061180757600080fd5b61180f611851565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061184c57600080fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900460ff1681565b60606002805461189d9061483b565b80601f01602080910402602001604051908101604052809291908181526020018280546118c99061483b565b80156119165780601f106118eb57610100808354040283529160200191611916565b820191906000526020600020905b8154815290600101906020018083116118f957829003601f168201915b5050505050905090565b600b5481565b6002600954141561196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906143d2565b60405180910390fd5b6002600981905550600c60019054906101000a900460ff166119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba90614412565b60405180910390fd5b600f546127106119d3919061470b565b816119dc610d83565b6119e691906145f6565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614172565b60405180910390fd5b600d6000611a336123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54611a7b919061470b565b811115611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906142f2565b60405180910390fd5b8066f8b0a10e470000611ad0919061467d565b3414611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0890614352565b60405180910390fd5b80600d6000611b1e6123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6791906145f6565b92505081905550611b7f611b796123b5565b82612a28565b600160098190555050565b60026009541415611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143d2565b60405180910390fd5b6002600981905550600c60009054906101000a900460ff16611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90614472565b60405180910390fd5b600f54612710611c37919061470b565b81611c40610d83565b611c4a91906145f6565b1115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290614172565b60405180910390fd5b600b54811115611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790614152565b60405180910390fd5b67016345785d8a000081611ce4919061467d565b3414611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90614352565b60405180910390fd5b611d36611d306123b5565b82612a28565b600160098190555050565b611d496123b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906142b2565b60405180910390fd5b8060066000611dc46123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e716123b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eb6919061409a565b60405180910390a35050565b67016345785d8a000081565b66f8b0a10e47000081565b611ee16123b5565b73ffffffffffffffffffffffffffffffffffffffff16611eff611851565b73ffffffffffffffffffffffffffffffffffffffff1614611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90614272565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611f9884848461246f565b611fa484848484612d0f565b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90614332565b60405180910390fd5b50505050565b600f5481565b6060611ffa826123a8565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090614292565b60405180910390fd5b6000612043612ea6565b90506000815111612063576040518060200160405280600081525061208e565b8061206d84612f38565b60405160200161207e929190613fed565b6040516020818303038152906040525b915050919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121386123b5565b73ffffffffffffffffffffffffffffffffffffffff16612156611851565b73ffffffffffffffffffffffffffffffffffffffff16146121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a390614272565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614112565b60405180910390fd5b61222581612c49565b50565b6122306123b5565b73ffffffffffffffffffffffffffffffffffffffff1661224e611851565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614272565b60405180910390fd5b735de205a8d983d56223464b74cab536eba9433d6773ffffffffffffffffffffffffffffffffffffffff1663c85d6b0e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123369190613a65565b600f81905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061247a82612a46565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124a16123b5565b73ffffffffffffffffffffffffffffffffffffffff1614806124fd57506124c66123b5565b73ffffffffffffffffffffffffffffffffffffffff166124e584610b1d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612519575061251882600001516125136123b5565b61209c565b5b90508061255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906142d2565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614252565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561263d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612634906141b2565b60405180910390fd5b61264a8585856001613099565b61265a60008484600001516123bd565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126c891906146d7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661276c91906145b0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461287291906145f6565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129b8576128e8816123a8565b156129b7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a20868686600161309f565b505050505050565b612a428282604051806020016040528060008152506130a5565b5050565b612a4e61361d565b612a57826123a8565b612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90614132565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612afa5760017f000000000000000000000000000000000000000000000000000000000000000084612aed919061470b565b612af791906145f6565b90505b60008390505b818110612c08576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bf457809350505050612c44565b508080612c0090614811565b915050612b00565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906143f2565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612d308473ffffffffffffffffffffffffffffffffffffffff16613584565b15612e99578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d596123b5565b8786866040518563ffffffff1660e01b8152600401612d7b949392919061402c565b602060405180830381600087803b158015612d9557600080fd5b505af1925050508015612dc657506040513d601f19601f82011682018060405250810190612dc391906139c2565b60015b612e49573d8060008114612df6576040519150601f19603f3d011682016040523d82523d6000602084013e612dfb565b606091505b50600081511415612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614332565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e9e565b600190505b949350505050565b606060108054612eb59061483b565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee19061483b565b8015612f2e5780601f10612f0357610100808354040283529160200191612f2e565b820191906000526020600020905b815481529060010190602001808311612f1157829003601f168201915b5050505050905090565b60606000821415612f80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613094565b600082905060005b60008214612fb2578080612f9b9061489e565b915050600a82612fab919061464c565b9150612f88565b60008167ffffffffffffffff811115612fce57612fcd6149d4565b5b6040519080825280601f01601f1916602001820160405280156130005781602001600182028036833780820191505090505b5090505b6000851461308d57600182613019919061470b565b9150600a8561302891906148e7565b603061303491906145f6565b60f81b81838151811061304a576130496149a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613086919061464c565b9450613004565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614392565b60405180910390fd5b613124816123a8565b15613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b90614372565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131be90614452565b60405180910390fd5b6131d46000858386613099565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132d191906145b0565b6fffffffffffffffffffffffffffffffff1681526020018583602001516132f891906145b0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561356757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135076000888488612d0f565b613546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353d90614332565b60405180910390fd5b81806135519061489e565b925050808061355f9061489e565b915050613496565b508060008190555061357c600087858861309f565b505050505050565b600080823b905060008111915050919050565b8280546135a39061483b565b90600052602060002090601f0160209004810192826135c5576000855561360c565b82601f106135de57805160ff191683800117855561360c565b8280016001018555821561360c579182015b8281111561360b5782518255916020019190600101906135f0565b5b5090506136199190613657565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613670576000816000905550600101613658565b5090565b6000613687613682846144d2565b6144ad565b9050828152602081018484840111156136a3576136a2614a08565b5b6136ae8482856147cf565b509392505050565b60006136c96136c484614503565b6144ad565b9050828152602081018484840111156136e5576136e4614a08565b5b6136f08482856147cf565b509392505050565b6000813590506137078161519f565b92915050565b60008135905061371c816151b6565b92915050565b600081359050613731816151cd565b92915050565b600081519050613746816151cd565b92915050565b600082601f83011261376157613760614a03565b5b8135613771848260208601613674565b91505092915050565b600082601f83011261378f5761378e614a03565b5b813561379f8482602086016136b6565b91505092915050565b6000813590506137b7816151e4565b92915050565b6000815190506137cc816151e4565b92915050565b6000602082840312156137e8576137e7614a12565b5b60006137f6848285016136f8565b91505092915050565b6000806040838503121561381657613815614a12565b5b6000613824858286016136f8565b9250506020613835858286016136f8565b9150509250929050565b60008060006060848603121561385857613857614a12565b5b6000613866868287016136f8565b9350506020613877868287016136f8565b9250506040613888868287016137a8565b9150509250925092565b600080600080608085870312156138ac576138ab614a12565b5b60006138ba878288016136f8565b94505060206138cb878288016136f8565b93505060406138dc878288016137a8565b925050606085013567ffffffffffffffff8111156138fd576138fc614a0d565b5b6139098782880161374c565b91505092959194509250565b6000806040838503121561392c5761392b614a12565b5b600061393a858286016136f8565b925050602061394b8582860161370d565b9150509250929050565b6000806040838503121561396c5761396b614a12565b5b600061397a858286016136f8565b925050602061398b858286016137a8565b9150509250929050565b6000602082840312156139ab576139aa614a12565b5b60006139b984828501613722565b91505092915050565b6000602082840312156139d8576139d7614a12565b5b60006139e684828501613737565b91505092915050565b600060208284031215613a0557613a04614a12565b5b600082013567ffffffffffffffff811115613a2357613a22614a0d565b5b613a2f8482850161377a565b91505092915050565b600060208284031215613a4e57613a4d614a12565b5b6000613a5c848285016137a8565b91505092915050565b600060208284031215613a7b57613a7a614a12565b5b6000613a89848285016137bd565b91505092915050565b6000613a9e8383613fcf565b60208301905092915050565b613ab38161473f565b82525050565b6000613ac482614544565b613ace8185614572565b9350613ad983614534565b8060005b83811015613b0a578151613af18882613a92565b9750613afc83614565565b925050600181019050613add565b5085935050505092915050565b613b2081614751565b82525050565b613b2f8161475d565b82525050565b6000613b408261454f565b613b4a8185614583565b9350613b5a8185602086016147de565b613b6381614a17565b840191505092915050565b6000613b798261455a565b613b838185614594565b9350613b938185602086016147de565b613b9c81614a17565b840191505092915050565b6000613bb28261455a565b613bbc81856145a5565b9350613bcc8185602086016147de565b80840191505092915050565b6000613be5602283614594565b9150613bf082614a28565b604082019050919050565b6000613c08602683614594565b9150613c1382614a77565b604082019050919050565b6000613c2b602a83614594565b9150613c3682614ac6565b604082019050919050565b6000613c4e602583614594565b9150613c5982614b15565b604082019050919050565b6000613c71602a83614594565b9150613c7c82614b64565b604082019050919050565b6000613c94602383614594565b9150613c9f82614bb3565b604082019050919050565b6000613cb7602583614594565b9150613cc282614c02565b604082019050919050565b6000613cda600c83614594565b9150613ce582614c51565b602082019050919050565b6000613cfd603983614594565b9150613d0882614c7a565b604082019050919050565b6000613d20602b83614594565b9150613d2b82614cc9565b604082019050919050565b6000613d43600883614594565b9150613d4e82614d18565b602082019050919050565b6000613d66602683614594565b9150613d7182614d41565b604082019050919050565b6000613d89602083614594565b9150613d9482614d90565b602082019050919050565b6000613dac602f83614594565b9150613db782614db9565b604082019050919050565b6000613dcf601a83614594565b9150613dda82614e08565b602082019050919050565b6000613df2603283614594565b9150613dfd82614e31565b604082019050919050565b6000613e15601783614594565b9150613e2082614e80565b602082019050919050565b6000613e38602283614594565b9150613e4382614ea9565b604082019050919050565b6000613e5b603383614594565b9150613e6682614ef8565b604082019050919050565b6000613e7e600f83614594565b9150613e8982614f47565b602082019050919050565b6000613ea1601d83614594565b9150613eac82614f70565b602082019050919050565b6000613ec4602183614594565b9150613ecf82614f99565b604082019050919050565b6000613ee7602e83614594565b9150613ef282614fe8565b604082019050919050565b6000613f0a601f83614594565b9150613f1582615037565b602082019050919050565b6000613f2d602f83614594565b9150613f3882615060565b604082019050919050565b6000613f50601683614594565b9150613f5b826150af565b602082019050919050565b6000613f73602d83614594565b9150613f7e826150d8565b604082019050919050565b6000613f96602283614594565b9150613fa182615127565b604082019050919050565b6000613fb9601983614594565b9150613fc482615176565b602082019050919050565b613fd8816147c5565b82525050565b613fe7816147c5565b82525050565b6000613ff98285613ba7565b91506140058284613ba7565b91508190509392505050565b60006020820190506140266000830184613aaa565b92915050565b60006080820190506140416000830187613aaa565b61404e6020830186613aaa565b61405b6040830185613fde565b818103606083015261406d8184613b35565b905095945050505050565b600060208201905081810360008301526140928184613ab9565b905092915050565b60006020820190506140af6000830184613b17565b92915050565b60006020820190506140ca6000830184613b26565b92915050565b600060208201905081810360008301526140ea8184613b6e565b905092915050565b6000602082019050818103600083015261410b81613bd8565b9050919050565b6000602082019050818103600083015261412b81613bfb565b9050919050565b6000602082019050818103600083015261414b81613c1e565b9050919050565b6000602082019050818103600083015261416b81613c41565b9050919050565b6000602082019050818103600083015261418b81613c64565b9050919050565b600060208201905081810360008301526141ab81613c87565b9050919050565b600060208201905081810360008301526141cb81613caa565b9050919050565b600060208201905081810360008301526141eb81613ccd565b9050919050565b6000602082019050818103600083015261420b81613cf0565b9050919050565b6000602082019050818103600083015261422b81613d13565b9050919050565b6000602082019050818103600083015261424b81613d36565b9050919050565b6000602082019050818103600083015261426b81613d59565b9050919050565b6000602082019050818103600083015261428b81613d7c565b9050919050565b600060208201905081810360008301526142ab81613d9f565b9050919050565b600060208201905081810360008301526142cb81613dc2565b9050919050565b600060208201905081810360008301526142eb81613de5565b9050919050565b6000602082019050818103600083015261430b81613e08565b9050919050565b6000602082019050818103600083015261432b81613e2b565b9050919050565b6000602082019050818103600083015261434b81613e4e565b9050919050565b6000602082019050818103600083015261436b81613e71565b9050919050565b6000602082019050818103600083015261438b81613e94565b9050919050565b600060208201905081810360008301526143ab81613eb7565b9050919050565b600060208201905081810360008301526143cb81613eda565b9050919050565b600060208201905081810360008301526143eb81613efd565b9050919050565b6000602082019050818103600083015261440b81613f20565b9050919050565b6000602082019050818103600083015261442b81613f43565b9050919050565b6000602082019050818103600083015261444b81613f66565b9050919050565b6000602082019050818103600083015261446b81613f89565b9050919050565b6000602082019050818103600083015261448b81613fac565b9050919050565b60006020820190506144a76000830184613fde565b92915050565b60006144b76144c8565b90506144c3828261486d565b919050565b6000604051905090565b600067ffffffffffffffff8211156144ed576144ec6149d4565b5b6144f682614a17565b9050602081019050919050565b600067ffffffffffffffff82111561451e5761451d6149d4565b5b61452782614a17565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145bb82614789565b91506145c683614789565b9250826fffffffffffffffffffffffffffffffff038211156145eb576145ea614918565b5b828201905092915050565b6000614601826147c5565b915061460c836147c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561464157614640614918565b5b828201905092915050565b6000614657826147c5565b9150614662836147c5565b92508261467257614671614947565b5b828204905092915050565b6000614688826147c5565b9150614693836147c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146cc576146cb614918565b5b828202905092915050565b60006146e282614789565b91506146ed83614789565b925082821015614700576146ff614918565b5b828203905092915050565b6000614716826147c5565b9150614721836147c5565b92508282101561473457614733614918565b5b828203905092915050565b600061474a826147a5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156147fc5780820151818401526020810190506147e1565b8381111561480b576000848401525b50505050565b600061481c826147c5565b915060008214156148305761482f614918565b5b600182039050919050565b6000600282049050600182168061485357607f821691505b6020821081141561486757614866614976565b5b50919050565b61487682614a17565b810181811067ffffffffffffffff82111715614895576148946149d4565b5b80604052505050565b60006148a9826147c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148dc576148db614918565b5b600182019050919050565b60006148f2826147c5565b91506148fd836147c5565b92508261490d5761490c614947565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620546f6b656e7300000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f207072656f72646572730000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f496e73756666696369656e74206d696e7473206c656674000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f507265206d696e74206973206e6f742061637469766500000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b6151a88161473f565b81146151b357600080fd5b50565b6151bf81614751565b81146151ca57600080fd5b50565b6151d68161475d565b81146151e157600080fd5b50565b6151ed816147c5565b81146151f857600080fd5b5056fea26469706673582212208da51628ae7d74ee256d189e9e7641dbe06c61a98224f750fb525f36bce034fa64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c85d6b0e1161007a578063c85d6b0e14610831578063c87b56dd1461085c578063d7224ba014610899578063e985e9c5146108c4578063f2fde38b14610901578063f9911ae61461092a57610246565b8063a22cb46514610772578063a56d77301461079b578063afa6c735146107c6578063b68e8c91146107f1578063b88d4fde1461080857610246565b80638ec89e4f116100fd5780638ec89e4f146106b957806395d89b41146106e457806396ae80eb1461070f5780639d5aef301461073a578063a0712d681461075657610246565b8063715018a61461061957806383ebaa19146106305780638462151c14610647578063853828b6146106845780638da5cb5b1461068e57610246565b806332cb6b0c116101c7578063533906bd1161018b578063533906bd1461052057806355f804b31461054b5780636352211e146105745780636b0a1176146105b157806370a08231146105dc57610246565b806332cb6b0c1461042957806342842e0e14610454578063484b973c1461047d5780634a106b0f146104a65780634f6ccce7146104e357610246565b8063150b7a021161020e578063150b7a021461033057806318160ddd1461036d5780632142ab291461039857806323b872dd146103c35780632f745c59146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806311eb304714610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613995565b610941565b60405161027f919061409a565b60405180910390f35b34801561029457600080fd5b5061029d610a8b565b6040516102aa91906140d0565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a38565b610b1d565b6040516102e79190614011565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613955565b610ba2565b005b34801561032557600080fd5b5061032e610cbb565b005b34801561033c57600080fd5b5061035760048036038101906103529190613892565b610d6f565b60405161036491906140b5565b60405180910390f35b34801561037957600080fd5b50610382610d83565b60405161038f9190614492565b60405180910390f35b3480156103a457600080fd5b506103ad610d8c565b6040516103ba9190614492565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e5919061383f565b610d92565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613955565b610da2565b6040516104209190614492565b60405180910390f35b34801561043557600080fd5b5061043e610fa0565b60405161044b9190614492565b60405180910390f35b34801561046057600080fd5b5061047b6004803603810190610476919061383f565b610fa6565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613955565b610fc6565b005b3480156104b257600080fd5b506104cd60048036038101906104c891906137d2565b6110f9565b6040516104da9190614492565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613a38565b611142565b6040516105179190614492565b60405180910390f35b34801561052c57600080fd5b50610535611195565b6040516105429190614492565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906139ef565b6111a0565b005b34801561058057600080fd5b5061059b60048036038101906105969190613a38565b611236565b6040516105a89190614011565b60405180910390f35b3480156105bd57600080fd5b506105c661124c565b6040516105d3919061409a565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe91906137d2565b61125f565b6040516106109190614492565b60405180910390f35b34801561062557600080fd5b5061062e611348565b005b34801561063c57600080fd5b506106456113d0565b005b34801561065357600080fd5b5061066e600480360381019061066991906137d2565b611660565b60405161067b9190614078565b60405180910390f35b61068c61170e565b005b34801561069a57600080fd5b506106a3611851565b6040516106b09190614011565b60405180910390f35b3480156106c557600080fd5b506106ce61187b565b6040516106db919061409a565b60405180910390f35b3480156106f057600080fd5b506106f961188e565b60405161070691906140d0565b60405180910390f35b34801561071b57600080fd5b50610724611920565b6040516107319190614492565b60405180910390f35b610754600480360381019061074f9190613a38565b611926565b005b610770600480360381019061076b9190613a38565b611b8a565b005b34801561077e57600080fd5b5061079960048036038101906107949190613915565b611d41565b005b3480156107a757600080fd5b506107b0611ec2565b6040516107bd9190614492565b60405180910390f35b3480156107d257600080fd5b506107db611ece565b6040516107e89190614492565b60405180910390f35b3480156107fd57600080fd5b50610806611ed9565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613892565b611f8d565b005b34801561083d57600080fd5b50610846611fe9565b6040516108539190614492565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613a38565b611fef565b60405161089091906140d0565b60405180910390f35b3480156108a557600080fd5b506108ae612096565b6040516108bb9190614492565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906137ff565b61209c565b6040516108f8919061409a565b60405180910390f35b34801561090d57600080fd5b50610928600480360381019061092391906137d2565b612130565b005b34801561093657600080fd5b5061093f612228565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a845750610a838261233e565b5b9050919050565b606060018054610a9a9061483b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac69061483b565b8015610b135780601f10610ae857610100808354040283529160200191610b13565b820191906000526020600020905b815481529060010190602001808311610af657829003601f168201915b5050505050905090565b6000610b28826123a8565b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90614432565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bad82611236565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590614312565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3d6123b5565b73ffffffffffffffffffffffffffffffffffffffff161480610c6c5750610c6b81610c666123b5565b61209c565b5b610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906141f2565b60405180910390fd5b610cb68383836123bd565b505050565b610cc36123b5565b73ffffffffffffffffffffffffffffffffffffffff16610ce1611851565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614272565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b600063150b7a0260e01b9050949350505050565b60008054905090565b600a5481565b610d9d83838361246f565b505050565b6000610dad8361125f565b8210610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906140f2565b60405180910390fd5b6000610df8610d83565b905060008060005b83811015610f5e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4a5786841415610f3b578195505050505050610f9a565b8380610f469061489e565b9450505b508080610f569061489e565b915050610e00565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f91906143b2565b60405180910390fd5b92915050565b61271081565b610fc183838360405180602001604052806000815250611f8d565b505050565b610fce6123b5565b73ffffffffffffffffffffffffffffffffffffffff16610fec611851565b73ffffffffffffffffffffffffffffffffffffffff1614611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614272565b60405180910390fd5b600f54612710611052919061470b565b8161105b610d83565b61106591906145f6565b11156110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d90614172565b60405180910390fd5b600b548111156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614152565b60405180910390fd5b6110f58282612a28565b5050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061114c610d83565b821061118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614192565b60405180910390fd5b819050919050565b66f8b0a10e47000081565b6111a86123b5565b73ffffffffffffffffffffffffffffffffffffffff166111c6611851565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614272565b60405180910390fd5b8060109080519060200190611232929190613597565b5050565b600061124182612a46565b600001519050919050565b600c60019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614212565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113506123b5565b73ffffffffffffffffffffffffffffffffffffffff1661136e611851565b73ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614272565b60405180910390fd5b6113ce6000612c49565b565b60026009541415611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d906143d2565b60405180910390fd5b6002600981905550612710611429610d83565b10611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090614232565b60405180910390fd5b6000735de205a8d983d56223464b74cab536eba9433d6773ffffffffffffffffffffffffffffffffffffffff166352bad912336040518263ffffffff1660e01b81526004016114b89190614011565b60206040518083038186803b1580156114d057600080fd5b505afa1580156114e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115089190613a65565b90506000811161154d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611544906141d2565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d1906141d2565b60405180910390fd5b6115e43382612a28565b80600f60008282546115f6919061470b565b925050819055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600981905550565b6060600061166d8361125f565b905060008167ffffffffffffffff81111561168b5761168a6149d4565b5b6040519080825280602002602001820160405280156116b95781602001602082028036833780820191505090505b50905060005b82811015611703576116d18582610da2565b8282815181106116e4576116e36149a5565b5b60200260200101818152505080806116fb9061489e565b9150506116bf565b508092505050919050565b6000738ab740f1b3a5ff13c85724227da4bacead992248905061172f611851565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061179357508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61179c57600080fd5b600060326064476117ad919061464c565b6117b7919061467d565b9050600081476117c7919061470b565b90508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061180757600080fd5b61180f611851565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061184c57600080fd5b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900460ff1681565b60606002805461189d9061483b565b80601f01602080910402602001604051908101604052809291908181526020018280546118c99061483b565b80156119165780601f106118eb57610100808354040283529160200191611916565b820191906000526020600020905b8154815290600101906020018083116118f957829003601f168201915b5050505050905090565b600b5481565b6002600954141561196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906143d2565b60405180910390fd5b6002600981905550600c60019054906101000a900460ff166119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba90614412565b60405180910390fd5b600f546127106119d3919061470b565b816119dc610d83565b6119e691906145f6565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614172565b60405180910390fd5b600d6000611a336123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54611a7b919061470b565b811115611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906142f2565b60405180910390fd5b8066f8b0a10e470000611ad0919061467d565b3414611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0890614352565b60405180910390fd5b80600d6000611b1e6123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6791906145f6565b92505081905550611b7f611b796123b5565b82612a28565b600160098190555050565b60026009541415611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143d2565b60405180910390fd5b6002600981905550600c60009054906101000a900460ff16611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90614472565b60405180910390fd5b600f54612710611c37919061470b565b81611c40610d83565b611c4a91906145f6565b1115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290614172565b60405180910390fd5b600b54811115611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790614152565b60405180910390fd5b67016345785d8a000081611ce4919061467d565b3414611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90614352565b60405180910390fd5b611d36611d306123b5565b82612a28565b600160098190555050565b611d496123b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906142b2565b60405180910390fd5b8060066000611dc46123b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e716123b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eb6919061409a565b60405180910390a35050565b67016345785d8a000081565b66f8b0a10e47000081565b611ee16123b5565b73ffffffffffffffffffffffffffffffffffffffff16611eff611851565b73ffffffffffffffffffffffffffffffffffffffff1614611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90614272565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611f9884848461246f565b611fa484848484612d0f565b611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90614332565b60405180910390fd5b50505050565b600f5481565b6060611ffa826123a8565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090614292565b60405180910390fd5b6000612043612ea6565b90506000815111612063576040518060200160405280600081525061208e565b8061206d84612f38565b60405160200161207e929190613fed565b6040516020818303038152906040525b915050919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121386123b5565b73ffffffffffffffffffffffffffffffffffffffff16612156611851565b73ffffffffffffffffffffffffffffffffffffffff16146121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a390614272565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614112565b60405180910390fd5b61222581612c49565b50565b6122306123b5565b73ffffffffffffffffffffffffffffffffffffffff1661224e611851565b73ffffffffffffffffffffffffffffffffffffffff16146122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614272565b60405180910390fd5b735de205a8d983d56223464b74cab536eba9433d6773ffffffffffffffffffffffffffffffffffffffff1663c85d6b0e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122fe57600080fd5b505afa158015612312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123369190613a65565b600f81905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061247a82612a46565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124a16123b5565b73ffffffffffffffffffffffffffffffffffffffff1614806124fd57506124c66123b5565b73ffffffffffffffffffffffffffffffffffffffff166124e584610b1d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612519575061251882600001516125136123b5565b61209c565b5b90508061255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906142d2565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614252565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561263d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612634906141b2565b60405180910390fd5b61264a8585856001613099565b61265a60008484600001516123bd565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126c891906146d7565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661276c91906145b0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461287291906145f6565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129b8576128e8816123a8565b156129b7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a20868686600161309f565b505050505050565b612a428282604051806020016040528060008152506130a5565b5050565b612a4e61361d565b612a57826123a8565b612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90614132565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612afa5760017f000000000000000000000000000000000000000000000000000000000000000a84612aed919061470b565b612af791906145f6565b90505b60008390505b818110612c08576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bf457809350505050612c44565b508080612c0090614811565b915050612b00565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b906143f2565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612d308473ffffffffffffffffffffffffffffffffffffffff16613584565b15612e99578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d596123b5565b8786866040518563ffffffff1660e01b8152600401612d7b949392919061402c565b602060405180830381600087803b158015612d9557600080fd5b505af1925050508015612dc657506040513d601f19601f82011682018060405250810190612dc391906139c2565b60015b612e49573d8060008114612df6576040519150601f19603f3d011682016040523d82523d6000602084013e612dfb565b606091505b50600081511415612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614332565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e9e565b600190505b949350505050565b606060108054612eb59061483b565b80601f0160208091040260200160405190810160405280929190818152602001828054612ee19061483b565b8015612f2e5780601f10612f0357610100808354040283529160200191612f2e565b820191906000526020600020905b815481529060010190602001808311612f1157829003601f168201915b5050505050905090565b60606000821415612f80576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613094565b600082905060005b60008214612fb2578080612f9b9061489e565b915050600a82612fab919061464c565b9150612f88565b60008167ffffffffffffffff811115612fce57612fcd6149d4565b5b6040519080825280601f01601f1916602001820160405280156130005781602001600182028036833780820191505090505b5090505b6000851461308d57600182613019919061470b565b9150600a8561302891906148e7565b603061303491906145f6565b60f81b81838151811061304a576130496149a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613086919061464c565b9450613004565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561311b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311290614392565b60405180910390fd5b613124816123a8565b15613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b90614372565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156131c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131be90614452565b60405180910390fd5b6131d46000858386613099565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132d191906145b0565b6fffffffffffffffffffffffffffffffff1681526020018583602001516132f891906145b0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561356757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135076000888488612d0f565b613546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353d90614332565b60405180910390fd5b81806135519061489e565b925050808061355f9061489e565b915050613496565b508060008190555061357c600087858861309f565b505050505050565b600080823b905060008111915050919050565b8280546135a39061483b565b90600052602060002090601f0160209004810192826135c5576000855561360c565b82601f106135de57805160ff191683800117855561360c565b8280016001018555821561360c579182015b8281111561360b5782518255916020019190600101906135f0565b5b5090506136199190613657565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613670576000816000905550600101613658565b5090565b6000613687613682846144d2565b6144ad565b9050828152602081018484840111156136a3576136a2614a08565b5b6136ae8482856147cf565b509392505050565b60006136c96136c484614503565b6144ad565b9050828152602081018484840111156136e5576136e4614a08565b5b6136f08482856147cf565b509392505050565b6000813590506137078161519f565b92915050565b60008135905061371c816151b6565b92915050565b600081359050613731816151cd565b92915050565b600081519050613746816151cd565b92915050565b600082601f83011261376157613760614a03565b5b8135613771848260208601613674565b91505092915050565b600082601f83011261378f5761378e614a03565b5b813561379f8482602086016136b6565b91505092915050565b6000813590506137b7816151e4565b92915050565b6000815190506137cc816151e4565b92915050565b6000602082840312156137e8576137e7614a12565b5b60006137f6848285016136f8565b91505092915050565b6000806040838503121561381657613815614a12565b5b6000613824858286016136f8565b9250506020613835858286016136f8565b9150509250929050565b60008060006060848603121561385857613857614a12565b5b6000613866868287016136f8565b9350506020613877868287016136f8565b9250506040613888868287016137a8565b9150509250925092565b600080600080608085870312156138ac576138ab614a12565b5b60006138ba878288016136f8565b94505060206138cb878288016136f8565b93505060406138dc878288016137a8565b925050606085013567ffffffffffffffff8111156138fd576138fc614a0d565b5b6139098782880161374c565b91505092959194509250565b6000806040838503121561392c5761392b614a12565b5b600061393a858286016136f8565b925050602061394b8582860161370d565b9150509250929050565b6000806040838503121561396c5761396b614a12565b5b600061397a858286016136f8565b925050602061398b858286016137a8565b9150509250929050565b6000602082840312156139ab576139aa614a12565b5b60006139b984828501613722565b91505092915050565b6000602082840312156139d8576139d7614a12565b5b60006139e684828501613737565b91505092915050565b600060208284031215613a0557613a04614a12565b5b600082013567ffffffffffffffff811115613a2357613a22614a0d565b5b613a2f8482850161377a565b91505092915050565b600060208284031215613a4e57613a4d614a12565b5b6000613a5c848285016137a8565b91505092915050565b600060208284031215613a7b57613a7a614a12565b5b6000613a89848285016137bd565b91505092915050565b6000613a9e8383613fcf565b60208301905092915050565b613ab38161473f565b82525050565b6000613ac482614544565b613ace8185614572565b9350613ad983614534565b8060005b83811015613b0a578151613af18882613a92565b9750613afc83614565565b925050600181019050613add565b5085935050505092915050565b613b2081614751565b82525050565b613b2f8161475d565b82525050565b6000613b408261454f565b613b4a8185614583565b9350613b5a8185602086016147de565b613b6381614a17565b840191505092915050565b6000613b798261455a565b613b838185614594565b9350613b938185602086016147de565b613b9c81614a17565b840191505092915050565b6000613bb28261455a565b613bbc81856145a5565b9350613bcc8185602086016147de565b80840191505092915050565b6000613be5602283614594565b9150613bf082614a28565b604082019050919050565b6000613c08602683614594565b9150613c1382614a77565b604082019050919050565b6000613c2b602a83614594565b9150613c3682614ac6565b604082019050919050565b6000613c4e602583614594565b9150613c5982614b15565b604082019050919050565b6000613c71602a83614594565b9150613c7c82614b64565b604082019050919050565b6000613c94602383614594565b9150613c9f82614bb3565b604082019050919050565b6000613cb7602583614594565b9150613cc282614c02565b604082019050919050565b6000613cda600c83614594565b9150613ce582614c51565b602082019050919050565b6000613cfd603983614594565b9150613d0882614c7a565b604082019050919050565b6000613d20602b83614594565b9150613d2b82614cc9565b604082019050919050565b6000613d43600883614594565b9150613d4e82614d18565b602082019050919050565b6000613d66602683614594565b9150613d7182614d41565b604082019050919050565b6000613d89602083614594565b9150613d9482614d90565b602082019050919050565b6000613dac602f83614594565b9150613db782614db9565b604082019050919050565b6000613dcf601a83614594565b9150613dda82614e08565b602082019050919050565b6000613df2603283614594565b9150613dfd82614e31565b604082019050919050565b6000613e15601783614594565b9150613e2082614e80565b602082019050919050565b6000613e38602283614594565b9150613e4382614ea9565b604082019050919050565b6000613e5b603383614594565b9150613e6682614ef8565b604082019050919050565b6000613e7e600f83614594565b9150613e8982614f47565b602082019050919050565b6000613ea1601d83614594565b9150613eac82614f70565b602082019050919050565b6000613ec4602183614594565b9150613ecf82614f99565b604082019050919050565b6000613ee7602e83614594565b9150613ef282614fe8565b604082019050919050565b6000613f0a601f83614594565b9150613f1582615037565b602082019050919050565b6000613f2d602f83614594565b9150613f3882615060565b604082019050919050565b6000613f50601683614594565b9150613f5b826150af565b602082019050919050565b6000613f73602d83614594565b9150613f7e826150d8565b604082019050919050565b6000613f96602283614594565b9150613fa182615127565b604082019050919050565b6000613fb9601983614594565b9150613fc482615176565b602082019050919050565b613fd8816147c5565b82525050565b613fe7816147c5565b82525050565b6000613ff98285613ba7565b91506140058284613ba7565b91508190509392505050565b60006020820190506140266000830184613aaa565b92915050565b60006080820190506140416000830187613aaa565b61404e6020830186613aaa565b61405b6040830185613fde565b818103606083015261406d8184613b35565b905095945050505050565b600060208201905081810360008301526140928184613ab9565b905092915050565b60006020820190506140af6000830184613b17565b92915050565b60006020820190506140ca6000830184613b26565b92915050565b600060208201905081810360008301526140ea8184613b6e565b905092915050565b6000602082019050818103600083015261410b81613bd8565b9050919050565b6000602082019050818103600083015261412b81613bfb565b9050919050565b6000602082019050818103600083015261414b81613c1e565b9050919050565b6000602082019050818103600083015261416b81613c41565b9050919050565b6000602082019050818103600083015261418b81613c64565b9050919050565b600060208201905081810360008301526141ab81613c87565b9050919050565b600060208201905081810360008301526141cb81613caa565b9050919050565b600060208201905081810360008301526141eb81613ccd565b9050919050565b6000602082019050818103600083015261420b81613cf0565b9050919050565b6000602082019050818103600083015261422b81613d13565b9050919050565b6000602082019050818103600083015261424b81613d36565b9050919050565b6000602082019050818103600083015261426b81613d59565b9050919050565b6000602082019050818103600083015261428b81613d7c565b9050919050565b600060208201905081810360008301526142ab81613d9f565b9050919050565b600060208201905081810360008301526142cb81613dc2565b9050919050565b600060208201905081810360008301526142eb81613de5565b9050919050565b6000602082019050818103600083015261430b81613e08565b9050919050565b6000602082019050818103600083015261432b81613e2b565b9050919050565b6000602082019050818103600083015261434b81613e4e565b9050919050565b6000602082019050818103600083015261436b81613e71565b9050919050565b6000602082019050818103600083015261438b81613e94565b9050919050565b600060208201905081810360008301526143ab81613eb7565b9050919050565b600060208201905081810360008301526143cb81613eda565b9050919050565b600060208201905081810360008301526143eb81613efd565b9050919050565b6000602082019050818103600083015261440b81613f20565b9050919050565b6000602082019050818103600083015261442b81613f43565b9050919050565b6000602082019050818103600083015261444b81613f66565b9050919050565b6000602082019050818103600083015261446b81613f89565b9050919050565b6000602082019050818103600083015261448b81613fac565b9050919050565b60006020820190506144a76000830184613fde565b92915050565b60006144b76144c8565b90506144c3828261486d565b919050565b6000604051905090565b600067ffffffffffffffff8211156144ed576144ec6149d4565b5b6144f682614a17565b9050602081019050919050565b600067ffffffffffffffff82111561451e5761451d6149d4565b5b61452782614a17565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145bb82614789565b91506145c683614789565b9250826fffffffffffffffffffffffffffffffff038211156145eb576145ea614918565b5b828201905092915050565b6000614601826147c5565b915061460c836147c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561464157614640614918565b5b828201905092915050565b6000614657826147c5565b9150614662836147c5565b92508261467257614671614947565b5b828204905092915050565b6000614688826147c5565b9150614693836147c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146cc576146cb614918565b5b828202905092915050565b60006146e282614789565b91506146ed83614789565b925082821015614700576146ff614918565b5b828203905092915050565b6000614716826147c5565b9150614721836147c5565b92508282101561473457614733614918565b5b828203905092915050565b600061474a826147a5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156147fc5780820151818401526020810190506147e1565b8381111561480b576000848401525b50505050565b600061481c826147c5565b915060008214156148305761482f614918565b5b600182039050919050565b6000600282049050600182168061485357607f821691505b6020821081141561486757614866614976565b5b50919050565b61487682614a17565b810181811067ffffffffffffffff82111715614895576148946149d4565b5b80604052505050565b60006148a9826147c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148dc576148db614918565b5b600182019050919050565b60006148f2826147c5565b91506148fd836147c5565b92508261490d5761490c614947565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620546f6b656e7300000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f207072656f72646572730000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f496e73756666696369656e74206d696e7473206c656674000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f496e636f72726563742066756e64730000000000000000000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f507265206d696e74206973206e6f742061637469766500000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b6151a88161473f565b81146151b357600080fd5b50565b6151bf81614751565b81146151ca57600080fd5b50565b6151d68161475d565b81146151e157600080fd5b50565b6151ed816147c5565b81146151f857600080fd5b5056fea26469706673582212208da51628ae7d74ee256d189e9e7641dbe06c61a98224f750fb525f36bce034fa64736f6c63430008070033

Deployed Bytecode Sourcemap

38089:3977:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22923:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24649:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26174:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25737:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41400:111;;;;;;;;;;;;;:::i;:::-;;35277:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21484:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38398:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27024:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22115:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38177:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27229:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40861:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40377:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21647:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38338:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41174:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24472:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38510:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23349:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;761:94;;;;;;;;;;;;;:::i;:::-;;39796:453;;;;;;;;;;;;;:::i;:::-;;40509:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41519:388;;;:::i;:::-;;538:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38474:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24804:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38434:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39291:497;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38845:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26442:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38226:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38281:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41284:108;;;;;;;;;;;;;:::i;:::-;;27449:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38653:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24965:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31864:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26779:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;863:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41915:146;;;;;;;;;;;;;:::i;:::-;;22923:370;23050:4;23095:25;23080:40;;;:11;:40;;;;:99;;;;23146:33;23131:48;;;:11;:48;;;;23080:99;:160;;;;23205:35;23190:50;;;:11;:50;;;;23080:160;:207;;;;23251:36;23275:11;23251:23;:36::i;:::-;23080:207;23066:221;;22923:370;;;:::o;24649:94::-;24703:13;24732:5;24725:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24649:94;:::o;26174:204::-;26242:7;26266:16;26274:7;26266;:16::i;:::-;26258:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26348:15;:24;26364:7;26348:24;;;;;;;;;;;;;;;;;;;;;26341:31;;26174:204;;;:::o;25737:379::-;25806:13;25822:24;25838:7;25822:15;:24::i;:::-;25806:40;;25867:5;25861:11;;:2;:11;;;;25853:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25952:5;25936:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25961:37;25978:5;25985:12;:10;:12::i;:::-;25961:16;:37::i;:::-;25936:62;25920:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;26082:28;26091:2;26095:7;26104:5;26082:8;:28::i;:::-;25799:317;25737:379;;:::o;41400:111::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41468:4:::1;41456:9;;:16;;;;;;;;;;;;;;;;;;41498:5;41481:14;;:22;;;;;;;;;;;;;;;;;;41400:111::o:0;35277:207::-;35420:6;35446:30;;;35439:37;;35277:207;;;;;;:::o;21484:94::-;21537:7;21560:12;;21553:19;;21484:94;:::o;38398:29::-;;;;:::o;27024:142::-;27132:28;27142:4;27148:2;27152:7;27132:9;:28::i;:::-;27024:142;;;:::o;22115:744::-;22224:7;22259:16;22269:5;22259:9;:16::i;:::-;22251:5;:24;22243:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22321:22;22346:13;:11;:13::i;:::-;22321:38;;22366:19;22396:25;22446:9;22441:350;22465:14;22461:1;:18;22441:350;;;22495:31;22529:11;:14;22541:1;22529:14;;;;;;;;;;;22495:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22582:1;22556:28;;:9;:14;;;:28;;;22552:89;;22617:9;:14;;;22597:34;;22552:89;22674:5;22653:26;;:17;:26;;;22649:135;;;22711:5;22696:11;:20;22692:59;;;22738:1;22731:8;;;;;;;;;22692:59;22761:13;;;;;:::i;:::-;;;;22649:135;22486:305;22481:3;;;;;:::i;:::-;;;;22441:350;;;;22797:56;;;;;;;;;;:::i;:::-;;;;;;;;22115:744;;;;;:::o;38177:42::-;38214:5;38177:42;:::o;27229:157::-;27341:39;27358:4;27364:2;27368:7;27341:39;;;;;;;;;;;;:16;:39::i;:::-;27229:157;;;:::o;40861:305::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40984:12:::1;;38214:5;40971:25;;;;:::i;:::-;40961:6;40945:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:51;;40937:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;41072:11;;41062:6;:21;;41054:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41136:22;41146:3;41151:6;41136:9;:22::i;:::-;40861:305:::0;;:::o;40377:120::-;40444:7;40471:8;:18;40480:8;40471:18;;;;;;;;;;;;;;;;40464:25;;40377:120;;;:::o;21647:177::-;21714:7;21746:13;:11;:13::i;:::-;21738:5;:21;21730:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21813:5;21806:12;;21647:177;;;:::o;38338:51::-;38379:10;38338:51;:::o;41174:102::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41261:7:::1;41245:13;:23;;;;;;;;;;;;:::i;:::-;;41174:102:::0;:::o;24472:118::-;24536:7;24559:20;24571:7;24559:11;:20::i;:::-;:25;;;24552:32;;24472:118;;;:::o;38510:34::-;;;;;;;;;;;;;:::o;23349:211::-;23413:7;23454:1;23437:19;;:5;:19;;;;23429:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;23526:12;:19;23539:5;23526:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;23518:36;;23511:43;;23349:211;;;:::o;761:94::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;826:21:::1;844:1;826:9;:21::i;:::-;761:94::o:0;39796:453::-;37142:1;37740:7;;:19;;37732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37142:1;37873:7;:18;;;;38214:5:::1;39858:13;:11;:13::i;:::-;:26;39850:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39908:18;39939:42;39929:72;;;40002:10;39929:84;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39908:105;;40045:1;40032:10;:14;40024:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;40083:9;:21;40093:10;40083:21;;;;;;;;;;;;;;;;;;;;;;;;;40082:22;40074:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;40132:33;40142:10;40154;40132:9;:33::i;:::-;40192:10;40176:12;;:26;;;;;;;:::i;:::-;;;;;;;;40237:4;40213:9;:21;40223:10;40213:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;39839:410;37098:1:::0;38052:7;:22;;;;39796:453::o;40509:340::-;40570:16;40599:15;40617:17;40627:6;40617:9;:17::i;:::-;40599:35;;40645:25;40687:10;40673:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40645:53;;40713:6;40709:107;40729:10;40725:1;:14;40709:107;;;40774:30;40794:6;40802:1;40774:19;:30::i;:::-;40760:8;40769:1;40760:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;40741:3;;;;;:::i;:::-;;;;40709:107;;;;40833:8;40826:15;;;;40509:340;;;:::o;41519:388::-;41566:10;41579:42;41566:55;;41652:7;:5;:7::i;:::-;41638:21;;:10;:21;;;:41;;;;41677:2;41663:16;;:10;:16;;;41638:41;41630:50;;;;;;41689:16;41738:2;41732:3;41708:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;41689:51;;41749:19;41795:8;41771:21;:32;;;;:::i;:::-;41749:54;;41828:2;41820:16;;:26;41837:8;41820:26;;;;;;;;;;;;;;;;;;;;;;;41812:35;;;;;;41872:7;:5;:7::i;:::-;41864:21;;:34;41886:11;41864:34;;;;;;;;;;;;;;;;;;;;;;;41856:43;;;;;;41557:350;;;41519:388::o;538:87::-;584:7;611:6;;;;;;;;;;;604:13;;538:87;:::o;38474:29::-;;;;;;;;;;;;;:::o;24804:98::-;24860:13;24889:7;24882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24804:98;:::o;38434:31::-;;;;:::o;39291:497::-;37142:1;37740:7;;:19;;37732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37142:1;37873:7;:18;;;;39371:14:::1;;;;;;;;;;;39363:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39470:12;;38214:5;39457:25;;;;:::i;:::-;39447:6;39431:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:51;;39423:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;39571:8;:22;39580:12;:10;:12::i;:::-;39571:22;;;;;;;;;;;;;;;;39558:10;;:35;;;;:::i;:::-;39548:6;:45;;39540:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39669:6;38321:10;39653:22;;;;:::i;:::-;39640:9;:35;39632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39732:6;39706:8;:22;39715:12;:10;:12::i;:::-;39706:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;39749:31;39759:12;:10;:12::i;:::-;39773:6;39749:9;:31::i;:::-;37098:1:::0;38052:7;:22;;;;39291:497;:::o;38845:438::-;37142:1;37740:7;;:19;;37732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37142:1;37873:7;:18;;;;38922:9:::1;;;;;;;;;;;38914:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39019:12;;38214:5;39006:25;;;;:::i;:::-;38996:6;38980:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:51;;38972:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;39107:11;;39097:6;:21;;39089:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38265:9;39192:6;:21;;;;:::i;:::-;39179:9;:34;39171:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39244:31;39254:12;:10;:12::i;:::-;39268:6;39244:9;:31::i;:::-;37098:1:::0;38052:7;:22;;;;38845:438;:::o;26442:274::-;26545:12;:10;:12::i;:::-;26533:24;;:8;:24;;;;26525:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26642:8;26597:18;:32;26616:12;:10;:12::i;:::-;26597:32;;;;;;;;;;;;;;;:42;26630:8;26597:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26691:8;26662:48;;26677:12;:10;:12::i;:::-;26662:48;;;26701:8;26662:48;;;;;;:::i;:::-;;;;;;;;26442:274;;:::o;38226:48::-;38265:9;38226:48;:::o;38281:50::-;38321:10;38281:50;:::o;41284:108::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41349:5:::1;41337:9;;:17;;;;;;;;;;;;;;;;;;41380:4;41363:14;;:21;;;;;;;;;;;;;;;;;;41284:108::o:0;27449:311::-;27586:28;27596:4;27602:2;27606:7;27586:9;:28::i;:::-;27637:48;27660:4;27666:2;27670:7;27679:5;27637:22;:48::i;:::-;27621:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;27449:311;;;;:::o;38653:24::-;;;;:::o;24965:394::-;25063:13;25104:16;25112:7;25104;:16::i;:::-;25088:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;25194:21;25218:10;:8;:10::i;:::-;25194:34;;25273:1;25255:7;25249:21;:25;:104;;;;;;;;;;;;;;;;;25310:7;25319:18;:7;:16;:18::i;:::-;25293:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25249:104;25235:118;;;24965:394;;;:::o;31864:43::-;;;;:::o;26779:186::-;26901:4;26924:18;:25;26943:5;26924:25;;;;;;;;;;;;;;;:35;26950:8;26924:35;;;;;;;;;;;;;;;;;;;;;;;;;26917:42;;26779:186;;;;:::o;863:192::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;972:1:::1;952:22;;:8;:22;;;;944:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1028:19;1038:8;1028:9;:19::i;:::-;863:192:::0;:::o;41915:146::-;684:12;:10;:12::i;:::-;673:23;;:7;:5;:7::i;:::-;:23;;;665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41995:42:::1;41985:66;;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41970:12;:83;;;;41915:146::o:0;2881:157::-;2966:4;3005:25;2990:40;;;:11;:40;;;;2983:47;;2881:157;;;:::o;27999:105::-;28056:4;28086:12;;28076:7;:22;28069:29;;27999:105;;;:::o;93:98::-;146:7;173:10;166:17;;93:98;:::o;31686:172::-;31810:2;31783:15;:24;31799:7;31783:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31844:7;31840:2;31824:28;;31833:5;31824:28;;;;;;;;;;;;31686:172;;;:::o;30051:1529::-;30148:35;30186:20;30198:7;30186:11;:20::i;:::-;30148:58;;30215:22;30257:13;:18;;;30241:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;30310:12;:10;:12::i;:::-;30286:36;;:20;30298:7;30286:11;:20::i;:::-;:36;;;30241:81;:142;;;;30333:50;30350:13;:18;;;30370:12;:10;:12::i;:::-;30333:16;:50::i;:::-;30241:142;30215:169;;30409:17;30393:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;30541:4;30519:26;;:13;:18;;;:26;;;30503:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;30630:1;30616:16;;:2;:16;;;;30608:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30683:43;30705:4;30711:2;30715:7;30724:1;30683:21;:43::i;:::-;30783:49;30800:1;30804:7;30813:13;:18;;;30783:8;:49::i;:::-;30871:1;30841:12;:18;30854:4;30841:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30907:1;30879:12;:16;30892:2;30879:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30938:43;;;;;;;;30953:2;30938:43;;;;;;30964:15;30938:43;;;;;30915:11;:20;30927:7;30915:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31209:19;31241:1;31231:7;:11;;;;:::i;:::-;31209:33;;31294:1;31253:43;;:11;:24;31265:11;31253:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;31249:236;;;31311:20;31319:11;31311:7;:20::i;:::-;31307:171;;;31371:97;;;;;;;;31398:13;:18;;;31371:97;;;;;;31429:13;:28;;;31371:97;;;;;31344:11;:24;31356:11;31344:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31307:171;31249:236;31517:7;31513:2;31498:27;;31507:4;31498:27;;;;;;;;;;;;31532:42;31553:4;31559:2;31563:7;31572:1;31532:20;:42::i;:::-;30141:1439;;;30051:1529;;;:::o;28110:98::-;28175:27;28185:2;28189:8;28175:27;;;;;;;;;;;;:9;:27::i;:::-;28110:98;;:::o;23812:606::-;23888:21;;:::i;:::-;23929:16;23937:7;23929;:16::i;:::-;23921:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24001:26;24049:12;24038:7;:23;24034:93;;24118:1;24103:12;24093:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;24072:47;;24034:93;24140:12;24155:7;24140:22;;24135:212;24172:18;24164:4;:26;24135:212;;24209:31;24243:11;:17;24255:4;24243:17;;;;;;;;;;;24209:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24299:1;24273:28;;:9;:14;;;:28;;;24269:71;;24321:9;24314:16;;;;;;;24269:71;24200:147;24192:6;;;;;:::i;:::-;;;;24135:212;;;;24355:57;;;;;;;;;;:::i;:::-;;;;;;;;23812:606;;;;:::o;1063:173::-;1119:16;1138:6;;;;;;;;;;;1119:25;;1164:8;1155:6;;:17;;;;;;;;;;;;;;;;;;1219:8;1188:40;;1209:8;1188:40;;;;;;;;;;;;1108:128;1063:173;:::o;33401:690::-;33538:4;33555:15;:2;:13;;;:15::i;:::-;33551:535;;;33610:2;33594:36;;;33631:12;:10;:12::i;:::-;33645:4;33651:7;33660:5;33594:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33581:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33842:1;33825:6;:13;:18;33821:215;;;33858:61;;;;;;;;;;:::i;:::-;;;;;;;;33821:215;34004:6;33998:13;33989:6;33985:2;33981:15;33974:38;33581:464;33726:45;;;33716:55;;;:6;:55;;;;33709:62;;;;;33551:535;34074:4;34067:11;;33401:690;;;;;;;:::o;40257:112::-;40317:13;40348;40341:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40257:112;:::o;3135:534::-;3191:13;3232:1;3223:5;:10;3219:53;;;3250:10;;;;;;;;;;;;;;;;;;;;;3219:53;3282:12;3297:5;3282:20;;3313:14;3338:78;3353:1;3345:4;:9;3338:78;;3371:8;;;;;:::i;:::-;;;;3402:2;3394:10;;;;;:::i;:::-;;;3338:78;;;3426:19;3458:6;3448:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3426:39;;3476:154;3492:1;3483:5;:10;3476:154;;3520:1;3510:11;;;;;:::i;:::-;;;3587:2;3579:5;:10;;;;:::i;:::-;3566:2;:24;;;;:::i;:::-;3553:39;;3536:6;3543;3536:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3616:2;3607:11;;;;;:::i;:::-;;;3476:154;;;3654:6;3640:21;;;;;3135:534;;;;:::o;34553:141::-;;;;;:::o;35080:140::-;;;;;:::o;28547:1272::-;28652:20;28675:12;;28652:35;;28716:1;28702:16;;:2;:16;;;;28694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:21;28901:12;28893:7;:21::i;:::-;28892:22;28884:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28975:12;28963:8;:24;;28955:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29035:61;29065:1;29069:2;29073:12;29087:8;29035:21;:61::i;:::-;29105:30;29138:12;:16;29151:2;29138:16;;;;;;;;;;;;;;;29105:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29180:119;;;;;;;;29230:8;29200:11;:19;;;:39;;;;:::i;:::-;29180:119;;;;;;29283:8;29248:11;:24;;;:44;;;;:::i;:::-;29180:119;;;;;29161:12;:16;29174:2;29161:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29334:43;;;;;;;;29349:2;29334:43;;;;;;29360:15;29334:43;;;;;29306:11;:25;29318:12;29306:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29386:20;29409:12;29386:35;;29435:9;29430:281;29454:8;29450:1;:12;29430:281;;;29508:12;29504:2;29483:38;;29500:1;29483:38;;;;;;;;;;;;29548:59;29579:1;29583:2;29587:12;29601:5;29548:22;:59::i;:::-;29530:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;29689:14;;;;;:::i;:::-;;;;29464:3;;;;;:::i;:::-;;;;29430:281;;;;29734:12;29719;:27;;;;29753:60;29782:1;29786:2;29790:12;29804:8;29753:20;:60::i;:::-;28645:1174;;;28547:1272;;;:::o;4508:198::-;4568:4;4587:12;4654:7;4642:20;4634:28;;4697:1;4690:4;:8;4683:15;;;4508:198;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:327::-;5827:6;5876:2;5864:9;5855:7;5851:23;5847:32;5844:119;;;5882:79;;:::i;:::-;5844:119;6002:1;6027:52;6071:7;6062:6;6051:9;6047:22;6027:52;:::i;:::-;6017:62;;5973:116;5769:327;;;;:::o;6102:349::-;6171:6;6220:2;6208:9;6199:7;6195:23;6191:32;6188:119;;;6226:79;;:::i;:::-;6188:119;6346:1;6371:63;6426:7;6417:6;6406:9;6402:22;6371:63;:::i;:::-;6361:73;;6317:127;6102:349;;;;:::o;6457:509::-;6526:6;6575:2;6563:9;6554:7;6550:23;6546:32;6543:119;;;6581:79;;:::i;:::-;6543:119;6729:1;6718:9;6714:17;6701:31;6759:18;6751:6;6748:30;6745:117;;;6781:79;;:::i;:::-;6745:117;6886:63;6941:7;6932:6;6921:9;6917:22;6886:63;:::i;:::-;6876:73;;6672:287;6457:509;;;;:::o;6972:329::-;7031:6;7080:2;7068:9;7059:7;7055:23;7051:32;7048:119;;;7086:79;;:::i;:::-;7048:119;7206:1;7231:53;7276:7;7267:6;7256:9;7252:22;7231:53;:::i;:::-;7221:63;;7177:117;6972:329;;;;:::o;7307:351::-;7377:6;7426:2;7414:9;7405:7;7401:23;7397:32;7394:119;;;7432:79;;:::i;:::-;7394:119;7552:1;7577:64;7633:7;7624:6;7613:9;7609:22;7577:64;:::i;:::-;7567:74;;7523:128;7307:351;;;;:::o;7664:179::-;7733:10;7754:46;7796:3;7788:6;7754:46;:::i;:::-;7832:4;7827:3;7823:14;7809:28;;7664:179;;;;:::o;7849:118::-;7936:24;7954:5;7936:24;:::i;:::-;7931:3;7924:37;7849:118;;:::o;8003:732::-;8122:3;8151:54;8199:5;8151:54;:::i;:::-;8221:86;8300:6;8295:3;8221:86;:::i;:::-;8214:93;;8331:56;8381:5;8331:56;:::i;:::-;8410:7;8441:1;8426:284;8451:6;8448:1;8445:13;8426:284;;;8527:6;8521:13;8554:63;8613:3;8598:13;8554:63;:::i;:::-;8547:70;;8640:60;8693:6;8640:60;:::i;:::-;8630:70;;8486:224;8473:1;8470;8466:9;8461:14;;8426:284;;;8430:14;8726:3;8719:10;;8127:608;;;8003:732;;;;:::o;8741:109::-;8822:21;8837:5;8822:21;:::i;:::-;8817:3;8810:34;8741:109;;:::o;8856:115::-;8941:23;8958:5;8941:23;:::i;:::-;8936:3;8929:36;8856:115;;:::o;8977:360::-;9063:3;9091:38;9123:5;9091:38;:::i;:::-;9145:70;9208:6;9203:3;9145:70;:::i;:::-;9138:77;;9224:52;9269:6;9264:3;9257:4;9250:5;9246:16;9224:52;:::i;:::-;9301:29;9323:6;9301:29;:::i;:::-;9296:3;9292:39;9285:46;;9067:270;8977:360;;;;:::o;9343:364::-;9431:3;9459:39;9492:5;9459:39;:::i;:::-;9514:71;9578:6;9573:3;9514:71;:::i;:::-;9507:78;;9594:52;9639:6;9634:3;9627:4;9620:5;9616:16;9594:52;:::i;:::-;9671:29;9693:6;9671:29;:::i;:::-;9666:3;9662:39;9655:46;;9435:272;9343:364;;;;:::o;9713:377::-;9819:3;9847:39;9880:5;9847:39;:::i;:::-;9902:89;9984:6;9979:3;9902:89;:::i;:::-;9895:96;;10000:52;10045:6;10040:3;10033:4;10026:5;10022:16;10000:52;:::i;:::-;10077:6;10072:3;10068:16;10061:23;;9823:267;9713:377;;;;:::o;10096:366::-;10238:3;10259:67;10323:2;10318:3;10259:67;:::i;:::-;10252:74;;10335:93;10424:3;10335:93;:::i;:::-;10453:2;10448:3;10444:12;10437:19;;10096:366;;;:::o;10468:::-;10610:3;10631:67;10695:2;10690:3;10631:67;:::i;:::-;10624:74;;10707:93;10796:3;10707:93;:::i;:::-;10825:2;10820:3;10816:12;10809:19;;10468:366;;;:::o;10840:::-;10982:3;11003:67;11067:2;11062:3;11003:67;:::i;:::-;10996:74;;11079:93;11168:3;11079:93;:::i;:::-;11197:2;11192:3;11188:12;11181:19;;10840:366;;;:::o;11212:::-;11354:3;11375:67;11439:2;11434:3;11375:67;:::i;:::-;11368:74;;11451:93;11540:3;11451:93;:::i;:::-;11569:2;11564:3;11560:12;11553:19;;11212:366;;;:::o;11584:::-;11726:3;11747:67;11811:2;11806:3;11747:67;:::i;:::-;11740:74;;11823:93;11912:3;11823:93;:::i;:::-;11941:2;11936:3;11932:12;11925:19;;11584:366;;;:::o;11956:::-;12098:3;12119:67;12183:2;12178:3;12119:67;:::i;:::-;12112:74;;12195:93;12284:3;12195:93;:::i;:::-;12313:2;12308:3;12304:12;12297:19;;11956:366;;;:::o;12328:::-;12470:3;12491:67;12555:2;12550:3;12491:67;:::i;:::-;12484:74;;12567:93;12656:3;12567:93;:::i;:::-;12685:2;12680:3;12676:12;12669:19;;12328:366;;;:::o;12700:::-;12842:3;12863:67;12927:2;12922:3;12863:67;:::i;:::-;12856:74;;12939:93;13028:3;12939:93;:::i;:::-;13057:2;13052:3;13048:12;13041:19;;12700:366;;;:::o;13072:::-;13214:3;13235:67;13299:2;13294:3;13235:67;:::i;:::-;13228:74;;13311:93;13400:3;13311:93;:::i;:::-;13429:2;13424:3;13420:12;13413:19;;13072:366;;;:::o;13444:::-;13586:3;13607:67;13671:2;13666:3;13607:67;:::i;:::-;13600:74;;13683:93;13772:3;13683:93;:::i;:::-;13801:2;13796:3;13792:12;13785:19;;13444:366;;;:::o;13816:365::-;13958:3;13979:66;14043:1;14038:3;13979:66;:::i;:::-;13972:73;;14054:93;14143:3;14054:93;:::i;:::-;14172:2;14167:3;14163:12;14156:19;;13816:365;;;:::o;14187:366::-;14329:3;14350:67;14414:2;14409:3;14350:67;:::i;:::-;14343:74;;14426:93;14515:3;14426:93;:::i;:::-;14544:2;14539:3;14535:12;14528:19;;14187:366;;;:::o;14559:::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:::-;15073:3;15094:67;15158:2;15153:3;15094:67;:::i;:::-;15087:74;;15170:93;15259:3;15170:93;:::i;:::-;15288:2;15283:3;15279:12;15272:19;;14931:366;;;:::o;15303:::-;15445:3;15466:67;15530:2;15525:3;15466:67;:::i;:::-;15459:74;;15542:93;15631:3;15542:93;:::i;:::-;15660:2;15655:3;15651:12;15644:19;;15303:366;;;:::o;15675:::-;15817:3;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15914:93;16003:3;15914:93;:::i;:::-;16032:2;16027:3;16023:12;16016:19;;15675:366;;;:::o;16047:::-;16189:3;16210:67;16274:2;16269:3;16210:67;:::i;:::-;16203:74;;16286:93;16375:3;16286:93;:::i;:::-;16404:2;16399:3;16395:12;16388:19;;16047:366;;;:::o;16419:::-;16561:3;16582:67;16646:2;16641:3;16582:67;:::i;:::-;16575:74;;16658:93;16747:3;16658:93;:::i;:::-;16776:2;16771:3;16767:12;16760:19;;16419:366;;;:::o;16791:::-;16933:3;16954:67;17018:2;17013:3;16954:67;:::i;:::-;16947:74;;17030:93;17119:3;17030:93;:::i;:::-;17148:2;17143:3;17139:12;17132:19;;16791:366;;;:::o;17163:::-;17305:3;17326:67;17390:2;17385:3;17326:67;:::i;:::-;17319:74;;17402:93;17491:3;17402:93;:::i;:::-;17520:2;17515:3;17511:12;17504:19;;17163:366;;;:::o;17535:::-;17677:3;17698:67;17762:2;17757:3;17698:67;:::i;:::-;17691:74;;17774:93;17863:3;17774:93;:::i;:::-;17892:2;17887:3;17883:12;17876:19;;17535:366;;;:::o;17907:::-;18049:3;18070:67;18134:2;18129:3;18070:67;:::i;:::-;18063:74;;18146:93;18235:3;18146:93;:::i;:::-;18264:2;18259:3;18255:12;18248:19;;17907:366;;;:::o;18279:::-;18421:3;18442:67;18506:2;18501:3;18442:67;:::i;:::-;18435:74;;18518:93;18607:3;18518:93;:::i;:::-;18636:2;18631:3;18627:12;18620:19;;18279:366;;;:::o;18651:::-;18793:3;18814:67;18878:2;18873:3;18814:67;:::i;:::-;18807:74;;18890:93;18979:3;18890:93;:::i;:::-;19008:2;19003:3;18999:12;18992:19;;18651:366;;;:::o;19023:::-;19165:3;19186:67;19250:2;19245:3;19186:67;:::i;:::-;19179:74;;19262:93;19351:3;19262:93;:::i;:::-;19380:2;19375:3;19371:12;19364:19;;19023:366;;;:::o;19395:::-;19537:3;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19634:93;19723:3;19634:93;:::i;:::-;19752:2;19747:3;19743:12;19736:19;;19395:366;;;:::o;19767:::-;19909:3;19930:67;19994:2;19989:3;19930:67;:::i;:::-;19923:74;;20006:93;20095:3;20006:93;:::i;:::-;20124:2;20119:3;20115:12;20108:19;;19767:366;;;:::o;20139:::-;20281:3;20302:67;20366:2;20361:3;20302:67;:::i;:::-;20295:74;;20378:93;20467:3;20378:93;:::i;:::-;20496:2;20491:3;20487:12;20480:19;;20139:366;;;:::o;20511:::-;20653:3;20674:67;20738:2;20733:3;20674:67;:::i;:::-;20667:74;;20750:93;20839:3;20750:93;:::i;:::-;20868:2;20863:3;20859:12;20852:19;;20511:366;;;:::o;20883:108::-;20960:24;20978:5;20960:24;:::i;:::-;20955:3;20948:37;20883:108;;:::o;20997:118::-;21084:24;21102:5;21084:24;:::i;:::-;21079:3;21072:37;20997:118;;:::o;21121:435::-;21301:3;21323:95;21414:3;21405:6;21323:95;:::i;:::-;21316:102;;21435:95;21526:3;21517:6;21435:95;:::i;:::-;21428:102;;21547:3;21540:10;;21121:435;;;;;:::o;21562:222::-;21655:4;21693:2;21682:9;21678:18;21670:26;;21706:71;21774:1;21763:9;21759:17;21750:6;21706:71;:::i;:::-;21562:222;;;;:::o;21790:640::-;21985:4;22023:3;22012:9;22008:19;22000:27;;22037:71;22105:1;22094:9;22090:17;22081:6;22037:71;:::i;:::-;22118:72;22186:2;22175:9;22171:18;22162:6;22118:72;:::i;:::-;22200;22268:2;22257:9;22253:18;22244:6;22200:72;:::i;:::-;22319:9;22313:4;22309:20;22304:2;22293:9;22289:18;22282:48;22347:76;22418:4;22409:6;22347:76;:::i;:::-;22339:84;;21790:640;;;;;;;:::o;22436:373::-;22579:4;22617:2;22606:9;22602:18;22594:26;;22666:9;22660:4;22656:20;22652:1;22641:9;22637:17;22630:47;22694:108;22797:4;22788:6;22694:108;:::i;:::-;22686:116;;22436:373;;;;:::o;22815:210::-;22902:4;22940:2;22929:9;22925:18;22917:26;;22953:65;23015:1;23004:9;23000:17;22991:6;22953:65;:::i;:::-;22815:210;;;;:::o;23031:218::-;23122:4;23160:2;23149:9;23145:18;23137:26;;23173:69;23239:1;23228:9;23224:17;23215:6;23173:69;:::i;:::-;23031:218;;;;:::o;23255:313::-;23368:4;23406:2;23395:9;23391:18;23383:26;;23455:9;23449:4;23445:20;23441:1;23430:9;23426:17;23419:47;23483:78;23556:4;23547:6;23483:78;:::i;:::-;23475:86;;23255:313;;;;:::o;23574:419::-;23740:4;23778:2;23767:9;23763:18;23755:26;;23827:9;23821:4;23817:20;23813:1;23802:9;23798:17;23791:47;23855:131;23981:4;23855:131;:::i;:::-;23847:139;;23574:419;;;:::o;23999:::-;24165:4;24203:2;24192:9;24188:18;24180:26;;24252:9;24246:4;24242:20;24238:1;24227:9;24223:17;24216:47;24280:131;24406:4;24280:131;:::i;:::-;24272:139;;23999:419;;;:::o;24424:::-;24590:4;24628:2;24617:9;24613:18;24605:26;;24677:9;24671:4;24667:20;24663:1;24652:9;24648:17;24641:47;24705:131;24831:4;24705:131;:::i;:::-;24697:139;;24424:419;;;:::o;24849:::-;25015:4;25053:2;25042:9;25038:18;25030:26;;25102:9;25096:4;25092:20;25088:1;25077:9;25073:17;25066:47;25130:131;25256:4;25130:131;:::i;:::-;25122:139;;24849:419;;;:::o;25274:::-;25440:4;25478:2;25467:9;25463:18;25455:26;;25527:9;25521:4;25517:20;25513:1;25502:9;25498:17;25491:47;25555:131;25681:4;25555:131;:::i;:::-;25547:139;;25274:419;;;:::o;25699:::-;25865:4;25903:2;25892:9;25888:18;25880:26;;25952:9;25946:4;25942:20;25938:1;25927:9;25923:17;25916:47;25980:131;26106:4;25980:131;:::i;:::-;25972:139;;25699:419;;;:::o;26124:::-;26290:4;26328:2;26317:9;26313:18;26305:26;;26377:9;26371:4;26367:20;26363:1;26352:9;26348:17;26341:47;26405:131;26531:4;26405:131;:::i;:::-;26397:139;;26124:419;;;:::o;26549:::-;26715:4;26753:2;26742:9;26738:18;26730:26;;26802:9;26796:4;26792:20;26788:1;26777:9;26773:17;26766:47;26830:131;26956:4;26830:131;:::i;:::-;26822:139;;26549:419;;;:::o;26974:::-;27140:4;27178:2;27167:9;27163:18;27155:26;;27227:9;27221:4;27217:20;27213:1;27202:9;27198:17;27191:47;27255:131;27381:4;27255:131;:::i;:::-;27247:139;;26974:419;;;:::o;27399:::-;27565:4;27603:2;27592:9;27588:18;27580:26;;27652:9;27646:4;27642:20;27638:1;27627:9;27623:17;27616:47;27680:131;27806:4;27680:131;:::i;:::-;27672:139;;27399:419;;;:::o;27824:::-;27990:4;28028:2;28017:9;28013:18;28005:26;;28077:9;28071:4;28067:20;28063:1;28052:9;28048:17;28041:47;28105:131;28231:4;28105:131;:::i;:::-;28097:139;;27824:419;;;:::o;28249:::-;28415:4;28453:2;28442:9;28438:18;28430:26;;28502:9;28496:4;28492:20;28488:1;28477:9;28473:17;28466:47;28530:131;28656:4;28530:131;:::i;:::-;28522:139;;28249:419;;;:::o;28674:::-;28840:4;28878:2;28867:9;28863:18;28855:26;;28927:9;28921:4;28917:20;28913:1;28902:9;28898:17;28891:47;28955:131;29081:4;28955:131;:::i;:::-;28947:139;;28674:419;;;:::o;29099:::-;29265:4;29303:2;29292:9;29288:18;29280:26;;29352:9;29346:4;29342:20;29338:1;29327:9;29323:17;29316:47;29380:131;29506:4;29380:131;:::i;:::-;29372:139;;29099:419;;;:::o;29524:::-;29690:4;29728:2;29717:9;29713:18;29705:26;;29777:9;29771:4;29767:20;29763:1;29752:9;29748:17;29741:47;29805:131;29931:4;29805:131;:::i;:::-;29797:139;;29524:419;;;:::o;29949:::-;30115:4;30153:2;30142:9;30138:18;30130:26;;30202:9;30196:4;30192:20;30188:1;30177:9;30173:17;30166:47;30230:131;30356:4;30230:131;:::i;:::-;30222:139;;29949:419;;;:::o;30374:::-;30540:4;30578:2;30567:9;30563:18;30555:26;;30627:9;30621:4;30617:20;30613:1;30602:9;30598:17;30591:47;30655:131;30781:4;30655:131;:::i;:::-;30647:139;;30374:419;;;:::o;30799:::-;30965:4;31003:2;30992:9;30988:18;30980:26;;31052:9;31046:4;31042:20;31038:1;31027:9;31023:17;31016:47;31080:131;31206:4;31080:131;:::i;:::-;31072:139;;30799:419;;;:::o;31224:::-;31390:4;31428:2;31417:9;31413:18;31405:26;;31477:9;31471:4;31467:20;31463:1;31452:9;31448:17;31441:47;31505:131;31631:4;31505:131;:::i;:::-;31497:139;;31224:419;;;:::o;31649:::-;31815:4;31853:2;31842:9;31838:18;31830:26;;31902:9;31896:4;31892:20;31888:1;31877:9;31873:17;31866:47;31930:131;32056:4;31930:131;:::i;:::-;31922:139;;31649:419;;;:::o;32074:::-;32240:4;32278:2;32267:9;32263:18;32255:26;;32327:9;32321:4;32317:20;32313:1;32302:9;32298:17;32291:47;32355:131;32481:4;32355:131;:::i;:::-;32347:139;;32074:419;;;:::o;32499:::-;32665:4;32703:2;32692:9;32688:18;32680:26;;32752:9;32746:4;32742:20;32738:1;32727:9;32723:17;32716:47;32780:131;32906:4;32780:131;:::i;:::-;32772:139;;32499:419;;;:::o;32924:::-;33090:4;33128:2;33117:9;33113:18;33105:26;;33177:9;33171:4;33167:20;33163:1;33152:9;33148:17;33141:47;33205:131;33331:4;33205:131;:::i;:::-;33197:139;;32924:419;;;:::o;33349:::-;33515:4;33553:2;33542:9;33538:18;33530:26;;33602:9;33596:4;33592:20;33588:1;33577:9;33573:17;33566:47;33630:131;33756:4;33630:131;:::i;:::-;33622:139;;33349:419;;;:::o;33774:::-;33940:4;33978:2;33967:9;33963:18;33955:26;;34027:9;34021:4;34017:20;34013:1;34002:9;33998:17;33991:47;34055:131;34181:4;34055:131;:::i;:::-;34047:139;;33774:419;;;:::o;34199:::-;34365:4;34403:2;34392:9;34388:18;34380:26;;34452:9;34446:4;34442:20;34438:1;34427:9;34423:17;34416:47;34480:131;34606:4;34480:131;:::i;:::-;34472:139;;34199:419;;;:::o;34624:::-;34790:4;34828:2;34817:9;34813:18;34805:26;;34877:9;34871:4;34867:20;34863:1;34852:9;34848:17;34841:47;34905:131;35031:4;34905:131;:::i;:::-;34897:139;;34624:419;;;:::o;35049:::-;35215:4;35253:2;35242:9;35238:18;35230:26;;35302:9;35296:4;35292:20;35288:1;35277:9;35273:17;35266:47;35330:131;35456:4;35330:131;:::i;:::-;35322:139;;35049:419;;;:::o;35474:::-;35640:4;35678:2;35667:9;35663:18;35655:26;;35727:9;35721:4;35717:20;35713:1;35702:9;35698:17;35691:47;35755:131;35881:4;35755:131;:::i;:::-;35747:139;;35474:419;;;:::o;35899:222::-;35992:4;36030:2;36019:9;36015:18;36007:26;;36043:71;36111:1;36100:9;36096:17;36087:6;36043:71;:::i;:::-;35899:222;;;;:::o;36127:129::-;36161:6;36188:20;;:::i;:::-;36178:30;;36217:33;36245:4;36237:6;36217:33;:::i;:::-;36127:129;;;:::o;36262:75::-;36295:6;36328:2;36322:9;36312:19;;36262:75;:::o;36343:307::-;36404:4;36494:18;36486:6;36483:30;36480:56;;;36516:18;;:::i;:::-;36480:56;36554:29;36576:6;36554:29;:::i;:::-;36546:37;;36638:4;36632;36628:15;36620:23;;36343:307;;;:::o;36656:308::-;36718:4;36808:18;36800:6;36797:30;36794:56;;;36830:18;;:::i;:::-;36794:56;36868:29;36890:6;36868:29;:::i;:::-;36860:37;;36952:4;36946;36942:15;36934:23;;36656:308;;;:::o;36970:132::-;37037:4;37060:3;37052:11;;37090:4;37085:3;37081:14;37073:22;;36970:132;;;:::o;37108:114::-;37175:6;37209:5;37203:12;37193:22;;37108:114;;;:::o;37228:98::-;37279:6;37313:5;37307:12;37297:22;;37228:98;;;:::o;37332:99::-;37384:6;37418:5;37412:12;37402:22;;37332:99;;;:::o;37437:113::-;37507:4;37539;37534:3;37530:14;37522:22;;37437:113;;;:::o;37556:184::-;37655:11;37689:6;37684:3;37677:19;37729:4;37724:3;37720:14;37705:29;;37556:184;;;;:::o;37746:168::-;37829:11;37863:6;37858:3;37851:19;37903:4;37898:3;37894:14;37879:29;;37746:168;;;;:::o;37920:169::-;38004:11;38038:6;38033:3;38026:19;38078:4;38073:3;38069:14;38054:29;;37920:169;;;;:::o;38095:148::-;38197:11;38234:3;38219:18;;38095:148;;;;:::o;38249:273::-;38289:3;38308:20;38326:1;38308:20;:::i;:::-;38303:25;;38342:20;38360:1;38342:20;:::i;:::-;38337:25;;38464:1;38428:34;38424:42;38421:1;38418:49;38415:75;;;38470:18;;:::i;:::-;38415:75;38514:1;38511;38507:9;38500:16;;38249:273;;;;:::o;38528:305::-;38568:3;38587:20;38605:1;38587:20;:::i;:::-;38582:25;;38621:20;38639:1;38621:20;:::i;:::-;38616:25;;38775:1;38707:66;38703:74;38700:1;38697:81;38694:107;;;38781:18;;:::i;:::-;38694:107;38825:1;38822;38818:9;38811:16;;38528:305;;;;:::o;38839:185::-;38879:1;38896:20;38914:1;38896:20;:::i;:::-;38891:25;;38930:20;38948:1;38930:20;:::i;:::-;38925:25;;38969:1;38959:35;;38974:18;;:::i;:::-;38959:35;39016:1;39013;39009:9;39004:14;;38839:185;;;;:::o;39030:348::-;39070:7;39093:20;39111:1;39093:20;:::i;:::-;39088:25;;39127:20;39145:1;39127:20;:::i;:::-;39122:25;;39315:1;39247:66;39243:74;39240:1;39237:81;39232:1;39225:9;39218:17;39214:105;39211:131;;;39322:18;;:::i;:::-;39211:131;39370:1;39367;39363:9;39352:20;;39030:348;;;;:::o;39384:191::-;39424:4;39444:20;39462:1;39444:20;:::i;:::-;39439:25;;39478:20;39496:1;39478:20;:::i;:::-;39473:25;;39517:1;39514;39511:8;39508:34;;;39522:18;;:::i;:::-;39508:34;39567:1;39564;39560:9;39552:17;;39384:191;;;;:::o;39581:::-;39621:4;39641:20;39659:1;39641:20;:::i;:::-;39636:25;;39675:20;39693:1;39675:20;:::i;:::-;39670:25;;39714:1;39711;39708:8;39705:34;;;39719:18;;:::i;:::-;39705:34;39764:1;39761;39757:9;39749:17;;39581:191;;;;:::o;39778:96::-;39815:7;39844:24;39862:5;39844:24;:::i;:::-;39833:35;;39778:96;;;:::o;39880:90::-;39914:7;39957:5;39950:13;39943:21;39932:32;;39880:90;;;:::o;39976:149::-;40012:7;40052:66;40045:5;40041:78;40030:89;;39976:149;;;:::o;40131:118::-;40168:7;40208:34;40201:5;40197:46;40186:57;;40131:118;;;:::o;40255:126::-;40292:7;40332:42;40325:5;40321:54;40310:65;;40255:126;;;:::o;40387:77::-;40424:7;40453:5;40442:16;;40387:77;;;:::o;40470:154::-;40554:6;40549:3;40544;40531:30;40616:1;40607:6;40602:3;40598:16;40591:27;40470:154;;;:::o;40630:307::-;40698:1;40708:113;40722:6;40719:1;40716:13;40708:113;;;40807:1;40802:3;40798:11;40792:18;40788:1;40783:3;40779:11;40772:39;40744:2;40741:1;40737:10;40732:15;;40708:113;;;40839:6;40836:1;40833:13;40830:101;;;40919:1;40910:6;40905:3;40901:16;40894:27;40830:101;40679:258;40630:307;;;:::o;40943:171::-;40982:3;41005:24;41023:5;41005:24;:::i;:::-;40996:33;;41051:4;41044:5;41041:15;41038:41;;;41059:18;;:::i;:::-;41038:41;41106:1;41099:5;41095:13;41088:20;;40943:171;;;:::o;41120:320::-;41164:6;41201:1;41195:4;41191:12;41181:22;;41248:1;41242:4;41238:12;41269:18;41259:81;;41325:4;41317:6;41313:17;41303:27;;41259:81;41387:2;41379:6;41376:14;41356:18;41353:38;41350:84;;;41406:18;;:::i;:::-;41350:84;41171:269;41120:320;;;:::o;41446:281::-;41529:27;41551:4;41529:27;:::i;:::-;41521:6;41517:40;41659:6;41647:10;41644:22;41623:18;41611:10;41608:34;41605:62;41602:88;;;41670:18;;:::i;:::-;41602:88;41710:10;41706:2;41699:22;41489:238;41446:281;;:::o;41733:233::-;41772:3;41795:24;41813:5;41795:24;:::i;:::-;41786:33;;41841:66;41834:5;41831:77;41828:103;;;41911:18;;:::i;:::-;41828:103;41958:1;41951:5;41947:13;41940:20;;41733:233;;;:::o;41972:176::-;42004:1;42021:20;42039:1;42021:20;:::i;:::-;42016:25;;42055:20;42073:1;42055:20;:::i;:::-;42050:25;;42094:1;42084:35;;42099:18;;:::i;:::-;42084:35;42140:1;42137;42133:9;42128:14;;41972:176;;;;:::o;42154:180::-;42202:77;42199:1;42192:88;42299:4;42296:1;42289:15;42323:4;42320:1;42313:15;42340:180;42388:77;42385:1;42378:88;42485:4;42482:1;42475:15;42509:4;42506:1;42499:15;42526:180;42574:77;42571:1;42564:88;42671:4;42668:1;42661:15;42695:4;42692:1;42685:15;42712:180;42760:77;42757:1;42750:88;42857:4;42854:1;42847:15;42881:4;42878:1;42871:15;42898:180;42946:77;42943:1;42936:88;43043:4;43040:1;43033:15;43067:4;43064:1;43057:15;43084:117;43193:1;43190;43183:12;43207:117;43316:1;43313;43306:12;43330:117;43439:1;43436;43429:12;43453:117;43562:1;43559;43552:12;43576:102;43617:6;43668:2;43664:7;43659:2;43652:5;43648:14;43644:28;43634:38;;43576:102;;;:::o;43684:221::-;43824:34;43820:1;43812:6;43808:14;43801:58;43893:4;43888:2;43880:6;43876:15;43869:29;43684:221;:::o;43911:225::-;44051:34;44047:1;44039:6;44035:14;44028:58;44120:8;44115:2;44107:6;44103:15;44096:33;43911:225;:::o;44142:229::-;44282:34;44278:1;44270:6;44266:14;44259:58;44351:12;44346:2;44338:6;44334:15;44327:37;44142:229;:::o;44377:224::-;44517:34;44513:1;44505:6;44501:14;44494:58;44586:7;44581:2;44573:6;44569:15;44562:32;44377:224;:::o;44607:229::-;44747:34;44743:1;44735:6;44731:14;44724:58;44816:12;44811:2;44803:6;44799:15;44792:37;44607:229;:::o;44842:222::-;44982:34;44978:1;44970:6;44966:14;44959:58;45051:5;45046:2;45038:6;45034:15;45027:30;44842:222;:::o;45070:224::-;45210:34;45206:1;45198:6;45194:14;45187:58;45279:7;45274:2;45266:6;45262:15;45255:32;45070:224;:::o;45300:162::-;45440:14;45436:1;45428:6;45424:14;45417:38;45300:162;:::o;45468:244::-;45608:34;45604:1;45596:6;45592:14;45585:58;45677:27;45672:2;45664:6;45660:15;45653:52;45468:244;:::o;45718:230::-;45858:34;45854:1;45846:6;45842:14;45835:58;45927:13;45922:2;45914:6;45910:15;45903:38;45718:230;:::o;45954:158::-;46094:10;46090:1;46082:6;46078:14;46071:34;45954:158;:::o;46118:225::-;46258:34;46254:1;46246:6;46242:14;46235:58;46327:8;46322:2;46314:6;46310:15;46303:33;46118:225;:::o;46349:182::-;46489:34;46485:1;46477:6;46473:14;46466:58;46349:182;:::o;46537:234::-;46677:34;46673:1;46665:6;46661:14;46654:58;46746:17;46741:2;46733:6;46729:15;46722:42;46537:234;:::o;46777:176::-;46917:28;46913:1;46905:6;46901:14;46894:52;46777:176;:::o;46959:237::-;47099:34;47095:1;47087:6;47083:14;47076:58;47168:20;47163:2;47155:6;47151:15;47144:45;46959:237;:::o;47202:173::-;47342:25;47338:1;47330:6;47326:14;47319:49;47202:173;:::o;47381:221::-;47521:34;47517:1;47509:6;47505:14;47498:58;47590:4;47585:2;47577:6;47573:15;47566:29;47381:221;:::o;47608:238::-;47748:34;47744:1;47736:6;47732:14;47725:58;47817:21;47812:2;47804:6;47800:15;47793:46;47608:238;:::o;47852:165::-;47992:17;47988:1;47980:6;47976:14;47969:41;47852:165;:::o;48023:179::-;48163:31;48159:1;48151:6;48147:14;48140:55;48023:179;:::o;48208:220::-;48348:34;48344:1;48336:6;48332:14;48325:58;48417:3;48412:2;48404:6;48400:15;48393:28;48208:220;:::o;48434:233::-;48574:34;48570:1;48562:6;48558:14;48551:58;48643:16;48638:2;48630:6;48626:15;48619:41;48434:233;:::o;48673:181::-;48813:33;48809:1;48801:6;48797:14;48790:57;48673:181;:::o;48860:234::-;49000:34;48996:1;48988:6;48984:14;48977:58;49069:17;49064:2;49056:6;49052:15;49045:42;48860:234;:::o;49100:172::-;49240:24;49236:1;49228:6;49224:14;49217:48;49100:172;:::o;49278:232::-;49418:34;49414:1;49406:6;49402:14;49395:58;49487:15;49482:2;49474:6;49470:15;49463:40;49278:232;:::o;49516:221::-;49656:34;49652:1;49644:6;49640:14;49633:58;49725:4;49720:2;49712:6;49708:15;49701:29;49516:221;:::o;49743:175::-;49883:27;49879:1;49871:6;49867:14;49860:51;49743:175;:::o;49924:122::-;49997:24;50015:5;49997:24;:::i;:::-;49990:5;49987:35;49977:63;;50036:1;50033;50026:12;49977:63;49924:122;:::o;50052:116::-;50122:21;50137:5;50122:21;:::i;:::-;50115:5;50112:32;50102:60;;50158:1;50155;50148:12;50102:60;50052:116;:::o;50174:120::-;50246:23;50263:5;50246:23;:::i;:::-;50239:5;50236:34;50226:62;;50284:1;50281;50274:12;50226:62;50174:120;:::o;50300:122::-;50373:24;50391:5;50373:24;:::i;:::-;50366:5;50363:35;50353:63;;50412:1;50409;50402:12;50353:63;50300:122;:::o

Swarm Source

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