ETH Price: $3,500.74 (+4.28%)
Gas: 4 Gwei

Token

Fortune Friends Club (FFC)
 

Overview

Max Total Supply

8,888 FFC

Holders

4,650

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 FFC
0x0c7631385e22d78a04f0f6de877c23cf8a02cd2b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Fortune Friends Club is celebrating Asian culture with a collection of 8,888 cute li'l Baos. These Baos are awaiting your adoption, symbolic of values we care about the most – food, friends & fortune.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FortuneFriendsClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-07
*/

// Sources flattened with hardhat v2.8.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (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 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/[email protected]


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


// File contracts/FFC.sol


pragma solidity ^0.8.2;



// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&  @@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     *@,  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%  @@%   @@       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(      ,@@%.         ,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@             .&@*         (@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&                                        %@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@*                                                #@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@#                                                        @@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@                                                              %@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@                                                                  @@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@                                                                  @@.    *@@@@@@@@@@@@
// @@@@@@@@@@@@%                                                                   @#    ..@@@@@@@@@@@@
// @@@@@@@@@@@%                                  (@@@@@(                            &@@&@@@@@@@@@@@@@@@
// @@@@@@@@@@@                                 ,@*.    *@,                              *@@@@@@@@@@@@@@
// @@@@@@@@@@@                                 #@..  ...@#                               @@@@@@@@@@@@@@
// @@@@@@@@@@@                                  *@@*./@@*         .@.   (@               @@@@@@@@@@@@@@
// @@@@@@@@@@@                                                      %@@@&               /@@@@@@@@@@@@@@
// @@@@@@@@@@@                                                                          @@@@@@@@@@@@@@@
// @@@@@@@@@@@(                                                                        &@@@@@@@@@@@@@@@
// @@@@@@@@@@@@                                                                       @@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@&                                                                    ,@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@&                                                                 ,@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@,                                                            .@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@                                                       &@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@.                                              *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@/                                   (@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/.              .*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
contract FortuneFriendsClub is Ownable, ERC721A {
    string private _baseTokenURI;

    uint256 public presaleTime;
    uint256 public affectedTime;
    uint256 public publicRaffleTime;

    bytes32 public presaleMerkleRoot;
    bytes32 public affectedMerkleRoot;
    bytes32 public publicRaffleMerkleRoot;

    uint16 public devAmount = 100;
    uint16 public presaleAmount = 8645;
    uint256 public price = 0.055 ether;
    uint16 public supply = 8888;

    constructor(
        bytes32 _presaleMerkleRoot, 
        bytes32 _affectedMerkleRoot, 
        uint256 _presaleTime,
        uint256 _affectedTime,
        uint256 _publicRaffleTime
    ) ERC721A("Fortune Friends Club", "FFC", supply) {
        presaleMerkleRoot = _presaleMerkleRoot;
        affectedMerkleRoot = _affectedMerkleRoot;
				presaleTime = _presaleTime;
				affectedTime = _affectedTime;
				publicRaffleTime = _publicRaffleTime;
    }

    event Created(address indexed to, uint256 amount);

    // Base URI

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

    // Setters

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

    function setPresaleMerkleRoot(bytes32 newMerkleRoot) public onlyOwner {
        presaleMerkleRoot = newMerkleRoot;
    }

    function setAffectedMerkleRoot(bytes32 newMerkleRoot) public onlyOwner {
        affectedMerkleRoot = newMerkleRoot;
    }

    function setPublicRaffleMerkleRoot(bytes32 newMerkleRoot) public onlyOwner {
        publicRaffleMerkleRoot = newMerkleRoot;
    }

    function setMintTime(uint256 _presaleTime, uint256 _affectedTime, uint256 _publicRaffleTime) public onlyOwner {
        require(_affectedTime > _presaleTime && _publicRaffleTime > _affectedTime, "Invalid mint timings");
        presaleTime = _presaleTime;
        affectedTime = _affectedTime;
        publicRaffleTime = _publicRaffleTime;
    }

    // Mint

    function presaleMint(
        bytes32[] calldata merkleProof, uint16 numToMint, uint16 mintCap
    ) payable public isMintValid(numToMint, mintCap) isPriceValid(numToMint) isMintLive(presaleTime) {
        require(totalSupply() + numToMint < presaleAmount + 1, "Not enough remaining for mint amount requested");
        require(MerkleProof.verify(merkleProof, presaleMerkleRoot, keccak256(abi.encodePacked(msg.sender, mintCap))), "Leaf node could not be verified, check proof.");
        _safeMint(msg.sender, numToMint);
        emit Created(msg.sender, numToMint);
    }

    function affectedMint(
        bytes32[] calldata merkleProof, uint16 numToMint, uint16 mintCap
    ) payable public isMintValid(numToMint, mintCap) isMintLive(affectedTime) {
        require(MerkleProof.verify(merkleProof, affectedMerkleRoot, keccak256(abi.encodePacked(msg.sender, mintCap))), "Leaf node could not be verified, check proof");
        _safeMint(msg.sender, numToMint);
        emit Created(msg.sender, numToMint);
    }

    function publicRaffleMint(
        bytes32[] calldata merkleProof, uint16 numToMint
    ) payable public isMintValid(numToMint, 1) isPriceValid(numToMint) isMintLive(publicRaffleTime) {
        require(MerkleProof.verify(merkleProof, publicRaffleMerkleRoot, keccak256(abi.encodePacked(msg.sender))), "Leaf node could not be verified, check proof");
        _safeMint(msg.sender, numToMint);
        emit Created(msg.sender, numToMint);
    }

    function devMint(
        address to,
        uint16 numToMint
    ) payable public onlyOwner isMintValid(numToMint, devAmount) {
				require(numToMint % 5 == 0);
        for (uint32 i = 0; i < numToMint / 5; i++) {
            _safeMint(to, 5);
        }
    }
		
    // Dev

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

    function setOwnersExplicit(uint256 quantity) public onlyOwner {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }


    // Modifiers

    modifier isMintValid(uint16 numToMint, uint16 mintCap) {
        require(totalSupply() + numToMint < supply + 1, "Not enough remaining for mint amount requested");
        require(numberMinted(msg.sender) + numToMint < mintCap + 1, "Too many minted");
        require(numToMint > 0, "Quantity needs to be more than 0");
        _;
    }

    modifier isPriceValid(uint16 numToMint) {
        require(msg.value > 0, "Value has to be above 0");
        require(msg.value == price * numToMint, "Not enough ETH sent: check price");
        require(numberMinted(msg.sender) < 1, "Has minted before");
        _;
    }

    modifier isMintLive(uint256 time) {
        require(time > 0 && block.timestamp > time, "Invalid mint time");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_presaleMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_affectedMerkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_presaleTime","type":"uint256"},{"internalType":"uint256","name":"_affectedTime","type":"uint256"},{"internalType":"uint256","name":"_publicRaffleTime","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"affectedMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint16","name":"numToMint","type":"uint16"},{"internalType":"uint16","name":"mintCap","type":"uint16"}],"name":"affectedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"affectedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"numToMint","type":"uint16"}],"name":"devMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"presaleAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint16","name":"numToMint","type":"uint16"},{"internalType":"uint16","name":"mintCap","type":"uint16"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicRaffleMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint16","name":"numToMint","type":"uint16"}],"name":"publicRaffleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicRaffleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setAffectedMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleTime","type":"uint256"},{"internalType":"uint256","name":"_affectedTime","type":"uint256"},{"internalType":"uint256","name":"_publicRaffleTime","type":"uint256"}],"name":"setMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setPresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setPublicRaffleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600060015560006008556064601060006101000a81548161ffff021916908361ffff1602179055506121c5601060026101000a81548161ffff021916908361ffff16021790555066c3663566a580006011556122b8601260006101000a81548161ffff021916908361ffff1602179055503480156200008257600080fd5b506040516200649d3803806200649d8339818101604052810190620000a89190620003a4565b6040518060400160405280601481526020017f466f7274756e6520467269656e647320436c75620000000000000000000000008152506040518060400160405280600381526020017f4646430000000000000000000000000000000000000000000000000000000000815250601260009054906101000a900461ffff1661ffff16620001496200013d620001fa60201b60201c565b6200020260201b60201c565b600081116200018f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000186906200044d565b60405180910390fd5b8260029080519060200190620001a7929190620002c6565b508160039080519060200190620001c0929190620002c6565b50806080818152505050505084600d8190555083600e8190555082600a8190555081600b8190555080600c8190555050505050506200057c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d49062000494565b90600052602060002090601f016020900481019282620002f8576000855562000344565b82601f106200031357805160ff191683800117855562000344565b8280016001018555821562000344579182015b828111156200034357825182559160200191906001019062000326565b5b50905062000353919062000357565b5090565b5b808211156200037257600081600090555060010162000358565b5090565b600081519050620003878162000548565b92915050565b6000815190506200039e8162000562565b92915050565b600080600080600060a08688031215620003bd57600080fd5b6000620003cd8882890162000376565b9550506020620003e08882890162000376565b9450506040620003f3888289016200038d565b935050606062000406888289016200038d565b925050608062000419888289016200038d565b9150509295509295909350565b6000620004356027836200046f565b91506200044282620004f9565b604082019050919050565b60006020820190508181036000830152620004688162000426565b9050919050565b600082825260208201905092915050565b6000819050919050565b6000819050919050565b60006002820490506001821680620004ad57607f821691505b60208210811415620004c457620004c3620004ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b620005538162000480565b81146200055f57600080fd5b50565b6200056d816200048a565b81146200057957600080fd5b50565b608051615ef7620005a6600039600081816130a0015281816130c9015261396d0152615ef76000f3fe6080604052600436106102505760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610862578063d7224ba01461089f578063dc33e681146108ca578063e985e9c514610907578063f2fde38b14610944578063f3ef0c401461096d57610250565b8063a22cb4651461079e578063b138d500146107c7578063b88d4fde146107f2578063c6516cda1461081b578063c6e62e0b1461083757610250565b80638c8a61f1116100fd5780638c8a61f1146106c95780638da5cb5b146106f2578063909766311461071d57806395d89b4114610748578063a035b1fe1461077357610250565b80636352211e146105e257806370a082311461061f578063715018a61461065c5780637b94d30d146106735780637feff75f1461069e57610250565b806328d7b276116101d257806342842e0e1161019657806342842e0e146104e35780634600e2af1461050c5780634f6ccce71461052857806353cba6df1461056557806355f804b314610590578063617aa43c146105b957610250565b806328d7b276146104125780632b3459641461043b5780632d20fb60146104665780632f745c591461048f5780633ccfd60b146104cc57610250565b8063095ea7b311610219578063095ea7b31461034157806316ec01501461036a57806318160ddd1461039357806322212e2b146103be57806323b872dd146103e957610250565b8062becdaa1461025557806301ffc9a714610271578063047fc9aa146102ae57806306fdde03146102d9578063081812fc14610304575b600080fd5b61026f600480360381019061026a91906141f9565b610989565b005b34801561027d57600080fd5b50610298600480360381019061029391906142e6565b610cfe565b6040516102a59190614ab8565b60405180910390f35b3480156102ba57600080fd5b506102c3610e48565b6040516102d09190614f30565b60405180910390f35b3480156102e557600080fd5b506102ee610e5c565b6040516102fb9190614aee565b60405180910390f35b34801561031057600080fd5b5061032b6004803603810190610326919061437d565b610eee565b6040516103389190614a51565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906141bd565b610f73565b005b34801561037657600080fd5b50610391600480360381019061038c91906142bd565b61108c565b005b34801561039f57600080fd5b506103a8611112565b6040516103b59190614f66565b60405180910390f35b3480156103ca57600080fd5b506103d361111c565b6040516103e09190614ad3565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b919061407b565b611122565b005b34801561041e57600080fd5b50610439600480360381019061043491906142bd565b611132565b005b34801561044757600080fd5b506104506111b8565b60405161045d9190614f30565b60405180910390f35b34801561047257600080fd5b5061048d6004803603810190610488919061437d565b6111cc565b005b34801561049b57600080fd5b506104b660048036038101906104b191906141bd565b611254565b6040516104c39190614f66565b60405180910390f35b3480156104d857600080fd5b506104e1611452565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061407b565b61152e565b005b61052660048036038101906105219190614251565b61154e565b005b34801561053457600080fd5b5061054f600480360381019061054a919061437d565b61193e565b60405161055c9190614f66565b60405180910390f35b34801561057157600080fd5b5061057a611991565b6040516105879190614ad3565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190614338565b611997565b005b3480156105c557600080fd5b506105e060048036038101906105db91906143a6565b611a29565b005b3480156105ee57600080fd5b506106096004803603810190610604919061437d565b611b0c565b6040516106169190614a51565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190614016565b611b22565b6040516106539190614f66565b60405180910390f35b34801561066857600080fd5b50610671611c0b565b005b34801561067f57600080fd5b50610688611c93565b6040516106959190614f66565b60405180910390f35b3480156106aa57600080fd5b506106b3611c99565b6040516106c09190614ad3565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906142bd565b611c9f565b005b3480156106fe57600080fd5b50610707611d25565b6040516107149190614a51565b60405180910390f35b34801561072957600080fd5b50610732611d4e565b60405161073f9190614f66565b60405180910390f35b34801561075457600080fd5b5061075d611d54565b60405161076a9190614aee565b60405180910390f35b34801561077f57600080fd5b50610788611de6565b6040516107959190614f66565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190614145565b611dec565b005b3480156107d357600080fd5b506107dc611f6d565b6040516107e99190614f30565b60405180910390f35b3480156107fe57600080fd5b50610819600480360381019061081491906140ca565b611f81565b005b61083560048036038101906108309190614181565b611fdd565b005b34801561084357600080fd5b5061084c6121f6565b6040516108599190614f66565b60405180910390f35b34801561086e57600080fd5b506108896004803603810190610884919061437d565b6121fc565b6040516108969190614aee565b60405180910390f35b3480156108ab57600080fd5b506108b46122a3565b6040516108c19190614f66565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190614016565b6122a9565b6040516108fe9190614f66565b60405180910390f35b34801561091357600080fd5b5061092e6004803603810190610929919061403f565b6122bb565b60405161093b9190614ab8565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190614016565b61234f565b005b61098760048036038101906109829190614251565b612447565b005b80600180601260009054906101000a900461ffff166109a89190615060565b61ffff168261ffff166109b9611112565b6109c39190615098565b10610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90614e10565b60405180910390fd5b600181610a109190615060565b61ffff168261ffff16610a22336122a9565b610a2c9190615098565b10610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614df0565b60405180910390fd5b60008261ffff1611610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90614bb0565b60405180910390fd5b8260003411610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90614d70565b60405180910390fd5b8061ffff16601154610b099190615150565b3414610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190614ef0565b60405180910390fd5b6001610b55336122a9565b10610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90614c50565b60405180910390fd5b600c54600081118015610ba757508042115b610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90614b30565b60405180910390fd5b610c5a878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5433604051602001610c3f91906149ba565b604051602081830303815290604052805190602001206126dc565b610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090614e70565b60405180910390fd5b610ca7338661ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b86604051610ced9190614f4b565b60405180910390a250505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dc957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e415750610e4082612711565b5b9050919050565b601260009054906101000a900461ffff1681565b606060028054610e6b90615348565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9790615348565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef98261277b565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614ed0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611b0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe690614d90565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e612789565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037612789565b6122bb565b5b61107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390614c70565b60405180910390fd5b611087838383612791565b505050565b611094612789565b73ffffffffffffffffffffffffffffffffffffffff166110b2611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90614cf0565b60405180910390fd5b80600f8190555050565b6000600154905090565b600d5481565b61112d838383612843565b505050565b61113a612789565b73ffffffffffffffffffffffffffffffffffffffff16611158611d25565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590614cf0565b60405180910390fd5b80600d8190555050565b601060009054906101000a900461ffff1681565b6111d4612789565b73ffffffffffffffffffffffffffffffffffffffff166111f2611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90614cf0565b60405180910390fd5b61125181612dfc565b50565b600061125f83611b22565b82106112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790614b10565b60405180910390fd5b60006112aa611112565b905060008060005b83811015611410576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146113a457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113fc57868414156113ed57819550505050505061144c565b83806113f8906153ab565b9450505b508080611408906153ab565b9150506112b2565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614e50565b60405180910390fd5b92915050565b61145a612789565b73ffffffffffffffffffffffffffffffffffffffff16611478611d25565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590614cf0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561152b573d6000803e3d6000fd5b50565b61154983838360405180602001604052806000815250611f81565b505050565b81816001601260009054906101000a900461ffff1661156d9190615060565b61ffff168261ffff1661157e611112565b6115889190615098565b106115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614e10565b60405180910390fd5b6001816115d59190615060565b61ffff168261ffff166115e7336122a9565b6115f19190615098565b10611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614df0565b60405180910390fd5b60008261ffff1611611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614bb0565b60405180910390fd5b83600034116116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390614d70565b60405180910390fd5b8061ffff166011546116ce9190615150565b341461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690614ef0565b60405180910390fd5b600161171a336122a9565b1061175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190614c50565b60405180910390fd5b600a5460008111801561176c57508042115b6117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a290614b30565b60405180910390fd5b6001601060029054906101000a900461ffff166117c89190615060565b61ffff168661ffff166117d9611112565b6117e39190615098565b10611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90614e10565b60405180910390fd5b611899888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54338860405160200161187e9291906149d5565b604051602081830303815290604052805190602001206126dc565b6118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614b90565b60405180910390fd5b6118e6338761ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b8760405161192c9190614f4b565b60405180910390a25050505050505050565b6000611948611112565b8210611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614bd0565b60405180910390fd5b819050919050565b600f5481565b61199f612789565b73ffffffffffffffffffffffffffffffffffffffff166119bd611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614cf0565b60405180910390fd5b818160099190611a24929190613daa565b505050565b611a31612789565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614cf0565b60405180910390fd5b8282118015611ab357508181115b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990614c30565b60405180910390fd5b82600a8190555081600b8190555080600c81905550505050565b6000611b178261304c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614cb0565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611c13612789565b73ffffffffffffffffffffffffffffffffffffffff16611c31611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614cf0565b60405180910390fd5b611c91600061324f565b565b600c5481565b600e5481565b611ca7612789565b73ffffffffffffffffffffffffffffffffffffffff16611cc5611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290614cf0565b60405180910390fd5b80600e8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b606060038054611d6390615348565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8f90615348565b8015611ddc5780601f10611db157610100808354040283529160200191611ddc565b820191906000526020600020905b815481529060010190602001808311611dbf57829003601f168201915b5050505050905090565b60115481565b611df4612789565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990614d30565b60405180910390fd5b8060076000611e6f612789565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f1c612789565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f619190614ab8565b60405180910390a35050565b601060029054906101000a900461ffff1681565b611f8c848484612843565b611f9884848484613313565b611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90614db0565b60405180910390fd5b50505050565b611fe5612789565b73ffffffffffffffffffffffffffffffffffffffff16612003611d25565b73ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090614cf0565b60405180910390fd5b80601060009054906101000a900461ffff166001601260009054906101000a900461ffff166120889190615060565b61ffff168261ffff16612099611112565b6120a39190615098565b106120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da90614e10565b60405180910390fd5b6001816120f09190615060565b61ffff168261ffff16612102336122a9565b61210c9190615098565b1061214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614df0565b60405180910390fd5b60008261ffff1611612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90614bb0565b60405180910390fd5b60006005846121a29190615461565b61ffff16146121b057600080fd5b60005b6005846121c091906150ee565b61ffff168163ffffffff1610156121ef576121dc8560056126f3565b80806121e7906153f4565b9150506121b3565b5050505050565b600a5481565b60606122078261277b565b612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614d10565b60405180910390fd5b60006122506134aa565b90506000815111612270576040518060200160405280600081525061229b565b8061227a8461353c565b60405160200161228b929190614a2d565b6040516020818303038152906040525b915050919050565b60085481565b60006122b4826136e9565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612357612789565b73ffffffffffffffffffffffffffffffffffffffff16612375611d25565b73ffffffffffffffffffffffffffffffffffffffff16146123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614b50565b60405180910390fd5b6124448161324f565b50565b81816001601260009054906101000a900461ffff166124669190615060565b61ffff168261ffff16612477611112565b6124819190615098565b106124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614e10565b60405180910390fd5b6001816124ce9190615060565b61ffff168261ffff166124e0336122a9565b6124ea9190615098565b1061252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614df0565b60405180910390fd5b60008261ffff1611612571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256890614bb0565b60405180910390fd5b600b5460008111801561258357508042115b6125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b990614b30565b60405180910390fd5b612638878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54338760405160200161261d9291906149d5565b604051602081830303815290604052805190602001206126dc565b612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e90614e70565b60405180910390fd5b612685338661ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b866040516126cb9190614f4b565b60405180910390a250505050505050565b6000826126e985846137d2565b1490509392505050565b61270d8282604051806020016040528060008152506138ab565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061284e8261304c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612875612789565b73ffffffffffffffffffffffffffffffffffffffff1614806128d1575061289a612789565b73ffffffffffffffffffffffffffffffffffffffff166128b984610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ed57506128ec82600001516128e7612789565b6122bb565b5b90508061292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690614d50565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614cd0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614bf0565b60405180910390fd5b612a1e8585856001613d8b565b612a2e6000848460000151612791565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a9c91906151aa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b40919061501a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c469190615098565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d8c57612cbc8161277b565b15612d8b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612df48686866001613d91565b505050505050565b6000600854905060008211612e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3d90614c90565b60405180910390fd5b600060018383612e569190615098565b612e6091906151de565b905060018054612e7091906151de565b811115612e885760018054612e8591906151de565b90505b612e918161277b565b612ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec790614e90565b60405180910390fd5b60008290505b81811161303357600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613020576000612f538261304c565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061302b906153ab565b915050612ed6565b506001816130419190615098565b600881905550505050565b613054613e30565b61305d8261277b565b61309c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309390614b70565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106131005760017f0000000000000000000000000000000000000000000000000000000000000000846130f391906151de565b6130fd9190615098565b90505b60008390505b81811061320e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fa5780935050505061324a565b5080806132069061531e565b915050613106565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324190614eb0565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006133348473ffffffffffffffffffffffffffffffffffffffff16613d97565b1561349d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261335d612789565b8786866040518563ffffffff1660e01b815260040161337f9493929190614a6c565b602060405180830381600087803b15801561339957600080fd5b505af19250505080156133ca57506040513d601f19601f820116820180604052508101906133c7919061430f565b60015b61344d573d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50600081511415613445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343c90614db0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134a2565b600190505b949350505050565b6060600980546134b990615348565b80601f01602080910402602001604051908101604052809291908181526020018280546134e590615348565b80156135325780601f1061350757610100808354040283529160200191613532565b820191906000526020600020905b81548152906001019060200180831161351557829003601f168201915b5050505050905090565b60606000821415613584576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136e4565b600082905060005b600082146135b657808061359f906153ab565b915050600a826135af919061511f565b915061358c565b60008167ffffffffffffffff8111156135f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561362a5781602001600182028036833780820191505090505b5090505b600085146136dd5760018261364391906151de565b9150600a856136529190615492565b603061365e9190615098565b60f81b81838151811061369a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136d6919061511f565b945061362e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561375a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375190614c10565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008082905060005b84518110156138a057600085828151811061381f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613860578281604051602001613843929190614a01565b60405160208183030381529060405280519060200120925061388c565b8083604051602001613873929190614a01565b6040516020818303038152906040528051906020012092505b508080613898906153ab565b9150506137db565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391990614e30565b60405180910390fd5b61392b8161277b565b1561396b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396290614dd0565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c590614f10565b60405180910390fd5b6139db6000858386613d8b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613ad8919061501a565b6fffffffffffffffffffffffffffffffff168152602001858360200151613aff919061501a565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613d6e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d0e6000888488613313565b613d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4490614db0565b60405180910390fd5b8180613d58906153ab565b9250508080613d66906153ab565b915050613c9d565b5080600181905550613d836000878588613d91565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613db690615348565b90600052602060002090601f016020900481019282613dd85760008555613e1f565b82601f10613df157803560ff1916838001178555613e1f565b82800160010185558215613e1f579182015b82811115613e1e578235825591602001919060010190613e03565b5b509050613e2c9190613e6a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613e83576000816000905550600101613e6b565b5090565b6000613e9a613e9584614fa6565b614f81565b905082815260208101848484011115613eb257600080fd5b613ebd8482856152dc565b509392505050565b600081359050613ed481615e37565b92915050565b60008083601f840112613eec57600080fd5b8235905067ffffffffffffffff811115613f0557600080fd5b602083019150836020820283011115613f1d57600080fd5b9250929050565b600081359050613f3381615e4e565b92915050565b600081359050613f4881615e65565b92915050565b600081359050613f5d81615e7c565b92915050565b600081519050613f7281615e7c565b92915050565b600082601f830112613f8957600080fd5b8135613f99848260208601613e87565b91505092915050565b60008083601f840112613fb457600080fd5b8235905067ffffffffffffffff811115613fcd57600080fd5b602083019150836001820283011115613fe557600080fd5b9250929050565b600081359050613ffb81615e93565b92915050565b60008135905061401081615eaa565b92915050565b60006020828403121561402857600080fd5b600061403684828501613ec5565b91505092915050565b6000806040838503121561405257600080fd5b600061406085828601613ec5565b925050602061407185828601613ec5565b9150509250929050565b60008060006060848603121561409057600080fd5b600061409e86828701613ec5565b93505060206140af86828701613ec5565b92505060406140c086828701614001565b9150509250925092565b600080600080608085870312156140e057600080fd5b60006140ee87828801613ec5565b94505060206140ff87828801613ec5565b935050604061411087828801614001565b925050606085013567ffffffffffffffff81111561412d57600080fd5b61413987828801613f78565b91505092959194509250565b6000806040838503121561415857600080fd5b600061416685828601613ec5565b925050602061417785828601613f24565b9150509250929050565b6000806040838503121561419457600080fd5b60006141a285828601613ec5565b92505060206141b385828601613fec565b9150509250929050565b600080604083850312156141d057600080fd5b60006141de85828601613ec5565b92505060206141ef85828601614001565b9150509250929050565b60008060006040848603121561420e57600080fd5b600084013567ffffffffffffffff81111561422857600080fd5b61423486828701613eda565b9350935050602061424786828701613fec565b9150509250925092565b6000806000806060858703121561426757600080fd5b600085013567ffffffffffffffff81111561428157600080fd5b61428d87828801613eda565b945094505060206142a087828801613fec565b92505060406142b187828801613fec565b91505092959194509250565b6000602082840312156142cf57600080fd5b60006142dd84828501613f39565b91505092915050565b6000602082840312156142f857600080fd5b600061430684828501613f4e565b91505092915050565b60006020828403121561432157600080fd5b600061432f84828501613f63565b91505092915050565b6000806020838503121561434b57600080fd5b600083013567ffffffffffffffff81111561436557600080fd5b61437185828601613fa2565b92509250509250929050565b60006020828403121561438f57600080fd5b600061439d84828501614001565b91505092915050565b6000806000606084860312156143bb57600080fd5b60006143c986828701614001565b93505060206143da86828701614001565b92505060406143eb86828701614001565b9150509250925092565b6143fe81615212565b82525050565b61441561441082615212565b615421565b82525050565b61442481615224565b82525050565b61443381615230565b82525050565b61444a61444582615230565b615433565b82525050565b600061445b82614fd7565b6144658185614fed565b93506144758185602086016152eb565b61447e8161557f565b840191505092915050565b600061449482614fe2565b61449e8185614ffe565b93506144ae8185602086016152eb565b6144b78161557f565b840191505092915050565b60006144cd82614fe2565b6144d7818561500f565b93506144e78185602086016152eb565b80840191505092915050565b6000614500602283614ffe565b915061450b826155aa565b604082019050919050565b6000614523601183614ffe565b915061452e826155f9565b602082019050919050565b6000614546602683614ffe565b915061455182615622565b604082019050919050565b6000614569602a83614ffe565b915061457482615671565b604082019050919050565b600061458c602d83614ffe565b9150614597826156c0565b604082019050919050565b60006145af602083614ffe565b91506145ba8261570f565b602082019050919050565b60006145d2602383614ffe565b91506145dd82615738565b604082019050919050565b60006145f5602583614ffe565b915061460082615787565b604082019050919050565b6000614618603183614ffe565b9150614623826157d6565b604082019050919050565b600061463b601483614ffe565b915061464682615825565b602082019050919050565b600061465e601183614ffe565b91506146698261584e565b602082019050919050565b6000614681603983614ffe565b915061468c82615877565b604082019050919050565b60006146a4601883614ffe565b91506146af826158c6565b602082019050919050565b60006146c7602b83614ffe565b91506146d2826158ef565b604082019050919050565b60006146ea602683614ffe565b91506146f58261593e565b604082019050919050565b600061470d602083614ffe565b91506147188261598d565b602082019050919050565b6000614730602f83614ffe565b915061473b826159b6565b604082019050919050565b6000614753601a83614ffe565b915061475e82615a05565b602082019050919050565b6000614776603283614ffe565b915061478182615a2e565b604082019050919050565b6000614799601783614ffe565b91506147a482615a7d565b602082019050919050565b60006147bc602283614ffe565b91506147c782615aa6565b604082019050919050565b60006147df603383614ffe565b91506147ea82615af5565b604082019050919050565b6000614802601d83614ffe565b915061480d82615b44565b602082019050919050565b6000614825600f83614ffe565b915061483082615b6d565b602082019050919050565b6000614848602e83614ffe565b915061485382615b96565b604082019050919050565b600061486b602183614ffe565b915061487682615be5565b604082019050919050565b600061488e602e83614ffe565b915061489982615c34565b604082019050919050565b60006148b1602c83614ffe565b91506148bc82615c83565b604082019050919050565b60006148d4602683614ffe565b91506148df82615cd2565b604082019050919050565b60006148f7602f83614ffe565b915061490282615d21565b604082019050919050565b600061491a602d83614ffe565b915061492582615d70565b604082019050919050565b600061493d602083614ffe565b915061494882615dbf565b602082019050919050565b6000614960602283614ffe565b915061496b82615de8565b604082019050919050565b61497f81615282565b82525050565b61499661499182615282565b61543d565b82525050565b6149a5816152ca565b82525050565b6149b4816152b0565b82525050565b60006149c68284614404565b60148201915081905092915050565b60006149e18285614404565b6014820191506149f18284614985565b6002820191508190509392505050565b6000614a0d8285614439565b602082019150614a1d8284614439565b6020820191508190509392505050565b6000614a3982856144c2565b9150614a4582846144c2565b91508190509392505050565b6000602082019050614a6660008301846143f5565b92915050565b6000608082019050614a8160008301876143f5565b614a8e60208301866143f5565b614a9b60408301856149ab565b8181036060830152614aad8184614450565b905095945050505050565b6000602082019050614acd600083018461441b565b92915050565b6000602082019050614ae8600083018461442a565b92915050565b60006020820190508181036000830152614b088184614489565b905092915050565b60006020820190508181036000830152614b29816144f3565b9050919050565b60006020820190508181036000830152614b4981614516565b9050919050565b60006020820190508181036000830152614b6981614539565b9050919050565b60006020820190508181036000830152614b898161455c565b9050919050565b60006020820190508181036000830152614ba98161457f565b9050919050565b60006020820190508181036000830152614bc9816145a2565b9050919050565b60006020820190508181036000830152614be9816145c5565b9050919050565b60006020820190508181036000830152614c09816145e8565b9050919050565b60006020820190508181036000830152614c298161460b565b9050919050565b60006020820190508181036000830152614c498161462e565b9050919050565b60006020820190508181036000830152614c6981614651565b9050919050565b60006020820190508181036000830152614c8981614674565b9050919050565b60006020820190508181036000830152614ca981614697565b9050919050565b60006020820190508181036000830152614cc9816146ba565b9050919050565b60006020820190508181036000830152614ce9816146dd565b9050919050565b60006020820190508181036000830152614d0981614700565b9050919050565b60006020820190508181036000830152614d2981614723565b9050919050565b60006020820190508181036000830152614d4981614746565b9050919050565b60006020820190508181036000830152614d6981614769565b9050919050565b60006020820190508181036000830152614d898161478c565b9050919050565b60006020820190508181036000830152614da9816147af565b9050919050565b60006020820190508181036000830152614dc9816147d2565b9050919050565b60006020820190508181036000830152614de9816147f5565b9050919050565b60006020820190508181036000830152614e0981614818565b9050919050565b60006020820190508181036000830152614e298161483b565b9050919050565b60006020820190508181036000830152614e498161485e565b9050919050565b60006020820190508181036000830152614e6981614881565b9050919050565b60006020820190508181036000830152614e89816148a4565b9050919050565b60006020820190508181036000830152614ea9816148c7565b9050919050565b60006020820190508181036000830152614ec9816148ea565b9050919050565b60006020820190508181036000830152614ee98161490d565b9050919050565b60006020820190508181036000830152614f0981614930565b9050919050565b60006020820190508181036000830152614f2981614953565b9050919050565b6000602082019050614f456000830184614976565b92915050565b6000602082019050614f60600083018461499c565b92915050565b6000602082019050614f7b60008301846149ab565b92915050565b6000614f8b614f9c565b9050614f97828261537a565b919050565b6000604051905090565b600067ffffffffffffffff821115614fc157614fc0615550565b5b614fca8261557f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061502582615266565b915061503083615266565b9250826fffffffffffffffffffffffffffffffff03821115615055576150546154c3565b5b828201905092915050565b600061506b82615282565b915061507683615282565b92508261ffff0382111561508d5761508c6154c3565b5b828201905092915050565b60006150a3826152b0565b91506150ae836152b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150e3576150e26154c3565b5b828201905092915050565b60006150f982615282565b915061510483615282565b925082615114576151136154f2565b5b828204905092915050565b600061512a826152b0565b9150615135836152b0565b925082615145576151446154f2565b5b828204905092915050565b600061515b826152b0565b9150615166836152b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561519f5761519e6154c3565b5b828202905092915050565b60006151b582615266565b91506151c083615266565b9250828210156151d3576151d26154c3565b5b828203905092915050565b60006151e9826152b0565b91506151f4836152b0565b925082821015615207576152066154c3565b5b828203905092915050565b600061521d82615290565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60006152d582615282565b9050919050565b82818337600083830152505050565b60005b838110156153095780820151818401526020810190506152ee565b83811115615318576000848401525b50505050565b6000615329826152b0565b9150600082141561533d5761533c6154c3565b5b600182039050919050565b6000600282049050600182168061536057607f821691505b6020821081141561537457615373615521565b5b50919050565b6153838261557f565b810181811067ffffffffffffffff821117156153a2576153a1615550565b5b80604052505050565b60006153b6826152b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e9576153e86154c3565b5b600182019050919050565b60006153ff826152ba565b915063ffffffff821415615416576154156154c3565b5b600182019050919050565b600061542c8261544f565b9050919050565b6000819050919050565b600061544882615590565b9050919050565b600061545a8261559d565b9050919050565b600061546c82615282565b915061547783615282565b925082615487576154866154f2565b5b828206905092915050565b600061549d826152b0565b91506154a8836152b0565b9250826154b8576154b76154f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e742074696d65000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4c656166206e6f646520636f756c64206e6f742062652076657269666965642c60008201527f20636865636b2070726f6f662e00000000000000000000000000000000000000602082015250565b7f5175616e74697479206e6565647320746f206265206d6f7265207468616e2030600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f496e76616c6964206d696e742074696d696e6773000000000000000000000000600082015250565b7f486173206d696e746564206265666f7265000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f56616c75652068617320746f2062652061626f76652030000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f546f6f206d616e79206d696e7465640000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682072656d61696e696e6720666f72206d696e7420616d60008201527f6f756e7420726571756573746564000000000000000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4c656166206e6f646520636f756c64206e6f742062652076657269666965642c60008201527f20636865636b2070726f6f660000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482073656e743a20636865636b207072696365600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615e4081615212565b8114615e4b57600080fd5b50565b615e5781615224565b8114615e6257600080fd5b50565b615e6e81615230565b8114615e7957600080fd5b50565b615e858161523a565b8114615e9057600080fd5b50565b615e9c81615282565b8114615ea757600080fd5b50565b615eb3816152b0565b8114615ebe57600080fd5b5056fea2646970667358221220217257473f48a98c503fb6f707a18c4658ced46c30263e81c6241b9119ce5e0a64736f6c634300080400338a6c4629da1654e59701a104e501dacc7982253b7ed7e3150630753e400e79f60dffee322910c1ee02c2edd8b34f1fa25d9c8aecd6fe6643546db7ce3e942d5c0000000000000000000000000000000000000000000000000000000062006f10000000000000000000000000000000000000000000000000000000006201c0900000000000000000000000000000000000000000000000000000000062031210

Deployed Bytecode

0x6080604052600436106102505760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610862578063d7224ba01461089f578063dc33e681146108ca578063e985e9c514610907578063f2fde38b14610944578063f3ef0c401461096d57610250565b8063a22cb4651461079e578063b138d500146107c7578063b88d4fde146107f2578063c6516cda1461081b578063c6e62e0b1461083757610250565b80638c8a61f1116100fd5780638c8a61f1146106c95780638da5cb5b146106f2578063909766311461071d57806395d89b4114610748578063a035b1fe1461077357610250565b80636352211e146105e257806370a082311461061f578063715018a61461065c5780637b94d30d146106735780637feff75f1461069e57610250565b806328d7b276116101d257806342842e0e1161019657806342842e0e146104e35780634600e2af1461050c5780634f6ccce71461052857806353cba6df1461056557806355f804b314610590578063617aa43c146105b957610250565b806328d7b276146104125780632b3459641461043b5780632d20fb60146104665780632f745c591461048f5780633ccfd60b146104cc57610250565b8063095ea7b311610219578063095ea7b31461034157806316ec01501461036a57806318160ddd1461039357806322212e2b146103be57806323b872dd146103e957610250565b8062becdaa1461025557806301ffc9a714610271578063047fc9aa146102ae57806306fdde03146102d9578063081812fc14610304575b600080fd5b61026f600480360381019061026a91906141f9565b610989565b005b34801561027d57600080fd5b50610298600480360381019061029391906142e6565b610cfe565b6040516102a59190614ab8565b60405180910390f35b3480156102ba57600080fd5b506102c3610e48565b6040516102d09190614f30565b60405180910390f35b3480156102e557600080fd5b506102ee610e5c565b6040516102fb9190614aee565b60405180910390f35b34801561031057600080fd5b5061032b6004803603810190610326919061437d565b610eee565b6040516103389190614a51565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906141bd565b610f73565b005b34801561037657600080fd5b50610391600480360381019061038c91906142bd565b61108c565b005b34801561039f57600080fd5b506103a8611112565b6040516103b59190614f66565b60405180910390f35b3480156103ca57600080fd5b506103d361111c565b6040516103e09190614ad3565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b919061407b565b611122565b005b34801561041e57600080fd5b50610439600480360381019061043491906142bd565b611132565b005b34801561044757600080fd5b506104506111b8565b60405161045d9190614f30565b60405180910390f35b34801561047257600080fd5b5061048d6004803603810190610488919061437d565b6111cc565b005b34801561049b57600080fd5b506104b660048036038101906104b191906141bd565b611254565b6040516104c39190614f66565b60405180910390f35b3480156104d857600080fd5b506104e1611452565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061407b565b61152e565b005b61052660048036038101906105219190614251565b61154e565b005b34801561053457600080fd5b5061054f600480360381019061054a919061437d565b61193e565b60405161055c9190614f66565b60405180910390f35b34801561057157600080fd5b5061057a611991565b6040516105879190614ad3565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190614338565b611997565b005b3480156105c557600080fd5b506105e060048036038101906105db91906143a6565b611a29565b005b3480156105ee57600080fd5b506106096004803603810190610604919061437d565b611b0c565b6040516106169190614a51565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190614016565b611b22565b6040516106539190614f66565b60405180910390f35b34801561066857600080fd5b50610671611c0b565b005b34801561067f57600080fd5b50610688611c93565b6040516106959190614f66565b60405180910390f35b3480156106aa57600080fd5b506106b3611c99565b6040516106c09190614ad3565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906142bd565b611c9f565b005b3480156106fe57600080fd5b50610707611d25565b6040516107149190614a51565b60405180910390f35b34801561072957600080fd5b50610732611d4e565b60405161073f9190614f66565b60405180910390f35b34801561075457600080fd5b5061075d611d54565b60405161076a9190614aee565b60405180910390f35b34801561077f57600080fd5b50610788611de6565b6040516107959190614f66565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190614145565b611dec565b005b3480156107d357600080fd5b506107dc611f6d565b6040516107e99190614f30565b60405180910390f35b3480156107fe57600080fd5b50610819600480360381019061081491906140ca565b611f81565b005b61083560048036038101906108309190614181565b611fdd565b005b34801561084357600080fd5b5061084c6121f6565b6040516108599190614f66565b60405180910390f35b34801561086e57600080fd5b506108896004803603810190610884919061437d565b6121fc565b6040516108969190614aee565b60405180910390f35b3480156108ab57600080fd5b506108b46122a3565b6040516108c19190614f66565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec9190614016565b6122a9565b6040516108fe9190614f66565b60405180910390f35b34801561091357600080fd5b5061092e6004803603810190610929919061403f565b6122bb565b60405161093b9190614ab8565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190614016565b61234f565b005b61098760048036038101906109829190614251565b612447565b005b80600180601260009054906101000a900461ffff166109a89190615060565b61ffff168261ffff166109b9611112565b6109c39190615098565b10610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90614e10565b60405180910390fd5b600181610a109190615060565b61ffff168261ffff16610a22336122a9565b610a2c9190615098565b10610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614df0565b60405180910390fd5b60008261ffff1611610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90614bb0565b60405180910390fd5b8260003411610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90614d70565b60405180910390fd5b8061ffff16601154610b099190615150565b3414610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190614ef0565b60405180910390fd5b6001610b55336122a9565b10610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90614c50565b60405180910390fd5b600c54600081118015610ba757508042115b610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90614b30565b60405180910390fd5b610c5a878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5433604051602001610c3f91906149ba565b604051602081830303815290604052805190602001206126dc565b610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090614e70565b60405180910390fd5b610ca7338661ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b86604051610ced9190614f4b565b60405180910390a250505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dc957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e415750610e4082612711565b5b9050919050565b601260009054906101000a900461ffff1681565b606060028054610e6b90615348565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9790615348565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef98261277b565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614ed0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611b0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe690614d90565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100e612789565b73ffffffffffffffffffffffffffffffffffffffff16148061103d575061103c81611037612789565b6122bb565b5b61107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390614c70565b60405180910390fd5b611087838383612791565b505050565b611094612789565b73ffffffffffffffffffffffffffffffffffffffff166110b2611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90614cf0565b60405180910390fd5b80600f8190555050565b6000600154905090565b600d5481565b61112d838383612843565b505050565b61113a612789565b73ffffffffffffffffffffffffffffffffffffffff16611158611d25565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a590614cf0565b60405180910390fd5b80600d8190555050565b601060009054906101000a900461ffff1681565b6111d4612789565b73ffffffffffffffffffffffffffffffffffffffff166111f2611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90614cf0565b60405180910390fd5b61125181612dfc565b50565b600061125f83611b22565b82106112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790614b10565b60405180910390fd5b60006112aa611112565b905060008060005b83811015611410576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146113a457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113fc57868414156113ed57819550505050505061144c565b83806113f8906153ab565b9450505b508080611408906153ab565b9150506112b2565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614e50565b60405180910390fd5b92915050565b61145a612789565b73ffffffffffffffffffffffffffffffffffffffff16611478611d25565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590614cf0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561152b573d6000803e3d6000fd5b50565b61154983838360405180602001604052806000815250611f81565b505050565b81816001601260009054906101000a900461ffff1661156d9190615060565b61ffff168261ffff1661157e611112565b6115889190615098565b106115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614e10565b60405180910390fd5b6001816115d59190615060565b61ffff168261ffff166115e7336122a9565b6115f19190615098565b10611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890614df0565b60405180910390fd5b60008261ffff1611611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614bb0565b60405180910390fd5b83600034116116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390614d70565b60405180910390fd5b8061ffff166011546116ce9190615150565b341461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690614ef0565b60405180910390fd5b600161171a336122a9565b1061175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190614c50565b60405180910390fd5b600a5460008111801561176c57508042115b6117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a290614b30565b60405180910390fd5b6001601060029054906101000a900461ffff166117c89190615060565b61ffff168661ffff166117d9611112565b6117e39190615098565b10611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90614e10565b60405180910390fd5b611899888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54338860405160200161187e9291906149d5565b604051602081830303815290604052805190602001206126dc565b6118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90614b90565b60405180910390fd5b6118e6338761ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b8760405161192c9190614f4b565b60405180910390a25050505050505050565b6000611948611112565b8210611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614bd0565b60405180910390fd5b819050919050565b600f5481565b61199f612789565b73ffffffffffffffffffffffffffffffffffffffff166119bd611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90614cf0565b60405180910390fd5b818160099190611a24929190613daa565b505050565b611a31612789565b73ffffffffffffffffffffffffffffffffffffffff16611a4f611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90614cf0565b60405180910390fd5b8282118015611ab357508181115b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990614c30565b60405180910390fd5b82600a8190555081600b8190555080600c81905550505050565b6000611b178261304c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90614cb0565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611c13612789565b73ffffffffffffffffffffffffffffffffffffffff16611c31611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90614cf0565b60405180910390fd5b611c91600061324f565b565b600c5481565b600e5481565b611ca7612789565b73ffffffffffffffffffffffffffffffffffffffff16611cc5611d25565b73ffffffffffffffffffffffffffffffffffffffff1614611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290614cf0565b60405180910390fd5b80600e8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b5481565b606060038054611d6390615348565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8f90615348565b8015611ddc5780601f10611db157610100808354040283529160200191611ddc565b820191906000526020600020905b815481529060010190602001808311611dbf57829003601f168201915b5050505050905090565b60115481565b611df4612789565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990614d30565b60405180910390fd5b8060076000611e6f612789565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f1c612789565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f619190614ab8565b60405180910390a35050565b601060029054906101000a900461ffff1681565b611f8c848484612843565b611f9884848484613313565b611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90614db0565b60405180910390fd5b50505050565b611fe5612789565b73ffffffffffffffffffffffffffffffffffffffff16612003611d25565b73ffffffffffffffffffffffffffffffffffffffff1614612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090614cf0565b60405180910390fd5b80601060009054906101000a900461ffff166001601260009054906101000a900461ffff166120889190615060565b61ffff168261ffff16612099611112565b6120a39190615098565b106120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da90614e10565b60405180910390fd5b6001816120f09190615060565b61ffff168261ffff16612102336122a9565b61210c9190615098565b1061214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614df0565b60405180910390fd5b60008261ffff1611612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a90614bb0565b60405180910390fd5b60006005846121a29190615461565b61ffff16146121b057600080fd5b60005b6005846121c091906150ee565b61ffff168163ffffffff1610156121ef576121dc8560056126f3565b80806121e7906153f4565b9150506121b3565b5050505050565b600a5481565b60606122078261277b565b612246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223d90614d10565b60405180910390fd5b60006122506134aa565b90506000815111612270576040518060200160405280600081525061229b565b8061227a8461353c565b60405160200161228b929190614a2d565b6040516020818303038152906040525b915050919050565b60085481565b60006122b4826136e9565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612357612789565b73ffffffffffffffffffffffffffffffffffffffff16612375611d25565b73ffffffffffffffffffffffffffffffffffffffff16146123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614b50565b60405180910390fd5b6124448161324f565b50565b81816001601260009054906101000a900461ffff166124669190615060565b61ffff168261ffff16612477611112565b6124819190615098565b106124c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b890614e10565b60405180910390fd5b6001816124ce9190615060565b61ffff168261ffff166124e0336122a9565b6124ea9190615098565b1061252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252190614df0565b60405180910390fd5b60008261ffff1611612571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256890614bb0565b60405180910390fd5b600b5460008111801561258357508042115b6125c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b990614b30565b60405180910390fd5b612638878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54338760405160200161261d9291906149d5565b604051602081830303815290604052805190602001206126dc565b612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e90614e70565b60405180910390fd5b612685338661ffff166126f3565b3373ffffffffffffffffffffffffffffffffffffffff167f0ce3610e89a4bb9ec9359763f99110ed52a4abaea0b62028a1637e242ca2768b866040516126cb9190614f4b565b60405180910390a250505050505050565b6000826126e985846137d2565b1490509392505050565b61270d8282604051806020016040528060008152506138ab565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061284e8261304c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612875612789565b73ffffffffffffffffffffffffffffffffffffffff1614806128d1575061289a612789565b73ffffffffffffffffffffffffffffffffffffffff166128b984610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ed57506128ec82600001516128e7612789565b6122bb565b5b90508061292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690614d50565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614cd0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614bf0565b60405180910390fd5b612a1e8585856001613d8b565b612a2e6000848460000151612791565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a9c91906151aa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612b40919061501a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612c469190615098565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d8c57612cbc8161277b565b15612d8b576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612df48686866001613d91565b505050505050565b6000600854905060008211612e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3d90614c90565b60405180910390fd5b600060018383612e569190615098565b612e6091906151de565b905060018054612e7091906151de565b811115612e885760018054612e8591906151de565b90505b612e918161277b565b612ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec790614e90565b60405180910390fd5b60008290505b81811161303357600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613020576000612f538261304c565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061302b906153ab565b915050612ed6565b506001816130419190615098565b600881905550505050565b613054613e30565b61305d8261277b565b61309c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309390614b70565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000022b883106131005760017f00000000000000000000000000000000000000000000000000000000000022b8846130f391906151de565b6130fd9190615098565b90505b60008390505b81811061320e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fa5780935050505061324a565b5080806132069061531e565b915050613106565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324190614eb0565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006133348473ffffffffffffffffffffffffffffffffffffffff16613d97565b1561349d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261335d612789565b8786866040518563ffffffff1660e01b815260040161337f9493929190614a6c565b602060405180830381600087803b15801561339957600080fd5b505af19250505080156133ca57506040513d601f19601f820116820180604052508101906133c7919061430f565b60015b61344d573d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50600081511415613445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343c90614db0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134a2565b600190505b949350505050565b6060600980546134b990615348565b80601f01602080910402602001604051908101604052809291908181526020018280546134e590615348565b80156135325780601f1061350757610100808354040283529160200191613532565b820191906000526020600020905b81548152906001019060200180831161351557829003601f168201915b5050505050905090565b60606000821415613584576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136e4565b600082905060005b600082146135b657808061359f906153ab565b915050600a826135af919061511f565b915061358c565b60008167ffffffffffffffff8111156135f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561362a5781602001600182028036833780820191505090505b5090505b600085146136dd5760018261364391906151de565b9150600a856136529190615492565b603061365e9190615098565b60f81b81838151811061369a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136d6919061511f565b945061362e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561375a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375190614c10565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008082905060005b84518110156138a057600085828151811061381f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311613860578281604051602001613843929190614a01565b60405160208183030381529060405280519060200120925061388c565b8083604051602001613873929190614a01565b6040516020818303038152906040528051906020012092505b508080613898906153ab565b9150506137db565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391990614e30565b60405180910390fd5b61392b8161277b565b1561396b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396290614dd0565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000022b88311156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c590614f10565b60405180910390fd5b6139db6000858386613d8b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151613ad8919061501a565b6fffffffffffffffffffffffffffffffff168152602001858360200151613aff919061501a565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015613d6e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d0e6000888488613313565b613d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4490614db0565b60405180910390fd5b8180613d58906153ab565b9250508080613d66906153ab565b915050613c9d565b5080600181905550613d836000878588613d91565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613db690615348565b90600052602060002090601f016020900481019282613dd85760008555613e1f565b82601f10613df157803560ff1916838001178555613e1f565b82800160010185558215613e1f579182015b82811115613e1e578235825591602001919060010190613e03565b5b509050613e2c9190613e6a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613e83576000816000905550600101613e6b565b5090565b6000613e9a613e9584614fa6565b614f81565b905082815260208101848484011115613eb257600080fd5b613ebd8482856152dc565b509392505050565b600081359050613ed481615e37565b92915050565b60008083601f840112613eec57600080fd5b8235905067ffffffffffffffff811115613f0557600080fd5b602083019150836020820283011115613f1d57600080fd5b9250929050565b600081359050613f3381615e4e565b92915050565b600081359050613f4881615e65565b92915050565b600081359050613f5d81615e7c565b92915050565b600081519050613f7281615e7c565b92915050565b600082601f830112613f8957600080fd5b8135613f99848260208601613e87565b91505092915050565b60008083601f840112613fb457600080fd5b8235905067ffffffffffffffff811115613fcd57600080fd5b602083019150836001820283011115613fe557600080fd5b9250929050565b600081359050613ffb81615e93565b92915050565b60008135905061401081615eaa565b92915050565b60006020828403121561402857600080fd5b600061403684828501613ec5565b91505092915050565b6000806040838503121561405257600080fd5b600061406085828601613ec5565b925050602061407185828601613ec5565b9150509250929050565b60008060006060848603121561409057600080fd5b600061409e86828701613ec5565b93505060206140af86828701613ec5565b92505060406140c086828701614001565b9150509250925092565b600080600080608085870312156140e057600080fd5b60006140ee87828801613ec5565b94505060206140ff87828801613ec5565b935050604061411087828801614001565b925050606085013567ffffffffffffffff81111561412d57600080fd5b61413987828801613f78565b91505092959194509250565b6000806040838503121561415857600080fd5b600061416685828601613ec5565b925050602061417785828601613f24565b9150509250929050565b6000806040838503121561419457600080fd5b60006141a285828601613ec5565b92505060206141b385828601613fec565b9150509250929050565b600080604083850312156141d057600080fd5b60006141de85828601613ec5565b92505060206141ef85828601614001565b9150509250929050565b60008060006040848603121561420e57600080fd5b600084013567ffffffffffffffff81111561422857600080fd5b61423486828701613eda565b9350935050602061424786828701613fec565b9150509250925092565b6000806000806060858703121561426757600080fd5b600085013567ffffffffffffffff81111561428157600080fd5b61428d87828801613eda565b945094505060206142a087828801613fec565b92505060406142b187828801613fec565b91505092959194509250565b6000602082840312156142cf57600080fd5b60006142dd84828501613f39565b91505092915050565b6000602082840312156142f857600080fd5b600061430684828501613f4e565b91505092915050565b60006020828403121561432157600080fd5b600061432f84828501613f63565b91505092915050565b6000806020838503121561434b57600080fd5b600083013567ffffffffffffffff81111561436557600080fd5b61437185828601613fa2565b92509250509250929050565b60006020828403121561438f57600080fd5b600061439d84828501614001565b91505092915050565b6000806000606084860312156143bb57600080fd5b60006143c986828701614001565b93505060206143da86828701614001565b92505060406143eb86828701614001565b9150509250925092565b6143fe81615212565b82525050565b61441561441082615212565b615421565b82525050565b61442481615224565b82525050565b61443381615230565b82525050565b61444a61444582615230565b615433565b82525050565b600061445b82614fd7565b6144658185614fed565b93506144758185602086016152eb565b61447e8161557f565b840191505092915050565b600061449482614fe2565b61449e8185614ffe565b93506144ae8185602086016152eb565b6144b78161557f565b840191505092915050565b60006144cd82614fe2565b6144d7818561500f565b93506144e78185602086016152eb565b80840191505092915050565b6000614500602283614ffe565b915061450b826155aa565b604082019050919050565b6000614523601183614ffe565b915061452e826155f9565b602082019050919050565b6000614546602683614ffe565b915061455182615622565b604082019050919050565b6000614569602a83614ffe565b915061457482615671565b604082019050919050565b600061458c602d83614ffe565b9150614597826156c0565b604082019050919050565b60006145af602083614ffe565b91506145ba8261570f565b602082019050919050565b60006145d2602383614ffe565b91506145dd82615738565b604082019050919050565b60006145f5602583614ffe565b915061460082615787565b604082019050919050565b6000614618603183614ffe565b9150614623826157d6565b604082019050919050565b600061463b601483614ffe565b915061464682615825565b602082019050919050565b600061465e601183614ffe565b91506146698261584e565b602082019050919050565b6000614681603983614ffe565b915061468c82615877565b604082019050919050565b60006146a4601883614ffe565b91506146af826158c6565b602082019050919050565b60006146c7602b83614ffe565b91506146d2826158ef565b604082019050919050565b60006146ea602683614ffe565b91506146f58261593e565b604082019050919050565b600061470d602083614ffe565b91506147188261598d565b602082019050919050565b6000614730602f83614ffe565b915061473b826159b6565b604082019050919050565b6000614753601a83614ffe565b915061475e82615a05565b602082019050919050565b6000614776603283614ffe565b915061478182615a2e565b604082019050919050565b6000614799601783614ffe565b91506147a482615a7d565b602082019050919050565b60006147bc602283614ffe565b91506147c782615aa6565b604082019050919050565b60006147df603383614ffe565b91506147ea82615af5565b604082019050919050565b6000614802601d83614ffe565b915061480d82615b44565b602082019050919050565b6000614825600f83614ffe565b915061483082615b6d565b602082019050919050565b6000614848602e83614ffe565b915061485382615b96565b604082019050919050565b600061486b602183614ffe565b915061487682615be5565b604082019050919050565b600061488e602e83614ffe565b915061489982615c34565b604082019050919050565b60006148b1602c83614ffe565b91506148bc82615c83565b604082019050919050565b60006148d4602683614ffe565b91506148df82615cd2565b604082019050919050565b60006148f7602f83614ffe565b915061490282615d21565b604082019050919050565b600061491a602d83614ffe565b915061492582615d70565b604082019050919050565b600061493d602083614ffe565b915061494882615dbf565b602082019050919050565b6000614960602283614ffe565b915061496b82615de8565b604082019050919050565b61497f81615282565b82525050565b61499661499182615282565b61543d565b82525050565b6149a5816152ca565b82525050565b6149b4816152b0565b82525050565b60006149c68284614404565b60148201915081905092915050565b60006149e18285614404565b6014820191506149f18284614985565b6002820191508190509392505050565b6000614a0d8285614439565b602082019150614a1d8284614439565b6020820191508190509392505050565b6000614a3982856144c2565b9150614a4582846144c2565b91508190509392505050565b6000602082019050614a6660008301846143f5565b92915050565b6000608082019050614a8160008301876143f5565b614a8e60208301866143f5565b614a9b60408301856149ab565b8181036060830152614aad8184614450565b905095945050505050565b6000602082019050614acd600083018461441b565b92915050565b6000602082019050614ae8600083018461442a565b92915050565b60006020820190508181036000830152614b088184614489565b905092915050565b60006020820190508181036000830152614b29816144f3565b9050919050565b60006020820190508181036000830152614b4981614516565b9050919050565b60006020820190508181036000830152614b6981614539565b9050919050565b60006020820190508181036000830152614b898161455c565b9050919050565b60006020820190508181036000830152614ba98161457f565b9050919050565b60006020820190508181036000830152614bc9816145a2565b9050919050565b60006020820190508181036000830152614be9816145c5565b9050919050565b60006020820190508181036000830152614c09816145e8565b9050919050565b60006020820190508181036000830152614c298161460b565b9050919050565b60006020820190508181036000830152614c498161462e565b9050919050565b60006020820190508181036000830152614c6981614651565b9050919050565b60006020820190508181036000830152614c8981614674565b9050919050565b60006020820190508181036000830152614ca981614697565b9050919050565b60006020820190508181036000830152614cc9816146ba565b9050919050565b60006020820190508181036000830152614ce9816146dd565b9050919050565b60006020820190508181036000830152614d0981614700565b9050919050565b60006020820190508181036000830152614d2981614723565b9050919050565b60006020820190508181036000830152614d4981614746565b9050919050565b60006020820190508181036000830152614d6981614769565b9050919050565b60006020820190508181036000830152614d898161478c565b9050919050565b60006020820190508181036000830152614da9816147af565b9050919050565b60006020820190508181036000830152614dc9816147d2565b9050919050565b60006020820190508181036000830152614de9816147f5565b9050919050565b60006020820190508181036000830152614e0981614818565b9050919050565b60006020820190508181036000830152614e298161483b565b9050919050565b60006020820190508181036000830152614e498161485e565b9050919050565b60006020820190508181036000830152614e6981614881565b9050919050565b60006020820190508181036000830152614e89816148a4565b9050919050565b60006020820190508181036000830152614ea9816148c7565b9050919050565b60006020820190508181036000830152614ec9816148ea565b9050919050565b60006020820190508181036000830152614ee98161490d565b9050919050565b60006020820190508181036000830152614f0981614930565b9050919050565b60006020820190508181036000830152614f2981614953565b9050919050565b6000602082019050614f456000830184614976565b92915050565b6000602082019050614f60600083018461499c565b92915050565b6000602082019050614f7b60008301846149ab565b92915050565b6000614f8b614f9c565b9050614f97828261537a565b919050565b6000604051905090565b600067ffffffffffffffff821115614fc157614fc0615550565b5b614fca8261557f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061502582615266565b915061503083615266565b9250826fffffffffffffffffffffffffffffffff03821115615055576150546154c3565b5b828201905092915050565b600061506b82615282565b915061507683615282565b92508261ffff0382111561508d5761508c6154c3565b5b828201905092915050565b60006150a3826152b0565b91506150ae836152b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150e3576150e26154c3565b5b828201905092915050565b60006150f982615282565b915061510483615282565b925082615114576151136154f2565b5b828204905092915050565b600061512a826152b0565b9150615135836152b0565b925082615145576151446154f2565b5b828204905092915050565b600061515b826152b0565b9150615166836152b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561519f5761519e6154c3565b5b828202905092915050565b60006151b582615266565b91506151c083615266565b9250828210156151d3576151d26154c3565b5b828203905092915050565b60006151e9826152b0565b91506151f4836152b0565b925082821015615207576152066154c3565b5b828203905092915050565b600061521d82615290565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60006152d582615282565b9050919050565b82818337600083830152505050565b60005b838110156153095780820151818401526020810190506152ee565b83811115615318576000848401525b50505050565b6000615329826152b0565b9150600082141561533d5761533c6154c3565b5b600182039050919050565b6000600282049050600182168061536057607f821691505b6020821081141561537457615373615521565b5b50919050565b6153838261557f565b810181811067ffffffffffffffff821117156153a2576153a1615550565b5b80604052505050565b60006153b6826152b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e9576153e86154c3565b5b600182019050919050565b60006153ff826152ba565b915063ffffffff821415615416576154156154c3565b5b600182019050919050565b600061542c8261544f565b9050919050565b6000819050919050565b600061544882615590565b9050919050565b600061545a8261559d565b9050919050565b600061546c82615282565b915061547783615282565b925082615487576154866154f2565b5b828206905092915050565b600061549d826152b0565b91506154a8836152b0565b9250826154b8576154b76154f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e742074696d65000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4c656166206e6f646520636f756c64206e6f742062652076657269666965642c60008201527f20636865636b2070726f6f662e00000000000000000000000000000000000000602082015250565b7f5175616e74697479206e6565647320746f206265206d6f7265207468616e2030600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f496e76616c6964206d696e742074696d696e6773000000000000000000000000600082015250565b7f486173206d696e746564206265666f7265000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f56616c75652068617320746f2062652061626f76652030000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f546f6f206d616e79206d696e7465640000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682072656d61696e696e6720666f72206d696e7420616d60008201527f6f756e7420726571756573746564000000000000000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f4c656166206e6f646520636f756c64206e6f742062652076657269666965642c60008201527f20636865636b2070726f6f660000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482073656e743a20636865636b207072696365600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615e4081615212565b8114615e4b57600080fd5b50565b615e5781615224565b8114615e6257600080fd5b50565b615e6e81615230565b8114615e7957600080fd5b50565b615e858161523a565b8114615e9057600080fd5b50565b615e9c81615282565b8114615ea757600080fd5b50565b615eb3816152b0565b8114615ebe57600080fd5b5056fea2646970667358221220217257473f48a98c503fb6f707a18c4658ced46c30263e81c6241b9119ce5e0a64736f6c63430008040033

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

8a6c4629da1654e59701a104e501dacc7982253b7ed7e3150630753e400e79f60dffee322910c1ee02c2edd8b34f1fa25d9c8aecd6fe6643546db7ce3e942d5c0000000000000000000000000000000000000000000000000000000062006f10000000000000000000000000000000000000000000000000000000006201c0900000000000000000000000000000000000000000000000000000000062031210

-----Decoded View---------------
Arg [0] : _presaleMerkleRoot (bytes32): 0x8a6c4629da1654e59701a104e501dacc7982253b7ed7e3150630753e400e79f6
Arg [1] : _affectedMerkleRoot (bytes32): 0x0dffee322910c1ee02c2edd8b34f1fa25d9c8aecd6fe6643546db7ce3e942d5c
Arg [2] : _presaleTime (uint256): 1644195600
Arg [3] : _affectedTime (uint256): 1644282000
Arg [4] : _publicRaffleTime (uint256): 1644368400

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 8a6c4629da1654e59701a104e501dacc7982253b7ed7e3150630753e400e79f6
Arg [1] : 0dffee322910c1ee02c2edd8b34f1fa25d9c8aecd6fe6643546db7ce3e942d5c
Arg [2] : 0000000000000000000000000000000000000000000000000000000062006f10
Arg [3] : 000000000000000000000000000000000000000000000000000000006201c090
Arg [4] : 0000000000000000000000000000000000000000000000000000000062031210


Deployed Bytecode Sourcemap

45643:4984:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48731:447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24451:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46085:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26177:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27702:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27265:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47181:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23015:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45842:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28552:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46919:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45967:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49603:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23643:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49479:116;;;;;;;;;;;;;:::i;:::-;;28757:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47694:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23178:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45921:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46807:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47321:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26000:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24877:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38386:103;;;;;;;;;;;;;:::i;:::-;;45802:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45881:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47049:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37735:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45768:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26332:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46044:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27970:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46003:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28977:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49186:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45735:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26493:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33308:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49720:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28307:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38644:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48281:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48731:447;48850:9;48861:1;49974;49965:6;;;;;;;;;;;:10;;;;:::i;:::-;49937:38;;49953:9;49937:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;49929:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50094:1;50084:7;:11;;;;:::i;:::-;50045:50;;50072:9;50045:36;;:24;50058:10;50045:12;:24::i;:::-;:36;;;;:::i;:::-;:50;50037:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:1;50134:9;:13;;;50126:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48877:9:::1;50283:1;50271:9;:13;50263:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50352:9;50344:17;;:5;;:17;;;;:::i;:::-;50331:9;:30;50323:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50444:1;50417:24;50430:10;50417:12;:24::i;:::-;:28;50409:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48899:16:::2;;50555:1;50548:4;:8;:34;;;;;50578:4;50560:15;:22;50548:34;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48936:96:::3;48955:11;;48936:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48968:22;;49019:10;49002:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48992:39;;;;;;48936:18;:96::i;:::-;48928:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49092:32;49102:10;49114:9;49092:32;;:9;:32::i;:::-;49148:10;49140:30;;;49160:9;49140:30;;;;;;:::i;:::-;;;;;;;;50478:1:::2;50195::::1;48731:447:::0;;;;;:::o;24451:370::-;24578:4;24623:25;24608:40;;;:11;:40;;;;:99;;;;24674:33;24659:48;;;:11;:48;;;;24608:99;:160;;;;24733:35;24718:50;;;:11;:50;;;;24608:160;:207;;;;24779:36;24803:11;24779:23;:36::i;:::-;24608:207;24594:221;;24451:370;;;:::o;46085:27::-;;;;;;;;;;;;;:::o;26177:94::-;26231:13;26260:5;26253:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26177:94;:::o;27702:204::-;27770:7;27794:16;27802:7;27794;:16::i;:::-;27786:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27876:15;:24;27892:7;27876:24;;;;;;;;;;;;;;;;;;;;;27869:31;;27702:204;;;:::o;27265:379::-;27334:13;27350:24;27366:7;27350:15;:24::i;:::-;27334:40;;27395:5;27389:11;;:2;:11;;;;27381:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27480:5;27464:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27489:37;27506:5;27513:12;:10;:12::i;:::-;27489:16;:37::i;:::-;27464:62;27448:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;27610:28;27619:2;27623:7;27632:5;27610:8;:28::i;:::-;27265:379;;;:::o;47181:132::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47292:13:::1;47267:22;:38;;;;47181:132:::0;:::o;23015:94::-;23068:7;23091:12;;23084:19;;23015:94;:::o;45842:32::-;;;;:::o;28552:142::-;28660:28;28670:4;28676:2;28680:7;28660:9;:28::i;:::-;28552:142;;;:::o;46919:122::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47020:13:::1;47000:17;:33;;;;46919:122:::0;:::o;45967:29::-;;;;;;;;;;;;;:::o;49603:109::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49676:28:::1;49695:8;49676:18;:28::i;:::-;49603:109:::0;:::o;23643:744::-;23752:7;23787:16;23797:5;23787:9;:16::i;:::-;23779:5;:24;23771:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23849:22;23874:13;:11;:13::i;:::-;23849:38;;23894:19;23924:25;23974:9;23969:350;23993:14;23989:1;:18;23969:350;;;24023:31;24057:11;:14;24069:1;24057:14;;;;;;;;;;;24023:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24110:1;24084:28;;:9;:14;;;:28;;;24080:89;;24145:9;:14;;;24125:34;;24080:89;24202:5;24181:26;;:17;:26;;;24177:135;;;24239:5;24224:11;:20;24220:59;;;24266:1;24259:8;;;;;;;;;24220:59;24289:13;;;;;:::i;:::-;;;;24177:135;23969:350;24009:3;;;;;:::i;:::-;;;;23969:350;;;;24325:56;;;;;;;;;;:::i;:::-;;;;;;;;23643:744;;;;;:::o;49479:116::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49535:10:::1;49527:28;;:60;49572:4;49556:30;;;49527:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49479:116::o:0;28757:157::-;28869:39;28886:4;28892:2;28896:7;28869:39;;;;;;;;;;;;:16;:39::i;:::-;28757:157;;;:::o;47694:579::-;47824:9;47835:7;49974:1;49965:6;;;;;;;;;;;:10;;;;:::i;:::-;49937:38;;49953:9;49937:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;49929:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50094:1;50084:7;:11;;;;:::i;:::-;50045:50;;50072:9;50045:36;;:24;50058:10;50045:12;:24::i;:::-;:36;;;;:::i;:::-;:50;50037:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:1;50134:9;:13;;;50126:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47857:9:::1;50283:1;50271:9;:13;50263:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50352:9;50344:17;;:5;;:17;;;;:::i;:::-;50331:9;:30;50323:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50444:1;50417:24;50430:10;50417:12;:24::i;:::-;:28;50409:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47879:11:::2;;50555:1;50548:4;:8;:34;;;;;50578:4;50560:15;:22;50548:34;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;47955:1:::3;47939:13;;;;;;;;;;;:17;;;;:::i;:::-;47911:45;;47927:9;47911:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:45;47903:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;48026:100;48045:11;;48026:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48058:17;;48104:10;48116:7;48087:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48077:48;;;;;;48026:18;:100::i;:::-;48018:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;48187:32;48197:10;48209:9;48187:32;;:9;:32::i;:::-;48243:10;48235:30;;;48255:9;48235:30;;;;;;:::i;:::-;;;;;;;;50478:1:::2;50195::::1;47694:579:::0;;;;;;:::o;23178:177::-;23245:7;23277:13;:11;:13::i;:::-;23269:5;:21;23261:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23344:5;23337:12;;23178:177;;;:::o;45921:37::-;;;;:::o;46807:104::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46896:7:::1;;46880:13;:23;;;;;;;:::i;:::-;;46807:104:::0;;:::o;47321:350::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47466:12:::1;47450:13;:28;:65;;;;;47502:13;47482:17;:33;47450:65;47442:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;47565:12;47551:11;:26;;;;47603:13;47588:12;:28;;;;47646:17;47627:16;:36;;;;47321:350:::0;;;:::o;26000:118::-;26064:7;26087:20;26099:7;26087:11;:20::i;:::-;:25;;;26080:32;;26000:118;;;:::o;24877:211::-;24941:7;24982:1;24965:19;;:5;:19;;;;24957:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25054:12;:19;25067:5;25054:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25046:36;;25039:43;;24877:211;;;:::o;38386:103::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38451:30:::1;38478:1;38451:18;:30::i;:::-;38386:103::o:0;45802:31::-;;;;:::o;45881:33::-;;;;:::o;47049:124::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47152:13:::1;47131:18;:34;;;;47049:124:::0;:::o;37735:87::-;37781:7;37808:6;;;;;;;;;;;37801:13;;37735:87;:::o;45768:27::-;;;;:::o;26332:98::-;26388:13;26417:7;26410:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26332:98;:::o;46044:34::-;;;;:::o;27970:274::-;28073:12;:10;:12::i;:::-;28061:24;;:8;:24;;;;28053:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28170:8;28125:18;:32;28144:12;:10;:12::i;:::-;28125:32;;;;;;;;;;;;;;;:42;28158:8;28125:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28219:8;28190:48;;28205:12;:10;:12::i;:::-;28190:48;;;28229:8;28190:48;;;;;;:::i;:::-;;;;;;;;27970:274;;:::o;46003:34::-;;;;;;;;;;;;;:::o;28977:311::-;29114:28;29124:4;29130:2;29134:7;29114:9;:28::i;:::-;29165:48;29188:4;29194:2;29198:7;29207:5;29165:22;:48::i;:::-;29149:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;28977:311;;;;:::o;49186:269::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49295:9:::1;49306;;;;;;;;;;;49974:1;49965:6;;;;;;;;;;;:10;;;;:::i;:::-;49937:38;;49953:9;49937:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;49929:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50094:1;50084:7;:11;;;;:::i;:::-;50045:50;;50072:9;50045:36;;:24;50058:10;50045:12;:24::i;:::-;:36;;;;:::i;:::-;:50;50037:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:1;50134:9;:13;;;50126:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49349:1:::2;49344;49332:9;:13;;;;:::i;:::-;:18;;;49324:27;;;::::0;::::2;;49367:8;49362:86;49397:1;49385:9;:13;;;;:::i;:::-;49381:17;;:1;:17;;;49362:86;;;49420:16;49430:2;49434:1;49420:9;:16::i;:::-;49400:3;;;;;:::i;:::-;;;;49362:86;;;;38026:1:::1;;49186:269:::0;;:::o;45735:26::-;;;;:::o;26493:394::-;26591:13;26632:16;26640:7;26632;:16::i;:::-;26616:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;26722:21;26746:10;:8;:10::i;:::-;26722:34;;26801:1;26783:7;26777:21;:25;:104;;;;;;;;;;;;;;;;;26838:7;26847:18;:7;:16;:18::i;:::-;26821:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26777:104;26763:118;;;26493:394;;;:::o;33308:43::-;;;;:::o;49720:113::-;49778:7;49805:20;49819:5;49805:13;:20::i;:::-;49798:27;;49720:113;;;:::o;28307:186::-;28429:4;28452:18;:25;28471:5;28452:25;;;;;;;;;;;;;;;:35;28478:8;28452:35;;;;;;;;;;;;;;;;;;;;;;;;;28445:42;;28307:186;;;;:::o;38644:201::-;37966:12;:10;:12::i;:::-;37955:23;;:7;:5;:7::i;:::-;:23;;;37947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38753:1:::1;38733:22;;:8;:22;;;;38725:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38809:28;38828:8;38809:18;:28::i;:::-;38644:201:::0;:::o;48281:442::-;48412:9;48423:7;49974:1;49965:6;;;;;;;;;;;:10;;;;:::i;:::-;49937:38;;49953:9;49937:25;;:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;49929:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50094:1;50084:7;:11;;;;:::i;:::-;50045:50;;50072:9;50045:36;;:24;50058:10;50045:12;:24::i;:::-;:36;;;;:::i;:::-;:50;50037:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:1;50134:9;:13;;;50126:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48443:12:::1;;50555:1;50548:4;:8;:34;;;;;50578:4;50560:15;:22;50548:34;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48476:101:::2;48495:11;;48476:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48508:18;;48555:10;48567:7;48538:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48528:48;;;;;;48476:18;:101::i;:::-;48468:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;48637:32;48647:10;48659:9;48637:32;;:9;:32::i;:::-;48693:10;48685:30;;;48705:9;48685:30;;;;;;:::i;:::-;;;;;;;;50195:1:::1;48281:442:::0;;;;;;:::o;40119:190::-;40244:4;40297;40268:25;40281:5;40288:4;40268:12;:25::i;:::-;:33;40261:40;;40119:190;;;;;:::o;29638:98::-;29703:27;29713:2;29717:8;29703:27;;;;;;;;;;;;:9;:27::i;:::-;29638:98;;:::o;20884:157::-;20969:4;21008:25;20993:40;;;:11;:40;;;;20986:47;;20884:157;;;:::o;29527:105::-;29584:4;29614:12;;29604:7;:22;29597:29;;29527:105;;;:::o;17667:98::-;17720:7;17747:10;17740:17;;17667:98;:::o;33130:172::-;33254:2;33227:15;:24;33243:7;33227:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33288:7;33284:2;33268:28;;33277:5;33268:28;;;;;;;;;;;;33130:172;;;:::o;31495:1529::-;31592:35;31630:20;31642:7;31630:11;:20::i;:::-;31592:58;;31659:22;31701:13;:18;;;31685:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;31754:12;:10;:12::i;:::-;31730:36;;:20;31742:7;31730:11;:20::i;:::-;:36;;;31685:81;:142;;;;31777:50;31794:13;:18;;;31814:12;:10;:12::i;:::-;31777:16;:50::i;:::-;31685:142;31659:169;;31853:17;31837:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;31985:4;31963:26;;:13;:18;;;:26;;;31947:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;32074:1;32060:16;;:2;:16;;;;32052:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32127:43;32149:4;32155:2;32159:7;32168:1;32127:21;:43::i;:::-;32227:49;32244:1;32248:7;32257:13;:18;;;32227:8;:49::i;:::-;32315:1;32285:12;:18;32298:4;32285:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32351:1;32323:12;:16;32336:2;32323:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32382:43;;;;;;;;32397:2;32382:43;;;;;;32408:15;32382:43;;;;;32359:11;:20;32371:7;32359:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32653:19;32685:1;32675:7;:11;;;;:::i;:::-;32653:33;;32738:1;32697:43;;:11;:24;32709:11;32697:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;32693:236;;;32755:20;32763:11;32755:7;:20::i;:::-;32751:171;;;32815:97;;;;;;;;32842:13;:18;;;32815:97;;;;;;32873:13;:28;;;32815:97;;;;;32788:11;:24;32800:11;32788:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32751:171;32693:236;32961:7;32957:2;32942:27;;32951:4;32942:27;;;;;;;;;;;;32976:42;32997:4;33003:2;33007:7;33016:1;32976:20;:42::i;:::-;31495:1529;;;;;;:::o;33456:842::-;33518:25;33546:24;;33518:52;;33596:1;33585:8;:12;33577:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;33633:16;33683:1;33672:8;33652:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;33633:51;;33721:1;33706:12;;:16;;;;:::i;:::-;33695:8;:27;33691:77;;;33759:1;33744:12;;:16;;;;:::i;:::-;33733:27;;33691:77;33883:17;33891:8;33883:7;:17::i;:::-;33875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33955:9;33967:17;33955:29;;33950:297;33991:8;33986:1;:13;33950:297;;34050:1;34019:33;;:11;:14;34031:1;34019:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;34015:225;;;34065:31;34099:14;34111:1;34099:11;:14::i;:::-;34065:48;;34141:89;;;;;;;;34168:9;:14;;;34141:89;;;;;;34195:9;:24;;;34141:89;;;;;34124:11;:14;34136:1;34124:14;;;;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34015:225;;34001:3;;;;;:::i;:::-;;;;33950:297;;;;34291:1;34280:8;:12;;;;:::i;:::-;34253:24;:39;;;;33456:842;;;:::o;25340:606::-;25416:21;;:::i;:::-;25457:16;25465:7;25457;:16::i;:::-;25449:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25529:26;25577:12;25566:7;:23;25562:93;;25646:1;25631:12;25621:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;25600:47;;25562:93;25668:12;25683:7;25668:22;;25663:212;25700:18;25692:4;:26;25663:212;;25737:31;25771:11;:17;25783:4;25771:17;;;;;;;;;;;25737:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25827:1;25801:28;;:9;:14;;;:28;;;25797:71;;25849:9;25842:16;;;;;;;25797:71;25663:212;25720:6;;;;;:::i;:::-;;;;25663:212;;;;25883:57;;;;;;;;;;:::i;:::-;;;;;;;;25340:606;;;;:::o;39005:191::-;39079:16;39098:6;;;;;;;;;;;39079:25;;39124:8;39115:6;;:17;;;;;;;;;;;;;;;;;;39179:8;39148:40;;39169:8;39148:40;;;;;;;;;;;;39005:191;;:::o;34841:690::-;34978:4;34995:15;:2;:13;;;:15::i;:::-;34991:535;;;35050:2;35034:36;;;35071:12;:10;:12::i;:::-;35085:4;35091:7;35100:5;35034:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35021:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35282:1;35265:6;:13;:18;35261:215;;;35298:61;;;;;;;;;;:::i;:::-;;;;;;;;35261:215;35444:6;35438:13;35429:6;35425:2;35421:15;35414:38;35021:464;35166:45;;;35156:55;;;:6;:55;;;;35149:62;;;;;34991:535;35514:4;35507:11;;34841:690;;;;;;;:::o;46667:114::-;46727:13;46760;46753:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46667:114;:::o;18254:723::-;18310:13;18540:1;18531:5;:10;18527:53;;;18558:10;;;;;;;;;;;;;;;;;;;;;18527:53;18590:12;18605:5;18590:20;;18621:14;18646:78;18661:1;18653:4;:9;18646:78;;18679:8;;;;;:::i;:::-;;;;18710:2;18702:10;;;;;:::i;:::-;;;18646:78;;;18734:19;18766:6;18756:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18734:39;;18784:154;18800:1;18791:5;:10;18784:154;;18828:1;18818:11;;;;;:::i;:::-;;;18895:2;18887:5;:10;;;;:::i;:::-;18874:2;:24;;;;:::i;:::-;18861:39;;18844:6;18851;18844:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18924:2;18915:11;;;;;:::i;:::-;;;18784:154;;;18962:6;18948:21;;;;;18254:723;;;;:::o;25094:240::-;25155:7;25204:1;25187:19;;:5;:19;;;;25171:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;25295:12;:19;25308:5;25295:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;25287:41;;25280:48;;25094:240;;;:::o;40671:701::-;40754:7;40774:20;40797:4;40774:27;;40817:9;40812:523;40836:5;:12;40832:1;:16;40812:523;;;40870:20;40893:5;40899:1;40893:8;;;;;;;;;;;;;;;;;;;;;;40870:31;;40936:12;40920;:28;40916:408;;41090:12;41104;41073:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41063:55;;;;;;41048:70;;40916:408;;;41280:12;41294;41263:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41253:55;;;;;;41238:70;;40916:408;40812:523;40850:3;;;;;:::i;:::-;;;;40812:523;;;;41352:12;41345:19;;;40671:701;;;;:::o;29991:1272::-;30096:20;30119:12;;30096:35;;30160:1;30146:16;;:2;:16;;;;30138:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30337:21;30345:12;30337:7;:21::i;:::-;30336:22;30328:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30419:12;30407:8;:24;;30399:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30479:61;30509:1;30513:2;30517:12;30531:8;30479:21;:61::i;:::-;30549:30;30582:12;:16;30595:2;30582:16;;;;;;;;;;;;;;;30549:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30624:119;;;;;;;;30674:8;30644:11;:19;;;:39;;;;:::i;:::-;30624:119;;;;;;30727:8;30692:11;:24;;;:44;;;;:::i;:::-;30624:119;;;;;30605:12;:16;30618:2;30605:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30778:43;;;;;;;;30793:2;30778:43;;;;;;30804:15;30778:43;;;;;30750:11;:25;30762:12;30750:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30830:20;30853:12;30830:35;;30879:9;30874:281;30898:8;30894:1;:12;30874:281;;;30952:12;30948:2;30927:38;;30944:1;30927:38;;;;;;;;;;;;30992:59;31023:1;31027:2;31031:12;31045:5;30992:22;:59::i;:::-;30974:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;31133:14;;;;;:::i;:::-;;;;30908:3;;;;;:::i;:::-;;;;30874:281;;;;31178:12;31163;:27;;;;31197:60;31226:1;31230:2;31234:12;31248:8;31197:20;:60::i;:::-;29991:1272;;;;;;:::o;35993:141::-;;;;;:::o;36520:140::-;;;;;:::o;9649:387::-;9709:4;9917:12;9984:7;9972:20;9964:28;;10027:1;10020:4;:8;10013:15;;;9649:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:139::-;1076:5;1114:6;1101:20;1092:29;;1130:33;1157:5;1130:33;:::i;:::-;1082:87;;;;:::o;1175:137::-;1220:5;1258:6;1245:20;1236:29;;1274:32;1300:5;1274:32;:::i;:::-;1226:86;;;;:::o;1318:141::-;1374:5;1405:6;1399:13;1390:22;;1421:32;1447:5;1421:32;:::i;:::-;1380:79;;;;:::o;1478:271::-;1533:5;1582:3;1575:4;1567:6;1563:17;1559:27;1549:2;;1600:1;1597;1590:12;1549:2;1640:6;1627:20;1665:78;1739:3;1731:6;1724:4;1716:6;1712:17;1665:78;:::i;:::-;1656:87;;1539:210;;;;;:::o;1769:352::-;1827:8;1837:6;1887:3;1880:4;1872:6;1868:17;1864:27;1854:2;;1905:1;1902;1895:12;1854:2;1941:6;1928:20;1918:30;;1971:18;1963:6;1960:30;1957:2;;;2003:1;2000;1993:12;1957:2;2040:4;2032:6;2028:17;2016:29;;2094:3;2086:4;2078:6;2074:17;2064:8;2060:32;2057:41;2054:2;;;2111:1;2108;2101:12;2054:2;1844:277;;;;;:::o;2127:137::-;2172:5;2210:6;2197:20;2188:29;;2226:32;2252:5;2226:32;:::i;:::-;2178:86;;;;:::o;2270:139::-;2316:5;2354:6;2341:20;2332:29;;2370:33;2397:5;2370:33;:::i;:::-;2322:87;;;;:::o;2415:262::-;2474:6;2523:2;2511:9;2502:7;2498:23;2494:32;2491:2;;;2539:1;2536;2529:12;2491:2;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2481:196;;;;:::o;2683:407::-;2751:6;2759;2808:2;2796:9;2787:7;2783:23;2779:32;2776:2;;;2824:1;2821;2814:12;2776:2;2867:1;2892:53;2937:7;2928:6;2917:9;2913:22;2892:53;:::i;:::-;2882:63;;2838:117;2994:2;3020:53;3065:7;3056:6;3045:9;3041:22;3020:53;:::i;:::-;3010:63;;2965:118;2766:324;;;;;:::o;3096:552::-;3173:6;3181;3189;3238:2;3226:9;3217:7;3213:23;3209:32;3206:2;;;3254:1;3251;3244:12;3206:2;3297:1;3322:53;3367:7;3358:6;3347:9;3343:22;3322:53;:::i;:::-;3312:63;;3268:117;3424:2;3450:53;3495:7;3486:6;3475:9;3471:22;3450:53;:::i;:::-;3440:63;;3395:118;3552:2;3578:53;3623:7;3614:6;3603:9;3599:22;3578:53;:::i;:::-;3568:63;;3523:118;3196:452;;;;;:::o;3654:809::-;3749:6;3757;3765;3773;3822:3;3810:9;3801:7;3797:23;3793:33;3790:2;;;3839:1;3836;3829:12;3790:2;3882:1;3907:53;3952:7;3943:6;3932:9;3928:22;3907:53;:::i;:::-;3897:63;;3853:117;4009:2;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3980:118;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;4293:2;4282:9;4278:18;4265:32;4324:18;4316:6;4313:30;4310:2;;;4356:1;4353;4346:12;4310:2;4384:62;4438:7;4429:6;4418:9;4414:22;4384:62;:::i;:::-;4374:72;;4236:220;3780:683;;;;;;;:::o;4469:401::-;4534:6;4542;4591:2;4579:9;4570:7;4566:23;4562:32;4559:2;;;4607:1;4604;4597:12;4559:2;4650:1;4675:53;4720:7;4711:6;4700:9;4696:22;4675:53;:::i;:::-;4665:63;;4621:117;4777:2;4803:50;4845:7;4836:6;4825:9;4821:22;4803:50;:::i;:::-;4793:60;;4748:115;4549:321;;;;;:::o;4876:405::-;4943:6;4951;5000:2;4988:9;4979:7;4975:23;4971:32;4968:2;;;5016:1;5013;5006:12;4968:2;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:52;5256:7;5247:6;5236:9;5232:22;5212:52;:::i;:::-;5202:62;;5157:117;4958:323;;;;;:::o;5287:407::-;5355:6;5363;5412:2;5400:9;5391:7;5387:23;5383:32;5380:2;;;5428:1;5425;5418:12;5380:2;5471:1;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5442:117;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5370:324;;;;;:::o;5700:568::-;5794:6;5802;5810;5859:2;5847:9;5838:7;5834:23;5830:32;5827:2;;;5875:1;5872;5865:12;5827:2;5946:1;5935:9;5931:17;5918:31;5976:18;5968:6;5965:30;5962:2;;;6008:1;6005;5998:12;5962:2;6044:80;6116:7;6107:6;6096:9;6092:22;6044:80;:::i;:::-;6026:98;;;;5889:245;6173:2;6199:52;6243:7;6234:6;6223:9;6219:22;6199:52;:::i;:::-;6189:62;;6144:117;5817:451;;;;;:::o;6274:711::-;6376:6;6384;6392;6400;6449:2;6437:9;6428:7;6424:23;6420:32;6417:2;;;6465:1;6462;6455:12;6417:2;6536:1;6525:9;6521:17;6508:31;6566:18;6558:6;6555:30;6552:2;;;6598:1;6595;6588:12;6552:2;6634:80;6706:7;6697:6;6686:9;6682:22;6634:80;:::i;:::-;6616:98;;;;6479:245;6763:2;6789:52;6833:7;6824:6;6813:9;6809:22;6789:52;:::i;:::-;6779:62;;6734:117;6890:2;6916:52;6960:7;6951:6;6940:9;6936:22;6916:52;:::i;:::-;6906:62;;6861:117;6407:578;;;;;;;:::o;6991:262::-;7050:6;7099:2;7087:9;7078:7;7074:23;7070:32;7067:2;;;7115:1;7112;7105:12;7067:2;7158:1;7183:53;7228:7;7219:6;7208:9;7204:22;7183:53;:::i;:::-;7173:63;;7129:117;7057:196;;;;:::o;7259:260::-;7317:6;7366:2;7354:9;7345:7;7341:23;7337:32;7334:2;;;7382:1;7379;7372:12;7334:2;7425:1;7450:52;7494:7;7485:6;7474:9;7470:22;7450:52;:::i;:::-;7440:62;;7396:116;7324:195;;;;:::o;7525:282::-;7594:6;7643:2;7631:9;7622:7;7618:23;7614:32;7611:2;;;7659:1;7656;7649:12;7611:2;7702:1;7727:63;7782:7;7773:6;7762:9;7758:22;7727:63;:::i;:::-;7717:73;;7673:127;7601:206;;;;:::o;7813:395::-;7884:6;7892;7941:2;7929:9;7920:7;7916:23;7912:32;7909:2;;;7957:1;7954;7947:12;7909:2;8028:1;8017:9;8013:17;8000:31;8058:18;8050:6;8047:30;8044:2;;;8090:1;8087;8080:12;8044:2;8126:65;8183:7;8174:6;8163:9;8159:22;8126:65;:::i;:::-;8108:83;;;;7971:230;7899:309;;;;;:::o;8214:262::-;8273:6;8322:2;8310:9;8301:7;8297:23;8293:32;8290:2;;;8338:1;8335;8328:12;8290:2;8381:1;8406:53;8451:7;8442:6;8431:9;8427:22;8406:53;:::i;:::-;8396:63;;8352:117;8280:196;;;;:::o;8482:552::-;8559:6;8567;8575;8624:2;8612:9;8603:7;8599:23;8595:32;8592:2;;;8640:1;8637;8630:12;8592:2;8683:1;8708:53;8753:7;8744:6;8733:9;8729:22;8708:53;:::i;:::-;8698:63;;8654:117;8810:2;8836:53;8881:7;8872:6;8861:9;8857:22;8836:53;:::i;:::-;8826:63;;8781:118;8938:2;8964:53;9009:7;9000:6;8989:9;8985:22;8964:53;:::i;:::-;8954:63;;8909:118;8582:452;;;;;:::o;9040:118::-;9127:24;9145:5;9127:24;:::i;:::-;9122:3;9115:37;9105:53;;:::o;9164:157::-;9269:45;9289:24;9307:5;9289:24;:::i;:::-;9269:45;:::i;:::-;9264:3;9257:58;9247:74;;:::o;9327:109::-;9408:21;9423:5;9408:21;:::i;:::-;9403:3;9396:34;9386:50;;:::o;9442:118::-;9529:24;9547:5;9529:24;:::i;:::-;9524:3;9517:37;9507:53;;:::o;9566:157::-;9671:45;9691:24;9709:5;9691:24;:::i;:::-;9671:45;:::i;:::-;9666:3;9659:58;9649:74;;:::o;9729:360::-;9815:3;9843:38;9875:5;9843:38;:::i;:::-;9897:70;9960:6;9955:3;9897:70;:::i;:::-;9890:77;;9976:52;10021:6;10016:3;10009:4;10002:5;9998:16;9976:52;:::i;:::-;10053:29;10075:6;10053:29;:::i;:::-;10048:3;10044:39;10037:46;;9819:270;;;;;:::o;10095:364::-;10183:3;10211:39;10244:5;10211:39;:::i;:::-;10266:71;10330:6;10325:3;10266:71;:::i;:::-;10259:78;;10346:52;10391:6;10386:3;10379:4;10372:5;10368:16;10346:52;:::i;:::-;10423:29;10445:6;10423:29;:::i;:::-;10418:3;10414:39;10407:46;;10187:272;;;;;:::o;10465:377::-;10571:3;10599:39;10632:5;10599:39;:::i;:::-;10654:89;10736:6;10731:3;10654:89;:::i;:::-;10647:96;;10752:52;10797:6;10792:3;10785:4;10778:5;10774:16;10752:52;:::i;:::-;10829:6;10824:3;10820:16;10813:23;;10575:267;;;;;:::o;10848:366::-;10990:3;11011:67;11075:2;11070:3;11011:67;:::i;:::-;11004:74;;11087:93;11176:3;11087:93;:::i;:::-;11205:2;11200:3;11196:12;11189:19;;10994:220;;;:::o;11220:366::-;11362:3;11383:67;11447:2;11442:3;11383:67;:::i;:::-;11376:74;;11459:93;11548:3;11459:93;:::i;:::-;11577:2;11572:3;11568:12;11561:19;;11366:220;;;:::o;11592:366::-;11734:3;11755:67;11819:2;11814:3;11755:67;:::i;:::-;11748:74;;11831:93;11920:3;11831:93;:::i;:::-;11949:2;11944:3;11940:12;11933:19;;11738:220;;;:::o;11964:366::-;12106:3;12127:67;12191:2;12186:3;12127:67;:::i;:::-;12120:74;;12203:93;12292:3;12203:93;:::i;:::-;12321:2;12316:3;12312:12;12305:19;;12110:220;;;:::o;12336:366::-;12478:3;12499:67;12563:2;12558:3;12499:67;:::i;:::-;12492:74;;12575:93;12664:3;12575:93;:::i;:::-;12693:2;12688:3;12684:12;12677:19;;12482:220;;;:::o;12708:366::-;12850:3;12871:67;12935:2;12930:3;12871:67;:::i;:::-;12864:74;;12947:93;13036:3;12947:93;:::i;:::-;13065:2;13060:3;13056:12;13049:19;;12854:220;;;:::o;13080:366::-;13222:3;13243:67;13307:2;13302:3;13243:67;:::i;:::-;13236:74;;13319:93;13408:3;13319:93;:::i;:::-;13437:2;13432:3;13428:12;13421:19;;13226:220;;;:::o;13452:366::-;13594:3;13615:67;13679:2;13674:3;13615:67;:::i;:::-;13608:74;;13691:93;13780:3;13691:93;:::i;:::-;13809:2;13804:3;13800:12;13793:19;;13598:220;;;:::o;13824:366::-;13966:3;13987:67;14051:2;14046:3;13987:67;:::i;:::-;13980:74;;14063:93;14152:3;14063:93;:::i;:::-;14181:2;14176:3;14172:12;14165:19;;13970:220;;;:::o;14196:366::-;14338:3;14359:67;14423:2;14418:3;14359:67;:::i;:::-;14352:74;;14435:93;14524:3;14435:93;:::i;:::-;14553:2;14548:3;14544:12;14537:19;;14342:220;;;:::o;14568:366::-;14710:3;14731:67;14795:2;14790:3;14731:67;:::i;:::-;14724:74;;14807:93;14896:3;14807:93;:::i;:::-;14925:2;14920:3;14916:12;14909:19;;14714:220;;;:::o;14940:366::-;15082:3;15103:67;15167:2;15162:3;15103:67;:::i;:::-;15096:74;;15179:93;15268:3;15179:93;:::i;:::-;15297:2;15292:3;15288:12;15281:19;;15086:220;;;:::o;15312:366::-;15454:3;15475:67;15539:2;15534:3;15475:67;:::i;:::-;15468:74;;15551:93;15640:3;15551:93;:::i;:::-;15669:2;15664:3;15660:12;15653:19;;15458:220;;;:::o;15684:366::-;15826:3;15847:67;15911:2;15906:3;15847:67;:::i;:::-;15840:74;;15923:93;16012:3;15923:93;:::i;:::-;16041:2;16036:3;16032:12;16025:19;;15830:220;;;:::o;16056:366::-;16198:3;16219:67;16283:2;16278:3;16219:67;:::i;:::-;16212:74;;16295:93;16384:3;16295:93;:::i;:::-;16413:2;16408:3;16404:12;16397:19;;16202:220;;;:::o;16428:366::-;16570:3;16591:67;16655:2;16650:3;16591:67;:::i;:::-;16584:74;;16667:93;16756:3;16667:93;:::i;:::-;16785:2;16780:3;16776:12;16769:19;;16574:220;;;:::o;16800:366::-;16942:3;16963:67;17027:2;17022:3;16963:67;:::i;:::-;16956:74;;17039:93;17128:3;17039:93;:::i;:::-;17157:2;17152:3;17148:12;17141:19;;16946:220;;;:::o;17172:366::-;17314:3;17335:67;17399:2;17394:3;17335:67;:::i;:::-;17328:74;;17411:93;17500:3;17411:93;:::i;:::-;17529:2;17524:3;17520:12;17513:19;;17318:220;;;:::o;17544:366::-;17686:3;17707:67;17771:2;17766:3;17707:67;:::i;:::-;17700:74;;17783:93;17872:3;17783:93;:::i;:::-;17901:2;17896:3;17892:12;17885:19;;17690:220;;;:::o;17916:366::-;18058:3;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18155:93;18244:3;18155:93;:::i;:::-;18273:2;18268:3;18264:12;18257:19;;18062:220;;;:::o;18288:366::-;18430:3;18451:67;18515:2;18510:3;18451:67;:::i;:::-;18444:74;;18527:93;18616:3;18527:93;:::i;:::-;18645:2;18640:3;18636:12;18629:19;;18434:220;;;:::o;18660:366::-;18802:3;18823:67;18887:2;18882:3;18823:67;:::i;:::-;18816:74;;18899:93;18988:3;18899:93;:::i;:::-;19017:2;19012:3;19008:12;19001:19;;18806:220;;;:::o;19032:366::-;19174:3;19195:67;19259:2;19254:3;19195:67;:::i;:::-;19188:74;;19271:93;19360:3;19271:93;:::i;:::-;19389:2;19384:3;19380:12;19373:19;;19178:220;;;:::o;19404:366::-;19546:3;19567:67;19631:2;19626:3;19567:67;:::i;:::-;19560:74;;19643:93;19732:3;19643:93;:::i;:::-;19761:2;19756:3;19752:12;19745:19;;19550:220;;;:::o;19776:366::-;19918:3;19939:67;20003:2;19998:3;19939:67;:::i;:::-;19932:74;;20015:93;20104:3;20015:93;:::i;:::-;20133:2;20128:3;20124:12;20117:19;;19922:220;;;:::o;20148:366::-;20290:3;20311:67;20375:2;20370:3;20311:67;:::i;:::-;20304:74;;20387:93;20476:3;20387:93;:::i;:::-;20505:2;20500:3;20496:12;20489:19;;20294:220;;;:::o;20520:366::-;20662:3;20683:67;20747:2;20742:3;20683:67;:::i;:::-;20676:74;;20759:93;20848:3;20759:93;:::i;:::-;20877:2;20872:3;20868:12;20861:19;;20666:220;;;:::o;20892:366::-;21034:3;21055:67;21119:2;21114:3;21055:67;:::i;:::-;21048:74;;21131:93;21220:3;21131:93;:::i;:::-;21249:2;21244:3;21240:12;21233:19;;21038:220;;;:::o;21264:366::-;21406:3;21427:67;21491:2;21486:3;21427:67;:::i;:::-;21420:74;;21503:93;21592:3;21503:93;:::i;:::-;21621:2;21616:3;21612:12;21605:19;;21410:220;;;:::o;21636:366::-;21778:3;21799:67;21863:2;21858:3;21799:67;:::i;:::-;21792:74;;21875:93;21964:3;21875:93;:::i;:::-;21993:2;21988:3;21984:12;21977:19;;21782:220;;;:::o;22008:366::-;22150:3;22171:67;22235:2;22230:3;22171:67;:::i;:::-;22164:74;;22247:93;22336:3;22247:93;:::i;:::-;22365:2;22360:3;22356:12;22349:19;;22154:220;;;:::o;22380:366::-;22522:3;22543:67;22607:2;22602:3;22543:67;:::i;:::-;22536:74;;22619:93;22708:3;22619:93;:::i;:::-;22737:2;22732:3;22728:12;22721:19;;22526:220;;;:::o;22752:366::-;22894:3;22915:67;22979:2;22974:3;22915:67;:::i;:::-;22908:74;;22991:93;23080:3;22991:93;:::i;:::-;23109:2;23104:3;23100:12;23093:19;;22898:220;;;:::o;23124:115::-;23209:23;23226:5;23209:23;:::i;:::-;23204:3;23197:36;23187:52;;:::o;23245:153::-;23348:43;23367:23;23384:5;23367:23;:::i;:::-;23348:43;:::i;:::-;23343:3;23336:56;23326:72;;:::o;23404:129::-;23490:36;23520:5;23490:36;:::i;:::-;23485:3;23478:49;23468:65;;:::o;23539:118::-;23626:24;23644:5;23626:24;:::i;:::-;23621:3;23614:37;23604:53;;:::o;23663:256::-;23775:3;23790:75;23861:3;23852:6;23790:75;:::i;:::-;23890:2;23885:3;23881:12;23874:19;;23910:3;23903:10;;23779:140;;;;:::o;23925:392::-;24063:3;24078:75;24149:3;24140:6;24078:75;:::i;:::-;24178:2;24173:3;24169:12;24162:19;;24191:73;24260:3;24251:6;24191:73;:::i;:::-;24289:1;24284:3;24280:11;24273:18;;24308:3;24301:10;;24067:250;;;;;:::o;24323:397::-;24463:3;24478:75;24549:3;24540:6;24478:75;:::i;:::-;24578:2;24573:3;24569:12;24562:19;;24591:75;24662:3;24653:6;24591:75;:::i;:::-;24691:2;24686:3;24682:12;24675:19;;24711:3;24704:10;;24467:253;;;;;:::o;24726:435::-;24906:3;24928:95;25019:3;25010:6;24928:95;:::i;:::-;24921:102;;25040:95;25131:3;25122:6;25040:95;:::i;:::-;25033:102;;25152:3;25145:10;;24910:251;;;;;:::o;25167:222::-;25260:4;25298:2;25287:9;25283:18;25275:26;;25311:71;25379:1;25368:9;25364:17;25355:6;25311:71;:::i;:::-;25265:124;;;;:::o;25395:640::-;25590:4;25628:3;25617:9;25613:19;25605:27;;25642:71;25710:1;25699:9;25695:17;25686:6;25642:71;:::i;:::-;25723:72;25791:2;25780:9;25776:18;25767:6;25723:72;:::i;:::-;25805;25873:2;25862:9;25858:18;25849:6;25805:72;:::i;:::-;25924:9;25918:4;25914:20;25909:2;25898:9;25894:18;25887:48;25952:76;26023:4;26014:6;25952:76;:::i;:::-;25944:84;;25595:440;;;;;;;:::o;26041:210::-;26128:4;26166:2;26155:9;26151:18;26143:26;;26179:65;26241:1;26230:9;26226:17;26217:6;26179:65;:::i;:::-;26133:118;;;;:::o;26257:222::-;26350:4;26388:2;26377:9;26373:18;26365:26;;26401:71;26469:1;26458:9;26454:17;26445:6;26401:71;:::i;:::-;26355:124;;;;:::o;26485:313::-;26598:4;26636:2;26625:9;26621:18;26613:26;;26685:9;26679:4;26675:20;26671:1;26660:9;26656:17;26649:47;26713:78;26786:4;26777:6;26713:78;:::i;:::-;26705:86;;26603:195;;;;:::o;26804:419::-;26970:4;27008:2;26997:9;26993:18;26985:26;;27057:9;27051:4;27047:20;27043:1;27032:9;27028:17;27021:47;27085:131;27211:4;27085:131;:::i;:::-;27077:139;;26975:248;;;:::o;27229:419::-;27395:4;27433:2;27422:9;27418:18;27410:26;;27482:9;27476:4;27472:20;27468:1;27457:9;27453:17;27446:47;27510:131;27636:4;27510:131;:::i;:::-;27502:139;;27400:248;;;:::o;27654:419::-;27820:4;27858:2;27847:9;27843:18;27835:26;;27907:9;27901:4;27897:20;27893:1;27882:9;27878:17;27871:47;27935:131;28061:4;27935:131;:::i;:::-;27927:139;;27825:248;;;:::o;28079:419::-;28245:4;28283:2;28272:9;28268:18;28260:26;;28332:9;28326:4;28322:20;28318:1;28307:9;28303:17;28296:47;28360:131;28486:4;28360:131;:::i;:::-;28352:139;;28250:248;;;:::o;28504:419::-;28670:4;28708:2;28697:9;28693:18;28685:26;;28757:9;28751:4;28747:20;28743:1;28732:9;28728:17;28721:47;28785:131;28911:4;28785:131;:::i;:::-;28777:139;;28675:248;;;:::o;28929:419::-;29095:4;29133:2;29122:9;29118:18;29110:26;;29182:9;29176:4;29172:20;29168:1;29157:9;29153:17;29146:47;29210:131;29336:4;29210:131;:::i;:::-;29202:139;;29100:248;;;:::o;29354:419::-;29520:4;29558:2;29547:9;29543:18;29535:26;;29607:9;29601:4;29597:20;29593:1;29582:9;29578:17;29571:47;29635:131;29761:4;29635:131;:::i;:::-;29627:139;;29525:248;;;:::o;29779:419::-;29945:4;29983:2;29972:9;29968:18;29960:26;;30032:9;30026:4;30022:20;30018:1;30007:9;30003:17;29996:47;30060:131;30186:4;30060:131;:::i;:::-;30052:139;;29950:248;;;:::o;30204:419::-;30370:4;30408:2;30397:9;30393:18;30385:26;;30457:9;30451:4;30447:20;30443:1;30432:9;30428:17;30421:47;30485:131;30611:4;30485:131;:::i;:::-;30477:139;;30375:248;;;:::o;30629:419::-;30795:4;30833:2;30822:9;30818:18;30810:26;;30882:9;30876:4;30872:20;30868:1;30857:9;30853:17;30846:47;30910:131;31036:4;30910:131;:::i;:::-;30902:139;;30800:248;;;:::o;31054:419::-;31220:4;31258:2;31247:9;31243:18;31235:26;;31307:9;31301:4;31297:20;31293:1;31282:9;31278:17;31271:47;31335:131;31461:4;31335:131;:::i;:::-;31327:139;;31225:248;;;:::o;31479:419::-;31645:4;31683:2;31672:9;31668:18;31660:26;;31732:9;31726:4;31722:20;31718:1;31707:9;31703:17;31696:47;31760:131;31886:4;31760:131;:::i;:::-;31752:139;;31650:248;;;:::o;31904:419::-;32070:4;32108:2;32097:9;32093:18;32085:26;;32157:9;32151:4;32147:20;32143:1;32132:9;32128:17;32121:47;32185:131;32311:4;32185:131;:::i;:::-;32177:139;;32075:248;;;:::o;32329:419::-;32495:4;32533:2;32522:9;32518:18;32510:26;;32582:9;32576:4;32572:20;32568:1;32557:9;32553:17;32546:47;32610:131;32736:4;32610:131;:::i;:::-;32602:139;;32500:248;;;:::o;32754:419::-;32920:4;32958:2;32947:9;32943:18;32935:26;;33007:9;33001:4;32997:20;32993:1;32982:9;32978:17;32971:47;33035:131;33161:4;33035:131;:::i;:::-;33027:139;;32925:248;;;:::o;33179:419::-;33345:4;33383:2;33372:9;33368:18;33360:26;;33432:9;33426:4;33422:20;33418:1;33407:9;33403:17;33396:47;33460:131;33586:4;33460:131;:::i;:::-;33452:139;;33350:248;;;:::o;33604:419::-;33770:4;33808:2;33797:9;33793:18;33785:26;;33857:9;33851:4;33847:20;33843:1;33832:9;33828:17;33821:47;33885:131;34011:4;33885:131;:::i;:::-;33877:139;;33775:248;;;:::o;34029:419::-;34195:4;34233:2;34222:9;34218:18;34210:26;;34282:9;34276:4;34272:20;34268:1;34257:9;34253:17;34246:47;34310:131;34436:4;34310:131;:::i;:::-;34302:139;;34200:248;;;:::o;34454:419::-;34620:4;34658:2;34647:9;34643:18;34635:26;;34707:9;34701:4;34697:20;34693:1;34682:9;34678:17;34671:47;34735:131;34861:4;34735:131;:::i;:::-;34727:139;;34625:248;;;:::o;34879:419::-;35045:4;35083:2;35072:9;35068:18;35060:26;;35132:9;35126:4;35122:20;35118:1;35107:9;35103:17;35096:47;35160:131;35286:4;35160:131;:::i;:::-;35152:139;;35050:248;;;:::o;35304:419::-;35470:4;35508:2;35497:9;35493:18;35485:26;;35557:9;35551:4;35547:20;35543:1;35532:9;35528:17;35521:47;35585:131;35711:4;35585:131;:::i;:::-;35577:139;;35475:248;;;:::o;35729:419::-;35895:4;35933:2;35922:9;35918:18;35910:26;;35982:9;35976:4;35972:20;35968:1;35957:9;35953:17;35946:47;36010:131;36136:4;36010:131;:::i;:::-;36002:139;;35900:248;;;:::o;36154:419::-;36320:4;36358:2;36347:9;36343:18;36335:26;;36407:9;36401:4;36397:20;36393:1;36382:9;36378:17;36371:47;36435:131;36561:4;36435:131;:::i;:::-;36427:139;;36325:248;;;:::o;36579:419::-;36745:4;36783:2;36772:9;36768:18;36760:26;;36832:9;36826:4;36822:20;36818:1;36807:9;36803:17;36796:47;36860:131;36986:4;36860:131;:::i;:::-;36852:139;;36750:248;;;:::o;37004:419::-;37170:4;37208:2;37197:9;37193:18;37185:26;;37257:9;37251:4;37247:20;37243:1;37232:9;37228:17;37221:47;37285:131;37411:4;37285:131;:::i;:::-;37277:139;;37175:248;;;:::o;37429:419::-;37595:4;37633:2;37622:9;37618:18;37610:26;;37682:9;37676:4;37672:20;37668:1;37657:9;37653:17;37646:47;37710:131;37836:4;37710:131;:::i;:::-;37702:139;;37600:248;;;:::o;37854:419::-;38020:4;38058:2;38047:9;38043:18;38035:26;;38107:9;38101:4;38097:20;38093:1;38082:9;38078:17;38071:47;38135:131;38261:4;38135:131;:::i;:::-;38127:139;;38025:248;;;:::o;38279:419::-;38445:4;38483:2;38472:9;38468:18;38460:26;;38532:9;38526:4;38522:20;38518:1;38507:9;38503:17;38496:47;38560:131;38686:4;38560:131;:::i;:::-;38552:139;;38450:248;;;:::o;38704:419::-;38870:4;38908:2;38897:9;38893:18;38885:26;;38957:9;38951:4;38947:20;38943:1;38932:9;38928:17;38921:47;38985:131;39111:4;38985:131;:::i;:::-;38977:139;;38875:248;;;:::o;39129:419::-;39295:4;39333:2;39322:9;39318:18;39310:26;;39382:9;39376:4;39372:20;39368:1;39357:9;39353:17;39346:47;39410:131;39536:4;39410:131;:::i;:::-;39402:139;;39300:248;;;:::o;39554:419::-;39720:4;39758:2;39747:9;39743:18;39735:26;;39807:9;39801:4;39797:20;39793:1;39782:9;39778:17;39771:47;39835:131;39961:4;39835:131;:::i;:::-;39827:139;;39725:248;;;:::o;39979:419::-;40145:4;40183:2;40172:9;40168:18;40160:26;;40232:9;40226:4;40222:20;40218:1;40207:9;40203:17;40196:47;40260:131;40386:4;40260:131;:::i;:::-;40252:139;;40150:248;;;:::o;40404:419::-;40570:4;40608:2;40597:9;40593:18;40585:26;;40657:9;40651:4;40647:20;40643:1;40632:9;40628:17;40621:47;40685:131;40811:4;40685:131;:::i;:::-;40677:139;;40575:248;;;:::o;40829:218::-;40920:4;40958:2;40947:9;40943:18;40935:26;;40971:69;41037:1;41026:9;41022:17;41013:6;40971:69;:::i;:::-;40925:122;;;;:::o;41053:220::-;41145:4;41183:2;41172:9;41168:18;41160:26;;41196:70;41263:1;41252:9;41248:17;41239:6;41196:70;:::i;:::-;41150:123;;;;:::o;41279:222::-;41372:4;41410:2;41399:9;41395:18;41387:26;;41423:71;41491:1;41480:9;41476:17;41467:6;41423:71;:::i;:::-;41377:124;;;;:::o;41507:129::-;41541:6;41568:20;;:::i;:::-;41558:30;;41597:33;41625:4;41617:6;41597:33;:::i;:::-;41548:88;;;:::o;41642:75::-;41675:6;41708:2;41702:9;41692:19;;41682:35;:::o;41723:307::-;41784:4;41874:18;41866:6;41863:30;41860:2;;;41896:18;;:::i;:::-;41860:2;41934:29;41956:6;41934:29;:::i;:::-;41926:37;;42018:4;42012;42008:15;42000:23;;41789:241;;;:::o;42036:98::-;42087:6;42121:5;42115:12;42105:22;;42094:40;;;:::o;42140:99::-;42192:6;42226:5;42220:12;42210:22;;42199:40;;;:::o;42245:168::-;42328:11;42362:6;42357:3;42350:19;42402:4;42397:3;42393:14;42378:29;;42340:73;;;;:::o;42419:169::-;42503:11;42537:6;42532:3;42525:19;42577:4;42572:3;42568:14;42553:29;;42515:73;;;;:::o;42594:148::-;42696:11;42733:3;42718:18;;42708:34;;;;:::o;42748:273::-;42788:3;42807:20;42825:1;42807:20;:::i;:::-;42802:25;;42841:20;42859:1;42841:20;:::i;:::-;42836:25;;42963:1;42927:34;42923:42;42920:1;42917:49;42914:2;;;42969:18;;:::i;:::-;42914:2;43013:1;43010;43006:9;42999:16;;42792:229;;;;:::o;43027:242::-;43066:3;43085:19;43102:1;43085:19;:::i;:::-;43080:24;;43118:19;43135:1;43118:19;:::i;:::-;43113:24;;43211:1;43203:6;43199:14;43196:1;43193:21;43190:2;;;43217:18;;:::i;:::-;43190:2;43261:1;43258;43254:9;43247:16;;43070:199;;;;:::o;43275:305::-;43315:3;43334:20;43352:1;43334:20;:::i;:::-;43329:25;;43368:20;43386:1;43368:20;:::i;:::-;43363:25;;43522:1;43454:66;43450:74;43447:1;43444:81;43441:2;;;43528:18;;:::i;:::-;43441:2;43572:1;43569;43565:9;43558:16;;43319:261;;;;:::o;43586:182::-;43625:1;43642:19;43659:1;43642:19;:::i;:::-;43637:24;;43675:19;43692:1;43675:19;:::i;:::-;43670:24;;43713:1;43703:2;;43718:18;;:::i;:::-;43703:2;43760:1;43757;43753:9;43748:14;;43627:141;;;;:::o;43774:185::-;43814:1;43831:20;43849:1;43831:20;:::i;:::-;43826:25;;43865:20;43883:1;43865:20;:::i;:::-;43860:25;;43904:1;43894:2;;43909:18;;:::i;:::-;43894:2;43951:1;43948;43944:9;43939:14;;43816:143;;;;:::o;43965:348::-;44005:7;44028:20;44046:1;44028:20;:::i;:::-;44023:25;;44062:20;44080:1;44062:20;:::i;:::-;44057:25;;44250:1;44182:66;44178:74;44175:1;44172:81;44167:1;44160:9;44153:17;44149:105;44146:2;;;44257:18;;:::i;:::-;44146:2;44305:1;44302;44298:9;44287:20;;44013:300;;;;:::o;44319:191::-;44359:4;44379:20;44397:1;44379:20;:::i;:::-;44374:25;;44413:20;44431:1;44413:20;:::i;:::-;44408:25;;44452:1;44449;44446:8;44443:2;;;44457:18;;:::i;:::-;44443:2;44502:1;44499;44495:9;44487:17;;44364:146;;;;:::o;44516:191::-;44556:4;44576:20;44594:1;44576:20;:::i;:::-;44571:25;;44610:20;44628:1;44610:20;:::i;:::-;44605:25;;44649:1;44646;44643:8;44640:2;;;44654:18;;:::i;:::-;44640:2;44699:1;44696;44692:9;44684:17;;44561:146;;;;:::o;44713:96::-;44750:7;44779:24;44797:5;44779:24;:::i;:::-;44768:35;;44758:51;;;:::o;44815:90::-;44849:7;44892:5;44885:13;44878:21;44867:32;;44857:48;;;:::o;44911:77::-;44948:7;44977:5;44966:16;;44956:32;;;:::o;44994:149::-;45030:7;45070:66;45063:5;45059:78;45048:89;;45038:105;;;:::o;45149:118::-;45186:7;45226:34;45219:5;45215:46;45204:57;;45194:73;;;:::o;45273:89::-;45309:7;45349:6;45342:5;45338:18;45327:29;;45317:45;;;:::o;45368:126::-;45405:7;45445:42;45438:5;45434:54;45423:65;;45413:81;;;:::o;45500:77::-;45537:7;45566:5;45555:16;;45545:32;;;:::o;45583:93::-;45619:7;45659:10;45652:5;45648:22;45637:33;;45627:49;;;:::o;45682:111::-;45731:9;45764:23;45781:5;45764:23;:::i;:::-;45751:36;;45741:52;;;:::o;45799:154::-;45883:6;45878:3;45873;45860:30;45945:1;45936:6;45931:3;45927:16;45920:27;45850:103;;;:::o;45959:307::-;46027:1;46037:113;46051:6;46048:1;46045:13;46037:113;;;46136:1;46131:3;46127:11;46121:18;46117:1;46112:3;46108:11;46101:39;46073:2;46070:1;46066:10;46061:15;;46037:113;;;46168:6;46165:1;46162:13;46159:2;;;46248:1;46239:6;46234:3;46230:16;46223:27;46159:2;46008:258;;;;:::o;46272:171::-;46311:3;46334:24;46352:5;46334:24;:::i;:::-;46325:33;;46380:4;46373:5;46370:15;46367:2;;;46388:18;;:::i;:::-;46367:2;46435:1;46428:5;46424:13;46417:20;;46315:128;;;:::o;46449:320::-;46493:6;46530:1;46524:4;46520:12;46510:22;;46577:1;46571:4;46567:12;46598:18;46588:2;;46654:4;46646:6;46642:17;46632:27;;46588:2;46716;46708:6;46705:14;46685:18;46682:38;46679:2;;;46735:18;;:::i;:::-;46679:2;46500:269;;;;:::o;46775:281::-;46858:27;46880:4;46858:27;:::i;:::-;46850:6;46846:40;46988:6;46976:10;46973:22;46952:18;46940:10;46937:34;46934:62;46931:2;;;46999:18;;:::i;:::-;46931:2;47039:10;47035:2;47028:22;46818:238;;;:::o;47062:233::-;47101:3;47124:24;47142:5;47124:24;:::i;:::-;47115:33;;47170:66;47163:5;47160:77;47157:2;;;47240:18;;:::i;:::-;47157:2;47287:1;47280:5;47276:13;47269:20;;47105:190;;;:::o;47301:175::-;47339:3;47362:23;47379:5;47362:23;:::i;:::-;47353:32;;47407:10;47400:5;47397:21;47394:2;;;47421:18;;:::i;:::-;47394:2;47468:1;47461:5;47457:13;47450:20;;47343:133;;;:::o;47482:100::-;47521:7;47550:26;47570:5;47550:26;:::i;:::-;47539:37;;47529:53;;;:::o;47588:79::-;47627:7;47656:5;47645:16;;47635:32;;;:::o;47673:94::-;47711:7;47740:21;47755:5;47740:21;:::i;:::-;47729:32;;47719:48;;;:::o;47773:94::-;47812:7;47841:20;47855:5;47841:20;:::i;:::-;47830:31;;47820:47;;;:::o;47873:173::-;47904:1;47921:19;47938:1;47921:19;:::i;:::-;47916:24;;47954:19;47971:1;47954:19;:::i;:::-;47949:24;;47992:1;47982:2;;47997:18;;:::i;:::-;47982:2;48038:1;48035;48031:9;48026:14;;47906:140;;;;:::o;48052:176::-;48084:1;48101:20;48119:1;48101:20;:::i;:::-;48096:25;;48135:20;48153:1;48135:20;:::i;:::-;48130:25;;48174:1;48164:2;;48179:18;;:::i;:::-;48164:2;48220:1;48217;48213:9;48208:14;;48086:142;;;;:::o;48234:180::-;48282:77;48279:1;48272:88;48379:4;48376:1;48369:15;48403:4;48400:1;48393:15;48420:180;48468:77;48465:1;48458:88;48565:4;48562:1;48555:15;48589:4;48586:1;48579:15;48606:180;48654:77;48651:1;48644:88;48751:4;48748:1;48741:15;48775:4;48772:1;48765:15;48792:180;48840:77;48837:1;48830:88;48937:4;48934:1;48927:15;48961:4;48958:1;48951:15;48978:102;49019:6;49070:2;49066:7;49061:2;49054:5;49050:14;49046:28;49036:38;;49026:54;;;:::o;49086:96::-;49120:8;49169:5;49164:3;49160:15;49139:36;;49129:53;;;:::o;49188:94::-;49221:8;49269:5;49265:2;49261:14;49240:35;;49230:52;;;:::o;49288:221::-;49428:34;49424:1;49416:6;49412:14;49405:58;49497:4;49492:2;49484:6;49480:15;49473:29;49394:115;:::o;49515:167::-;49655:19;49651:1;49643:6;49639:14;49632:43;49621:61;:::o;49688:225::-;49828:34;49824:1;49816:6;49812:14;49805:58;49897:8;49892:2;49884:6;49880:15;49873:33;49794:119;:::o;49919:229::-;50059:34;50055:1;50047:6;50043:14;50036:58;50128:12;50123:2;50115:6;50111:15;50104:37;50025:123;:::o;50154:232::-;50294:34;50290:1;50282:6;50278:14;50271:58;50363:15;50358:2;50350:6;50346:15;50339:40;50260:126;:::o;50392:182::-;50532:34;50528:1;50520:6;50516:14;50509:58;50498:76;:::o;50580:222::-;50720:34;50716:1;50708:6;50704:14;50697:58;50789:5;50784:2;50776:6;50772:15;50765:30;50686:116;:::o;50808:224::-;50948:34;50944:1;50936:6;50932:14;50925:58;51017:7;51012:2;51004:6;51000:15;50993:32;50914:118;:::o;51038:236::-;51178:34;51174:1;51166:6;51162:14;51155:58;51247:19;51242:2;51234:6;51230:15;51223:44;51144:130;:::o;51280:170::-;51420:22;51416:1;51408:6;51404:14;51397:46;51386:64;:::o;51456:167::-;51596:19;51592:1;51584:6;51580:14;51573:43;51562:61;:::o;51629:244::-;51769:34;51765:1;51757:6;51753:14;51746:58;51838:27;51833:2;51825:6;51821:15;51814:52;51735:138;:::o;51879:174::-;52019:26;52015:1;52007:6;52003:14;51996:50;51985:68;:::o;52059:230::-;52199:34;52195:1;52187:6;52183:14;52176:58;52268:13;52263:2;52255:6;52251:15;52244:38;52165:124;:::o;52295:225::-;52435:34;52431:1;52423:6;52419:14;52412:58;52504:8;52499:2;52491:6;52487:15;52480:33;52401:119;:::o;52526:182::-;52666:34;52662:1;52654:6;52650:14;52643:58;52632:76;:::o;52714:234::-;52854:34;52850:1;52842:6;52838:14;52831:58;52923:17;52918:2;52910:6;52906:15;52899:42;52820:128;:::o;52954:176::-;53094:28;53090:1;53082:6;53078:14;53071:52;53060:70;:::o;53136:237::-;53276:34;53272:1;53264:6;53260:14;53253:58;53345:20;53340:2;53332:6;53328:15;53321:45;53242:131;:::o;53379:173::-;53519:25;53515:1;53507:6;53503:14;53496:49;53485:67;:::o;53558:221::-;53698:34;53694:1;53686:6;53682:14;53675:58;53767:4;53762:2;53754:6;53750:15;53743:29;53664:115;:::o;53785:238::-;53925:34;53921:1;53913:6;53909:14;53902:58;53994:21;53989:2;53981:6;53977:15;53970:46;53891:132;:::o;54029:179::-;54169:31;54165:1;54157:6;54153:14;54146:55;54135:73;:::o;54214:165::-;54354:17;54350:1;54342:6;54338:14;54331:41;54320:59;:::o;54385:233::-;54525:34;54521:1;54513:6;54509:14;54502:58;54594:16;54589:2;54581:6;54577:15;54570:41;54491:127;:::o;54624:220::-;54764:34;54760:1;54752:6;54748:14;54741:58;54833:3;54828:2;54820:6;54816:15;54809:28;54730:114;:::o;54850:233::-;54990:34;54986:1;54978:6;54974:14;54967:58;55059:16;55054:2;55046:6;55042:15;55035:41;54956:127;:::o;55089:231::-;55229:34;55225:1;55217:6;55213:14;55206:58;55298:14;55293:2;55285:6;55281:15;55274:39;55195:125;:::o;55326:225::-;55466:34;55462:1;55454:6;55450:14;55443:58;55535:8;55530:2;55522:6;55518:15;55511:33;55432:119;:::o;55557:234::-;55697:34;55693:1;55685:6;55681:14;55674:58;55766:17;55761:2;55753:6;55749:15;55742:42;55663:128;:::o;55797:232::-;55937:34;55933:1;55925:6;55921:14;55914:58;56006:15;56001:2;55993:6;55989:15;55982:40;55903:126;:::o;56035:182::-;56175:34;56171:1;56163:6;56159:14;56152:58;56141:76;:::o;56223:221::-;56363:34;56359:1;56351:6;56347:14;56340:58;56432:4;56427:2;56419:6;56415:15;56408:29;56329:115;:::o;56450:122::-;56523:24;56541:5;56523:24;:::i;:::-;56516:5;56513:35;56503:2;;56562:1;56559;56552:12;56503:2;56493:79;:::o;56578:116::-;56648:21;56663:5;56648:21;:::i;:::-;56641:5;56638:32;56628:2;;56684:1;56681;56674:12;56628:2;56618:76;:::o;56700:122::-;56773:24;56791:5;56773:24;:::i;:::-;56766:5;56763:35;56753:2;;56812:1;56809;56802:12;56753:2;56743:79;:::o;56828:120::-;56900:23;56917:5;56900:23;:::i;:::-;56893:5;56890:34;56880:2;;56938:1;56935;56928:12;56880:2;56870:78;:::o;56954:120::-;57026:23;57043:5;57026:23;:::i;:::-;57019:5;57016:34;57006:2;;57064:1;57061;57054:12;57006:2;56996:78;:::o;57080:122::-;57153:24;57171:5;57153:24;:::i;:::-;57146:5;57143:35;57133:2;;57192:1;57189;57182:12;57133:2;57123:79;:::o

Swarm Source

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