ETH Price: $3,093.15 (+1.06%)
Gas: 5 Gwei

Token

Yedolegacy (YLGCY)
 

Overview

Max Total Supply

728 YLGCY

Holders

358

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 YLGCY
0xf92d1b64b01898ac22e450c301e61be4cd0bfcc0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Yedolegacy

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-23
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/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/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/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/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/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/ERC165.sol



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol



pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: contracts/Yedolegacy.sol


pragma solidity ^0.8.0;






contract Yedolegacy is EIP712, ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;

    struct FeesWallets {
        address wallet;
        uint256 fees;
    }

    FeesWallets[] public feesWallets;

    bool public isBaseUrlFrozen = false;
    string public unrevealedTokenUri =
        "ipfs://QmYo4oUxavCjvwqQgrtNo5CussY4RffmDhNdA1azp8cn2v";
    bool public isRevealed = false;
    uint256 public startingIndex = 0;

    bool public saleIsActive = false;
    bool public whitelistSaleIsActive = false;
    bool public freeTokenIsActive = false;
    string private _baseURIextended;

    uint256 public tokenPrice = 0.07 ether;

    uint256 public privateDropIndex = 0;

    uint256 public constant MAX_SUPPLY = 4899;
    uint256 public constant MAX_PRIVATE_SUPPLY = 50;
    uint256 public constant MAX_PUBLIC_MINT_PER_TRANSACTION = 10;
    uint256 public constant MAX_PUBLIC_MINT_PER_TRANSACTION_WHITELIST = 7;

    string private constant SIGNING_DOMAIN = "Yedo";
    string private constant SIGNATURE_VERSION = "1";

    mapping(address => bool) public freeClaimeds;

    address private whiteListeSigner =
        0xaaaaA22ADAC5F89E965e271C33F52e2545A0231e;

    constructor()
        ERC721("Yedolegacy", "YLGCY")
        EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION)
    {
        // Smartcontract Dev fees 2.8%
        feesWallets.push(
            FeesWallets(0xffe6788BE411C4353B3b2c546D0401D4d8B2b3eD, 280)
        );

        // Partner Fees 5%
        feesWallets.push(
            FeesWallets(0x92178Cdcf11E9f77F378503D05415D8BEb9E7bcF, 500)
        );
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (!isRevealed) {
            return unrevealedTokenUri;
        }

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

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function setTokenPrice(uint256 price_) external onlyOwner {
        tokenPrice = price_;
    }

    function setWhiteListSigner(address signer) external onlyOwner {
        whiteListeSigner = signer;
    }

    function freezeBaseUrl() external onlyOwner {
        isBaseUrlFrozen = true;
    }

    function reveal(string memory baseUrl_) external onlyOwner {
        require(!isRevealed);
        startingIndex =
            uint256(
                keccak256(abi.encodePacked(block.difficulty, block.timestamp))
            ) %
            MAX_SUPPLY;
        _baseURIextended = baseUrl_;
        isRevealed = true;
    }

    function setUnrevealedURI(string memory unrevealedTokenUri_)
        external
        onlyOwner
    {
        unrevealedTokenUri = unrevealedTokenUri_;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        require(!isBaseUrlFrozen);
        _baseURIextended = baseURI_;
    }

    function setSaleState(bool newState) public onlyOwner {
        saleIsActive = newState;
    }

    function setFreeTokensState(bool newState) public onlyOwner {
        freeTokenIsActive = newState;
    }

    function setWhitelisteSaleState(bool newState) public onlyOwner {
        whitelistSaleIsActive = newState;
    }

    function addFeesWallet(address wallet, uint256 feesPercentageX100)
        public
        onlyOwner
    {
        uint256 totalFees = 0;
        for (uint256 i = 0; i < feesWallets.length; i++) {
            totalFees += feesWallets[i].fees;
        }
        require(totalFees + feesPercentageX100 < 10000);
        feesWallets.push(FeesWallets(wallet, feesPercentageX100));
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        for (uint256 i = 0; i < feesWallets.length; i++) {
            uint256 fee = (balance * feesWallets[i].fees) / 10000;
            // We don't use transfer because any fail would cause funds to be locked forever
            payable(feesWallets[i].wallet).call{value: fee}("");
        }
        payable(msg.sender).call{value: address(this).balance}("");
    }

    function buyPrivateTokens(address[] memory _to) public onlyOwner {
        uint256 ts = totalSupply();
        for (uint256 i = 0; i < _to.length; i++) {
            privateDropIndex += 1;
            require(privateDropIndex <= MAX_PRIVATE_SUPPLY, "private sale max");
            _safeMint(_to[i], ts + i);
        }
    }

    function buyTokens(uint256 numberOfTokens) public payable {
        require(saleIsActive, "sale not open");
        require(
            numberOfTokens <= MAX_PUBLIC_MINT_PER_TRANSACTION,
            "too many token per transaction"
        );
        applyBuyToken(numberOfTokens);
    }

    function applyBuyToken(uint256 numberOfTokens) private {
        uint256 ts = totalSupply();
        require(ts + numberOfTokens <= MAX_SUPPLY, "not enough supply");
        require(
            tokenPrice * numberOfTokens <= msg.value,
            "invalid ethers sent"
        );
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function claimFreeTokens(uint256 numberOfTokens, bytes calldata signature)
        public
    {
        require(freeTokenIsActive, "Free claim not open");
        require(freeClaimeds[msg.sender] == false, "already claimed");
        verifyFreeSignature(signature, msg.sender, numberOfTokens);
        uint256 ts = totalSupply();
        require(ts + numberOfTokens <= MAX_SUPPLY, "not enough supply");
        freeClaimeds[msg.sender] = true;
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
        }
    }

    function verifyFreeSignature(
        bytes calldata signature,
        address targetWallet,
        uint256 numberOfTokens
    ) internal view {
        bytes32 digest = hashFreeSignature(targetWallet, numberOfTokens);
        address result = ECDSA.recover(digest, signature);
        require(result == whiteListeSigner, "bad signature");
    }

    function hashFreeSignature(address targetWallet, uint256 max)
        internal
        view
        returns (bytes32)
    {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256("Ticket(address wallet,uint256 max)"),
                        targetWallet,
                        max
                    )
                )
            );
    }

    function buyTokenWithWhiteList(
        uint256 numberOfTokens,
        bytes calldata signature
    ) public payable {
        require(whitelistSaleIsActive, "whitelist sale not open");
        require(
            numberOfTokens <= MAX_PUBLIC_MINT_PER_TRANSACTION_WHITELIST,
            "too many token per transaction"
        );
        verifyWhitelistSignature(signature, msg.sender);
        applyBuyToken(numberOfTokens);
    }

    function verifyWhitelistSignature(
        bytes calldata signature,
        address targetWallet
    ) internal view {
        bytes32 digest = hashWhitelisteSignature(targetWallet);
        address result = ECDSA.recover(digest, signature);
        require(result == whiteListeSigner, "bad signature");
    }

    function hashWhitelisteSignature(address targetWallet)
        internal
        view
        returns (bytes32)
    {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256("Ticket(address wallet)"),
                        targetWallet
                    )
                )
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PRIVATE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT_PER_TRANSACTION_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"feesPercentageX100","type":"uint256"}],"name":"addFeesWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"buyPrivateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyTokenWithWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimFreeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feesWallets","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"fees","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeClaimeds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeTokenIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseUrl","outputs":[],"stateMutability":"nonpayable","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":"isBaseUrlFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","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":"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":"privateDropIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUrl_","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setFreeTokensState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedTokenUri_","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setWhiteListSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setWhitelisteSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"tokenPrice","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":"unrevealedTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526000600c60006101000a81548160ff0219169083151502179055506040518060600160405280603581526020016200676460359139600d9080519060200190620000519291906200056d565b506000600e60006101000a81548160ff0219169083151502179055506000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff02191690831515021790555066f8b0a10e470000601255600060135573aaaaa22adac5f89e965e271c33f52e2545a0231e601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013557600080fd5b506040518060400160405280600a81526020017f5965646f6c6567616379000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f594c4743590000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5965646f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620002768184846200046360201b60201c565b6080818152505080610100818152505050505050508160009080519060200190620002a39291906200056d565b508060019080519060200190620002bc9291906200056d565b505050620002df620002d36200049f60201b60201c565b620004a760201b60201c565b600b604051806040016040528073ffe6788be411c4353b3b2c546d0401d4d8b2b3ed73ffffffffffffffffffffffffffffffffffffffff168152602001610118815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050600b60405180604001604052807392178cdcf11e9f77f378503d05415d8beb9e7bcf73ffffffffffffffffffffffffffffffffffffffff1681526020016101f4815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550506200075a565b600083838346306040516020016200048095949392919062000650565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200057b90620006f5565b90600052602060002090601f0160209004810192826200059f5760008555620005eb565b82601f10620005ba57805160ff1916838001178555620005eb565b82800160010185558215620005eb579182015b82811115620005ea578251825591602001919060010190620005cd565b5b509050620005fa9190620005fe565b5090565b5b8082111562000619576000816000905550600101620005ff565b5090565b6200062881620006ad565b82525050565b6200063981620006c1565b82525050565b6200064a81620006eb565b82525050565b600060a0820190506200066760008301886200062e565b6200067660208301876200062e565b6200068560408301866200062e565b6200069460608301856200063f565b620006a360808301846200061d565b9695505050505050565b6000620006ba82620006cb565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200070e57607f821691505b602082108114156200072557620007246200072b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160e05161010051615fc56200079f6000396000613dec01526000613e2e01526000613e0d01526000613d9901526000613dc10152615fc56000f3fe6080604052600436106102ae5760003560e01c8063577b9e3111610175578063a22cb465116100dc578063ce44055311610095578063eb8d24441161006f578063eb8d244414610a7f578063ef38bece14610aaa578063f2fde38b14610ad5578063fe2c7fee14610afe576102ae565b8063ce440553146109f0578063e985e9c514610a19578063ea95ec7014610a56576102ae565b8063a22cb465146108d0578063b88d4fde146108f9578063c3a3e90914610922578063c4e370951461095f578063c87b56dd14610988578063cb774d47146109c5576102ae565b80637ff9b5961161012e5780637ff9b596146107df57806384bdb6e01461080a5780638da5cb5b1461083357806391dffd751461085e57806395d89b411461087a5780639dcacf24146108a5576102ae565b8063577b9e31146106d35780636352211e146106fc5780636a61e5fc1461073957806370a0823114610762578063715018a61461079f5780637d53f26d146107b6576102ae565b806332cb6b0c116102195780634432560a116101d25780634432560a146105d757806346764cd6146106025780634c261247146106195780634f6ccce71461064257806354214f691461067f57806355f804b3146106aa576102ae565b806332cb6b0c146104e7578063352567a2146105125780633610724e1461053d5780633854cb07146105595780633ccfd60b1461059757806342842e0e146105ae576102ae565b806310b5454d1161026b57806310b5454d146103d55780631511d02a1461040057806318160ddd1461042b57806323b872dd146104565780632e9231ab1461047f5780632f745c59146104aa576102ae565b806301ffc9a7146102b357806306c536ab146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630b690d05146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614539565b610b27565b6040516102e79190614d34565b60405180910390f35b3480156102fc57600080fd5b50610305610b39565b6040516103129190614e47565b60405180910390f35b34801561032757600080fd5b50610330610bc7565b60405161033d9190614e47565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906145dc565b610c59565b60405161037a9190614ca4565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190614483565b610cde565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190614483565b610df6565b005b3480156103e157600080fd5b506103ea610f91565b6040516103f79190614d34565b60405180910390f35b34801561040c57600080fd5b50610415610fa4565b6040516104229190614d34565b60405180910390f35b34801561043757600080fd5b50610440610fb7565b60405161044d9190615249565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061436d565b610fc4565b005b34801561048b57600080fd5b50610494611024565b6040516104a19190615249565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190614483565b611029565b6040516104de9190615249565b60405180910390f35b3480156104f357600080fd5b506104fc6110ce565b6040516105099190615249565b60405180910390f35b34801561051e57600080fd5b506105276110d4565b6040516105349190615249565b60405180910390f35b610557600480360381019061055291906145dc565b6110d9565b005b34801561056557600080fd5b50610580600480360381019061057b91906145dc565b611178565b60405161058e929190614d0b565b60405180910390f35b3480156105a357600080fd5b506105ac6111cc565b005b3480156105ba57600080fd5b506105d560048036038101906105d0919061436d565b6113ce565b005b3480156105e357600080fd5b506105ec6113ee565b6040516105f99190615249565b60405180910390f35b34801561060e57600080fd5b506106176113f4565b005b34801561062557600080fd5b50610640600480360381019061063b9190614593565b61148d565b005b34801561064e57600080fd5b50610669600480360381019061066491906145dc565b611597565b6040516106769190615249565b60405180910390f35b34801561068b57600080fd5b50610694611608565b6040516106a19190614d34565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190614593565b61161b565b005b3480156106df57600080fd5b506106fa60048036038101906106f5919061450c565b6116cb565b005b34801561070857600080fd5b50610723600480360381019061071e91906145dc565b611764565b6040516107309190614ca4565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906145dc565b611816565b005b34801561076e57600080fd5b5061078960048036038101906107849190614300565b61189c565b6040516107969190615249565b60405180910390f35b3480156107ab57600080fd5b506107b4611954565b005b3480156107c257600080fd5b506107dd60048036038101906107d8919061450c565b6119dc565b005b3480156107eb57600080fd5b506107f4611a75565b6040516108019190615249565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c9190614300565b611a7b565b005b34801561083f57600080fd5b50610848611b3b565b6040516108559190614ca4565b60405180910390f35b61087860048036038101906108739190614609565b611b65565b005b34801561088657600080fd5b5061088f611c11565b60405161089c9190614e47565b60405180910390f35b3480156108b157600080fd5b506108ba611ca3565b6040516108c79190614d34565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190614443565b611cb6565b005b34801561090557600080fd5b50610920600480360381019061091b91906143c0565b611e37565b005b34801561092e57600080fd5b5061094960048036038101906109449190614300565b611e99565b6040516109569190614d34565b60405180910390f35b34801561096b57600080fd5b506109866004803603810190610981919061450c565b611eb9565b005b34801561099457600080fd5b506109af60048036038101906109aa91906145dc565b611f52565b6040516109bc9190614e47565b60405180910390f35b3480156109d157600080fd5b506109da6120ba565b6040516109e79190615249565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614609565b6120c0565b005b348015610a2557600080fd5b50610a406004803603810190610a3b919061432d565b61229c565b604051610a4d9190614d34565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a7891906144c3565b612330565b005b348015610a8b57600080fd5b50610a9461246b565b604051610aa19190614d34565b60405180910390f35b348015610ab657600080fd5b50610abf61247e565b604051610acc9190615249565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af79190614300565b612483565b005b348015610b0a57600080fd5b50610b256004803603810190610b209190614593565b61257b565b005b6000610b3282612611565b9050919050565b600d8054610b4690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7290615547565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505081565b606060008054610bd690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0290615547565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b5050505050905090565b6000610c648261268b565b610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a906150e9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce982611764565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190615189565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d796126f7565b73ffffffffffffffffffffffffffffffffffffffff161480610da85750610da781610da26126f7565b61229c565b5b610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90615049565b60405180910390fd5b610df183836126ff565b505050565b610dfe6126f7565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990615109565b60405180910390fd5b6000805b600b80549050811015610ec957600b8181548110610e9757610e96615723565b5b90600052602060002090600202016001015482610eb49190615365565b91508080610ec1906155aa565b915050610e76565b506127108282610ed99190615365565b10610ee357600080fd5b600b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050505050565b601060019054906101000a900460ff1681565b601060029054906101000a900460ff1681565b6000600880549050905090565b610fd5610fcf6126f7565b826127b8565b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b906151e9565b60405180910390fd5b61101f838383612896565b505050565b600a81565b60006110348361189c565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90614ec9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61132381565b603281565b601060009054906101000a900460ff16611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90615169565b60405180910390fd5b600a81111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390615009565b60405180910390fd5b61117581612af2565b50565b600b818154811061118857600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6111d46126f7565b73ffffffffffffffffffffffffffffffffffffffff166111f2611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90615109565b60405180910390fd5b600047905060005b600b80549050811015611361576000612710600b838154811061127657611275615723565b5b9060005260206000209060020201600101548461129391906153ec565b61129d91906153bb565b9050600b82815481106112b3576112b2615723565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161130890614c63565b60006040518083038185875af1925050503d8060008114611345576040519150601f19603f3d011682016040523d82523d6000602084013e61134a565b606091505b505050508080611359906155aa565b915050611250565b503373ffffffffffffffffffffffffffffffffffffffff164760405161138690614c63565b60006040518083038185875af1925050503d80600081146113c3576040519150601f19603f3d011682016040523d82523d6000602084013e6113c8565b606091505b50505050565b6113e983838360405180602001604052806000815250611e37565b505050565b60135481565b6113fc6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661141a611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790615109565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6114956126f7565b73ffffffffffffffffffffffffffffffffffffffff166114b3611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090615109565b60405180910390fd5b600e60009054906101000a900460ff161561152357600080fd5b6113234442604051602001611539929190614c78565b6040516020818303038152906040528051906020012060001c61155c9190615607565b600f819055508060119080519060200190611578929190614020565b506001600e60006101000a81548160ff02191690831515021790555050565b60006115a1610fb7565b82106115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990615209565b60405180910390fd5b600882815481106115f6576115f5615723565b5b90600052602060002001549050919050565b600e60009054906101000a900460ff1681565b6116236126f7565b73ffffffffffffffffffffffffffffffffffffffff16611641611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90615109565b60405180910390fd5b600c60009054906101000a900460ff16156116b157600080fd5b80601190805190602001906116c7929190614020565b5050565b6116d36126f7565b73ffffffffffffffffffffffffffffffffffffffff166116f1611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90615109565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490615089565b60405180910390fd5b80915050919050565b61181e6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661183c611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990615109565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490615069565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61195c6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661197a611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790615109565b60405180910390fd5b6119da6000612bd6565b565b6119e46126f7565b73ffffffffffffffffffffffffffffffffffffffff16611a02611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90615109565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b60125481565b611a836126f7565b73ffffffffffffffffffffffffffffffffffffffff16611aa1611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90615109565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060019054906101000a900460ff16611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab90614e89565b60405180910390fd5b6007831115611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90615009565b60405180910390fd5b611c03828233612c9c565b611c0c83612af2565b505050565b606060018054611c2090615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4c90615547565b8015611c995780601f10611c6e57610100808354040283529160200191611c99565b820191906000526020600020905b815481529060010190602001808311611c7c57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b611cbe6126f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614f89565b60405180910390fd5b8060056000611d396126f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611de66126f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2b9190614d34565b60405180910390a35050565b611e48611e426126f7565b836127b8565b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e906151e9565b60405180910390fd5b611e9384848484612d92565b50505050565b60146020528060005260406000206000915054906101000a900460ff1681565b611ec16126f7565b73ffffffffffffffffffffffffffffffffffffffff16611edf611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90615109565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611f5d8261268b565b611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390615149565b60405180910390fd5b600e60009054906101000a900460ff1661204257600d8054611fbd90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe990615547565b80156120365780601f1061200b57610100808354040283529160200191612036565b820191906000526020600020905b81548152906001019060200180831161201957829003601f168201915b505050505090506120b5565b600061204c612dee565b9050600081511161206c57604051806020016040528060008152506120b1565b8061209061132385600f546120819190615365565b61208b9190615607565b612e80565b6040516020016120a1929190614c08565b6040516020818303038152906040525b9150505b919050565b600f5481565b601060029054906101000a900460ff1661210f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612106906151a9565b60405180910390fd5b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990614f49565b60405180910390fd5b6121ae82823386612fe1565b60006121b8610fb7565b905061132384826121c99190615365565b111561220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906151c9565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b848110156122955761228233828461227d9190615365565b6130d9565b808061228d906155aa565b915050612265565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123386126f7565b73ffffffffffffffffffffffffffffffffffffffff16612356611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390615109565b60405180910390fd5b60006123b6610fb7565b905060005b8251811015612466576001601360008282546123d79190615365565b9250508190555060326013541115612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241b90615229565b60405180910390fd5b61245383828151811061243a57612439615723565b5b6020026020010151828461244e9190615365565b6130d9565b808061245e906155aa565b9150506123bb565b505050565b601060009054906101000a900460ff1681565b600781565b61248b6126f7565b73ffffffffffffffffffffffffffffffffffffffff166124a9611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690615109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690614f09565b60405180910390fd5b61257881612bd6565b50565b6125836126f7565b73ffffffffffffffffffffffffffffffffffffffff166125a1611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90615109565b60405180910390fd5b80600d908051906020019061260d929190614020565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126845750612683826130f7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661277283611764565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127c38261268b565b612802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f990614fe9565b60405180910390fd5b600061280d83611764565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061287c57508373ffffffffffffffffffffffffffffffffffffffff1661286484610c59565b73ffffffffffffffffffffffffffffffffffffffff16145b8061288d575061288c818561229c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128b682611764565b73ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390615129565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297390614f69565b60405180910390fd5b6129878383836131d9565b6129926000826126ff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e29190615446565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a399190615365565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612afc610fb7565b90506113238282612b0d9190615365565b1115612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b45906151c9565b60405180910390fd5b3482601254612b5d91906153ec565b1115612b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9590615029565b60405180910390fd5b60005b82811015612bd157612bbe338284612bb99190615365565b6130d9565b8080612bc9906155aa565b915050612ba1565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ca7826131e9565b90506000612cf98286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613243565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8290614fa9565b60405180910390fd5b5050505050565b612d9d848484612896565b612da98484848461326a565b612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf90614ee9565b60405180910390fd5b50505050565b606060118054612dfd90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2990615547565b8015612e765780601f10612e4b57610100808354040283529160200191612e76565b820191906000526020600020905b815481529060010190602001808311612e5957829003601f168201915b5050505050905090565b60606000821415612ec8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fdc565b600082905060005b60008214612efa578080612ee3906155aa565b915050600a82612ef391906153bb565b9150612ed0565b60008167ffffffffffffffff811115612f1657612f15615752565b5b6040519080825280601f01601f191660200182016040528015612f485781602001600182028036833780820191505090505b5090505b60008514612fd557600182612f619190615446565b9150600a85612f709190615607565b6030612f7c9190615365565b60f81b818381518110612f9257612f91615723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fce91906153bb565b9450612f4c565b8093505050505b919050565b6000612fed8383613401565b9050600061303f8287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613243565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c890614fa9565b60405180910390fd5b505050505050565b6130f382826040518060200160405280600081525061345e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131d257506131d1826134b9565b5b9050919050565b6131e4838383613523565b505050565b600061323c7fc416440a2418a75caecf2a259180d8a5180c8747baedf17c709cd30fc4f2c20483604051602001613221929190614d4f565b60405160208183030381529060405280519060200120613637565b9050919050565b60008060006132528585613651565b9150915061325f816136d4565b819250505092915050565b600061328b8473ffffffffffffffffffffffffffffffffffffffff166138a9565b156133f4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132b46126f7565b8786866040518563ffffffff1660e01b81526004016132d69493929190614cbf565b602060405180830381600087803b1580156132f057600080fd5b505af192505050801561332157506040513d601f19601f8201168201806040525081019061331e9190614566565b60015b6133a4573d8060008114613351576040519150601f19603f3d011682016040523d82523d6000602084013e613356565b606091505b5060008151141561339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339390614ee9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133f9565b600190505b949350505050565b60006134567f247dae8b56e40db2df92dd64c8c623ca5ac03751978cbc52c8d7d5d703f889e9848460405160200161343b93929190614d78565b60405160208183030381529060405280519060200120613637565b905092915050565b61346883836138bc565b613475600084848461326a565b6134b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ab90614ee9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61352e838383613a8a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135715761356c81613a8f565b6135b0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135af576135ae8382613ad8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135f3576135ee81613c45565b613632565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613631576136308282613d16565b5b5b505050565b600061364a613644613d95565b83613e58565b9050919050565b6000806041835114156136935760008060006020860151925060408601519150606086015160001a905061368787828585613e8b565b945094505050506136cd565b6040835114156136c45760008060208501519150604085015190506136b9868383613f98565b9350935050506136cd565b60006002915091505b9250929050565b600060048111156136e8576136e7615696565b5b8160048111156136fb576136fa615696565b5b1415613706576138a6565b6001600481111561371a57613719615696565b5b81600481111561372d5761372c615696565b5b141561376e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376590614e69565b60405180910390fd5b6002600481111561378257613781615696565b5b81600481111561379557613794615696565b5b14156137d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137cd90614ea9565b60405180910390fd5b600360048111156137ea576137e9615696565b5b8160048111156137fd576137fc615696565b5b141561383e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383590614fc9565b60405180910390fd5b60048081111561385157613850615696565b5b81600481111561386457613863615696565b5b14156138a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389c906150a9565b60405180910390fd5b5b50565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561392c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613923906150c9565b60405180910390fd5b6139358161268b565b15613975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396c90614f29565b60405180910390fd5b613981600083836131d9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139d19190615365565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ae58461189c565b613aef9190615446565b9050600060076000848152602001908152602001600020549050818114613bd4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c599190615446565b9050600060096000848152602001908152602001600020549050600060088381548110613c8957613c88615723565b5b906000526020600020015490508060088381548110613cab57613caa615723565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cfa57613cf96156f4565b5b6001900381819060005260206000200160009055905550505050565b6000613d218361189c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415613de7577f00000000000000000000000000000000000000000000000000000000000000009050613e55565b613e527f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613fe6565b90505b90565b60008282604051602001613e6d929190614c2c565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613ec6576000600391509150613f8f565b601b8560ff1614158015613ede5750601c8560ff1614155b15613ef0576000600491509150613f8f565b600060018787878760405160008152602001604052604051613f159493929190614e02565b6020604051602081039080840390855afa158015613f37573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613f8657600060019250925050613f8f565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613fd887828885613e8b565b935093505050935093915050565b60008383834630604051602001614001959493929190614daf565b6040516020818303038152906040528051906020012090509392505050565b82805461402c90615547565b90600052602060002090601f01602090048101928261404e5760008555614095565b82601f1061406757805160ff1916838001178555614095565b82800160010185558215614095579182015b82811115614094578251825591602001919060010190614079565b5b5090506140a291906140a6565b5090565b5b808211156140bf5760008160009055506001016140a7565b5090565b60006140d66140d184615289565b615264565b905080838252602082019050828560208602820111156140f9576140f861578b565b5b60005b85811015614129578161410f88826141b7565b8452602084019350602083019250506001810190506140fc565b5050509392505050565b6000614146614141846152b5565b615264565b90508281526020810184848401111561416257614161615790565b5b61416d848285615505565b509392505050565b6000614188614183846152e6565b615264565b9050828152602081018484840111156141a4576141a3615790565b5b6141af848285615505565b509392505050565b6000813590506141c681615f33565b92915050565b600082601f8301126141e1576141e0615786565b5b81356141f18482602086016140c3565b91505092915050565b60008135905061420981615f4a565b92915050565b60008135905061421e81615f61565b92915050565b60008151905061423381615f61565b92915050565b60008083601f84011261424f5761424e615786565b5b8235905067ffffffffffffffff81111561426c5761426b615781565b5b6020830191508360018202830111156142885761428761578b565b5b9250929050565b600082601f8301126142a4576142a3615786565b5b81356142b4848260208601614133565b91505092915050565b600082601f8301126142d2576142d1615786565b5b81356142e2848260208601614175565b91505092915050565b6000813590506142fa81615f78565b92915050565b6000602082840312156143165761431561579a565b5b6000614324848285016141b7565b91505092915050565b600080604083850312156143445761434361579a565b5b6000614352858286016141b7565b9250506020614363858286016141b7565b9150509250929050565b6000806000606084860312156143865761438561579a565b5b6000614394868287016141b7565b93505060206143a5868287016141b7565b92505060406143b6868287016142eb565b9150509250925092565b600080600080608085870312156143da576143d961579a565b5b60006143e8878288016141b7565b94505060206143f9878288016141b7565b935050604061440a878288016142eb565b925050606085013567ffffffffffffffff81111561442b5761442a615795565b5b6144378782880161428f565b91505092959194509250565b6000806040838503121561445a5761445961579a565b5b6000614468858286016141b7565b9250506020614479858286016141fa565b9150509250929050565b6000806040838503121561449a5761449961579a565b5b60006144a8858286016141b7565b92505060206144b9858286016142eb565b9150509250929050565b6000602082840312156144d9576144d861579a565b5b600082013567ffffffffffffffff8111156144f7576144f6615795565b5b614503848285016141cc565b91505092915050565b6000602082840312156145225761452161579a565b5b6000614530848285016141fa565b91505092915050565b60006020828403121561454f5761454e61579a565b5b600061455d8482850161420f565b91505092915050565b60006020828403121561457c5761457b61579a565b5b600061458a84828501614224565b91505092915050565b6000602082840312156145a9576145a861579a565b5b600082013567ffffffffffffffff8111156145c7576145c6615795565b5b6145d3848285016142bd565b91505092915050565b6000602082840312156145f2576145f161579a565b5b6000614600848285016142eb565b91505092915050565b6000806000604084860312156146225761462161579a565b5b6000614630868287016142eb565b935050602084013567ffffffffffffffff81111561465157614650615795565b5b61465d86828701614239565b92509250509250925092565b6146728161547a565b82525050565b6146818161548c565b82525050565b61469081615498565b82525050565b6146a76146a282615498565b6155f3565b82525050565b60006146b882615317565b6146c2818561532d565b93506146d2818560208601615514565b6146db8161579f565b840191505092915050565b60006146f182615322565b6146fb8185615349565b935061470b818560208601615514565b6147148161579f565b840191505092915050565b600061472a82615322565b614734818561535a565b9350614744818560208601615514565b80840191505092915050565b600061475d601883615349565b9150614768826157b0565b602082019050919050565b6000614780601783615349565b915061478b826157d9565b602082019050919050565b60006147a3601f83615349565b91506147ae82615802565b602082019050919050565b60006147c6602b83615349565b91506147d18261582b565b604082019050919050565b60006147e9603283615349565b91506147f48261587a565b604082019050919050565b600061480c602683615349565b9150614817826158c9565b604082019050919050565b600061482f601c83615349565b915061483a82615918565b602082019050919050565b600061485260028361535a565b915061485d82615941565b600282019050919050565b6000614875600f83615349565b91506148808261596a565b602082019050919050565b6000614898602483615349565b91506148a382615993565b604082019050919050565b60006148bb601983615349565b91506148c6826159e2565b602082019050919050565b60006148de600d83615349565b91506148e982615a0b565b602082019050919050565b6000614901602283615349565b915061490c82615a34565b604082019050919050565b6000614924602c83615349565b915061492f82615a83565b604082019050919050565b6000614947601e83615349565b915061495282615ad2565b602082019050919050565b600061496a601383615349565b915061497582615afb565b602082019050919050565b600061498d603883615349565b915061499882615b24565b604082019050919050565b60006149b0602a83615349565b91506149bb82615b73565b604082019050919050565b60006149d3602983615349565b91506149de82615bc2565b604082019050919050565b60006149f6602283615349565b9150614a0182615c11565b604082019050919050565b6000614a19602083615349565b9150614a2482615c60565b602082019050919050565b6000614a3c602c83615349565b9150614a4782615c89565b604082019050919050565b6000614a5f602083615349565b9150614a6a82615cd8565b602082019050919050565b6000614a82602983615349565b9150614a8d82615d01565b604082019050919050565b6000614aa5602f83615349565b9150614ab082615d50565b604082019050919050565b6000614ac8600d83615349565b9150614ad382615d9f565b602082019050919050565b6000614aeb602183615349565b9150614af682615dc8565b604082019050919050565b6000614b0e601383615349565b9150614b1982615e17565b602082019050919050565b6000614b31601183615349565b9150614b3c82615e40565b602082019050919050565b6000614b5460008361533e565b9150614b5f82615e69565b600082019050919050565b6000614b77603183615349565b9150614b8282615e6c565b604082019050919050565b6000614b9a602c83615349565b9150614ba582615ebb565b604082019050919050565b6000614bbd601083615349565b9150614bc882615f0a565b602082019050919050565b614bdc816154ee565b82525050565b614bf3614bee826154ee565b6155fd565b82525050565b614c02816154f8565b82525050565b6000614c14828561471f565b9150614c20828461471f565b91508190509392505050565b6000614c3782614845565b9150614c438285614696565b602082019150614c538284614696565b6020820191508190509392505050565b6000614c6e82614b47565b9150819050919050565b6000614c848285614be2565b602082019150614c948284614be2565b6020820191508190509392505050565b6000602082019050614cb96000830184614669565b92915050565b6000608082019050614cd46000830187614669565b614ce16020830186614669565b614cee6040830185614bd3565b8181036060830152614d0081846146ad565b905095945050505050565b6000604082019050614d206000830185614669565b614d2d6020830184614bd3565b9392505050565b6000602082019050614d496000830184614678565b92915050565b6000604082019050614d646000830185614687565b614d716020830184614669565b9392505050565b6000606082019050614d8d6000830186614687565b614d9a6020830185614669565b614da76040830184614bd3565b949350505050565b600060a082019050614dc46000830188614687565b614dd16020830187614687565b614dde6040830186614687565b614deb6060830185614bd3565b614df86080830184614669565b9695505050505050565b6000608082019050614e176000830187614687565b614e246020830186614bf9565b614e316040830185614687565b614e3e6060830184614687565b95945050505050565b60006020820190508181036000830152614e6181846146e6565b905092915050565b60006020820190508181036000830152614e8281614750565b9050919050565b60006020820190508181036000830152614ea281614773565b9050919050565b60006020820190508181036000830152614ec281614796565b9050919050565b60006020820190508181036000830152614ee2816147b9565b9050919050565b60006020820190508181036000830152614f02816147dc565b9050919050565b60006020820190508181036000830152614f22816147ff565b9050919050565b60006020820190508181036000830152614f4281614822565b9050919050565b60006020820190508181036000830152614f6281614868565b9050919050565b60006020820190508181036000830152614f828161488b565b9050919050565b60006020820190508181036000830152614fa2816148ae565b9050919050565b60006020820190508181036000830152614fc2816148d1565b9050919050565b60006020820190508181036000830152614fe2816148f4565b9050919050565b6000602082019050818103600083015261500281614917565b9050919050565b600060208201905081810360008301526150228161493a565b9050919050565b600060208201905081810360008301526150428161495d565b9050919050565b6000602082019050818103600083015261506281614980565b9050919050565b60006020820190508181036000830152615082816149a3565b9050919050565b600060208201905081810360008301526150a2816149c6565b9050919050565b600060208201905081810360008301526150c2816149e9565b9050919050565b600060208201905081810360008301526150e281614a0c565b9050919050565b6000602082019050818103600083015261510281614a2f565b9050919050565b6000602082019050818103600083015261512281614a52565b9050919050565b6000602082019050818103600083015261514281614a75565b9050919050565b6000602082019050818103600083015261516281614a98565b9050919050565b6000602082019050818103600083015261518281614abb565b9050919050565b600060208201905081810360008301526151a281614ade565b9050919050565b600060208201905081810360008301526151c281614b01565b9050919050565b600060208201905081810360008301526151e281614b24565b9050919050565b6000602082019050818103600083015261520281614b6a565b9050919050565b6000602082019050818103600083015261522281614b8d565b9050919050565b6000602082019050818103600083015261524281614bb0565b9050919050565b600060208201905061525e6000830184614bd3565b92915050565b600061526e61527f565b905061527a8282615579565b919050565b6000604051905090565b600067ffffffffffffffff8211156152a4576152a3615752565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152d0576152cf615752565b5b6152d98261579f565b9050602081019050919050565b600067ffffffffffffffff82111561530157615300615752565b5b61530a8261579f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615370826154ee565b915061537b836154ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153b0576153af615638565b5b828201905092915050565b60006153c6826154ee565b91506153d1836154ee565b9250826153e1576153e0615667565b5b828204905092915050565b60006153f7826154ee565b9150615402836154ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543b5761543a615638565b5b828202905092915050565b6000615451826154ee565b915061545c836154ee565b92508282101561546f5761546e615638565b5b828203905092915050565b6000615485826154ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b60208210811415615573576155726156c5565b5b50919050565b6155828261579f565b810181811067ffffffffffffffff821117156155a1576155a0615752565b5b80604052505050565b60006155b5826154ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615638565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000615612826154ee565b915061561d836154ee565b92508261562d5761562c615667565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f77686974656c6973742073616c65206e6f74206f70656e000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f626164207369676e617475726500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f746f6f206d616e7920746f6b656e20706572207472616e73616374696f6e0000600082015250565b7f696e76616c6964206574686572732073656e7400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4672656520636c61696d206e6f74206f70656e00000000000000000000000000600082015250565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f707269766174652073616c65206d617800000000000000000000000000000000600082015250565b615f3c8161547a565b8114615f4757600080fd5b50565b615f538161548c565b8114615f5e57600080fd5b50565b615f6a816154a2565b8114615f7557600080fd5b50565b615f81816154ee565b8114615f8c57600080fd5b5056fea26469706673582212208e2e3277dead9634df1741ef16b0a969d846cf8ca1622bc73fe536d50666af2b64736f6c63430008070033697066733a2f2f516d596f346f55786176436a767771516772744e6f354375737359345266666d44684e644131617a7038636e3276

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063577b9e3111610175578063a22cb465116100dc578063ce44055311610095578063eb8d24441161006f578063eb8d244414610a7f578063ef38bece14610aaa578063f2fde38b14610ad5578063fe2c7fee14610afe576102ae565b8063ce440553146109f0578063e985e9c514610a19578063ea95ec7014610a56576102ae565b8063a22cb465146108d0578063b88d4fde146108f9578063c3a3e90914610922578063c4e370951461095f578063c87b56dd14610988578063cb774d47146109c5576102ae565b80637ff9b5961161012e5780637ff9b596146107df57806384bdb6e01461080a5780638da5cb5b1461083357806391dffd751461085e57806395d89b411461087a5780639dcacf24146108a5576102ae565b8063577b9e31146106d35780636352211e146106fc5780636a61e5fc1461073957806370a0823114610762578063715018a61461079f5780637d53f26d146107b6576102ae565b806332cb6b0c116102195780634432560a116101d25780634432560a146105d757806346764cd6146106025780634c261247146106195780634f6ccce71461064257806354214f691461067f57806355f804b3146106aa576102ae565b806332cb6b0c146104e7578063352567a2146105125780633610724e1461053d5780633854cb07146105595780633ccfd60b1461059757806342842e0e146105ae576102ae565b806310b5454d1161026b57806310b5454d146103d55780631511d02a1461040057806318160ddd1461042b57806323b872dd146104565780632e9231ab1461047f5780632f745c59146104aa576102ae565b806301ffc9a7146102b357806306c536ab146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630b690d05146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190614539565b610b27565b6040516102e79190614d34565b60405180910390f35b3480156102fc57600080fd5b50610305610b39565b6040516103129190614e47565b60405180910390f35b34801561032757600080fd5b50610330610bc7565b60405161033d9190614e47565b60405180910390f35b34801561035257600080fd5b5061036d600480360381019061036891906145dc565b610c59565b60405161037a9190614ca4565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190614483565b610cde565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190614483565b610df6565b005b3480156103e157600080fd5b506103ea610f91565b6040516103f79190614d34565b60405180910390f35b34801561040c57600080fd5b50610415610fa4565b6040516104229190614d34565b60405180910390f35b34801561043757600080fd5b50610440610fb7565b60405161044d9190615249565b60405180910390f35b34801561046257600080fd5b5061047d6004803603810190610478919061436d565b610fc4565b005b34801561048b57600080fd5b50610494611024565b6040516104a19190615249565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190614483565b611029565b6040516104de9190615249565b60405180910390f35b3480156104f357600080fd5b506104fc6110ce565b6040516105099190615249565b60405180910390f35b34801561051e57600080fd5b506105276110d4565b6040516105349190615249565b60405180910390f35b610557600480360381019061055291906145dc565b6110d9565b005b34801561056557600080fd5b50610580600480360381019061057b91906145dc565b611178565b60405161058e929190614d0b565b60405180910390f35b3480156105a357600080fd5b506105ac6111cc565b005b3480156105ba57600080fd5b506105d560048036038101906105d0919061436d565b6113ce565b005b3480156105e357600080fd5b506105ec6113ee565b6040516105f99190615249565b60405180910390f35b34801561060e57600080fd5b506106176113f4565b005b34801561062557600080fd5b50610640600480360381019061063b9190614593565b61148d565b005b34801561064e57600080fd5b50610669600480360381019061066491906145dc565b611597565b6040516106769190615249565b60405180910390f35b34801561068b57600080fd5b50610694611608565b6040516106a19190614d34565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190614593565b61161b565b005b3480156106df57600080fd5b506106fa60048036038101906106f5919061450c565b6116cb565b005b34801561070857600080fd5b50610723600480360381019061071e91906145dc565b611764565b6040516107309190614ca4565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906145dc565b611816565b005b34801561076e57600080fd5b5061078960048036038101906107849190614300565b61189c565b6040516107969190615249565b60405180910390f35b3480156107ab57600080fd5b506107b4611954565b005b3480156107c257600080fd5b506107dd60048036038101906107d8919061450c565b6119dc565b005b3480156107eb57600080fd5b506107f4611a75565b6040516108019190615249565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c9190614300565b611a7b565b005b34801561083f57600080fd5b50610848611b3b565b6040516108559190614ca4565b60405180910390f35b61087860048036038101906108739190614609565b611b65565b005b34801561088657600080fd5b5061088f611c11565b60405161089c9190614e47565b60405180910390f35b3480156108b157600080fd5b506108ba611ca3565b6040516108c79190614d34565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190614443565b611cb6565b005b34801561090557600080fd5b50610920600480360381019061091b91906143c0565b611e37565b005b34801561092e57600080fd5b5061094960048036038101906109449190614300565b611e99565b6040516109569190614d34565b60405180910390f35b34801561096b57600080fd5b506109866004803603810190610981919061450c565b611eb9565b005b34801561099457600080fd5b506109af60048036038101906109aa91906145dc565b611f52565b6040516109bc9190614e47565b60405180910390f35b3480156109d157600080fd5b506109da6120ba565b6040516109e79190615249565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190614609565b6120c0565b005b348015610a2557600080fd5b50610a406004803603810190610a3b919061432d565b61229c565b604051610a4d9190614d34565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a7891906144c3565b612330565b005b348015610a8b57600080fd5b50610a9461246b565b604051610aa19190614d34565b60405180910390f35b348015610ab657600080fd5b50610abf61247e565b604051610acc9190615249565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af79190614300565b612483565b005b348015610b0a57600080fd5b50610b256004803603810190610b209190614593565b61257b565b005b6000610b3282612611565b9050919050565b600d8054610b4690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7290615547565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505081565b606060008054610bd690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0290615547565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b5050505050905090565b6000610c648261268b565b610ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9a906150e9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce982611764565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190615189565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d796126f7565b73ffffffffffffffffffffffffffffffffffffffff161480610da85750610da781610da26126f7565b61229c565b5b610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90615049565b60405180910390fd5b610df183836126ff565b505050565b610dfe6126f7565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990615109565b60405180910390fd5b6000805b600b80549050811015610ec957600b8181548110610e9757610e96615723565b5b90600052602060002090600202016001015482610eb49190615365565b91508080610ec1906155aa565b915050610e76565b506127108282610ed99190615365565b10610ee357600080fd5b600b60405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050505050565b601060019054906101000a900460ff1681565b601060029054906101000a900460ff1681565b6000600880549050905090565b610fd5610fcf6126f7565b826127b8565b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b906151e9565b60405180910390fd5b61101f838383612896565b505050565b600a81565b60006110348361189c565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90614ec9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61132381565b603281565b601060009054906101000a900460ff16611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90615169565b60405180910390fd5b600a81111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390615009565b60405180910390fd5b61117581612af2565b50565b600b818154811061118857600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6111d46126f7565b73ffffffffffffffffffffffffffffffffffffffff166111f2611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90615109565b60405180910390fd5b600047905060005b600b80549050811015611361576000612710600b838154811061127657611275615723565b5b9060005260206000209060020201600101548461129391906153ec565b61129d91906153bb565b9050600b82815481106112b3576112b2615723565b5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161130890614c63565b60006040518083038185875af1925050503d8060008114611345576040519150601f19603f3d011682016040523d82523d6000602084013e61134a565b606091505b505050508080611359906155aa565b915050611250565b503373ffffffffffffffffffffffffffffffffffffffff164760405161138690614c63565b60006040518083038185875af1925050503d80600081146113c3576040519150601f19603f3d011682016040523d82523d6000602084013e6113c8565b606091505b50505050565b6113e983838360405180602001604052806000815250611e37565b505050565b60135481565b6113fc6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661141a611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790615109565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b6114956126f7565b73ffffffffffffffffffffffffffffffffffffffff166114b3611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090615109565b60405180910390fd5b600e60009054906101000a900460ff161561152357600080fd5b6113234442604051602001611539929190614c78565b6040516020818303038152906040528051906020012060001c61155c9190615607565b600f819055508060119080519060200190611578929190614020565b506001600e60006101000a81548160ff02191690831515021790555050565b60006115a1610fb7565b82106115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990615209565b60405180910390fd5b600882815481106115f6576115f5615723565b5b90600052602060002001549050919050565b600e60009054906101000a900460ff1681565b6116236126f7565b73ffffffffffffffffffffffffffffffffffffffff16611641611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90615109565b60405180910390fd5b600c60009054906101000a900460ff16156116b157600080fd5b80601190805190602001906116c7929190614020565b5050565b6116d36126f7565b73ffffffffffffffffffffffffffffffffffffffff166116f1611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e90615109565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490615089565b60405180910390fd5b80915050919050565b61181e6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661183c611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990615109565b60405180910390fd5b8060128190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490615069565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61195c6126f7565b73ffffffffffffffffffffffffffffffffffffffff1661197a611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c790615109565b60405180910390fd5b6119da6000612bd6565b565b6119e46126f7565b73ffffffffffffffffffffffffffffffffffffffff16611a02611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90615109565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b60125481565b611a836126f7565b73ffffffffffffffffffffffffffffffffffffffff16611aa1611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90615109565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601060019054906101000a900460ff16611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab90614e89565b60405180910390fd5b6007831115611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90615009565b60405180910390fd5b611c03828233612c9c565b611c0c83612af2565b505050565b606060018054611c2090615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4c90615547565b8015611c995780601f10611c6e57610100808354040283529160200191611c99565b820191906000526020600020905b815481529060010190602001808311611c7c57829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1681565b611cbe6126f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614f89565b60405180910390fd5b8060056000611d396126f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611de66126f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e2b9190614d34565b60405180910390a35050565b611e48611e426126f7565b836127b8565b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e906151e9565b60405180910390fd5b611e9384848484612d92565b50505050565b60146020528060005260406000206000915054906101000a900460ff1681565b611ec16126f7565b73ffffffffffffffffffffffffffffffffffffffff16611edf611b3b565b73ffffffffffffffffffffffffffffffffffffffff1614611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90615109565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611f5d8261268b565b611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390615149565b60405180910390fd5b600e60009054906101000a900460ff1661204257600d8054611fbd90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe990615547565b80156120365780601f1061200b57610100808354040283529160200191612036565b820191906000526020600020905b81548152906001019060200180831161201957829003601f168201915b505050505090506120b5565b600061204c612dee565b9050600081511161206c57604051806020016040528060008152506120b1565b8061209061132385600f546120819190615365565b61208b9190615607565b612e80565b6040516020016120a1929190614c08565b6040516020818303038152906040525b9150505b919050565b600f5481565b601060029054906101000a900460ff1661210f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612106906151a9565b60405180910390fd5b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990614f49565b60405180910390fd5b6121ae82823386612fe1565b60006121b8610fb7565b905061132384826121c99190615365565b111561220a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612201906151c9565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b848110156122955761228233828461227d9190615365565b6130d9565b808061228d906155aa565b915050612265565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123386126f7565b73ffffffffffffffffffffffffffffffffffffffff16612356611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390615109565b60405180910390fd5b60006123b6610fb7565b905060005b8251811015612466576001601360008282546123d79190615365565b9250508190555060326013541115612424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241b90615229565b60405180910390fd5b61245383828151811061243a57612439615723565b5b6020026020010151828461244e9190615365565b6130d9565b808061245e906155aa565b9150506123bb565b505050565b601060009054906101000a900460ff1681565b600781565b61248b6126f7565b73ffffffffffffffffffffffffffffffffffffffff166124a9611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690615109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690614f09565b60405180910390fd5b61257881612bd6565b50565b6125836126f7565b73ffffffffffffffffffffffffffffffffffffffff166125a1611b3b565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90615109565b60405180910390fd5b80600d908051906020019061260d929190614020565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126845750612683826130f7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661277283611764565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127c38261268b565b612802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f990614fe9565b60405180910390fd5b600061280d83611764565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061287c57508373ffffffffffffffffffffffffffffffffffffffff1661286484610c59565b73ffffffffffffffffffffffffffffffffffffffff16145b8061288d575061288c818561229c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128b682611764565b73ffffffffffffffffffffffffffffffffffffffff161461290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390615129565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297390614f69565b60405180910390fd5b6129878383836131d9565b6129926000826126ff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e29190615446565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a399190615365565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612afc610fb7565b90506113238282612b0d9190615365565b1115612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b45906151c9565b60405180910390fd5b3482601254612b5d91906153ec565b1115612b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9590615029565b60405180910390fd5b60005b82811015612bd157612bbe338284612bb99190615365565b6130d9565b8080612bc9906155aa565b915050612ba1565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ca7826131e9565b90506000612cf98286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613243565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8290614fa9565b60405180910390fd5b5050505050565b612d9d848484612896565b612da98484848461326a565b612de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddf90614ee9565b60405180910390fd5b50505050565b606060118054612dfd90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2990615547565b8015612e765780601f10612e4b57610100808354040283529160200191612e76565b820191906000526020600020905b815481529060010190602001808311612e5957829003601f168201915b5050505050905090565b60606000821415612ec8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fdc565b600082905060005b60008214612efa578080612ee3906155aa565b915050600a82612ef391906153bb565b9150612ed0565b60008167ffffffffffffffff811115612f1657612f15615752565b5b6040519080825280601f01601f191660200182016040528015612f485781602001600182028036833780820191505090505b5090505b60008514612fd557600182612f619190615446565b9150600a85612f709190615607565b6030612f7c9190615365565b60f81b818381518110612f9257612f91615723565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fce91906153bb565b9450612f4c565b8093505050505b919050565b6000612fed8383613401565b9050600061303f8287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613243565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c890614fa9565b60405180910390fd5b505050505050565b6130f382826040518060200160405280600081525061345e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131d257506131d1826134b9565b5b9050919050565b6131e4838383613523565b505050565b600061323c7fc416440a2418a75caecf2a259180d8a5180c8747baedf17c709cd30fc4f2c20483604051602001613221929190614d4f565b60405160208183030381529060405280519060200120613637565b9050919050565b60008060006132528585613651565b9150915061325f816136d4565b819250505092915050565b600061328b8473ffffffffffffffffffffffffffffffffffffffff166138a9565b156133f4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132b46126f7565b8786866040518563ffffffff1660e01b81526004016132d69493929190614cbf565b602060405180830381600087803b1580156132f057600080fd5b505af192505050801561332157506040513d601f19601f8201168201806040525081019061331e9190614566565b60015b6133a4573d8060008114613351576040519150601f19603f3d011682016040523d82523d6000602084013e613356565b606091505b5060008151141561339c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339390614ee9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133f9565b600190505b949350505050565b60006134567f247dae8b56e40db2df92dd64c8c623ca5ac03751978cbc52c8d7d5d703f889e9848460405160200161343b93929190614d78565b60405160208183030381529060405280519060200120613637565b905092915050565b61346883836138bc565b613475600084848461326a565b6134b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ab90614ee9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61352e838383613a8a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135715761356c81613a8f565b6135b0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135af576135ae8382613ad8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135f3576135ee81613c45565b613632565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613631576136308282613d16565b5b5b505050565b600061364a613644613d95565b83613e58565b9050919050565b6000806041835114156136935760008060006020860151925060408601519150606086015160001a905061368787828585613e8b565b945094505050506136cd565b6040835114156136c45760008060208501519150604085015190506136b9868383613f98565b9350935050506136cd565b60006002915091505b9250929050565b600060048111156136e8576136e7615696565b5b8160048111156136fb576136fa615696565b5b1415613706576138a6565b6001600481111561371a57613719615696565b5b81600481111561372d5761372c615696565b5b141561376e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376590614e69565b60405180910390fd5b6002600481111561378257613781615696565b5b81600481111561379557613794615696565b5b14156137d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137cd90614ea9565b60405180910390fd5b600360048111156137ea576137e9615696565b5b8160048111156137fd576137fc615696565b5b141561383e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383590614fc9565b60405180910390fd5b60048081111561385157613850615696565b5b81600481111561386457613863615696565b5b14156138a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389c906150a9565b60405180910390fd5b5b50565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561392c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613923906150c9565b60405180910390fd5b6139358161268b565b15613975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396c90614f29565b60405180910390fd5b613981600083836131d9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139d19190615365565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ae58461189c565b613aef9190615446565b9050600060076000848152602001908152602001600020549050818114613bd4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c599190615446565b9050600060096000848152602001908152602001600020549050600060088381548110613c8957613c88615723565b5b906000526020600020015490508060088381548110613cab57613caa615723565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cfa57613cf96156f4565b5b6001900381819060005260206000200160009055905550505050565b6000613d218361189c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f0000000000000000000000000000000000000000000000000000000000000001461415613de7577fa22fec0f859b0b43b6cde10cfea5ec65e71e9d38b462091c2cbadfd6c2cbfd429050613e55565b613e527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fbfd3f9ba387cf892dc3905d596e82fa17c08bdd1c8db003616d304efff37dc157fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613fe6565b90505b90565b60008282604051602001613e6d929190614c2c565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613ec6576000600391509150613f8f565b601b8560ff1614158015613ede5750601c8560ff1614155b15613ef0576000600491509150613f8f565b600060018787878760405160008152602001604052604051613f159493929190614e02565b6020604051602081039080840390855afa158015613f37573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613f8657600060019250925050613f8f565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613fd887828885613e8b565b935093505050935093915050565b60008383834630604051602001614001959493929190614daf565b6040516020818303038152906040528051906020012090509392505050565b82805461402c90615547565b90600052602060002090601f01602090048101928261404e5760008555614095565b82601f1061406757805160ff1916838001178555614095565b82800160010185558215614095579182015b82811115614094578251825591602001919060010190614079565b5b5090506140a291906140a6565b5090565b5b808211156140bf5760008160009055506001016140a7565b5090565b60006140d66140d184615289565b615264565b905080838252602082019050828560208602820111156140f9576140f861578b565b5b60005b85811015614129578161410f88826141b7565b8452602084019350602083019250506001810190506140fc565b5050509392505050565b6000614146614141846152b5565b615264565b90508281526020810184848401111561416257614161615790565b5b61416d848285615505565b509392505050565b6000614188614183846152e6565b615264565b9050828152602081018484840111156141a4576141a3615790565b5b6141af848285615505565b509392505050565b6000813590506141c681615f33565b92915050565b600082601f8301126141e1576141e0615786565b5b81356141f18482602086016140c3565b91505092915050565b60008135905061420981615f4a565b92915050565b60008135905061421e81615f61565b92915050565b60008151905061423381615f61565b92915050565b60008083601f84011261424f5761424e615786565b5b8235905067ffffffffffffffff81111561426c5761426b615781565b5b6020830191508360018202830111156142885761428761578b565b5b9250929050565b600082601f8301126142a4576142a3615786565b5b81356142b4848260208601614133565b91505092915050565b600082601f8301126142d2576142d1615786565b5b81356142e2848260208601614175565b91505092915050565b6000813590506142fa81615f78565b92915050565b6000602082840312156143165761431561579a565b5b6000614324848285016141b7565b91505092915050565b600080604083850312156143445761434361579a565b5b6000614352858286016141b7565b9250506020614363858286016141b7565b9150509250929050565b6000806000606084860312156143865761438561579a565b5b6000614394868287016141b7565b93505060206143a5868287016141b7565b92505060406143b6868287016142eb565b9150509250925092565b600080600080608085870312156143da576143d961579a565b5b60006143e8878288016141b7565b94505060206143f9878288016141b7565b935050604061440a878288016142eb565b925050606085013567ffffffffffffffff81111561442b5761442a615795565b5b6144378782880161428f565b91505092959194509250565b6000806040838503121561445a5761445961579a565b5b6000614468858286016141b7565b9250506020614479858286016141fa565b9150509250929050565b6000806040838503121561449a5761449961579a565b5b60006144a8858286016141b7565b92505060206144b9858286016142eb565b9150509250929050565b6000602082840312156144d9576144d861579a565b5b600082013567ffffffffffffffff8111156144f7576144f6615795565b5b614503848285016141cc565b91505092915050565b6000602082840312156145225761452161579a565b5b6000614530848285016141fa565b91505092915050565b60006020828403121561454f5761454e61579a565b5b600061455d8482850161420f565b91505092915050565b60006020828403121561457c5761457b61579a565b5b600061458a84828501614224565b91505092915050565b6000602082840312156145a9576145a861579a565b5b600082013567ffffffffffffffff8111156145c7576145c6615795565b5b6145d3848285016142bd565b91505092915050565b6000602082840312156145f2576145f161579a565b5b6000614600848285016142eb565b91505092915050565b6000806000604084860312156146225761462161579a565b5b6000614630868287016142eb565b935050602084013567ffffffffffffffff81111561465157614650615795565b5b61465d86828701614239565b92509250509250925092565b6146728161547a565b82525050565b6146818161548c565b82525050565b61469081615498565b82525050565b6146a76146a282615498565b6155f3565b82525050565b60006146b882615317565b6146c2818561532d565b93506146d2818560208601615514565b6146db8161579f565b840191505092915050565b60006146f182615322565b6146fb8185615349565b935061470b818560208601615514565b6147148161579f565b840191505092915050565b600061472a82615322565b614734818561535a565b9350614744818560208601615514565b80840191505092915050565b600061475d601883615349565b9150614768826157b0565b602082019050919050565b6000614780601783615349565b915061478b826157d9565b602082019050919050565b60006147a3601f83615349565b91506147ae82615802565b602082019050919050565b60006147c6602b83615349565b91506147d18261582b565b604082019050919050565b60006147e9603283615349565b91506147f48261587a565b604082019050919050565b600061480c602683615349565b9150614817826158c9565b604082019050919050565b600061482f601c83615349565b915061483a82615918565b602082019050919050565b600061485260028361535a565b915061485d82615941565b600282019050919050565b6000614875600f83615349565b91506148808261596a565b602082019050919050565b6000614898602483615349565b91506148a382615993565b604082019050919050565b60006148bb601983615349565b91506148c6826159e2565b602082019050919050565b60006148de600d83615349565b91506148e982615a0b565b602082019050919050565b6000614901602283615349565b915061490c82615a34565b604082019050919050565b6000614924602c83615349565b915061492f82615a83565b604082019050919050565b6000614947601e83615349565b915061495282615ad2565b602082019050919050565b600061496a601383615349565b915061497582615afb565b602082019050919050565b600061498d603883615349565b915061499882615b24565b604082019050919050565b60006149b0602a83615349565b91506149bb82615b73565b604082019050919050565b60006149d3602983615349565b91506149de82615bc2565b604082019050919050565b60006149f6602283615349565b9150614a0182615c11565b604082019050919050565b6000614a19602083615349565b9150614a2482615c60565b602082019050919050565b6000614a3c602c83615349565b9150614a4782615c89565b604082019050919050565b6000614a5f602083615349565b9150614a6a82615cd8565b602082019050919050565b6000614a82602983615349565b9150614a8d82615d01565b604082019050919050565b6000614aa5602f83615349565b9150614ab082615d50565b604082019050919050565b6000614ac8600d83615349565b9150614ad382615d9f565b602082019050919050565b6000614aeb602183615349565b9150614af682615dc8565b604082019050919050565b6000614b0e601383615349565b9150614b1982615e17565b602082019050919050565b6000614b31601183615349565b9150614b3c82615e40565b602082019050919050565b6000614b5460008361533e565b9150614b5f82615e69565b600082019050919050565b6000614b77603183615349565b9150614b8282615e6c565b604082019050919050565b6000614b9a602c83615349565b9150614ba582615ebb565b604082019050919050565b6000614bbd601083615349565b9150614bc882615f0a565b602082019050919050565b614bdc816154ee565b82525050565b614bf3614bee826154ee565b6155fd565b82525050565b614c02816154f8565b82525050565b6000614c14828561471f565b9150614c20828461471f565b91508190509392505050565b6000614c3782614845565b9150614c438285614696565b602082019150614c538284614696565b6020820191508190509392505050565b6000614c6e82614b47565b9150819050919050565b6000614c848285614be2565b602082019150614c948284614be2565b6020820191508190509392505050565b6000602082019050614cb96000830184614669565b92915050565b6000608082019050614cd46000830187614669565b614ce16020830186614669565b614cee6040830185614bd3565b8181036060830152614d0081846146ad565b905095945050505050565b6000604082019050614d206000830185614669565b614d2d6020830184614bd3565b9392505050565b6000602082019050614d496000830184614678565b92915050565b6000604082019050614d646000830185614687565b614d716020830184614669565b9392505050565b6000606082019050614d8d6000830186614687565b614d9a6020830185614669565b614da76040830184614bd3565b949350505050565b600060a082019050614dc46000830188614687565b614dd16020830187614687565b614dde6040830186614687565b614deb6060830185614bd3565b614df86080830184614669565b9695505050505050565b6000608082019050614e176000830187614687565b614e246020830186614bf9565b614e316040830185614687565b614e3e6060830184614687565b95945050505050565b60006020820190508181036000830152614e6181846146e6565b905092915050565b60006020820190508181036000830152614e8281614750565b9050919050565b60006020820190508181036000830152614ea281614773565b9050919050565b60006020820190508181036000830152614ec281614796565b9050919050565b60006020820190508181036000830152614ee2816147b9565b9050919050565b60006020820190508181036000830152614f02816147dc565b9050919050565b60006020820190508181036000830152614f22816147ff565b9050919050565b60006020820190508181036000830152614f4281614822565b9050919050565b60006020820190508181036000830152614f6281614868565b9050919050565b60006020820190508181036000830152614f828161488b565b9050919050565b60006020820190508181036000830152614fa2816148ae565b9050919050565b60006020820190508181036000830152614fc2816148d1565b9050919050565b60006020820190508181036000830152614fe2816148f4565b9050919050565b6000602082019050818103600083015261500281614917565b9050919050565b600060208201905081810360008301526150228161493a565b9050919050565b600060208201905081810360008301526150428161495d565b9050919050565b6000602082019050818103600083015261506281614980565b9050919050565b60006020820190508181036000830152615082816149a3565b9050919050565b600060208201905081810360008301526150a2816149c6565b9050919050565b600060208201905081810360008301526150c2816149e9565b9050919050565b600060208201905081810360008301526150e281614a0c565b9050919050565b6000602082019050818103600083015261510281614a2f565b9050919050565b6000602082019050818103600083015261512281614a52565b9050919050565b6000602082019050818103600083015261514281614a75565b9050919050565b6000602082019050818103600083015261516281614a98565b9050919050565b6000602082019050818103600083015261518281614abb565b9050919050565b600060208201905081810360008301526151a281614ade565b9050919050565b600060208201905081810360008301526151c281614b01565b9050919050565b600060208201905081810360008301526151e281614b24565b9050919050565b6000602082019050818103600083015261520281614b6a565b9050919050565b6000602082019050818103600083015261522281614b8d565b9050919050565b6000602082019050818103600083015261524281614bb0565b9050919050565b600060208201905061525e6000830184614bd3565b92915050565b600061526e61527f565b905061527a8282615579565b919050565b6000604051905090565b600067ffffffffffffffff8211156152a4576152a3615752565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152d0576152cf615752565b5b6152d98261579f565b9050602081019050919050565b600067ffffffffffffffff82111561530157615300615752565b5b61530a8261579f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615370826154ee565b915061537b836154ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153b0576153af615638565b5b828201905092915050565b60006153c6826154ee565b91506153d1836154ee565b9250826153e1576153e0615667565b5b828204905092915050565b60006153f7826154ee565b9150615402836154ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543b5761543a615638565b5b828202905092915050565b6000615451826154ee565b915061545c836154ee565b92508282101561546f5761546e615638565b5b828203905092915050565b6000615485826154ce565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b60208210811415615573576155726156c5565b5b50919050565b6155828261579f565b810181811067ffffffffffffffff821117156155a1576155a0615752565b5b80604052505050565b60006155b5826154ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615638565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000615612826154ee565b915061561d836154ee565b92508261562d5761562c615667565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f77686974656c6973742073616c65206e6f74206f70656e000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f626164207369676e617475726500000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f746f6f206d616e7920746f6b656e20706572207472616e73616374696f6e0000600082015250565b7f696e76616c6964206574686572732073656e7400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4672656520636c61696d206e6f74206f70656e00000000000000000000000000600082015250565b7f6e6f7420656e6f75676820737570706c79000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f707269766174652073616c65206d617800000000000000000000000000000000600082015250565b615f3c8161547a565b8114615f4757600080fd5b50565b615f538161548c565b8114615f5e57600080fd5b50565b615f6a816154a2565b8114615f7557600080fd5b50565b615f81816154ee565b8114615f8c57600080fd5b5056fea26469706673582212208e2e3277dead9634df1741ef16b0a969d846cf8ca1622bc73fe536d50666af2b64736f6c63430008070033

Deployed Bytecode Sourcemap

59362:8722:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62038:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59634:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21621:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23180:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22703:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63593:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59857:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59905:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35360:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24070:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60182:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35028:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60080:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60128:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64804:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59551:32;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63992:465;;;;;;;;;;;;;:::i;:::-;;24480:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60036:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62494:85;;;;;;;;;;;;;:::i;:::-;;62587:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35550:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59740:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63098:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63355:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21315:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62275:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21045:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42517:94;;;;;;;;;;;;;:::i;:::-;;63470:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59989:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62379:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41866:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66910:445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21790:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59592:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23473:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24736:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60437:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63251:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61229:676;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59777:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65520:569;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23839:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64465:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59818:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60249:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42766:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62928:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62038:229;62194:4;62223:36;62247:11;62223:23;:36::i;:::-;62216:43;;62038:229;;;:::o;59634:99::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21621:100::-;21675:13;21708:5;21701:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21621:100;:::o;23180:221::-;23256:7;23284:16;23292:7;23284;:16::i;:::-;23276:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23369:15;:24;23385:7;23369:24;;;;;;;;;;;;;;;;;;;;;23362:31;;23180:221;;;:::o;22703:411::-;22784:13;22800:23;22815:7;22800:14;:23::i;:::-;22784:39;;22848:5;22842:11;;:2;:11;;;;22834:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22942:5;22926:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22951:37;22968:5;22975:12;:10;:12::i;:::-;22951:16;:37::i;:::-;22926:62;22904:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:21;23094:2;23098:7;23085:8;:21::i;:::-;22773:341;22703:411;;:::o;63593:391::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63711:17:::1;63748:9:::0;63743:108:::1;63767:11;:18;;;;63763:1;:22;63743:108;;;63820:11;63832:1;63820:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;63807:32;;;;;:::i;:::-;;;63787:3;;;;;:::i;:::-;;;;63743:108;;;;63902:5;63881:18;63869:9;:30;;;;:::i;:::-;:38;63861:47;;;::::0;::::1;;63919:11;63936:39;;;;;;;;63948:6;63936:39;;;;;;63956:18;63936:39;;::::0;63919:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63700:284;63593:391:::0;;:::o;59857:41::-;;;;;;;;;;;;;:::o;59905:37::-;;;;;;;;;;;;;:::o;35360:113::-;35421:7;35448:10;:17;;;;35441:24;;35360:113;:::o;24070:339::-;24265:41;24284:12;:10;:12::i;:::-;24298:7;24265:18;:41::i;:::-;24257:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24373:28;24383:4;24389:2;24393:7;24373:9;:28::i;:::-;24070:339;;;:::o;60182:60::-;60240:2;60182:60;:::o;35028:256::-;35125:7;35161:23;35178:5;35161:16;:23::i;:::-;35153:5;:31;35145:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35250:12;:19;35263:5;35250:19;;;;;;;;;;;;;;;:26;35270:5;35250:26;;;;;;;;;;;;35243:33;;35028:256;;;;:::o;60080:41::-;60117:4;60080:41;:::o;60128:47::-;60173:2;60128:47;:::o;64804:295::-;64881:12;;;;;;;;;;;64873:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;60240:2;64944:14;:49;;64922:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;65062:29;65076:14;65062:13;:29::i;:::-;64804:295;:::o;59551:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63992:465::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64042:15:::1;64060:21;64042:39;;64097:9;64092:289;64116:11;:18;;;;64112:1;:22;64092:289;;;64156:11;64204:5;64181:11;64193:1;64181:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:19;;;64171:7;:29;;;;:::i;:::-;64170:39;;;;:::i;:::-;64156:53;;64326:11;64338:1;64326:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;;;;;;;;;;64318:35;;64361:3;64318:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64141:240;64136:3;;;;;:::i;:::-;;;;64092:289;;;;64399:10;64391:24;;64423:21;64391:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64031:426;63992:465::o:0;24480:185::-;24618:39;24635:4;24641:2;24645:7;24618:39;;;;;;;;;;;;:16;:39::i;:::-;24480:185;;;:::o;60036:35::-;;;;:::o;62494:85::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62567:4:::1;62549:15;;:22;;;;;;;;;;;;;;;;;;62494:85::o:0;62587:333::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62666:10:::1;;;;;;;;;;;62665:11;62657:20;;;::::0;::::1;;60117:4;62770:16;62788:15;62753:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62743:62;;;;;;62717:103;;:129;;;;:::i;:::-;62688:13;:158;;;;62876:8;62857:16;:27;;;;;;;;;;;;:::i;:::-;;62908:4;62895:10;;:17;;;;;;;;;;;;;;;;;;62587:333:::0;:::o;35550:233::-;35625:7;35661:30;:28;:30::i;:::-;35653:5;:38;35645:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35758:10;35769:5;35758:17;;;;;;;;:::i;:::-;;;;;;;;;;35751:24;;35550:233;;;:::o;59740:30::-;;;;;;;;;;;;;:::o;63098:145::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63181:15:::1;;;;;;;;;;;63180:16;63172:25;;;::::0;::::1;;63227:8;63208:16;:27;;;;;;;;;;;;:::i;:::-;;63098:145:::0;:::o;63355:107::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63446:8:::1;63426:17;;:28;;;;;;;;;;;;;;;;;;63355:107:::0;:::o;21315:239::-;21387:7;21407:13;21423:7;:16;21431:7;21423:16;;;;;;;;;;;;;;;;;;;;;21407:32;;21475:1;21458:19;;:5;:19;;;;21450:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21541:5;21534:12;;;21315:239;;;:::o;62275:96::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62357:6:::1;62344:10;:19;;;;62275:96:::0;:::o;21045:208::-;21117:7;21162:1;21145:19;;:5;:19;;;;21137:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21229:9;:16;21239:5;21229:16;;;;;;;;;;;;;;;;21222:23;;21045:208;;;:::o;42517:94::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42582:21:::1;42600:1;42582:9;:21::i;:::-;42517:94::o:0;63470:115::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63569:8:::1;63545:21;;:32;;;;;;;;;;;;;;;;;;63470:115:::0;:::o;59989:38::-;;;;:::o;62379:107::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62472:6:::1;62453:16;;:25;;;;;;;;;;;;;;;;;;62379:107:::0;:::o;41866:87::-;41912:7;41939:6;;;;;;;;;;;41932:13;;41866:87;:::o;66910:445::-;67050:21;;;;;;;;;;;67042:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60317:1;67132:14;:59;;67110:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;67260:47;67285:9;;67296:10;67260:24;:47::i;:::-;67318:29;67332:14;67318:13;:29::i;:::-;66910:445;;;:::o;21790:104::-;21846:13;21879:7;21872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:104;:::o;59592:35::-;;;;;;;;;;;;;:::o;23473:295::-;23588:12;:10;:12::i;:::-;23576:24;;:8;:24;;;;23568:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23688:8;23643:18;:32;23662:12;:10;:12::i;:::-;23643:32;;;;;;;;;;;;;;;:42;23676:8;23643:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23741:8;23712:48;;23727:12;:10;:12::i;:::-;23712:48;;;23751:8;23712:48;;;;;;:::i;:::-;;;;;;;;23473:295;;:::o;24736:328::-;24911:41;24930:12;:10;:12::i;:::-;24944:7;24911:18;:41::i;:::-;24903:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25017:39;25031:4;25037:2;25041:7;25050:5;25017:13;:39::i;:::-;24736:328;;;;:::o;60437:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;63251:96::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63331:8:::1;63316:12;;:23;;;;;;;;;;;;;;;;;;63251:96:::0;:::o;61229:676::-;61330:13;61383:16;61391:7;61383;:16::i;:::-;61361:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;61490:10;;;;;;;;;;;61485:69;;61524:18;61517:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61485:69;61566:21;61590:10;:8;:10::i;:::-;61566:34;;61655:1;61637:7;61631:21;:25;:266;;;;;;;;;;;;;;;;;61748:7;61782:51;60117:4;61800:7;61784:13;;:23;;;;:::i;:::-;61783:38;;;;:::i;:::-;61782:49;:51::i;:::-;61705:151;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61631:266;61611:286;;;61229:676;;;;:::o;59777:32::-;;;;:::o;65520:569::-;65635:17;;;;;;;;;;;65627:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;65723:5;65695:33;;:12;:24;65708:10;65695:24;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;65687:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65759:58;65779:9;;65790:10;65802:14;65759:19;:58::i;:::-;65828:10;65841:13;:11;:13::i;:::-;65828:26;;60117:4;65878:14;65873:2;:19;;;;:::i;:::-;:33;;65865:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;65966:4;65939:12;:24;65952:10;65939:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;65986:9;65981:101;66005:14;66001:1;:18;65981:101;;;66041:29;66051:10;66068:1;66063:2;:6;;;;:::i;:::-;66041:9;:29::i;:::-;66021:3;;;;;:::i;:::-;;;;65981:101;;;;65616:473;65520:569;;;:::o;23839:164::-;23936:4;23960:18;:25;23979:5;23960:25;;;;;;;;;;;;;;;:35;23986:8;23960:35;;;;;;;;;;;;;;;;;;;;;;;;;23953:42;;23839:164;;;;:::o;64465:331::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64541:10:::1;64554:13;:11;:13::i;:::-;64541:26;;64583:9;64578:211;64602:3;:10;64598:1;:14;64578:211;;;64654:1;64634:16;;:21;;;;;;;:::i;:::-;;;;;;;;60173:2;64678:16;;:38;;64670:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;64752:25;64762:3;64766:1;64762:6;;;;;;;;:::i;:::-;;;;;;;;64775:1;64770:2;:6;;;;:::i;:::-;64752:9;:25::i;:::-;64614:3;;;;;:::i;:::-;;;;64578:211;;;;64530:266;64465:331:::0;:::o;59818:32::-;;;;;;;;;;;;;:::o;60249:69::-;60317:1;60249:69;:::o;42766:192::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:1:::1;42855:22;;:8;:22;;;;42847:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42931:19;42941:8;42931:9;:19::i;:::-;42766:192:::0;:::o;62928:162::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63063:19:::1;63042:18;:40;;;;;;;;;;;;:::i;:::-;;62928:162:::0;:::o;34720:224::-;34822:4;34861:35;34846:50;;;:11;:50;;;;:90;;;;34900:36;34924:11;34900:23;:36::i;:::-;34846:90;34839:97;;34720:224;;;:::o;26574:127::-;26639:4;26691:1;26663:30;;:7;:16;26671:7;26663:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26656:37;;26574:127;;;:::o;16098:98::-;16151:7;16178:10;16171:17;;16098:98;:::o;30556:174::-;30658:2;30631:15;:24;30647:7;30631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30714:7;30710:2;30676:46;;30685:23;30700:7;30685:14;:23::i;:::-;30676:46;;;;;;;;;;;;30556:174;;:::o;26868:348::-;26961:4;26986:16;26994:7;26986;:16::i;:::-;26978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27062:13;27078:23;27093:7;27078:14;:23::i;:::-;27062:39;;27131:5;27120:16;;:7;:16;;;:51;;;;27164:7;27140:31;;:20;27152:7;27140:11;:20::i;:::-;:31;;;27120:51;:87;;;;27175:32;27192:5;27199:7;27175:16;:32::i;:::-;27120:87;27112:96;;;26868:348;;;;:::o;29860:578::-;30019:4;29992:31;;:23;30007:7;29992:14;:23::i;:::-;:31;;;29984:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30102:1;30088:16;;:2;:16;;;;30080:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30158:39;30179:4;30185:2;30189:7;30158:20;:39::i;:::-;30262:29;30279:1;30283:7;30262:8;:29::i;:::-;30323:1;30304:9;:15;30314:4;30304:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30352:1;30335:9;:13;30345:2;30335:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30383:2;30364:7;:16;30372:7;30364:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30422:7;30418:2;30403:27;;30412:4;30403:27;;;;;;;;;;;;29860:578;;;:::o;65107:405::-;65173:10;65186:13;:11;:13::i;:::-;65173:26;;60117:4;65223:14;65218:2;:19;;;;:::i;:::-;:33;;65210:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;65337:9;65319:14;65306:10;;:27;;;;:::i;:::-;:40;;65284:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;65409:9;65404:101;65428:14;65424:1;:18;65404:101;;;65464:29;65474:10;65491:1;65486:2;:6;;;;:::i;:::-;65464:9;:29::i;:::-;65444:3;;;;;:::i;:::-;;;;65404:101;;;;65162:350;65107:405;:::o;42966:173::-;43022:16;43041:6;;;;;;;;;;;43022:25;;43067:8;43058:6;;:17;;;;;;;;;;;;;;;;;;43122:8;43091:40;;43112:8;43091:40;;;;;;;;;;;;43011:128;42966:173;:::o;67363:317::-;67495:14;67512:37;67536:12;67512:23;:37::i;:::-;67495:54;;67560:14;67577:32;67591:6;67599:9;;67577:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;67560:49;;67638:16;;;;;;;;;;;67628:26;;:6;:26;;;67620:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;67484:196;;67363:317;;;:::o;25946:315::-;26103:28;26113:4;26119:2;26123:7;26103:9;:28::i;:::-;26150:48;26173:4;26179:2;26183:7;26192:5;26150:22;:48::i;:::-;26142:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25946:315;;;;:::o;61913:117::-;61973:13;62006:16;61999:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61913:117;:::o;16623:723::-;16679:13;16909:1;16900:5;:10;16896:53;;;16927:10;;;;;;;;;;;;;;;;;;;;;16896:53;16959:12;16974:5;16959:20;;16990:14;17015:78;17030:1;17022:4;:9;17015:78;;17048:8;;;;;:::i;:::-;;;;17079:2;17071:10;;;;;:::i;:::-;;;17015:78;;;17103:19;17135:6;17125:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:39;;17153:154;17169:1;17160:5;:10;17153:154;;17197:1;17187:11;;;;;:::i;:::-;;;17264:2;17256:5;:10;;;;:::i;:::-;17243:2;:24;;;;:::i;:::-;17230:39;;17213:6;17220;17213:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17293:2;17284:11;;;;;:::i;:::-;;;17153:154;;;17331:6;17317:21;;;;;16623:723;;;;:::o;66097:355::-;66257:14;66274:47;66292:12;66306:14;66274:17;:47::i;:::-;66257:64;;66332:14;66349:32;66363:6;66371:9;;66349:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;66332:49;;66410:16;;;;;;;;;;;66400:26;;:6;:26;;;66392:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66246:206;;66097:355;;;;:::o;27558:110::-;27634:26;27644:2;27648:7;27634:26;;;;;;;;;;;;:9;:26::i;:::-;27558:110;;:::o;20676:305::-;20778:4;20830:25;20815:40;;;:11;:40;;;;:105;;;;20887:33;20872:48;;;:11;:48;;;;20815:105;:158;;;;20937:36;20961:11;20937:23;:36::i;:::-;20815:158;20795:178;;20676:305;;;:::o;61006:215::-;61168:45;61195:4;61201:2;61205:7;61168:26;:45::i;:::-;61006:215;;;:::o;67688:393::-;67793:7;67838:235;67942:35;68004:12;67905:134;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67873:185;;;;;;67838:16;:235::i;:::-;67818:255;;67688:393;;;:::o;50173:231::-;50251:7;50272:17;50291:18;50313:27;50324:4;50330:9;50313:10;:27::i;:::-;50271:69;;;;50351:18;50363:5;50351:11;:18::i;:::-;50387:9;50380:16;;;;50173:231;;;;:::o;31295:799::-;31450:4;31471:15;:2;:13;;;:15::i;:::-;31467:620;;;31523:2;31507:36;;;31544:12;:10;:12::i;:::-;31558:4;31564:7;31573:5;31507:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31503:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31766:1;31749:6;:13;:18;31745:272;;;31792:60;;;;;;;;;;:::i;:::-;;;;;;;;31745:272;31967:6;31961:13;31952:6;31948:2;31944:15;31937:38;31503:529;31640:41;;;31630:51;;;:6;:51;;;;31623:58;;;;;31467:620;32071:4;32064:11;;31295:799;;;;;;;:::o;66460:442::-;66572:7;66617:277;66721:47;66795:12;66834:3;66684:176;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66652:227;;;;;;66617:16;:277::i;:::-;66597:297;;66460:442;;;;:::o;27895:321::-;28025:18;28031:2;28035:7;28025:5;:18::i;:::-;28076:54;28107:1;28111:2;28115:7;28124:5;28076:22;:54::i;:::-;28054:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27895:321;;;:::o;19180:157::-;19265:4;19304:25;19289:40;;;:11;:40;;;;19282:47;;19180:157;;;:::o;36396:589::-;36540:45;36567:4;36573:2;36577:7;36540:26;:45::i;:::-;36618:1;36602:18;;:4;:18;;;36598:187;;;36637:40;36669:7;36637:31;:40::i;:::-;36598:187;;;36707:2;36699:10;;:4;:10;;;36695:90;;36726:47;36759:4;36765:7;36726:32;:47::i;:::-;36695:90;36598:187;36813:1;36799:16;;:2;:16;;;36795:183;;;36832:45;36869:7;36832:36;:45::i;:::-;36795:183;;;36905:4;36899:10;;:2;:10;;;36895:83;;36926:40;36954:2;36958:7;36926:27;:40::i;:::-;36895:83;36795:183;36396:589;;;:::o;59112:167::-;59189:7;59216:55;59238:20;:18;:20::i;:::-;59260:10;59216:21;:55::i;:::-;59209:62;;59112:167;;;:::o;48063:1308::-;48144:7;48153:12;48398:2;48378:9;:16;:22;48374:990;;;48417:9;48441;48465:7;48674:4;48663:9;48659:20;48653:27;48648:32;;48724:4;48713:9;48709:20;48703:27;48698:32;;48782:4;48771:9;48767:20;48761:27;48758:1;48753:36;48748:41;;48825:25;48836:4;48842:1;48845;48848;48825:10;:25::i;:::-;48818:32;;;;;;;;;48374:990;48892:2;48872:9;:16;:22;48868:496;;;48911:9;48935:10;49147:4;49136:9;49132:20;49126:27;49121:32;;49198:4;49187:9;49183:20;49177:27;49171:33;;49240:23;49251:4;49257:1;49260:2;49240:10;:23::i;:::-;49233:30;;;;;;;;48868:496;49312:1;49316:35;49296:56;;;;48063:1308;;;;;;:::o;46334:643::-;46412:20;46403:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;46399:571;;;46449:7;;46399:571;46510:29;46501:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;46497:473;;;46556:34;;;;;;;;;;:::i;:::-;;;;;;;;46497:473;46621:35;46612:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;46608:362;;;46673:41;;;;;;;;;;:::i;:::-;;;;;;;;46608:362;46745:30;46736:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46732:238;;;46792:44;;;;;;;;;;:::i;:::-;;;;;;;;46732:238;46867:30;46858:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;46854:116;;;46914:44;;;;;;;;;;:::i;:::-;;;;;;;;46854:116;46334:643;;:::o;8142:387::-;8202:4;8410:12;8477:7;8465:20;8457:28;;8520:1;8513:4;:8;8506:15;;;8142:387;;;:::o;28552:382::-;28646:1;28632:16;;:2;:16;;;;28624:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28705:16;28713:7;28705;:16::i;:::-;28704:17;28696:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28767:45;28796:1;28800:2;28804:7;28767:20;:45::i;:::-;28842:1;28825:9;:13;28835:2;28825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28873:2;28854:7;:16;28862:7;28854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28918:7;28914:2;28893:33;;28910:1;28893:33;;;;;;;;;;;;28552:382;;:::o;32666:126::-;;;;:::o;37708:164::-;37812:10;:17;;;;37785:15;:24;37801:7;37785:24;;;;;;;;;;;:44;;;;37840:10;37856:7;37840:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:164;:::o;38499:988::-;38765:22;38815:1;38790:22;38807:4;38790:16;:22::i;:::-;:26;;;;:::i;:::-;38765:51;;38827:18;38848:17;:26;38866:7;38848:26;;;;;;;;;;;;38827:47;;38995:14;38981:10;:28;38977:328;;39026:19;39048:12;:18;39061:4;39048:18;;;;;;;;;;;;;;;:34;39067:14;39048:34;;;;;;;;;;;;39026:56;;39132:11;39099:12;:18;39112:4;39099:18;;;;;;;;;;;;;;;:30;39118:10;39099:30;;;;;;;;;;;:44;;;;39249:10;39216:17;:30;39234:11;39216:30;;;;;;;;;;;:43;;;;39011:294;38977:328;39401:17;:26;39419:7;39401:26;;;;;;;;;;;39394:33;;;39445:12;:18;39458:4;39445:18;;;;;;;;;;;;;;;:34;39464:14;39445:34;;;;;;;;;;;39438:41;;;38580:907;;38499:988;;:::o;39782:1079::-;40035:22;40080:1;40060:10;:17;;;;:21;;;;:::i;:::-;40035:46;;40092:18;40113:15;:24;40129:7;40113:24;;;;;;;;;;;;40092:45;;40464:19;40486:10;40497:14;40486:26;;;;;;;;:::i;:::-;;;;;;;;;;40464:48;;40550:11;40525:10;40536;40525:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40661:10;40630:15;:28;40646:11;40630:28;;;;;;;;;;;:41;;;;40802:15;:24;40818:7;40802:24;;;;;;;;;;;40795:31;;;40837:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39853:1008;;;39782:1079;:::o;37286:221::-;37371:14;37388:20;37405:2;37388:16;:20::i;:::-;37371:37;;37446:7;37419:12;:16;37432:2;37419:16;;;;;;;;;;;;;;;:24;37436:6;37419:24;;;;;;;;;;;:34;;;;37493:6;37464:17;:26;37482:7;37464:26;;;;;;;;;;;:35;;;;37360:147;37286:221;;:::o;57918:281::-;57971:7;58012:16;57995:13;:33;57991:201;;;58052:24;58045:31;;;;57991:201;58116:64;58138:10;58150:12;58164:15;58116:21;:64::i;:::-;58109:71;;57918:281;;:::o;54641:196::-;54734:7;54800:15;54817:10;54771:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54761:68;;;;;;54754:75;;54641:196;;;;:::o;51672:1632::-;51803:7;51812:12;52737:66;52732:1;52724:10;;:79;52720:163;;;52836:1;52840:30;52820:51;;;;;;52720:163;52902:2;52897:1;:7;;;;:18;;;;;52913:2;52908:1;:7;;;;52897:18;52893:102;;;52948:1;52952:30;52932:51;;;;;;52893:102;53092:14;53109:24;53119:4;53125:1;53128;53131;53109:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53092:41;;53166:1;53148:20;;:6;:20;;;53144:103;;;53201:1;53205:29;53185:50;;;;;;;53144:103;53267:6;53275:20;53259:37;;;;;51672:1632;;;;;;;;:::o;50667:391::-;50781:7;50790:12;50815:9;50835:7;50890:66;50886:2;50882:75;50877:80;;50994:2;50989;50984:3;50980:12;50976:21;50971:26;;51025:25;51036:4;51042:1;51045;51048;51025:10;:25::i;:::-;51018:32;;;;;;50667:391;;;;;;:::o;58207:263::-;58351:7;58399:8;58409;58419:11;58432:13;58455:4;58388:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58378:84;;;;;;58371:91;;58207:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:552::-;2623:8;2633:6;2683:3;2676:4;2668:6;2664:17;2660:27;2650:122;;2691:79;;:::i;:::-;2650:122;2804:6;2791:20;2781:30;;2834:18;2826:6;2823:30;2820:117;;;2856:79;;:::i;:::-;2820:117;2970:4;2962:6;2958:17;2946:29;;3024:3;3016:4;3008:6;3004:17;2994:8;2990:32;2987:41;2984:128;;;3031:79;;:::i;:::-;2984:128;2566:552;;;;;:::o;3137:338::-;3192:5;3241:3;3234:4;3226:6;3222:17;3218:27;3208:122;;3249:79;;:::i;:::-;3208:122;3366:6;3353:20;3391:78;3465:3;3457:6;3450:4;3442:6;3438:17;3391:78;:::i;:::-;3382:87;;3198:277;3137:338;;;;:::o;3495:340::-;3551:5;3600:3;3593:4;3585:6;3581:17;3577:27;3567:122;;3608:79;;:::i;:::-;3567:122;3725:6;3712:20;3750:79;3825:3;3817:6;3810:4;3802:6;3798:17;3750:79;:::i;:::-;3741:88;;3557:278;3495:340;;;;:::o;3841:139::-;3887:5;3925:6;3912:20;3903:29;;3941:33;3968:5;3941:33;:::i;:::-;3841:139;;;;:::o;3986:329::-;4045:6;4094:2;4082:9;4073:7;4069:23;4065:32;4062:119;;;4100:79;;:::i;:::-;4062:119;4220:1;4245:53;4290:7;4281:6;4270:9;4266:22;4245:53;:::i;:::-;4235:63;;4191:117;3986:329;;;;:::o;4321:474::-;4389:6;4397;4446:2;4434:9;4425:7;4421:23;4417:32;4414:119;;;4452:79;;:::i;:::-;4414:119;4572:1;4597:53;4642:7;4633:6;4622:9;4618:22;4597:53;:::i;:::-;4587:63;;4543:117;4699:2;4725:53;4770:7;4761:6;4750:9;4746:22;4725:53;:::i;:::-;4715:63;;4670:118;4321:474;;;;;:::o;4801:619::-;4878:6;4886;4894;4943:2;4931:9;4922:7;4918:23;4914:32;4911:119;;;4949:79;;:::i;:::-;4911:119;5069:1;5094:53;5139:7;5130:6;5119:9;5115:22;5094:53;:::i;:::-;5084:63;;5040:117;5196:2;5222:53;5267:7;5258:6;5247:9;5243:22;5222:53;:::i;:::-;5212:63;;5167:118;5324:2;5350:53;5395:7;5386:6;5375:9;5371:22;5350:53;:::i;:::-;5340:63;;5295:118;4801:619;;;;;:::o;5426:943::-;5521:6;5529;5537;5545;5594:3;5582:9;5573:7;5569:23;5565:33;5562:120;;;5601:79;;:::i;:::-;5562:120;5721:1;5746:53;5791:7;5782:6;5771:9;5767:22;5746:53;:::i;:::-;5736:63;;5692:117;5848:2;5874:53;5919:7;5910:6;5899:9;5895:22;5874:53;:::i;:::-;5864:63;;5819:118;5976:2;6002:53;6047:7;6038:6;6027:9;6023:22;6002:53;:::i;:::-;5992:63;;5947:118;6132:2;6121:9;6117:18;6104:32;6163:18;6155:6;6152:30;6149:117;;;6185:79;;:::i;:::-;6149:117;6290:62;6344:7;6335:6;6324:9;6320:22;6290:62;:::i;:::-;6280:72;;6075:287;5426:943;;;;;;;:::o;6375:468::-;6440:6;6448;6497:2;6485:9;6476:7;6472:23;6468:32;6465:119;;;6503:79;;:::i;:::-;6465:119;6623:1;6648:53;6693:7;6684:6;6673:9;6669:22;6648:53;:::i;:::-;6638:63;;6594:117;6750:2;6776:50;6818:7;6809:6;6798:9;6794:22;6776:50;:::i;:::-;6766:60;;6721:115;6375:468;;;;;:::o;6849:474::-;6917:6;6925;6974:2;6962:9;6953:7;6949:23;6945:32;6942:119;;;6980:79;;:::i;:::-;6942:119;7100:1;7125:53;7170:7;7161:6;7150:9;7146:22;7125:53;:::i;:::-;7115:63;;7071:117;7227:2;7253:53;7298:7;7289:6;7278:9;7274:22;7253:53;:::i;:::-;7243:63;;7198:118;6849:474;;;;;:::o;7329:539::-;7413:6;7462:2;7450:9;7441:7;7437:23;7433:32;7430:119;;;7468:79;;:::i;:::-;7430:119;7616:1;7605:9;7601:17;7588:31;7646:18;7638:6;7635:30;7632:117;;;7668:79;;:::i;:::-;7632:117;7773:78;7843:7;7834:6;7823:9;7819:22;7773:78;:::i;:::-;7763:88;;7559:302;7329:539;;;;:::o;7874:323::-;7930:6;7979:2;7967:9;7958:7;7954:23;7950:32;7947:119;;;7985:79;;:::i;:::-;7947:119;8105:1;8130:50;8172:7;8163:6;8152:9;8148:22;8130:50;:::i;:::-;8120:60;;8076:114;7874:323;;;;:::o;8203:327::-;8261:6;8310:2;8298:9;8289:7;8285:23;8281:32;8278:119;;;8316:79;;:::i;:::-;8278:119;8436:1;8461:52;8505:7;8496:6;8485:9;8481:22;8461:52;:::i;:::-;8451:62;;8407:116;8203:327;;;;:::o;8536:349::-;8605:6;8654:2;8642:9;8633:7;8629:23;8625:32;8622:119;;;8660:79;;:::i;:::-;8622:119;8780:1;8805:63;8860:7;8851:6;8840:9;8836:22;8805:63;:::i;:::-;8795:73;;8751:127;8536:349;;;;:::o;8891:509::-;8960:6;9009:2;8997:9;8988:7;8984:23;8980:32;8977:119;;;9015:79;;:::i;:::-;8977:119;9163:1;9152:9;9148:17;9135:31;9193:18;9185:6;9182:30;9179:117;;;9215:79;;:::i;:::-;9179:117;9320:63;9375:7;9366:6;9355:9;9351:22;9320:63;:::i;:::-;9310:73;;9106:287;8891:509;;;;:::o;9406:329::-;9465:6;9514:2;9502:9;9493:7;9489:23;9485:32;9482:119;;;9520:79;;:::i;:::-;9482:119;9640:1;9665:53;9710:7;9701:6;9690:9;9686:22;9665:53;:::i;:::-;9655:63;;9611:117;9406:329;;;;:::o;9741:672::-;9820:6;9828;9836;9885:2;9873:9;9864:7;9860:23;9856:32;9853:119;;;9891:79;;:::i;:::-;9853:119;10011:1;10036:53;10081:7;10072:6;10061:9;10057:22;10036:53;:::i;:::-;10026:63;;9982:117;10166:2;10155:9;10151:18;10138:32;10197:18;10189:6;10186:30;10183:117;;;10219:79;;:::i;:::-;10183:117;10332:64;10388:7;10379:6;10368:9;10364:22;10332:64;:::i;:::-;10314:82;;;;10109:297;9741:672;;;;;:::o;10419:118::-;10506:24;10524:5;10506:24;:::i;:::-;10501:3;10494:37;10419:118;;:::o;10543:109::-;10624:21;10639:5;10624:21;:::i;:::-;10619:3;10612:34;10543:109;;:::o;10658:118::-;10745:24;10763:5;10745:24;:::i;:::-;10740:3;10733:37;10658:118;;:::o;10782:157::-;10887:45;10907:24;10925:5;10907:24;:::i;:::-;10887:45;:::i;:::-;10882:3;10875:58;10782:157;;:::o;10945:360::-;11031:3;11059:38;11091:5;11059:38;:::i;:::-;11113:70;11176:6;11171:3;11113:70;:::i;:::-;11106:77;;11192:52;11237:6;11232:3;11225:4;11218:5;11214:16;11192:52;:::i;:::-;11269:29;11291:6;11269:29;:::i;:::-;11264:3;11260:39;11253:46;;11035:270;10945:360;;;;:::o;11311:364::-;11399:3;11427:39;11460:5;11427:39;:::i;:::-;11482:71;11546:6;11541:3;11482:71;:::i;:::-;11475:78;;11562:52;11607:6;11602:3;11595:4;11588:5;11584:16;11562:52;:::i;:::-;11639:29;11661:6;11639:29;:::i;:::-;11634:3;11630:39;11623:46;;11403:272;11311:364;;;;:::o;11681:377::-;11787:3;11815:39;11848:5;11815:39;:::i;:::-;11870:89;11952:6;11947:3;11870:89;:::i;:::-;11863:96;;11968:52;12013:6;12008:3;12001:4;11994:5;11990:16;11968:52;:::i;:::-;12045:6;12040:3;12036:16;12029:23;;11791:267;11681:377;;;;:::o;12064:366::-;12206:3;12227:67;12291:2;12286:3;12227:67;:::i;:::-;12220:74;;12303:93;12392:3;12303:93;:::i;:::-;12421:2;12416:3;12412:12;12405:19;;12064:366;;;:::o;12436:::-;12578:3;12599:67;12663:2;12658:3;12599:67;:::i;:::-;12592:74;;12675:93;12764:3;12675:93;:::i;:::-;12793:2;12788:3;12784:12;12777:19;;12436:366;;;:::o;12808:::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12808:366;;;:::o;13180:::-;13322:3;13343:67;13407:2;13402:3;13343:67;:::i;:::-;13336:74;;13419:93;13508:3;13419:93;:::i;:::-;13537:2;13532:3;13528:12;13521:19;;13180:366;;;:::o;13552:::-;13694:3;13715:67;13779:2;13774:3;13715:67;:::i;:::-;13708:74;;13791:93;13880:3;13791:93;:::i;:::-;13909:2;13904:3;13900:12;13893:19;;13552:366;;;:::o;13924:::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;13924:366;;;:::o;14296:::-;14438:3;14459:67;14523:2;14518:3;14459:67;:::i;:::-;14452:74;;14535:93;14624:3;14535:93;:::i;:::-;14653:2;14648:3;14644:12;14637:19;;14296:366;;;:::o;14668:400::-;14828:3;14849:84;14931:1;14926:3;14849:84;:::i;:::-;14842:91;;14942:93;15031:3;14942:93;:::i;:::-;15060:1;15055:3;15051:11;15044:18;;14668:400;;;:::o;15074:366::-;15216:3;15237:67;15301:2;15296:3;15237:67;:::i;:::-;15230:74;;15313:93;15402:3;15313:93;:::i;:::-;15431:2;15426:3;15422:12;15415:19;;15074:366;;;:::o;15446:::-;15588:3;15609:67;15673:2;15668:3;15609:67;:::i;:::-;15602:74;;15685:93;15774:3;15685:93;:::i;:::-;15803:2;15798:3;15794:12;15787:19;;15446:366;;;:::o;15818:::-;15960:3;15981:67;16045:2;16040:3;15981:67;:::i;:::-;15974:74;;16057:93;16146:3;16057:93;:::i;:::-;16175:2;16170:3;16166:12;16159:19;;15818:366;;;:::o;16190:::-;16332:3;16353:67;16417:2;16412:3;16353:67;:::i;:::-;16346:74;;16429:93;16518:3;16429:93;:::i;:::-;16547:2;16542:3;16538:12;16531:19;;16190:366;;;:::o;16562:::-;16704:3;16725:67;16789:2;16784:3;16725:67;:::i;:::-;16718:74;;16801:93;16890:3;16801:93;:::i;:::-;16919:2;16914:3;16910:12;16903:19;;16562:366;;;:::o;16934:::-;17076:3;17097:67;17161:2;17156:3;17097:67;:::i;:::-;17090:74;;17173:93;17262:3;17173:93;:::i;:::-;17291:2;17286:3;17282:12;17275:19;;16934:366;;;:::o;17306:::-;17448:3;17469:67;17533:2;17528:3;17469:67;:::i;:::-;17462:74;;17545:93;17634:3;17545:93;:::i;:::-;17663:2;17658:3;17654:12;17647:19;;17306:366;;;:::o;17678:::-;17820:3;17841:67;17905:2;17900:3;17841:67;:::i;:::-;17834:74;;17917:93;18006:3;17917:93;:::i;:::-;18035:2;18030:3;18026:12;18019:19;;17678:366;;;:::o;18050:::-;18192:3;18213:67;18277:2;18272:3;18213:67;:::i;:::-;18206:74;;18289:93;18378:3;18289:93;:::i;:::-;18407:2;18402:3;18398:12;18391:19;;18050:366;;;:::o;18422:::-;18564:3;18585:67;18649:2;18644:3;18585:67;:::i;:::-;18578:74;;18661:93;18750:3;18661:93;:::i;:::-;18779:2;18774:3;18770:12;18763:19;;18422:366;;;:::o;18794:::-;18936:3;18957:67;19021:2;19016:3;18957:67;:::i;:::-;18950:74;;19033:93;19122:3;19033:93;:::i;:::-;19151:2;19146:3;19142:12;19135:19;;18794:366;;;:::o;19166:::-;19308:3;19329:67;19393:2;19388:3;19329:67;:::i;:::-;19322:74;;19405:93;19494:3;19405:93;:::i;:::-;19523:2;19518:3;19514:12;19507:19;;19166:366;;;:::o;19538:::-;19680:3;19701:67;19765:2;19760:3;19701:67;:::i;:::-;19694:74;;19777:93;19866:3;19777:93;:::i;:::-;19895:2;19890:3;19886:12;19879:19;;19538:366;;;:::o;19910:::-;20052:3;20073:67;20137:2;20132:3;20073:67;:::i;:::-;20066:74;;20149:93;20238:3;20149:93;:::i;:::-;20267:2;20262:3;20258:12;20251:19;;19910:366;;;:::o;20282:::-;20424:3;20445:67;20509:2;20504:3;20445:67;:::i;:::-;20438:74;;20521:93;20610:3;20521:93;:::i;:::-;20639:2;20634:3;20630:12;20623:19;;20282:366;;;:::o;20654:::-;20796:3;20817:67;20881:2;20876:3;20817:67;:::i;:::-;20810:74;;20893:93;20982:3;20893:93;:::i;:::-;21011:2;21006:3;21002:12;20995:19;;20654:366;;;:::o;21026:::-;21168:3;21189:67;21253:2;21248:3;21189:67;:::i;:::-;21182:74;;21265:93;21354:3;21265:93;:::i;:::-;21383:2;21378:3;21374:12;21367:19;;21026:366;;;:::o;21398:::-;21540:3;21561:67;21625:2;21620:3;21561:67;:::i;:::-;21554:74;;21637:93;21726:3;21637:93;:::i;:::-;21755:2;21750:3;21746:12;21739:19;;21398:366;;;:::o;21770:::-;21912:3;21933:67;21997:2;21992:3;21933:67;:::i;:::-;21926:74;;22009:93;22098:3;22009:93;:::i;:::-;22127:2;22122:3;22118:12;22111:19;;21770:366;;;:::o;22142:::-;22284:3;22305:67;22369:2;22364:3;22305:67;:::i;:::-;22298:74;;22381:93;22470:3;22381:93;:::i;:::-;22499:2;22494:3;22490:12;22483:19;;22142:366;;;:::o;22514:::-;22656:3;22677:67;22741:2;22736:3;22677:67;:::i;:::-;22670:74;;22753:93;22842:3;22753:93;:::i;:::-;22871:2;22866:3;22862:12;22855:19;;22514:366;;;:::o;22886:398::-;23045:3;23066:83;23147:1;23142:3;23066:83;:::i;:::-;23059:90;;23158:93;23247:3;23158:93;:::i;:::-;23276:1;23271:3;23267:11;23260:18;;22886:398;;;:::o;23290:366::-;23432:3;23453:67;23517:2;23512:3;23453:67;:::i;:::-;23446:74;;23529:93;23618:3;23529:93;:::i;:::-;23647:2;23642:3;23638:12;23631:19;;23290:366;;;:::o;23662:::-;23804:3;23825:67;23889:2;23884:3;23825:67;:::i;:::-;23818:74;;23901:93;23990:3;23901:93;:::i;:::-;24019:2;24014:3;24010:12;24003:19;;23662:366;;;:::o;24034:::-;24176:3;24197:67;24261:2;24256:3;24197:67;:::i;:::-;24190:74;;24273:93;24362:3;24273:93;:::i;:::-;24391:2;24386:3;24382:12;24375:19;;24034:366;;;:::o;24406:118::-;24493:24;24511:5;24493:24;:::i;:::-;24488:3;24481:37;24406:118;;:::o;24530:157::-;24635:45;24655:24;24673:5;24655:24;:::i;:::-;24635:45;:::i;:::-;24630:3;24623:58;24530:157;;:::o;24693:112::-;24776:22;24792:5;24776:22;:::i;:::-;24771:3;24764:35;24693:112;;:::o;24811:435::-;24991:3;25013:95;25104:3;25095:6;25013:95;:::i;:::-;25006:102;;25125:95;25216:3;25207:6;25125:95;:::i;:::-;25118:102;;25237:3;25230:10;;24811:435;;;;;:::o;25252:663::-;25493:3;25515:148;25659:3;25515:148;:::i;:::-;25508:155;;25673:75;25744:3;25735:6;25673:75;:::i;:::-;25773:2;25768:3;25764:12;25757:19;;25786:75;25857:3;25848:6;25786:75;:::i;:::-;25886:2;25881:3;25877:12;25870:19;;25906:3;25899:10;;25252:663;;;;;:::o;25921:379::-;26105:3;26127:147;26270:3;26127:147;:::i;:::-;26120:154;;26291:3;26284:10;;25921:379;;;:::o;26306:397::-;26446:3;26461:75;26532:3;26523:6;26461:75;:::i;:::-;26561:2;26556:3;26552:12;26545:19;;26574:75;26645:3;26636:6;26574:75;:::i;:::-;26674:2;26669:3;26665:12;26658:19;;26694:3;26687:10;;26306:397;;;;;:::o;26709:222::-;26802:4;26840:2;26829:9;26825:18;26817:26;;26853:71;26921:1;26910:9;26906:17;26897:6;26853:71;:::i;:::-;26709:222;;;;:::o;26937:640::-;27132:4;27170:3;27159:9;27155:19;27147:27;;27184:71;27252:1;27241:9;27237:17;27228:6;27184:71;:::i;:::-;27265:72;27333:2;27322:9;27318:18;27309:6;27265:72;:::i;:::-;27347;27415:2;27404:9;27400:18;27391:6;27347:72;:::i;:::-;27466:9;27460:4;27456:20;27451:2;27440:9;27436:18;27429:48;27494:76;27565:4;27556:6;27494:76;:::i;:::-;27486:84;;26937:640;;;;;;;:::o;27583:332::-;27704:4;27742:2;27731:9;27727:18;27719:26;;27755:71;27823:1;27812:9;27808:17;27799:6;27755:71;:::i;:::-;27836:72;27904:2;27893:9;27889:18;27880:6;27836:72;:::i;:::-;27583:332;;;;;:::o;27921:210::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28059:65;28121:1;28110:9;28106:17;28097:6;28059:65;:::i;:::-;27921:210;;;;:::o;28137:332::-;28258:4;28296:2;28285:9;28281:18;28273:26;;28309:71;28377:1;28366:9;28362:17;28353:6;28309:71;:::i;:::-;28390:72;28458:2;28447:9;28443:18;28434:6;28390:72;:::i;:::-;28137:332;;;;;:::o;28475:442::-;28624:4;28662:2;28651:9;28647:18;28639:26;;28675:71;28743:1;28732:9;28728:17;28719:6;28675:71;:::i;:::-;28756:72;28824:2;28813:9;28809:18;28800:6;28756:72;:::i;:::-;28838;28906:2;28895:9;28891:18;28882:6;28838:72;:::i;:::-;28475:442;;;;;;:::o;28923:664::-;29128:4;29166:3;29155:9;29151:19;29143:27;;29180:71;29248:1;29237:9;29233:17;29224:6;29180:71;:::i;:::-;29261:72;29329:2;29318:9;29314:18;29305:6;29261:72;:::i;:::-;29343;29411:2;29400:9;29396:18;29387:6;29343:72;:::i;:::-;29425;29493:2;29482:9;29478:18;29469:6;29425:72;:::i;:::-;29507:73;29575:3;29564:9;29560:19;29551:6;29507:73;:::i;:::-;28923:664;;;;;;;;:::o;29593:545::-;29766:4;29804:3;29793:9;29789:19;29781:27;;29818:71;29886:1;29875:9;29871:17;29862:6;29818:71;:::i;:::-;29899:68;29963:2;29952:9;29948:18;29939:6;29899:68;:::i;:::-;29977:72;30045:2;30034:9;30030:18;30021:6;29977:72;:::i;:::-;30059;30127:2;30116:9;30112:18;30103:6;30059:72;:::i;:::-;29593:545;;;;;;;:::o;30144:313::-;30257:4;30295:2;30284:9;30280:18;30272:26;;30344:9;30338:4;30334:20;30330:1;30319:9;30315:17;30308:47;30372:78;30445:4;30436:6;30372:78;:::i;:::-;30364:86;;30144:313;;;;:::o;30463:419::-;30629:4;30667:2;30656:9;30652:18;30644:26;;30716:9;30710:4;30706:20;30702:1;30691:9;30687:17;30680:47;30744:131;30870:4;30744:131;:::i;:::-;30736:139;;30463:419;;;:::o;30888:::-;31054:4;31092:2;31081:9;31077:18;31069:26;;31141:9;31135:4;31131:20;31127:1;31116:9;31112:17;31105:47;31169:131;31295:4;31169:131;:::i;:::-;31161:139;;30888:419;;;:::o;31313:::-;31479:4;31517:2;31506:9;31502:18;31494:26;;31566:9;31560:4;31556:20;31552:1;31541:9;31537:17;31530:47;31594:131;31720:4;31594:131;:::i;:::-;31586:139;;31313:419;;;:::o;31738:::-;31904:4;31942:2;31931:9;31927:18;31919:26;;31991:9;31985:4;31981:20;31977:1;31966:9;31962:17;31955:47;32019:131;32145:4;32019:131;:::i;:::-;32011:139;;31738:419;;;:::o;32163:::-;32329:4;32367:2;32356:9;32352:18;32344:26;;32416:9;32410:4;32406:20;32402:1;32391:9;32387:17;32380:47;32444:131;32570:4;32444:131;:::i;:::-;32436:139;;32163:419;;;:::o;32588:::-;32754:4;32792:2;32781:9;32777:18;32769:26;;32841:9;32835:4;32831:20;32827:1;32816:9;32812:17;32805:47;32869:131;32995:4;32869:131;:::i;:::-;32861:139;;32588:419;;;:::o;33013:::-;33179:4;33217:2;33206:9;33202:18;33194:26;;33266:9;33260:4;33256:20;33252:1;33241:9;33237:17;33230:47;33294:131;33420:4;33294:131;:::i;:::-;33286:139;;33013:419;;;:::o;33438:::-;33604:4;33642:2;33631:9;33627:18;33619:26;;33691:9;33685:4;33681:20;33677:1;33666:9;33662:17;33655:47;33719:131;33845:4;33719:131;:::i;:::-;33711:139;;33438:419;;;:::o;33863:::-;34029:4;34067:2;34056:9;34052:18;34044:26;;34116:9;34110:4;34106:20;34102:1;34091:9;34087:17;34080:47;34144:131;34270:4;34144:131;:::i;:::-;34136:139;;33863:419;;;:::o;34288:::-;34454:4;34492:2;34481:9;34477:18;34469:26;;34541:9;34535:4;34531:20;34527:1;34516:9;34512:17;34505:47;34569:131;34695:4;34569:131;:::i;:::-;34561:139;;34288:419;;;:::o;34713:::-;34879:4;34917:2;34906:9;34902:18;34894:26;;34966:9;34960:4;34956:20;34952:1;34941:9;34937:17;34930:47;34994:131;35120:4;34994:131;:::i;:::-;34986:139;;34713:419;;;:::o;35138:::-;35304:4;35342:2;35331:9;35327:18;35319:26;;35391:9;35385:4;35381:20;35377:1;35366:9;35362:17;35355:47;35419:131;35545:4;35419:131;:::i;:::-;35411:139;;35138:419;;;:::o;35563:::-;35729:4;35767:2;35756:9;35752:18;35744:26;;35816:9;35810:4;35806:20;35802:1;35791:9;35787:17;35780:47;35844:131;35970:4;35844:131;:::i;:::-;35836:139;;35563:419;;;:::o;35988:::-;36154:4;36192:2;36181:9;36177:18;36169:26;;36241:9;36235:4;36231:20;36227:1;36216:9;36212:17;36205:47;36269:131;36395:4;36269:131;:::i;:::-;36261:139;;35988:419;;;:::o;36413:::-;36579:4;36617:2;36606:9;36602:18;36594:26;;36666:9;36660:4;36656:20;36652:1;36641:9;36637:17;36630:47;36694:131;36820:4;36694:131;:::i;:::-;36686:139;;36413:419;;;:::o;36838:::-;37004:4;37042:2;37031:9;37027:18;37019:26;;37091:9;37085:4;37081:20;37077:1;37066:9;37062:17;37055:47;37119:131;37245:4;37119:131;:::i;:::-;37111:139;;36838:419;;;:::o;37263:::-;37429:4;37467:2;37456:9;37452:18;37444:26;;37516:9;37510:4;37506:20;37502:1;37491:9;37487:17;37480:47;37544:131;37670:4;37544:131;:::i;:::-;37536:139;;37263:419;;;:::o;37688:::-;37854:4;37892:2;37881:9;37877:18;37869:26;;37941:9;37935:4;37931:20;37927:1;37916:9;37912:17;37905:47;37969:131;38095:4;37969:131;:::i;:::-;37961:139;;37688:419;;;:::o;38113:::-;38279:4;38317:2;38306:9;38302:18;38294:26;;38366:9;38360:4;38356:20;38352:1;38341:9;38337:17;38330:47;38394:131;38520:4;38394:131;:::i;:::-;38386:139;;38113:419;;;:::o;38538:::-;38704:4;38742:2;38731:9;38727:18;38719:26;;38791:9;38785:4;38781:20;38777:1;38766:9;38762:17;38755:47;38819:131;38945:4;38819:131;:::i;:::-;38811:139;;38538:419;;;:::o;38963:::-;39129:4;39167:2;39156:9;39152:18;39144:26;;39216:9;39210:4;39206:20;39202:1;39191:9;39187:17;39180:47;39244:131;39370:4;39244:131;:::i;:::-;39236:139;;38963:419;;;:::o;39388:::-;39554:4;39592:2;39581:9;39577:18;39569:26;;39641:9;39635:4;39631:20;39627:1;39616:9;39612:17;39605:47;39669:131;39795:4;39669:131;:::i;:::-;39661:139;;39388:419;;;:::o;39813:::-;39979:4;40017:2;40006:9;40002:18;39994:26;;40066:9;40060:4;40056:20;40052:1;40041:9;40037:17;40030:47;40094:131;40220:4;40094:131;:::i;:::-;40086:139;;39813:419;;;:::o;40238:::-;40404:4;40442:2;40431:9;40427:18;40419:26;;40491:9;40485:4;40481:20;40477:1;40466:9;40462:17;40455:47;40519:131;40645:4;40519:131;:::i;:::-;40511:139;;40238:419;;;:::o;40663:::-;40829:4;40867:2;40856:9;40852:18;40844:26;;40916:9;40910:4;40906:20;40902:1;40891:9;40887:17;40880:47;40944:131;41070:4;40944:131;:::i;:::-;40936:139;;40663:419;;;:::o;41088:::-;41254:4;41292:2;41281:9;41277:18;41269:26;;41341:9;41335:4;41331:20;41327:1;41316:9;41312:17;41305:47;41369:131;41495:4;41369:131;:::i;:::-;41361:139;;41088:419;;;:::o;41513:::-;41679:4;41717:2;41706:9;41702:18;41694:26;;41766:9;41760:4;41756:20;41752:1;41741:9;41737:17;41730:47;41794:131;41920:4;41794:131;:::i;:::-;41786:139;;41513:419;;;:::o;41938:::-;42104:4;42142:2;42131:9;42127:18;42119:26;;42191:9;42185:4;42181:20;42177:1;42166:9;42162:17;42155:47;42219:131;42345:4;42219:131;:::i;:::-;42211:139;;41938:419;;;:::o;42363:::-;42529:4;42567:2;42556:9;42552:18;42544:26;;42616:9;42610:4;42606:20;42602:1;42591:9;42587:17;42580:47;42644:131;42770:4;42644:131;:::i;:::-;42636:139;;42363:419;;;:::o;42788:::-;42954:4;42992:2;42981:9;42977:18;42969:26;;43041:9;43035:4;43031:20;43027:1;43016:9;43012:17;43005:47;43069:131;43195:4;43069:131;:::i;:::-;43061:139;;42788:419;;;:::o;43213:::-;43379:4;43417:2;43406:9;43402:18;43394:26;;43466:9;43460:4;43456:20;43452:1;43441:9;43437:17;43430:47;43494:131;43620:4;43494:131;:::i;:::-;43486:139;;43213:419;;;:::o;43638:222::-;43731:4;43769:2;43758:9;43754:18;43746:26;;43782:71;43850:1;43839:9;43835:17;43826:6;43782:71;:::i;:::-;43638:222;;;;:::o;43866:129::-;43900:6;43927:20;;:::i;:::-;43917:30;;43956:33;43984:4;43976:6;43956:33;:::i;:::-;43866:129;;;:::o;44001:75::-;44034:6;44067:2;44061:9;44051:19;;44001:75;:::o;44082:311::-;44159:4;44249:18;44241:6;44238:30;44235:56;;;44271:18;;:::i;:::-;44235:56;44321:4;44313:6;44309:17;44301:25;;44381:4;44375;44371:15;44363:23;;44082:311;;;:::o;44399:307::-;44460:4;44550:18;44542:6;44539:30;44536:56;;;44572:18;;:::i;:::-;44536:56;44610:29;44632:6;44610:29;:::i;:::-;44602:37;;44694:4;44688;44684:15;44676:23;;44399:307;;;:::o;44712:308::-;44774:4;44864:18;44856:6;44853:30;44850:56;;;44886:18;;:::i;:::-;44850:56;44924:29;44946:6;44924:29;:::i;:::-;44916:37;;45008:4;45002;44998:15;44990:23;;44712:308;;;:::o;45026:98::-;45077:6;45111:5;45105:12;45095:22;;45026:98;;;:::o;45130:99::-;45182:6;45216:5;45210:12;45200:22;;45130:99;;;:::o;45235:168::-;45318:11;45352:6;45347:3;45340:19;45392:4;45387:3;45383:14;45368:29;;45235:168;;;;:::o;45409:147::-;45510:11;45547:3;45532:18;;45409:147;;;;:::o;45562:169::-;45646:11;45680:6;45675:3;45668:19;45720:4;45715:3;45711:14;45696:29;;45562:169;;;;:::o;45737:148::-;45839:11;45876:3;45861:18;;45737:148;;;;:::o;45891:305::-;45931:3;45950:20;45968:1;45950:20;:::i;:::-;45945:25;;45984:20;46002:1;45984:20;:::i;:::-;45979:25;;46138:1;46070:66;46066:74;46063:1;46060:81;46057:107;;;46144:18;;:::i;:::-;46057:107;46188:1;46185;46181:9;46174:16;;45891:305;;;;:::o;46202:185::-;46242:1;46259:20;46277:1;46259:20;:::i;:::-;46254:25;;46293:20;46311:1;46293:20;:::i;:::-;46288:25;;46332:1;46322:35;;46337:18;;:::i;:::-;46322:35;46379:1;46376;46372:9;46367:14;;46202:185;;;;:::o;46393:348::-;46433:7;46456:20;46474:1;46456:20;:::i;:::-;46451:25;;46490:20;46508:1;46490:20;:::i;:::-;46485:25;;46678:1;46610:66;46606:74;46603:1;46600:81;46595:1;46588:9;46581:17;46577:105;46574:131;;;46685:18;;:::i;:::-;46574:131;46733:1;46730;46726:9;46715:20;;46393:348;;;;:::o;46747:191::-;46787:4;46807:20;46825:1;46807:20;:::i;:::-;46802:25;;46841:20;46859:1;46841:20;:::i;:::-;46836:25;;46880:1;46877;46874:8;46871:34;;;46885:18;;:::i;:::-;46871:34;46930:1;46927;46923:9;46915:17;;46747:191;;;;:::o;46944:96::-;46981:7;47010:24;47028:5;47010:24;:::i;:::-;46999:35;;46944:96;;;:::o;47046:90::-;47080:7;47123:5;47116:13;47109:21;47098:32;;47046:90;;;:::o;47142:77::-;47179:7;47208:5;47197:16;;47142:77;;;:::o;47225:149::-;47261:7;47301:66;47294:5;47290:78;47279:89;;47225:149;;;:::o;47380:126::-;47417:7;47457:42;47450:5;47446:54;47435:65;;47380:126;;;:::o;47512:77::-;47549:7;47578:5;47567:16;;47512:77;;;:::o;47595:86::-;47630:7;47670:4;47663:5;47659:16;47648:27;;47595:86;;;:::o;47687:154::-;47771:6;47766:3;47761;47748:30;47833:1;47824:6;47819:3;47815:16;47808:27;47687:154;;;:::o;47847:307::-;47915:1;47925:113;47939:6;47936:1;47933:13;47925:113;;;48024:1;48019:3;48015:11;48009:18;48005:1;48000:3;47996:11;47989:39;47961:2;47958:1;47954:10;47949:15;;47925:113;;;48056:6;48053:1;48050:13;48047:101;;;48136:1;48127:6;48122:3;48118:16;48111:27;48047:101;47896:258;47847:307;;;:::o;48160:320::-;48204:6;48241:1;48235:4;48231:12;48221:22;;48288:1;48282:4;48278:12;48309:18;48299:81;;48365:4;48357:6;48353:17;48343:27;;48299:81;48427:2;48419:6;48416:14;48396:18;48393:38;48390:84;;;48446:18;;:::i;:::-;48390:84;48211:269;48160:320;;;:::o;48486:281::-;48569:27;48591:4;48569:27;:::i;:::-;48561:6;48557:40;48699:6;48687:10;48684:22;48663:18;48651:10;48648:34;48645:62;48642:88;;;48710:18;;:::i;:::-;48642:88;48750:10;48746:2;48739:22;48529:238;48486:281;;:::o;48773:233::-;48812:3;48835:24;48853:5;48835:24;:::i;:::-;48826:33;;48881:66;48874:5;48871:77;48868:103;;;48951:18;;:::i;:::-;48868:103;48998:1;48991:5;48987:13;48980:20;;48773:233;;;:::o;49012:79::-;49051:7;49080:5;49069:16;;49012:79;;;:::o;49097:::-;49136:7;49165:5;49154:16;;49097:79;;;:::o;49182:176::-;49214:1;49231:20;49249:1;49231:20;:::i;:::-;49226:25;;49265:20;49283:1;49265:20;:::i;:::-;49260:25;;49304:1;49294:35;;49309:18;;:::i;:::-;49294:35;49350:1;49347;49343:9;49338:14;;49182:176;;;;:::o;49364:180::-;49412:77;49409:1;49402:88;49509:4;49506:1;49499:15;49533:4;49530:1;49523:15;49550:180;49598:77;49595:1;49588:88;49695:4;49692:1;49685:15;49719:4;49716:1;49709:15;49736:180;49784:77;49781:1;49774:88;49881:4;49878:1;49871:15;49905:4;49902:1;49895:15;49922:180;49970:77;49967:1;49960:88;50067:4;50064:1;50057:15;50091:4;50088:1;50081:15;50108:180;50156:77;50153:1;50146:88;50253:4;50250:1;50243:15;50277:4;50274:1;50267:15;50294:180;50342:77;50339:1;50332:88;50439:4;50436:1;50429:15;50463:4;50460:1;50453:15;50480:180;50528:77;50525:1;50518:88;50625:4;50622:1;50615:15;50649:4;50646:1;50639:15;50666:117;50775:1;50772;50765:12;50789:117;50898:1;50895;50888:12;50912:117;51021:1;51018;51011:12;51035:117;51144:1;51141;51134:12;51158:117;51267:1;51264;51257:12;51281:117;51390:1;51387;51380:12;51404:102;51445:6;51496:2;51492:7;51487:2;51480:5;51476:14;51472:28;51462:38;;51404:102;;;:::o;51512:174::-;51652:26;51648:1;51640:6;51636:14;51629:50;51512:174;:::o;51692:173::-;51832:25;51828:1;51820:6;51816:14;51809:49;51692:173;:::o;51871:181::-;52011:33;52007:1;51999:6;51995:14;51988:57;51871:181;:::o;52058:230::-;52198:34;52194:1;52186:6;52182:14;52175:58;52267:13;52262:2;52254:6;52250:15;52243:38;52058:230;:::o;52294:237::-;52434:34;52430:1;52422:6;52418:14;52411:58;52503:20;52498:2;52490:6;52486:15;52479:45;52294:237;:::o;52537:225::-;52677:34;52673:1;52665:6;52661:14;52654:58;52746:8;52741:2;52733:6;52729:15;52722:33;52537:225;:::o;52768:178::-;52908:30;52904:1;52896:6;52892:14;52885:54;52768:178;:::o;52952:214::-;53092:66;53088:1;53080:6;53076:14;53069:90;52952:214;:::o;53172:165::-;53312:17;53308:1;53300:6;53296:14;53289:41;53172:165;:::o;53343:223::-;53483:34;53479:1;53471:6;53467:14;53460:58;53552:6;53547:2;53539:6;53535:15;53528:31;53343:223;:::o;53572:175::-;53712:27;53708:1;53700:6;53696:14;53689:51;53572:175;:::o;53753:163::-;53893:15;53889:1;53881:6;53877:14;53870:39;53753:163;:::o;53922:221::-;54062:34;54058:1;54050:6;54046:14;54039:58;54131:4;54126:2;54118:6;54114:15;54107:29;53922:221;:::o;54149:231::-;54289:34;54285:1;54277:6;54273:14;54266:58;54358:14;54353:2;54345:6;54341:15;54334:39;54149:231;:::o;54386:180::-;54526:32;54522:1;54514:6;54510:14;54503:56;54386:180;:::o;54572:169::-;54712:21;54708:1;54700:6;54696:14;54689:45;54572:169;:::o;54747:243::-;54887:34;54883:1;54875:6;54871:14;54864:58;54956:26;54951:2;54943:6;54939:15;54932:51;54747:243;:::o;54996:229::-;55136:34;55132:1;55124:6;55120:14;55113:58;55205:12;55200:2;55192:6;55188:15;55181:37;54996:229;:::o;55231:228::-;55371:34;55367:1;55359:6;55355:14;55348:58;55440:11;55435:2;55427:6;55423:15;55416:36;55231:228;:::o;55465:221::-;55605:34;55601:1;55593:6;55589:14;55582:58;55674:4;55669:2;55661:6;55657:15;55650:29;55465:221;:::o;55692:182::-;55832:34;55828:1;55820:6;55816:14;55809:58;55692:182;:::o;55880:231::-;56020:34;56016:1;56008:6;56004:14;55997:58;56089:14;56084:2;56076:6;56072:15;56065:39;55880:231;:::o;56117:182::-;56257:34;56253:1;56245:6;56241:14;56234:58;56117:182;:::o;56305:228::-;56445:34;56441:1;56433:6;56429:14;56422:58;56514:11;56509:2;56501:6;56497:15;56490:36;56305:228;:::o;56539:234::-;56679:34;56675:1;56667:6;56663:14;56656:58;56748:17;56743:2;56735:6;56731:15;56724:42;56539:234;:::o;56779:163::-;56919:15;56915:1;56907:6;56903:14;56896:39;56779:163;:::o;56948:220::-;57088:34;57084:1;57076:6;57072:14;57065:58;57157:3;57152:2;57144:6;57140:15;57133:28;56948:220;:::o;57174:169::-;57314:21;57310:1;57302:6;57298:14;57291:45;57174:169;:::o;57349:167::-;57489:19;57485:1;57477:6;57473:14;57466:43;57349:167;:::o;57522:114::-;;:::o;57642:236::-;57782:34;57778:1;57770:6;57766:14;57759:58;57851:19;57846:2;57838:6;57834:15;57827:44;57642:236;:::o;57884:231::-;58024:34;58020:1;58012:6;58008:14;58001:58;58093:14;58088:2;58080:6;58076:15;58069:39;57884:231;:::o;58121:166::-;58261:18;58257:1;58249:6;58245:14;58238:42;58121:166;:::o;58293:122::-;58366:24;58384:5;58366:24;:::i;:::-;58359:5;58356:35;58346:63;;58405:1;58402;58395:12;58346:63;58293:122;:::o;58421:116::-;58491:21;58506:5;58491:21;:::i;:::-;58484:5;58481:32;58471:60;;58527:1;58524;58517:12;58471:60;58421:116;:::o;58543:120::-;58615:23;58632:5;58615:23;:::i;:::-;58608:5;58605:34;58595:62;;58653:1;58650;58643:12;58595:62;58543:120;:::o;58669:122::-;58742:24;58760:5;58742:24;:::i;:::-;58735:5;58732:35;58722:63;;58781:1;58778;58771:12;58722:63;58669:122;:::o

Swarm Source

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