ETH Price: $2,458.69 (-1.17%)

Token

INDULGENCES by beeple (IND)
 

Overview

Max Total Supply

221 IND

Holders

113

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 IND
0xe735367b7fbd1dad587e60d17ae35aa5f590af20
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:
INDULGENCES

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-10
*/

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: contracts/ERC721A.sol


// Creators: locationtba.eth, 2pmflow.eth

pragma solidity ^0.8.0;









/**
 * @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..).
 *
 * 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 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.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
  }

  /**
   * @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(totalSupply). 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:
   *
   * - `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 > currentIndex - 1) {
      endIndex = currentIndex - 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 {}
}
// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

// File: contracts/Indulgences.sol


pragma solidity ^0.8.0;



contract INDULGENCES is Ownable, ERC721A {

    // constants
    uint256 constant MAX_ELEMENTS = 2022;
    uint256 constant MAX_ELEMENTS_TX = 5;
    uint256 constant MAX_FREE_PER_TX = 1;
    uint256 constant PUBLIC_PRICE = 0.1 ether;

    string public baseTokenURI = "ipfs://Qme8i2FXbV2nPdaX9m82nJexZDRExM5MDPvrXU81zPPvyq/";

    constructor(uint256 maxBatchSize_) ERC721A("INDULGENCES by beeple", "IND", maxBatchSize_) {}

    function mint(uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(_mintAmount > 0,"No 0 mints");
        require(_mintAmount <= MAX_ELEMENTS_TX,"Exceeds max per tx");

        require(supply + _mintAmount <= MAX_ELEMENTS,"Exceeds max supply");
        require(msg.value >= (_mintAmount - MAX_FREE_PER_TX)* PUBLIC_PRICE,"Invalid funds provided");
        _safeMint(msg.sender,_mintAmount);
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60a0604052600060015560006008556040518060600160405280603681526020016200413860369139600990805190602001906200003f92919062000256565b503480156200004d57600080fd5b506040516200416e3803806200416e83398181016040528101906200007391906200031d565b6040518060400160405280601581526020017f494e44554c47454e43455320627920626565706c6500000000000000000000008152506040518060400160405280600381526020017f494e4400000000000000000000000000000000000000000000000000000000008152508262000100620000f46200018a60201b60201c565b6200019260201b60201c565b6000811162000146576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013d90620003b1565b60405180910390fd5b82600290805190602001906200015e92919062000256565b5081600390805190602001906200017792919062000256565b508060808181525050505050506200046d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026490620003ee565b90600052602060002090601f016020900481019282620002885760008555620002d4565b82601f10620002a357805160ff1916838001178555620002d4565b82800160010185558215620002d4579182015b82811115620002d3578251825591602001919060010190620002b6565b5b509050620002e39190620002e7565b5090565b5b8082111562000302576000816000905550600101620002e8565b5090565b600081519050620003178162000453565b92915050565b6000602082840312156200033057600080fd5b6000620003408482850162000306565b91505092915050565b600062000358602783620003d3565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620003cc8162000349565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200040757607f821691505b602082108114156200041e576200041d62000424565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200045e81620003e4565b81146200046a57600080fd5b50565b608051613ca16200049760003960008181611b9b01528181611bc401526122d00152613ca16000f3fe6080604052600436106101405760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610440578063c87b56dd14610469578063d547cfb7146104a6578063d7224ba0146104d1578063e985e9c5146104fc578063f2fde38b1461053957610140565b806370a0823114610351578063715018a61461038e5780638da5cb5b146103a557806395d89b41146103d0578063a0712d68146103fb578063a22cb4651461041757610140565b806323b872dd1161010857806323b872dd1461023e5780632f745c59146102675780633ccfd60b146102a457806342842e0e146102ae5780634f6ccce7146102d75780636352211e1461031457610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806318160ddd14610213575b600080fd5b34801561015157600080fd5b5061016c600480360381019061016791906129b3565b610562565b604051610179919061340f565b60405180910390f35b34801561018e57600080fd5b506101976106ac565b6040516101a4919061342a565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612a05565b61073e565b6040516101e191906133a8565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612977565b6107c3565b005b34801561021f57600080fd5b506102286108dc565b604051610235919061374c565b60405180910390f35b34801561024a57600080fd5b5061026560048036038101906102609190612871565b6108e6565b005b34801561027357600080fd5b5061028e60048036038101906102899190612977565b6108f6565b60405161029b919061374c565b60405180910390f35b6102ac610af4565b005b3480156102ba57600080fd5b506102d560048036038101906102d09190612871565b610bb0565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612a05565b610bd0565b60405161030b919061374c565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612a05565b610c23565b60405161034891906133a8565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061280c565b610c39565b604051610385919061374c565b60405180910390f35b34801561039a57600080fd5b506103a3610d22565b005b3480156103b157600080fd5b506103ba610daa565b6040516103c791906133a8565b60405180910390f35b3480156103dc57600080fd5b506103e5610dd3565b6040516103f2919061342a565b60405180910390f35b61041560048036038101906104109190612a05565b610e65565b005b34801561042357600080fd5b5061043e6004803603810190610439919061293b565b610fb8565b005b34801561044c57600080fd5b50610467600480360381019061046291906128c0565b611139565b005b34801561047557600080fd5b50610490600480360381019061048b9190612a05565b611195565b60405161049d919061342a565b60405180910390f35b3480156104b257600080fd5b506104bb61123c565b6040516104c8919061342a565b60405180910390f35b3480156104dd57600080fd5b506104e66112ca565b6040516104f3919061374c565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190612835565b6112d0565b604051610530919061340f565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061280c565b611364565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a557506106a48261145c565b5b9050919050565b6060600280546106bb90613a96565b80601f01602080910402602001604051908101604052809291908181526020018280546106e790613a96565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b6000610749826114c6565b610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077f9061370c565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ce82610c23565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561083f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108369061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661085e6114d4565b73ffffffffffffffffffffffffffffffffffffffff16148061088d575061088c816108876114d4565b6112d0565b5b6108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c39061352c565b60405180910390fd5b6108d78383836114dc565b505050565b6000600154905090565b6108f183838361158e565b505050565b600061090183610c39565b8210610942576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109399061344c565b60405180910390fd5b600061094c6108dc565b905060008060005b83811015610ab2576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610a4657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9e5786841415610a8f578195505050505050610aee565b8380610a9a90613ac8565b9450505b508080610aaa90613ac8565b915050610954565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906136cc565b60405180910390fd5b92915050565b610afc6114d4565b73ffffffffffffffffffffffffffffffffffffffff16610b1a610daa565b73ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b67906135ac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610bae57600080fd5b565b610bcb83838360405180602001604052806000815250611139565b505050565b6000610bda6108dc565b8210610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c12906134ec565b60405180910390fd5b819050919050565b6000610c2e82611b47565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca19061356c565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610d2a6114d4565b73ffffffffffffffffffffffffffffffffffffffff16610d48610daa565b73ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906135ac565b60405180910390fd5b610da86000611d4a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610de290613a96565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90613a96565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000610e6f6108dc565b905060008211610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab906134ac565b60405180910390fd5b6005821115610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906134cc565b60405180910390fd5b6107e68282610f079190613851565b1115610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f9061354c565b60405180910390fd5b67016345785d8a0000600183610f5e9190613966565b610f6891906138d8565b341015610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa19061362c565b60405180910390fd5b610fb43383611e0e565b5050565b610fc06114d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561102e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611025906135ec565b60405180910390fd5b806007600061103b6114d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110e86114d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161112d919061340f565b60405180910390a35050565b61114484848461158e565b61115084848484611e2c565b61118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061366c565b60405180910390fd5b50505050565b60606111a0826114c6565b6111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d6906135cc565b60405180910390fd5b60006111e9611fc3565b905060008151116112095760405180602001604052806000815250611234565b8061121384612055565b604051602001611224929190613384565b6040516020818303038152906040525b915050919050565b6009805461124990613a96565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613a96565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b505050505081565b60085481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136c6114d4565b73ffffffffffffffffffffffffffffffffffffffff1661138a610daa565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906135ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061346c565b60405180910390fd5b61145981611d4a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061159982611b47565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166115c06114d4565b73ffffffffffffffffffffffffffffffffffffffff16148061161c57506115e56114d4565b73ffffffffffffffffffffffffffffffffffffffff166116048461073e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611638575061163782600001516116326114d4565b6112d0565b5b90508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061360c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e39061358c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561175c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117539061350c565b60405180910390fd5b6117698585856001612202565b61177960008484600001516114dc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166117e79190613932565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661188b919061380b565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846119919190613851565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ad757611a07816114c6565b15611ad6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b3f8686866001612208565b505050505050565b611b4f612701565b611b58826114c6565b611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e9061348c565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310611bfb5760017f000000000000000000000000000000000000000000000000000000000000000084611bee9190613966565b611bf89190613851565b90505b60008390505b818110611d09576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cf557809350505050611d45565b508080611d0190613a6c565b915050611c01565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c906136ec565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e2882826040518060200160405280600081525061220e565b5050565b6000611e4d8473ffffffffffffffffffffffffffffffffffffffff166126ee565b15611fb6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e766114d4565b8786866040518563ffffffff1660e01b8152600401611e9894939291906133c3565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee357506040513d601f19601f82011682018060405250810190611ee091906129dc565b60015b611f66573d8060008114611f13576040519150601f19603f3d011682016040523d82523d6000602084013e611f18565b606091505b50600081511415611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f559061366c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fbb565b600190505b949350505050565b606060098054611fd290613a96565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffe90613a96565b801561204b5780601f106120205761010080835404028352916020019161204b565b820191906000526020600020905b81548152906001019060200180831161202e57829003601f168201915b5050505050905090565b6060600082141561209d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121fd565b600082905060005b600082146120cf5780806120b890613ac8565b915050600a826120c891906138a7565b91506120a5565b60008167ffffffffffffffff811115612111577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121435781602001600182028036833780820191505090505b5090505b600085146121f65760018261215c9190613966565b9150600a8561216b9190613b11565b60306121779190613851565b60f81b8183815181106121b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121ef91906138a7565b9450612147565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c906136ac565b60405180910390fd5b61228e816114c6565b156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c59061368c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123289061372c565b60405180910390fd5b61233e6000858386612202565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161243b919061380b565b6fffffffffffffffffffffffffffffffff168152602001858360200151612462919061380b565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156126d157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126716000888488611e2c565b6126b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a79061366c565b60405180910390fd5b81806126bb90613ac8565b92505080806126c990613ac8565b915050612600565b50806001819055506126e66000878588612208565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600061274e61274984613798565b613767565b90508281526020810184848401111561276657600080fd5b612771848285613a2a565b509392505050565b60008135905061278881613c0f565b92915050565b60008135905061279d81613c26565b92915050565b6000813590506127b281613c3d565b92915050565b6000815190506127c781613c3d565b92915050565b600082601f8301126127de57600080fd5b81356127ee84826020860161273b565b91505092915050565b60008135905061280681613c54565b92915050565b60006020828403121561281e57600080fd5b600061282c84828501612779565b91505092915050565b6000806040838503121561284857600080fd5b600061285685828601612779565b925050602061286785828601612779565b9150509250929050565b60008060006060848603121561288657600080fd5b600061289486828701612779565b93505060206128a586828701612779565b92505060406128b6868287016127f7565b9150509250925092565b600080600080608085870312156128d657600080fd5b60006128e487828801612779565b94505060206128f587828801612779565b9350506040612906878288016127f7565b925050606085013567ffffffffffffffff81111561292357600080fd5b61292f878288016127cd565b91505092959194509250565b6000806040838503121561294e57600080fd5b600061295c85828601612779565b925050602061296d8582860161278e565b9150509250929050565b6000806040838503121561298a57600080fd5b600061299885828601612779565b92505060206129a9858286016127f7565b9150509250929050565b6000602082840312156129c557600080fd5b60006129d3848285016127a3565b91505092915050565b6000602082840312156129ee57600080fd5b60006129fc848285016127b8565b91505092915050565b600060208284031215612a1757600080fd5b6000612a25848285016127f7565b91505092915050565b612a378161399a565b82525050565b612a46816139ac565b82525050565b6000612a57826137c8565b612a6181856137de565b9350612a71818560208601613a39565b612a7a81613bfe565b840191505092915050565b6000612a90826137d3565b612a9a81856137ef565b9350612aaa818560208601613a39565b612ab381613bfe565b840191505092915050565b6000612ac9826137d3565b612ad38185613800565b9350612ae3818560208601613a39565b80840191505092915050565b6000612afc6022836137ef565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b626026836137ef565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bc8602a836137ef565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c2e600a836137ef565b91507f4e6f2030206d696e7473000000000000000000000000000000000000000000006000830152602082019050919050565b6000612c6e6012836137ef565b91507f45786365656473206d61782070657220747800000000000000000000000000006000830152602082019050919050565b6000612cae6023836137ef565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d146025836137ef565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d7a6039836137ef565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000612de06012836137ef565b91507f45786365656473206d617820737570706c7900000000000000000000000000006000830152602082019050919050565b6000612e20602b836137ef565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e866026836137ef565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612eec6020836137ef565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612f2c602f836137ef565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612f92601a836137ef565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000612fd26032836137ef565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006130386016836137ef565b91507f496e76616c69642066756e64732070726f7669646564000000000000000000006000830152602082019050919050565b60006130786022836137ef565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130de6033836137ef565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613144601d836137ef565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006131846021836137ef565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131ea602e836137ef565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613250602f836137ef565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132b6602d836137ef565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b600061331c6022836137ef565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61337e81613a20565b82525050565b60006133908285612abe565b915061339c8284612abe565b91508190509392505050565b60006020820190506133bd6000830184612a2e565b92915050565b60006080820190506133d86000830187612a2e565b6133e56020830186612a2e565b6133f26040830185613375565b81810360608301526134048184612a4c565b905095945050505050565b60006020820190506134246000830184612a3d565b92915050565b600060208201905081810360008301526134448184612a85565b905092915050565b6000602082019050818103600083015261346581612aef565b9050919050565b6000602082019050818103600083015261348581612b55565b9050919050565b600060208201905081810360008301526134a581612bbb565b9050919050565b600060208201905081810360008301526134c581612c21565b9050919050565b600060208201905081810360008301526134e581612c61565b9050919050565b6000602082019050818103600083015261350581612ca1565b9050919050565b6000602082019050818103600083015261352581612d07565b9050919050565b6000602082019050818103600083015261354581612d6d565b9050919050565b6000602082019050818103600083015261356581612dd3565b9050919050565b6000602082019050818103600083015261358581612e13565b9050919050565b600060208201905081810360008301526135a581612e79565b9050919050565b600060208201905081810360008301526135c581612edf565b9050919050565b600060208201905081810360008301526135e581612f1f565b9050919050565b6000602082019050818103600083015261360581612f85565b9050919050565b6000602082019050818103600083015261362581612fc5565b9050919050565b600060208201905081810360008301526136458161302b565b9050919050565b600060208201905081810360008301526136658161306b565b9050919050565b60006020820190508181036000830152613685816130d1565b9050919050565b600060208201905081810360008301526136a581613137565b9050919050565b600060208201905081810360008301526136c581613177565b9050919050565b600060208201905081810360008301526136e5816131dd565b9050919050565b6000602082019050818103600083015261370581613243565b9050919050565b60006020820190508181036000830152613725816132a9565b9050919050565b600060208201905081810360008301526137458161330f565b9050919050565b60006020820190506137616000830184613375565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561378e5761378d613bcf565b5b8060405250919050565b600067ffffffffffffffff8211156137b3576137b2613bcf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613816826139e4565b9150613821836139e4565b9250826fffffffffffffffffffffffffffffffff0382111561384657613845613b42565b5b828201905092915050565b600061385c82613a20565b915061386783613a20565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561389c5761389b613b42565b5b828201905092915050565b60006138b282613a20565b91506138bd83613a20565b9250826138cd576138cc613b71565b5b828204905092915050565b60006138e382613a20565b91506138ee83613a20565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392757613926613b42565b5b828202905092915050565b600061393d826139e4565b9150613948836139e4565b92508282101561395b5761395a613b42565b5b828203905092915050565b600061397182613a20565b915061397c83613a20565b92508282101561398f5761398e613b42565b5b828203905092915050565b60006139a582613a00565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a57578082015181840152602081019050613a3c565b83811115613a66576000848401525b50505050565b6000613a7782613a20565b91506000821415613a8b57613a8a613b42565b5b600182039050919050565b60006002820490506001821680613aae57607f821691505b60208210811415613ac257613ac1613ba0565b5b50919050565b6000613ad382613a20565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0657613b05613b42565b5b600182019050919050565b6000613b1c82613a20565b9150613b2783613a20565b925082613b3757613b36613b71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c188161399a565b8114613c2357600080fd5b50565b613c2f816139ac565b8114613c3a57600080fd5b50565b613c46816139b8565b8114613c5157600080fd5b50565b613c5d81613a20565b8114613c6857600080fd5b5056fea2646970667358221220c36310c412b667e65c43d33107390d80b873c10431db7b63ebc0dfae7844510a64736f6c63430008000033697066733a2f2f516d6538693246586256326e50646158396d38326e4a65785a445245784d354d44507672585538317a50507679712f0000000000000000000000000000000000000000000000000000000000000005

Deployed Bytecode

0x6080604052600436106101405760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610440578063c87b56dd14610469578063d547cfb7146104a6578063d7224ba0146104d1578063e985e9c5146104fc578063f2fde38b1461053957610140565b806370a0823114610351578063715018a61461038e5780638da5cb5b146103a557806395d89b41146103d0578063a0712d68146103fb578063a22cb4651461041757610140565b806323b872dd1161010857806323b872dd1461023e5780632f745c59146102675780633ccfd60b146102a457806342842e0e146102ae5780634f6ccce7146102d75780636352211e1461031457610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806318160ddd14610213575b600080fd5b34801561015157600080fd5b5061016c600480360381019061016791906129b3565b610562565b604051610179919061340f565b60405180910390f35b34801561018e57600080fd5b506101976106ac565b6040516101a4919061342a565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612a05565b61073e565b6040516101e191906133a8565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612977565b6107c3565b005b34801561021f57600080fd5b506102286108dc565b604051610235919061374c565b60405180910390f35b34801561024a57600080fd5b5061026560048036038101906102609190612871565b6108e6565b005b34801561027357600080fd5b5061028e60048036038101906102899190612977565b6108f6565b60405161029b919061374c565b60405180910390f35b6102ac610af4565b005b3480156102ba57600080fd5b506102d560048036038101906102d09190612871565b610bb0565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612a05565b610bd0565b60405161030b919061374c565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612a05565b610c23565b60405161034891906133a8565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061280c565b610c39565b604051610385919061374c565b60405180910390f35b34801561039a57600080fd5b506103a3610d22565b005b3480156103b157600080fd5b506103ba610daa565b6040516103c791906133a8565b60405180910390f35b3480156103dc57600080fd5b506103e5610dd3565b6040516103f2919061342a565b60405180910390f35b61041560048036038101906104109190612a05565b610e65565b005b34801561042357600080fd5b5061043e6004803603810190610439919061293b565b610fb8565b005b34801561044c57600080fd5b50610467600480360381019061046291906128c0565b611139565b005b34801561047557600080fd5b50610490600480360381019061048b9190612a05565b611195565b60405161049d919061342a565b60405180910390f35b3480156104b257600080fd5b506104bb61123c565b6040516104c8919061342a565b60405180910390f35b3480156104dd57600080fd5b506104e66112ca565b6040516104f3919061374c565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190612835565b6112d0565b604051610530919061340f565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b919061280c565b611364565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a557506106a48261145c565b5b9050919050565b6060600280546106bb90613a96565b80601f01602080910402602001604051908101604052809291908181526020018280546106e790613a96565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b6000610749826114c6565b610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077f9061370c565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ce82610c23565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561083f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108369061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661085e6114d4565b73ffffffffffffffffffffffffffffffffffffffff16148061088d575061088c816108876114d4565b6112d0565b5b6108cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c39061352c565b60405180910390fd5b6108d78383836114dc565b505050565b6000600154905090565b6108f183838361158e565b505050565b600061090183610c39565b8210610942576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109399061344c565b60405180910390fd5b600061094c6108dc565b905060008060005b83811015610ab2576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610a4657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9e5786841415610a8f578195505050505050610aee565b8380610a9a90613ac8565b9450505b508080610aaa90613ac8565b915050610954565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906136cc565b60405180910390fd5b92915050565b610afc6114d4565b73ffffffffffffffffffffffffffffffffffffffff16610b1a610daa565b73ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b67906135ac565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610bae57600080fd5b565b610bcb83838360405180602001604052806000815250611139565b505050565b6000610bda6108dc565b8210610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c12906134ec565b60405180910390fd5b819050919050565b6000610c2e82611b47565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca19061356c565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610d2a6114d4565b73ffffffffffffffffffffffffffffffffffffffff16610d48610daa565b73ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906135ac565b60405180910390fd5b610da86000611d4a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610de290613a96565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0e90613a96565b8015610e5b5780601f10610e3057610100808354040283529160200191610e5b565b820191906000526020600020905b815481529060010190602001808311610e3e57829003601f168201915b5050505050905090565b6000610e6f6108dc565b905060008211610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab906134ac565b60405180910390fd5b6005821115610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef906134cc565b60405180910390fd5b6107e68282610f079190613851565b1115610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f9061354c565b60405180910390fd5b67016345785d8a0000600183610f5e9190613966565b610f6891906138d8565b341015610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa19061362c565b60405180910390fd5b610fb43383611e0e565b5050565b610fc06114d4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561102e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611025906135ec565b60405180910390fd5b806007600061103b6114d4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110e86114d4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161112d919061340f565b60405180910390a35050565b61114484848461158e565b61115084848484611e2c565b61118f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111869061366c565b60405180910390fd5b50505050565b60606111a0826114c6565b6111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d6906135cc565b60405180910390fd5b60006111e9611fc3565b905060008151116112095760405180602001604052806000815250611234565b8061121384612055565b604051602001611224929190613384565b6040516020818303038152906040525b915050919050565b6009805461124990613a96565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613a96565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b505050505081565b60085481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61136c6114d4565b73ffffffffffffffffffffffffffffffffffffffff1661138a610daa565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906135ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061346c565b60405180910390fd5b61145981611d4a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061159982611b47565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166115c06114d4565b73ffffffffffffffffffffffffffffffffffffffff16148061161c57506115e56114d4565b73ffffffffffffffffffffffffffffffffffffffff166116048461073e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611638575061163782600001516116326114d4565b6112d0565b5b90508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061360c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e39061358c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561175c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117539061350c565b60405180910390fd5b6117698585856001612202565b61177960008484600001516114dc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166117e79190613932565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661188b919061380b565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846119919190613851565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ad757611a07816114c6565b15611ad6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b3f8686866001612208565b505050505050565b611b4f612701565b611b58826114c6565b611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e9061348c565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000058310611bfb5760017f000000000000000000000000000000000000000000000000000000000000000584611bee9190613966565b611bf89190613851565b90505b60008390505b818110611d09576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cf557809350505050611d45565b508080611d0190613a6c565b915050611c01565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c906136ec565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e2882826040518060200160405280600081525061220e565b5050565b6000611e4d8473ffffffffffffffffffffffffffffffffffffffff166126ee565b15611fb6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e766114d4565b8786866040518563ffffffff1660e01b8152600401611e9894939291906133c3565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee357506040513d601f19601f82011682018060405250810190611ee091906129dc565b60015b611f66573d8060008114611f13576040519150601f19603f3d011682016040523d82523d6000602084013e611f18565b606091505b50600081511415611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f559061366c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fbb565b600190505b949350505050565b606060098054611fd290613a96565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffe90613a96565b801561204b5780601f106120205761010080835404028352916020019161204b565b820191906000526020600020905b81548152906001019060200180831161202e57829003601f168201915b5050505050905090565b6060600082141561209d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121fd565b600082905060005b600082146120cf5780806120b890613ac8565b915050600a826120c891906138a7565b91506120a5565b60008167ffffffffffffffff811115612111577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121435781602001600182028036833780820191505090505b5090505b600085146121f65760018261215c9190613966565b9150600a8561216b9190613b11565b60306121779190613851565b60f81b8183815181106121b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121ef91906138a7565b9450612147565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c906136ac565b60405180910390fd5b61228e816114c6565b156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c59061368c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000005831115612331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123289061372c565b60405180910390fd5b61233e6000858386612202565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161243b919061380b565b6fffffffffffffffffffffffffffffffff168152602001858360200151612462919061380b565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156126d157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126716000888488611e2c565b6126b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a79061366c565b60405180910390fd5b81806126bb90613ac8565b92505080806126c990613ac8565b915050612600565b50806001819055506126e66000878588612208565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600061274e61274984613798565b613767565b90508281526020810184848401111561276657600080fd5b612771848285613a2a565b509392505050565b60008135905061278881613c0f565b92915050565b60008135905061279d81613c26565b92915050565b6000813590506127b281613c3d565b92915050565b6000815190506127c781613c3d565b92915050565b600082601f8301126127de57600080fd5b81356127ee84826020860161273b565b91505092915050565b60008135905061280681613c54565b92915050565b60006020828403121561281e57600080fd5b600061282c84828501612779565b91505092915050565b6000806040838503121561284857600080fd5b600061285685828601612779565b925050602061286785828601612779565b9150509250929050565b60008060006060848603121561288657600080fd5b600061289486828701612779565b93505060206128a586828701612779565b92505060406128b6868287016127f7565b9150509250925092565b600080600080608085870312156128d657600080fd5b60006128e487828801612779565b94505060206128f587828801612779565b9350506040612906878288016127f7565b925050606085013567ffffffffffffffff81111561292357600080fd5b61292f878288016127cd565b91505092959194509250565b6000806040838503121561294e57600080fd5b600061295c85828601612779565b925050602061296d8582860161278e565b9150509250929050565b6000806040838503121561298a57600080fd5b600061299885828601612779565b92505060206129a9858286016127f7565b9150509250929050565b6000602082840312156129c557600080fd5b60006129d3848285016127a3565b91505092915050565b6000602082840312156129ee57600080fd5b60006129fc848285016127b8565b91505092915050565b600060208284031215612a1757600080fd5b6000612a25848285016127f7565b91505092915050565b612a378161399a565b82525050565b612a46816139ac565b82525050565b6000612a57826137c8565b612a6181856137de565b9350612a71818560208601613a39565b612a7a81613bfe565b840191505092915050565b6000612a90826137d3565b612a9a81856137ef565b9350612aaa818560208601613a39565b612ab381613bfe565b840191505092915050565b6000612ac9826137d3565b612ad38185613800565b9350612ae3818560208601613a39565b80840191505092915050565b6000612afc6022836137ef565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b626026836137ef565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612bc8602a836137ef565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c2e600a836137ef565b91507f4e6f2030206d696e7473000000000000000000000000000000000000000000006000830152602082019050919050565b6000612c6e6012836137ef565b91507f45786365656473206d61782070657220747800000000000000000000000000006000830152602082019050919050565b6000612cae6023836137ef565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d146025836137ef565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d7a6039836137ef565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000612de06012836137ef565b91507f45786365656473206d617820737570706c7900000000000000000000000000006000830152602082019050919050565b6000612e20602b836137ef565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e866026836137ef565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612eec6020836137ef565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612f2c602f836137ef565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612f92601a836137ef565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000612fd26032836137ef565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006130386016836137ef565b91507f496e76616c69642066756e64732070726f7669646564000000000000000000006000830152602082019050919050565b60006130786022836137ef565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130de6033836137ef565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613144601d836137ef565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006131846021836137ef565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131ea602e836137ef565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613250602f836137ef565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132b6602d836137ef565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b600061331c6022836137ef565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61337e81613a20565b82525050565b60006133908285612abe565b915061339c8284612abe565b91508190509392505050565b60006020820190506133bd6000830184612a2e565b92915050565b60006080820190506133d86000830187612a2e565b6133e56020830186612a2e565b6133f26040830185613375565b81810360608301526134048184612a4c565b905095945050505050565b60006020820190506134246000830184612a3d565b92915050565b600060208201905081810360008301526134448184612a85565b905092915050565b6000602082019050818103600083015261346581612aef565b9050919050565b6000602082019050818103600083015261348581612b55565b9050919050565b600060208201905081810360008301526134a581612bbb565b9050919050565b600060208201905081810360008301526134c581612c21565b9050919050565b600060208201905081810360008301526134e581612c61565b9050919050565b6000602082019050818103600083015261350581612ca1565b9050919050565b6000602082019050818103600083015261352581612d07565b9050919050565b6000602082019050818103600083015261354581612d6d565b9050919050565b6000602082019050818103600083015261356581612dd3565b9050919050565b6000602082019050818103600083015261358581612e13565b9050919050565b600060208201905081810360008301526135a581612e79565b9050919050565b600060208201905081810360008301526135c581612edf565b9050919050565b600060208201905081810360008301526135e581612f1f565b9050919050565b6000602082019050818103600083015261360581612f85565b9050919050565b6000602082019050818103600083015261362581612fc5565b9050919050565b600060208201905081810360008301526136458161302b565b9050919050565b600060208201905081810360008301526136658161306b565b9050919050565b60006020820190508181036000830152613685816130d1565b9050919050565b600060208201905081810360008301526136a581613137565b9050919050565b600060208201905081810360008301526136c581613177565b9050919050565b600060208201905081810360008301526136e5816131dd565b9050919050565b6000602082019050818103600083015261370581613243565b9050919050565b60006020820190508181036000830152613725816132a9565b9050919050565b600060208201905081810360008301526137458161330f565b9050919050565b60006020820190506137616000830184613375565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561378e5761378d613bcf565b5b8060405250919050565b600067ffffffffffffffff8211156137b3576137b2613bcf565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613816826139e4565b9150613821836139e4565b9250826fffffffffffffffffffffffffffffffff0382111561384657613845613b42565b5b828201905092915050565b600061385c82613a20565b915061386783613a20565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561389c5761389b613b42565b5b828201905092915050565b60006138b282613a20565b91506138bd83613a20565b9250826138cd576138cc613b71565b5b828204905092915050565b60006138e382613a20565b91506138ee83613a20565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561392757613926613b42565b5b828202905092915050565b600061393d826139e4565b9150613948836139e4565b92508282101561395b5761395a613b42565b5b828203905092915050565b600061397182613a20565b915061397c83613a20565b92508282101561398f5761398e613b42565b5b828203905092915050565b60006139a582613a00565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a57578082015181840152602081019050613a3c565b83811115613a66576000848401525b50505050565b6000613a7782613a20565b91506000821415613a8b57613a8a613b42565b5b600182039050919050565b60006002820490506001821680613aae57607f821691505b60208210811415613ac257613ac1613ba0565b5b50919050565b6000613ad382613a20565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0657613b05613b42565b5b600182019050919050565b6000613b1c82613a20565b9150613b2783613a20565b925082613b3757613b36613b71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c188161399a565b8114613c2357600080fd5b50565b613c2f816139ac565b8114613c3a57600080fd5b50565b613c46816139b8565b8114613c5157600080fd5b50565b613c5d81613a20565b8114613c6857600080fd5b5056fea2646970667358221220c36310c412b667e65c43d33107390d80b873c10431db7b63ebc0dfae7844510a64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000005

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 5

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


Deployed Bytecode Sourcemap

38271:1139:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23708:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25434:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26959:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26522:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22272:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27809:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22900:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39164:120;;;:::i;:::-;;28014:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22435:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25257:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24134:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37571:94;;;;;;;;;;;;;:::i;:::-;;36920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25589:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38712:444;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27227:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28234:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25750:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38518:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32565:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27564:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37820:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23708:370;23835:4;23880:25;23865:40;;;:11;:40;;;;:99;;;;23931:33;23916:48;;;:11;:48;;;;23865:99;:160;;;;23990:35;23975:50;;;:11;:50;;;;23865:160;:207;;;;24036:36;24060:11;24036:23;:36::i;:::-;23865:207;23851:221;;23708:370;;;:::o;25434:94::-;25488:13;25517:5;25510:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25434:94;:::o;26959:204::-;27027:7;27051:16;27059:7;27051;:16::i;:::-;27043:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27133:15;:24;27149:7;27133:24;;;;;;;;;;;;;;;;;;;;;27126:31;;26959:204;;;:::o;26522:379::-;26591:13;26607:24;26623:7;26607:15;:24::i;:::-;26591:40;;26652:5;26646:11;;:2;:11;;;;26638:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26737:5;26721:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26746:37;26763:5;26770:12;:10;:12::i;:::-;26746:16;:37::i;:::-;26721:62;26705:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;26867:28;26876:2;26880:7;26889:5;26867:8;:28::i;:::-;26522:379;;;:::o;22272:94::-;22325:7;22348:12;;22341:19;;22272:94;:::o;27809:142::-;27917:28;27927:4;27933:2;27937:7;27917:9;:28::i;:::-;27809:142;;;:::o;22900:744::-;23009:7;23044:16;23054:5;23044:9;:16::i;:::-;23036:5;:24;23028:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23106:22;23131:13;:11;:13::i;:::-;23106:38;;23151:19;23181:25;23231:9;23226:350;23250:14;23246:1;:18;23226:350;;;23280:31;23314:11;:14;23326:1;23314:14;;;;;;;;;;;23280:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23367:1;23341:28;;:9;:14;;;:28;;;23337:89;;23402:9;:14;;;23382:34;;23337:89;23459:5;23438:26;;:17;:26;;;23434:135;;;23496:5;23481:11;:20;23477:59;;;23523:1;23516:8;;;;;;;;;23477:59;23546:13;;;;;:::i;:::-;;;;23434:135;23226:350;23266:3;;;;;:::i;:::-;;;;23226:350;;;;23582:56;;;;;;;;;;:::i;:::-;;;;;;;;22900:744;;;;;:::o;39164:120::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39236:10:::1;39228:24;;:47;39253:21;39228:47;;;;;;;;;;;;;;;;;;;;;;;39220:56;;;::::0;::::1;;39164:120::o:0;28014:157::-;28126:39;28143:4;28149:2;28153:7;28126:39;;;;;;;;;;;;:16;:39::i;:::-;28014:157;;;:::o;22435:177::-;22502:7;22534:13;:11;:13::i;:::-;22526:5;:21;22518:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22601:5;22594:12;;22435:177;;;:::o;25257:118::-;25321:7;25344:20;25356:7;25344:11;:20::i;:::-;:25;;;25337:32;;25257:118;;;:::o;24134:211::-;24198:7;24239:1;24222:19;;:5;:19;;;;24214:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24311:12;:19;24324:5;24311:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24303:36;;24296:43;;24134:211;;;:::o;37571:94::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37636:21:::1;37654:1;37636:9;:21::i;:::-;37571:94::o:0;36920:87::-;36966:7;36993:6;;;;;;;;;;;36986:13;;36920:87;:::o;25589:98::-;25645:13;25674:7;25667:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25589:98;:::o;38712:444::-;38773:14;38790:13;:11;:13::i;:::-;38773:30;;38836:1;38822:11;:15;38814:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;38417:1;38870:11;:30;;38862:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38371:4;38952:11;38943:6;:20;;;;:::i;:::-;:36;;38935:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38500:9;38460:1;39034:11;:29;;;;:::i;:::-;39033:45;;;;:::i;:::-;39020:9;:58;;39012:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;39115:33;39125:10;39136:11;39115:9;:33::i;:::-;38712:444;;:::o;27227:274::-;27330:12;:10;:12::i;:::-;27318:24;;:8;:24;;;;27310:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27427:8;27382:18;:32;27401:12;:10;:12::i;:::-;27382:32;;;;;;;;;;;;;;;:42;27415:8;27382:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27476:8;27447:48;;27462:12;:10;:12::i;:::-;27447:48;;;27486:8;27447:48;;;;;;:::i;:::-;;;;;;;;27227:274;;:::o;28234:311::-;28371:28;28381:4;28387:2;28391:7;28371:9;:28::i;:::-;28422:48;28445:4;28451:2;28455:7;28464:5;28422:22;:48::i;:::-;28406:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;28234:311;;;;:::o;25750:394::-;25848:13;25889:16;25897:7;25889;:16::i;:::-;25873:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;25979:21;26003:10;:8;:10::i;:::-;25979:34;;26058:1;26040:7;26034:21;:25;:104;;;;;;;;;;;;;;;;;26095:7;26104:18;:7;:16;:18::i;:::-;26078:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26034:104;26020:118;;;25750:394;;;:::o;38518:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32565:43::-;;;;:::o;27564:186::-;27686:4;27709:18;:25;27728:5;27709:25;;;;;;;;;;;;;;;:35;27735:8;27709:35;;;;;;;;;;;;;;;;;;;;;;;;;27702:42;;27564:186;;;;:::o;37820:192::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37929:1:::1;37909:22;;:8;:22;;;;37901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37985:19;37995:8;37985:9;:19::i;:::-;37820:192:::0;:::o;12776:157::-;12861:4;12900:25;12885:40;;;:11;:40;;;;12878:47;;12776:157;;;:::o;28784:105::-;28841:4;28871:12;;28861:7;:22;28854:29;;28784:105;;;:::o;20090:98::-;20143:7;20170:10;20163:17;;20090:98;:::o;32387:172::-;32511:2;32484:15;:24;32500:7;32484:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32545:7;32541:2;32525:28;;32534:5;32525:28;;;;;;;;;;;;32387:172;;;:::o;30752:1529::-;30849:35;30887:20;30899:7;30887:11;:20::i;:::-;30849:58;;30916:22;30958:13;:18;;;30942:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;31011:12;:10;:12::i;:::-;30987:36;;:20;30999:7;30987:11;:20::i;:::-;:36;;;30942:81;:142;;;;31034:50;31051:13;:18;;;31071:12;:10;:12::i;:::-;31034:16;:50::i;:::-;30942:142;30916:169;;31110:17;31094:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;31242:4;31220:26;;:13;:18;;;:26;;;31204:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;31331:1;31317:16;;:2;:16;;;;31309:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31384:43;31406:4;31412:2;31416:7;31425:1;31384:21;:43::i;:::-;31484:49;31501:1;31505:7;31514:13;:18;;;31484:8;:49::i;:::-;31572:1;31542:12;:18;31555:4;31542:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31608:1;31580:12;:16;31593:2;31580:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31639:43;;;;;;;;31654:2;31639:43;;;;;;31665:15;31639:43;;;;;31616:11;:20;31628:7;31616:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31910:19;31942:1;31932:7;:11;;;;:::i;:::-;31910:33;;31995:1;31954:43;;:11;:24;31966:11;31954:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;31950:236;;;32012:20;32020:11;32012:7;:20::i;:::-;32008:171;;;32072:97;;;;;;;;32099:13;:18;;;32072:97;;;;;;32130:13;:28;;;32072:97;;;;;32045:11;:24;32057:11;32045:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32008:171;31950:236;32218:7;32214:2;32199:27;;32208:4;32199:27;;;;;;;;;;;;32233:42;32254:4;32260:2;32264:7;32273:1;32233:20;:42::i;:::-;30752:1529;;;;;;:::o;24597:606::-;24673:21;;:::i;:::-;24714:16;24722:7;24714;:16::i;:::-;24706:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24786:26;24834:12;24823:7;:23;24819:93;;24903:1;24888:12;24878:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;24857:47;;24819:93;24925:12;24940:7;24925:22;;24920:212;24957:18;24949:4;:26;24920:212;;24994:31;25028:11;:17;25040:4;25028:17;;;;;;;;;;;24994:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25084:1;25058:28;;:9;:14;;;:28;;;25054:71;;25106:9;25099:16;;;;;;;25054:71;24920:212;24977:6;;;;;:::i;:::-;;;;24920:212;;;;25140:57;;;;;;;;;;:::i;:::-;;;;;;;;24597:606;;;;:::o;38020:173::-;38076:16;38095:6;;;;;;;;;;;38076:25;;38121:8;38112:6;;:17;;;;;;;;;;;;;;;;;;38176:8;38145:40;;38166:8;38145:40;;;;;;;;;;;;38020:173;;:::o;28895:98::-;28960:27;28970:2;28974:8;28960:27;;;;;;;;;;;;:9;:27::i;:::-;28895:98;;:::o;34098:690::-;34235:4;34252:15;:2;:13;;;:15::i;:::-;34248:535;;;34307:2;34291:36;;;34328:12;:10;:12::i;:::-;34342:4;34348:7;34357:5;34291:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34278:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34539:1;34522:6;:13;:18;34518:215;;;34555:61;;;;;;;;;;:::i;:::-;;;;;;;;34518:215;34701:6;34695:13;34686:6;34682:2;34678:15;34671:38;34278:464;34423:45;;;34413:55;;;:6;:55;;;;34406:62;;;;;34248:535;34771:4;34764:11;;34098:690;;;;;;;:::o;39292:113::-;39352:13;39385:12;39378:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39292:113;:::o;311:723::-;367:13;597:1;588:5;:10;584:53;;;615:10;;;;;;;;;;;;;;;;;;;;;584:53;647:12;662:5;647:20;;678:14;703:78;718:1;710:4;:9;703:78;;736:8;;;;;:::i;:::-;;;;767:2;759:10;;;;;:::i;:::-;;;703:78;;;791:19;823:6;813:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:39;;841:154;857:1;848:5;:10;841:154;;885:1;875:11;;;;;:::i;:::-;;;952:2;944:5;:10;;;;:::i;:::-;931:2;:24;;;;:::i;:::-;918:39;;901:6;908;901:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;841:154;;;1019:6;1005:21;;;;;311:723;;;;:::o;35250:141::-;;;;;:::o;35777:140::-;;;;;:::o;29248:1272::-;29353:20;29376:12;;29353:35;;29417:1;29403:16;;:2;:16;;;;29395:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29594:21;29602:12;29594:7;:21::i;:::-;29593:22;29585:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;29676:12;29664:8;:24;;29656:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29736:61;29766:1;29770:2;29774:12;29788:8;29736:21;:61::i;:::-;29806:30;29839:12;:16;29852:2;29839:16;;;;;;;;;;;;;;;29806:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29881:119;;;;;;;;29931:8;29901:11;:19;;;:39;;;;:::i;:::-;29881:119;;;;;;29984:8;29949:11;:24;;;:44;;;;:::i;:::-;29881:119;;;;;29862:12;:16;29875:2;29862:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30035:43;;;;;;;;30050:2;30035:43;;;;;;30061:15;30035:43;;;;;30007:11;:25;30019:12;30007:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30087:20;30110:12;30087:35;;30136:9;30131:281;30155:8;30151:1;:12;30131:281;;;30209:12;30205:2;30184:38;;30201:1;30184:38;;;;;;;;;;;;30249:59;30280:1;30284:2;30288:12;30302:5;30249:22;:59::i;:::-;30231:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;30390:14;;;;;:::i;:::-;;;;30165:3;;;;;:::i;:::-;;;;30131:281;;;;30435:12;30420;:27;;;;30454:60;30483:1;30487:2;30491:12;30505:8;30454:20;:60::i;:::-;29248:1272;;;;;;:::o;2836:387::-;2896:4;3104:12;3171:7;3159:20;3151:28;;3214:1;3207:4;:8;3200:15;;;2836:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:366::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:34;6674:1;6669:3;6665:11;6658:55;6744:4;6739:2;6734:3;6730:12;6723:26;6775:2;6770:3;6766:12;6759:19;;6564:220;;;:::o;6790:370::-;;6953:67;7017:2;7012:3;6953:67;:::i;:::-;6946:74;;7050:34;7046:1;7041:3;7037:11;7030:55;7116:8;7111:2;7106:3;7102:12;7095:30;7151:2;7146:3;7142:12;7135:19;;6936:224;;;:::o;7166:374::-;;7329:67;7393:2;7388:3;7329:67;:::i;:::-;7322:74;;7426:34;7422:1;7417:3;7413:11;7406:55;7492:12;7487:2;7482:3;7478:12;7471:34;7531:2;7526:3;7522:12;7515:19;;7312:228;;;:::o;7546:308::-;;7709:67;7773:2;7768:3;7709:67;:::i;:::-;7702:74;;7806:12;7802:1;7797:3;7793:11;7786:33;7845:2;7840:3;7836:12;7829:19;;7692:162;;;:::o;7860:316::-;;8023:67;8087:2;8082:3;8023:67;:::i;:::-;8016:74;;8120:20;8116:1;8111:3;8107:11;8100:41;8167:2;8162:3;8158:12;8151:19;;8006:170;;;:::o;8182:367::-;;8345:67;8409:2;8404:3;8345:67;:::i;:::-;8338:74;;8442:34;8438:1;8433:3;8429:11;8422:55;8508:5;8503:2;8498:3;8494:12;8487:27;8540:2;8535:3;8531:12;8524:19;;8328:221;;;:::o;8555:369::-;;8718:67;8782:2;8777:3;8718:67;:::i;:::-;8711:74;;8815:34;8811:1;8806:3;8802:11;8795:55;8881:7;8876:2;8871:3;8867:12;8860:29;8915:2;8910:3;8906:12;8899:19;;8701:223;;;:::o;8930:389::-;;9093:67;9157:2;9152:3;9093:67;:::i;:::-;9086:74;;9190:34;9186:1;9181:3;9177:11;9170:55;9256:27;9251:2;9246:3;9242:12;9235:49;9310:2;9305:3;9301:12;9294:19;;9076:243;;;:::o;9325:316::-;;9488:67;9552:2;9547:3;9488:67;:::i;:::-;9481:74;;9585:20;9581:1;9576:3;9572:11;9565:41;9632:2;9627:3;9623:12;9616:19;;9471:170;;;:::o;9647:375::-;;9810:67;9874:2;9869:3;9810:67;:::i;:::-;9803:74;;9907:34;9903:1;9898:3;9894:11;9887:55;9973:13;9968:2;9963:3;9959:12;9952:35;10013:2;10008:3;10004:12;9997:19;;9793:229;;;:::o;10028:370::-;;10191:67;10255:2;10250:3;10191:67;:::i;:::-;10184:74;;10288:34;10284:1;10279:3;10275:11;10268:55;10354:8;10349:2;10344:3;10340:12;10333:30;10389:2;10384:3;10380:12;10373:19;;10174:224;;;:::o;10404:330::-;;10567:67;10631:2;10626:3;10567:67;:::i;:::-;10560:74;;10664:34;10660:1;10655:3;10651:11;10644:55;10725:2;10720:3;10716:12;10709:19;;10550:184;;;:::o;10740:379::-;;10903:67;10967:2;10962:3;10903:67;:::i;:::-;10896:74;;11000:34;10996:1;10991:3;10987:11;10980:55;11066:17;11061:2;11056:3;11052:12;11045:39;11110:2;11105:3;11101:12;11094:19;;10886:233;;;:::o;11125:324::-;;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11385:28;11381:1;11376:3;11372:11;11365:49;11440:2;11435:3;11431:12;11424:19;;11271:178;;;:::o;11455:382::-;;11618:67;11682:2;11677:3;11618:67;:::i;:::-;11611:74;;11715:34;11711:1;11706:3;11702:11;11695:55;11781:20;11776:2;11771:3;11767:12;11760:42;11828:2;11823:3;11819:12;11812:19;;11601:236;;;:::o;11843:320::-;;12006:67;12070:2;12065:3;12006:67;:::i;:::-;11999:74;;12103:24;12099:1;12094:3;12090:11;12083:45;12154:2;12149:3;12145:12;12138:19;;11989:174;;;:::o;12169:366::-;;12332:67;12396:2;12391:3;12332:67;:::i;:::-;12325:74;;12429:34;12425:1;12420:3;12416:11;12409:55;12495:4;12490:2;12485:3;12481:12;12474:26;12526:2;12521:3;12517:12;12510:19;;12315:220;;;:::o;12541:383::-;;12704:67;12768:2;12763:3;12704:67;:::i;:::-;12697:74;;12801:34;12797:1;12792:3;12788:11;12781:55;12867:21;12862:2;12857:3;12853:12;12846:43;12915:2;12910:3;12906:12;12899:19;;12687:237;;;:::o;12930:327::-;;13093:67;13157:2;13152:3;13093:67;:::i;:::-;13086:74;;13190:31;13186:1;13181:3;13177:11;13170:52;13248:2;13243:3;13239:12;13232:19;;13076:181;;;:::o;13263:365::-;;13426:67;13490:2;13485:3;13426:67;:::i;:::-;13419:74;;13523:34;13519:1;13514:3;13510:11;13503:55;13589:3;13584:2;13579:3;13575:12;13568:25;13619:2;13614:3;13610:12;13603:19;;13409:219;;;:::o;13634:378::-;;13797:67;13861:2;13856:3;13797:67;:::i;:::-;13790:74;;13894:34;13890:1;13885:3;13881:11;13874:55;13960:16;13955:2;13950:3;13946:12;13939:38;14003:2;13998:3;13994:12;13987:19;;13780:232;;;:::o;14018:379::-;;14181:67;14245:2;14240:3;14181:67;:::i;:::-;14174:74;;14278:34;14274:1;14269:3;14265:11;14258:55;14344:17;14339:2;14334:3;14330:12;14323:39;14388:2;14383:3;14379:12;14372:19;;14164:233;;;:::o;14403:377::-;;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14663:34;14659:1;14654:3;14650:11;14643:55;14729:15;14724:2;14719:3;14715:12;14708:37;14771:2;14766:3;14762:12;14755:19;;14549:231;;;:::o;14786:366::-;;14949:67;15013:2;15008:3;14949:67;:::i;:::-;14942:74;;15046:34;15042:1;15037:3;15033:11;15026:55;15112:4;15107:2;15102:3;15098:12;15091:26;15143:2;15138:3;15134:12;15127:19;;14932:220;;;:::o;15158:118::-;15245:24;15263:5;15245:24;:::i;:::-;15240:3;15233:37;15223:53;;:::o;15282:435::-;;15484:95;15575:3;15566:6;15484:95;:::i;:::-;15477:102;;15596:95;15687:3;15678:6;15596:95;:::i;:::-;15589:102;;15708:3;15701:10;;15466:251;;;;;:::o;15723:222::-;;15854:2;15843:9;15839:18;15831:26;;15867:71;15935:1;15924:9;15920:17;15911:6;15867:71;:::i;:::-;15821:124;;;;:::o;15951:640::-;;16184:3;16173:9;16169:19;16161:27;;16198:71;16266:1;16255:9;16251:17;16242:6;16198:71;:::i;:::-;16279:72;16347:2;16336:9;16332:18;16323:6;16279:72;:::i;:::-;16361;16429:2;16418:9;16414:18;16405:6;16361:72;:::i;:::-;16480:9;16474:4;16470:20;16465:2;16454:9;16450:18;16443:48;16508:76;16579:4;16570:6;16508:76;:::i;:::-;16500:84;;16151:440;;;;;;;:::o;16597:210::-;;16722:2;16711:9;16707:18;16699:26;;16735:65;16797:1;16786:9;16782:17;16773:6;16735:65;:::i;:::-;16689:118;;;;:::o;16813:313::-;;16964:2;16953:9;16949:18;16941:26;;17013:9;17007:4;17003:20;16999:1;16988:9;16984:17;16977:47;17041:78;17114:4;17105:6;17041:78;:::i;:::-;17033:86;;16931:195;;;;:::o;17132:419::-;;17336:2;17325:9;17321:18;17313:26;;17385:9;17379:4;17375:20;17371:1;17360:9;17356:17;17349:47;17413:131;17539:4;17413:131;:::i;:::-;17405:139;;17303:248;;;:::o;17557:419::-;;17761:2;17750:9;17746:18;17738:26;;17810:9;17804:4;17800:20;17796:1;17785:9;17781:17;17774:47;17838:131;17964:4;17838:131;:::i;:::-;17830:139;;17728:248;;;:::o;17982:419::-;;18186:2;18175:9;18171:18;18163:26;;18235:9;18229:4;18225:20;18221:1;18210:9;18206:17;18199:47;18263:131;18389:4;18263:131;:::i;:::-;18255:139;;18153:248;;;:::o;18407:419::-;;18611:2;18600:9;18596:18;18588:26;;18660:9;18654:4;18650:20;18646:1;18635:9;18631:17;18624:47;18688:131;18814:4;18688:131;:::i;:::-;18680:139;;18578:248;;;:::o;18832:419::-;;19036:2;19025:9;19021:18;19013:26;;19085:9;19079:4;19075:20;19071:1;19060:9;19056:17;19049:47;19113:131;19239:4;19113:131;:::i;:::-;19105:139;;19003:248;;;:::o;19257:419::-;;19461:2;19450:9;19446:18;19438:26;;19510:9;19504:4;19500:20;19496:1;19485:9;19481:17;19474:47;19538:131;19664:4;19538:131;:::i;:::-;19530:139;;19428:248;;;:::o;19682:419::-;;19886:2;19875:9;19871:18;19863:26;;19935:9;19929:4;19925:20;19921:1;19910:9;19906:17;19899:47;19963:131;20089:4;19963:131;:::i;:::-;19955:139;;19853:248;;;:::o;20107:419::-;;20311:2;20300:9;20296:18;20288:26;;20360:9;20354:4;20350:20;20346:1;20335:9;20331:17;20324:47;20388:131;20514:4;20388:131;:::i;:::-;20380:139;;20278:248;;;:::o;20532:419::-;;20736:2;20725:9;20721:18;20713:26;;20785:9;20779:4;20775:20;20771:1;20760:9;20756:17;20749:47;20813:131;20939:4;20813:131;:::i;:::-;20805:139;;20703:248;;;:::o;20957:419::-;;21161:2;21150:9;21146:18;21138:26;;21210:9;21204:4;21200:20;21196:1;21185:9;21181:17;21174:47;21238:131;21364:4;21238:131;:::i;:::-;21230:139;;21128:248;;;:::o;21382:419::-;;21586:2;21575:9;21571:18;21563:26;;21635:9;21629:4;21625:20;21621:1;21610:9;21606:17;21599:47;21663:131;21789:4;21663:131;:::i;:::-;21655:139;;21553:248;;;:::o;21807:419::-;;22011:2;22000:9;21996:18;21988:26;;22060:9;22054:4;22050:20;22046:1;22035:9;22031:17;22024:47;22088:131;22214:4;22088:131;:::i;:::-;22080:139;;21978:248;;;:::o;22232:419::-;;22436:2;22425:9;22421:18;22413:26;;22485:9;22479:4;22475:20;22471:1;22460:9;22456:17;22449:47;22513:131;22639:4;22513:131;:::i;:::-;22505:139;;22403:248;;;:::o;22657:419::-;;22861:2;22850:9;22846:18;22838:26;;22910:9;22904:4;22900:20;22896:1;22885:9;22881:17;22874:47;22938:131;23064:4;22938:131;:::i;:::-;22930:139;;22828:248;;;:::o;23082:419::-;;23286:2;23275:9;23271:18;23263:26;;23335:9;23329:4;23325:20;23321:1;23310:9;23306:17;23299:47;23363:131;23489:4;23363:131;:::i;:::-;23355:139;;23253:248;;;:::o;23507:419::-;;23711:2;23700:9;23696:18;23688:26;;23760:9;23754:4;23750:20;23746:1;23735:9;23731:17;23724:47;23788:131;23914:4;23788:131;:::i;:::-;23780:139;;23678:248;;;:::o;23932:419::-;;24136:2;24125:9;24121:18;24113:26;;24185:9;24179:4;24175:20;24171:1;24160:9;24156:17;24149:47;24213:131;24339:4;24213:131;:::i;:::-;24205:139;;24103:248;;;:::o;24357:419::-;;24561:2;24550:9;24546:18;24538:26;;24610:9;24604:4;24600:20;24596:1;24585:9;24581:17;24574:47;24638:131;24764:4;24638:131;:::i;:::-;24630:139;;24528:248;;;:::o;24782:419::-;;24986:2;24975:9;24971:18;24963:26;;25035:9;25029:4;25025:20;25021:1;25010:9;25006:17;24999:47;25063:131;25189:4;25063:131;:::i;:::-;25055:139;;24953:248;;;:::o;25207:419::-;;25411:2;25400:9;25396:18;25388:26;;25460:9;25454:4;25450:20;25446:1;25435:9;25431:17;25424:47;25488:131;25614:4;25488:131;:::i;:::-;25480:139;;25378:248;;;:::o;25632:419::-;;25836:2;25825:9;25821:18;25813:26;;25885:9;25879:4;25875:20;25871:1;25860:9;25856:17;25849:47;25913:131;26039:4;25913:131;:::i;:::-;25905:139;;25803:248;;;:::o;26057:419::-;;26261:2;26250:9;26246:18;26238:26;;26310:9;26304:4;26300:20;26296:1;26285:9;26281:17;26274:47;26338:131;26464:4;26338:131;:::i;:::-;26330:139;;26228:248;;;:::o;26482:419::-;;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26653:248;;;:::o;26907:419::-;;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:131;27314:4;27188:131;:::i;:::-;27180:139;;27078:248;;;:::o;27332:222::-;;27463:2;27452:9;27448:18;27440:26;;27476:71;27544:1;27533:9;27529:17;27520:6;27476:71;:::i;:::-;27430:124;;;;:::o;27560:283::-;;27626:2;27620:9;27610:19;;27668:4;27660:6;27656:17;27775:6;27763:10;27760:22;27739:18;27727:10;27724:34;27721:62;27718:2;;;27786:18;;:::i;:::-;27718:2;27826:10;27822:2;27815:22;27600:243;;;;:::o;27849:331::-;;28000:18;27992:6;27989:30;27986:2;;;28022:18;;:::i;:::-;27986:2;28107:4;28103:9;28096:4;28088:6;28084:17;28080:33;28072:41;;28168:4;28162;28158:15;28150:23;;27915:265;;;:::o;28186:98::-;;28271:5;28265:12;28255:22;;28244:40;;;:::o;28290:99::-;;28376:5;28370:12;28360:22;;28349:40;;;:::o;28395:168::-;;28512:6;28507:3;28500:19;28552:4;28547:3;28543:14;28528:29;;28490:73;;;;:::o;28569:169::-;;28687:6;28682:3;28675:19;28727:4;28722:3;28718:14;28703:29;;28665:73;;;;:::o;28744:148::-;;28883:3;28868:18;;28858:34;;;;:::o;28898:273::-;;28957:20;28975:1;28957:20;:::i;:::-;28952:25;;28991:20;29009:1;28991:20;:::i;:::-;28986:25;;29113:1;29077:34;29073:42;29070:1;29067:49;29064:2;;;29119:18;;:::i;:::-;29064:2;29163:1;29160;29156:9;29149:16;;28942:229;;;;:::o;29177:305::-;;29236:20;29254:1;29236:20;:::i;:::-;29231:25;;29270:20;29288:1;29270:20;:::i;:::-;29265:25;;29424:1;29356:66;29352:74;29349:1;29346:81;29343:2;;;29430:18;;:::i;:::-;29343:2;29474:1;29471;29467:9;29460:16;;29221:261;;;;:::o;29488:185::-;;29545:20;29563:1;29545:20;:::i;:::-;29540:25;;29579:20;29597:1;29579:20;:::i;:::-;29574:25;;29618:1;29608:2;;29623:18;;:::i;:::-;29608:2;29665:1;29662;29658:9;29653:14;;29530:143;;;;:::o;29679:348::-;;29742:20;29760:1;29742:20;:::i;:::-;29737:25;;29776:20;29794:1;29776:20;:::i;:::-;29771:25;;29964:1;29896:66;29892:74;29889:1;29886:81;29881:1;29874:9;29867:17;29863:105;29860:2;;;29971:18;;:::i;:::-;29860:2;30019:1;30016;30012:9;30001:20;;29727:300;;;;:::o;30033:191::-;;30093:20;30111:1;30093:20;:::i;:::-;30088:25;;30127:20;30145:1;30127:20;:::i;:::-;30122:25;;30166:1;30163;30160:8;30157:2;;;30171:18;;:::i;:::-;30157:2;30216:1;30213;30209:9;30201:17;;30078:146;;;;:::o;30230:191::-;;30290:20;30308:1;30290:20;:::i;:::-;30285:25;;30324:20;30342:1;30324:20;:::i;:::-;30319:25;;30363:1;30360;30357:8;30354:2;;;30368:18;;:::i;:::-;30354:2;30413:1;30410;30406:9;30398:17;;30275:146;;;;:::o;30427:96::-;;30493:24;30511:5;30493:24;:::i;:::-;30482:35;;30472:51;;;:::o;30529:90::-;;30606:5;30599:13;30592:21;30581:32;;30571:48;;;:::o;30625:149::-;;30701:66;30694:5;30690:78;30679:89;;30669:105;;;:::o;30780:118::-;;30857:34;30850:5;30846:46;30835:57;;30825:73;;;:::o;30904:126::-;;30981:42;30974:5;30970:54;30959:65;;30949:81;;;:::o;31036:77::-;;31102:5;31091:16;;31081:32;;;:::o;31119:154::-;31203:6;31198:3;31193;31180:30;31265:1;31256:6;31251:3;31247:16;31240:27;31170:103;;;:::o;31279:307::-;31347:1;31357:113;31371:6;31368:1;31365:13;31357:113;;;31456:1;31451:3;31447:11;31441:18;31437:1;31432:3;31428:11;31421:39;31393:2;31390:1;31386:10;31381:15;;31357:113;;;31488:6;31485:1;31482:13;31479:2;;;31568:1;31559:6;31554:3;31550:16;31543:27;31479:2;31328:258;;;;:::o;31592:171::-;;31654:24;31672:5;31654:24;:::i;:::-;31645:33;;31700:4;31693:5;31690:15;31687:2;;;31708:18;;:::i;:::-;31687:2;31755:1;31748:5;31744:13;31737:20;;31635:128;;;:::o;31769:320::-;;31850:1;31844:4;31840:12;31830:22;;31897:1;31891:4;31887:12;31918:18;31908:2;;31974:4;31966:6;31962:17;31952:27;;31908:2;32036;32028:6;32025:14;32005:18;32002:38;31999:2;;;32055:18;;:::i;:::-;31999:2;31820:269;;;;:::o;32095:233::-;;32157:24;32175:5;32157:24;:::i;:::-;32148:33;;32203:66;32196:5;32193:77;32190:2;;;32273:18;;:::i;:::-;32190:2;32320:1;32313:5;32309:13;32302:20;;32138:190;;;:::o;32334:176::-;;32383:20;32401:1;32383:20;:::i;:::-;32378:25;;32417:20;32435:1;32417:20;:::i;:::-;32412:25;;32456:1;32446:2;;32461:18;;:::i;:::-;32446:2;32502:1;32499;32495:9;32490:14;;32368:142;;;;:::o;32516:180::-;32564:77;32561:1;32554:88;32661:4;32658:1;32651:15;32685:4;32682:1;32675:15;32702:180;32750:77;32747:1;32740:88;32847:4;32844:1;32837:15;32871:4;32868:1;32861:15;32888:180;32936:77;32933:1;32926:88;33033:4;33030:1;33023:15;33057:4;33054:1;33047:15;33074:180;33122:77;33119:1;33112:88;33219:4;33216:1;33209:15;33243:4;33240:1;33233:15;33260:102;;33352:2;33348:7;33343:2;33336:5;33332:14;33328:28;33318:38;;33308:54;;;:::o;33368:122::-;33441:24;33459:5;33441:24;:::i;:::-;33434:5;33431:35;33421:2;;33480:1;33477;33470:12;33421:2;33411:79;:::o;33496:116::-;33566:21;33581:5;33566:21;:::i;:::-;33559:5;33556:32;33546:2;;33602:1;33599;33592:12;33546:2;33536:76;:::o;33618:120::-;33690:23;33707:5;33690:23;:::i;:::-;33683:5;33680:34;33670:2;;33728:1;33725;33718:12;33670:2;33660:78;:::o;33744:122::-;33817:24;33835:5;33817:24;:::i;:::-;33810:5;33807:35;33797:2;;33856:1;33853;33846:12;33797:2;33787:79;:::o

Swarm Source

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