ETH Price: $3,425.50 (-6.20%)

Token

Crazy Donkey (DONKEY)
 

Overview

Max Total Supply

999 DONKEY

Holders

372

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
brogee.eth
Balance
2 DONKEY
0x8d0f3988d864757bb429b08df92b93c185bcc2ea
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:
CrazyDonkey

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-14
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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


pragma solidity ^0.8.0;


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

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


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: crazydonkey.sol

pragma solidity ^0.8.0;



contract CrazyDonkey is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string _baseTokenURI;
    uint256 private _maxMint = 15;
    uint256 private _price = 7 * 10**16; //0.07 ETH;
    bool public _paused = false;
    uint public constant MAX_ENTRIES = 1000;

    constructor() ERC721("Crazy Donkey", "DONKEY")  {
        setBaseURI("https://api.crazydonkey.club/");
    }
    
    function mint(address _to, uint256 num) public payable {
        uint256 supply = totalSupply();

        if(msg.sender != owner()) {
          require( num < (_maxMint+1),"You can adopt a maximum of _maxMint tokens" );
          require( msg.value >= _price * num,"Ether sent is not correct" );
        }

        require( supply + num < MAX_ENTRIES, "Exceeds maximum supply" );

        for(uint256 i; i < num; i++){
          _safeMint( _to, supply + i );
        }
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function getPrice() public view returns (uint256){
        if(msg.sender == owner()) {
            return 0;
        }
        return _price;
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600f600c5566f8b0a10e470000600d556000600e60006101000a81548160ff0219169083151502179055503480156200003c57600080fd5b506040518060400160405280600c81526020017f4372617a7920446f6e6b657900000000000000000000000000000000000000008152506040518060400160405280600681526020017f444f4e4b455900000000000000000000000000000000000000000000000000008152508160009080519060200190620000c1929190620002ec565b508060019080519060200190620000da929190620002ec565b505050620000fd620000f16200014960201b60201c565b6200015160201b60201c565b620001436040518060400160405280601d81526020017f68747470733a2f2f6170692e6372617a79646f6e6b65792e636c75622f0000008152506200021760201b60201c565b62000476565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002276200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024d620002c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029d90620003de565b60405180910390fd5b80600b9080519060200190620002be929190620002ec565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002fa9062000411565b90600052602060002090601f0160209004810192826200031e57600085556200036a565b82601f106200033957805160ff19168380011785556200036a565b828001600101855582156200036a579182015b82811115620003695782518255916020019190600101906200034c565b5b5090506200037991906200037d565b5090565b5b80821115620003985760008160009055506001016200037e565b5090565b6000620003ab60208362000400565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620003f9816200039c565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200042a57607f821691505b6020821081141562000441576200044062000447565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613d8380620004866000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec57806395d89b411161008a578063b88d4fde11610064578063b88d4fde146105ac578063c87b56dd146105d5578063e985e9c514610612578063f2fde38b1461064f5761019c565b806395d89b411461052d57806398d5fdca14610558578063a22cb465146105835761019c565b80637d4cb964116100c65780637d4cb964146104a4578063853828b6146104cf5780638da5cb5b146104d957806391b7f5ed146105045761019c565b80636352211e1461041357806370a0823114610450578063715018a61461048d5761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e14610347578063438b6300146103705780634f6ccce7146103ad57806355f804b3146103ea5761019c565b806323b872dd146102c55780632f745c59146102ee57806340c10f191461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806316c61ccc1461026f57806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612b70565b610678565b6040516101d591906135a8565b60405180910390f35b3480156101ea57600080fd5b506101f36106f2565b60405161020091906135c3565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612c03565b610784565b60405161023d919061351f565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612b34565b610809565b005b34801561027b57600080fd5b50610284610921565b60405161029191906135a8565b60405180910390f35b3480156102a657600080fd5b506102af610934565b6040516102bc9190613885565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612a2e565b610941565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612b34565b6109a1565b6040516103229190613885565b60405180910390f35b61034560048036038101906103409190612b34565b610a46565b005b34801561035357600080fd5b5061036e60048036038101906103699190612a2e565b610bb5565b005b34801561037c57600080fd5b50610397600480360381019061039291906129c9565b610bd5565b6040516103a49190613586565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190612c03565b610ccf565b6040516103e19190613885565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190612bc2565b610d66565b005b34801561041f57600080fd5b5061043a60048036038101906104359190612c03565b610dfc565b604051610447919061351f565b60405180910390f35b34801561045c57600080fd5b50610477600480360381019061047291906129c9565b610eae565b6040516104849190613885565b60405180910390f35b34801561049957600080fd5b506104a2610f66565b005b3480156104b057600080fd5b506104b9610fee565b6040516104c69190613885565b60405180910390f35b6104d7610ff4565b005b3480156104e557600080fd5b506104ee6110b0565b6040516104fb919061351f565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612c03565b6110da565b005b34801561053957600080fd5b50610542611160565b60405161054f91906135c3565b60405180910390f35b34801561056457600080fd5b5061056d6111f2565b60405161057a9190613885565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190612af8565b611241565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190612a7d565b6113c2565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612c03565b611424565b60405161060991906135c3565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906129f2565b6114cb565b60405161064691906135a8565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906129c9565b61155f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106eb57506106ea82611657565b5b9050919050565b60606000805461070190613b78565b80601f016020809104026020016040519081016040528092919081815260200182805461072d90613b78565b801561077a5780601f1061074f5761010080835404028352916020019161077a565b820191906000526020600020905b81548152906001019060200180831161075d57829003601f168201915b5050505050905090565b600061078f82611739565b6107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c590613765565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081482610dfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c906137e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108a46117a5565b73ffffffffffffffffffffffffffffffffffffffff1614806108d357506108d2816108cd6117a5565b6114cb565b5b610912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610909906136e5565b60405180910390fd5b61091c83836117ad565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b61095261094c6117a5565b82611866565b610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890613845565b60405180910390fd5b61099c838383611944565b505050565b60006109ac83610eae565b82106109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e4906135e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610a50610934565b9050610a5a6110b0565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b2d576001600c54610a9b91906139ad565b8210610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad3906136c5565b60405180910390fd5b81600d54610aea9190613a34565b341015610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390613825565b60405180910390fd5b5b6103e88282610b3c91906139ad565b10610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390613805565b60405180910390fd5b60005b82811015610baf57610b9c848284610b9791906139ad565b611ba0565b8080610ba790613baa565b915050610b7f565b50505050565b610bd0838383604051806020016040528060008152506113c2565b505050565b60606000610be283610eae565b905060008167ffffffffffffffff811115610c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c545781602001602082028036833780820191505090505b50905060005b82811015610cc457610c6c85826109a1565b828281518110610ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610cbc90613baa565b915050610c5a565b508092505050919050565b6000610cd9610934565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613865565b60405180910390fd5b60088281548110610d54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d6e6117a5565b73ffffffffffffffffffffffffffffffffffffffff16610d8c6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613785565b60405180910390fd5b80600b9080519060200190610df89291906127ed565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613725565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690613705565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f6e6117a5565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990613785565b60405180910390fd5b610fec6000611bbe565b565b6103e881565b610ffc6117a5565b73ffffffffffffffffffffffffffffffffffffffff1661101a6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613785565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506110ae57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110e26117a5565b73ffffffffffffffffffffffffffffffffffffffff166111006110b0565b73ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613785565b60405180910390fd5b80600d8190555050565b60606001805461116f90613b78565b80601f016020809104026020016040519081016040528092919081815260200182805461119b90613b78565b80156111e85780601f106111bd576101008083540402835291602001916111e8565b820191906000526020600020905b8154815290600101906020018083116111cb57829003601f168201915b5050505050905090565b60006111fc6110b0565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611238576000905061123e565b600d5490505b90565b6112496117a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613685565b60405180910390fd5b80600560006112c46117a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113716117a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113b691906135a8565b60405180910390a35050565b6113d36113cd6117a5565b83611866565b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613845565b60405180910390fd5b61141e84848484611c84565b50505050565b606061142f82611739565b61146e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611465906137c5565b60405180910390fd5b6000611478611ce0565b9050600081511161149857604051806020016040528060008152506114c3565b806114a284611d72565b6040516020016114b39291906134fb565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115676117a5565b73ffffffffffffffffffffffffffffffffffffffff166115856110b0565b73ffffffffffffffffffffffffffffffffffffffff16146115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613785565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290613625565b60405180910390fd5b61165481611bbe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611732575061173182611f1f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661182083610dfc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061187182611739565b6118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a7906136a5565b60405180910390fd5b60006118bb83610dfc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192a57508373ffffffffffffffffffffffffffffffffffffffff1661191284610784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061193b575061193a81856114cb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196482610dfc565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b1906137a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190613665565b60405180910390fd5b611a35838383611f89565b611a406000826117ad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a909190613a8e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae791906139ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611bba82826040518060200160405280600081525061209d565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c8f848484611944565b611c9b848484846120f8565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190613605565b60405180910390fd5b50505050565b6060600b8054611cef90613b78565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613b78565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b60606000821415611dba576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f1a565b600082905060005b60008214611dec578080611dd590613baa565b915050600a82611de59190613a03565b9150611dc2565b60008167ffffffffffffffff811115611e2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e605781602001600182028036833780820191505090505b5090505b60008514611f1357600182611e799190613a8e565b9150600a85611e889190613bf3565b6030611e9491906139ad565b60f81b818381518110611ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0c9190613a03565b9450611e64565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f9483838361228f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fd757611fd281612294565b612016565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120155761201483826122dd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612059576120548161244a565b612098565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461209757612096828261258d565b5b5b505050565b6120a7838361260c565b6120b460008484846120f8565b6120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90613605565b60405180910390fd5b505050565b60006121198473ffffffffffffffffffffffffffffffffffffffff166127da565b15612282578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121426117a5565b8786866040518563ffffffff1660e01b8152600401612164949392919061353a565b602060405180830381600087803b15801561217e57600080fd5b505af19250505080156121af57506040513d601f19601f820116820180604052508101906121ac9190612b99565b60015b612232573d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b5060008151141561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613605565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612287565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122ea84610eae565b6122f49190613a8e565b90506000600760008481526020019081526020016000205490508181146123d9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061245e9190613a8e565b90506000600960008481526020019081526020016000205490506000600883815481106124b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106124fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612571577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061259883610eae565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561267c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267390613745565b60405180910390fd5b61268581611739565b156126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90613645565b60405180910390fd5b6126d160008383611f89565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272191906139ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127f990613b78565b90600052602060002090601f01602090048101928261281b5760008555612862565b82601f1061283457805160ff1916838001178555612862565b82800160010185558215612862579182015b82811115612861578251825591602001919060010190612846565b5b50905061286f9190612873565b5090565b5b8082111561288c576000816000905550600101612874565b5090565b60006128a361289e846138d1565b6138a0565b9050828152602081018484840111156128bb57600080fd5b6128c6848285613b36565b509392505050565b60006128e16128dc84613901565b6138a0565b9050828152602081018484840111156128f957600080fd5b612904848285613b36565b509392505050565b60008135905061291b81613cf1565b92915050565b60008135905061293081613d08565b92915050565b60008135905061294581613d1f565b92915050565b60008151905061295a81613d1f565b92915050565b600082601f83011261297157600080fd5b8135612981848260208601612890565b91505092915050565b600082601f83011261299b57600080fd5b81356129ab8482602086016128ce565b91505092915050565b6000813590506129c381613d36565b92915050565b6000602082840312156129db57600080fd5b60006129e98482850161290c565b91505092915050565b60008060408385031215612a0557600080fd5b6000612a138582860161290c565b9250506020612a248582860161290c565b9150509250929050565b600080600060608486031215612a4357600080fd5b6000612a518682870161290c565b9350506020612a628682870161290c565b9250506040612a73868287016129b4565b9150509250925092565b60008060008060808587031215612a9357600080fd5b6000612aa18782880161290c565b9450506020612ab28782880161290c565b9350506040612ac3878288016129b4565b925050606085013567ffffffffffffffff811115612ae057600080fd5b612aec87828801612960565b91505092959194509250565b60008060408385031215612b0b57600080fd5b6000612b198582860161290c565b9250506020612b2a85828601612921565b9150509250929050565b60008060408385031215612b4757600080fd5b6000612b558582860161290c565b9250506020612b66858286016129b4565b9150509250929050565b600060208284031215612b8257600080fd5b6000612b9084828501612936565b91505092915050565b600060208284031215612bab57600080fd5b6000612bb98482850161294b565b91505092915050565b600060208284031215612bd457600080fd5b600082013567ffffffffffffffff811115612bee57600080fd5b612bfa8482850161298a565b91505092915050565b600060208284031215612c1557600080fd5b6000612c23848285016129b4565b91505092915050565b6000612c3883836134dd565b60208301905092915050565b612c4d81613ac2565b82525050565b6000612c5e82613941565b612c68818561396f565b9350612c7383613931565b8060005b83811015612ca4578151612c8b8882612c2c565b9750612c9683613962565b925050600181019050612c77565b5085935050505092915050565b612cba81613ad4565b82525050565b6000612ccb8261394c565b612cd58185613980565b9350612ce5818560208601613b45565b612cee81613ce0565b840191505092915050565b6000612d0482613957565b612d0e8185613991565b9350612d1e818560208601613b45565b612d2781613ce0565b840191505092915050565b6000612d3d82613957565b612d4781856139a2565b9350612d57818560208601613b45565b80840191505092915050565b6000612d70602b83613991565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd6603283613991565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e3c602683613991565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ea2601c83613991565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ee2602483613991565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f48601983613991565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f88602c83613991565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612fee602a83613991565b91507f596f752063616e2061646f70742061206d6178696d756d206f66205f6d61784d60008301527f696e7420746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613054603883613991565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006130ba602a83613991565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613120602983613991565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613186602083613991565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006131c6602c83613991565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061322c602083613991565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061326c602983613991565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d2602f83613991565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613338602183613991565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061339e601683613991565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b60006133de601983613991565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b600061341e603183613991565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613484602c83613991565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6134e681613b2c565b82525050565b6134f581613b2c565b82525050565b60006135078285612d32565b91506135138284612d32565b91508190509392505050565b60006020820190506135346000830184612c44565b92915050565b600060808201905061354f6000830187612c44565b61355c6020830186612c44565b61356960408301856134ec565b818103606083015261357b8184612cc0565b905095945050505050565b600060208201905081810360008301526135a08184612c53565b905092915050565b60006020820190506135bd6000830184612cb1565b92915050565b600060208201905081810360008301526135dd8184612cf9565b905092915050565b600060208201905081810360008301526135fe81612d63565b9050919050565b6000602082019050818103600083015261361e81612dc9565b9050919050565b6000602082019050818103600083015261363e81612e2f565b9050919050565b6000602082019050818103600083015261365e81612e95565b9050919050565b6000602082019050818103600083015261367e81612ed5565b9050919050565b6000602082019050818103600083015261369e81612f3b565b9050919050565b600060208201905081810360008301526136be81612f7b565b9050919050565b600060208201905081810360008301526136de81612fe1565b9050919050565b600060208201905081810360008301526136fe81613047565b9050919050565b6000602082019050818103600083015261371e816130ad565b9050919050565b6000602082019050818103600083015261373e81613113565b9050919050565b6000602082019050818103600083015261375e81613179565b9050919050565b6000602082019050818103600083015261377e816131b9565b9050919050565b6000602082019050818103600083015261379e8161321f565b9050919050565b600060208201905081810360008301526137be8161325f565b9050919050565b600060208201905081810360008301526137de816132c5565b9050919050565b600060208201905081810360008301526137fe8161332b565b9050919050565b6000602082019050818103600083015261381e81613391565b9050919050565b6000602082019050818103600083015261383e816133d1565b9050919050565b6000602082019050818103600083015261385e81613411565b9050919050565b6000602082019050818103600083015261387e81613477565b9050919050565b600060208201905061389a60008301846134ec565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138c7576138c6613cb1565b5b8060405250919050565b600067ffffffffffffffff8211156138ec576138eb613cb1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561391c5761391b613cb1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139b882613b2c565b91506139c383613b2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f8576139f7613c24565b5b828201905092915050565b6000613a0e82613b2c565b9150613a1983613b2c565b925082613a2957613a28613c53565b5b828204905092915050565b6000613a3f82613b2c565b9150613a4a83613b2c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8357613a82613c24565b5b828202905092915050565b6000613a9982613b2c565b9150613aa483613b2c565b925082821015613ab757613ab6613c24565b5b828203905092915050565b6000613acd82613b0c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b63578082015181840152602081019050613b48565b83811115613b72576000848401525b50505050565b60006002820490506001821680613b9057607f821691505b60208210811415613ba457613ba3613c82565b5b50919050565b6000613bb582613b2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be857613be7613c24565b5b600182019050919050565b6000613bfe82613b2c565b9150613c0983613b2c565b925082613c1957613c18613c53565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613cfa81613ac2565b8114613d0557600080fd5b50565b613d1181613ad4565b8114613d1c57600080fd5b50565b613d2881613ae0565b8114613d3357600080fd5b50565b613d3f81613b2c565b8114613d4a57600080fd5b5056fea264697066735822122067fcc7a50337fb23660c09a84c1680d02533f6e340a630f303e7c9547f28973d64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80636352211e116100ec57806395d89b411161008a578063b88d4fde11610064578063b88d4fde146105ac578063c87b56dd146105d5578063e985e9c514610612578063f2fde38b1461064f5761019c565b806395d89b411461052d57806398d5fdca14610558578063a22cb465146105835761019c565b80637d4cb964116100c65780637d4cb964146104a4578063853828b6146104cf5780638da5cb5b146104d957806391b7f5ed146105045761019c565b80636352211e1461041357806370a0823114610450578063715018a61461048d5761019c565b806323b872dd1161015957806342842e0e1161013357806342842e0e14610347578063438b6300146103705780634f6ccce7146103ad57806355f804b3146103ea5761019c565b806323b872dd146102c55780632f745c59146102ee57806340c10f191461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806316c61ccc1461026f57806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612b70565b610678565b6040516101d591906135a8565b60405180910390f35b3480156101ea57600080fd5b506101f36106f2565b60405161020091906135c3565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612c03565b610784565b60405161023d919061351f565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612b34565b610809565b005b34801561027b57600080fd5b50610284610921565b60405161029191906135a8565b60405180910390f35b3480156102a657600080fd5b506102af610934565b6040516102bc9190613885565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612a2e565b610941565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612b34565b6109a1565b6040516103229190613885565b60405180910390f35b61034560048036038101906103409190612b34565b610a46565b005b34801561035357600080fd5b5061036e60048036038101906103699190612a2e565b610bb5565b005b34801561037c57600080fd5b50610397600480360381019061039291906129c9565b610bd5565b6040516103a49190613586565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190612c03565b610ccf565b6040516103e19190613885565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190612bc2565b610d66565b005b34801561041f57600080fd5b5061043a60048036038101906104359190612c03565b610dfc565b604051610447919061351f565b60405180910390f35b34801561045c57600080fd5b50610477600480360381019061047291906129c9565b610eae565b6040516104849190613885565b60405180910390f35b34801561049957600080fd5b506104a2610f66565b005b3480156104b057600080fd5b506104b9610fee565b6040516104c69190613885565b60405180910390f35b6104d7610ff4565b005b3480156104e557600080fd5b506104ee6110b0565b6040516104fb919061351f565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612c03565b6110da565b005b34801561053957600080fd5b50610542611160565b60405161054f91906135c3565b60405180910390f35b34801561056457600080fd5b5061056d6111f2565b60405161057a9190613885565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190612af8565b611241565b005b3480156105b857600080fd5b506105d360048036038101906105ce9190612a7d565b6113c2565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612c03565b611424565b60405161060991906135c3565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906129f2565b6114cb565b60405161064691906135a8565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906129c9565b61155f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106eb57506106ea82611657565b5b9050919050565b60606000805461070190613b78565b80601f016020809104026020016040519081016040528092919081815260200182805461072d90613b78565b801561077a5780601f1061074f5761010080835404028352916020019161077a565b820191906000526020600020905b81548152906001019060200180831161075d57829003601f168201915b5050505050905090565b600061078f82611739565b6107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c590613765565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081482610dfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c906137e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108a46117a5565b73ffffffffffffffffffffffffffffffffffffffff1614806108d357506108d2816108cd6117a5565b6114cb565b5b610912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610909906136e5565b60405180910390fd5b61091c83836117ad565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b61095261094c6117a5565b82611866565b610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890613845565b60405180910390fd5b61099c838383611944565b505050565b60006109ac83610eae565b82106109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e4906135e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610a50610934565b9050610a5a6110b0565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b2d576001600c54610a9b91906139ad565b8210610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad3906136c5565b60405180910390fd5b81600d54610aea9190613a34565b341015610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390613825565b60405180910390fd5b5b6103e88282610b3c91906139ad565b10610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390613805565b60405180910390fd5b60005b82811015610baf57610b9c848284610b9791906139ad565b611ba0565b8080610ba790613baa565b915050610b7f565b50505050565b610bd0838383604051806020016040528060008152506113c2565b505050565b60606000610be283610eae565b905060008167ffffffffffffffff811115610c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c545781602001602082028036833780820191505090505b50905060005b82811015610cc457610c6c85826109a1565b828281518110610ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610cbc90613baa565b915050610c5a565b508092505050919050565b6000610cd9610934565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613865565b60405180910390fd5b60088281548110610d54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d6e6117a5565b73ffffffffffffffffffffffffffffffffffffffff16610d8c6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613785565b60405180910390fd5b80600b9080519060200190610df89291906127ed565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613725565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690613705565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f6e6117a5565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990613785565b60405180910390fd5b610fec6000611bbe565b565b6103e881565b610ffc6117a5565b73ffffffffffffffffffffffffffffffffffffffff1661101a6110b0565b73ffffffffffffffffffffffffffffffffffffffff1614611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613785565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506110ae57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110e26117a5565b73ffffffffffffffffffffffffffffffffffffffff166111006110b0565b73ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613785565b60405180910390fd5b80600d8190555050565b60606001805461116f90613b78565b80601f016020809104026020016040519081016040528092919081815260200182805461119b90613b78565b80156111e85780601f106111bd576101008083540402835291602001916111e8565b820191906000526020600020905b8154815290600101906020018083116111cb57829003601f168201915b5050505050905090565b60006111fc6110b0565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611238576000905061123e565b600d5490505b90565b6112496117a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613685565b60405180910390fd5b80600560006112c46117a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113716117a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113b691906135a8565b60405180910390a35050565b6113d36113cd6117a5565b83611866565b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613845565b60405180910390fd5b61141e84848484611c84565b50505050565b606061142f82611739565b61146e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611465906137c5565b60405180910390fd5b6000611478611ce0565b9050600081511161149857604051806020016040528060008152506114c3565b806114a284611d72565b6040516020016114b39291906134fb565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115676117a5565b73ffffffffffffffffffffffffffffffffffffffff166115856110b0565b73ffffffffffffffffffffffffffffffffffffffff16146115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613785565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290613625565b60405180910390fd5b61165481611bbe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611732575061173182611f1f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661182083610dfc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061187182611739565b6118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a7906136a5565b60405180910390fd5b60006118bb83610dfc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192a57508373ffffffffffffffffffffffffffffffffffffffff1661191284610784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061193b575061193a81856114cb565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196482610dfc565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b1906137a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190613665565b60405180910390fd5b611a35838383611f89565b611a406000826117ad565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a909190613a8e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae791906139ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611bba82826040518060200160405280600081525061209d565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c8f848484611944565b611c9b848484846120f8565b611cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd190613605565b60405180910390fd5b50505050565b6060600b8054611cef90613b78565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613b78565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b60606000821415611dba576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f1a565b600082905060005b60008214611dec578080611dd590613baa565b915050600a82611de59190613a03565b9150611dc2565b60008167ffffffffffffffff811115611e2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e605781602001600182028036833780820191505090505b5090505b60008514611f1357600182611e799190613a8e565b9150600a85611e889190613bf3565b6030611e9491906139ad565b60f81b818381518110611ed0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0c9190613a03565b9450611e64565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f9483838361228f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fd757611fd281612294565b612016565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120155761201483826122dd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612059576120548161244a565b612098565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461209757612096828261258d565b5b5b505050565b6120a7838361260c565b6120b460008484846120f8565b6120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90613605565b60405180910390fd5b505050565b60006121198473ffffffffffffffffffffffffffffffffffffffff166127da565b15612282578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121426117a5565b8786866040518563ffffffff1660e01b8152600401612164949392919061353a565b602060405180830381600087803b15801561217e57600080fd5b505af19250505080156121af57506040513d601f19601f820116820180604052508101906121ac9190612b99565b60015b612232573d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b5060008151141561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613605565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612287565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122ea84610eae565b6122f49190613a8e565b90506000600760008481526020019081526020016000205490508181146123d9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061245e9190613a8e565b90506000600960008481526020019081526020016000205490506000600883815481106124b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106124fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612571577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061259883610eae565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561267c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267390613745565b60405180910390fd5b61268581611739565b156126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc90613645565b60405180910390fd5b6126d160008383611f89565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461272191906139ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127f990613b78565b90600052602060002090601f01602090048101928261281b5760008555612862565b82601f1061283457805160ff1916838001178555612862565b82800160010185558215612862579182015b82811115612861578251825591602001919060010190612846565b5b50905061286f9190612873565b5090565b5b8082111561288c576000816000905550600101612874565b5090565b60006128a361289e846138d1565b6138a0565b9050828152602081018484840111156128bb57600080fd5b6128c6848285613b36565b509392505050565b60006128e16128dc84613901565b6138a0565b9050828152602081018484840111156128f957600080fd5b612904848285613b36565b509392505050565b60008135905061291b81613cf1565b92915050565b60008135905061293081613d08565b92915050565b60008135905061294581613d1f565b92915050565b60008151905061295a81613d1f565b92915050565b600082601f83011261297157600080fd5b8135612981848260208601612890565b91505092915050565b600082601f83011261299b57600080fd5b81356129ab8482602086016128ce565b91505092915050565b6000813590506129c381613d36565b92915050565b6000602082840312156129db57600080fd5b60006129e98482850161290c565b91505092915050565b60008060408385031215612a0557600080fd5b6000612a138582860161290c565b9250506020612a248582860161290c565b9150509250929050565b600080600060608486031215612a4357600080fd5b6000612a518682870161290c565b9350506020612a628682870161290c565b9250506040612a73868287016129b4565b9150509250925092565b60008060008060808587031215612a9357600080fd5b6000612aa18782880161290c565b9450506020612ab28782880161290c565b9350506040612ac3878288016129b4565b925050606085013567ffffffffffffffff811115612ae057600080fd5b612aec87828801612960565b91505092959194509250565b60008060408385031215612b0b57600080fd5b6000612b198582860161290c565b9250506020612b2a85828601612921565b9150509250929050565b60008060408385031215612b4757600080fd5b6000612b558582860161290c565b9250506020612b66858286016129b4565b9150509250929050565b600060208284031215612b8257600080fd5b6000612b9084828501612936565b91505092915050565b600060208284031215612bab57600080fd5b6000612bb98482850161294b565b91505092915050565b600060208284031215612bd457600080fd5b600082013567ffffffffffffffff811115612bee57600080fd5b612bfa8482850161298a565b91505092915050565b600060208284031215612c1557600080fd5b6000612c23848285016129b4565b91505092915050565b6000612c3883836134dd565b60208301905092915050565b612c4d81613ac2565b82525050565b6000612c5e82613941565b612c68818561396f565b9350612c7383613931565b8060005b83811015612ca4578151612c8b8882612c2c565b9750612c9683613962565b925050600181019050612c77565b5085935050505092915050565b612cba81613ad4565b82525050565b6000612ccb8261394c565b612cd58185613980565b9350612ce5818560208601613b45565b612cee81613ce0565b840191505092915050565b6000612d0482613957565b612d0e8185613991565b9350612d1e818560208601613b45565b612d2781613ce0565b840191505092915050565b6000612d3d82613957565b612d4781856139a2565b9350612d57818560208601613b45565b80840191505092915050565b6000612d70602b83613991565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd6603283613991565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e3c602683613991565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ea2601c83613991565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ee2602483613991565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f48601983613991565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f88602c83613991565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612fee602a83613991565b91507f596f752063616e2061646f70742061206d6178696d756d206f66205f6d61784d60008301527f696e7420746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613054603883613991565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006130ba602a83613991565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613120602983613991565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613186602083613991565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006131c6602c83613991565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061322c602083613991565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061326c602983613991565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d2602f83613991565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613338602183613991565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061339e601683613991565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b60006133de601983613991565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b600061341e603183613991565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613484602c83613991565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6134e681613b2c565b82525050565b6134f581613b2c565b82525050565b60006135078285612d32565b91506135138284612d32565b91508190509392505050565b60006020820190506135346000830184612c44565b92915050565b600060808201905061354f6000830187612c44565b61355c6020830186612c44565b61356960408301856134ec565b818103606083015261357b8184612cc0565b905095945050505050565b600060208201905081810360008301526135a08184612c53565b905092915050565b60006020820190506135bd6000830184612cb1565b92915050565b600060208201905081810360008301526135dd8184612cf9565b905092915050565b600060208201905081810360008301526135fe81612d63565b9050919050565b6000602082019050818103600083015261361e81612dc9565b9050919050565b6000602082019050818103600083015261363e81612e2f565b9050919050565b6000602082019050818103600083015261365e81612e95565b9050919050565b6000602082019050818103600083015261367e81612ed5565b9050919050565b6000602082019050818103600083015261369e81612f3b565b9050919050565b600060208201905081810360008301526136be81612f7b565b9050919050565b600060208201905081810360008301526136de81612fe1565b9050919050565b600060208201905081810360008301526136fe81613047565b9050919050565b6000602082019050818103600083015261371e816130ad565b9050919050565b6000602082019050818103600083015261373e81613113565b9050919050565b6000602082019050818103600083015261375e81613179565b9050919050565b6000602082019050818103600083015261377e816131b9565b9050919050565b6000602082019050818103600083015261379e8161321f565b9050919050565b600060208201905081810360008301526137be8161325f565b9050919050565b600060208201905081810360008301526137de816132c5565b9050919050565b600060208201905081810360008301526137fe8161332b565b9050919050565b6000602082019050818103600083015261381e81613391565b9050919050565b6000602082019050818103600083015261383e816133d1565b9050919050565b6000602082019050818103600083015261385e81613411565b9050919050565b6000602082019050818103600083015261387e81613477565b9050919050565b600060208201905061389a60008301846134ec565b92915050565b6000604051905081810181811067ffffffffffffffff821117156138c7576138c6613cb1565b5b8060405250919050565b600067ffffffffffffffff8211156138ec576138eb613cb1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561391c5761391b613cb1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139b882613b2c565b91506139c383613b2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139f8576139f7613c24565b5b828201905092915050565b6000613a0e82613b2c565b9150613a1983613b2c565b925082613a2957613a28613c53565b5b828204905092915050565b6000613a3f82613b2c565b9150613a4a83613b2c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8357613a82613c24565b5b828202905092915050565b6000613a9982613b2c565b9150613aa483613b2c565b925082821015613ab757613ab6613c24565b5b828203905092915050565b6000613acd82613b0c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b63578082015181840152602081019050613b48565b83811115613b72576000848401525b50505050565b60006002820490506001821680613b9057607f821691505b60208210811415613ba457613ba3613c82565b5b50919050565b6000613bb582613b2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be857613be7613c24565b5b600182019050919050565b6000613bfe82613b2c565b9150613c0983613b2c565b925082613c1957613c18613c53565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613cfa81613ac2565b8114613d0557600080fd5b50565b613d1181613ad4565b8114613d1c57600080fd5b50565b613d2881613ae0565b8114613d3357600080fd5b50565b613d3f81613b2c565b8114613d4a57600080fd5b5056fea264697066735822122067fcc7a50337fb23660c09a84c1680d02533f6e340a630f303e7c9547f28973d64736f6c63430008000033

Deployed Bytecode Sourcemap

43183:1878:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34700:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21605:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23164:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22687:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43393:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35340:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24054:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35008:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43597:487;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24464:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44092:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35530:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44825:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21299:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21029:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42495:94;;;;;;;;;;;;;:::i;:::-;;43427:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44935:123;;;:::i;:::-;;41844:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44602:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21774:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44442:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23457:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24720:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21949:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23823:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42744:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34700:224;34802:4;34841:35;34826:50;;;:11;:50;;;;:90;;;;34880:36;34904:11;34880:23;:36::i;:::-;34826:90;34819:97;;34700:224;;;:::o;21605:100::-;21659:13;21692:5;21685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21605:100;:::o;23164:221::-;23240:7;23268:16;23276:7;23268;:16::i;:::-;23260:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23353:15;:24;23369:7;23353:24;;;;;;;;;;;;;;;;;;;;;23346:31;;23164:221;;;:::o;22687:411::-;22768:13;22784:23;22799:7;22784:14;:23::i;:::-;22768:39;;22832:5;22826:11;;:2;:11;;;;22818:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22926:5;22910:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22935:37;22952:5;22959:12;:10;:12::i;:::-;22935:16;:37::i;:::-;22910:62;22888:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23069:21;23078:2;23082:7;23069:8;:21::i;:::-;22687:411;;;:::o;43393:27::-;;;;;;;;;;;;;:::o;35340:113::-;35401:7;35428:10;:17;;;;35421:24;;35340:113;:::o;24054:339::-;24249:41;24268:12;:10;:12::i;:::-;24282:7;24249:18;:41::i;:::-;24241:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24357:28;24367:4;24373:2;24377:7;24357:9;:28::i;:::-;24054:339;;;:::o;35008:256::-;35105:7;35141:23;35158:5;35141:16;:23::i;:::-;35133:5;:31;35125:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35230:12;:19;35243:5;35230:19;;;;;;;;;;;;;;;:26;35250:5;35230:26;;;;;;;;;;;;35223:33;;35008:256;;;;:::o;43597:487::-;43663:14;43680:13;:11;:13::i;:::-;43663:30;;43723:7;:5;:7::i;:::-;43709:21;;:10;:21;;;43706:202;;43770:1;43761:8;;:10;;;;:::i;:::-;43754:3;:18;43745:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43863:3;43854:6;;:12;;;;:::i;:::-;43841:9;:25;;43832:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43706:202;43462:4;43938:3;43929:6;:12;;;;:::i;:::-;:26;43920:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44000:9;43996:81;44015:3;44011:1;:7;43996:81;;;44037:28;44048:3;44062:1;44053:6;:10;;;;:::i;:::-;44037:9;:28::i;:::-;44020:3;;;;;:::i;:::-;;;;43996:81;;;;43597:487;;;:::o;24464:185::-;24602:39;24619:4;24625:2;24629:7;24602:39;;;;;;;;;;;;:16;:39::i;:::-;24464:185;;;:::o;44092:342::-;44151:16;44180:18;44201:17;44211:6;44201:9;:17::i;:::-;44180:38;;44231:25;44273:10;44259:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44231:53;;44299:9;44295:106;44314:10;44310:1;:14;44295:106;;;44359:30;44379:6;44387:1;44359:19;:30::i;:::-;44345:8;44354:1;44345:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;44326:3;;;;;:::i;:::-;;;;44295:106;;;;44418:8;44411:15;;;;44092:342;;;:::o;35530:233::-;35605:7;35641:30;:28;:30::i;:::-;35633:5;:38;35625:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35738:10;35749:5;35738:17;;;;;;;;;;;;;;;;;;;;;;;;35731:24;;35530:233;;;:::o;44825:102::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:7:::1;44896:13;:23;;;;;;;;;;;;:::i;:::-;;44825:102:::0;:::o;21299:239::-;21371:7;21391:13;21407:7;:16;21415:7;21407:16;;;;;;;;;;;;;;;;;;;;;21391:32;;21459:1;21442:19;;:5;:19;;;;21434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21525:5;21518:12;;;21299:239;;;:::o;21029:208::-;21101:7;21146:1;21129:19;;:5;:19;;;;21121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21213:9;:16;21223:5;21213:16;;;;;;;;;;;;;;;;21206:23;;21029:208;;;:::o;42495:94::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42560:21:::1;42578:1;42560:9;:21::i;:::-;42495:94::o:0;43427:39::-;43462:4;43427:39;:::o;44935:123::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45010:10:::1;45002:24;;:47;45027:21;45002:47;;;;;;;;;;;;;;;;;;;;;;;44994:56;;;::::0;::::1;;44935:123::o:0;41844:87::-;41890:7;41917:6;;;;;;;;;;;41910:13;;41844:87;:::o;44602:93::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44678:9:::1;44669:6;:18;;;;44602:93:::0;:::o;21774:104::-;21830:13;21863:7;21856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:104;:::o;44442:152::-;44483:7;44519;:5;:7::i;:::-;44505:21;;:10;:21;;;44502:61;;;44550:1;44543:8;;;;44502:61;44580:6;;44573:13;;44442:152;;:::o;23457:295::-;23572:12;:10;:12::i;:::-;23560:24;;:8;:24;;;;23552:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:8;23627:18;:32;23646:12;:10;:12::i;:::-;23627:32;;;;;;;;;;;;;;;:42;23660:8;23627:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23725:8;23696:48;;23711:12;:10;:12::i;:::-;23696:48;;;23735:8;23696:48;;;;;;:::i;:::-;;;;;;;;23457:295;;:::o;24720:328::-;24895:41;24914:12;:10;:12::i;:::-;24928:7;24895:18;:41::i;:::-;24887:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25001:39;25015:4;25021:2;25025:7;25034:5;25001:13;:39::i;:::-;24720:328;;;;:::o;21949:334::-;22022:13;22056:16;22064:7;22056;:16::i;:::-;22048:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22137:21;22161:10;:8;:10::i;:::-;22137:34;;22213:1;22195:7;22189:21;:25;:86;;;;;;;;;;;;;;;;;22241:7;22250:18;:7;:16;:18::i;:::-;22224:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22189:86;22182:93;;;21949:334;;;:::o;23823:164::-;23920:4;23944:18;:25;23963:5;23944:25;;;;;;;;;;;;;;;:35;23970:8;23944:35;;;;;;;;;;;;;;;;;;;;;;;;;23937:42;;23823:164;;;;:::o;42744:192::-;42075:12;:10;:12::i;:::-;42064:23;;:7;:5;:7::i;:::-;:23;;;42056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42853:1:::1;42833:22;;:8;:22;;;;42825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42909:19;42919:8;42909:9;:19::i;:::-;42744:192:::0;:::o;20660:305::-;20762:4;20814:25;20799:40;;;:11;:40;;;;:105;;;;20871:33;20856:48;;;:11;:48;;;;20799:105;:158;;;;20921:36;20945:11;20921:23;:36::i;:::-;20799:158;20779:178;;20660:305;;;:::o;26558:127::-;26623:4;26675:1;26647:30;;:7;:16;26655:7;26647:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26640:37;;26558:127;;;:::o;16088:98::-;16141:7;16168:10;16161:17;;16088:98;:::o;30540:174::-;30642:2;30615:15;:24;30631:7;30615:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30698:7;30694:2;30660:46;;30669:23;30684:7;30669:14;:23::i;:::-;30660:46;;;;;;;;;;;;30540:174;;:::o;26852:348::-;26945:4;26970:16;26978:7;26970;:16::i;:::-;26962:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27046:13;27062:23;27077:7;27062:14;:23::i;:::-;27046:39;;27115:5;27104:16;;:7;:16;;;:51;;;;27148:7;27124:31;;:20;27136:7;27124:11;:20::i;:::-;:31;;;27104:51;:87;;;;27159:32;27176:5;27183:7;27159:16;:32::i;:::-;27104:87;27096:96;;;26852:348;;;;:::o;29844:578::-;30003:4;29976:31;;:23;29991:7;29976:14;:23::i;:::-;:31;;;29968:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30086:1;30072:16;;:2;:16;;;;30064:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30142:39;30163:4;30169:2;30173:7;30142:20;:39::i;:::-;30246:29;30263:1;30267:7;30246:8;:29::i;:::-;30307:1;30288:9;:15;30298:4;30288:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30336:1;30319:9;:13;30329:2;30319:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30367:2;30348:7;:16;30356:7;30348:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30406:7;30402:2;30387:27;;30396:4;30387:27;;;;;;;;;;;;29844:578;;;:::o;27542:110::-;27618:26;27628:2;27632:7;27618:26;;;;;;;;;;;;:9;:26::i;:::-;27542:110;;:::o;42944:173::-;43000:16;43019:6;;;;;;;;;;;43000:25;;43045:8;43036:6;;:17;;;;;;;;;;;;;;;;;;43100:8;43069:40;;43090:8;43069:40;;;;;;;;;;;;42944:173;;:::o;25930:315::-;26087:28;26097:4;26103:2;26107:7;26087:9;:28::i;:::-;26134:48;26157:4;26163:2;26167:7;26176:5;26134:22;:48::i;:::-;26126:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25930:315;;;;:::o;44703:114::-;44763:13;44796;44789:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44703:114;:::o;16611:723::-;16667:13;16897:1;16888:5;:10;16884:53;;;16915:10;;;;;;;;;;;;;;;;;;;;;16884:53;16947:12;16962:5;16947:20;;16978:14;17003:78;17018:1;17010:4;:9;17003:78;;17036:8;;;;;:::i;:::-;;;;17067:2;17059:10;;;;;:::i;:::-;;;17003:78;;;17091:19;17123:6;17113:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17091:39;;17141:154;17157:1;17148:5;:10;17141:154;;17185:1;17175:11;;;;;:::i;:::-;;;17252:2;17244:5;:10;;;;:::i;:::-;17231:2;:24;;;;:::i;:::-;17218:39;;17201:6;17208;17201:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17281:2;17272:11;;;;;:::i;:::-;;;17141:154;;;17319:6;17305:21;;;;;16611:723;;;;:::o;19166:157::-;19251:4;19290:25;19275:40;;;:11;:40;;;;19268:47;;19166:157;;;:::o;36376:589::-;36520:45;36547:4;36553:2;36557:7;36520:26;:45::i;:::-;36598:1;36582:18;;:4;:18;;;36578:187;;;36617:40;36649:7;36617:31;:40::i;:::-;36578:187;;;36687:2;36679:10;;:4;:10;;;36675:90;;36706:47;36739:4;36745:7;36706:32;:47::i;:::-;36675:90;36578:187;36793:1;36779:16;;:2;:16;;;36775:183;;;36812:45;36849:7;36812:36;:45::i;:::-;36775:183;;;36885:4;36879:10;;:2;:10;;;36875:83;;36906:40;36934:2;36938:7;36906:27;:40::i;:::-;36875:83;36775:183;36376:589;;;:::o;27879:321::-;28009:18;28015:2;28019:7;28009:5;:18::i;:::-;28060:54;28091:1;28095:2;28099:7;28108:5;28060:22;:54::i;:::-;28038:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27879:321;;;:::o;31279:799::-;31434:4;31455:15;:2;:13;;;:15::i;:::-;31451:620;;;31507:2;31491:36;;;31528:12;:10;:12::i;:::-;31542:4;31548:7;31557:5;31491:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31487:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:1;31733:6;:13;:18;31729:272;;;31776:60;;;;;;;;;;:::i;:::-;;;;;;;;31729:272;31951:6;31945:13;31936:6;31932:2;31928:15;31921:38;31487:529;31624:41;;;31614:51;;;:6;:51;;;;31607:58;;;;;31451:620;32055:4;32048:11;;31279:799;;;;;;;:::o;32650:126::-;;;;:::o;37688:164::-;37792:10;:17;;;;37765:15;:24;37781:7;37765:24;;;;;;;;;;;:44;;;;37820:10;37836:7;37820:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37688:164;:::o;38479:988::-;38745:22;38795:1;38770:22;38787:4;38770:16;:22::i;:::-;:26;;;;:::i;:::-;38745:51;;38807:18;38828:17;:26;38846:7;38828:26;;;;;;;;;;;;38807:47;;38975:14;38961:10;:28;38957:328;;39006:19;39028:12;:18;39041:4;39028:18;;;;;;;;;;;;;;;:34;39047:14;39028:34;;;;;;;;;;;;39006:56;;39112:11;39079:12;:18;39092:4;39079:18;;;;;;;;;;;;;;;:30;39098:10;39079:30;;;;;;;;;;;:44;;;;39229:10;39196:17;:30;39214:11;39196:30;;;;;;;;;;;:43;;;;38957:328;;39381:17;:26;39399:7;39381:26;;;;;;;;;;;39374:33;;;39425:12;:18;39438:4;39425:18;;;;;;;;;;;;;;;:34;39444:14;39425:34;;;;;;;;;;;39418:41;;;38479:988;;;;:::o;39762:1079::-;40015:22;40060:1;40040:10;:17;;;;:21;;;;:::i;:::-;40015:46;;40072:18;40093:15;:24;40109:7;40093:24;;;;;;;;;;;;40072:45;;40444:19;40466:10;40477:14;40466:26;;;;;;;;;;;;;;;;;;;;;;;;40444:48;;40530:11;40505:10;40516;40505:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40641:10;40610:15;:28;40626:11;40610:28;;;;;;;;;;;:41;;;;40782:15;:24;40798:7;40782:24;;;;;;;;;;;40775:31;;;40817:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39762:1079;;;;:::o;37266:221::-;37351:14;37368:20;37385:2;37368:16;:20::i;:::-;37351:37;;37426:7;37399:12;:16;37412:2;37399:16;;;;;;;;;;;;;;;:24;37416:6;37399:24;;;;;;;;;;;:34;;;;37473:6;37444:17;:26;37462:7;37444:26;;;;;;;;;;;:35;;;;37266:221;;;:::o;28536:382::-;28630:1;28616:16;;:2;:16;;;;28608:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28689:16;28697:7;28689;:16::i;:::-;28688:17;28680:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:45;28780:1;28784:2;28788:7;28751:20;:45::i;:::-;28826:1;28809:9;:13;28819:2;28809:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28857:2;28838:7;:16;28846:7;28838:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28902:7;28898:2;28877:33;;28894:1;28877:33;;;;;;;;;;;;28536:382;;:::o;8134:387::-;8194:4;8402:12;8469:7;8457:20;8449:28;;8512:1;8505:4;:8;8498:15;;;8134:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:179::-;;6174:46;6216:3;6208:6;6174:46;:::i;:::-;6252:4;6247:3;6243:14;6229:28;;6164:99;;;;:::o;6269:118::-;6356:24;6374:5;6356:24;:::i;:::-;6351:3;6344:37;6334:53;;:::o;6423:732::-;;6571:54;6619:5;6571:54;:::i;:::-;6641:86;6720:6;6715:3;6641:86;:::i;:::-;6634:93;;6751:56;6801:5;6751:56;:::i;:::-;6830:7;6861:1;6846:284;6871:6;6868:1;6865:13;6846:284;;;6947:6;6941:13;6974:63;7033:3;7018:13;6974:63;:::i;:::-;6967:70;;7060:60;7113:6;7060:60;:::i;:::-;7050:70;;6906:224;6893:1;6890;6886:9;6881:14;;6846:284;;;6850:14;7146:3;7139:10;;6547:608;;;;;;;:::o;7161:109::-;7242:21;7257:5;7242:21;:::i;:::-;7237:3;7230:34;7220:50;;:::o;7276:360::-;;7390:38;7422:5;7390:38;:::i;:::-;7444:70;7507:6;7502:3;7444:70;:::i;:::-;7437:77;;7523:52;7568:6;7563:3;7556:4;7549:5;7545:16;7523:52;:::i;:::-;7600:29;7622:6;7600:29;:::i;:::-;7595:3;7591:39;7584:46;;7366:270;;;;;:::o;7642:364::-;;7758:39;7791:5;7758:39;:::i;:::-;7813:71;7877:6;7872:3;7813:71;:::i;:::-;7806:78;;7893:52;7938:6;7933:3;7926:4;7919:5;7915:16;7893:52;:::i;:::-;7970:29;7992:6;7970:29;:::i;:::-;7965:3;7961:39;7954:46;;7734:272;;;;;:::o;8012:377::-;;8146:39;8179:5;8146:39;:::i;:::-;8201:89;8283:6;8278:3;8201:89;:::i;:::-;8194:96;;8299:52;8344:6;8339:3;8332:4;8325:5;8321:16;8299:52;:::i;:::-;8376:6;8371:3;8367:16;8360:23;;8122:267;;;;;:::o;8395:375::-;;8558:67;8622:2;8617:3;8558:67;:::i;:::-;8551:74;;8655:34;8651:1;8646:3;8642:11;8635:55;8721:13;8716:2;8711:3;8707:12;8700:35;8761:2;8756:3;8752:12;8745:19;;8541:229;;;:::o;8776:382::-;;8939:67;9003:2;8998:3;8939:67;:::i;:::-;8932:74;;9036:34;9032:1;9027:3;9023:11;9016:55;9102:20;9097:2;9092:3;9088:12;9081:42;9149:2;9144:3;9140:12;9133:19;;8922:236;;;:::o;9164:370::-;;9327:67;9391:2;9386:3;9327:67;:::i;:::-;9320:74;;9424:34;9420:1;9415:3;9411:11;9404:55;9490:8;9485:2;9480:3;9476:12;9469:30;9525:2;9520:3;9516:12;9509:19;;9310:224;;;:::o;9540:326::-;;9703:67;9767:2;9762:3;9703:67;:::i;:::-;9696:74;;9800:30;9796:1;9791:3;9787:11;9780:51;9857:2;9852:3;9848:12;9841:19;;9686:180;;;:::o;9872:368::-;;10035:67;10099:2;10094:3;10035:67;:::i;:::-;10028:74;;10132:34;10128:1;10123:3;10119:11;10112:55;10198:6;10193:2;10188:3;10184:12;10177:28;10231:2;10226:3;10222:12;10215:19;;10018:222;;;:::o;10246:323::-;;10409:67;10473:2;10468:3;10409:67;:::i;:::-;10402:74;;10506:27;10502:1;10497:3;10493:11;10486:48;10560:2;10555:3;10551:12;10544:19;;10392:177;;;:::o;10575:376::-;;10738:67;10802:2;10797:3;10738:67;:::i;:::-;10731:74;;10835:34;10831:1;10826:3;10822:11;10815:55;10901:14;10896:2;10891:3;10887:12;10880:36;10942:2;10937:3;10933:12;10926:19;;10721:230;;;:::o;10957:374::-;;11120:67;11184:2;11179:3;11120:67;:::i;:::-;11113:74;;11217:34;11213:1;11208:3;11204:11;11197:55;11283:12;11278:2;11273:3;11269:12;11262:34;11322:2;11317:3;11313:12;11306:19;;11103:228;;;:::o;11337:388::-;;11500:67;11564:2;11559:3;11500:67;:::i;:::-;11493:74;;11597:34;11593:1;11588:3;11584:11;11577:55;11663:26;11658:2;11653:3;11649:12;11642:48;11716:2;11711:3;11707:12;11700:19;;11483:242;;;:::o;11731:374::-;;11894:67;11958:2;11953:3;11894:67;:::i;:::-;11887:74;;11991:34;11987:1;11982:3;11978:11;11971:55;12057:12;12052:2;12047:3;12043:12;12036:34;12096:2;12091:3;12087:12;12080:19;;11877:228;;;:::o;12111:373::-;;12274:67;12338:2;12333:3;12274:67;:::i;:::-;12267:74;;12371:34;12367:1;12362:3;12358:11;12351:55;12437:11;12432:2;12427:3;12423:12;12416:33;12475:2;12470:3;12466:12;12459:19;;12257:227;;;:::o;12490:330::-;;12653:67;12717:2;12712:3;12653:67;:::i;:::-;12646:74;;12750:34;12746:1;12741:3;12737:11;12730:55;12811:2;12806:3;12802:12;12795:19;;12636:184;;;:::o;12826:376::-;;12989:67;13053:2;13048:3;12989:67;:::i;:::-;12982:74;;13086:34;13082:1;13077:3;13073:11;13066:55;13152:14;13147:2;13142:3;13138:12;13131:36;13193:2;13188:3;13184:12;13177:19;;12972:230;;;:::o;13208:330::-;;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13468:34;13464:1;13459:3;13455:11;13448:55;13529:2;13524:3;13520:12;13513:19;;13354:184;;;:::o;13544:373::-;;13707:67;13771:2;13766:3;13707:67;:::i;:::-;13700:74;;13804:34;13800:1;13795:3;13791:11;13784:55;13870:11;13865:2;13860:3;13856:12;13849:33;13908:2;13903:3;13899:12;13892:19;;13690:227;;;:::o;13923:379::-;;14086:67;14150:2;14145:3;14086:67;:::i;:::-;14079:74;;14183:34;14179:1;14174:3;14170:11;14163:55;14249:17;14244:2;14239:3;14235:12;14228:39;14293:2;14288:3;14284:12;14277:19;;14069:233;;;:::o;14308:365::-;;14471:67;14535:2;14530:3;14471:67;:::i;:::-;14464:74;;14568:34;14564:1;14559:3;14555:11;14548:55;14634:3;14629:2;14624:3;14620:12;14613:25;14664:2;14659:3;14655:12;14648:19;;14454:219;;;:::o;14679:320::-;;14842:67;14906:2;14901:3;14842:67;:::i;:::-;14835:74;;14939:24;14935:1;14930:3;14926:11;14919:45;14990:2;14985:3;14981:12;14974:19;;14825:174;;;:::o;15005:323::-;;15168:67;15232:2;15227:3;15168:67;:::i;:::-;15161:74;;15265:27;15261:1;15256:3;15252:11;15245:48;15319:2;15314:3;15310:12;15303:19;;15151:177;;;:::o;15334:381::-;;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15594:34;15590:1;15585:3;15581:11;15574:55;15660:19;15655:2;15650:3;15646:12;15639:41;15706:2;15701:3;15697:12;15690:19;;15480:235;;;:::o;15721:376::-;;15884:67;15948:2;15943:3;15884:67;:::i;:::-;15877:74;;15981:34;15977:1;15972:3;15968:11;15961:55;16047:14;16042:2;16037:3;16033:12;16026:36;16088:2;16083:3;16079:12;16072:19;;15867:230;;;:::o;16103:108::-;16180:24;16198:5;16180:24;:::i;:::-;16175:3;16168:37;16158:53;;:::o;16217:118::-;16304:24;16322:5;16304:24;:::i;:::-;16299:3;16292:37;16282:53;;:::o;16341:435::-;;16543:95;16634:3;16625:6;16543:95;:::i;:::-;16536:102;;16655:95;16746:3;16737:6;16655:95;:::i;:::-;16648:102;;16767:3;16760:10;;16525:251;;;;;:::o;16782:222::-;;16913:2;16902:9;16898:18;16890:26;;16926:71;16994:1;16983:9;16979:17;16970:6;16926:71;:::i;:::-;16880:124;;;;:::o;17010:640::-;;17243:3;17232:9;17228:19;17220:27;;17257:71;17325:1;17314:9;17310:17;17301:6;17257:71;:::i;:::-;17338:72;17406:2;17395:9;17391:18;17382:6;17338:72;:::i;:::-;17420;17488:2;17477:9;17473:18;17464:6;17420:72;:::i;:::-;17539:9;17533:4;17529:20;17524:2;17513:9;17509:18;17502:48;17567:76;17638:4;17629:6;17567:76;:::i;:::-;17559:84;;17210:440;;;;;;;:::o;17656:373::-;;17837:2;17826:9;17822:18;17814:26;;17886:9;17880:4;17876:20;17872:1;17861:9;17857:17;17850:47;17914:108;18017:4;18008:6;17914:108;:::i;:::-;17906:116;;17804:225;;;;:::o;18035:210::-;;18160:2;18149:9;18145:18;18137:26;;18173:65;18235:1;18224:9;18220:17;18211:6;18173:65;:::i;:::-;18127:118;;;;:::o;18251:313::-;;18402:2;18391:9;18387:18;18379:26;;18451:9;18445:4;18441:20;18437:1;18426:9;18422:17;18415:47;18479:78;18552:4;18543:6;18479:78;:::i;:::-;18471:86;;18369:195;;;;:::o;18570:419::-;;18774:2;18763:9;18759:18;18751:26;;18823:9;18817:4;18813:20;18809:1;18798:9;18794:17;18787:47;18851:131;18977:4;18851:131;:::i;:::-;18843:139;;18741:248;;;:::o;18995:419::-;;19199:2;19188:9;19184:18;19176:26;;19248:9;19242:4;19238:20;19234:1;19223:9;19219:17;19212:47;19276:131;19402:4;19276:131;:::i;:::-;19268:139;;19166:248;;;:::o;19420:419::-;;19624:2;19613:9;19609:18;19601:26;;19673:9;19667:4;19663:20;19659:1;19648:9;19644:17;19637:47;19701:131;19827:4;19701:131;:::i;:::-;19693:139;;19591:248;;;:::o;19845:419::-;;20049:2;20038:9;20034:18;20026:26;;20098:9;20092:4;20088:20;20084:1;20073:9;20069:17;20062:47;20126:131;20252:4;20126:131;:::i;:::-;20118:139;;20016:248;;;:::o;20270:419::-;;20474:2;20463:9;20459:18;20451:26;;20523:9;20517:4;20513:20;20509:1;20498:9;20494:17;20487:47;20551:131;20677:4;20551:131;:::i;:::-;20543:139;;20441:248;;;:::o;20695:419::-;;20899:2;20888:9;20884:18;20876:26;;20948:9;20942:4;20938:20;20934:1;20923:9;20919:17;20912:47;20976:131;21102:4;20976:131;:::i;:::-;20968:139;;20866:248;;;:::o;21120:419::-;;21324:2;21313:9;21309:18;21301:26;;21373:9;21367:4;21363:20;21359:1;21348:9;21344:17;21337:47;21401:131;21527:4;21401:131;:::i;:::-;21393:139;;21291:248;;;:::o;21545:419::-;;21749:2;21738:9;21734:18;21726:26;;21798:9;21792:4;21788:20;21784:1;21773:9;21769:17;21762:47;21826:131;21952:4;21826:131;:::i;:::-;21818:139;;21716:248;;;:::o;21970:419::-;;22174:2;22163:9;22159:18;22151:26;;22223:9;22217:4;22213:20;22209:1;22198:9;22194:17;22187:47;22251:131;22377:4;22251:131;:::i;:::-;22243:139;;22141:248;;;:::o;22395:419::-;;22599:2;22588:9;22584:18;22576:26;;22648:9;22642:4;22638:20;22634:1;22623:9;22619:17;22612:47;22676:131;22802:4;22676:131;:::i;:::-;22668:139;;22566:248;;;:::o;22820:419::-;;23024:2;23013:9;23009:18;23001:26;;23073:9;23067:4;23063:20;23059:1;23048:9;23044:17;23037:47;23101:131;23227:4;23101:131;:::i;:::-;23093:139;;22991:248;;;:::o;23245:419::-;;23449:2;23438:9;23434:18;23426:26;;23498:9;23492:4;23488:20;23484:1;23473:9;23469:17;23462:47;23526:131;23652:4;23526:131;:::i;:::-;23518:139;;23416:248;;;:::o;23670:419::-;;23874:2;23863:9;23859:18;23851:26;;23923:9;23917:4;23913:20;23909:1;23898:9;23894:17;23887:47;23951:131;24077:4;23951:131;:::i;:::-;23943:139;;23841:248;;;:::o;24095:419::-;;24299:2;24288:9;24284:18;24276:26;;24348:9;24342:4;24338:20;24334:1;24323:9;24319:17;24312:47;24376:131;24502:4;24376:131;:::i;:::-;24368:139;;24266:248;;;:::o;24520:419::-;;24724:2;24713:9;24709:18;24701:26;;24773:9;24767:4;24763:20;24759:1;24748:9;24744:17;24737:47;24801:131;24927:4;24801:131;:::i;:::-;24793:139;;24691:248;;;:::o;24945:419::-;;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;25116:248;;;:::o;25370:419::-;;25574:2;25563:9;25559:18;25551:26;;25623:9;25617:4;25613:20;25609:1;25598:9;25594:17;25587:47;25651:131;25777:4;25651:131;:::i;:::-;25643:139;;25541:248;;;:::o;25795:419::-;;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:131;26202:4;26076:131;:::i;:::-;26068:139;;25966:248;;;:::o;26220:419::-;;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26391:248;;;:::o;26645:419::-;;26849:2;26838:9;26834:18;26826:26;;26898:9;26892:4;26888:20;26884:1;26873:9;26869:17;26862:47;26926:131;27052:4;26926:131;:::i;:::-;26918:139;;26816:248;;;:::o;27070:419::-;;27274:2;27263:9;27259:18;27251:26;;27323:9;27317:4;27313:20;27309:1;27298:9;27294:17;27287:47;27351:131;27477:4;27351:131;:::i;:::-;27343:139;;27241:248;;;:::o;27495:222::-;;27626:2;27615:9;27611:18;27603:26;;27639:71;27707:1;27696:9;27692:17;27683:6;27639:71;:::i;:::-;27593:124;;;;:::o;27723:283::-;;27789:2;27783:9;27773:19;;27831:4;27823:6;27819:17;27938:6;27926:10;27923:22;27902:18;27890:10;27887:34;27884:62;27881:2;;;27949:18;;:::i;:::-;27881:2;27989:10;27985:2;27978:22;27763:243;;;;:::o;28012:331::-;;28163:18;28155:6;28152:30;28149:2;;;28185:18;;:::i;:::-;28149:2;28270:4;28266:9;28259:4;28251:6;28247:17;28243:33;28235:41;;28331:4;28325;28321:15;28313:23;;28078:265;;;:::o;28349:332::-;;28501:18;28493:6;28490:30;28487:2;;;28523:18;;:::i;:::-;28487:2;28608:4;28604:9;28597:4;28589:6;28585:17;28581:33;28573:41;;28669:4;28663;28659:15;28651:23;;28416:265;;;:::o;28687:132::-;;28777:3;28769:11;;28807:4;28802:3;28798:14;28790:22;;28759:60;;;:::o;28825:114::-;;28926:5;28920:12;28910:22;;28899:40;;;:::o;28945:98::-;;29030:5;29024:12;29014:22;;29003:40;;;:::o;29049:99::-;;29135:5;29129:12;29119:22;;29108:40;;;:::o;29154:113::-;;29256:4;29251:3;29247:14;29239:22;;29229:38;;;:::o;29273:184::-;;29406:6;29401:3;29394:19;29446:4;29441:3;29437:14;29422:29;;29384:73;;;;:::o;29463:168::-;;29580:6;29575:3;29568:19;29620:4;29615:3;29611:14;29596:29;;29558:73;;;;:::o;29637:169::-;;29755:6;29750:3;29743:19;29795:4;29790:3;29786:14;29771:29;;29733:73;;;;:::o;29812:148::-;;29951:3;29936:18;;29926:34;;;;:::o;29966:305::-;;30025:20;30043:1;30025:20;:::i;:::-;30020:25;;30059:20;30077:1;30059:20;:::i;:::-;30054:25;;30213:1;30145:66;30141:74;30138:1;30135:81;30132:2;;;30219:18;;:::i;:::-;30132:2;30263:1;30260;30256:9;30249:16;;30010:261;;;;:::o;30277:185::-;;30334:20;30352:1;30334:20;:::i;:::-;30329:25;;30368:20;30386:1;30368:20;:::i;:::-;30363:25;;30407:1;30397:2;;30412:18;;:::i;:::-;30397:2;30454:1;30451;30447:9;30442:14;;30319:143;;;;:::o;30468:348::-;;30531:20;30549:1;30531:20;:::i;:::-;30526:25;;30565:20;30583:1;30565:20;:::i;:::-;30560:25;;30753:1;30685:66;30681:74;30678:1;30675:81;30670:1;30663:9;30656:17;30652:105;30649:2;;;30760:18;;:::i;:::-;30649:2;30808:1;30805;30801:9;30790:20;;30516:300;;;;:::o;30822:191::-;;30882:20;30900:1;30882:20;:::i;:::-;30877:25;;30916:20;30934:1;30916:20;:::i;:::-;30911:25;;30955:1;30952;30949:8;30946:2;;;30960:18;;:::i;:::-;30946:2;31005:1;31002;30998:9;30990:17;;30867:146;;;;:::o;31019:96::-;;31085:24;31103:5;31085:24;:::i;:::-;31074:35;;31064:51;;;:::o;31121:90::-;;31198:5;31191:13;31184:21;31173:32;;31163:48;;;:::o;31217:149::-;;31293:66;31286:5;31282:78;31271:89;;31261:105;;;:::o;31372:126::-;;31449:42;31442:5;31438:54;31427:65;;31417:81;;;:::o;31504:77::-;;31570:5;31559:16;;31549:32;;;:::o;31587:154::-;31671:6;31666:3;31661;31648:30;31733:1;31724:6;31719:3;31715:16;31708:27;31638:103;;;:::o;31747:307::-;31815:1;31825:113;31839:6;31836:1;31833:13;31825:113;;;31924:1;31919:3;31915:11;31909:18;31905:1;31900:3;31896:11;31889:39;31861:2;31858:1;31854:10;31849:15;;31825:113;;;31956:6;31953:1;31950:13;31947:2;;;32036:1;32027:6;32022:3;32018:16;32011:27;31947:2;31796:258;;;;:::o;32060:320::-;;32141:1;32135:4;32131:12;32121:22;;32188:1;32182:4;32178:12;32209:18;32199:2;;32265:4;32257:6;32253:17;32243:27;;32199:2;32327;32319:6;32316:14;32296:18;32293:38;32290:2;;;32346:18;;:::i;:::-;32290:2;32111:269;;;;:::o;32386:233::-;;32448:24;32466:5;32448:24;:::i;:::-;32439:33;;32494:66;32487:5;32484:77;32481:2;;;32564:18;;:::i;:::-;32481:2;32611:1;32604:5;32600:13;32593:20;;32429:190;;;:::o;32625:176::-;;32674:20;32692:1;32674:20;:::i;:::-;32669:25;;32708:20;32726:1;32708:20;:::i;:::-;32703:25;;32747:1;32737:2;;32752:18;;:::i;:::-;32737:2;32793:1;32790;32786:9;32781:14;;32659:142;;;;:::o;32807:180::-;32855:77;32852:1;32845:88;32952:4;32949:1;32942:15;32976:4;32973:1;32966:15;32993:180;33041:77;33038:1;33031:88;33138:4;33135:1;33128:15;33162:4;33159:1;33152:15;33179:180;33227:77;33224:1;33217:88;33324:4;33321:1;33314:15;33348:4;33345:1;33338:15;33365:180;33413:77;33410:1;33403:88;33510:4;33507:1;33500:15;33534:4;33531:1;33524:15;33551:102;;33643:2;33639:7;33634:2;33627:5;33623:14;33619:28;33609:38;;33599:54;;;:::o;33659:122::-;33732:24;33750:5;33732:24;:::i;:::-;33725:5;33722:35;33712:2;;33771:1;33768;33761:12;33712:2;33702:79;:::o;33787:116::-;33857:21;33872:5;33857:21;:::i;:::-;33850:5;33847:32;33837:2;;33893:1;33890;33883:12;33837:2;33827:76;:::o;33909:120::-;33981:23;33998:5;33981:23;:::i;:::-;33974:5;33971:34;33961:2;;34019:1;34016;34009:12;33961:2;33951:78;:::o;34035:122::-;34108:24;34126:5;34108:24;:::i;:::-;34101:5;34098:35;34088:2;;34147:1;34144;34137:12;34088:2;34078:79;:::o

Swarm Source

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