ETH Price: $2,303.43 (+0.93%)

Token

BlahBlahNFT (BLAHBLAH)
 

Overview

Max Total Supply

0 BLAHBLAH

Holders

1

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
10 BLAHBLAH
0xf0c5988fee06c40a974141b1fd0b5bf173cb199d
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:
BlahBlahNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

/**
 * @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/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

/**
 * @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/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

/**
 * @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/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_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);

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

        _afterTokenTransfer(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 from incorrect owner"
        );
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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

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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

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

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol)

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(
            value <= type(uint224).max,
            "SafeCast: value doesn't fit in 224 bits"
        );
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(
            value <= type(uint128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(
            value <= type(uint96).max,
            "SafeCast: value doesn't fit in 96 bits"
        );
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(
            value <= type(uint64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(
            value <= type(uint32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(
            value <= type(uint16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(
            value <= type(uint8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(
            value >= type(int128).min && value <= type(int128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(
            value >= type(int64).min && value <= type(int64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(
            value >= type(int32).min && value <= type(int32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(
            value >= type(int16).min && value <= type(int16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(
            value >= type(int8).min && value <= type(int8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(
            value <= uint256(type(int256).max),
            "SafeCast: value doesn't fit in an int256"
        );
        return int256(value);
    }
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)

/**
 * @dev This library defines the `History` struct, for checkpointing values as they change at different points in
 * time, and later looking up past values by block number. See {Votes} as an example.
 *
 * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new
 * checkpoint for the current transaction block using the {push} function.
 *
 * _Available since v4.5._
 */
library Checkpoints {
    struct Checkpoint {
        uint32 _blockNumber;
        uint224 _value;
    }

    struct History {
        Checkpoint[] _checkpoints;
    }

    /**
     * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.
     */
    function latest(History storage self) internal view returns (uint256) {
        uint256 pos = self._checkpoints.length;
        return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;
    }

    /**
     * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one
     * before it is returned, or zero otherwise.
     */
    function getAtBlock(History storage self, uint256 blockNumber)
        internal
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "Checkpoints: block not yet mined");

        uint256 high = self._checkpoints.length;
        uint256 low = 0;
        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (self._checkpoints[mid]._blockNumber > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        return high == 0 ? 0 : self._checkpoints[high - 1]._value;
    }

    /**
     * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.
     *
     * Returns previous value and new value.
     */
    function push(History storage self, uint256 value)
        internal
        returns (uint256, uint256)
    {
        uint256 pos = self._checkpoints.length;
        uint256 old = latest(self);
        if (
            pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number
        ) {
            self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);
        } else {
            self._checkpoints.push(
                Checkpoint({
                    _blockNumber: SafeCast.toUint32(block.number),
                    _value: SafeCast.toUint224(value)
                })
            );
        }
        return (old, value);
    }

    /**
     * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will
     * be set to `op(latest, delta)`.
     *
     * Returns previous value and new value.
     */
    function push(
        History storage self,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) internal returns (uint256, uint256) {
        return push(self, op(latest(self), delta));
    }
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

/**
 * @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 = vs &
            bytes32(
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            );
        uint8 v = uint8((uint256(vs) >> 255) + 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 Message, created from `s`. 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(bytes memory s)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n",
                    Strings.toString(s.length),
                    s
                )
            );
    }

    /**
     * @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/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

/**
 * @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;
    address private immutable _CACHED_THIS;

    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
        );
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (
            address(this) == _CACHED_THIS && 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 @openzeppelin/contracts/governance/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)

/**
 * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.
 *
 * _Available since v4.5._
 */
interface IVotes {
    /**
     * @dev Emitted when an account changes their delegate.
     */
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /**
     * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.
     */
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    /**
     * @dev Returns the current amount of votes that `account` has.
     */
    function getVotes(address account) external view returns (uint256);

    /**
     * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).
     */
    function getPastVotes(address account, uint256 blockNumber)
        external
        view
        returns (uint256);

    /**
     * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).
     *
     * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
     * Votes that have not been delegated are still part of total supply, even though they would not participate in a
     * vote.
     */
    function getPastTotalSupply(uint256 blockNumber)
        external
        view
        returns (uint256);

    /**
     * @dev Returns the delegate that `account` has chosen.
     */
    function delegates(address account) external view returns (address);

    /**
     * @dev Delegates votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) external;

    /**
     * @dev Delegates votes from signer to `delegatee`.
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/Votes.sol)

/**
 * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be
 * transferred, and provides a system of vote delegation, where an account can delegate its voting units to a sort of
 * "representative" that will pool delegated voting units from different accounts and can then use it to vote in
 * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an account has to
 * delegate those votes to itself if it wishes to participate in decisions and does not have a trusted representative.
 *
 * This contract is often combined with a token contract such that voting units correspond to token units. For an
 * example, see {ERC721Votes}.
 *
 * The full history of delegate votes is tracked on-chain so that governance protocols can consider votes as distributed
 * at a particular block number to protect against flash loans and double voting. The opt-in delegate system makes the
 * cost of this history tracking optional.
 *
 * When using this module the derived contract must implement {_getVotingUnits} (for example, make it return
 * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of those units (in the
 * previous example, it would be included in {ERC721-_beforeTokenTransfer}).
 *
 * _Available since v4.5._
 */
abstract contract Votes is IVotes, Context, EIP712 {
    using Checkpoints for Checkpoints.History;
    using Counters for Counters.Counter;

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegation;
    mapping(address => Checkpoints.History) private _delegateCheckpoints;
    Checkpoints.History private _totalCheckpoints;

    mapping(address => Counters.Counter) private _nonces;

    /**
     * @dev Returns the current amount of votes that `account` has.
     */
    function getVotes(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _delegateCheckpoints[account].latest();
    }

    /**
     * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastVotes(address account, uint256 blockNumber)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _delegateCheckpoints[account].getAtBlock(blockNumber);
    }

    /**
     * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).
     *
     * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
     * Votes that have not been delegated are still part of total supply, even though they would not participate in a
     * vote.
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastTotalSupply(uint256 blockNumber)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(blockNumber < block.number, "Votes: block not yet mined");
        return _totalCheckpoints.getAtBlock(blockNumber);
    }

    /**
     * @dev Returns the current total supply of votes.
     */
    function _getTotalSupply() internal view virtual returns (uint256) {
        return _totalCheckpoints.latest();
    }

    /**
     * @dev Returns the delegate that `account` has chosen.
     */
    function delegates(address account)
        public
        view
        virtual
        override
        returns (address)
    {
        return _delegation[account];
    }

    /**
     * @dev Delegates votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) public virtual override {
        address account = _msgSender();
        _delegate(account, delegatee);
    }

    /**
     * @dev Delegates votes from signer to `delegatee`.
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= expiry, "Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(
                keccak256(
                    abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry)
                )
            ),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "Votes: invalid nonce");
        _delegate(signer, delegatee);
    }

    /**
     * @dev Delegate all of `account`'s voting units to `delegatee`.
     *
     * Emits events {DelegateChanged} and {DelegateVotesChanged}.
     */
    function _delegate(address account, address delegatee) internal virtual {
        address oldDelegate = delegates(account);
        _delegation[account] = delegatee;

        emit DelegateChanged(account, oldDelegate, delegatee);
        _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account));
    }

    /**
     * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to`
     * should be zero. Total supply of voting units will be adjusted with mints and burns.
     */
    function _transferVotingUnits(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        if (from == address(0)) {
            _totalCheckpoints.push(_add, amount);
        }
        if (to == address(0)) {
            _totalCheckpoints.push(_subtract, amount);
        }
        _moveDelegateVotes(delegates(from), delegates(to), amount);
    }

    /**
     * @dev Moves delegated votes from one delegate to another.
     */
    function _moveDelegateVotes(
        address from,
        address to,
        uint256 amount
    ) private {
        if (from != to && amount > 0) {
            if (from != address(0)) {
                (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[
                    from
                ].push(_subtract, amount);
                emit DelegateVotesChanged(from, oldValue, newValue);
            }
            if (to != address(0)) {
                (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[to]
                    .push(_add, amount);
                emit DelegateVotesChanged(to, oldValue, newValue);
            }
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Consumes a nonce.
     *
     * Returns the current value and increments nonce.
     */
    function _useNonce(address owner)
        internal
        virtual
        returns (uint256 current)
    {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }

    /**
     * @dev Returns an address nonce.
     */
    function nonces(address owner) public view virtual returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev Returns the contract's {EIP712} domain separator.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev Must return the voting units held by an account.
     */
    function _getVotingUnits(address) internal virtual returns (uint256);
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/draft-ERC721Votes.sol)

/**
 * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts
 * as 1 vote unit.
 *
 * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost
 * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of
 * the votes in governance decisions, or they can delegate to themselves to be their own representative.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Votes is ERC721, Votes {
    /**
     * @dev Adjusts votes when tokens are transferred.
     *
     * Emits a {Votes-DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        _transferVotingUnits(from, to, 1);
        super._afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Returns the balance of `account`.
     */
    function _getVotingUnits(address account)
        internal
        virtual
        override
        returns (uint256)
    {
        return balanceOf(account);
    }
}

// File contracts/BlahBlahNFT.sol

// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// $                                                                      $
// $ $$\       $$\           $$\       $$\       $$\           $$\        $
// $ $$ |      $$ |          $$ |      $$ |      $$ |          $$ |       $
// $ $$$$$$$\  $$ | $$$$$$\  $$$$$$$\  $$$$$$$\  $$ | $$$$$$\  $$$$$$$\   $
// $ $$  __$$\ $$ | \____$$\ $$  __$$\ $$  __$$\ $$ | \____$$\ $$  __$$\  $
// $ $$ |  $$ |$$ | $$$$$$$ |$$ |  $$ |$$ |  $$ |$$ | $$$$$$$ |$$ |  $$ | $
// $ $$ |  $$ |$$ |$$  __$$ |$$ |  $$ |$$ |  $$ |$$ |$$  __$$ |$$ |  $$ | $
// $ $$$$$$$  |$$ |\$$$$$$$ |$$ |  $$ |$$$$$$$  |$$ |\$$$$$$$ |$$ |  $$ | $
// $ \_______/ \__| \_______|\__|  \__|\_______/ \__| \_______|\__|  \__| $
// $                                                                      $
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

abstract contract IERC20 {
    function balanceOf(address account) external view virtual returns (uint256);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual returns (bool);

    function transfer(address to, uint256 amount)
        external
        virtual
        returns (bool);
}

contract BlahBlahNFT is Ownable, ERC721Votes {
    uint256 public currentId = 1;
    uint256 public cap = 20000;
    bool public isPublicMintActive = false;
    uint256 public blahprice = 6000 * (10**18);
    string public baseURL;
    IERC20 public blahToken;
    string public provenanceHash;
    mapping(address => uint256) public reservations;
    uint256 public totalReserved = 0;
    bool public isReservationActive = true;
    bool public isReservationSaleActive = false;

    constructor()
        ERC721("BlahBlahNFT", "BLAHBLAH")
        EIP712("BlahBlahNFT", "1")
    {}

    function getReservation(address ad) public view returns (uint256) {
        return reservations[ad];
    }

    function mintReserved() public {
        require(isReservationSaleActive);
        uint256 res = reservations[msg.sender];
        require(res > 0);

        for (uint256 i = 0; i < res; i++) {
            uint256 tokenId = currentId;
            currentId = currentId + 1;
            _safeMint(msg.sender, tokenId);
        }

        reservations[msg.sender] = 0;
    }

    function reserveWithBlah(uint256 qty) public payable {
        require(isReservationActive);
        require(totalReserved + qty <= cap);
        require(blahToken.balanceOf(msg.sender) >= qty * blahprice);
        blahToken.transferFrom(msg.sender, address(this), qty * blahprice);
        reservations[msg.sender] = reservations[msg.sender] + qty;
        totalReserved = (totalReserved + qty);
    }

    function initializeToken(address tokenAddress) public onlyOwner {
        blahToken = IERC20(tokenAddress);
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURL = uri;
    }

    function flipPublicMint() public onlyOwner {
        isPublicMintActive = !isPublicMintActive;
    }

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

    function withdrawToDAO(address daoAddress) public onlyOwner {
        blahToken.transfer(daoAddress, blahToken.balanceOf(address(this)));
    }

    function devReserve() external onlyOwner {
        for (uint256 i = 0; i < 10; i++) {
            uint256 tokenId = currentId;
            currentId = currentId + 1;
            _safeMint(msg.sender, tokenId);
        }
    }

    function setBlahPrice(uint256 newblahprice) public onlyOwner {
        blahprice = newblahprice;
    }

    function setCap(uint256 newCap) public onlyOwner {
        cap = newCap;
    }

    function setProvenanceHash(string memory phash) public onlyOwner {
        provenanceHash = phash;
    }

    function flipReservationState() public onlyOwner {
        isReservationActive = !isReservationActive;
    }

    function flipReservationSaleState() public onlyOwner {
        isReservationSaleActive = !isReservationSaleActive;
    }
}

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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blahToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blahprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReservationSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReservationState","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":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"}],"name":"getReservation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"initializeToken","outputs":[],"stateMutability":"nonpayable","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":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReservationActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReservationSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reservations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"reserveWithBlah","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newblahprice","type":"uint256"}],"name":"setBlahPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"phash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"daoAddress","type":"address"}],"name":"withdrawToDAO","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040526001600b55614e20600c556000600d60006101000a81548160ff02191690831515021790555069014542ba12a337c00000600e5560006013556001601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055503480156200008157600080fd5b506040518060400160405280600b81526020017f426c6168426c61684e46540000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f426c6168426c61684e46540000000000000000000000000000000000000000008152506040518060400160405280600881526020017f424c4148424c41480000000000000000000000000000000000000000000000008152506200017a6200016e6200026960201b60201c565b6200027160201b60201c565b81600190805190602001906200019292919062000371565b508060029080519060200190620001ab92919062000371565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620002178184846200033560201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050506200055e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600083838346306040516020016200035295949392919062000454565b6040516020818303038152906040528051906020012090509392505050565b8280546200037f90620004f9565b90600052602060002090601f016020900481019282620003a35760008555620003ef565b82601f10620003be57805160ff1916838001178555620003ef565b82800160010185558215620003ef579182015b82811115620003ee578251825591602001919060010190620003d1565b5b509050620003fe919062000402565b5090565b5b808211156200041d57600081600090555060010162000403565b5090565b6200042c81620004b1565b82525050565b6200043d81620004c5565b82525050565b6200044e81620004ef565b82525050565b600060a0820190506200046b600083018862000432565b6200047a602083018762000432565b62000489604083018662000432565b62000498606083018562000443565b620004a7608083018462000421565b9695505050505050565b6000620004be82620004cf565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200051257607f821691505b602082108114156200052957620005286200052f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160601c60e0516101005161012051615ea6620005b16000396000612a2001526000612a6201526000612a4101526000612976015260006129cc015260006129f50152615ea66000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063c3cda520116100dc578063e985e9c511610095578063fb31e62c1161006f578063fb31e62c14610a88578063fcd2a42714610aa4578063fd3dc53a14610abb578063ffcb00e814610af8576102ae565b8063e985e9c514610a0b578063ec8c890414610a48578063f2fde38b14610a5f576102ae565b8063c3cda5201461090d578063c6787bb114610936578063c6ab67a31461094d578063c71b0e1c14610978578063c87b56dd146109a3578063e00dd161146109e0576102ae565b806399a932141161012e57806399a93214146107ff5780639ab24eb01461082a578063a22cb46514610867578063a88af1d314610890578063b2066f80146108a7578063b88d4fde146108e4576102ae565b8063715018a6146106ed5780637ecebe0014610704578063839a80de146107415780638da5cb5b1461076c5780638e539e8c1461079757806395d89b41146107d4576102ae565b80633a46b1a81161021957806355f804b3116101d257806355f804b3146105bb578063587cde1e146105e45780635c19a95c146106215780636352211e1461064a5780636ff9a9d21461068757806370a08231146106b0576102ae565b80633a46b1a8146104bf5780633ccfd60b146104fc57806340c84b0e1461051357806342842e0e1461053e57806347786d37146105675780635259576c14610590576102ae565b8063234a6ed81161026b578063234a6ed8146103c157806323b872dd146103ea5780632d6b6224146104135780633322370f1461043e578063355274ea146104695780633644e51514610494576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b314610358578063109695231461038157806321bfc1aa146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d5919061470f565b610b21565b6040516102e79190614ddb565b60405180910390f35b3480156102fc57600080fd5b50610305610c03565b6040516103129190614f09565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906147a2565b610c95565b60405161034f9190614d14565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190614621565b610d1a565b005b34801561038d57600080fd5b506103a860048036038101906103a39190614761565b610e32565b005b3480156103b657600080fd5b506103bf610ec8565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906144b6565b610f70565b005b3480156103f657600080fd5b50610411600480360381019061040c919061451b565b611030565b005b34801561041f57600080fd5b50610428611090565b6040516104359190614ddb565b60405180910390f35b34801561044a57600080fd5b506104536110a3565b6040516104609190614ddb565b60405180910390f35b34801561047557600080fd5b5061047e6110b6565b60405161048b919061526b565b60405180910390f35b3480156104a057600080fd5b506104a96110bc565b6040516104b69190614df6565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190614621565b6110cb565b6040516104f3919061526b565b60405180910390f35b34801561050857600080fd5b50610511611126565b005b34801561051f57600080fd5b506105286111eb565b6040516105359190614f09565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061451b565b611279565b005b34801561057357600080fd5b5061058e600480360381019061058991906147a2565b611299565b005b34801561059c57600080fd5b506105a561131f565b6040516105b29190614ddb565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190614761565b611332565b005b3480156105f057600080fd5b5061060b600480360381019061060691906144b6565b6113c8565b6040516106189190614d14565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906144b6565b611431565b005b34801561065657600080fd5b50610671600480360381019061066c91906147a2565b61144b565b60405161067e9190614d14565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a991906144b6565b6114fd565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906144b6565b6116d6565b6040516106e4919061526b565b60405180910390f35b3480156106f957600080fd5b5061070261178e565b005b34801561071057600080fd5b5061072b600480360381019061072691906144b6565b611816565b604051610738919061526b565b60405180910390f35b34801561074d57600080fd5b50610756611866565b604051610763919061526b565b60405180910390f35b34801561077857600080fd5b5061078161186c565b60405161078e9190614d14565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906147a2565b611895565b6040516107cb919061526b565b60405180910390f35b3480156107e057600080fd5b506107e96118f4565b6040516107f69190614f09565b60405180910390f35b34801561080b57600080fd5b50610814611986565b6040516108219190614eee565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906144b6565b6119ac565b60405161085e919061526b565b60405180910390f35b34801561087357600080fd5b5061088e600480360381019061088991906145e5565b6119fc565b005b34801561089c57600080fd5b506108a5611a12565b005b3480156108b357600080fd5b506108ce60048036038101906108c991906144b6565b611aba565b6040516108db919061526b565b60405180910390f35b3480156108f057600080fd5b5061090b6004803603810190610906919061456a565b611b03565b005b34801561091957600080fd5b50610934600480360381019061092f919061465d565b611b65565b005b34801561094257600080fd5b5061094b611c69565b005b34801561095957600080fd5b50610962611d11565b60405161096f9190614f09565b60405180910390f35b34801561098457600080fd5b5061098d611d9f565b60405161099a919061526b565b60405180910390f35b3480156109af57600080fd5b506109ca60048036038101906109c591906147a2565b611da5565b6040516109d79190614f09565b60405180910390f35b3480156109ec57600080fd5b506109f5611e4c565b604051610a02919061526b565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d91906144df565b611e52565b604051610a3f9190614ddb565b60405180910390f35b348015610a5457600080fd5b50610a5d611ee6565b005b348015610a6b57600080fd5b50610a866004803603810190610a8191906144b6565b611fde565b005b610aa26004803603810190610a9d91906147a2565b6120d6565b005b348015610ab057600080fd5b50610ab9612333565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906144b6565b6123f8565b604051610aef919061526b565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906147a2565b612410565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfc5750610bfb82612496565b5b9050919050565b606060018054610c129061557f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e9061557f565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b5050505050905090565b6000610ca082612500565b610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd69061518b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d258261144b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d9061520b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db561256c565b73ffffffffffffffffffffffffffffffffffffffff161480610de45750610de381610dde61256c565b611e52565b5b610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906150cb565b60405180910390fd5b610e2d8383612574565b505050565b610e3a61256c565b73ffffffffffffffffffffffffffffffffffffffff16610e5861186c565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906151ab565b60405180910390fd5b8060119080519060200190610ec4929190614286565b5050565b610ed061256c565b73ffffffffffffffffffffffffffffffffffffffff16610eee61186c565b73ffffffffffffffffffffffffffffffffffffffff1614610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906151ab565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b610f7861256c565b73ffffffffffffffffffffffffffffffffffffffff16610f9661186c565b73ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906151ab565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61104161103b61256c565b8261262d565b611080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110779061522b565b60405180910390fd5b61108b83838361270b565b505050565b600d60009054906101000a900460ff1681565b601460009054906101000a900460ff1681565b600c5481565b60006110c6612972565b905090565b600061111e82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a8c90919063ffffffff16565b905092915050565b61112e61256c565b73ffffffffffffffffffffffffffffffffffffffff1661114c61186c565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611199906151ab565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e8573d6000803e3d6000fd5b50565b600f80546111f89061557f565b80601f01602080910402602001604051908101604052809291908181526020018280546112249061557f565b80156112715780601f1061124657610100808354040283529160200191611271565b820191906000526020600020905b81548152906001019060200180831161125457829003601f168201915b505050505081565b61129483838360405180602001604052806000815250611b03565b505050565b6112a161256c565b73ffffffffffffffffffffffffffffffffffffffff166112bf61186c565b73ffffffffffffffffffffffffffffffffffffffff1614611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906151ab565b60405180910390fd5b80600c8190555050565b601460019054906101000a900460ff1681565b61133a61256c565b73ffffffffffffffffffffffffffffffffffffffff1661135861186c565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a5906151ab565b60405180910390fd5b80600f90805190602001906113c4929190614286565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061143b61256c565b90506114478183612c30565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061510b565b60405180910390fd5b80915050919050565b61150561256c565b73ffffffffffffffffffffffffffffffffffffffff1661152361186c565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611570906151ab565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116139190614d14565b60206040518083038186803b15801561162b57600080fd5b505afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906147cb565b6040518363ffffffff1660e01b8152600401611680929190614db2565b602060405180830381600087803b15801561169a57600080fd5b505af11580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906146e6565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e906150eb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179661256c565b73ffffffffffffffffffffffffffffffffffffffff166117b461186c565b73ffffffffffffffffffffffffffffffffffffffff161461180a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611801906151ab565b60405180910390fd5b6118146000612d44565b565b600061185f600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e08565b9050919050565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d09061512b565b60405180910390fd5b6118ed826009612a8c90919063ffffffff16565b9050919050565b6060600280546119039061557f565b80601f016020809104026020016040519081016040528092919081815260200182805461192f9061557f565b801561197c5780601f106119515761010080835404028352916020019161197c565b820191906000526020600020905b81548152906001019060200180831161195f57829003601f168201915b5050505050905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006119f5600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e16565b9050919050565b611a0e611a0761256c565b8383612ed7565b5050565b611a1a61256c565b73ffffffffffffffffffffffffffffffffffffffff16611a3861186c565b73ffffffffffffffffffffffffffffffffffffffff1614611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a85906151ab565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b14611b0e61256c565b8361262d565b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a9061522b565b60405180910390fd5b611b5f84848484613044565b50505050565b83421115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906150ab565b60405180910390fd5b6000611c0a611c027fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001611be79493929190614e11565b604051602081830303815290604052805190602001206130a0565b8585856130ba565b9050611c15816130e5565b8614611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90614f4b565b60405180910390fd5b611c608188612c30565b50505050505050565b611c7161256c565b73ffffffffffffffffffffffffffffffffffffffff16611c8f61186c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc906151ab565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b60118054611d1e9061557f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4a9061557f565b8015611d975780601f10611d6c57610100808354040283529160200191611d97565b820191906000526020600020905b815481529060010190602001808311611d7a57829003601f168201915b505050505081565b60135481565b6060611db082612500565b611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de6906151eb565b60405180910390fd5b6000611df9613143565b90506000815111611e195760405180602001604052806000815250611e44565b80611e238461315a565b604051602001611e34929190614cb9565b6040516020818303038152906040525b915050919050565b600b5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601460019054906101000a900460ff16611eff57600080fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611f5057600080fd5b60005b81811015611f95576000600b5490506001600b54611f719190615379565b600b81905550611f813382613307565b508080611f8d906155e2565b915050611f53565b506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611fe661256c565b73ffffffffffffffffffffffffffffffffffffffff1661200461186c565b73ffffffffffffffffffffffffffffffffffffffff161461205a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612051906151ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614fab565b60405180910390fd5b6120d381612d44565b50565b601460009054906101000a900460ff166120ef57600080fd5b600c54816013546121009190615379565b111561210b57600080fd5b600e54816121199190615400565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016121749190614d14565b60206040518083038186803b15801561218c57600080fd5b505afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c491906147cb565b10156121cf57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e548561221d9190615400565b6040518463ffffffff1660e01b815260040161223b93929190614d2f565b602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228d91906146e6565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d99190615379565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060135461232a9190615379565b60138190555050565b61233b61256c565b73ffffffffffffffffffffffffffffffffffffffff1661235961186c565b73ffffffffffffffffffffffffffffffffffffffff16146123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a6906151ab565b60405180910390fd5b60005b600a8110156123f5576000600b5490506001600b546123d19190615379565b600b819055506123e13382613307565b5080806123ed906155e2565b9150506123b2565b50565b60126020528060005260406000206000915090505481565b61241861256c565b73ffffffffffffffffffffffffffffffffffffffff1661243661186c565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612483906151ab565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125e78361144b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061263882612500565b612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e9061506b565b60405180910390fd5b60006126828361144b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126f157508373ffffffffffffffffffffffffffffffffffffffff166126d984610c95565b73ffffffffffffffffffffffffffffffffffffffff16145b8061270257506127018185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661272b8261144b565b73ffffffffffffffffffffffffffffffffffffffff1614612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890614fcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e89061500b565b60405180910390fd5b6127fc838383613325565b612807600082612574565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612857919061545a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ae9190615379565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296d83838361332a565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156129ee57507f000000000000000000000000000000000000000000000000000000000000000046145b15612a1b577f00000000000000000000000000000000000000000000000000000000000000009050612a89565b612a867f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613346565b90505b90565b6000438210612ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac79061508b565b60405180910390fd5b60008360000180549050905060005b81811015612b7a576000612af38284613380565b905084866000018281548110612b32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b6457809250612b74565b600181612b719190615379565b91505b50612adf565b60008214612c055784600001600183612b93919061545a565b81548110612bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612c08565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000612c3b836113c8565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612d3f8183612d3a866133a6565b6133b8565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000808260000180549050905060008114612eae5782600001600182612e3c919061545a565b81548110612e73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612eb1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d9061502b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130379190614ddb565b60405180910390a3505050565b61304f84848461270b565b61305b848484846135c5565b61309a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309190614f8b565b60405180910390fd5b50505050565b60006130b36130ad612972565b8361375c565b9050919050565b60008060006130cb8787878761378f565b915091506130d88161389c565b8192505050949350505050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061313281612e08565b915061313d81613bed565b50919050565b606060405180602001604052806000815250905090565b606060008214156131a2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613302565b600082905060005b600082146131d45780806131bd906155e2565b915050600a826131cd91906153cf565b91506131aa565b60008167ffffffffffffffff811115613216577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132485781602001600182028036833780820191505090505b5090505b600085146132fb57600182613261919061545a565b9150600a856132709190615635565b603061327c9190615379565b60f81b8183815181106132b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f491906153cf565b945061324c565b8093505050505b919050565b613321828260405180602001604052806000815250613c03565b5050565b505050565b61333683836001613c5e565b613341838383613d1e565b505050565b60008383834630604051602001613361959493929190614e56565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861339191906153cf565b82841661339e9190615379565b905092915050565b60006133b1826116d6565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156133f45750600081115b156135c057600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134dc57600080613485613d2384600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d399092919063ffffffff16565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516134d1929190615286565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135bf57600080613568613d6784600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d399092919063ffffffff16565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516135b4929190615286565b60405180910390a250505b5b505050565b60006135e68473ffffffffffffffffffffffffffffffffffffffff16613d7d565b1561374f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261360f61256c565b8786866040518563ffffffff1660e01b81526004016136319493929190614d66565b602060405180830381600087803b15801561364b57600080fd5b505af192505050801561367c57506040513d601f19601f820116820180604052508101906136799190614738565b60015b6136ff573d80600081146136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506000815114156136f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ee90614f8b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613754565b600190505b949350505050565b60008282604051602001613771929190614cdd565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156137ca576000600391509150613893565b601b8560ff16141580156137e25750601c8560ff1614155b156137f4576000600491509150613893565b6000600187878787604051600081526020016040526040516138199493929190614ea9565b6020604051602081039080840390855afa15801561383b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561388a57600060019250925050613893565b80600092509250505b94509492505050565b600060048111156138d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561390f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561391a57613bea565b60016004811115613954577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c590614f2b565b60405180910390fd5b60026004811115613a08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7990614f6b565b60405180910390fd5b60036004811115613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613af5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d9061504b565b60405180910390fd5b600480811115613b6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be09061514b565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b613c0d8383613da0565b613c1a60008484846135c5565b613c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5090614f8b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613cae57613cab613d67826009613d399092919063ffffffff16565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cfe57613cfb613d23826009613d399092919063ffffffff16565b50505b613d19613d0a846113c8565b613d13846113c8565b836133b8565b505050565b505050565b60008183613d31919061545a565b905092915050565b600080613d5b85613d56613d4c88612e16565b868863ffffffff16565b613f7a565b91509150935093915050565b60008183613d759190615379565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e079061516b565b60405180910390fd5b613e1981612500565b15613e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5090614feb565b60405180910390fd5b613e6560008383613325565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eb59190615379565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613f766000838361332a565b5050565b6000806000846000018054905090506000613f9486612e16565b905060008211801561401057504386600001600184613fb3919061545a565b81548110613fea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156140c65761401e856141c8565b8660000160018461402f919061545a565b81548110614066577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506141b9565b8560000160405180604001604052806140de43614233565b63ffffffff1681526020016140f2886141c8565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561422b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614222906151cb565b60405180910390fd5b819050919050565b600063ffffffff801682111561427e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142759061524b565b60405180910390fd5b819050919050565b8280546142929061557f565b90600052602060002090601f0160209004810192826142b457600085556142fb565b82601f106142cd57805160ff19168380011785556142fb565b828001600101855582156142fb579182015b828111156142fa5782518255916020019190600101906142df565b5b509050614308919061430c565b5090565b5b8082111561432557600081600090555060010161430d565b5090565b600061433c614337846152d4565b6152af565b90508281526020810184848401111561435457600080fd5b61435f84828561553d565b509392505050565b600061437a61437584615305565b6152af565b90508281526020810184848401111561439257600080fd5b61439d84828561553d565b509392505050565b6000813590506143b481615de6565b92915050565b6000813590506143c981615dfd565b92915050565b6000815190506143de81615dfd565b92915050565b6000813590506143f381615e14565b92915050565b60008135905061440881615e2b565b92915050565b60008151905061441d81615e2b565b92915050565b600082601f83011261443457600080fd5b8135614444848260208601614329565b91505092915050565b600082601f83011261445e57600080fd5b813561446e848260208601614367565b91505092915050565b60008135905061448681615e42565b92915050565b60008151905061449b81615e42565b92915050565b6000813590506144b081615e59565b92915050565b6000602082840312156144c857600080fd5b60006144d6848285016143a5565b91505092915050565b600080604083850312156144f257600080fd5b6000614500858286016143a5565b9250506020614511858286016143a5565b9150509250929050565b60008060006060848603121561453057600080fd5b600061453e868287016143a5565b935050602061454f868287016143a5565b925050604061456086828701614477565b9150509250925092565b6000806000806080858703121561458057600080fd5b600061458e878288016143a5565b945050602061459f878288016143a5565b93505060406145b087828801614477565b925050606085013567ffffffffffffffff8111156145cd57600080fd5b6145d987828801614423565b91505092959194509250565b600080604083850312156145f857600080fd5b6000614606858286016143a5565b9250506020614617858286016143ba565b9150509250929050565b6000806040838503121561463457600080fd5b6000614642858286016143a5565b925050602061465385828601614477565b9150509250929050565b60008060008060008060c0878903121561467657600080fd5b600061468489828a016143a5565b965050602061469589828a01614477565b95505060406146a689828a01614477565b94505060606146b789828a016144a1565b93505060806146c889828a016143e4565b92505060a06146d989828a016143e4565b9150509295509295509295565b6000602082840312156146f857600080fd5b6000614706848285016143cf565b91505092915050565b60006020828403121561472157600080fd5b600061472f848285016143f9565b91505092915050565b60006020828403121561474a57600080fd5b60006147588482850161440e565b91505092915050565b60006020828403121561477357600080fd5b600082013567ffffffffffffffff81111561478d57600080fd5b6147998482850161444d565b91505092915050565b6000602082840312156147b457600080fd5b60006147c284828501614477565b91505092915050565b6000602082840312156147dd57600080fd5b60006147eb8482850161448c565b91505092915050565b6147fd8161548e565b82525050565b61480c816154a0565b82525050565b61481b816154ac565b82525050565b61483261482d826154ac565b61562b565b82525050565b600061484382615336565b61484d818561534c565b935061485d81856020860161554c565b61486681615722565b840191505092915050565b61487a81615519565b82525050565b600061488b82615341565b614895818561535d565b93506148a581856020860161554c565b6148ae81615722565b840191505092915050565b60006148c482615341565b6148ce818561536e565b93506148de81856020860161554c565b80840191505092915050565b60006148f760188361535d565b915061490282615733565b602082019050919050565b600061491a60148361535d565b91506149258261575c565b602082019050919050565b600061493d601f8361535d565b915061494882615785565b602082019050919050565b600061496060328361535d565b915061496b826157ae565b604082019050919050565b600061498360268361535d565b915061498e826157fd565b604082019050919050565b60006149a660258361535d565b91506149b18261584c565b604082019050919050565b60006149c9601c8361535d565b91506149d48261589b565b602082019050919050565b60006149ec60028361536e565b91506149f7826158c4565b600282019050919050565b6000614a0f60248361535d565b9150614a1a826158ed565b604082019050919050565b6000614a3260198361535d565b9150614a3d8261593c565b602082019050919050565b6000614a5560228361535d565b9150614a6082615965565b604082019050919050565b6000614a78602c8361535d565b9150614a83826159b4565b604082019050919050565b6000614a9b60208361535d565b9150614aa682615a03565b602082019050919050565b6000614abe60188361535d565b9150614ac982615a2c565b602082019050919050565b6000614ae160388361535d565b9150614aec82615a55565b604082019050919050565b6000614b04602a8361535d565b9150614b0f82615aa4565b604082019050919050565b6000614b2760298361535d565b9150614b3282615af3565b604082019050919050565b6000614b4a601a8361535d565b9150614b5582615b42565b602082019050919050565b6000614b6d60228361535d565b9150614b7882615b6b565b604082019050919050565b6000614b9060208361535d565b9150614b9b82615bba565b602082019050919050565b6000614bb3602c8361535d565b9150614bbe82615be3565b604082019050919050565b6000614bd660208361535d565b9150614be182615c32565b602082019050919050565b6000614bf960278361535d565b9150614c0482615c5b565b604082019050919050565b6000614c1c602f8361535d565b9150614c2782615caa565b604082019050919050565b6000614c3f60218361535d565b9150614c4a82615cf9565b604082019050919050565b6000614c6260318361535d565b9150614c6d82615d48565b604082019050919050565b6000614c8560268361535d565b9150614c9082615d97565b604082019050919050565b614ca481615502565b82525050565b614cb38161550c565b82525050565b6000614cc582856148b9565b9150614cd182846148b9565b91508190509392505050565b6000614ce8826149df565b9150614cf48285614821565b602082019150614d048284614821565b6020820191508190509392505050565b6000602082019050614d2960008301846147f4565b92915050565b6000606082019050614d4460008301866147f4565b614d5160208301856147f4565b614d5e6040830184614c9b565b949350505050565b6000608082019050614d7b60008301876147f4565b614d8860208301866147f4565b614d956040830185614c9b565b8181036060830152614da78184614838565b905095945050505050565b6000604082019050614dc760008301856147f4565b614dd46020830184614c9b565b9392505050565b6000602082019050614df06000830184614803565b92915050565b6000602082019050614e0b6000830184614812565b92915050565b6000608082019050614e266000830187614812565b614e3360208301866147f4565b614e406040830185614c9b565b614e4d6060830184614c9b565b95945050505050565b600060a082019050614e6b6000830188614812565b614e786020830187614812565b614e856040830186614812565b614e926060830185614c9b565b614e9f60808301846147f4565b9695505050505050565b6000608082019050614ebe6000830187614812565b614ecb6020830186614caa565b614ed86040830185614812565b614ee56060830184614812565b95945050505050565b6000602082019050614f036000830184614871565b92915050565b60006020820190508181036000830152614f238184614880565b905092915050565b60006020820190508181036000830152614f44816148ea565b9050919050565b60006020820190508181036000830152614f648161490d565b9050919050565b60006020820190508181036000830152614f8481614930565b9050919050565b60006020820190508181036000830152614fa481614953565b9050919050565b60006020820190508181036000830152614fc481614976565b9050919050565b60006020820190508181036000830152614fe481614999565b9050919050565b60006020820190508181036000830152615004816149bc565b9050919050565b6000602082019050818103600083015261502481614a02565b9050919050565b6000602082019050818103600083015261504481614a25565b9050919050565b6000602082019050818103600083015261506481614a48565b9050919050565b6000602082019050818103600083015261508481614a6b565b9050919050565b600060208201905081810360008301526150a481614a8e565b9050919050565b600060208201905081810360008301526150c481614ab1565b9050919050565b600060208201905081810360008301526150e481614ad4565b9050919050565b6000602082019050818103600083015261510481614af7565b9050919050565b6000602082019050818103600083015261512481614b1a565b9050919050565b6000602082019050818103600083015261514481614b3d565b9050919050565b6000602082019050818103600083015261516481614b60565b9050919050565b6000602082019050818103600083015261518481614b83565b9050919050565b600060208201905081810360008301526151a481614ba6565b9050919050565b600060208201905081810360008301526151c481614bc9565b9050919050565b600060208201905081810360008301526151e481614bec565b9050919050565b6000602082019050818103600083015261520481614c0f565b9050919050565b6000602082019050818103600083015261522481614c32565b9050919050565b6000602082019050818103600083015261524481614c55565b9050919050565b6000602082019050818103600083015261526481614c78565b9050919050565b60006020820190506152806000830184614c9b565b92915050565b600060408201905061529b6000830185614c9b565b6152a86020830184614c9b565b9392505050565b60006152b96152ca565b90506152c582826155b1565b919050565b6000604051905090565b600067ffffffffffffffff8211156152ef576152ee6156f3565b5b6152f882615722565b9050602081019050919050565b600067ffffffffffffffff8211156153205761531f6156f3565b5b61532982615722565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061538482615502565b915061538f83615502565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153c4576153c3615666565b5b828201905092915050565b60006153da82615502565b91506153e583615502565b9250826153f5576153f4615695565b5b828204905092915050565b600061540b82615502565b915061541683615502565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561544f5761544e615666565b5b828202905092915050565b600061546582615502565b915061547083615502565b92508282101561548357615482615666565b5b828203905092915050565b6000615499826154e2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155248261552b565b9050919050565b6000615536826154e2565b9050919050565b82818337600083830152505050565b60005b8381101561556a57808201518184015260208101905061554f565b83811115615579576000848401525b50505050565b6000600282049050600182168061559757607f821691505b602082108114156155ab576155aa6156c4565b5b50919050565b6155ba82615722565b810181811067ffffffffffffffff821117156155d9576155d86156f3565b5b80604052505050565b60006155ed82615502565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156205761561f615666565b5b600182019050919050565b6000819050919050565b600061564082615502565b915061564b83615502565b92508261565b5761565a615695565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f566f7465733a20696e76616c6964206e6f6e6365000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b7f566f7465733a207369676e617475726520657870697265640000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f566f7465733a20626c6f636b206e6f7420796574206d696e6564000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b615def8161548e565b8114615dfa57600080fd5b50565b615e06816154a0565b8114615e1157600080fd5b50565b615e1d816154ac565b8114615e2857600080fd5b50565b615e34816154b6565b8114615e3f57600080fd5b50565b615e4b81615502565b8114615e5657600080fd5b50565b615e628161550c565b8114615e6d57600080fd5b5056fea26469706673582212202dcae28e64318663469c5bec0d5ca85b244d66f767a06de331ee2a3e1d24357364736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063715018a611610175578063c3cda520116100dc578063e985e9c511610095578063fb31e62c1161006f578063fb31e62c14610a88578063fcd2a42714610aa4578063fd3dc53a14610abb578063ffcb00e814610af8576102ae565b8063e985e9c514610a0b578063ec8c890414610a48578063f2fde38b14610a5f576102ae565b8063c3cda5201461090d578063c6787bb114610936578063c6ab67a31461094d578063c71b0e1c14610978578063c87b56dd146109a3578063e00dd161146109e0576102ae565b806399a932141161012e57806399a93214146107ff5780639ab24eb01461082a578063a22cb46514610867578063a88af1d314610890578063b2066f80146108a7578063b88d4fde146108e4576102ae565b8063715018a6146106ed5780637ecebe0014610704578063839a80de146107415780638da5cb5b1461076c5780638e539e8c1461079757806395d89b41146107d4576102ae565b80633a46b1a81161021957806355f804b3116101d257806355f804b3146105bb578063587cde1e146105e45780635c19a95c146106215780636352211e1461064a5780636ff9a9d21461068757806370a08231146106b0576102ae565b80633a46b1a8146104bf5780633ccfd60b146104fc57806340c84b0e1461051357806342842e0e1461053e57806347786d37146105675780635259576c14610590576102ae565b8063234a6ed81161026b578063234a6ed8146103c157806323b872dd146103ea5780632d6b6224146104135780633322370f1461043e578063355274ea146104695780633644e51514610494576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b314610358578063109695231461038157806321bfc1aa146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d5919061470f565b610b21565b6040516102e79190614ddb565b60405180910390f35b3480156102fc57600080fd5b50610305610c03565b6040516103129190614f09565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906147a2565b610c95565b60405161034f9190614d14565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190614621565b610d1a565b005b34801561038d57600080fd5b506103a860048036038101906103a39190614761565b610e32565b005b3480156103b657600080fd5b506103bf610ec8565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906144b6565b610f70565b005b3480156103f657600080fd5b50610411600480360381019061040c919061451b565b611030565b005b34801561041f57600080fd5b50610428611090565b6040516104359190614ddb565b60405180910390f35b34801561044a57600080fd5b506104536110a3565b6040516104609190614ddb565b60405180910390f35b34801561047557600080fd5b5061047e6110b6565b60405161048b919061526b565b60405180910390f35b3480156104a057600080fd5b506104a96110bc565b6040516104b69190614df6565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190614621565b6110cb565b6040516104f3919061526b565b60405180910390f35b34801561050857600080fd5b50610511611126565b005b34801561051f57600080fd5b506105286111eb565b6040516105359190614f09565b60405180910390f35b34801561054a57600080fd5b506105656004803603810190610560919061451b565b611279565b005b34801561057357600080fd5b5061058e600480360381019061058991906147a2565b611299565b005b34801561059c57600080fd5b506105a561131f565b6040516105b29190614ddb565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190614761565b611332565b005b3480156105f057600080fd5b5061060b600480360381019061060691906144b6565b6113c8565b6040516106189190614d14565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906144b6565b611431565b005b34801561065657600080fd5b50610671600480360381019061066c91906147a2565b61144b565b60405161067e9190614d14565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a991906144b6565b6114fd565b005b3480156106bc57600080fd5b506106d760048036038101906106d291906144b6565b6116d6565b6040516106e4919061526b565b60405180910390f35b3480156106f957600080fd5b5061070261178e565b005b34801561071057600080fd5b5061072b600480360381019061072691906144b6565b611816565b604051610738919061526b565b60405180910390f35b34801561074d57600080fd5b50610756611866565b604051610763919061526b565b60405180910390f35b34801561077857600080fd5b5061078161186c565b60405161078e9190614d14565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906147a2565b611895565b6040516107cb919061526b565b60405180910390f35b3480156107e057600080fd5b506107e96118f4565b6040516107f69190614f09565b60405180910390f35b34801561080b57600080fd5b50610814611986565b6040516108219190614eee565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906144b6565b6119ac565b60405161085e919061526b565b60405180910390f35b34801561087357600080fd5b5061088e600480360381019061088991906145e5565b6119fc565b005b34801561089c57600080fd5b506108a5611a12565b005b3480156108b357600080fd5b506108ce60048036038101906108c991906144b6565b611aba565b6040516108db919061526b565b60405180910390f35b3480156108f057600080fd5b5061090b6004803603810190610906919061456a565b611b03565b005b34801561091957600080fd5b50610934600480360381019061092f919061465d565b611b65565b005b34801561094257600080fd5b5061094b611c69565b005b34801561095957600080fd5b50610962611d11565b60405161096f9190614f09565b60405180910390f35b34801561098457600080fd5b5061098d611d9f565b60405161099a919061526b565b60405180910390f35b3480156109af57600080fd5b506109ca60048036038101906109c591906147a2565b611da5565b6040516109d79190614f09565b60405180910390f35b3480156109ec57600080fd5b506109f5611e4c565b604051610a02919061526b565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d91906144df565b611e52565b604051610a3f9190614ddb565b60405180910390f35b348015610a5457600080fd5b50610a5d611ee6565b005b348015610a6b57600080fd5b50610a866004803603810190610a8191906144b6565b611fde565b005b610aa26004803603810190610a9d91906147a2565b6120d6565b005b348015610ab057600080fd5b50610ab9612333565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906144b6565b6123f8565b604051610aef919061526b565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906147a2565b612410565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfc5750610bfb82612496565b5b9050919050565b606060018054610c129061557f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e9061557f565b8015610c8b5780601f10610c6057610100808354040283529160200191610c8b565b820191906000526020600020905b815481529060010190602001808311610c6e57829003601f168201915b5050505050905090565b6000610ca082612500565b610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd69061518b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d258261144b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d9061520b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db561256c565b73ffffffffffffffffffffffffffffffffffffffff161480610de45750610de381610dde61256c565b611e52565b5b610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906150cb565b60405180910390fd5b610e2d8383612574565b505050565b610e3a61256c565b73ffffffffffffffffffffffffffffffffffffffff16610e5861186c565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea5906151ab565b60405180910390fd5b8060119080519060200190610ec4929190614286565b5050565b610ed061256c565b73ffffffffffffffffffffffffffffffffffffffff16610eee61186c565b73ffffffffffffffffffffffffffffffffffffffff1614610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906151ab565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b610f7861256c565b73ffffffffffffffffffffffffffffffffffffffff16610f9661186c565b73ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906151ab565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61104161103b61256c565b8261262d565b611080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110779061522b565b60405180910390fd5b61108b83838361270b565b505050565b600d60009054906101000a900460ff1681565b601460009054906101000a900460ff1681565b600c5481565b60006110c6612972565b905090565b600061111e82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a8c90919063ffffffff16565b905092915050565b61112e61256c565b73ffffffffffffffffffffffffffffffffffffffff1661114c61186c565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611199906151ab565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e8573d6000803e3d6000fd5b50565b600f80546111f89061557f565b80601f01602080910402602001604051908101604052809291908181526020018280546112249061557f565b80156112715780601f1061124657610100808354040283529160200191611271565b820191906000526020600020905b81548152906001019060200180831161125457829003601f168201915b505050505081565b61129483838360405180602001604052806000815250611b03565b505050565b6112a161256c565b73ffffffffffffffffffffffffffffffffffffffff166112bf61186c565b73ffffffffffffffffffffffffffffffffffffffff1614611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c906151ab565b60405180910390fd5b80600c8190555050565b601460019054906101000a900460ff1681565b61133a61256c565b73ffffffffffffffffffffffffffffffffffffffff1661135861186c565b73ffffffffffffffffffffffffffffffffffffffff16146113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a5906151ab565b60405180910390fd5b80600f90805190602001906113c4929190614286565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061143b61256c565b90506114478183612c30565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061510b565b60405180910390fd5b80915050919050565b61150561256c565b73ffffffffffffffffffffffffffffffffffffffff1661152361186c565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611570906151ab565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116139190614d14565b60206040518083038186803b15801561162b57600080fd5b505afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906147cb565b6040518363ffffffff1660e01b8152600401611680929190614db2565b602060405180830381600087803b15801561169a57600080fd5b505af11580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906146e6565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e906150eb565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179661256c565b73ffffffffffffffffffffffffffffffffffffffff166117b461186c565b73ffffffffffffffffffffffffffffffffffffffff161461180a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611801906151ab565b60405180910390fd5b6118146000612d44565b565b600061185f600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e08565b9050919050565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d09061512b565b60405180910390fd5b6118ed826009612a8c90919063ffffffff16565b9050919050565b6060600280546119039061557f565b80601f016020809104026020016040519081016040528092919081815260200182805461192f9061557f565b801561197c5780601f106119515761010080835404028352916020019161197c565b820191906000526020600020905b81548152906001019060200180831161195f57829003601f168201915b5050505050905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006119f5600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e16565b9050919050565b611a0e611a0761256c565b8383612ed7565b5050565b611a1a61256c565b73ffffffffffffffffffffffffffffffffffffffff16611a3861186c565b73ffffffffffffffffffffffffffffffffffffffff1614611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a85906151ab565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b14611b0e61256c565b8361262d565b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a9061522b565b60405180910390fd5b611b5f84848484613044565b50505050565b83421115611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906150ab565b60405180910390fd5b6000611c0a611c027fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001611be79493929190614e11565b604051602081830303815290604052805190602001206130a0565b8585856130ba565b9050611c15816130e5565b8614611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d90614f4b565b60405180910390fd5b611c608188612c30565b50505050505050565b611c7161256c565b73ffffffffffffffffffffffffffffffffffffffff16611c8f61186c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc906151ab565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b60118054611d1e9061557f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4a9061557f565b8015611d975780601f10611d6c57610100808354040283529160200191611d97565b820191906000526020600020905b815481529060010190602001808311611d7a57829003601f168201915b505050505081565b60135481565b6060611db082612500565b611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de6906151eb565b60405180910390fd5b6000611df9613143565b90506000815111611e195760405180602001604052806000815250611e44565b80611e238461315a565b604051602001611e34929190614cb9565b6040516020818303038152906040525b915050919050565b600b5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601460019054906101000a900460ff16611eff57600080fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611f5057600080fd5b60005b81811015611f95576000600b5490506001600b54611f719190615379565b600b81905550611f813382613307565b508080611f8d906155e2565b915050611f53565b506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611fe661256c565b73ffffffffffffffffffffffffffffffffffffffff1661200461186c565b73ffffffffffffffffffffffffffffffffffffffff161461205a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612051906151ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614fab565b60405180910390fd5b6120d381612d44565b50565b601460009054906101000a900460ff166120ef57600080fd5b600c54816013546121009190615379565b111561210b57600080fd5b600e54816121199190615400565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016121749190614d14565b60206040518083038186803b15801561218c57600080fd5b505afa1580156121a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c491906147cb565b10156121cf57600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e548561221d9190615400565b6040518463ffffffff1660e01b815260040161223b93929190614d2f565b602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228d91906146e6565b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d99190615379565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060135461232a9190615379565b60138190555050565b61233b61256c565b73ffffffffffffffffffffffffffffffffffffffff1661235961186c565b73ffffffffffffffffffffffffffffffffffffffff16146123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a6906151ab565b60405180910390fd5b60005b600a8110156123f5576000600b5490506001600b546123d19190615379565b600b819055506123e13382613307565b5080806123ed906155e2565b9150506123b2565b50565b60126020528060005260406000206000915090505481565b61241861256c565b73ffffffffffffffffffffffffffffffffffffffff1661243661186c565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612483906151ab565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125e78361144b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061263882612500565b612677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266e9061506b565b60405180910390fd5b60006126828361144b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126f157508373ffffffffffffffffffffffffffffffffffffffff166126d984610c95565b73ffffffffffffffffffffffffffffffffffffffff16145b8061270257506127018185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661272b8261144b565b73ffffffffffffffffffffffffffffffffffffffff1614612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890614fcb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e89061500b565b60405180910390fd5b6127fc838383613325565b612807600082612574565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612857919061545a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ae9190615379565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461296d83838361332a565b505050565b60007f00000000000000000000000074b6cb62c310480006ec3ee7eda8bb367792408e73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156129ee57507f000000000000000000000000000000000000000000000000000000000000000146145b15612a1b577f6e1a7ca3e9422628f4acb73d3aa106d0168cd5e806cb44fe668d15f52b52ce5b9050612a89565b612a867f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fccd69f134466744d6a3a769c12dc0bd581cd3372e79deb7aa4a7d38b52429f3a7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613346565b90505b90565b6000438210612ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac79061508b565b60405180910390fd5b60008360000180549050905060005b81811015612b7a576000612af38284613380565b905084866000018281548110612b32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b6457809250612b74565b600181612b719190615379565b91505b50612adf565b60008214612c055784600001600183612b93919061545a565b81548110612bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612c08565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000612c3b836113c8565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612d3f8183612d3a866133a6565b6133b8565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000808260000180549050905060008114612eae5782600001600182612e3c919061545a565b81548110612e73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612eb1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3d9061502b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130379190614ddb565b60405180910390a3505050565b61304f84848461270b565b61305b848484846135c5565b61309a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309190614f8b565b60405180910390fd5b50505050565b60006130b36130ad612972565b8361375c565b9050919050565b60008060006130cb8787878761378f565b915091506130d88161389c565b8192505050949350505050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061313281612e08565b915061313d81613bed565b50919050565b606060405180602001604052806000815250905090565b606060008214156131a2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613302565b600082905060005b600082146131d45780806131bd906155e2565b915050600a826131cd91906153cf565b91506131aa565b60008167ffffffffffffffff811115613216577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132485781602001600182028036833780820191505090505b5090505b600085146132fb57600182613261919061545a565b9150600a856132709190615635565b603061327c9190615379565b60f81b8183815181106132b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f491906153cf565b945061324c565b8093505050505b919050565b613321828260405180602001604052806000815250613c03565b5050565b505050565b61333683836001613c5e565b613341838383613d1e565b505050565b60008383834630604051602001613361959493929190614e56565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861339191906153cf565b82841661339e9190615379565b905092915050565b60006133b1826116d6565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156133f45750600081115b156135c057600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134dc57600080613485613d2384600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d399092919063ffffffff16565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516134d1929190615286565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135bf57600080613568613d6784600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d399092919063ffffffff16565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516135b4929190615286565b60405180910390a250505b5b505050565b60006135e68473ffffffffffffffffffffffffffffffffffffffff16613d7d565b1561374f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261360f61256c565b8786866040518563ffffffff1660e01b81526004016136319493929190614d66565b602060405180830381600087803b15801561364b57600080fd5b505af192505050801561367c57506040513d601f19601f820116820180604052508101906136799190614738565b60015b6136ff573d80600081146136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506000815114156136f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ee90614f8b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613754565b600190505b949350505050565b60008282604051602001613771929190614cdd565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156137ca576000600391509150613893565b601b8560ff16141580156137e25750601c8560ff1614155b156137f4576000600491509150613893565b6000600187878787604051600081526020016040526040516138199493929190614ea9565b6020604051602081039080840390855afa15801561383b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561388a57600060019250925050613893565b80600092509250505b94509492505050565b600060048111156138d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561390f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561391a57613bea565b60016004811115613954577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561398d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156139ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c590614f2b565b60405180910390fd5b60026004811115613a08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7990614f6b565b60405180910390fd5b60036004811115613abc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613af5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d9061504b565b60405180910390fd5b600480811115613b6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613be9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be09061514b565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b613c0d8383613da0565b613c1a60008484846135c5565b613c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5090614f8b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613cae57613cab613d67826009613d399092919063ffffffff16565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cfe57613cfb613d23826009613d399092919063ffffffff16565b50505b613d19613d0a846113c8565b613d13846113c8565b836133b8565b505050565b505050565b60008183613d31919061545a565b905092915050565b600080613d5b85613d56613d4c88612e16565b868863ffffffff16565b613f7a565b91509150935093915050565b60008183613d759190615379565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e079061516b565b60405180910390fd5b613e1981612500565b15613e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5090614feb565b60405180910390fd5b613e6560008383613325565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eb59190615379565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613f766000838361332a565b5050565b6000806000846000018054905090506000613f9486612e16565b905060008211801561401057504386600001600184613fb3919061545a565b81548110613fea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156140c65761401e856141c8565b8660000160018461402f919061545a565b81548110614066577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506141b9565b8560000160405180604001604052806140de43614233565b63ffffffff1681526020016140f2886141c8565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561422b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614222906151cb565b60405180910390fd5b819050919050565b600063ffffffff801682111561427e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142759061524b565b60405180910390fd5b819050919050565b8280546142929061557f565b90600052602060002090601f0160209004810192826142b457600085556142fb565b82601f106142cd57805160ff19168380011785556142fb565b828001600101855582156142fb579182015b828111156142fa5782518255916020019190600101906142df565b5b509050614308919061430c565b5090565b5b8082111561432557600081600090555060010161430d565b5090565b600061433c614337846152d4565b6152af565b90508281526020810184848401111561435457600080fd5b61435f84828561553d565b509392505050565b600061437a61437584615305565b6152af565b90508281526020810184848401111561439257600080fd5b61439d84828561553d565b509392505050565b6000813590506143b481615de6565b92915050565b6000813590506143c981615dfd565b92915050565b6000815190506143de81615dfd565b92915050565b6000813590506143f381615e14565b92915050565b60008135905061440881615e2b565b92915050565b60008151905061441d81615e2b565b92915050565b600082601f83011261443457600080fd5b8135614444848260208601614329565b91505092915050565b600082601f83011261445e57600080fd5b813561446e848260208601614367565b91505092915050565b60008135905061448681615e42565b92915050565b60008151905061449b81615e42565b92915050565b6000813590506144b081615e59565b92915050565b6000602082840312156144c857600080fd5b60006144d6848285016143a5565b91505092915050565b600080604083850312156144f257600080fd5b6000614500858286016143a5565b9250506020614511858286016143a5565b9150509250929050565b60008060006060848603121561453057600080fd5b600061453e868287016143a5565b935050602061454f868287016143a5565b925050604061456086828701614477565b9150509250925092565b6000806000806080858703121561458057600080fd5b600061458e878288016143a5565b945050602061459f878288016143a5565b93505060406145b087828801614477565b925050606085013567ffffffffffffffff8111156145cd57600080fd5b6145d987828801614423565b91505092959194509250565b600080604083850312156145f857600080fd5b6000614606858286016143a5565b9250506020614617858286016143ba565b9150509250929050565b6000806040838503121561463457600080fd5b6000614642858286016143a5565b925050602061465385828601614477565b9150509250929050565b60008060008060008060c0878903121561467657600080fd5b600061468489828a016143a5565b965050602061469589828a01614477565b95505060406146a689828a01614477565b94505060606146b789828a016144a1565b93505060806146c889828a016143e4565b92505060a06146d989828a016143e4565b9150509295509295509295565b6000602082840312156146f857600080fd5b6000614706848285016143cf565b91505092915050565b60006020828403121561472157600080fd5b600061472f848285016143f9565b91505092915050565b60006020828403121561474a57600080fd5b60006147588482850161440e565b91505092915050565b60006020828403121561477357600080fd5b600082013567ffffffffffffffff81111561478d57600080fd5b6147998482850161444d565b91505092915050565b6000602082840312156147b457600080fd5b60006147c284828501614477565b91505092915050565b6000602082840312156147dd57600080fd5b60006147eb8482850161448c565b91505092915050565b6147fd8161548e565b82525050565b61480c816154a0565b82525050565b61481b816154ac565b82525050565b61483261482d826154ac565b61562b565b82525050565b600061484382615336565b61484d818561534c565b935061485d81856020860161554c565b61486681615722565b840191505092915050565b61487a81615519565b82525050565b600061488b82615341565b614895818561535d565b93506148a581856020860161554c565b6148ae81615722565b840191505092915050565b60006148c482615341565b6148ce818561536e565b93506148de81856020860161554c565b80840191505092915050565b60006148f760188361535d565b915061490282615733565b602082019050919050565b600061491a60148361535d565b91506149258261575c565b602082019050919050565b600061493d601f8361535d565b915061494882615785565b602082019050919050565b600061496060328361535d565b915061496b826157ae565b604082019050919050565b600061498360268361535d565b915061498e826157fd565b604082019050919050565b60006149a660258361535d565b91506149b18261584c565b604082019050919050565b60006149c9601c8361535d565b91506149d48261589b565b602082019050919050565b60006149ec60028361536e565b91506149f7826158c4565b600282019050919050565b6000614a0f60248361535d565b9150614a1a826158ed565b604082019050919050565b6000614a3260198361535d565b9150614a3d8261593c565b602082019050919050565b6000614a5560228361535d565b9150614a6082615965565b604082019050919050565b6000614a78602c8361535d565b9150614a83826159b4565b604082019050919050565b6000614a9b60208361535d565b9150614aa682615a03565b602082019050919050565b6000614abe60188361535d565b9150614ac982615a2c565b602082019050919050565b6000614ae160388361535d565b9150614aec82615a55565b604082019050919050565b6000614b04602a8361535d565b9150614b0f82615aa4565b604082019050919050565b6000614b2760298361535d565b9150614b3282615af3565b604082019050919050565b6000614b4a601a8361535d565b9150614b5582615b42565b602082019050919050565b6000614b6d60228361535d565b9150614b7882615b6b565b604082019050919050565b6000614b9060208361535d565b9150614b9b82615bba565b602082019050919050565b6000614bb3602c8361535d565b9150614bbe82615be3565b604082019050919050565b6000614bd660208361535d565b9150614be182615c32565b602082019050919050565b6000614bf960278361535d565b9150614c0482615c5b565b604082019050919050565b6000614c1c602f8361535d565b9150614c2782615caa565b604082019050919050565b6000614c3f60218361535d565b9150614c4a82615cf9565b604082019050919050565b6000614c6260318361535d565b9150614c6d82615d48565b604082019050919050565b6000614c8560268361535d565b9150614c9082615d97565b604082019050919050565b614ca481615502565b82525050565b614cb38161550c565b82525050565b6000614cc582856148b9565b9150614cd182846148b9565b91508190509392505050565b6000614ce8826149df565b9150614cf48285614821565b602082019150614d048284614821565b6020820191508190509392505050565b6000602082019050614d2960008301846147f4565b92915050565b6000606082019050614d4460008301866147f4565b614d5160208301856147f4565b614d5e6040830184614c9b565b949350505050565b6000608082019050614d7b60008301876147f4565b614d8860208301866147f4565b614d956040830185614c9b565b8181036060830152614da78184614838565b905095945050505050565b6000604082019050614dc760008301856147f4565b614dd46020830184614c9b565b9392505050565b6000602082019050614df06000830184614803565b92915050565b6000602082019050614e0b6000830184614812565b92915050565b6000608082019050614e266000830187614812565b614e3360208301866147f4565b614e406040830185614c9b565b614e4d6060830184614c9b565b95945050505050565b600060a082019050614e6b6000830188614812565b614e786020830187614812565b614e856040830186614812565b614e926060830185614c9b565b614e9f60808301846147f4565b9695505050505050565b6000608082019050614ebe6000830187614812565b614ecb6020830186614caa565b614ed86040830185614812565b614ee56060830184614812565b95945050505050565b6000602082019050614f036000830184614871565b92915050565b60006020820190508181036000830152614f238184614880565b905092915050565b60006020820190508181036000830152614f44816148ea565b9050919050565b60006020820190508181036000830152614f648161490d565b9050919050565b60006020820190508181036000830152614f8481614930565b9050919050565b60006020820190508181036000830152614fa481614953565b9050919050565b60006020820190508181036000830152614fc481614976565b9050919050565b60006020820190508181036000830152614fe481614999565b9050919050565b60006020820190508181036000830152615004816149bc565b9050919050565b6000602082019050818103600083015261502481614a02565b9050919050565b6000602082019050818103600083015261504481614a25565b9050919050565b6000602082019050818103600083015261506481614a48565b9050919050565b6000602082019050818103600083015261508481614a6b565b9050919050565b600060208201905081810360008301526150a481614a8e565b9050919050565b600060208201905081810360008301526150c481614ab1565b9050919050565b600060208201905081810360008301526150e481614ad4565b9050919050565b6000602082019050818103600083015261510481614af7565b9050919050565b6000602082019050818103600083015261512481614b1a565b9050919050565b6000602082019050818103600083015261514481614b3d565b9050919050565b6000602082019050818103600083015261516481614b60565b9050919050565b6000602082019050818103600083015261518481614b83565b9050919050565b600060208201905081810360008301526151a481614ba6565b9050919050565b600060208201905081810360008301526151c481614bc9565b9050919050565b600060208201905081810360008301526151e481614bec565b9050919050565b6000602082019050818103600083015261520481614c0f565b9050919050565b6000602082019050818103600083015261522481614c32565b9050919050565b6000602082019050818103600083015261524481614c55565b9050919050565b6000602082019050818103600083015261526481614c78565b9050919050565b60006020820190506152806000830184614c9b565b92915050565b600060408201905061529b6000830185614c9b565b6152a86020830184614c9b565b9392505050565b60006152b96152ca565b90506152c582826155b1565b919050565b6000604051905090565b600067ffffffffffffffff8211156152ef576152ee6156f3565b5b6152f882615722565b9050602081019050919050565b600067ffffffffffffffff8211156153205761531f6156f3565b5b61532982615722565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061538482615502565b915061538f83615502565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153c4576153c3615666565b5b828201905092915050565b60006153da82615502565b91506153e583615502565b9250826153f5576153f4615695565b5b828204905092915050565b600061540b82615502565b915061541683615502565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561544f5761544e615666565b5b828202905092915050565b600061546582615502565b915061547083615502565b92508282101561548357615482615666565b5b828203905092915050565b6000615499826154e2565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155248261552b565b9050919050565b6000615536826154e2565b9050919050565b82818337600083830152505050565b60005b8381101561556a57808201518184015260208101905061554f565b83811115615579576000848401525b50505050565b6000600282049050600182168061559757607f821691505b602082108114156155ab576155aa6156c4565b5b50919050565b6155ba82615722565b810181811067ffffffffffffffff821117156155d9576155d86156f3565b5b80604052505050565b60006155ed82615502565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156205761561f615666565b5b600182019050919050565b6000819050919050565b600061564082615502565b915061564b83615502565b92508261565b5761565a615695565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f566f7465733a20696e76616c6964206e6f6e6365000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b7f566f7465733a207369676e617475726520657870697265640000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f566f7465733a20626c6f636b206e6f7420796574206d696e6564000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b615def8161548e565b8114615dfa57600080fd5b50565b615e06816154a0565b8114615e1157600080fd5b50565b615e1d816154ac565b8114615e2857600080fd5b50565b615e34816154b6565b8114615e3f57600080fd5b50565b615e4b81615502565b8114615e5657600080fd5b50565b615e628161550c565b8114615e6d57600080fd5b5056fea26469706673582212202dcae28e64318663469c5bec0d5ca85b244d66f767a06de331ee2a3e1d24357364736f6c63430008040033

Deployed Bytecode Sourcemap

81345:2923:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24748:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25917:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27610:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27133:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83911:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84025:110;;;;;;;;;;;;;:::i;:::-;;82875:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28529:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81465:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81745;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81432:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78346:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73096:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83204:107;;;;;;;;;;;;;:::i;:::-;;81559:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28976:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83823:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81790:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82998:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74385:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74651:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25524:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83319:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25167:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2707:103;;;;;;;;;;;;;:::i;:::-;;78084:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81510:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2056:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73808:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26086:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81587:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72679:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27990:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83094:102;;;;;;;;;;;;;:::i;:::-;;81950:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29232:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74884:653;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84143:122;;;;;;;;;;;;;:::i;:::-;;81617:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81706:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26261:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81397:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28248:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82066:384;;;;;;;;;;;;;:::i;:::-;;2965:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82458:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83472:231;;;;;;;;;;;;;:::i;:::-;;81652:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83711:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24748:355;24895:4;24952:25;24937:40;;;:11;:40;;;;:105;;;;25009:33;24994:48;;;:11;:48;;;;24937:105;:158;;;;25059:36;25083:11;25059:23;:36::i;:::-;24937:158;24917:178;;24748:355;;;:::o;25917:100::-;25971:13;26004:5;25997:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25917:100;:::o;27610:308::-;27731:7;27778:16;27786:7;27778;:16::i;:::-;27756:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27886:15;:24;27902:7;27886:24;;;;;;;;;;;;;;;;;;;;;27879:31;;27610:308;;;:::o;27133:411::-;27214:13;27230:23;27245:7;27230:14;:23::i;:::-;27214:39;;27278:5;27272:11;;:2;:11;;;;27264:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27372:5;27356:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27381:37;27398:5;27405:12;:10;:12::i;:::-;27381:16;:37::i;:::-;27356:62;27334:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27515:21;27524:2;27528:7;27515:8;:21::i;:::-;27133:411;;;:::o;83911:106::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;84004:5:::1;83987:14;:22;;;;;;;;;;;;:::i;:::-;;83911:106:::0;:::o;84025:110::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;84108:19:::1;;;;;;;;;;;84107:20;84085:19;;:42;;;;;;;;;;;;;;;;;;84025:110::o:0;82875:115::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82969:12:::1;82950:9;;:32;;;;;;;;;;;;;;;;;;82875:115:::0;:::o;28529:376::-;28738:41;28757:12;:10;:12::i;:::-;28771:7;28738:18;:41::i;:::-;28716:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28869:28;28879:4;28885:2;28889:7;28869:9;:28::i;:::-;28529:376;;;:::o;81465:38::-;;;;;;;;;;;;;:::o;81745:::-;;;;;;;;;;;;;:::o;81432:26::-;;;;:::o;78346:106::-;78397:7;78424:20;:18;:20::i;:::-;78417:27;;78346:106;:::o;73096:236::-;73239:7;73271:53;73312:11;73271:20;:29;73292:7;73271:29;;;;;;;;;;;;;;;:40;;:53;;;;:::i;:::-;73264:60;;73096:236;;;;:::o;83204:107::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83260:10:::1;83252:28;;:51;83281:21;83252:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;83204:107::o:0;81559:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28976:185::-;29114:39;29131:4;29137:2;29141:7;29114:39;;;;;;;;;;;;:16;:39::i;:::-;28976:185;;;:::o;83823:80::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83889:6:::1;83883:3;:12;;;;83823:80:::0;:::o;81790:43::-;;;;;;;;;;;;;:::o;82998:88::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83075:3:::1;83065:7;:13;;;;;;;;;;;;:::i;:::-;;82998:88:::0;:::o;74385:179::-;74504:7;74536:11;:20;74548:7;74536:20;;;;;;;;;;;;;;;;;;;;;;;;;74529:27;;74385:179;;;:::o;74651:150::-;74723:15;74741:12;:10;:12::i;:::-;74723:30;;74764:29;74774:7;74783:9;74764;:29::i;:::-;74651:150;;:::o;25524:326::-;25641:7;25666:13;25682:7;:16;25690:7;25682:16;;;;;;;;;;;;;;;;;;;;;25666:32;;25748:1;25731:19;;:5;:19;;;;25709:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25837:5;25830:12;;;25524:326;;;:::o;83319:145::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83390:9:::1;;;;;;;;;;;:18;;;83409:10;83421:9;;;;;;;;;;;:19;;;83449:4;83421:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83390:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;83319:145:::0;:::o;25167:295::-;25284:7;25348:1;25331:19;;:5;:19;;;;25309:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25438:9;:16;25448:5;25438:16;;;;;;;;;;;;;;;;25431:23;;25167:295;;;:::o;2707:103::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2772:30:::1;2799:1;2772:18;:30::i;:::-;2707:103::o:0;78084:119::-;78144:7;78171:24;:7;:14;78179:5;78171:14;;;;;;;;;;;;;;;:22;:24::i;:::-;78164:31;;78084:119;;;:::o;81510:42::-;;;;:::o;2056:87::-;2102:7;2129:6;;;;;;;;;;;2122:13;;2056:87;:::o;73808:289::-;73940:7;73987:12;73973:11;:26;73965:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;74048:41;74077:11;74048:17;:28;;:41;;;;:::i;:::-;74041:48;;73808:289;;;:::o;26086:104::-;26142:13;26175:7;26168:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26086:104;:::o;81587:23::-;;;;;;;;;;;;;:::o;72679:196::-;72797:7;72829:38;:20;:29;72850:7;72829:29;;;;;;;;;;;;;;;:36;:38::i;:::-;72822:45;;72679:196;;;:::o;27990:187::-;28117:52;28136:12;:10;:12::i;:::-;28150:8;28160;28117:18;:52::i;:::-;27990:187;;:::o;83094:102::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83170:18:::1;;;;;;;;;;;83169:19;83148:18;;:40;;;;;;;;;;;;;;;;;;83094:102::o:0;81950:108::-;82007:7;82034:12;:16;82047:2;82034:16;;;;;;;;;;;;;;;;82027:23;;81950:108;;;:::o;29232:365::-;29421:41;29440:12;:10;:12::i;:::-;29454:7;29421:18;:41::i;:::-;29399:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29550:39;29564:4;29570:2;29574:7;29583:5;29550:13;:39::i;:::-;29232:365;;;;:::o;74884:653::-;75111:6;75092:15;:25;;75084:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;75157:14;75174:246;75202:159;72268:71;75302:9;75313:5;75320:6;75269:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75237:109;;;;;;75202:16;:159::i;:::-;75376:1;75392;75408;75174:13;:246::i;:::-;75157:263;;75448:17;75458:6;75448:9;:17::i;:::-;75439:5;:26;75431:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;75501:28;75511:6;75519:9;75501;:28::i;:::-;74884:653;;;;;;;:::o;84143:122::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;84234:23:::1;;;;;;;;;;;84233:24;84207:23;;:50;;;;;;;;;;;;;;;;;;84143:122::o:0;81617:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81706:32::-;;;;:::o;26261:468::-;26379:13;26432:16;26440:7;26432;:16::i;:::-;26410:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;26536:21;26560:10;:8;:10::i;:::-;26536:34;;26625:1;26607:7;26601:21;:25;:120;;;;;;;;;;;;;;;;;26670:7;26679:18;:7;:16;:18::i;:::-;26653:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26601:120;26581:140;;;26261:468;;;:::o;81397:28::-;;;;:::o;28248:214::-;28390:4;28419:18;:25;28438:5;28419:25;;;;;;;;;;;;;;;:35;28445:8;28419:35;;;;;;;;;;;;;;;;;;;;;;;;;28412:42;;28248:214;;;;:::o;82066:384::-;82116:23;;;;;;;;;;;82108:32;;;;;;82151:11;82165:12;:24;82178:10;82165:24;;;;;;;;;;;;;;;;82151:38;;82214:1;82208:3;:7;82200:16;;;;;;82234:9;82229:173;82253:3;82249:1;:7;82229:173;;;82278:15;82296:9;;82278:27;;82344:1;82332:9;;:13;;;;:::i;:::-;82320:9;:25;;;;82360:30;82370:10;82382:7;82360:9;:30::i;:::-;82229:173;82258:3;;;;;:::i;:::-;;;;82229:173;;;;82441:1;82414:12;:24;82427:10;82414:24;;;;;;;;;;;;;;;:28;;;;82066:384;:::o;2965:238::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3088:1:::1;3068:22;;:8;:22;;;;3046:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3167:28;3186:8;3167:18;:28::i;:::-;2965:238:::0;:::o;82458:409::-;82530:19;;;;;;;;;;;82522:28;;;;;;82592:3;;82585;82569:13;;:19;;;;:::i;:::-;:26;;82561:35;;;;;;82656:9;;82650:3;:15;;;;:::i;:::-;82615:9;;;;;;;;;;;:19;;;82635:10;82615:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;82607:59;;;;;;82677:9;;;;;;;;;;;:22;;;82700:10;82720:4;82733:9;;82727:3;:15;;;;:::i;:::-;82677:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;82808:3;82781:12;:24;82794:10;82781:24;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;82754:12;:24;82767:10;82754:24;;;;;;;;;;;;;;;:57;;;;82855:3;82839:13;;:19;;;;:::i;:::-;82822:13;:37;;;;82458:409;:::o;83472:231::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83529:9:::1;83524:172;83548:2;83544:1;:6;83524:172;;;83572:15;83590:9;;83572:27;;83638:1;83626:9;;:13;;;;:::i;:::-;83614:9;:25;;;;83654:30;83664:10;83676:7;83654:9;:30::i;:::-;83524:172;83552:3;;;;;:::i;:::-;;;;83524:172;;;;83472:231::o:0;81652:47::-;;;;;;;;;;;;;;;;;:::o;83711:104::-;2287:12;:10;:12::i;:::-;2276:23;;:7;:5;:7::i;:::-;:23;;;2268:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83795:12:::1;83783:9;:24;;;;83711:104:::0;:::o;23164:207::-;23294:4;23338:25;23323:40;;;:11;:40;;;;23316:47;;23164:207;;;:::o;31144:127::-;31209:4;31261:1;31233:30;;:7;:16;31241:7;31233:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31226:37;;31144:127;;;:::o;780:98::-;833:7;860:10;853:17;;780:98;:::o;35431:174::-;35533:2;35506:15;:24;35522:7;35506:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35589:7;35585:2;35551:46;;35560:23;35575:7;35560:14;:23::i;:::-;35551:46;;;;;;;;;;;;35431:174;;:::o;31438:452::-;31567:4;31611:16;31619:7;31611;:16::i;:::-;31589:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31710:13;31726:23;31741:7;31726:14;:23::i;:::-;31710:39;;31779:5;31768:16;;:7;:16;;;:64;;;;31825:7;31801:31;;:20;31813:7;31801:11;:20::i;:::-;:31;;;31768:64;:113;;;;31849:32;31866:5;31873:7;31849:16;:32::i;:::-;31768:113;31760:122;;;31438:452;;;;:::o;34651:662::-;34824:4;34797:31;;:23;34812:7;34797:14;:23::i;:::-;:31;;;34775:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;34926:1;34912:16;;:2;:16;;;;34904:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34982:39;35003:4;35009:2;35013:7;34982:20;:39::i;:::-;35086:29;35103:1;35107:7;35086:8;:29::i;:::-;35147:1;35128:9;:15;35138:4;35128:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35176:1;35159:9;:13;35169:2;35159:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35207:2;35188:7;:16;35196:7;35188:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35246:7;35242:2;35227:27;;35236:4;35227:27;;;;;;;;;;;;35267:38;35287:4;35293:2;35297:7;35267:19;:38::i;:::-;34651:662;;;:::o;66538:437::-;66591:7;66646:12;66629:29;;66637:4;66629:29;;;:66;;;;;66679:16;66662:13;:33;66629:66;66611:357;;;66729:24;66722:31;;;;66611:357;66810:146;66854:10;66887:12;66922:15;66810:21;:146::i;:::-;66786:170;;66538:437;;:::o;51351:624::-;51464:7;51511:12;51497:11;:26;51489:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51573:12;51588:4;:17;;:24;;;;51573:39;;51623:11;51649:251;51662:4;51656:3;:10;51649:251;;;51683:11;51697:23;51710:3;51715:4;51697:12;:23::i;:::-;51683:37;;51777:11;51739:4;:17;;51757:3;51739:22;;;;;;;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;:49;;;51735:154;;;51816:3;51809:10;;51735:154;;;51872:1;51866:3;:7;;;;:::i;:::-;51860:13;;51735:154;51649:251;;;;51925:1;51917:4;:9;:50;;51933:4;:17;;51958:1;51951:4;:8;;;;:::i;:::-;51933:27;;;;;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;51917:50;;;51929:1;51917:50;51910:57;;;;;;51351:624;;;;:::o;75708:319::-;75791:19;75813:18;75823:7;75813:9;:18::i;:::-;75791:40;;75865:9;75842:11;:20;75854:7;75842:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;75930:9;75892:48;;75917:11;75892:48;;75908:7;75892:48;;;;;;;;;;;;75951:68;75970:11;75983:9;75994:24;76010:7;75994:15;:24::i;:::-;75951:18;:68::i;:::-;75708:319;;;:::o;3363:191::-;3437:16;3456:6;;;;;;;;;;;3437:25;;3482:8;3473:6;;:17;;;;;;;;;;;;;;;;;;3537:8;3506:40;;3527:8;3506:40;;;;;;;;;;;;3363:191;;:::o;39671:114::-;39736:7;39763;:14;;;39756:21;;39671:114;;;:::o;50962:193::-;51023:7;51043:11;51057:4;:17;;:24;;;;51043:38;;51106:1;51099:3;:8;:48;;51114:4;:17;;51138:1;51132:3;:7;;;;:::i;:::-;51114:26;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;51099:48;;;51110:1;51099:48;51092:55;;;;;50962:193;;;:::o;35747:315::-;35902:8;35893:17;;:5;:17;;;;35885:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35989:8;35951:18;:25;35970:5;35951:25;;;;;;;;;;;;;;;:35;35977:8;35951:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36035:8;36013:41;;36028:5;36013:41;;;36045:8;36013:41;;;;;;:::i;:::-;;;;;;;;35747:315;;;:::o;30479:352::-;30636:28;30646:4;30652:2;30656:7;30636:9;:28::i;:::-;30697:48;30720:4;30726:2;30730:7;30739:5;30697:22;:48::i;:::-;30675:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30479:352;;;;:::o;68057:208::-;68170:7;68202:55;68224:20;:18;:20::i;:::-;68246:10;68202:21;:55::i;:::-;68195:62;;68057:208;;;:::o;61076:279::-;61204:7;61225:17;61244:18;61266:25;61277:4;61283:1;61286;61289;61266:10;:25::i;:::-;61224:67;;;;61302:18;61314:5;61302:11;:18::i;:::-;61338:9;61331:16;;;;61076:279;;;;;;:::o;77780:239::-;77867:15;77900:30;77933:7;:14;77941:5;77933:14;;;;;;;;;;;;;;;77900:47;;77968:15;:5;:13;:15::i;:::-;77958:25;;77994:17;:5;:15;:17::i;:::-;77780:239;;;;:::o;26977:94::-;27028:13;27054:9;;;;;;;;;;;;;;26977:94;:::o;20533:723::-;20589:13;20819:1;20810:5;:10;20806:53;;;20837:10;;;;;;;;;;;;;;;;;;;;;20806:53;20869:12;20884:5;20869:20;;20900:14;20925:78;20940:1;20932:4;:9;20925:78;;20958:8;;;;;:::i;:::-;;;;20989:2;20981:10;;;;;:::i;:::-;;;20925:78;;;21013:19;21045:6;21035:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21013:39;;21063:154;21079:1;21070:5;:10;21063:154;;21107:1;21097:11;;;;;:::i;:::-;;;21174:2;21166:5;:10;;;;:::i;:::-;21153:2;:24;;;;:::i;:::-;21140:39;;21123:6;21130;21123:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;21203:2;21194:11;;;;;:::i;:::-;;;21063:154;;;21241:6;21227:21;;;;;20533:723;;;;:::o;32232:110::-;32308:26;32318:2;32322:7;32308:26;;;;;;;;;;;;:9;:26::i;:::-;32232:110;;:::o;38179:126::-;;;;:::o;79526:239::-;79669:33;79690:4;79696:2;79700:1;79669:20;:33::i;:::-;79713:44;79739:4;79745:2;79749:7;79713:25;:44::i;:::-;79526:239;;;:::o;66983:432::-;67127:7;67228:8;67259;67290:11;67324:13;67368:4;67195:197;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67167:240;;;;;;67147:260;;66983:432;;;;;:::o;40971:156::-;41033:7;41118:1;41113;41109;:5;41108:11;;;;:::i;:::-;41103:1;41099;:5;41098:21;;;;:::i;:::-;41091:28;;40971:156;;;;:::o;79838:171::-;79951:7;79983:18;79993:7;79983:9;:18::i;:::-;79976:25;;79838:171;;;:::o;76755:687::-;76890:2;76882:10;;:4;:10;;;;:24;;;;;76905:1;76896:6;:10;76882:24;76878:557;;;76943:1;76927:18;;:4;:18;;;76923:258;;76967:16;76985;77005:90;77077:9;77088:6;77005:20;:66;77048:4;77005:66;;;;;;;;;;;;;;;:71;;:90;;;;;:::i;:::-;76966:129;;;;77140:4;77119:46;;;77146:8;77156;77119:46;;;;;;;:::i;:::-;;;;;;;;76923:258;;;77213:1;77199:16;;:2;:16;;;77195:229;;77237:16;77255;77275:65;77327:4;77333:6;77275:20;:24;77296:2;77275:24;;;;;;;;;;;;;;;:51;;:65;;;;;:::i;:::-;77236:104;;;;77385:2;77364:44;;;77389:8;77399;77364:44;;;;;;;:::i;:::-;;;;;;;;77195:229;;;76878:557;76755:687;;;:::o;36627:980::-;36782:4;36803:15;:2;:13;;;:15::i;:::-;36799:801;;;36872:2;36856:36;;;36915:12;:10;:12::i;:::-;36950:4;36977:7;37007:5;36856:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36835:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37231:1;37214:6;:13;:18;37210:320;;;37257:108;;;;;;;;;;:::i;:::-;;;;;;;;37210:320;37480:6;37474:13;37465:6;37461:2;37457:15;37450:38;36835:710;37105:41;;;37095:51;;;:6;:51;;;;37088:58;;;;;36799:801;37584:4;37577:11;;36627:980;;;;;;;:::o;63003:273::-;63123:7;63225:15;63242:10;63196:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63168:100;;;;;;63148:120;;63003:273;;;;:::o;59268:1669::-;59399:7;59408:12;60360:66;60342:1;60334:10;;:92;60316:200;;;60469:1;60473:30;60453:51;;;;;;60316:200;60535:2;60530:1;:7;;;;:18;;;;;60546:2;60541:1;:7;;;;60530:18;60526:102;;;60581:1;60585:30;60565:51;;;;;;60526:102;60725:14;60742:24;60752:4;60758:1;60761;60764;60742:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60725:41;;60799:1;60781:20;;:6;:20;;;60777:103;;;60834:1;60838:29;60818:50;;;;;;;60777:103;60900:6;60908:20;60892:37;;;;;59268:1669;;;;;;;;:::o;53868:643::-;53946:20;53937:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;53933:571;;;53983:7;;53933:571;54044:29;54035:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;54031:473;;;54090:34;;;;;;;;;;:::i;:::-;;;;;;;;54031:473;54155:35;54146:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;54142:362;;;54207:41;;;;;;;;;;:::i;:::-;;;;;;;;54142:362;54279:30;54270:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;54266:238;;;54326:44;;;;;;;;;;:::i;:::-;;;;;;;;54266:238;54401:30;54392:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;54388:116;;;54448:44;;;;;;;;;;:::i;:::-;;;;;;;;54388:116;53868:643;;:::o;39793:127::-;39900:1;39882:7;:14;;;:19;;;;;;;;;;;39793:127;:::o;32569:321::-;32699:18;32705:2;32709:7;32699:5;:18::i;:::-;32750:54;32781:1;32785:2;32789:7;32798:5;32750:22;:54::i;:::-;32728:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32569:321;;;:::o;76267:397::-;76421:1;76405:18;;:4;:18;;;76401:87;;;76440:36;76463:4;76469:6;76440:17;:22;;:36;;;;;:::i;:::-;;;76401:87;76516:1;76502:16;;:2;:16;;;76498:90;;;76535:41;76558:9;76569:6;76535:17;:22;;:41;;;;;:::i;:::-;;;76498:90;76598:58;76617:15;76627:4;76617:9;:15::i;:::-;76634:13;76644:2;76634:9;:13::i;:::-;76649:6;76598:18;:58::i;:::-;76267:397;;;:::o;38690:125::-;;;;:::o;77556:103::-;77619:7;77650:1;77646;:5;;;;:::i;:::-;77639:12;;77556:103;;;;:::o;53072:236::-;53229:7;53238;53265:35;53270:4;53276:23;53279:12;53286:4;53279:6;:12::i;:::-;53293:5;53276:2;:23;;:::i;:::-;53265:4;:35::i;:::-;53258:42;;;;53072:236;;;;;;:::o;77450:98::-;77508:7;77539:1;77535;:5;;;;:::i;:::-;77528:12;;77450:98;;;;:::o;12454:326::-;12514:4;12771:1;12749:7;:19;;;:23;12742:30;;12454:326;;;:::o;33226:439::-;33320:1;33306:16;;:2;:16;;;;33298:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33379:16;33387:7;33379;:16::i;:::-;33378:17;33370:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33441:45;33470:1;33474:2;33478:7;33441:20;:45::i;:::-;33516:1;33499:9;:13;33509:2;33499:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33547:2;33528:7;:16;33536:7;33528:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33592:7;33588:2;33567:33;;33584:1;33567:33;;;;;;;;;;;;33613:44;33641:1;33645:2;33649:7;33613:19;:44::i;:::-;33226:439;;:::o;52160:672::-;52247:7;52256;52281:11;52295:4;:17;;:24;;;;52281:38;;52330:11;52344:12;52351:4;52344:6;:12::i;:::-;52330:26;;52391:1;52385:3;:7;:66;;;;;52439:12;52396:4;:17;;52420:1;52414:3;:7;;;;:::i;:::-;52396:26;;;;;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;:55;;;52385:66;52367:428;;;52514:25;52533:5;52514:18;:25::i;:::-;52478:4;:17;;52502:1;52496:3;:7;;;;:::i;:::-;52478:26;;;;;;;;;;;;;;;;;;;;;;;:33;;;:61;;;;;;;;;;;;;;;;;;52367:428;;;52572:4;:17;;52613:155;;;;;;;;52661:31;52679:12;52661:17;:31::i;:::-;52613:155;;;;;;52723:25;52742:5;52723:18;:25::i;:::-;52613:155;;;;;52572:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52367:428;52813:3;52818:5;52805:19;;;;;;52160:672;;;;;:::o;42710:232::-;42767:7;42818:17;42809:26;;:5;:26;;42787:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;42928:5;42913:21;;42710:232;;;:::o;44828:227::-;44884:6;44934:16;44925:25;;:5;:25;;44903:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;45041:5;45027:20;;44828:227;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1045:5;1076:6;1070:13;1061:22;;1092:30;1116:5;1092:30;:::i;:::-;1051:77;;;;:::o;1134:139::-;1180:5;1218:6;1205:20;1196:29;;1234:33;1261:5;1234:33;:::i;:::-;1186:87;;;;:::o;1279:137::-;1324:5;1362:6;1349:20;1340:29;;1378:32;1404:5;1378:32;:::i;:::-;1330:86;;;;:::o;1422:141::-;1478:5;1509:6;1503:13;1494:22;;1525:32;1551:5;1525:32;:::i;:::-;1484:79;;;;:::o;1582:271::-;1637:5;1686:3;1679:4;1671:6;1667:17;1663:27;1653:2;;1704:1;1701;1694:12;1653:2;1744:6;1731:20;1769:78;1843:3;1835:6;1828:4;1820:6;1816:17;1769:78;:::i;:::-;1760:87;;1643:210;;;;;:::o;1873:273::-;1929:5;1978:3;1971:4;1963:6;1959:17;1955:27;1945:2;;1996:1;1993;1986:12;1945:2;2036:6;2023:20;2061:79;2136:3;2128:6;2121:4;2113:6;2109:17;2061:79;:::i;:::-;2052:88;;1935:211;;;;;:::o;2152:139::-;2198:5;2236:6;2223:20;2214:29;;2252:33;2279:5;2252:33;:::i;:::-;2204:87;;;;:::o;2297:143::-;2354:5;2385:6;2379:13;2370:22;;2401:33;2428:5;2401:33;:::i;:::-;2360:80;;;;:::o;2446:135::-;2490:5;2528:6;2515:20;2506:29;;2544:31;2569:5;2544:31;:::i;:::-;2496:85;;;;:::o;2587:262::-;2646:6;2695:2;2683:9;2674:7;2670:23;2666:32;2663:2;;;2711:1;2708;2701:12;2663:2;2754:1;2779:53;2824:7;2815:6;2804:9;2800:22;2779:53;:::i;:::-;2769:63;;2725:117;2653:196;;;;:::o;2855:407::-;2923:6;2931;2980:2;2968:9;2959:7;2955:23;2951:32;2948:2;;;2996:1;2993;2986:12;2948:2;3039:1;3064:53;3109:7;3100:6;3089:9;3085:22;3064:53;:::i;:::-;3054:63;;3010:117;3166:2;3192:53;3237:7;3228:6;3217:9;3213:22;3192:53;:::i;:::-;3182:63;;3137:118;2938:324;;;;;:::o;3268:552::-;3345:6;3353;3361;3410:2;3398:9;3389:7;3385:23;3381:32;3378:2;;;3426:1;3423;3416:12;3378:2;3469:1;3494:53;3539:7;3530:6;3519:9;3515:22;3494:53;:::i;:::-;3484:63;;3440:117;3596:2;3622:53;3667:7;3658:6;3647:9;3643:22;3622:53;:::i;:::-;3612:63;;3567:118;3724:2;3750:53;3795:7;3786:6;3775:9;3771:22;3750:53;:::i;:::-;3740:63;;3695:118;3368:452;;;;;:::o;3826:809::-;3921:6;3929;3937;3945;3994:3;3982:9;3973:7;3969:23;3965:33;3962:2;;;4011:1;4008;4001:12;3962:2;4054:1;4079:53;4124:7;4115:6;4104:9;4100:22;4079:53;:::i;:::-;4069:63;;4025:117;4181:2;4207:53;4252:7;4243:6;4232:9;4228:22;4207:53;:::i;:::-;4197:63;;4152:118;4309:2;4335:53;4380:7;4371:6;4360:9;4356:22;4335:53;:::i;:::-;4325:63;;4280:118;4465:2;4454:9;4450:18;4437:32;4496:18;4488:6;4485:30;4482:2;;;4528:1;4525;4518:12;4482:2;4556:62;4610:7;4601:6;4590:9;4586:22;4556:62;:::i;:::-;4546:72;;4408:220;3952:683;;;;;;;:::o;4641:401::-;4706:6;4714;4763:2;4751:9;4742:7;4738:23;4734:32;4731:2;;;4779:1;4776;4769:12;4731:2;4822:1;4847:53;4892:7;4883:6;4872:9;4868:22;4847:53;:::i;:::-;4837:63;;4793:117;4949:2;4975:50;5017:7;5008:6;4997:9;4993:22;4975:50;:::i;:::-;4965:60;;4920:115;4721:321;;;;;:::o;5048:407::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:2;;;5189:1;5186;5179:12;5141:2;5232:1;5257:53;5302:7;5293:6;5282:9;5278:22;5257:53;:::i;:::-;5247:63;;5203:117;5359:2;5385:53;5430:7;5421:6;5410:9;5406:22;5385:53;:::i;:::-;5375:63;;5330:118;5131:324;;;;;:::o;5461:986::-;5563:6;5571;5579;5587;5595;5603;5652:3;5640:9;5631:7;5627:23;5623:33;5620:2;;;5669:1;5666;5659:12;5620:2;5712:1;5737:53;5782:7;5773:6;5762:9;5758:22;5737:53;:::i;:::-;5727:63;;5683:117;5839:2;5865:53;5910:7;5901:6;5890:9;5886:22;5865:53;:::i;:::-;5855:63;;5810:118;5967:2;5993:53;6038:7;6029:6;6018:9;6014:22;5993:53;:::i;:::-;5983:63;;5938:118;6095:2;6121:51;6164:7;6155:6;6144:9;6140:22;6121:51;:::i;:::-;6111:61;;6066:116;6221:3;6248:53;6293:7;6284:6;6273:9;6269:22;6248:53;:::i;:::-;6238:63;;6192:119;6350:3;6377:53;6422:7;6413:6;6402:9;6398:22;6377:53;:::i;:::-;6367:63;;6321:119;5610:837;;;;;;;;:::o;6453:278::-;6520:6;6569:2;6557:9;6548:7;6544:23;6540:32;6537:2;;;6585:1;6582;6575:12;6537:2;6628:1;6653:61;6706:7;6697:6;6686:9;6682:22;6653:61;:::i;:::-;6643:71;;6599:125;6527:204;;;;:::o;6737:260::-;6795:6;6844:2;6832:9;6823:7;6819:23;6815:32;6812:2;;;6860:1;6857;6850:12;6812:2;6903:1;6928:52;6972:7;6963:6;6952:9;6948:22;6928:52;:::i;:::-;6918:62;;6874:116;6802:195;;;;:::o;7003:282::-;7072:6;7121:2;7109:9;7100:7;7096:23;7092:32;7089:2;;;7137:1;7134;7127:12;7089:2;7180:1;7205:63;7260:7;7251:6;7240:9;7236:22;7205:63;:::i;:::-;7195:73;;7151:127;7079:206;;;;:::o;7291:375::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:2;;;7425:1;7422;7415:12;7377:2;7496:1;7485:9;7481:17;7468:31;7526:18;7518:6;7515:30;7512:2;;;7558:1;7555;7548:12;7512:2;7586:63;7641:7;7632:6;7621:9;7617:22;7586:63;:::i;:::-;7576:73;;7439:220;7367:299;;;;:::o;7672:262::-;7731:6;7780:2;7768:9;7759:7;7755:23;7751:32;7748:2;;;7796:1;7793;7786:12;7748:2;7839:1;7864:53;7909:7;7900:6;7889:9;7885:22;7864:53;:::i;:::-;7854:63;;7810:117;7738:196;;;;:::o;7940:284::-;8010:6;8059:2;8047:9;8038:7;8034:23;8030:32;8027:2;;;8075:1;8072;8065:12;8027:2;8118:1;8143:64;8199:7;8190:6;8179:9;8175:22;8143:64;:::i;:::-;8133:74;;8089:128;8017:207;;;;:::o;8230:118::-;8317:24;8335:5;8317:24;:::i;:::-;8312:3;8305:37;8295:53;;:::o;8354:109::-;8435:21;8450:5;8435:21;:::i;:::-;8430:3;8423:34;8413:50;;:::o;8469:118::-;8556:24;8574:5;8556:24;:::i;:::-;8551:3;8544:37;8534:53;;:::o;8593:157::-;8698:45;8718:24;8736:5;8718:24;:::i;:::-;8698:45;:::i;:::-;8693:3;8686:58;8676:74;;:::o;8756:360::-;8842:3;8870:38;8902:5;8870:38;:::i;:::-;8924:70;8987:6;8982:3;8924:70;:::i;:::-;8917:77;;9003:52;9048:6;9043:3;9036:4;9029:5;9025:16;9003:52;:::i;:::-;9080:29;9102:6;9080:29;:::i;:::-;9075:3;9071:39;9064:46;;8846:270;;;;;:::o;9122:161::-;9224:52;9270:5;9224:52;:::i;:::-;9219:3;9212:65;9202:81;;:::o;9289:364::-;9377:3;9405:39;9438:5;9405:39;:::i;:::-;9460:71;9524:6;9519:3;9460:71;:::i;:::-;9453:78;;9540:52;9585:6;9580:3;9573:4;9566:5;9562:16;9540:52;:::i;:::-;9617:29;9639:6;9617:29;:::i;:::-;9612:3;9608:39;9601:46;;9381:272;;;;;:::o;9659:377::-;9765:3;9793:39;9826:5;9793:39;:::i;:::-;9848:89;9930:6;9925:3;9848:89;:::i;:::-;9841:96;;9946:52;9991:6;9986:3;9979:4;9972:5;9968:16;9946:52;:::i;:::-;10023:6;10018:3;10014:16;10007:23;;9769:267;;;;;:::o;10042:366::-;10184:3;10205:67;10269:2;10264:3;10205:67;:::i;:::-;10198:74;;10281:93;10370:3;10281:93;:::i;:::-;10399:2;10394:3;10390:12;10383:19;;10188:220;;;:::o;10414:366::-;10556:3;10577:67;10641:2;10636:3;10577:67;:::i;:::-;10570:74;;10653:93;10742:3;10653:93;:::i;:::-;10771:2;10766:3;10762:12;10755:19;;10560:220;;;:::o;10786:366::-;10928:3;10949:67;11013:2;11008:3;10949:67;:::i;:::-;10942:74;;11025:93;11114:3;11025:93;:::i;:::-;11143:2;11138:3;11134:12;11127:19;;10932:220;;;:::o;11158:366::-;11300:3;11321:67;11385:2;11380:3;11321:67;:::i;:::-;11314:74;;11397:93;11486:3;11397:93;:::i;:::-;11515:2;11510:3;11506:12;11499:19;;11304:220;;;:::o;11530:366::-;11672:3;11693:67;11757:2;11752:3;11693:67;:::i;:::-;11686:74;;11769:93;11858:3;11769:93;:::i;:::-;11887:2;11882:3;11878:12;11871:19;;11676:220;;;:::o;11902:366::-;12044:3;12065:67;12129:2;12124:3;12065:67;:::i;:::-;12058:74;;12141:93;12230:3;12141:93;:::i;:::-;12259:2;12254:3;12250:12;12243:19;;12048:220;;;:::o;12274:366::-;12416:3;12437:67;12501:2;12496:3;12437:67;:::i;:::-;12430:74;;12513:93;12602:3;12513:93;:::i;:::-;12631:2;12626:3;12622:12;12615:19;;12420:220;;;:::o;12646:400::-;12806:3;12827:84;12909:1;12904:3;12827:84;:::i;:::-;12820:91;;12920:93;13009:3;12920:93;:::i;:::-;13038:1;13033:3;13029:11;13022:18;;12810:236;;;:::o;13052:366::-;13194:3;13215:67;13279:2;13274:3;13215:67;:::i;:::-;13208:74;;13291:93;13380:3;13291:93;:::i;:::-;13409:2;13404:3;13400:12;13393:19;;13198:220;;;:::o;13424:366::-;13566:3;13587:67;13651:2;13646:3;13587:67;:::i;:::-;13580:74;;13663:93;13752:3;13663:93;:::i;:::-;13781:2;13776:3;13772:12;13765:19;;13570:220;;;:::o;13796:366::-;13938:3;13959:67;14023:2;14018:3;13959:67;:::i;:::-;13952:74;;14035:93;14124:3;14035:93;:::i;:::-;14153:2;14148:3;14144:12;14137:19;;13942:220;;;:::o;14168:366::-;14310:3;14331:67;14395:2;14390:3;14331:67;:::i;:::-;14324:74;;14407:93;14496:3;14407:93;:::i;:::-;14525:2;14520:3;14516:12;14509:19;;14314:220;;;:::o;14540:366::-;14682:3;14703:67;14767:2;14762:3;14703:67;:::i;:::-;14696:74;;14779:93;14868:3;14779:93;:::i;:::-;14897:2;14892:3;14888:12;14881:19;;14686:220;;;:::o;14912:366::-;15054:3;15075:67;15139:2;15134:3;15075:67;:::i;:::-;15068:74;;15151:93;15240:3;15151:93;:::i;:::-;15269:2;15264:3;15260:12;15253:19;;15058:220;;;:::o;15284:366::-;15426:3;15447:67;15511:2;15506:3;15447:67;:::i;:::-;15440:74;;15523:93;15612:3;15523:93;:::i;:::-;15641:2;15636:3;15632:12;15625:19;;15430:220;;;:::o;15656:366::-;15798:3;15819:67;15883:2;15878:3;15819:67;:::i;:::-;15812:74;;15895:93;15984:3;15895:93;:::i;:::-;16013:2;16008:3;16004:12;15997:19;;15802:220;;;:::o;16028:366::-;16170:3;16191:67;16255:2;16250:3;16191:67;:::i;:::-;16184:74;;16267:93;16356:3;16267:93;:::i;:::-;16385:2;16380:3;16376:12;16369:19;;16174:220;;;:::o;16400:366::-;16542:3;16563:67;16627:2;16622:3;16563:67;:::i;:::-;16556:74;;16639:93;16728:3;16639:93;:::i;:::-;16757:2;16752:3;16748:12;16741:19;;16546:220;;;:::o;16772:366::-;16914:3;16935:67;16999:2;16994:3;16935:67;:::i;:::-;16928:74;;17011:93;17100:3;17011:93;:::i;:::-;17129:2;17124:3;17120:12;17113:19;;16918:220;;;:::o;17144:366::-;17286:3;17307:67;17371:2;17366:3;17307:67;:::i;:::-;17300:74;;17383:93;17472:3;17383:93;:::i;:::-;17501:2;17496:3;17492:12;17485:19;;17290:220;;;:::o;17516:366::-;17658:3;17679:67;17743:2;17738:3;17679:67;:::i;:::-;17672:74;;17755:93;17844:3;17755:93;:::i;:::-;17873:2;17868:3;17864:12;17857:19;;17662:220;;;:::o;17888:366::-;18030:3;18051:67;18115:2;18110:3;18051:67;:::i;:::-;18044:74;;18127:93;18216:3;18127:93;:::i;:::-;18245:2;18240:3;18236:12;18229:19;;18034:220;;;:::o;18260:366::-;18402:3;18423:67;18487:2;18482:3;18423:67;:::i;:::-;18416:74;;18499:93;18588:3;18499:93;:::i;:::-;18617:2;18612:3;18608:12;18601:19;;18406:220;;;:::o;18632:366::-;18774:3;18795:67;18859:2;18854:3;18795:67;:::i;:::-;18788:74;;18871:93;18960:3;18871:93;:::i;:::-;18989:2;18984:3;18980:12;18973:19;;18778:220;;;:::o;19004:366::-;19146:3;19167:67;19231:2;19226:3;19167:67;:::i;:::-;19160:74;;19243:93;19332:3;19243:93;:::i;:::-;19361:2;19356:3;19352:12;19345:19;;19150:220;;;:::o;19376:366::-;19518:3;19539:67;19603:2;19598:3;19539:67;:::i;:::-;19532:74;;19615:93;19704:3;19615:93;:::i;:::-;19733:2;19728:3;19724:12;19717:19;;19522:220;;;:::o;19748:366::-;19890:3;19911:67;19975:2;19970:3;19911:67;:::i;:::-;19904:74;;19987:93;20076:3;19987:93;:::i;:::-;20105:2;20100:3;20096:12;20089:19;;19894:220;;;:::o;20120:118::-;20207:24;20225:5;20207:24;:::i;:::-;20202:3;20195:37;20185:53;;:::o;20244:112::-;20327:22;20343:5;20327:22;:::i;:::-;20322:3;20315:35;20305:51;;:::o;20362:435::-;20542:3;20564:95;20655:3;20646:6;20564:95;:::i;:::-;20557:102;;20676:95;20767:3;20758:6;20676:95;:::i;:::-;20669:102;;20788:3;20781:10;;20546:251;;;;;:::o;20803:663::-;21044:3;21066:148;21210:3;21066:148;:::i;:::-;21059:155;;21224:75;21295:3;21286:6;21224:75;:::i;:::-;21324:2;21319:3;21315:12;21308:19;;21337:75;21408:3;21399:6;21337:75;:::i;:::-;21437:2;21432:3;21428:12;21421:19;;21457:3;21450:10;;21048:418;;;;;:::o;21472:222::-;21565:4;21603:2;21592:9;21588:18;21580:26;;21616:71;21684:1;21673:9;21669:17;21660:6;21616:71;:::i;:::-;21570:124;;;;:::o;21700:442::-;21849:4;21887:2;21876:9;21872:18;21864:26;;21900:71;21968:1;21957:9;21953:17;21944:6;21900:71;:::i;:::-;21981:72;22049:2;22038:9;22034:18;22025:6;21981:72;:::i;:::-;22063;22131:2;22120:9;22116:18;22107:6;22063:72;:::i;:::-;21854:288;;;;;;:::o;22148:640::-;22343:4;22381:3;22370:9;22366:19;22358:27;;22395:71;22463:1;22452:9;22448:17;22439:6;22395:71;:::i;:::-;22476:72;22544:2;22533:9;22529:18;22520:6;22476:72;:::i;:::-;22558;22626:2;22615:9;22611:18;22602:6;22558:72;:::i;:::-;22677:9;22671:4;22667:20;22662:2;22651:9;22647:18;22640:48;22705:76;22776:4;22767:6;22705:76;:::i;:::-;22697:84;;22348:440;;;;;;;:::o;22794:332::-;22915:4;22953:2;22942:9;22938:18;22930:26;;22966:71;23034:1;23023:9;23019:17;23010:6;22966:71;:::i;:::-;23047:72;23115:2;23104:9;23100:18;23091:6;23047:72;:::i;:::-;22920:206;;;;;:::o;23132:210::-;23219:4;23257:2;23246:9;23242:18;23234:26;;23270:65;23332:1;23321:9;23317:17;23308:6;23270:65;:::i;:::-;23224:118;;;;:::o;23348:222::-;23441:4;23479:2;23468:9;23464:18;23456:26;;23492:71;23560:1;23549:9;23545:17;23536:6;23492:71;:::i;:::-;23446:124;;;;:::o;23576:553::-;23753:4;23791:3;23780:9;23776:19;23768:27;;23805:71;23873:1;23862:9;23858:17;23849:6;23805:71;:::i;:::-;23886:72;23954:2;23943:9;23939:18;23930:6;23886:72;:::i;:::-;23968;24036:2;24025:9;24021:18;24012:6;23968:72;:::i;:::-;24050;24118:2;24107:9;24103:18;24094:6;24050:72;:::i;:::-;23758:371;;;;;;;:::o;24135:664::-;24340:4;24378:3;24367:9;24363:19;24355:27;;24392:71;24460:1;24449:9;24445:17;24436:6;24392:71;:::i;:::-;24473:72;24541:2;24530:9;24526:18;24517:6;24473:72;:::i;:::-;24555;24623:2;24612:9;24608:18;24599:6;24555:72;:::i;:::-;24637;24705:2;24694:9;24690:18;24681:6;24637:72;:::i;:::-;24719:73;24787:3;24776:9;24772:19;24763:6;24719:73;:::i;:::-;24345:454;;;;;;;;:::o;24805:545::-;24978:4;25016:3;25005:9;25001:19;24993:27;;25030:71;25098:1;25087:9;25083:17;25074:6;25030:71;:::i;:::-;25111:68;25175:2;25164:9;25160:18;25151:6;25111:68;:::i;:::-;25189:72;25257:2;25246:9;25242:18;25233:6;25189:72;:::i;:::-;25271;25339:2;25328:9;25324:18;25315:6;25271:72;:::i;:::-;24983:367;;;;;;;:::o;25356:252::-;25464:4;25502:2;25491:9;25487:18;25479:26;;25515:86;25598:1;25587:9;25583:17;25574:6;25515:86;:::i;:::-;25469:139;;;;:::o;25614:313::-;25727:4;25765:2;25754:9;25750:18;25742:26;;25814:9;25808:4;25804:20;25800:1;25789:9;25785:17;25778:47;25842:78;25915:4;25906:6;25842:78;:::i;:::-;25834:86;;25732:195;;;;:::o;25933:419::-;26099:4;26137:2;26126:9;26122:18;26114:26;;26186:9;26180:4;26176:20;26172:1;26161:9;26157:17;26150:47;26214:131;26340:4;26214:131;:::i;:::-;26206:139;;26104:248;;;:::o;26358:419::-;26524:4;26562:2;26551:9;26547:18;26539:26;;26611:9;26605:4;26601:20;26597:1;26586:9;26582:17;26575:47;26639:131;26765:4;26639:131;:::i;:::-;26631:139;;26529:248;;;:::o;26783:419::-;26949:4;26987:2;26976:9;26972:18;26964:26;;27036:9;27030:4;27026:20;27022:1;27011:9;27007:17;27000:47;27064:131;27190:4;27064:131;:::i;:::-;27056:139;;26954:248;;;:::o;27208:419::-;27374:4;27412:2;27401:9;27397:18;27389:26;;27461:9;27455:4;27451:20;27447:1;27436:9;27432:17;27425:47;27489:131;27615:4;27489:131;:::i;:::-;27481:139;;27379:248;;;:::o;27633:419::-;27799:4;27837:2;27826:9;27822:18;27814:26;;27886:9;27880:4;27876:20;27872:1;27861:9;27857:17;27850:47;27914:131;28040:4;27914:131;:::i;:::-;27906:139;;27804:248;;;:::o;28058:419::-;28224:4;28262:2;28251:9;28247:18;28239:26;;28311:9;28305:4;28301:20;28297:1;28286:9;28282:17;28275:47;28339:131;28465:4;28339:131;:::i;:::-;28331:139;;28229:248;;;:::o;28483:419::-;28649:4;28687:2;28676:9;28672:18;28664:26;;28736:9;28730:4;28726:20;28722:1;28711:9;28707:17;28700:47;28764:131;28890:4;28764:131;:::i;:::-;28756:139;;28654:248;;;:::o;28908:419::-;29074:4;29112:2;29101:9;29097:18;29089:26;;29161:9;29155:4;29151:20;29147:1;29136:9;29132:17;29125:47;29189:131;29315:4;29189:131;:::i;:::-;29181:139;;29079:248;;;:::o;29333:419::-;29499:4;29537:2;29526:9;29522:18;29514:26;;29586:9;29580:4;29576:20;29572:1;29561:9;29557:17;29550:47;29614:131;29740:4;29614:131;:::i;:::-;29606:139;;29504:248;;;:::o;29758:419::-;29924:4;29962:2;29951:9;29947:18;29939:26;;30011:9;30005:4;30001:20;29997:1;29986:9;29982:17;29975:47;30039:131;30165:4;30039:131;:::i;:::-;30031:139;;29929:248;;;:::o;30183:419::-;30349:4;30387:2;30376:9;30372:18;30364:26;;30436:9;30430:4;30426:20;30422:1;30411:9;30407:17;30400:47;30464:131;30590:4;30464:131;:::i;:::-;30456:139;;30354:248;;;:::o;30608:419::-;30774:4;30812:2;30801:9;30797:18;30789:26;;30861:9;30855:4;30851:20;30847:1;30836:9;30832:17;30825:47;30889:131;31015:4;30889:131;:::i;:::-;30881:139;;30779:248;;;:::o;31033:419::-;31199:4;31237:2;31226:9;31222:18;31214:26;;31286:9;31280:4;31276:20;31272:1;31261:9;31257:17;31250:47;31314:131;31440:4;31314:131;:::i;:::-;31306:139;;31204:248;;;:::o;31458:419::-;31624:4;31662:2;31651:9;31647:18;31639:26;;31711:9;31705:4;31701:20;31697:1;31686:9;31682:17;31675:47;31739:131;31865:4;31739:131;:::i;:::-;31731:139;;31629:248;;;:::o;31883:419::-;32049:4;32087:2;32076:9;32072:18;32064:26;;32136:9;32130:4;32126:20;32122:1;32111:9;32107:17;32100:47;32164:131;32290:4;32164:131;:::i;:::-;32156:139;;32054:248;;;:::o;32308:419::-;32474:4;32512:2;32501:9;32497:18;32489:26;;32561:9;32555:4;32551:20;32547:1;32536:9;32532:17;32525:47;32589:131;32715:4;32589:131;:::i;:::-;32581:139;;32479:248;;;:::o;32733:419::-;32899:4;32937:2;32926:9;32922:18;32914:26;;32986:9;32980:4;32976:20;32972:1;32961:9;32957:17;32950:47;33014:131;33140:4;33014:131;:::i;:::-;33006:139;;32904:248;;;:::o;33158:419::-;33324:4;33362:2;33351:9;33347:18;33339:26;;33411:9;33405:4;33401:20;33397:1;33386:9;33382:17;33375:47;33439:131;33565:4;33439:131;:::i;:::-;33431:139;;33329:248;;;:::o;33583:419::-;33749:4;33787:2;33776:9;33772:18;33764:26;;33836:9;33830:4;33826:20;33822:1;33811:9;33807:17;33800:47;33864:131;33990:4;33864:131;:::i;:::-;33856:139;;33754:248;;;:::o;34008:419::-;34174:4;34212:2;34201:9;34197:18;34189:26;;34261:9;34255:4;34251:20;34247:1;34236:9;34232:17;34225:47;34289:131;34415:4;34289:131;:::i;:::-;34281:139;;34179:248;;;:::o;34433:419::-;34599:4;34637:2;34626:9;34622:18;34614:26;;34686:9;34680:4;34676:20;34672:1;34661:9;34657:17;34650:47;34714:131;34840:4;34714:131;:::i;:::-;34706:139;;34604:248;;;:::o;34858:419::-;35024:4;35062:2;35051:9;35047:18;35039:26;;35111:9;35105:4;35101:20;35097:1;35086:9;35082:17;35075:47;35139:131;35265:4;35139:131;:::i;:::-;35131:139;;35029:248;;;:::o;35283:419::-;35449:4;35487:2;35476:9;35472:18;35464:26;;35536:9;35530:4;35526:20;35522:1;35511:9;35507:17;35500:47;35564:131;35690:4;35564:131;:::i;:::-;35556:139;;35454:248;;;:::o;35708:419::-;35874:4;35912:2;35901:9;35897:18;35889:26;;35961:9;35955:4;35951:20;35947:1;35936:9;35932:17;35925:47;35989:131;36115:4;35989:131;:::i;:::-;35981:139;;35879:248;;;:::o;36133:419::-;36299:4;36337:2;36326:9;36322:18;36314:26;;36386:9;36380:4;36376:20;36372:1;36361:9;36357:17;36350:47;36414:131;36540:4;36414:131;:::i;:::-;36406:139;;36304:248;;;:::o;36558:419::-;36724:4;36762:2;36751:9;36747:18;36739:26;;36811:9;36805:4;36801:20;36797:1;36786:9;36782:17;36775:47;36839:131;36965:4;36839:131;:::i;:::-;36831:139;;36729:248;;;:::o;36983:222::-;37076:4;37114:2;37103:9;37099:18;37091:26;;37127:71;37195:1;37184:9;37180:17;37171:6;37127:71;:::i;:::-;37081:124;;;;:::o;37211:332::-;37332:4;37370:2;37359:9;37355:18;37347:26;;37383:71;37451:1;37440:9;37436:17;37427:6;37383:71;:::i;:::-;37464:72;37532:2;37521:9;37517:18;37508:6;37464:72;:::i;:::-;37337:206;;;;;:::o;37549:129::-;37583:6;37610:20;;:::i;:::-;37600:30;;37639:33;37667:4;37659:6;37639:33;:::i;:::-;37590:88;;;:::o;37684:75::-;37717:6;37750:2;37744:9;37734:19;;37724:35;:::o;37765:307::-;37826:4;37916:18;37908:6;37905:30;37902:2;;;37938:18;;:::i;:::-;37902:2;37976:29;37998:6;37976:29;:::i;:::-;37968:37;;38060:4;38054;38050:15;38042:23;;37831:241;;;:::o;38078:308::-;38140:4;38230:18;38222:6;38219:30;38216:2;;;38252:18;;:::i;:::-;38216:2;38290:29;38312:6;38290:29;:::i;:::-;38282:37;;38374:4;38368;38364:15;38356:23;;38145:241;;;:::o;38392:98::-;38443:6;38477:5;38471:12;38461:22;;38450:40;;;:::o;38496:99::-;38548:6;38582:5;38576:12;38566:22;;38555:40;;;:::o;38601:168::-;38684:11;38718:6;38713:3;38706:19;38758:4;38753:3;38749:14;38734:29;;38696:73;;;;:::o;38775:169::-;38859:11;38893:6;38888:3;38881:19;38933:4;38928:3;38924:14;38909:29;;38871:73;;;;:::o;38950:148::-;39052:11;39089:3;39074:18;;39064:34;;;;:::o;39104:305::-;39144:3;39163:20;39181:1;39163:20;:::i;:::-;39158:25;;39197:20;39215:1;39197:20;:::i;:::-;39192:25;;39351:1;39283:66;39279:74;39276:1;39273:81;39270:2;;;39357:18;;:::i;:::-;39270:2;39401:1;39398;39394:9;39387:16;;39148:261;;;;:::o;39415:185::-;39455:1;39472:20;39490:1;39472:20;:::i;:::-;39467:25;;39506:20;39524:1;39506:20;:::i;:::-;39501:25;;39545:1;39535:2;;39550:18;;:::i;:::-;39535:2;39592:1;39589;39585:9;39580:14;;39457:143;;;;:::o;39606:348::-;39646:7;39669:20;39687:1;39669:20;:::i;:::-;39664:25;;39703:20;39721:1;39703:20;:::i;:::-;39698:25;;39891:1;39823:66;39819:74;39816:1;39813:81;39808:1;39801:9;39794:17;39790:105;39787:2;;;39898:18;;:::i;:::-;39787:2;39946:1;39943;39939:9;39928:20;;39654:300;;;;:::o;39960:191::-;40000:4;40020:20;40038:1;40020:20;:::i;:::-;40015:25;;40054:20;40072:1;40054:20;:::i;:::-;40049:25;;40093:1;40090;40087:8;40084:2;;;40098:18;;:::i;:::-;40084:2;40143:1;40140;40136:9;40128:17;;40005:146;;;;:::o;40157:96::-;40194:7;40223:24;40241:5;40223:24;:::i;:::-;40212:35;;40202:51;;;:::o;40259:90::-;40293:7;40336:5;40329:13;40322:21;40311:32;;40301:48;;;:::o;40355:77::-;40392:7;40421:5;40410:16;;40400:32;;;:::o;40438:149::-;40474:7;40514:66;40507:5;40503:78;40492:89;;40482:105;;;:::o;40593:126::-;40630:7;40670:42;40663:5;40659:54;40648:65;;40638:81;;;:::o;40725:77::-;40762:7;40791:5;40780:16;;40770:32;;;:::o;40808:86::-;40843:7;40883:4;40876:5;40872:16;40861:27;;40851:43;;;:::o;40900:156::-;40965:9;40998:52;41044:5;40998:52;:::i;:::-;40985:65;;40975:81;;;:::o;41062:128::-;41127:9;41160:24;41178:5;41160:24;:::i;:::-;41147:37;;41137:53;;;:::o;41196:154::-;41280:6;41275:3;41270;41257:30;41342:1;41333:6;41328:3;41324:16;41317:27;41247:103;;;:::o;41356:307::-;41424:1;41434:113;41448:6;41445:1;41442:13;41434:113;;;41533:1;41528:3;41524:11;41518:18;41514:1;41509:3;41505:11;41498:39;41470:2;41467:1;41463:10;41458:15;;41434:113;;;41565:6;41562:1;41559:13;41556:2;;;41645:1;41636:6;41631:3;41627:16;41620:27;41556:2;41405:258;;;;:::o;41669:320::-;41713:6;41750:1;41744:4;41740:12;41730:22;;41797:1;41791:4;41787:12;41818:18;41808:2;;41874:4;41866:6;41862:17;41852:27;;41808:2;41936;41928:6;41925:14;41905:18;41902:38;41899:2;;;41955:18;;:::i;:::-;41899:2;41720:269;;;;:::o;41995:281::-;42078:27;42100:4;42078:27;:::i;:::-;42070:6;42066:40;42208:6;42196:10;42193:22;42172:18;42160:10;42157:34;42154:62;42151:2;;;42219:18;;:::i;:::-;42151:2;42259:10;42255:2;42248:22;42038:238;;;:::o;42282:233::-;42321:3;42344:24;42362:5;42344:24;:::i;:::-;42335:33;;42390:66;42383:5;42380:77;42377:2;;;42460:18;;:::i;:::-;42377:2;42507:1;42500:5;42496:13;42489:20;;42325:190;;;:::o;42521:79::-;42560:7;42589:5;42578:16;;42568:32;;;:::o;42606:176::-;42638:1;42655:20;42673:1;42655:20;:::i;:::-;42650:25;;42689:20;42707:1;42689:20;:::i;:::-;42684:25;;42728:1;42718:2;;42733:18;;:::i;:::-;42718:2;42774:1;42771;42767:9;42762:14;;42640:142;;;;:::o;42788:180::-;42836:77;42833:1;42826:88;42933:4;42930:1;42923:15;42957:4;42954:1;42947:15;42974:180;43022:77;43019:1;43012:88;43119:4;43116:1;43109:15;43143:4;43140:1;43133:15;43160:180;43208:77;43205:1;43198:88;43305:4;43302:1;43295:15;43329:4;43326:1;43319:15;43346:180;43394:77;43391:1;43384:88;43491:4;43488:1;43481:15;43515:4;43512:1;43505:15;43532:102;43573:6;43624:2;43620:7;43615:2;43608:5;43604:14;43600:28;43590:38;;43580:54;;;:::o;43640:174::-;43780:26;43776:1;43768:6;43764:14;43757:50;43746:68;:::o;43820:170::-;43960:22;43956:1;43948:6;43944:14;43937:46;43926:64;:::o;43996:181::-;44136:33;44132:1;44124:6;44120:14;44113:57;44102:75;:::o;44183:237::-;44323:34;44319:1;44311:6;44307:14;44300:58;44392:20;44387:2;44379:6;44375:15;44368:45;44289:131;:::o;44426:225::-;44566:34;44562:1;44554:6;44550:14;44543:58;44635:8;44630:2;44622:6;44618:15;44611:33;44532:119;:::o;44657:224::-;44797:34;44793:1;44785:6;44781:14;44774:58;44866:7;44861:2;44853:6;44849:15;44842:32;44763:118;:::o;44887:178::-;45027:30;45023:1;45015:6;45011:14;45004:54;44993:72;:::o;45071:214::-;45211:66;45207:1;45199:6;45195:14;45188:90;45177:108;:::o;45291:223::-;45431:34;45427:1;45419:6;45415:14;45408:58;45500:6;45495:2;45487:6;45483:15;45476:31;45397:117;:::o;45520:175::-;45660:27;45656:1;45648:6;45644:14;45637:51;45626:69;:::o;45701:221::-;45841:34;45837:1;45829:6;45825:14;45818:58;45910:4;45905:2;45897:6;45893:15;45886:29;45807:115;:::o;45928:231::-;46068:34;46064:1;46056:6;46052:14;46045:58;46137:14;46132:2;46124:6;46120:15;46113:39;46034:125;:::o;46165:182::-;46305:34;46301:1;46293:6;46289:14;46282:58;46271:76;:::o;46353:174::-;46493:26;46489:1;46481:6;46477:14;46470:50;46459:68;:::o;46533:243::-;46673:34;46669:1;46661:6;46657:14;46650:58;46742:26;46737:2;46729:6;46725:15;46718:51;46639:137;:::o;46782:229::-;46922:34;46918:1;46910:6;46906:14;46899:58;46991:12;46986:2;46978:6;46974:15;46967:37;46888:123;:::o;47017:228::-;47157:34;47153:1;47145:6;47141:14;47134:58;47226:11;47221:2;47213:6;47209:15;47202:36;47123:122;:::o;47251:176::-;47391:28;47387:1;47379:6;47375:14;47368:52;47357:70;:::o;47433:221::-;47573:34;47569:1;47561:6;47557:14;47550:58;47642:4;47637:2;47629:6;47625:15;47618:29;47539:115;:::o;47660:182::-;47800:34;47796:1;47788:6;47784:14;47777:58;47766:76;:::o;47848:231::-;47988:34;47984:1;47976:6;47972:14;47965:58;48057:14;48052:2;48044:6;48040:15;48033:39;47954:125;:::o;48085:182::-;48225:34;48221:1;48213:6;48209:14;48202:58;48191:76;:::o;48273:226::-;48413:34;48409:1;48401:6;48397:14;48390:58;48482:9;48477:2;48469:6;48465:15;48458:34;48379:120;:::o;48505:234::-;48645:34;48641:1;48633:6;48629:14;48622:58;48714:17;48709:2;48701:6;48697:15;48690:42;48611:128;:::o;48745:220::-;48885:34;48881:1;48873:6;48869:14;48862:58;48954:3;48949:2;48941:6;48937:15;48930:28;48851:114;:::o;48971:236::-;49111:34;49107:1;49099:6;49095:14;49088:58;49180:19;49175:2;49167:6;49163:15;49156:44;49077:130;:::o;49213:225::-;49353:34;49349:1;49341:6;49337:14;49330:58;49422:8;49417:2;49409:6;49405:15;49398:33;49319:119;:::o;49444:122::-;49517:24;49535:5;49517:24;:::i;:::-;49510:5;49507:35;49497:2;;49556:1;49553;49546:12;49497:2;49487:79;:::o;49572:116::-;49642:21;49657:5;49642:21;:::i;:::-;49635:5;49632:32;49622:2;;49678:1;49675;49668:12;49622:2;49612:76;:::o;49694:122::-;49767:24;49785:5;49767:24;:::i;:::-;49760:5;49757:35;49747:2;;49806:1;49803;49796:12;49747:2;49737:79;:::o;49822:120::-;49894:23;49911:5;49894:23;:::i;:::-;49887:5;49884:34;49874:2;;49932:1;49929;49922:12;49874:2;49864:78;:::o;49948:122::-;50021:24;50039:5;50021:24;:::i;:::-;50014:5;50011:35;50001:2;;50060:1;50057;50050:12;50001:2;49991:79;:::o;50076:118::-;50147:22;50163:5;50147:22;:::i;:::-;50140:5;50137:33;50127:2;;50184:1;50181;50174:12;50127:2;50117:77;:::o

Swarm Source

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