ETH Price: $2,975.44 (+2.58%)
Gas: 1 Gwei

Token

NFTHelmets (NFTH)
 

Overview

Max Total Supply

630 NFTH

Holders

338

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 NFTH
0xe5f62cab3d29ae5ad6745824d28fa61d4873ff64
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:
NFTHelmets

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-25
*/

// 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);
}

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

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

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

/**
 * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

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

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

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

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

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



contract NFTHelmets is ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    Counters.Counter private _tokenIds;

    address private constant _devAddress = 0x2Ea23ad853A68c0bD10cA15d5e896273585Ac3E0;
    address private constant _oldContract = 0x197b0C12B2DEbAE8905B3d3cD8F4dBEb988dB835; 
    address private constant _addr2 = 0x3ad25CA6A04b2970ae62F68e84394138c33471e7; 

    uint256 private  _maxTokens = 1138;
    uint256 private  _maxMint = 2;
    uint256 private  _maxPresaleMint = 2;
                        
    uint256 public  _price = 200000000000000000; // 0.2 ETH

    mapping (address => bool) private _whitelist;
    mapping (address => uint256) private _presaleMints;
    mapping (address => uint256) private _saleMints;

    bool private _presaleActive = false;
    bool private _saleActive = false;
    bool private _209minted = false; 
    bool private _oldHoldersTransferred = false; 
    string public _prefixURI;
    string public _baseExtension; 

    constructor() public ERC721("NFTHelmets", "NFTH") {
        _pause();
    }
    
    
    function _mint209() public onlyOwner {
        require(_209minted == false);
        _209minted = true; 
        _safeMint(_addr2, 209);
    }   

    function airdrop(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _tokenIds.increment();
            uint256 id = _tokenIds.current();
            _safeMint(addrs[i], id);
        }
    }

    /* Resend tokens that people already minted */
    function transferOldHolders() public onlyOwner {
        require(_oldHoldersTransferred == false); 
        _oldHoldersTransferred = true; 
        // load old contract 
        IERC721 instance = IERC721(_oldContract); 
        // sends token IDs 1->221 (without 209) to the holders (from last contract)
        for(uint256 i = 1;i<=221;i++) {
            _tokenIds.increment();
            if(i == 209) {
                continue;
            }
            address ownerID = instance.ownerOf(i);
            _safeMint(ownerID, i);
        }
    }

    function increaseTokenID(uint256 newID) public onlyOwner {
        uint256 currentID = _tokenIds.current();
        require(newID > currentID, "New ID must be greater than current ID");
        uint256 diff = newID - currentID; 
        for(uint256 i = 1;i<diff;i++) {
            _tokenIds.increment(); 
        }
    }

    function burnToken(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721 Burnable: caller is not owner nor approved"); 
        _burn(tokenId);
    }

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

    function setBaseURI(string memory _uri) public onlyOwner {
        _prefixURI = _uri;
    }

    function baseExtension() internal view returns (string memory) {
        return _baseExtension; 
    }

    function setBaseExtension(string memory _ext) public onlyOwner {
        _baseExtension = _ext; 
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIds.current();
    }

    function isWhitelisted(address addr) public view returns (bool) {
        return _whitelist[addr];
    }

    function preSaleActive() public view returns (bool) {
        return _presaleActive; 
    }

    function saleActive() public view returns (bool) {
        return _saleActive; 
    }

    function presaleMinted(address addr) public view returns (uint256) {
        return _presaleMints[addr]; 
    }

    function saleMinted(address addr) public view returns (uint256) {
        return _saleMints[addr]; 
    }
    
    function addToWhitelist(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _whitelist[addrs[i]] = true;
            _presaleMints[addrs[i]] = 0;
        }
    }
    
    function removeFromWhitelist(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _whitelist[addrs[i]] = false;
            _presaleMints[addrs[i]] = 0;
        }
    }

    function resetSaleMintsForAddrs(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _saleMints[addrs[i]] = 0;
        }
    }

    function presaleMintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(amount <= _maxPresaleMint);
        require(isWhitelisted(msg.sender));
        require(msg.value >= amount * _price);
        require(_presaleMints[msg.sender] + amount <= _maxPresaleMint);
        require(_presaleActive);
        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);
        for (uint256 i = 0; i < amount; i++) {
            _presaleMints[msg.sender] += 1;
            _mintItem(msg.sender);
        }
    }

    function mintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(_saleActive); 
        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);
        require(_saleMints[msg.sender] + amount <= _maxMint); 
        require(msg.value >= amount * _price);
        for (uint256 i = 0; i < amount; i++) {
            _saleMints[msg.sender] += 1; 
            _mintItem(msg.sender);
        }
    }

    function _mintItem(address to) internal returns (uint256) {
        _tokenIds.increment();
        uint256 id = _tokenIds.current();
        if(id == 209) {
            _tokenIds.increment(); 
            id = _tokenIds.current(); 
        }
        _safeMint(to, id);
        return id;
    }

    // State management 
    function togglePreSale() public onlyOwner {
        _presaleActive = !_presaleActive;
    }

    function toggleSale() public onlyOwner {
        _saleActive = !_saleActive;
    }

    function toggleTransferPause() public onlyOwner {
        paused() ? _unpause() : _pause();
    }


    function updateMaxTokens(uint256 newMax) public onlyOwner {
        _maxTokens = newMax; 
    }

    function updateMaxMint(uint256 newMax) public onlyOwner {
        _maxMint = newMax; 
    }

    function updateMaxPresaleMint(uint256 newMax) public onlyOwner {
        _maxPresaleMint = newMax; 
    }

    function updatePrice(uint256 newPrice) public onlyOwner {
        _price = newPrice; 
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        tokenId.toString();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), _baseExtension)) : "";
    }

    function withdraw() external onlyOwner {
        require(address(this).balance > 0); 
        payable(_devAddress).transfer(address(this).balance * 40 / 100);
        payable(msg.sender).transfer(address(this).balance);
    }
    

    // Allows minting(transfer from 0 address), but not transferring while paused() except from owner
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        if (!(from == address(0)) && !(from == owner())) {
            require(!paused(), "ERC721Pausable: token transfer while paused");
        }
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mint209","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newID","type":"uint256"}],"name":"increaseTokenID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintItems","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presaleMintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"resetSaleMintsForAddrs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"saleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","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":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTransferPause","outputs":[],"stateMutability":"nonpayable","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":[],"name":"transferOldHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"updateMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"updateMaxPresaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"updateMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261047260085560026009556002600a556702c68af0bb140000600b556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff0219169083151502179055506000600f60036101000a81548160ff0219169083151502179055503480156200009957600080fd5b506040518060400160405280600a81526020017f4e465448656c6d657473000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4654480000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011e92919062000328565b5080600190805190602001906200013792919062000328565b5050506000600660006101000a81548160ff02191690831515021790555062000175620001696200018b60201b60201c565b6200019360201b60201c565b620001856200025960201b60201c565b62000522565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002696200031160201b60201c565b15620002ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a3906200042d565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002f86200018b60201b60201c565b60405162000307919062000410565b60405180910390a1565b6000600660009054906101000a900460ff16905090565b828054620003369062000494565b90600052602060002090601f0160209004810192826200035a5760008555620003a6565b82601f106200037557805160ff1916838001178555620003a6565b82800160010185558215620003a6579182015b82811115620003a557825182559160200191906001019062000388565b5b509050620003b59190620003b9565b5090565b5b80821115620003d4576000816000905550600101620003ba565b5090565b620003e38162000460565b82525050565b6000620003f86010836200044f565b91506200040582620004f9565b602082019050919050565b6000602082019050620004276000830184620003d8565b92915050565b600060208201905081810360008301526200044881620003e9565b9050919050565b600082825260208201905092915050565b60006200046d8262000474565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004ad57607f821691505b60208210811415620004c457620004c3620004ca565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b61504e80620005326000396000f3fe60806040526004361061027d5760003560e01c80637f6497831161014f578063c0498838116100c1578063dd40d6661161007a578063dd40d666146108f2578063de6c97f91461091b578063e6c6df5914610944578063e985e9c51461096d578063ebf0ab80146109aa578063f2fde38b146109e75761027d565b8063c04988381461081e578063c87b56dd14610835578063ca3cb52214610872578063cdaa28fd14610889578063da3ef23f146108b2578063db211e9d146108db5761027d565b806391860f781161011357806391860f781461072257806395d89b411461074d5780639752a01714610778578063a22cb4651461078f578063b88d4fde146107b8578063bc660cac146107e15761027d565b80637f64978314610651578063844947081461067a5780638d6cc56d146106a55780638da5cb5b146106ce5780638da8b739146106f95761027d565b806342842e0e116101f357806368428a1b116101ac57806368428a1b1461056957806370a0823114610594578063715018a6146105d1578063729ad39e146105e85780637b47ec1a146106115780637d8966e41461063a5761027d565b806342842e0e1461046a5780635367de6a14610493578063548db174146104af57806355f804b3146104d85780635c975abb146105015780636352211e1461052c5761027d565b806318160ddd1161024557806318160ddd1461036c578063235b6ea11461039757806323b872dd146103c25780632672c902146103eb5780633af32abf146104165780633ccfd60b146104535761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630b4b987814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613ccf565b610a10565b6040516102b69190614265565b60405180910390f35b3480156102cb57600080fd5b506102d4610af2565b6040516102e19190614280565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613d72565b610b84565b60405161031e91906141fe565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c46565b610c09565b005b61036a60048036038101906103659190613d72565b610d21565b005b34801561037857600080fd5b50610381610e89565b60405161038e9190614542565b60405180910390f35b3480156103a357600080fd5b506103ac610e9a565b6040516103b99190614542565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613b30565b610ea0565b005b3480156103f757600080fd5b50610400610f00565b60405161040d9190614280565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190613a96565b610f8e565b60405161044a9190614265565b60405180910390f35b34801561045f57600080fd5b50610468610fe4565b005b34801561047657600080fd5b50610491600480360381019061048c9190613b30565b611129565b005b6104ad60048036038101906104a89190613d72565b611149565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613c86565b611290565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613d29565b611400565b005b34801561050d57600080fd5b50610516611496565b6040516105239190614265565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e9190613d72565b6114ad565b60405161056091906141fe565b60405180910390f35b34801561057557600080fd5b5061057e61155f565b60405161058b9190614265565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190613a96565b611576565b6040516105c89190614542565b60405180910390f35b3480156105dd57600080fd5b506105e661162e565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613c86565b6116b6565b005b34801561061d57600080fd5b5061063860048036038101906106339190613d72565b611792565b005b34801561064657600080fd5b5061064f6117e7565b005b34801561065d57600080fd5b5061067860048036038101906106739190613c86565b61188f565b005b34801561068657600080fd5b5061068f6119ff565b60405161069c9190614265565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190613d72565b611a16565b005b3480156106da57600080fd5b506106e3611a9c565b6040516106f091906141fe565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613d72565b611ac6565b005b34801561072e57600080fd5b50610737611b4c565b6040516107449190614280565b60405180910390f35b34801561075957600080fd5b50610762611bda565b60405161076f9190614280565b60405180910390f35b34801561078457600080fd5b5061078d611c6c565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613c06565b611d0c565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613b83565b611e8d565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613a96565b611eef565b6040516108159190614542565b60405180910390f35b34801561082a57600080fd5b50610833611f38565b005b34801561084157600080fd5b5061085c60048036038101906108579190613d72565b6120df565b6040516108699190614280565b60405180910390f35b34801561087e57600080fd5b50610887612193565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613d72565b61223b565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613d29565b612349565b005b3480156108e757600080fd5b506108f06123df565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613d72565b6124b7565b005b34801561092757600080fd5b50610942600480360381019061093d9190613c86565b61253d565b005b34801561095057600080fd5b5061096b60048036038101906109669190613d72565b61263b565b005b34801561097957600080fd5b50610994600480360381019061098f9190613af0565b6126c1565b6040516109a19190614265565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc9190613a96565b612755565b6040516109de9190614542565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a099190613a96565b61279e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aeb5750610aea82612896565b5b9050919050565b606060008054610b0190614833565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90614833565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b6000610b8f82612900565b610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590614482565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c14826114ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90614502565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca461296c565b73ffffffffffffffffffffffffffffffffffffffff161480610cd35750610cd281610ccd61296c565b6126c1565b5b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614402565b60405180910390fd5b610d1c8383612974565b505050565b600954811115610d3057600080fd5b600a54811115610d3f57600080fd5b610d4833610f8e565b610d5157600080fd5b600b5481610d5f91906146ef565b341015610d6b57600080fd5b600a5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610db99190614668565b1115610dc457600080fd5b600f60009054906101000a900460ff16610ddd57600080fd5b6000610de96007612a2d565b90506008548282610dfa9190614668565b1115610e0557600080fd5b60005b82811015610e84576001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e609190614668565b92505081905550610e7033612a3b565b508080610e7c90614896565b915050610e08565b505050565b6000610e956007612a2d565b905090565b600b5481565b610eb1610eab61296c565b82612a88565b610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614522565b60405180910390fd5b610efb838383612b66565b505050565b60118054610f0d90614833565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3990614833565b8015610f865780601f10610f5b57610100808354040283529160200191610f86565b820191906000526020600020905b815481529060010190602001808311610f6957829003601f168201915b505050505081565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610fec61296c565b73ffffffffffffffffffffffffffffffffffffffff1661100a611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611057906144a2565b60405180910390fd5b6000471161106d57600080fd5b732ea23ad853a68c0bd10ca15d5e896273585ac3e073ffffffffffffffffffffffffffffffffffffffff166108fc60646028476110aa91906146ef565b6110b491906146be565b9081150290604051600060405180830381858888f193505050501580156110df573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611126573d6000803e3d6000fd5b50565b61114483838360405180602001604052806000815250611e8d565b505050565b60095481111561115857600080fd5b600f60019054906101000a900460ff1661117157600080fd5b600061117d6007612a2d565b9050600854828261118e9190614668565b111561119957600080fd5b60095482600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111e79190614668565b11156111f257600080fd5b600b548261120091906146ef565b34101561120c57600080fd5b60005b8281101561128b576001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112679190614668565b9250508190555061127733612a3b565b50808061128390614896565b91505061120f565b505050565b61129861296c565b73ffffffffffffffffffffffffffffffffffffffff166112b6611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611303906144a2565b60405180910390fd5b60005b81518110156113fc576000600c60008484815181106113315761133061499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60008484815181106113a3576113a261499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806113f490614896565b91505061130f565b5050565b61140861296c565b73ffffffffffffffffffffffffffffffffffffffff16611426611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906144a2565b60405180910390fd5b80601090805190602001906114929291906137f7565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614442565b60405180910390fd5b80915050919050565b6000600f60019054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614422565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61163661296c565b73ffffffffffffffffffffffffffffffffffffffff16611654611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906144a2565b60405180910390fd5b6116b46000612dc2565b565b6116be61296c565b73ffffffffffffffffffffffffffffffffffffffff166116dc611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611729906144a2565b60405180910390fd5b60005b815181101561178e576117486007612e88565b60006117546007612a2d565b905061177a83838151811061176c5761176b61499d565b5b602002602001015182612e9e565b50808061178690614896565b915050611735565b5050565b61179c3382612a88565b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d2906143c2565b60405180910390fd5b6117e481612ebc565b50565b6117ef61296c565b73ffffffffffffffffffffffffffffffffffffffff1661180d611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a906144a2565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b61189761296c565b73ffffffffffffffffffffffffffffffffffffffff166118b5611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611902906144a2565b60405180910390fd5b60005b81518110156119fb576001600c60008484815181106119305761192f61499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60008484815181106119a2576119a161499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806119f390614896565b91505061190e565b5050565b6000600f60009054906101000a900460ff16905090565b611a1e61296c565b73ffffffffffffffffffffffffffffffffffffffff16611a3c611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906144a2565b60405180910390fd5b80600b8190555050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ace61296c565b73ffffffffffffffffffffffffffffffffffffffff16611aec611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b39906144a2565b60405180910390fd5b80600a8190555050565b60108054611b5990614833565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8590614833565b8015611bd25780601f10611ba757610100808354040283529160200191611bd2565b820191906000526020600020905b815481529060010190602001808311611bb557829003601f168201915b505050505081565b606060018054611be990614833565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1590614833565b8015611c625780601f10611c3757610100808354040283529160200191611c62565b820191906000526020600020905b815481529060010190602001808311611c4557829003601f168201915b5050505050905090565b611c7461296c565b73ffffffffffffffffffffffffffffffffffffffff16611c92611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf906144a2565b60405180910390fd5b611cf0611496565b611d0157611cfc612fcd565b611d0a565b611d09613070565b5b565b611d1461296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7990614382565b60405180910390fd5b8060056000611d8f61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3c61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e819190614265565b60405180910390a35050565b611e9e611e9861296c565b83612a88565b611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490614522565b60405180910390fd5b611ee984848484613112565b50505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f4061296c565b73ffffffffffffffffffffffffffffffffffffffff16611f5e611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906144a2565b60405180910390fd5b60001515600f60039054906101000a900460ff16151514611fd457600080fd5b6001600f60036101000a81548160ff021916908315150217905550600073197b0c12b2debae8905b3d3cd8f4dbeb988db83590506000600190505b60dd81116120db576120216007612e88565b60d181141561202f576120c8565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161206a9190614542565b60206040518083038186803b15801561208257600080fd5b505afa158015612096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ba9190613ac3565b90506120c68183612e9e565b505b80806120d390614896565b91505061200f565b5050565b60606120ea82612900565b612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906144e2565b60405180910390fd5b600061213361316e565b905061213e83613200565b50600081511161215d576040518060200160405280600081525061218b565b8061216784613200565b601160405160200161217b939291906141cd565b6040516020818303038152906040525b915050919050565b61219b61296c565b73ffffffffffffffffffffffffffffffffffffffff166121b9611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461220f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612206906144a2565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61224361296c565b73ffffffffffffffffffffffffffffffffffffffff16612261611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae906144a2565b60405180910390fd5b60006122c36007612a2d565b9050808211612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614322565b60405180910390fd5b600081836123159190614749565b90506000600190505b81811015612343576123306007612e88565b808061233b90614896565b91505061231e565b50505050565b61235161296c565b73ffffffffffffffffffffffffffffffffffffffff1661236f611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc906144a2565b60405180910390fd5b80601190805190602001906123db9291906137f7565b5050565b6123e761296c565b73ffffffffffffffffffffffffffffffffffffffff16612405611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612452906144a2565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151461247b57600080fd5b6001600f60026101000a81548160ff0219169083151502179055506124b5733ad25ca6a04b2970ae62f68e84394138c33471e760d1612e9e565b565b6124bf61296c565b73ffffffffffffffffffffffffffffffffffffffff166124dd611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a906144a2565b60405180910390fd5b8060088190555050565b61254561296c565b73ffffffffffffffffffffffffffffffffffffffff16612563611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146125b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b0906144a2565b60405180910390fd5b60005b8151811015612637576000600e60008484815181106125de576125dd61499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061262f90614896565b9150506125bc565b5050565b61264361296c565b73ffffffffffffffffffffffffffffffffffffffff16612661611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae906144a2565b60405180910390fd5b8060098190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6127a661296c565b73ffffffffffffffffffffffffffffffffffffffff166127c4611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461281a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612811906144a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190614302565b60405180910390fd5b61289381612dc2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129e7836114ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612a476007612e88565b6000612a536007612a2d565b905060d1811415612a7557612a686007612e88565b612a726007612a2d565b90505b612a7f8382612e9e565b80915050919050565b6000612a9382612900565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac9906143a2565b60405180910390fd5b6000612add836114ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b4c57508373ffffffffffffffffffffffffffffffffffffffff16612b3484610b84565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b5d5750612b5c81856126c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b86826114ad565b73ffffffffffffffffffffffffffffffffffffffff1614612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd3906144c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390614362565b60405180910390fd5b612c57838383613361565b612c62600082612974565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614749565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d099190614668565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b612eb8828260405180602001604052806000815250613424565b5050565b6000612ec7826114ad565b9050612ed581600084613361565b612ee0600083612974565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f309190614749565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612fd5611496565b15613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c906143e2565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861305961296c565b60405161306691906141fe565b60405180910390a1565b613078611496565b6130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae906142c2565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130fb61296c565b60405161310891906141fe565b60405180910390a1565b61311d848484612b66565b6131298484848461347f565b613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f906142e2565b60405180910390fd5b50505050565b60606010805461317d90614833565b80601f01602080910402602001604051908101604052809291908181526020018280546131a990614833565b80156131f65780601f106131cb576101008083540402835291602001916131f6565b820191906000526020600020905b8154815290600101906020018083116131d957829003601f168201915b5050505050905090565b60606000821415613248576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061335c565b600082905060005b6000821461327a57808061326390614896565b915050600a8261327391906146be565b9150613250565b60008167ffffffffffffffff811115613296576132956149cc565b5b6040519080825280601f01601f1916602001820160405280156132c85781602001600182028036833780820191505090505b5090505b60008514613355576001826132e19190614749565b9150600a856132f091906148df565b60306132fc9190614668565b60f81b8183815181106133125761331161499d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334e91906146be565b94506132cc565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156133d157506133a1611a9c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561341f576133de611496565b1561341e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613415906142a2565b60405180910390fd5b5b505050565b61342e8383613616565b61343b600084848461347f565b61347a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613471906142e2565b60405180910390fd5b505050565b60006134a08473ffffffffffffffffffffffffffffffffffffffff166137e4565b15613609578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134c961296c565b8786866040518563ffffffff1660e01b81526004016134eb9493929190614219565b602060405180830381600087803b15801561350557600080fd5b505af192505050801561353657506040513d601f19601f820116820180604052508101906135339190613cfc565b60015b6135b9573d8060008114613566576040519150601f19603f3d011682016040523d82523d6000602084013e61356b565b606091505b506000815114156135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a8906142e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061360e565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90614462565b60405180910390fd5b61368f81612900565b156136cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c690614342565b60405180910390fd5b6136db60008383613361565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461372b9190614668565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461380390614833565b90600052602060002090601f016020900481019282613825576000855561386c565b82601f1061383e57805160ff191683800117855561386c565b8280016001018555821561386c579182015b8281111561386b578251825591602001919060010190613850565b5b509050613879919061387d565b5090565b5b8082111561389657600081600090555060010161387e565b5090565b60006138ad6138a884614582565b61455d565b905080838252602082019050828560208602820111156138d0576138cf614a00565b5b60005b8581101561390057816138e6888261398e565b8452602084019350602083019250506001810190506138d3565b5050509392505050565b600061391d613918846145ae565b61455d565b90508281526020810184848401111561393957613938614a05565b5b6139448482856147f1565b509392505050565b600061395f61395a846145df565b61455d565b90508281526020810184848401111561397b5761397a614a05565b5b6139868482856147f1565b509392505050565b60008135905061399d81614fbc565b92915050565b6000815190506139b281614fbc565b92915050565b600082601f8301126139cd576139cc6149fb565b5b81356139dd84826020860161389a565b91505092915050565b6000813590506139f581614fd3565b92915050565b600081359050613a0a81614fea565b92915050565b600081519050613a1f81614fea565b92915050565b600082601f830112613a3a57613a396149fb565b5b8135613a4a84826020860161390a565b91505092915050565b600082601f830112613a6857613a676149fb565b5b8135613a7884826020860161394c565b91505092915050565b600081359050613a9081615001565b92915050565b600060208284031215613aac57613aab614a0f565b5b6000613aba8482850161398e565b91505092915050565b600060208284031215613ad957613ad8614a0f565b5b6000613ae7848285016139a3565b91505092915050565b60008060408385031215613b0757613b06614a0f565b5b6000613b158582860161398e565b9250506020613b268582860161398e565b9150509250929050565b600080600060608486031215613b4957613b48614a0f565b5b6000613b578682870161398e565b9350506020613b688682870161398e565b9250506040613b7986828701613a81565b9150509250925092565b60008060008060808587031215613b9d57613b9c614a0f565b5b6000613bab8782880161398e565b9450506020613bbc8782880161398e565b9350506040613bcd87828801613a81565b925050606085013567ffffffffffffffff811115613bee57613bed614a0a565b5b613bfa87828801613a25565b91505092959194509250565b60008060408385031215613c1d57613c1c614a0f565b5b6000613c2b8582860161398e565b9250506020613c3c858286016139e6565b9150509250929050565b60008060408385031215613c5d57613c5c614a0f565b5b6000613c6b8582860161398e565b9250506020613c7c85828601613a81565b9150509250929050565b600060208284031215613c9c57613c9b614a0f565b5b600082013567ffffffffffffffff811115613cba57613cb9614a0a565b5b613cc6848285016139b8565b91505092915050565b600060208284031215613ce557613ce4614a0f565b5b6000613cf3848285016139fb565b91505092915050565b600060208284031215613d1257613d11614a0f565b5b6000613d2084828501613a10565b91505092915050565b600060208284031215613d3f57613d3e614a0f565b5b600082013567ffffffffffffffff811115613d5d57613d5c614a0a565b5b613d6984828501613a53565b91505092915050565b600060208284031215613d8857613d87614a0f565b5b6000613d9684828501613a81565b91505092915050565b613da88161477d565b82525050565b613db78161478f565b82525050565b6000613dc882614625565b613dd2818561463b565b9350613de2818560208601614800565b613deb81614a14565b840191505092915050565b6000613e0182614630565b613e0b818561464c565b9350613e1b818560208601614800565b613e2481614a14565b840191505092915050565b6000613e3a82614630565b613e44818561465d565b9350613e54818560208601614800565b80840191505092915050565b60008154613e6d81614833565b613e77818661465d565b94506001821660008114613e925760018114613ea357613ed6565b60ff19831686528186019350613ed6565b613eac85614610565b60005b83811015613ece57815481890152600182019150602081019050613eaf565b838801955050505b50505092915050565b6000613eec602b8361464c565b9150613ef782614a25565b604082019050919050565b6000613f0f60148361464c565b9150613f1a82614a74565b602082019050919050565b6000613f3260328361464c565b9150613f3d82614a9d565b604082019050919050565b6000613f5560268361464c565b9150613f6082614aec565b604082019050919050565b6000613f7860268361464c565b9150613f8382614b3b565b604082019050919050565b6000613f9b601c8361464c565b9150613fa682614b8a565b602082019050919050565b6000613fbe60248361464c565b9150613fc982614bb3565b604082019050919050565b6000613fe160198361464c565b9150613fec82614c02565b602082019050919050565b6000614004602c8361464c565b915061400f82614c2b565b604082019050919050565b600061402760318361464c565b915061403282614c7a565b604082019050919050565b600061404a60108361464c565b915061405582614cc9565b602082019050919050565b600061406d60388361464c565b915061407882614cf2565b604082019050919050565b6000614090602a8361464c565b915061409b82614d41565b604082019050919050565b60006140b360298361464c565b91506140be82614d90565b604082019050919050565b60006140d660208361464c565b91506140e182614ddf565b602082019050919050565b60006140f9602c8361464c565b915061410482614e08565b604082019050919050565b600061411c60208361464c565b915061412782614e57565b602082019050919050565b600061413f60298361464c565b915061414a82614e80565b604082019050919050565b6000614162602f8361464c565b915061416d82614ecf565b604082019050919050565b600061418560218361464c565b915061419082614f1e565b604082019050919050565b60006141a860318361464c565b91506141b382614f6d565b604082019050919050565b6141c7816147e7565b82525050565b60006141d98286613e2f565b91506141e58285613e2f565b91506141f18284613e60565b9150819050949350505050565b60006020820190506142136000830184613d9f565b92915050565b600060808201905061422e6000830187613d9f565b61423b6020830186613d9f565b61424860408301856141be565b818103606083015261425a8184613dbd565b905095945050505050565b600060208201905061427a6000830184613dae565b92915050565b6000602082019050818103600083015261429a8184613df6565b905092915050565b600060208201905081810360008301526142bb81613edf565b9050919050565b600060208201905081810360008301526142db81613f02565b9050919050565b600060208201905081810360008301526142fb81613f25565b9050919050565b6000602082019050818103600083015261431b81613f48565b9050919050565b6000602082019050818103600083015261433b81613f6b565b9050919050565b6000602082019050818103600083015261435b81613f8e565b9050919050565b6000602082019050818103600083015261437b81613fb1565b9050919050565b6000602082019050818103600083015261439b81613fd4565b9050919050565b600060208201905081810360008301526143bb81613ff7565b9050919050565b600060208201905081810360008301526143db8161401a565b9050919050565b600060208201905081810360008301526143fb8161403d565b9050919050565b6000602082019050818103600083015261441b81614060565b9050919050565b6000602082019050818103600083015261443b81614083565b9050919050565b6000602082019050818103600083015261445b816140a6565b9050919050565b6000602082019050818103600083015261447b816140c9565b9050919050565b6000602082019050818103600083015261449b816140ec565b9050919050565b600060208201905081810360008301526144bb8161410f565b9050919050565b600060208201905081810360008301526144db81614132565b9050919050565b600060208201905081810360008301526144fb81614155565b9050919050565b6000602082019050818103600083015261451b81614178565b9050919050565b6000602082019050818103600083015261453b8161419b565b9050919050565b600060208201905061455760008301846141be565b92915050565b6000614567614578565b90506145738282614865565b919050565b6000604051905090565b600067ffffffffffffffff82111561459d5761459c6149cc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145c9576145c86149cc565b5b6145d282614a14565b9050602081019050919050565b600067ffffffffffffffff8211156145fa576145f96149cc565b5b61460382614a14565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614673826147e7565b915061467e836147e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b3576146b2614910565b5b828201905092915050565b60006146c9826147e7565b91506146d4836147e7565b9250826146e4576146e361493f565b5b828204905092915050565b60006146fa826147e7565b9150614705836147e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473e5761473d614910565b5b828202905092915050565b6000614754826147e7565b915061475f836147e7565b92508282101561477257614771614910565b5b828203905092915050565b6000614788826147c7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481e578082015181840152602081019050614803565b8381111561482d576000848401525b50505050565b6000600282049050600182168061484b57607f821691505b6020821081141561485f5761485e61496e565b5b50919050565b61486e82614a14565b810181811067ffffffffffffffff8211171561488d5761488c6149cc565b5b80604052505050565b60006148a1826147e7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d4576148d3614910565b5b600182019050919050565b60006148ea826147e7565b91506148f5836147e7565b9250826149055761490461493f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6577204944206d7573742062652067726561746572207468616e206375727260008201527f656e742049440000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f455243373231204275726e61626c653a2063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b614fc58161477d565b8114614fd057600080fd5b50565b614fdc8161478f565b8114614fe757600080fd5b50565b614ff38161479b565b8114614ffe57600080fd5b50565b61500a816147e7565b811461501557600080fd5b5056fea2646970667358221220b58b7c8f28c82587ff951c9154964d98cfa08beab0b4a35bc43c8c4f98eb986f64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80637f6497831161014f578063c0498838116100c1578063dd40d6661161007a578063dd40d666146108f2578063de6c97f91461091b578063e6c6df5914610944578063e985e9c51461096d578063ebf0ab80146109aa578063f2fde38b146109e75761027d565b8063c04988381461081e578063c87b56dd14610835578063ca3cb52214610872578063cdaa28fd14610889578063da3ef23f146108b2578063db211e9d146108db5761027d565b806391860f781161011357806391860f781461072257806395d89b411461074d5780639752a01714610778578063a22cb4651461078f578063b88d4fde146107b8578063bc660cac146107e15761027d565b80637f64978314610651578063844947081461067a5780638d6cc56d146106a55780638da5cb5b146106ce5780638da8b739146106f95761027d565b806342842e0e116101f357806368428a1b116101ac57806368428a1b1461056957806370a0823114610594578063715018a6146105d1578063729ad39e146105e85780637b47ec1a146106115780637d8966e41461063a5761027d565b806342842e0e1461046a5780635367de6a14610493578063548db174146104af57806355f804b3146104d85780635c975abb146105015780636352211e1461052c5761027d565b806318160ddd1161024557806318160ddd1461036c578063235b6ea11461039757806323b872dd146103c25780632672c902146103eb5780633af32abf146104165780633ccfd60b146104535761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630b4b987814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613ccf565b610a10565b6040516102b69190614265565b60405180910390f35b3480156102cb57600080fd5b506102d4610af2565b6040516102e19190614280565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613d72565b610b84565b60405161031e91906141fe565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613c46565b610c09565b005b61036a60048036038101906103659190613d72565b610d21565b005b34801561037857600080fd5b50610381610e89565b60405161038e9190614542565b60405180910390f35b3480156103a357600080fd5b506103ac610e9a565b6040516103b99190614542565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613b30565b610ea0565b005b3480156103f757600080fd5b50610400610f00565b60405161040d9190614280565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190613a96565b610f8e565b60405161044a9190614265565b60405180910390f35b34801561045f57600080fd5b50610468610fe4565b005b34801561047657600080fd5b50610491600480360381019061048c9190613b30565b611129565b005b6104ad60048036038101906104a89190613d72565b611149565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613c86565b611290565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613d29565b611400565b005b34801561050d57600080fd5b50610516611496565b6040516105239190614265565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e9190613d72565b6114ad565b60405161056091906141fe565b60405180910390f35b34801561057557600080fd5b5061057e61155f565b60405161058b9190614265565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190613a96565b611576565b6040516105c89190614542565b60405180910390f35b3480156105dd57600080fd5b506105e661162e565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613c86565b6116b6565b005b34801561061d57600080fd5b5061063860048036038101906106339190613d72565b611792565b005b34801561064657600080fd5b5061064f6117e7565b005b34801561065d57600080fd5b5061067860048036038101906106739190613c86565b61188f565b005b34801561068657600080fd5b5061068f6119ff565b60405161069c9190614265565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190613d72565b611a16565b005b3480156106da57600080fd5b506106e3611a9c565b6040516106f091906141fe565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613d72565b611ac6565b005b34801561072e57600080fd5b50610737611b4c565b6040516107449190614280565b60405180910390f35b34801561075957600080fd5b50610762611bda565b60405161076f9190614280565b60405180910390f35b34801561078457600080fd5b5061078d611c6c565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613c06565b611d0c565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613b83565b611e8d565b005b3480156107ed57600080fd5b5061080860048036038101906108039190613a96565b611eef565b6040516108159190614542565b60405180910390f35b34801561082a57600080fd5b50610833611f38565b005b34801561084157600080fd5b5061085c60048036038101906108579190613d72565b6120df565b6040516108699190614280565b60405180910390f35b34801561087e57600080fd5b50610887612193565b005b34801561089557600080fd5b506108b060048036038101906108ab9190613d72565b61223b565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613d29565b612349565b005b3480156108e757600080fd5b506108f06123df565b005b3480156108fe57600080fd5b5061091960048036038101906109149190613d72565b6124b7565b005b34801561092757600080fd5b50610942600480360381019061093d9190613c86565b61253d565b005b34801561095057600080fd5b5061096b60048036038101906109669190613d72565b61263b565b005b34801561097957600080fd5b50610994600480360381019061098f9190613af0565b6126c1565b6040516109a19190614265565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc9190613a96565b612755565b6040516109de9190614542565b60405180910390f35b3480156109f357600080fd5b50610a0e6004803603810190610a099190613a96565b61279e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aeb5750610aea82612896565b5b9050919050565b606060008054610b0190614833565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d90614833565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b6000610b8f82612900565b610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590614482565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c14826114ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7c90614502565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca461296c565b73ffffffffffffffffffffffffffffffffffffffff161480610cd35750610cd281610ccd61296c565b6126c1565b5b610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990614402565b60405180910390fd5b610d1c8383612974565b505050565b600954811115610d3057600080fd5b600a54811115610d3f57600080fd5b610d4833610f8e565b610d5157600080fd5b600b5481610d5f91906146ef565b341015610d6b57600080fd5b600a5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610db99190614668565b1115610dc457600080fd5b600f60009054906101000a900460ff16610ddd57600080fd5b6000610de96007612a2d565b90506008548282610dfa9190614668565b1115610e0557600080fd5b60005b82811015610e84576001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e609190614668565b92505081905550610e7033612a3b565b508080610e7c90614896565b915050610e08565b505050565b6000610e956007612a2d565b905090565b600b5481565b610eb1610eab61296c565b82612a88565b610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614522565b60405180910390fd5b610efb838383612b66565b505050565b60118054610f0d90614833565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3990614833565b8015610f865780601f10610f5b57610100808354040283529160200191610f86565b820191906000526020600020905b815481529060010190602001808311610f6957829003601f168201915b505050505081565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610fec61296c565b73ffffffffffffffffffffffffffffffffffffffff1661100a611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611060576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611057906144a2565b60405180910390fd5b6000471161106d57600080fd5b732ea23ad853a68c0bd10ca15d5e896273585ac3e073ffffffffffffffffffffffffffffffffffffffff166108fc60646028476110aa91906146ef565b6110b491906146be565b9081150290604051600060405180830381858888f193505050501580156110df573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611126573d6000803e3d6000fd5b50565b61114483838360405180602001604052806000815250611e8d565b505050565b60095481111561115857600080fd5b600f60019054906101000a900460ff1661117157600080fd5b600061117d6007612a2d565b9050600854828261118e9190614668565b111561119957600080fd5b60095482600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111e79190614668565b11156111f257600080fd5b600b548261120091906146ef565b34101561120c57600080fd5b60005b8281101561128b576001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112679190614668565b9250508190555061127733612a3b565b50808061128390614896565b91505061120f565b505050565b61129861296c565b73ffffffffffffffffffffffffffffffffffffffff166112b6611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611303906144a2565b60405180910390fd5b60005b81518110156113fc576000600c60008484815181106113315761133061499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60008484815181106113a3576113a261499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806113f490614896565b91505061130f565b5050565b61140861296c565b73ffffffffffffffffffffffffffffffffffffffff16611426611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906144a2565b60405180910390fd5b80601090805190602001906114929291906137f7565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614442565b60405180910390fd5b80915050919050565b6000600f60019054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90614422565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61163661296c565b73ffffffffffffffffffffffffffffffffffffffff16611654611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a1906144a2565b60405180910390fd5b6116b46000612dc2565b565b6116be61296c565b73ffffffffffffffffffffffffffffffffffffffff166116dc611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611729906144a2565b60405180910390fd5b60005b815181101561178e576117486007612e88565b60006117546007612a2d565b905061177a83838151811061176c5761176b61499d565b5b602002602001015182612e9e565b50808061178690614896565b915050611735565b5050565b61179c3382612a88565b6117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d2906143c2565b60405180910390fd5b6117e481612ebc565b50565b6117ef61296c565b73ffffffffffffffffffffffffffffffffffffffff1661180d611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a906144a2565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b61189761296c565b73ffffffffffffffffffffffffffffffffffffffff166118b5611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611902906144a2565b60405180910390fd5b60005b81518110156119fb576001600c60008484815181106119305761192f61499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600d60008484815181106119a2576119a161499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806119f390614896565b91505061190e565b5050565b6000600f60009054906101000a900460ff16905090565b611a1e61296c565b73ffffffffffffffffffffffffffffffffffffffff16611a3c611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a89906144a2565b60405180910390fd5b80600b8190555050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ace61296c565b73ffffffffffffffffffffffffffffffffffffffff16611aec611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b39906144a2565b60405180910390fd5b80600a8190555050565b60108054611b5990614833565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8590614833565b8015611bd25780601f10611ba757610100808354040283529160200191611bd2565b820191906000526020600020905b815481529060010190602001808311611bb557829003601f168201915b505050505081565b606060018054611be990614833565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1590614833565b8015611c625780601f10611c3757610100808354040283529160200191611c62565b820191906000526020600020905b815481529060010190602001808311611c4557829003601f168201915b5050505050905090565b611c7461296c565b73ffffffffffffffffffffffffffffffffffffffff16611c92611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf906144a2565b60405180910390fd5b611cf0611496565b611d0157611cfc612fcd565b611d0a565b611d09613070565b5b565b611d1461296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7990614382565b60405180910390fd5b8060056000611d8f61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3c61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e819190614265565b60405180910390a35050565b611e9e611e9861296c565b83612a88565b611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490614522565b60405180910390fd5b611ee984848484613112565b50505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f4061296c565b73ffffffffffffffffffffffffffffffffffffffff16611f5e611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906144a2565b60405180910390fd5b60001515600f60039054906101000a900460ff16151514611fd457600080fd5b6001600f60036101000a81548160ff021916908315150217905550600073197b0c12b2debae8905b3d3cd8f4dbeb988db83590506000600190505b60dd81116120db576120216007612e88565b60d181141561202f576120c8565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161206a9190614542565b60206040518083038186803b15801561208257600080fd5b505afa158015612096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ba9190613ac3565b90506120c68183612e9e565b505b80806120d390614896565b91505061200f565b5050565b60606120ea82612900565b612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906144e2565b60405180910390fd5b600061213361316e565b905061213e83613200565b50600081511161215d576040518060200160405280600081525061218b565b8061216784613200565b601160405160200161217b939291906141cd565b6040516020818303038152906040525b915050919050565b61219b61296c565b73ffffffffffffffffffffffffffffffffffffffff166121b9611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461220f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612206906144a2565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61224361296c565b73ffffffffffffffffffffffffffffffffffffffff16612261611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae906144a2565b60405180910390fd5b60006122c36007612a2d565b9050808211612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614322565b60405180910390fd5b600081836123159190614749565b90506000600190505b81811015612343576123306007612e88565b808061233b90614896565b91505061231e565b50505050565b61235161296c565b73ffffffffffffffffffffffffffffffffffffffff1661236f611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc906144a2565b60405180910390fd5b80601190805190602001906123db9291906137f7565b5050565b6123e761296c565b73ffffffffffffffffffffffffffffffffffffffff16612405611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612452906144a2565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151461247b57600080fd5b6001600f60026101000a81548160ff0219169083151502179055506124b5733ad25ca6a04b2970ae62f68e84394138c33471e760d1612e9e565b565b6124bf61296c565b73ffffffffffffffffffffffffffffffffffffffff166124dd611a9c565b73ffffffffffffffffffffffffffffffffffffffff1614612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a906144a2565b60405180910390fd5b8060088190555050565b61254561296c565b73ffffffffffffffffffffffffffffffffffffffff16612563611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146125b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b0906144a2565b60405180910390fd5b60005b8151811015612637576000600e60008484815181106125de576125dd61499d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061262f90614896565b9150506125bc565b5050565b61264361296c565b73ffffffffffffffffffffffffffffffffffffffff16612661611a9c565b73ffffffffffffffffffffffffffffffffffffffff16146126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae906144a2565b60405180910390fd5b8060098190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6127a661296c565b73ffffffffffffffffffffffffffffffffffffffff166127c4611a9c565b73ffffffffffffffffffffffffffffffffffffffff161461281a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612811906144a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190614302565b60405180910390fd5b61289381612dc2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129e7836114ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612a476007612e88565b6000612a536007612a2d565b905060d1811415612a7557612a686007612e88565b612a726007612a2d565b90505b612a7f8382612e9e565b80915050919050565b6000612a9382612900565b612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac9906143a2565b60405180910390fd5b6000612add836114ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b4c57508373ffffffffffffffffffffffffffffffffffffffff16612b3484610b84565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b5d5750612b5c81856126c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b86826114ad565b73ffffffffffffffffffffffffffffffffffffffff1614612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd3906144c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390614362565b60405180910390fd5b612c57838383613361565b612c62600082612974565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614749565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d099190614668565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b612eb8828260405180602001604052806000815250613424565b5050565b6000612ec7826114ad565b9050612ed581600084613361565b612ee0600083612974565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f309190614749565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612fd5611496565b15613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c906143e2565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861305961296c565b60405161306691906141fe565b60405180910390a1565b613078611496565b6130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae906142c2565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130fb61296c565b60405161310891906141fe565b60405180910390a1565b61311d848484612b66565b6131298484848461347f565b613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f906142e2565b60405180910390fd5b50505050565b60606010805461317d90614833565b80601f01602080910402602001604051908101604052809291908181526020018280546131a990614833565b80156131f65780601f106131cb576101008083540402835291602001916131f6565b820191906000526020600020905b8154815290600101906020018083116131d957829003601f168201915b5050505050905090565b60606000821415613248576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061335c565b600082905060005b6000821461327a57808061326390614896565b915050600a8261327391906146be565b9150613250565b60008167ffffffffffffffff811115613296576132956149cc565b5b6040519080825280601f01601f1916602001820160405280156132c85781602001600182028036833780820191505090505b5090505b60008514613355576001826132e19190614749565b9150600a856132f091906148df565b60306132fc9190614668565b60f81b8183815181106133125761331161499d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561334e91906146be565b94506132cc565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156133d157506133a1611a9c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561341f576133de611496565b1561341e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613415906142a2565b60405180910390fd5b5b505050565b61342e8383613616565b61343b600084848461347f565b61347a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613471906142e2565b60405180910390fd5b505050565b60006134a08473ffffffffffffffffffffffffffffffffffffffff166137e4565b15613609578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134c961296c565b8786866040518563ffffffff1660e01b81526004016134eb9493929190614219565b602060405180830381600087803b15801561350557600080fd5b505af192505050801561353657506040513d601f19601f820116820180604052508101906135339190613cfc565b60015b6135b9573d8060008114613566576040519150601f19603f3d011682016040523d82523d6000602084013e61356b565b606091505b506000815114156135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a8906142e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061360e565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90614462565b60405180910390fd5b61368f81612900565b156136cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c690614342565b60405180910390fd5b6136db60008383613361565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461372b9190614668565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461380390614833565b90600052602060002090601f016020900481019282613825576000855561386c565b82601f1061383e57805160ff191683800117855561386c565b8280016001018555821561386c579182015b8281111561386b578251825591602001919060010190613850565b5b509050613879919061387d565b5090565b5b8082111561389657600081600090555060010161387e565b5090565b60006138ad6138a884614582565b61455d565b905080838252602082019050828560208602820111156138d0576138cf614a00565b5b60005b8581101561390057816138e6888261398e565b8452602084019350602083019250506001810190506138d3565b5050509392505050565b600061391d613918846145ae565b61455d565b90508281526020810184848401111561393957613938614a05565b5b6139448482856147f1565b509392505050565b600061395f61395a846145df565b61455d565b90508281526020810184848401111561397b5761397a614a05565b5b6139868482856147f1565b509392505050565b60008135905061399d81614fbc565b92915050565b6000815190506139b281614fbc565b92915050565b600082601f8301126139cd576139cc6149fb565b5b81356139dd84826020860161389a565b91505092915050565b6000813590506139f581614fd3565b92915050565b600081359050613a0a81614fea565b92915050565b600081519050613a1f81614fea565b92915050565b600082601f830112613a3a57613a396149fb565b5b8135613a4a84826020860161390a565b91505092915050565b600082601f830112613a6857613a676149fb565b5b8135613a7884826020860161394c565b91505092915050565b600081359050613a9081615001565b92915050565b600060208284031215613aac57613aab614a0f565b5b6000613aba8482850161398e565b91505092915050565b600060208284031215613ad957613ad8614a0f565b5b6000613ae7848285016139a3565b91505092915050565b60008060408385031215613b0757613b06614a0f565b5b6000613b158582860161398e565b9250506020613b268582860161398e565b9150509250929050565b600080600060608486031215613b4957613b48614a0f565b5b6000613b578682870161398e565b9350506020613b688682870161398e565b9250506040613b7986828701613a81565b9150509250925092565b60008060008060808587031215613b9d57613b9c614a0f565b5b6000613bab8782880161398e565b9450506020613bbc8782880161398e565b9350506040613bcd87828801613a81565b925050606085013567ffffffffffffffff811115613bee57613bed614a0a565b5b613bfa87828801613a25565b91505092959194509250565b60008060408385031215613c1d57613c1c614a0f565b5b6000613c2b8582860161398e565b9250506020613c3c858286016139e6565b9150509250929050565b60008060408385031215613c5d57613c5c614a0f565b5b6000613c6b8582860161398e565b9250506020613c7c85828601613a81565b9150509250929050565b600060208284031215613c9c57613c9b614a0f565b5b600082013567ffffffffffffffff811115613cba57613cb9614a0a565b5b613cc6848285016139b8565b91505092915050565b600060208284031215613ce557613ce4614a0f565b5b6000613cf3848285016139fb565b91505092915050565b600060208284031215613d1257613d11614a0f565b5b6000613d2084828501613a10565b91505092915050565b600060208284031215613d3f57613d3e614a0f565b5b600082013567ffffffffffffffff811115613d5d57613d5c614a0a565b5b613d6984828501613a53565b91505092915050565b600060208284031215613d8857613d87614a0f565b5b6000613d9684828501613a81565b91505092915050565b613da88161477d565b82525050565b613db78161478f565b82525050565b6000613dc882614625565b613dd2818561463b565b9350613de2818560208601614800565b613deb81614a14565b840191505092915050565b6000613e0182614630565b613e0b818561464c565b9350613e1b818560208601614800565b613e2481614a14565b840191505092915050565b6000613e3a82614630565b613e44818561465d565b9350613e54818560208601614800565b80840191505092915050565b60008154613e6d81614833565b613e77818661465d565b94506001821660008114613e925760018114613ea357613ed6565b60ff19831686528186019350613ed6565b613eac85614610565b60005b83811015613ece57815481890152600182019150602081019050613eaf565b838801955050505b50505092915050565b6000613eec602b8361464c565b9150613ef782614a25565b604082019050919050565b6000613f0f60148361464c565b9150613f1a82614a74565b602082019050919050565b6000613f3260328361464c565b9150613f3d82614a9d565b604082019050919050565b6000613f5560268361464c565b9150613f6082614aec565b604082019050919050565b6000613f7860268361464c565b9150613f8382614b3b565b604082019050919050565b6000613f9b601c8361464c565b9150613fa682614b8a565b602082019050919050565b6000613fbe60248361464c565b9150613fc982614bb3565b604082019050919050565b6000613fe160198361464c565b9150613fec82614c02565b602082019050919050565b6000614004602c8361464c565b915061400f82614c2b565b604082019050919050565b600061402760318361464c565b915061403282614c7a565b604082019050919050565b600061404a60108361464c565b915061405582614cc9565b602082019050919050565b600061406d60388361464c565b915061407882614cf2565b604082019050919050565b6000614090602a8361464c565b915061409b82614d41565b604082019050919050565b60006140b360298361464c565b91506140be82614d90565b604082019050919050565b60006140d660208361464c565b91506140e182614ddf565b602082019050919050565b60006140f9602c8361464c565b915061410482614e08565b604082019050919050565b600061411c60208361464c565b915061412782614e57565b602082019050919050565b600061413f60298361464c565b915061414a82614e80565b604082019050919050565b6000614162602f8361464c565b915061416d82614ecf565b604082019050919050565b600061418560218361464c565b915061419082614f1e565b604082019050919050565b60006141a860318361464c565b91506141b382614f6d565b604082019050919050565b6141c7816147e7565b82525050565b60006141d98286613e2f565b91506141e58285613e2f565b91506141f18284613e60565b9150819050949350505050565b60006020820190506142136000830184613d9f565b92915050565b600060808201905061422e6000830187613d9f565b61423b6020830186613d9f565b61424860408301856141be565b818103606083015261425a8184613dbd565b905095945050505050565b600060208201905061427a6000830184613dae565b92915050565b6000602082019050818103600083015261429a8184613df6565b905092915050565b600060208201905081810360008301526142bb81613edf565b9050919050565b600060208201905081810360008301526142db81613f02565b9050919050565b600060208201905081810360008301526142fb81613f25565b9050919050565b6000602082019050818103600083015261431b81613f48565b9050919050565b6000602082019050818103600083015261433b81613f6b565b9050919050565b6000602082019050818103600083015261435b81613f8e565b9050919050565b6000602082019050818103600083015261437b81613fb1565b9050919050565b6000602082019050818103600083015261439b81613fd4565b9050919050565b600060208201905081810360008301526143bb81613ff7565b9050919050565b600060208201905081810360008301526143db8161401a565b9050919050565b600060208201905081810360008301526143fb8161403d565b9050919050565b6000602082019050818103600083015261441b81614060565b9050919050565b6000602082019050818103600083015261443b81614083565b9050919050565b6000602082019050818103600083015261445b816140a6565b9050919050565b6000602082019050818103600083015261447b816140c9565b9050919050565b6000602082019050818103600083015261449b816140ec565b9050919050565b600060208201905081810360008301526144bb8161410f565b9050919050565b600060208201905081810360008301526144db81614132565b9050919050565b600060208201905081810360008301526144fb81614155565b9050919050565b6000602082019050818103600083015261451b81614178565b9050919050565b6000602082019050818103600083015261453b8161419b565b9050919050565b600060208201905061455760008301846141be565b92915050565b6000614567614578565b90506145738282614865565b919050565b6000604051905090565b600067ffffffffffffffff82111561459d5761459c6149cc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145c9576145c86149cc565b5b6145d282614a14565b9050602081019050919050565b600067ffffffffffffffff8211156145fa576145f96149cc565b5b61460382614a14565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614673826147e7565b915061467e836147e7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b3576146b2614910565b5b828201905092915050565b60006146c9826147e7565b91506146d4836147e7565b9250826146e4576146e361493f565b5b828204905092915050565b60006146fa826147e7565b9150614705836147e7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473e5761473d614910565b5b828202905092915050565b6000614754826147e7565b915061475f836147e7565b92508282101561477257614771614910565b5b828203905092915050565b6000614788826147c7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481e578082015181840152602081019050614803565b8381111561482d576000848401525b50505050565b6000600282049050600182168061484b57607f821691505b6020821081141561485f5761485e61496e565b5b50919050565b61486e82614a14565b810181811067ffffffffffffffff8211171561488d5761488c6149cc565b5b80604052505050565b60006148a1826147e7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d4576148d3614910565b5b600182019050919050565b60006148ea826147e7565b91506148f5836147e7565b9250826149055761490461493f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6577204944206d7573742062652067726561746572207468616e206375727260008201527f656e742049440000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f455243373231204275726e61626c653a2063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b614fc58161477d565b8114614fd057600080fd5b50565b614fdc8161478f565b8114614fe757600080fd5b50565b614ff38161479b565b8114614ffe57600080fd5b50565b61500a816147e7565b811461501557600080fd5b5056fea2646970667358221220b58b7c8f28c82587ff951c9154964d98cfa08beab0b4a35bc43c8c4f98eb986f64736f6c63430008070033

Deployed Bytecode Sourcemap

38211:7677:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19628:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20573:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22132:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21655:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42688:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41369:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38792:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23022:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39221:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41475:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45247:229;;;;;;;;;;;;;:::i;:::-;;23432:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43290:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42259:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41044:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32738:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20267:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41690:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19997:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37578:94;;;;;;;;;;;;;:::i;:::-;;39511:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40728:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44219:84;;;;;;;;;;;;;:::i;:::-;;42025:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41589:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44741;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36927:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44626:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39190:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20742:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44311:99;;;;;;;;;;;;;:::i;:::-;;22425:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23688:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41785:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39823:562;;;;;;;;;;;;;:::i;:::-;;44842:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44118:93;;;;;;;;;;;;;:::i;:::-;;40393:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41257:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39354:146;;;;;;;;;;;;;:::i;:::-;;44420:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42495:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44525:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22791:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41906:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37827:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19628:305;19730:4;19782:25;19767:40;;;:11;:40;;;;:105;;;;19839:33;19824:48;;;:11;:48;;;;19767:105;:158;;;;19889:36;19913:11;19889:23;:36::i;:::-;19767:158;19747:178;;19628:305;;;:::o;20573:100::-;20627:13;20660:5;20653:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20573:100;:::o;22132:221::-;22208:7;22236:16;22244:7;22236;:16::i;:::-;22228:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22321:15;:24;22337:7;22321:24;;;;;;;;;;;;;;;;;;;;;22314:31;;22132:221;;;:::o;21655:411::-;21736:13;21752:23;21767:7;21752:14;:23::i;:::-;21736:39;;21800:5;21794:11;;:2;:11;;;;21786:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21894:5;21878:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21903:37;21920:5;21927:12;:10;:12::i;:::-;21903:16;:37::i;:::-;21878:62;21856:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22037:21;22046:2;22050:7;22037:8;:21::i;:::-;21725:341;21655:411;;:::o;42688:594::-;42774:8;;42764:6;:18;;42756:27;;;;;;42812:15;;42802:6;:25;;42794:34;;;;;;42847:25;42861:10;42847:13;:25::i;:::-;42839:34;;;;;;42914:6;;42905;:15;;;;:::i;:::-;42892:9;:28;;42884:37;;;;;;42978:15;;42968:6;42940:13;:25;42954:10;42940:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:53;;42932:62;;;;;;43013:14;;;;;;;;;;;43005:23;;;;;;43039:19;43061;:9;:17;:19::i;:::-;43039:41;;43123:10;;43113:6;43099:11;:20;;;;:::i;:::-;:34;;43091:43;;;;;;43150:9;43145:130;43169:6;43165:1;:10;43145:130;;;43226:1;43197:13;:25;43211:10;43197:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;43242:21;43252:10;43242:9;:21::i;:::-;;43177:3;;;;;:::i;:::-;;;;43145:130;;;;42745:537;42688:594;:::o;41369:98::-;41413:7;41440:19;:9;:17;:19::i;:::-;41433:26;;41369:98;:::o;38792:43::-;;;;:::o;23022:339::-;23217:41;23236:12;:10;:12::i;:::-;23250:7;23217:18;:41::i;:::-;23209:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23325:28;23335:4;23341:2;23345:7;23325:9;:28::i;:::-;23022:339;;;:::o;39221:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41475:106::-;41533:4;41557:10;:16;41568:4;41557:16;;;;;;;;;;;;;;;;;;;;;;;;;41550:23;;41475:106;;;:::o;45247:229::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:1:::1;45305:21;:25;45297:34;;;::::0;::::1;;38421:42;45343:29;;:63;45402:3;45397:2;45373:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;45343:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45425:10;45417:28;;:51;45446:21;45417:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45247:229::o:0;23432:185::-;23570:39;23587:4;23593:2;23597:7;23570:39;;;;;;;;;;;;:16;:39::i;:::-;23432:185;;;:::o;43290:484::-;43369:8;;43359:6;:18;;43351:27;;;;;;43397:11;;;;;;;;;;;43389:20;;;;;;43421:19;43443;:9;:17;:19::i;:::-;43421:41;;43505:10;;43495:6;43481:11;:20;;;;:::i;:::-;:34;;43473:43;;;;;;43570:8;;43560:6;43535:10;:22;43546:10;43535:22;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:43;;43527:52;;;;;;43621:6;;43612;:15;;;;:::i;:::-;43599:9;:28;;43591:37;;;;;;43644:9;43639:128;43663:6;43659:1;:10;43639:128;;;43717:1;43691:10;:22;43702:10;43691:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43734:21;43744:10;43734:9;:21::i;:::-;;43671:3;;;;;:::i;:::-;;;;43639:128;;;;43340:434;43290:484;:::o;42259:228::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42345:9:::1;42340:140;42364:5;:12;42360:1;:16;42340:140;;;42421:5;42398:10;:20;42409:5;42415:1;42409:8;;;;;;;;:::i;:::-;;;;;;;;42398:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;42467:1;42441:13;:23;42455:5;42461:1;42455:8;;;;;;;;:::i;:::-;;;;;;;;42441:23;;;;;;;;;;;;;;;:27;;;;42378:3;;;;;:::i;:::-;;;;42340:140;;;;42259:228:::0;:::o;41044:93::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41125:4:::1;41112:10;:17;;;;;;;;;;;;:::i;:::-;;41044:93:::0;:::o;32738:86::-;32785:4;32809:7;;;;;;;;;;;32802:14;;32738:86;:::o;20267:239::-;20339:7;20359:13;20375:7;:16;20383:7;20375:16;;;;;;;;;;;;;;;;;;;;;20359:32;;20427:1;20410:19;;:5;:19;;;;20402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20493:5;20486:12;;;20267:239;;;:::o;41690:87::-;41733:4;41757:11;;;;;;;;;;;41750:18;;41690:87;:::o;19997:208::-;20069:7;20114:1;20097:19;;:5;:19;;;;20089:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20181:9;:16;20191:5;20181:16;;;;;;;;;;;;;;;;20174:23;;19997:208;;;:::o;37578:94::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37643:21:::1;37661:1;37643:9;:21::i;:::-;37578:94::o:0;39511:252::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39585:9:::1;39580:176;39604:5;:12;39600:1;:16;39580:176;;;39638:21;:9;:19;:21::i;:::-;39674:10;39687:19;:9;:17;:19::i;:::-;39674:32;;39721:23;39731:5;39737:1;39731:8;;;;;;;;:::i;:::-;;;;;;;;39741:2;39721:9;:23::i;:::-;39623:133;39618:3;;;;;:::i;:::-;;;;39580:176;;;;39511:252:::0;:::o;40728:197::-;40798:39;40817:10;40829:7;40798:18;:39::i;:::-;40790:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;40903:14;40909:7;40903:5;:14::i;:::-;40728:197;:::o;44219:84::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44284:11:::1;;;;;;;;;;;44283:12;44269:11;;:26;;;;;;;;;;;;;;;;;;44219:84::o:0;42025:222::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42106:9:::1;42101:139;42125:5;:12;42121:1;:16;42101:139;;;42182:4;42159:10;:20;42170:5;42176:1;42170:8;;;;;;;;:::i;:::-;;;;;;;;42159:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;42227:1;42201:13;:23;42215:5;42221:1;42215:8;;;;;;;;:::i;:::-;;;;;;;;42201:23;;;;;;;;;;;;;;;:27;;;;42139:3;;;;;:::i;:::-;;;;42101:139;;;;42025:222:::0;:::o;41589:93::-;41635:4;41659:14;;;;;;;;;;;41652:21;;41589:93;:::o;44741:::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44817:8:::1;44808:6;:17;;;;44741:93:::0;:::o;36927:87::-;36973:7;37000:6;;;;;;;;;;;36993:13;;36927:87;:::o;44626:107::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44718:6:::1;44700:15;:24;;;;44626:107:::0;:::o;39190:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20742:104::-;20798:13;20831:7;20824:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20742:104;:::o;44311:99::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44370:8:::1;:6;:8::i;:::-;:32;;44394:8;:6;:8::i;:::-;44370:32;;;44381:10;:8;:10::i;:::-;44370:32;44311:99::o:0;22425:295::-;22540:12;:10;:12::i;:::-;22528:24;;:8;:24;;;;22520:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22640:8;22595:18;:32;22614:12;:10;:12::i;:::-;22595:32;;;;;;;;;;;;;;;:42;22628:8;22595:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22693:8;22664:48;;22679:12;:10;:12::i;:::-;22664:48;;;22703:8;22664:48;;;;;;:::i;:::-;;;;;;;;22425:295;;:::o;23688:328::-;23863:41;23882:12;:10;:12::i;:::-;23896:7;23863:18;:41::i;:::-;23855:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23969:39;23983:4;23989:2;23993:7;24002:5;23969:13;:39::i;:::-;23688:328;;;;:::o;41785:113::-;41843:7;41870:13;:19;41884:4;41870:19;;;;;;;;;;;;;;;;41863:26;;41785:113;;;:::o;39823:562::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39915:5:::1;39889:31;;:22;;;;;;;;;;;:31;;;39881:40;;;::::0;::::1;;39958:4;39933:22;;:29;;;;;;;;;;;;;;;;;;40005:16;38510:42;40005:40;;40146:9;40158:1;40146:13;;40142:236;40163:3;40160:1;:6;40142:236;;40187:21;:9;:19;:21::i;:::-;40231:3;40226:1;:8;40223:56;;;40255:8;;40223:56;40293:15;40311:8;:16;;;40328:1;40311:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40293:37;;40345:21;40355:7;40364:1;40345:9;:21::i;:::-;40172:206;40142:236;40167:3;;;;;:::i;:::-;;;;40142:236;;;;39870:515;39823:562::o:0;44842:397::-;44915:13;44949:16;44957:7;44949;:16::i;:::-;44941:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45027:28;45058:10;:8;:10::i;:::-;45027:41;;45079:18;:7;:16;:18::i;:::-;;45146:1;45121:14;45115:28;:32;:116;;;;;;;;;;;;;;;;;45174:14;45190:18;:7;:16;:18::i;:::-;45210:14;45157:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45115:116;45108:123;;;44842:397;;;:::o;44118:93::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44189:14:::1;;;;;;;;;;;44188:15;44171:14;;:32;;;;;;;;;;;;;;;;;;44118:93::o:0;40393:327::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40461:17:::1;40481:19;:9;:17;:19::i;:::-;40461:39;;40527:9;40519:5;:17;40511:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40590:12;40613:9;40605:5;:17;;;;:::i;:::-;40590:32;;40638:9;40650:1;40638:13;;40634:79;40654:4;40652:1;:6;40634:79;;;40679:21;:9;:19;:21::i;:::-;40659:3;;;;;:::i;:::-;;;;40634:79;;;;40450:270;;40393:327:::0;:::o;41257:104::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41348:4:::1;41331:14;:21;;;;;;;;;;;;:::i;:::-;;41257:104:::0;:::o;39354:146::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39424:5:::1;39410:19;;:10;;;;;;;;;;;:19;;;39402:28;;;::::0;::::1;;39454:4;39441:10;;:17;;;;;;;;;;;;;;;;;;39470:22;38594:42;39488:3;39470:9;:22::i;:::-;39354:146::o:0;44420:97::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44502:6:::1;44489:10;:19;;;;44420:97:::0;:::o;42495:185::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42584:9:::1;42579:94;42603:5;:12;42599:1;:16;42579:94;;;42660:1;42637:10;:20;42648:5;42654:1;42648:8;;;;;;;;:::i;:::-;;;;;;;;42637:20;;;;;;;;;;;;;;;:24;;;;42617:3;;;;;:::i;:::-;;;;42579:94;;;;42495:185:::0;:::o;44525:93::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44603:6:::1;44592:8;:17;;;;44525:93:::0;:::o;22791:164::-;22888:4;22912:18;:25;22931:5;22912:25;;;;;;;;;;;;;;;:35;22938:8;22912:35;;;;;;;;;;;;;;;;;;;;;;;;;22905:42;;22791:164;;;;:::o;41906:107::-;41961:7;41988:10;:16;41999:4;41988:16;;;;;;;;;;;;;;;;41981:23;;41906:107;;;:::o;37827:192::-;37158:12;:10;:12::i;:::-;37147:23;;:7;:5;:7::i;:::-;:23;;;37139:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37936:1:::1;37916:22;;:8;:22;;;;37908:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37992:19;38002:8;37992:9;:19::i;:::-;37827:192:::0;:::o;18237:157::-;18322:4;18361:25;18346:40;;;:11;:40;;;;18339:47;;18237:157;;;:::o;25526:127::-;25591:4;25643:1;25615:30;;:7;:16;25623:7;25615:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25608:37;;25526:127;;;:::o;15339:98::-;15392:7;15419:10;15412:17;;15339:98;:::o;29508:174::-;29610:2;29583:15;:24;29599:7;29583:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29666:7;29662:2;29628:46;;29637:23;29652:7;29637:14;:23::i;:::-;29628:46;;;;;;;;;;;;29508:174;;:::o;35424:114::-;35489:7;35516;:14;;;35509:21;;35424:114;;;:::o;43782:302::-;43831:7;43851:21;:9;:19;:21::i;:::-;43883:10;43896:19;:9;:17;:19::i;:::-;43883:32;;43935:3;43929:2;:9;43926:103;;;43955:21;:9;:19;:21::i;:::-;43997:19;:9;:17;:19::i;:::-;43992:24;;43926:103;44039:17;44049:2;44053;44039:9;:17::i;:::-;44074:2;44067:9;;;43782:302;;;:::o;25820:348::-;25913:4;25938:16;25946:7;25938;:16::i;:::-;25930:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26014:13;26030:23;26045:7;26030:14;:23::i;:::-;26014:39;;26083:5;26072:16;;:7;:16;;;:51;;;;26116:7;26092:31;;:20;26104:7;26092:11;:20::i;:::-;:31;;;26072:51;:87;;;;26127:32;26144:5;26151:7;26127:16;:32::i;:::-;26072:87;26064:96;;;25820:348;;;;:::o;28812:578::-;28971:4;28944:31;;:23;28959:7;28944:14;:23::i;:::-;:31;;;28936:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29054:1;29040:16;;:2;:16;;;;29032:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29110:39;29131:4;29137:2;29141:7;29110:20;:39::i;:::-;29214:29;29231:1;29235:7;29214:8;:29::i;:::-;29275:1;29256:9;:15;29266:4;29256:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29304:1;29287:9;:13;29297:2;29287:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29335:2;29316:7;:16;29324:7;29316:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29374:7;29370:2;29355:27;;29364:4;29355:27;;;;;;;;;;;;28812:578;;;:::o;38027:173::-;38083:16;38102:6;;;;;;;;;;;38083:25;;38128:8;38119:6;;:17;;;;;;;;;;;;;;;;;;38183:8;38152:40;;38173:8;38152:40;;;;;;;;;;;;38072:128;38027:173;:::o;35546:127::-;35653:1;35635:7;:14;;;:19;;;;;;;;;;;35546:127;:::o;26510:110::-;26586:26;26596:2;26600:7;26586:26;;;;;;;;;;;;:9;:26::i;:::-;26510:110;;:::o;28115:360::-;28175:13;28191:23;28206:7;28191:14;:23::i;:::-;28175:39;;28227:48;28248:5;28263:1;28267:7;28227:20;:48::i;:::-;28316:29;28333:1;28337:7;28316:8;:29::i;:::-;28378:1;28358:9;:16;28368:5;28358:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28397:7;:16;28405:7;28397:16;;;;;;;;;;;;28390:23;;;;;;;;;;;28459:7;28455:1;28431:36;;28440:5;28431:36;;;;;;;;;;;;28164:311;28115:360;:::o;33538:118::-;33064:8;:6;:8::i;:::-;33063:9;33055:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33608:4:::1;33598:7;;:14;;;;;;;;;;;;;;;;;;33628:20;33635:12;:10;:12::i;:::-;33628:20;;;;;;:::i;:::-;;;;;;;;33538:118::o:0;33797:120::-;33341:8;:6;:8::i;:::-;33333:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33866:5:::1;33856:7;;:15;;;;;;;;;;;;;;;;;;33887:22;33896:12;:10;:12::i;:::-;33887:22;;;;;;:::i;:::-;;;;;;;;33797:120::o:0;24898:315::-;25055:28;25065:4;25071:2;25075:7;25055:9;:28::i;:::-;25102:48;25125:4;25131:2;25135:7;25144:5;25102:22;:48::i;:::-;25094:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24898:315;;;;:::o;40933:103::-;40985:13;41018:10;41011:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40933:103;:::o;15779:723::-;15835:13;16065:1;16056:5;:10;16052:53;;;16083:10;;;;;;;;;;;;;;;;;;;;;16052:53;16115:12;16130:5;16115:20;;16146:14;16171:78;16186:1;16178:4;:9;16171:78;;16204:8;;;;;:::i;:::-;;;;16235:2;16227:10;;;;;:::i;:::-;;;16171:78;;;16259:19;16291:6;16281:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16259:39;;16309:154;16325:1;16316:5;:10;16309:154;;16353:1;16343:11;;;;;:::i;:::-;;;16420:2;16412:5;:10;;;;:::i;:::-;16399:2;:24;;;;:::i;:::-;16386:39;;16369:6;16376;16369:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16449:2;16440:11;;;;;:::i;:::-;;;16309:154;;;16487:6;16473:21;;;;;15779:723;;;;:::o;45593:292::-;45759:1;45743:18;;:4;:18;;;45741:21;:43;;;;;45776:7;:5;:7::i;:::-;45768:15;;:4;:15;;;45766:18;45741:43;45737:141;;;45810:8;:6;:8::i;:::-;45809:9;45801:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45737:141;45593:292;;;:::o;26847:321::-;26977:18;26983:2;26987:7;26977:5;:18::i;:::-;27028:54;27059:1;27063:2;27067:7;27076:5;27028:22;:54::i;:::-;27006:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26847:321;;;:::o;30247:803::-;30402:4;30423:15;:2;:13;;;:15::i;:::-;30419:624;;;30475:2;30459:36;;;30496:12;:10;:12::i;:::-;30510:4;30516:7;30525:5;30459:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30455:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30722:1;30705:6;:13;:18;30701:272;;;30748:60;;;;;;;;;;:::i;:::-;;;;;;;;30701:272;30923:6;30917:13;30908:6;30904:2;30900:15;30893:38;30455:533;30592:45;;;30582:55;;;:6;:55;;;;30575:62;;;;;30419:624;31027:4;31020:11;;30247:803;;;;;;;:::o;27504:382::-;27598:1;27584:16;;:2;:16;;;;27576:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27657:16;27665:7;27657;:16::i;:::-;27656:17;27648:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27719:45;27748:1;27752:2;27756:7;27719:20;:45::i;:::-;27794:1;27777:9;:13;27787:2;27777:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27825:2;27806:7;:16;27814:7;27806:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27870:7;27866:2;27845:33;;27862:1;27845:33;;;;;;;;;;;;27504:382;;:::o;7686:387::-;7746:4;7954:12;8021:7;8009:20;8001:28;;8064:1;8057:4;:8;8050:15;;;7686:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:143::-;1788:5;1819:6;1813:13;1804:22;;1835:33;1862:5;1835:33;:::i;:::-;1731:143;;;;:::o;1897:370::-;1968:5;2017:3;2010:4;2002:6;1998:17;1994:27;1984:122;;2025:79;;:::i;:::-;1984:122;2142:6;2129:20;2167:94;2257:3;2249:6;2242:4;2234:6;2230:17;2167:94;:::i;:::-;2158:103;;1974:293;1897:370;;;;:::o;2273:133::-;2316:5;2354:6;2341:20;2332:29;;2370:30;2394:5;2370:30;:::i;:::-;2273:133;;;;:::o;2412:137::-;2457:5;2495:6;2482:20;2473:29;;2511:32;2537:5;2511:32;:::i;:::-;2412:137;;;;:::o;2555:141::-;2611:5;2642:6;2636:13;2627:22;;2658:32;2684:5;2658:32;:::i;:::-;2555:141;;;;:::o;2715:338::-;2770:5;2819:3;2812:4;2804:6;2800:17;2796:27;2786:122;;2827:79;;:::i;:::-;2786:122;2944:6;2931:20;2969:78;3043:3;3035:6;3028:4;3020:6;3016:17;2969:78;:::i;:::-;2960:87;;2776:277;2715:338;;;;:::o;3073:340::-;3129:5;3178:3;3171:4;3163:6;3159:17;3155:27;3145:122;;3186:79;;:::i;:::-;3145:122;3303:6;3290:20;3328:79;3403:3;3395:6;3388:4;3380:6;3376:17;3328:79;:::i;:::-;3319:88;;3135:278;3073:340;;;;:::o;3419:139::-;3465:5;3503:6;3490:20;3481:29;;3519:33;3546:5;3519:33;:::i;:::-;3419:139;;;;:::o;3564:329::-;3623:6;3672:2;3660:9;3651:7;3647:23;3643:32;3640:119;;;3678:79;;:::i;:::-;3640:119;3798:1;3823:53;3868:7;3859:6;3848:9;3844:22;3823:53;:::i;:::-;3813:63;;3769:117;3564:329;;;;:::o;3899:351::-;3969:6;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:64;4225:7;4216:6;4205:9;4201:22;4169:64;:::i;:::-;4159:74;;4115:128;3899:351;;;;:::o;4256:474::-;4324:6;4332;4381:2;4369:9;4360:7;4356:23;4352:32;4349:119;;;4387:79;;:::i;:::-;4349:119;4507:1;4532:53;4577:7;4568:6;4557:9;4553:22;4532:53;:::i;:::-;4522:63;;4478:117;4634:2;4660:53;4705:7;4696:6;4685:9;4681:22;4660:53;:::i;:::-;4650:63;;4605:118;4256:474;;;;;:::o;4736:619::-;4813:6;4821;4829;4878:2;4866:9;4857:7;4853:23;4849:32;4846:119;;;4884:79;;:::i;:::-;4846:119;5004:1;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4975:117;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;5259:2;5285:53;5330:7;5321:6;5310:9;5306:22;5285:53;:::i;:::-;5275:63;;5230:118;4736:619;;;;;:::o;5361:943::-;5456:6;5464;5472;5480;5529:3;5517:9;5508:7;5504:23;5500:33;5497:120;;;5536:79;;:::i;:::-;5497:120;5656:1;5681:53;5726:7;5717:6;5706:9;5702:22;5681:53;:::i;:::-;5671:63;;5627:117;5783:2;5809:53;5854:7;5845:6;5834:9;5830:22;5809:53;:::i;:::-;5799:63;;5754:118;5911:2;5937:53;5982:7;5973:6;5962:9;5958:22;5937:53;:::i;:::-;5927:63;;5882:118;6067:2;6056:9;6052:18;6039:32;6098:18;6090:6;6087:30;6084:117;;;6120:79;;:::i;:::-;6084:117;6225:62;6279:7;6270:6;6259:9;6255:22;6225:62;:::i;:::-;6215:72;;6010:287;5361:943;;;;;;;:::o;6310:468::-;6375:6;6383;6432:2;6420:9;6411:7;6407:23;6403:32;6400:119;;;6438:79;;:::i;:::-;6400:119;6558:1;6583:53;6628:7;6619:6;6608:9;6604:22;6583:53;:::i;:::-;6573:63;;6529:117;6685:2;6711:50;6753:7;6744:6;6733:9;6729:22;6711:50;:::i;:::-;6701:60;;6656:115;6310:468;;;;;:::o;6784:474::-;6852:6;6860;6909:2;6897:9;6888:7;6884:23;6880:32;6877:119;;;6915:79;;:::i;:::-;6877:119;7035:1;7060:53;7105:7;7096:6;7085:9;7081:22;7060:53;:::i;:::-;7050:63;;7006:117;7162:2;7188:53;7233:7;7224:6;7213:9;7209:22;7188:53;:::i;:::-;7178:63;;7133:118;6784:474;;;;;:::o;7264:539::-;7348:6;7397:2;7385:9;7376:7;7372:23;7368:32;7365:119;;;7403:79;;:::i;:::-;7365:119;7551:1;7540:9;7536:17;7523:31;7581:18;7573:6;7570:30;7567:117;;;7603:79;;:::i;:::-;7567:117;7708:78;7778:7;7769:6;7758:9;7754:22;7708:78;:::i;:::-;7698:88;;7494:302;7264:539;;;;:::o;7809:327::-;7867:6;7916:2;7904:9;7895:7;7891:23;7887:32;7884:119;;;7922:79;;:::i;:::-;7884:119;8042:1;8067:52;8111:7;8102:6;8091:9;8087:22;8067:52;:::i;:::-;8057:62;;8013:116;7809:327;;;;:::o;8142:349::-;8211:6;8260:2;8248:9;8239:7;8235:23;8231:32;8228:119;;;8266:79;;:::i;:::-;8228:119;8386:1;8411:63;8466:7;8457:6;8446:9;8442:22;8411:63;:::i;:::-;8401:73;;8357:127;8142:349;;;;:::o;8497:509::-;8566:6;8615:2;8603:9;8594:7;8590:23;8586:32;8583:119;;;8621:79;;:::i;:::-;8583:119;8769:1;8758:9;8754:17;8741:31;8799:18;8791:6;8788:30;8785:117;;;8821:79;;:::i;:::-;8785:117;8926:63;8981:7;8972:6;8961:9;8957:22;8926:63;:::i;:::-;8916:73;;8712:287;8497:509;;;;:::o;9012:329::-;9071:6;9120:2;9108:9;9099:7;9095:23;9091:32;9088:119;;;9126:79;;:::i;:::-;9088:119;9246:1;9271:53;9316:7;9307:6;9296:9;9292:22;9271:53;:::i;:::-;9261:63;;9217:117;9012:329;;;;:::o;9347:118::-;9434:24;9452:5;9434:24;:::i;:::-;9429:3;9422:37;9347:118;;:::o;9471:109::-;9552:21;9567:5;9552:21;:::i;:::-;9547:3;9540:34;9471:109;;:::o;9586:360::-;9672:3;9700:38;9732:5;9700:38;:::i;:::-;9754:70;9817:6;9812:3;9754:70;:::i;:::-;9747:77;;9833:52;9878:6;9873:3;9866:4;9859:5;9855:16;9833:52;:::i;:::-;9910:29;9932:6;9910:29;:::i;:::-;9905:3;9901:39;9894:46;;9676:270;9586:360;;;;:::o;9952:364::-;10040:3;10068:39;10101:5;10068:39;:::i;:::-;10123:71;10187:6;10182:3;10123:71;:::i;:::-;10116:78;;10203:52;10248:6;10243:3;10236:4;10229:5;10225:16;10203:52;:::i;:::-;10280:29;10302:6;10280:29;:::i;:::-;10275:3;10271:39;10264:46;;10044:272;9952:364;;;;:::o;10322:377::-;10428:3;10456:39;10489:5;10456:39;:::i;:::-;10511:89;10593:6;10588:3;10511:89;:::i;:::-;10504:96;;10609:52;10654:6;10649:3;10642:4;10635:5;10631:16;10609:52;:::i;:::-;10686:6;10681:3;10677:16;10670:23;;10432:267;10322:377;;;;:::o;10729:845::-;10832:3;10869:5;10863:12;10898:36;10924:9;10898:36;:::i;:::-;10950:89;11032:6;11027:3;10950:89;:::i;:::-;10943:96;;11070:1;11059:9;11055:17;11086:1;11081:137;;;;11232:1;11227:341;;;;11048:520;;11081:137;11165:4;11161:9;11150;11146:25;11141:3;11134:38;11201:6;11196:3;11192:16;11185:23;;11081:137;;11227:341;11294:38;11326:5;11294:38;:::i;:::-;11354:1;11368:154;11382:6;11379:1;11376:13;11368:154;;;11456:7;11450:14;11446:1;11441:3;11437:11;11430:35;11506:1;11497:7;11493:15;11482:26;;11404:4;11401:1;11397:12;11392:17;;11368:154;;;11551:6;11546:3;11542:16;11535:23;;11234:334;;11048:520;;10836:738;;10729:845;;;;:::o;11580:366::-;11722:3;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11819:93;11908:3;11819:93;:::i;:::-;11937:2;11932:3;11928:12;11921:19;;11580:366;;;:::o;11952:::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;11952:366;;;:::o;12324:::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12324:366;;;:::o;12696:::-;12838:3;12859:67;12923:2;12918:3;12859:67;:::i;:::-;12852:74;;12935:93;13024:3;12935:93;:::i;:::-;13053:2;13048:3;13044:12;13037:19;;12696:366;;;:::o;13068:::-;13210:3;13231:67;13295:2;13290:3;13231:67;:::i;:::-;13224:74;;13307:93;13396:3;13307:93;:::i;:::-;13425:2;13420:3;13416:12;13409:19;;13068:366;;;:::o;13440:::-;13582:3;13603:67;13667:2;13662:3;13603:67;:::i;:::-;13596:74;;13679:93;13768:3;13679:93;:::i;:::-;13797:2;13792:3;13788:12;13781:19;;13440:366;;;:::o;13812:::-;13954:3;13975:67;14039:2;14034:3;13975:67;:::i;:::-;13968:74;;14051:93;14140:3;14051:93;:::i;:::-;14169:2;14164:3;14160:12;14153:19;;13812:366;;;:::o;14184:::-;14326:3;14347:67;14411:2;14406:3;14347:67;:::i;:::-;14340:74;;14423:93;14512:3;14423:93;:::i;:::-;14541:2;14536:3;14532:12;14525:19;;14184:366;;;:::o;14556:::-;14698:3;14719:67;14783:2;14778:3;14719:67;:::i;:::-;14712:74;;14795:93;14884:3;14795:93;:::i;:::-;14913:2;14908:3;14904:12;14897:19;;14556:366;;;:::o;14928:::-;15070:3;15091:67;15155:2;15150:3;15091:67;:::i;:::-;15084:74;;15167:93;15256:3;15167:93;:::i;:::-;15285:2;15280:3;15276:12;15269:19;;14928:366;;;:::o;15300:::-;15442:3;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15539:93;15628:3;15539:93;:::i;:::-;15657:2;15652:3;15648:12;15641:19;;15300:366;;;:::o;15672:::-;15814:3;15835:67;15899:2;15894:3;15835:67;:::i;:::-;15828:74;;15911:93;16000:3;15911:93;:::i;:::-;16029:2;16024:3;16020:12;16013:19;;15672:366;;;:::o;16044:::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16044:366;;;:::o;16416:::-;16558:3;16579:67;16643:2;16638:3;16579:67;:::i;:::-;16572:74;;16655:93;16744:3;16655:93;:::i;:::-;16773:2;16768:3;16764:12;16757:19;;16416:366;;;:::o;16788:::-;16930:3;16951:67;17015:2;17010:3;16951:67;:::i;:::-;16944:74;;17027:93;17116:3;17027:93;:::i;:::-;17145:2;17140:3;17136:12;17129:19;;16788:366;;;:::o;17160:::-;17302:3;17323:67;17387:2;17382:3;17323:67;:::i;:::-;17316:74;;17399:93;17488:3;17399:93;:::i;:::-;17517:2;17512:3;17508:12;17501:19;;17160:366;;;:::o;17532:::-;17674:3;17695:67;17759:2;17754:3;17695:67;:::i;:::-;17688:74;;17771:93;17860:3;17771:93;:::i;:::-;17889:2;17884:3;17880:12;17873:19;;17532:366;;;:::o;17904:::-;18046:3;18067:67;18131:2;18126:3;18067:67;:::i;:::-;18060:74;;18143:93;18232:3;18143:93;:::i;:::-;18261:2;18256:3;18252:12;18245:19;;17904:366;;;:::o;18276:::-;18418:3;18439:67;18503:2;18498:3;18439:67;:::i;:::-;18432:74;;18515:93;18604:3;18515:93;:::i;:::-;18633:2;18628:3;18624:12;18617:19;;18276:366;;;:::o;18648:::-;18790:3;18811:67;18875:2;18870:3;18811:67;:::i;:::-;18804:74;;18887:93;18976:3;18887:93;:::i;:::-;19005:2;19000:3;18996:12;18989:19;;18648:366;;;:::o;19020:::-;19162:3;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19259:93;19348:3;19259:93;:::i;:::-;19377:2;19372:3;19368:12;19361:19;;19020:366;;;:::o;19392:118::-;19479:24;19497:5;19479:24;:::i;:::-;19474:3;19467:37;19392:118;;:::o;19516:589::-;19741:3;19763:95;19854:3;19845:6;19763:95;:::i;:::-;19756:102;;19875:95;19966:3;19957:6;19875:95;:::i;:::-;19868:102;;19987:92;20075:3;20066:6;19987:92;:::i;:::-;19980:99;;20096:3;20089:10;;19516:589;;;;;;:::o;20111:222::-;20204:4;20242:2;20231:9;20227:18;20219:26;;20255:71;20323:1;20312:9;20308:17;20299:6;20255:71;:::i;:::-;20111:222;;;;:::o;20339:640::-;20534:4;20572:3;20561:9;20557:19;20549:27;;20586:71;20654:1;20643:9;20639:17;20630:6;20586:71;:::i;:::-;20667:72;20735:2;20724:9;20720:18;20711:6;20667:72;:::i;:::-;20749;20817:2;20806:9;20802:18;20793:6;20749:72;:::i;:::-;20868:9;20862:4;20858:20;20853:2;20842:9;20838:18;20831:48;20896:76;20967:4;20958:6;20896:76;:::i;:::-;20888:84;;20339:640;;;;;;;:::o;20985:210::-;21072:4;21110:2;21099:9;21095:18;21087:26;;21123:65;21185:1;21174:9;21170:17;21161:6;21123:65;:::i;:::-;20985:210;;;;:::o;21201:313::-;21314:4;21352:2;21341:9;21337:18;21329:26;;21401:9;21395:4;21391:20;21387:1;21376:9;21372:17;21365:47;21429:78;21502:4;21493:6;21429:78;:::i;:::-;21421:86;;21201:313;;;;:::o;21520:419::-;21686:4;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21520:419;;;:::o;21945:::-;22111:4;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:131;22352:4;22226:131;:::i;:::-;22218:139;;21945:419;;;:::o;22370:::-;22536:4;22574:2;22563:9;22559:18;22551:26;;22623:9;22617:4;22613:20;22609:1;22598:9;22594:17;22587:47;22651:131;22777:4;22651:131;:::i;:::-;22643:139;;22370:419;;;:::o;22795:::-;22961:4;22999:2;22988:9;22984:18;22976:26;;23048:9;23042:4;23038:20;23034:1;23023:9;23019:17;23012:47;23076:131;23202:4;23076:131;:::i;:::-;23068:139;;22795:419;;;:::o;23220:::-;23386:4;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23220:419;;;:::o;23645:::-;23811:4;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23645:419;;;:::o;24070:::-;24236:4;24274:2;24263:9;24259:18;24251:26;;24323:9;24317:4;24313:20;24309:1;24298:9;24294:17;24287:47;24351:131;24477:4;24351:131;:::i;:::-;24343:139;;24070:419;;;:::o;24495:::-;24661:4;24699:2;24688:9;24684:18;24676:26;;24748:9;24742:4;24738:20;24734:1;24723:9;24719:17;24712:47;24776:131;24902:4;24776:131;:::i;:::-;24768:139;;24495:419;;;:::o;24920:::-;25086:4;25124:2;25113:9;25109:18;25101:26;;25173:9;25167:4;25163:20;25159:1;25148:9;25144:17;25137:47;25201:131;25327:4;25201:131;:::i;:::-;25193:139;;24920:419;;;:::o;25345:::-;25511:4;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25345:419;;;:::o;25770:::-;25936:4;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25770:419;;;:::o;26195:::-;26361:4;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26195:419;;;:::o;26620:::-;26786:4;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26620:419;;;:::o;27045:::-;27211:4;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27045:419;;;:::o;27470:::-;27636:4;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27470:419;;;:::o;27895:::-;28061:4;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;27895:419;;;:::o;28320:::-;28486:4;28524:2;28513:9;28509:18;28501:26;;28573:9;28567:4;28563:20;28559:1;28548:9;28544:17;28537:47;28601:131;28727:4;28601:131;:::i;:::-;28593:139;;28320:419;;;:::o;28745:::-;28911:4;28949:2;28938:9;28934:18;28926:26;;28998:9;28992:4;28988:20;28984:1;28973:9;28969:17;28962:47;29026:131;29152:4;29026:131;:::i;:::-;29018:139;;28745:419;;;:::o;29170:::-;29336:4;29374:2;29363:9;29359:18;29351:26;;29423:9;29417:4;29413:20;29409:1;29398:9;29394:17;29387:47;29451:131;29577:4;29451:131;:::i;:::-;29443:139;;29170:419;;;:::o;29595:::-;29761:4;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:131;30002:4;29876:131;:::i;:::-;29868:139;;29595:419;;;:::o;30020:::-;30186:4;30224:2;30213:9;30209:18;30201:26;;30273:9;30267:4;30263:20;30259:1;30248:9;30244:17;30237:47;30301:131;30427:4;30301:131;:::i;:::-;30293:139;;30020:419;;;:::o;30445:222::-;30538:4;30576:2;30565:9;30561:18;30553:26;;30589:71;30657:1;30646:9;30642:17;30633:6;30589:71;:::i;:::-;30445:222;;;;:::o;30673:129::-;30707:6;30734:20;;:::i;:::-;30724:30;;30763:33;30791:4;30783:6;30763:33;:::i;:::-;30673:129;;;:::o;30808:75::-;30841:6;30874:2;30868:9;30858:19;;30808:75;:::o;30889:311::-;30966:4;31056:18;31048:6;31045:30;31042:56;;;31078:18;;:::i;:::-;31042:56;31128:4;31120:6;31116:17;31108:25;;31188:4;31182;31178:15;31170:23;;30889:311;;;:::o;31206:307::-;31267:4;31357:18;31349:6;31346:30;31343:56;;;31379:18;;:::i;:::-;31343:56;31417:29;31439:6;31417:29;:::i;:::-;31409:37;;31501:4;31495;31491:15;31483:23;;31206:307;;;:::o;31519:308::-;31581:4;31671:18;31663:6;31660:30;31657:56;;;31693:18;;:::i;:::-;31657:56;31731:29;31753:6;31731:29;:::i;:::-;31723:37;;31815:4;31809;31805:15;31797:23;;31519:308;;;:::o;31833:141::-;31882:4;31905:3;31897:11;;31928:3;31925:1;31918:14;31962:4;31959:1;31949:18;31941:26;;31833:141;;;:::o;31980:98::-;32031:6;32065:5;32059:12;32049:22;;31980:98;;;:::o;32084:99::-;32136:6;32170:5;32164:12;32154:22;;32084:99;;;:::o;32189:168::-;32272:11;32306:6;32301:3;32294:19;32346:4;32341:3;32337:14;32322:29;;32189:168;;;;:::o;32363:169::-;32447:11;32481:6;32476:3;32469:19;32521:4;32516:3;32512:14;32497:29;;32363:169;;;;:::o;32538:148::-;32640:11;32677:3;32662:18;;32538:148;;;;:::o;32692:305::-;32732:3;32751:20;32769:1;32751:20;:::i;:::-;32746:25;;32785:20;32803:1;32785:20;:::i;:::-;32780:25;;32939:1;32871:66;32867:74;32864:1;32861:81;32858:107;;;32945:18;;:::i;:::-;32858:107;32989:1;32986;32982:9;32975:16;;32692:305;;;;:::o;33003:185::-;33043:1;33060:20;33078:1;33060:20;:::i;:::-;33055:25;;33094:20;33112:1;33094:20;:::i;:::-;33089:25;;33133:1;33123:35;;33138:18;;:::i;:::-;33123:35;33180:1;33177;33173:9;33168:14;;33003:185;;;;:::o;33194:348::-;33234:7;33257:20;33275:1;33257:20;:::i;:::-;33252:25;;33291:20;33309:1;33291:20;:::i;:::-;33286:25;;33479:1;33411:66;33407:74;33404:1;33401:81;33396:1;33389:9;33382:17;33378:105;33375:131;;;33486:18;;:::i;:::-;33375:131;33534:1;33531;33527:9;33516:20;;33194:348;;;;:::o;33548:191::-;33588:4;33608:20;33626:1;33608:20;:::i;:::-;33603:25;;33642:20;33660:1;33642:20;:::i;:::-;33637:25;;33681:1;33678;33675:8;33672:34;;;33686:18;;:::i;:::-;33672:34;33731:1;33728;33724:9;33716:17;;33548:191;;;;:::o;33745:96::-;33782:7;33811:24;33829:5;33811:24;:::i;:::-;33800:35;;33745:96;;;:::o;33847:90::-;33881:7;33924:5;33917:13;33910:21;33899:32;;33847:90;;;:::o;33943:149::-;33979:7;34019:66;34012:5;34008:78;33997:89;;33943:149;;;:::o;34098:126::-;34135:7;34175:42;34168:5;34164:54;34153:65;;34098:126;;;:::o;34230:77::-;34267:7;34296:5;34285:16;;34230:77;;;:::o;34313:154::-;34397:6;34392:3;34387;34374:30;34459:1;34450:6;34445:3;34441:16;34434:27;34313:154;;;:::o;34473:307::-;34541:1;34551:113;34565:6;34562:1;34559:13;34551:113;;;34650:1;34645:3;34641:11;34635:18;34631:1;34626:3;34622:11;34615:39;34587:2;34584:1;34580:10;34575:15;;34551:113;;;34682:6;34679:1;34676:13;34673:101;;;34762:1;34753:6;34748:3;34744:16;34737:27;34673:101;34522:258;34473:307;;;:::o;34786:320::-;34830:6;34867:1;34861:4;34857:12;34847:22;;34914:1;34908:4;34904:12;34935:18;34925:81;;34991:4;34983:6;34979:17;34969:27;;34925:81;35053:2;35045:6;35042:14;35022:18;35019:38;35016:84;;;35072:18;;:::i;:::-;35016:84;34837:269;34786:320;;;:::o;35112:281::-;35195:27;35217:4;35195:27;:::i;:::-;35187:6;35183:40;35325:6;35313:10;35310:22;35289:18;35277:10;35274:34;35271:62;35268:88;;;35336:18;;:::i;:::-;35268:88;35376:10;35372:2;35365:22;35155:238;35112:281;;:::o;35399:233::-;35438:3;35461:24;35479:5;35461:24;:::i;:::-;35452:33;;35507:66;35500:5;35497:77;35494:103;;;35577:18;;:::i;:::-;35494:103;35624:1;35617:5;35613:13;35606:20;;35399:233;;;:::o;35638:176::-;35670:1;35687:20;35705:1;35687:20;:::i;:::-;35682:25;;35721:20;35739:1;35721:20;:::i;:::-;35716:25;;35760:1;35750:35;;35765:18;;:::i;:::-;35750:35;35806:1;35803;35799:9;35794:14;;35638:176;;;;:::o;35820:180::-;35868:77;35865:1;35858:88;35965:4;35962:1;35955:15;35989:4;35986:1;35979:15;36006:180;36054:77;36051:1;36044:88;36151:4;36148:1;36141:15;36175:4;36172:1;36165:15;36192:180;36240:77;36237:1;36230:88;36337:4;36334:1;36327:15;36361:4;36358:1;36351:15;36378:180;36426:77;36423:1;36416:88;36523:4;36520:1;36513:15;36547:4;36544:1;36537:15;36564:180;36612:77;36609:1;36602:88;36709:4;36706:1;36699:15;36733:4;36730:1;36723:15;36750:117;36859:1;36856;36849:12;36873:117;36982:1;36979;36972:12;36996:117;37105:1;37102;37095:12;37119:117;37228:1;37225;37218:12;37242:117;37351:1;37348;37341:12;37365:102;37406:6;37457:2;37453:7;37448:2;37441:5;37437:14;37433:28;37423:38;;37365:102;;;:::o;37473:230::-;37613:34;37609:1;37601:6;37597:14;37590:58;37682:13;37677:2;37669:6;37665:15;37658:38;37473:230;:::o;37709:170::-;37849:22;37845:1;37837:6;37833:14;37826:46;37709:170;:::o;37885:237::-;38025:34;38021:1;38013:6;38009:14;38002:58;38094:20;38089:2;38081:6;38077:15;38070:45;37885:237;:::o;38128:225::-;38268:34;38264:1;38256:6;38252:14;38245:58;38337:8;38332:2;38324:6;38320:15;38313:33;38128:225;:::o;38359:::-;38499:34;38495:1;38487:6;38483:14;38476:58;38568:8;38563:2;38555:6;38551:15;38544:33;38359:225;:::o;38590:178::-;38730:30;38726:1;38718:6;38714:14;38707:54;38590:178;:::o;38774:223::-;38914:34;38910:1;38902:6;38898:14;38891:58;38983:6;38978:2;38970:6;38966:15;38959:31;38774:223;:::o;39003:175::-;39143:27;39139:1;39131:6;39127:14;39120:51;39003:175;:::o;39184:231::-;39324:34;39320:1;39312:6;39308:14;39301:58;39393:14;39388:2;39380:6;39376:15;39369:39;39184:231;:::o;39421:236::-;39561:34;39557:1;39549:6;39545:14;39538:58;39630:19;39625:2;39617:6;39613:15;39606:44;39421:236;:::o;39663:166::-;39803:18;39799:1;39791:6;39787:14;39780:42;39663:166;:::o;39835:243::-;39975:34;39971:1;39963:6;39959:14;39952:58;40044:26;40039:2;40031:6;40027:15;40020:51;39835:243;:::o;40084:229::-;40224:34;40220:1;40212:6;40208:14;40201:58;40293:12;40288:2;40280:6;40276:15;40269:37;40084:229;:::o;40319:228::-;40459:34;40455:1;40447:6;40443:14;40436:58;40528:11;40523:2;40515:6;40511:15;40504:36;40319:228;:::o;40553:182::-;40693:34;40689:1;40681:6;40677:14;40670:58;40553:182;:::o;40741:231::-;40881:34;40877:1;40869:6;40865:14;40858:58;40950:14;40945:2;40937:6;40933:15;40926:39;40741:231;:::o;40978:182::-;41118:34;41114:1;41106:6;41102:14;41095:58;40978:182;:::o;41166:228::-;41306:34;41302:1;41294:6;41290:14;41283:58;41375:11;41370:2;41362:6;41358:15;41351:36;41166:228;:::o;41400:234::-;41540:34;41536:1;41528:6;41524:14;41517:58;41609:17;41604:2;41596:6;41592:15;41585:42;41400:234;:::o;41640:220::-;41780:34;41776:1;41768:6;41764:14;41757:58;41849:3;41844:2;41836:6;41832:15;41825:28;41640:220;:::o;41866:236::-;42006:34;42002:1;41994:6;41990:14;41983:58;42075:19;42070:2;42062:6;42058:15;42051:44;41866:236;:::o;42108:122::-;42181:24;42199:5;42181:24;:::i;:::-;42174:5;42171:35;42161:63;;42220:1;42217;42210:12;42161:63;42108:122;:::o;42236:116::-;42306:21;42321:5;42306:21;:::i;:::-;42299:5;42296:32;42286:60;;42342:1;42339;42332:12;42286:60;42236:116;:::o;42358:120::-;42430:23;42447:5;42430:23;:::i;:::-;42423:5;42420:34;42410:62;;42468:1;42465;42458:12;42410:62;42358:120;:::o;42484:122::-;42557:24;42575:5;42557:24;:::i;:::-;42550:5;42547:35;42537:63;;42596:1;42593;42586:12;42537:63;42484:122;:::o

Swarm Source

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