ETH Price: $3,689.30 (+3.36%)

Token

CROAKZ (CROAKZ)
 

Overview

Max Total Supply

6,996 CROAKZ

Holders

3,251

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
havanacigar.eth
Balance
4 CROAKZ
0xF38F67D8b16752b18f7358ef216A35423E45F806
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CROAKZ are a collection of 6969 small amphibious creatures that vibe in a bog and croak at the moon. Each CROAK has a crafted feel of excellence, and displays an artistry that fills the imagination with wonder. Some of them can be licked, but of course caution is recommended.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Croakz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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


pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


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



pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File contracts/libs/ECRecoverLib.sol


pragma solidity <0.9.0;

library ECRecoverLib {
    string private constant REQUIRED_SIG_HEADER = "\x19Ethereum Signed Message:\n32";

    struct ECDSAVariables {
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    function verifySig(
        ECDSAVariables memory self,
        address signer,
        bytes32 signerHash
    ) internal pure {
        require(
            signer ==
                ecrecover(
                    keccak256(abi.encodePacked(REQUIRED_SIG_HEADER, signerHash)),
                    self.v,
                    self.r,
                    self.s
                ),
            "Invalid Signature"
        );
    }
}


// File contracts/Croakz.sol

pragma solidity ^0.8.4;






contract Croakz is ERC721Enumerable, PaymentSplitter, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    using ECRecoverLib for ECRecoverLib.ECDSAVariables;
    
    Counters.Counter private _tokenIds;
    Counters.Counter private _specialTokenIds;

    uint256 private constant maxTokens = 6969;
    uint256 private constant maxMintsPerTx = 10;
    uint256 private constant maxMintsPerAddr = 20;
    uint256 private constant mintPrice = 0.069 ether;
    uint8 private constant maxPresaleMintPerAddr = 3;
    mapping (address => uint8) private _mintsPerAddress;


    address crypToadzAddr; // 0x1CB1A5e65610AEFF2551A50f76a87a7d3fB649C6;
    address signingAuth;

    // 0 = DEV, 1 = PRESALE, 2 = PUBLIC, 3 = CLOSED
    uint8 private mintPhase = 0;

    bool private devMintLocked = false;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURIextended;

    constructor(string memory name, string memory symbol, address[] memory payees, uint256[] memory shares_) ERC721(name, symbol) PaymentSplitter(payees, shares_) {

    }

    function setCrypToadzAddress(address _crypToadzAddr) external onlyOwner {
        crypToadzAddr = _crypToadzAddr;
    }

    function setSigningAuth(address _signingAuth) external onlyOwner {
        signingAuth = _signingAuth;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }
    
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();
        
        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function _isHolder(address _wallet) internal view returns (bool) {
        ERC721 cryptoadzToken = ERC721(crypToadzAddr);
        uint256 _quantityHeld = cryptoadzToken.balanceOf(_wallet);
        return _quantityHeld > 0;
    }

    function changeMintPhase(uint8 _mintPhase) public onlyOwner {
        require(_mintPhase > mintPhase, "No back-stepping!");
        require(_mintPhase <= 3, "Final phase is CLOSED");
        mintPhase = _mintPhase;
    }

    function getMintPhase() public view returns (uint8) {
        return mintPhase;
    }

    function mint(uint256 quantity) internal {
        require(mintPhase == 1 || mintPhase == 2, "Minting is not open.");
        require(msg.sender == tx.origin, "No contracts!");
        require(msg.value >= mintPrice * quantity, "Not enough ether sent!");
        require(_tokenIds.current() + quantity <= maxTokens, "Minting this many would exceed supply!");

        if (mintPhase == 1) { // Holder Mint or WL
            require(_mintsPerAddress[msg.sender] + quantity <= maxPresaleMintPerAddr, "Presale cannot mint more than 3 CROAKZ!");
        } else { // Public Mint
            require(quantity <= maxMintsPerTx, "There is a limit on minting too many at a time!");
            require(this.balanceOf(msg.sender) + quantity <= maxMintsPerAddr, "Minting this many would exceed max mints per address!");
        }

        for (uint256 i = 0; i < quantity; i++) {
            _tokenIds.increment();
            _mintsPerAddress[msg.sender]++;
            _safeMint(msg.sender, _tokenIds.current());
        }
    }

    function toadMint(uint256 quantity) external payable {
        bool isHolder = _isHolder(msg.sender);
        require(isHolder, "Must own at least one CryptoToadz to mint in the presale!");
        mint(quantity);
    }

    function wlMint(uint256 quantity, ECRecoverLib.ECDSAVariables memory wlECDSA) external payable {
        // Prove to contract that seller is WL
        bytes32 senderHash = keccak256(abi.encodePacked(msg.sender));
        wlECDSA.verifySig(signingAuth, senderHash);
        mint(quantity);
    }

    function publicMint(uint256 quantity) external payable {
        require(mintPhase == 2, "Minting is not open to public.");
        mint(quantity);
    }

    // dev mint special 1/1s
    function mintSpecial(address [] memory recipients) external onlyOwner {        
        require(!devMintLocked, "Dev Mint Permanently Locked");
        for (uint256 i = 0; i < recipients.length; i++) {
            _specialTokenIds.increment();
            _safeMint(recipients[i], _specialTokenIds.current() * 1000000);
        }
    }

    function lockDevMint() public onlyOwner {
        devMintLocked = true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"uint8","name":"_mintPhase","type":"uint8"}],"name":"changeMintPhase","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":[],"name":"getMintPhase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDevMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintSpecial","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crypToadzAddr","type":"address"}],"name":"setCrypToadzAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signingAuth","type":"address"}],"name":"setSigningAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"toadMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ECRecoverLib.ECDSAVariables","name":"wlECDSA","type":"tuple"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006014806101000a81548160ff021916908360ff1602179055506000601460156101000a81548160ff0219169083151502179055503480156200004757600080fd5b50604051620067be380380620067be83398181016040528101906200006d91906200078f565b81818585816000908051906020019062000089929190620004d7565b508060019080519060200190620000a2929190620004d7565b5050508051825114620000ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e390620009b1565b60405180910390fd5b600082511162000133576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012a90620009f5565b60405180910390fd5b60005b8251811015620001a2576200018c8382815181106200015a576200015962000cf0565b5b602002602001015183838151811062000178576200017762000cf0565b5b6020026020010151620001cf60201b60201c565b8080620001999062000c44565b91505062000136565b505050620001c5620001b96200040960201b60201c565b6200041160201b60201c565b5050505062000eeb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000239906200098f565b60405180910390fd5b6000811162000288576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027f9062000a17565b60405180910390fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200030d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030490620009d3565b60405180910390fd5b600e829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a54620003c4919062000b07565b600a819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620003fd92919062000962565b60405180910390a15050565b600033905090565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004e59062000bd8565b90600052602060002090601f01602090048101928262000509576000855562000555565b82601f106200052457805160ff191683800117855562000555565b8280016001018555821562000555579182015b828111156200055457825182559160200191906001019062000537565b5b50905062000564919062000568565b5090565b5b808211156200058357600081600090555060010162000569565b5090565b60006200059e620005988462000a62565b62000a39565b90508083825260208201905082856020860282011115620005c457620005c362000d53565b5b60005b85811015620005f85781620005dd8882620006c8565b845260208401935060208301925050600181019050620005c7565b5050509392505050565b600062000619620006138462000a91565b62000a39565b905080838252602082019050828560208602820111156200063f576200063e62000d53565b5b60005b8581101562000673578162000658888262000778565b84526020840193506020830192505060018101905062000642565b5050509392505050565b6000620006946200068e8462000ac0565b62000a39565b905082815260208101848484011115620006b357620006b262000d58565b5b620006c084828562000ba2565b509392505050565b600081519050620006d98162000eb7565b92915050565b600082601f830112620006f757620006f662000d4e565b5b81516200070984826020860162000587565b91505092915050565b600082601f8301126200072a576200072962000d4e565b5b81516200073c84826020860162000602565b91505092915050565b600082601f8301126200075d576200075c62000d4e565b5b81516200076f8482602086016200067d565b91505092915050565b600081519050620007898162000ed1565b92915050565b60008060008060808587031215620007ac57620007ab62000d62565b5b600085015167ffffffffffffffff811115620007cd57620007cc62000d5d565b5b620007db8782880162000745565b945050602085015167ffffffffffffffff811115620007ff57620007fe62000d5d565b5b6200080d8782880162000745565b935050604085015167ffffffffffffffff81111562000831576200083062000d5d565b5b6200083f87828801620006df565b925050606085015167ffffffffffffffff81111562000863576200086262000d5d565b5b620008718782880162000712565b91505092959194509250565b620008888162000b64565b82525050565b60006200089d602c8362000af6565b9150620008aa8262000d78565b604082019050919050565b6000620008c460328362000af6565b9150620008d18262000dc7565b604082019050919050565b6000620008eb602b8362000af6565b9150620008f88262000e16565b604082019050919050565b600062000912601a8362000af6565b91506200091f8262000e65565b602082019050919050565b600062000939601d8362000af6565b9150620009468262000e8e565b602082019050919050565b6200095c8162000b98565b82525050565b60006040820190506200097960008301856200087d565b62000988602083018462000951565b9392505050565b60006020820190508181036000830152620009aa816200088e565b9050919050565b60006020820190508181036000830152620009cc81620008b5565b9050919050565b60006020820190508181036000830152620009ee81620008dc565b9050919050565b6000602082019050818103600083015262000a108162000903565b9050919050565b6000602082019050818103600083015262000a32816200092a565b9050919050565b600062000a4562000a58565b905062000a53828262000c0e565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a805762000a7f62000d1f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000aaf5762000aae62000d1f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000ade5762000add62000d1f565b5b62000ae98262000d67565b9050602081019050919050565b600082825260208201905092915050565b600062000b148262000b98565b915062000b218362000b98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b595762000b5862000c92565b5b828201905092915050565b600062000b718262000b78565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000bc257808201518184015260208101905062000ba5565b8381111562000bd2576000848401525b50505050565b6000600282049050600182168062000bf157607f821691505b6020821081141562000c085762000c0762000cc1565b5b50919050565b62000c198262000d67565b810181811067ffffffffffffffff8211171562000c3b5762000c3a62000d1f565b5b80604052505050565b600062000c518262000b98565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c875762000c8662000c92565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b62000ec28162000b64565b811462000ece57600080fd5b50565b62000edc8162000b98565b811462000ee857600080fd5b50565b6158c38062000efb6000396000f3fe6080604052600436106102085760003560e01c80636352211e11610118578063b88d4fde116100a0578063e33b7de31161006f578063e33b7de3146107b8578063e985e9c5146107e3578063eb66d2cb14610820578063f2fde38b1461083c578063fe574c88146108655761024f565b8063b88d4fde146106ea578063c52766c614610713578063c87b56dd1461073e578063ce7c2ac21461077b5761024f565b80638da5cb5b116100e75780638da5cb5b1461060557806395d89b41146106305780639852595c1461065b578063a22cb46514610698578063a3ea9785146106c15761024f565b80636352211e1461053757806370a0823114610574578063715018a6146105b15780638b83209b146105c85761024f565b806318160ddd1161019b5780632f745c591161016a5780632f745c59146104405780633a98ef391461047d57806342842e0e146104a85780634f6ccce7146104d157806355f804b31461050e5761024f565b806318160ddd146103a757806319165587146103d257806323b872dd146103fb5780632db11544146104245761024f565b806307192c3a116101d757806307192c3a146102fc578063081812fc14610318578063095ea7b31461035557806311e739351461037e5761024f565b8063014b0c8a1461025457806301ffc9a71461027d57806306fd5133146102ba57806306fdde03146102d15761024f565b3661024f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061023661088e565b34604051610245929190614413565b60405180910390a1005b600080fd5b34801561026057600080fd5b5061027b60048036038101906102769190613b3d565b610896565b005b34801561028957600080fd5b506102a4600480360381019061029f9190613b86565b6109ca565b6040516102b1919061443c565b60405180910390f35b3480156102c657600080fd5b506102cf610a44565b005b3480156102dd57600080fd5b506102e6610add565b6040516102f3919061449c565b60405180910390f35b61031660048036038101906103119190613c29565b610b6f565b005b34801561032457600080fd5b5061033f600480360381019061033a9190613c29565b610bc9565b60405161034c9190614383565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613afd565b610c4e565b005b34801561038a57600080fd5b506103a560048036038101906103a0919061394d565b610d66565b005b3480156103b357600080fd5b506103bc610e26565b6040516103c9919061491e565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f4919061397a565b610e33565b005b34801561040757600080fd5b50610422600480360381019061041d91906139e7565b61109b565b005b61043e60048036038101906104399190613c29565b6110fb565b005b34801561044c57600080fd5b5061046760048036038101906104629190613afd565b61115a565b604051610474919061491e565b60405180910390f35b34801561048957600080fd5b506104926111ff565b60405161049f919061491e565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906139e7565b611209565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613c29565b611229565b604051610505919061491e565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613be0565b61129a565b005b34801561054357600080fd5b5061055e60048036038101906105599190613c29565b611330565b60405161056b9190614383565b60405180910390f35b34801561058057600080fd5b5061059b6004803603810190610596919061394d565b6113e2565b6040516105a8919061491e565b60405180910390f35b3480156105bd57600080fd5b506105c661149a565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613c29565b611522565b6040516105fc9190614383565b60405180910390f35b34801561061157600080fd5b5061061a61156a565b6040516106279190614383565b60405180910390f35b34801561063c57600080fd5b50610645611594565b604051610652919061449c565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d919061394d565b611626565b60405161068f919061491e565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613abd565b61166f565b005b3480156106cd57600080fd5b506106e860048036038101906106e3919061394d565b6117f0565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613a3a565b6118b0565b005b34801561071f57600080fd5b50610728611912565b6040516107359190614939565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613c29565b611927565b604051610772919061449c565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d919061394d565b611a9a565b6040516107af919061491e565b60405180910390f35b3480156107c457600080fd5b506107cd611ae3565b6040516107da919061491e565b60405180910390f35b3480156107ef57600080fd5b5061080a600480360381019061080591906139a7565b611aed565b604051610817919061443c565b60405180910390f35b61083a60048036038101906108359190613c83565b611b81565b005b34801561084857600080fd5b50610863600480360381019061085e919061394d565b611bf1565b005b34801561087157600080fd5b5061088c60048036038101906108879190613cc3565b611ce9565b005b600033905090565b61089e61088e565b73ffffffffffffffffffffffffffffffffffffffff166108bc61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109099061477e565b60405180910390fd5b601460159054906101000a900460ff1615610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061487e565b60405180910390fd5b60005b81518110156109c6576109786011611e1e565b6109b382828151811061098e5761098d614e70565b5b6020026020010151620f42406109a46011611e34565b6109ae9190614adc565b611e42565b80806109be90614ce2565b915050610965565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3d5750610a3c82611e60565b5b9050919050565b610a4c61088e565b73ffffffffffffffffffffffffffffffffffffffff16610a6a61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab79061477e565b60405180910390fd5b6001601460156101000a81548160ff021916908315150217905550565b606060008054610aec90614c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1890614c7f565b8015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b5050505050905090565b6000610b7a33611f42565b905080610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb39061453e565b60405180910390fd5b610bc582612004565b5050565b6000610bd48261241d565b610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0a9061473e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5982611330565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc1906147fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce961088e565b73ffffffffffffffffffffffffffffffffffffffff161480610d185750610d1781610d1261088e565b611aed565b5b610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e906146be565b60405180910390fd5b610d618383612489565b505050565b610d6e61088e565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd99061477e565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac906145be565b60405180910390fd5b6000600b5447610ec59190614a55565b90506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f579190614adc565b610f619190614aab565b610f6b9190614b36565b90506000811415610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061469e565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ffc9190614a55565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5461104d9190614a55565b600b8190555061105d8382612542565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161108e92919061439e565b60405180910390a1505050565b6110ac6110a661088e565b82612636565b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e29061485e565b60405180910390fd5b6110f6838383612714565b505050565b600260148054906101000a900460ff1660ff161461114e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111459061459e565b60405180910390fd5b61115781612004565b50565b6000611165836113e2565b82106111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119d906144de565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a54905090565b611224838383604051806020016040528060008152506118b0565b505050565b6000611233610e26565b8210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148be565b60405180910390fd5b6008828154811061128857611287614e70565b5b90600052602060002001549050919050565b6112a261088e565b73ffffffffffffffffffffffffffffffffffffffff166112c061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d9061477e565b60405180910390fd5b806016908051906020019061132c92919061360b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906146fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906146de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a261088e565b73ffffffffffffffffffffffffffffffffffffffff166114c061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d9061477e565b60405180910390fd5b6115206000612970565b565b6000600e828154811061153857611537614e70565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115a390614c7f565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf90614c7f565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167761088e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906145fe565b60405180910390fd5b80600560006116f261088e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f61088e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e4919061443c565b60405180910390a35050565b6117f861088e565b73ffffffffffffffffffffffffffffffffffffffff1661181661156a565b73ffffffffffffffffffffffffffffffffffffffff161461186c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118639061477e565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118c16118bb61088e565b83612636565b611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f79061485e565b60405180910390fd5b61190c84848484612a36565b50505050565b600060148054906101000a900460ff16905090565b60606119328261241d565b611971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906147be565b60405180910390fd5b600060156000848152602001908152602001600020805461199190614c7f565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd90614c7f565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b505050505090506000611a1b612a92565b9050600081511415611a31578192505050611a95565b600082511115611a66578082604051602001611a4e92919061434a565b60405160208183030381529060405292505050611a95565b80611a7085612b24565b604051602001611a8192919061434a565b604051602081830303815290604052925050505b919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033604051602001611b949190614307565b604051602081830303815290604052805190602001209050611be3601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284612c859092919063ffffffff16565b611bec83612004565b505050565b611bf961088e565b73ffffffffffffffffffffffffffffffffffffffff16611c1761156a565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c649061477e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd49061455e565b60405180910390fd5b611ce681612970565b50565b611cf161088e565b73ffffffffffffffffffffffffffffffffffffffff16611d0f61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c9061477e565b60405180910390fd5b60148054906101000a900460ff1660ff168160ff1611611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906148fe565b60405180910390fd5b60038160ff161115611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df8906148de565b60405180910390fd5b806014806101000a81548160ff021916908360ff16021790555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b611e5c828260405180602001604052806000815250612daf565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f3b5750611f3a82612e0a565b5b9050919050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611fa59190614383565b60206040518083038186803b158015611fbd57600080fd5b505afa158015611fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff59190613c56565b90506000811192505050919050565b600160148054906101000a900460ff1660ff1614806120335750600260148054906101000a900460ff1660ff16145b612072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120699061489e565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061483e565b60405180910390fd5b8066f52322698080006120f39190614adc565b341015612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c9061481e565b60405180910390fd5b611b39816121436010611e34565b61214d9190614a55565b111561218e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121859061451e565b60405180910390fd5b600160148054906101000a900460ff1660ff16141561224d57600360ff1681601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff166122079190614a55565b1115612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f9061461e565b60405180910390fd5b612369565b600a811115612291576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612288906147de565b60405180910390fd5b6014813073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016122cd9190614383565b60206040518083038186803b1580156122e557600080fd5b505afa1580156122f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231d9190613c56565b6123279190614a55565b1115612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f906144be565b60405180910390fd5b5b60005b818110156124195761237e6010611e1e565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906123da90614d2b565b91906101000a81548160ff021916908360ff16021790555050612406336124016010611e34565b611e42565b808061241190614ce2565b91505061236c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124fc83611330565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c9061465e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125ab9061436e565b60006040518083038185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b5050905080612631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126289061463e565b60405180910390fd5b505050565b60006126418261241d565b612680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126779061467e565b60405180910390fd5b600061268b83611330565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126fa57508373ffffffffffffffffffffffffffffffffffffffff166126e284610bc9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061270b575061270a8185611aed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661273482611330565b73ffffffffffffffffffffffffffffffffffffffff161461278a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127819061479e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f1906145de565b60405180910390fd5b612805838383612e74565b612810600082612489565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128609190614b36565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b79190614a55565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a41848484612714565b612a4d84848484612f88565b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906144fe565b60405180910390fd5b50505050565b606060168054612aa190614c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90614c7f565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b5050505050905090565b60606000821415612b6c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c80565b600082905060005b60008214612b9e578080612b8790614ce2565b915050600a82612b979190614aab565b9150612b74565b60008167ffffffffffffffff811115612bba57612bb9614e9f565b5b6040519080825280601f01601f191660200182016040528015612bec5781602001600182028036833780820191505090505b5090505b60008514612c7957600182612c059190614b36565b9150600a85612c149190614d83565b6030612c209190614a55565b60f81b818381518110612c3657612c35614e70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c729190614aab565b9450612bf0565b8093505050505b919050565b60016040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525082604051602001612ccf929190614322565b6040516020818303038152906040528051906020012084600001518560200151866040015160405160008152602001604052604051612d119493929190614457565b6020604051602081039080840390855afa158015612d33573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da19061475e565b60405180910390fd5b505050565b612db9838361311f565b612dc66000848484612f88565b612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc906144fe565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e7f8383836132ed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ec257612ebd816132f2565b612f01565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0057612eff838261333b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4457612f3f816134a8565b612f83565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8257612f818282613579565b5b5b505050565b6000612fa98473ffffffffffffffffffffffffffffffffffffffff166135f8565b15613112578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fd261088e565b8786866040518563ffffffff1660e01b8152600401612ff494939291906143c7565b602060405180830381600087803b15801561300e57600080fd5b505af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c9190613bb3565b60015b6130c2573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b506000815114156130ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b1906144fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613117565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561318f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131869061471e565b60405180910390fd5b6131988161241d565b156131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf9061457e565b60405180910390fd5b6131e460008383612e74565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132349190614a55565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613348846113e2565b6133529190614b36565b9050600060076000848152602001908152602001600020549050818114613437576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134bc9190614b36565b90506000600960008481526020019081526020016000205490506000600883815481106134ec576134eb614e70565b5b90600052602060002001549050806008838154811061350e5761350d614e70565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061355d5761355c614e41565b5b6001900381819060005260206000200160009055905550505050565b6000613584836113e2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461361790614c7f565b90600052602060002090601f0160209004810192826136395760008555613680565b82601f1061365257805160ff1916838001178555613680565b82800160010185558215613680579182015b8281111561367f578251825591602001919060010190613664565b5b50905061368d9190613691565b5090565b5b808211156136aa576000816000905550600101613692565b5090565b60006136c16136bc84614979565b614954565b905080838252602082019050828560208602820111156136e4576136e3614ed8565b5b60005b8581101561371457816136fa88826137a2565b8452602084019350602083019250506001810190506136e7565b5050509392505050565b600061373161372c846149a5565b614954565b90508281526020810184848401111561374d5761374c614edd565b5b613758848285614c3d565b509392505050565b600061377361376e846149d6565b614954565b90508281526020810184848401111561378f5761378e614edd565b5b61379a848285614c3d565b509392505050565b6000813590506137b1816157ec565b92915050565b6000813590506137c681615803565b92915050565b600082601f8301126137e1576137e0614ece565b5b81356137f18482602086016136ae565b91505092915050565b6000813590506138098161581a565b92915050565b60008135905061381e81615831565b92915050565b60008135905061383381615848565b92915050565b60008151905061384881615848565b92915050565b600082601f83011261386357613862614ece565b5b813561387384826020860161371e565b91505092915050565b600082601f83011261389157613890614ece565b5b81356138a1848260208601613760565b91505092915050565b6000606082840312156138c0576138bf614ed3565b5b6138ca6060614954565b905060006138da84828501613938565b60008301525060206138ee8482850161380f565b60208301525060406139028482850161380f565b60408301525092915050565b60008135905061391d8161585f565b92915050565b6000815190506139328161585f565b92915050565b60008135905061394781615876565b92915050565b60006020828403121561396357613962614ee7565b5b6000613971848285016137a2565b91505092915050565b6000602082840312156139905761398f614ee7565b5b600061399e848285016137b7565b91505092915050565b600080604083850312156139be576139bd614ee7565b5b60006139cc858286016137a2565b92505060206139dd858286016137a2565b9150509250929050565b600080600060608486031215613a00576139ff614ee7565b5b6000613a0e868287016137a2565b9350506020613a1f868287016137a2565b9250506040613a308682870161390e565b9150509250925092565b60008060008060808587031215613a5457613a53614ee7565b5b6000613a62878288016137a2565b9450506020613a73878288016137a2565b9350506040613a848782880161390e565b925050606085013567ffffffffffffffff811115613aa557613aa4614ee2565b5b613ab18782880161384e565b91505092959194509250565b60008060408385031215613ad457613ad3614ee7565b5b6000613ae2858286016137a2565b9250506020613af3858286016137fa565b9150509250929050565b60008060408385031215613b1457613b13614ee7565b5b6000613b22858286016137a2565b9250506020613b338582860161390e565b9150509250929050565b600060208284031215613b5357613b52614ee7565b5b600082013567ffffffffffffffff811115613b7157613b70614ee2565b5b613b7d848285016137cc565b91505092915050565b600060208284031215613b9c57613b9b614ee7565b5b6000613baa84828501613824565b91505092915050565b600060208284031215613bc957613bc8614ee7565b5b6000613bd784828501613839565b91505092915050565b600060208284031215613bf657613bf5614ee7565b5b600082013567ffffffffffffffff811115613c1457613c13614ee2565b5b613c208482850161387c565b91505092915050565b600060208284031215613c3f57613c3e614ee7565b5b6000613c4d8482850161390e565b91505092915050565b600060208284031215613c6c57613c6b614ee7565b5b6000613c7a84828501613923565b91505092915050565b60008060808385031215613c9a57613c99614ee7565b5b6000613ca88582860161390e565b9250506020613cb9858286016138aa565b9150509250929050565b600060208284031215613cd957613cd8614ee7565b5b6000613ce784828501613938565b91505092915050565b613cf981614c07565b82525050565b613d0881614b6a565b82525050565b613d1f613d1a82614b6a565b614d55565b82525050565b613d2e81614b8e565b82525050565b613d3d81614b9a565b82525050565b613d54613d4f82614b9a565b614d67565b82525050565b6000613d6582614a07565b613d6f8185614a1d565b9350613d7f818560208601614c4c565b613d8881614eec565b840191505092915050565b6000613d9e82614a12565b613da88185614a39565b9350613db8818560208601614c4c565b613dc181614eec565b840191505092915050565b6000613dd782614a12565b613de18185614a4a565b9350613df1818560208601614c4c565b80840191505092915050565b6000613e0a603583614a39565b9150613e1582614f0a565b604082019050919050565b6000613e2d602b83614a39565b9150613e3882614f59565b604082019050919050565b6000613e50603283614a39565b9150613e5b82614fa8565b604082019050919050565b6000613e73602683614a39565b9150613e7e82614ff7565b604082019050919050565b6000613e96603983614a39565b9150613ea182615046565b604082019050919050565b6000613eb9602683614a39565b9150613ec482615095565b604082019050919050565b6000613edc601c83614a39565b9150613ee7826150e4565b602082019050919050565b6000613eff601e83614a39565b9150613f0a8261510d565b602082019050919050565b6000613f22602683614a39565b9150613f2d82615136565b604082019050919050565b6000613f45602483614a39565b9150613f5082615185565b604082019050919050565b6000613f68601983614a39565b9150613f73826151d4565b602082019050919050565b6000613f8b602783614a39565b9150613f96826151fd565b604082019050919050565b6000613fae603a83614a39565b9150613fb98261524c565b604082019050919050565b6000613fd1601d83614a39565b9150613fdc8261529b565b602082019050919050565b6000613ff4602c83614a39565b9150613fff826152c4565b604082019050919050565b6000614017602b83614a39565b915061402282615313565b604082019050919050565b600061403a603883614a39565b915061404582615362565b604082019050919050565b600061405d602a83614a39565b9150614068826153b1565b604082019050919050565b6000614080602983614a39565b915061408b82615400565b604082019050919050565b60006140a3602083614a39565b91506140ae8261544f565b602082019050919050565b60006140c6602c83614a39565b91506140d182615478565b604082019050919050565b60006140e9601183614a39565b91506140f4826154c7565b602082019050919050565b600061410c602083614a39565b9150614117826154f0565b602082019050919050565b600061412f602983614a39565b915061413a82615519565b604082019050919050565b6000614152602f83614a39565b915061415d82615568565b604082019050919050565b6000614175602f83614a39565b9150614180826155b7565b604082019050919050565b6000614198602183614a39565b91506141a382615606565b604082019050919050565b60006141bb601683614a39565b91506141c682615655565b602082019050919050565b60006141de600d83614a39565b91506141e98261567e565b602082019050919050565b6000614201600083614a2e565b915061420c826156a7565b600082019050919050565b6000614224603183614a39565b915061422f826156aa565b604082019050919050565b6000614247601b83614a39565b9150614252826156f9565b602082019050919050565b600061426a601483614a39565b915061427582615722565b602082019050919050565b600061428d602c83614a39565b91506142988261574b565b604082019050919050565b60006142b0601583614a39565b91506142bb8261579a565b602082019050919050565b60006142d3601183614a39565b91506142de826157c3565b602082019050919050565b6142f281614bf0565b82525050565b61430181614bfa565b82525050565b60006143138284613d0e565b60148201915081905092915050565b600061432e8285613dcc565b915061433a8284613d43565b6020820191508190509392505050565b60006143568285613dcc565b91506143628284613dcc565b91508190509392505050565b6000614379826141f4565b9150819050919050565b60006020820190506143986000830184613cff565b92915050565b60006040820190506143b36000830185613cf0565b6143c060208301846142e9565b9392505050565b60006080820190506143dc6000830187613cff565b6143e96020830186613cff565b6143f660408301856142e9565b81810360608301526144088184613d5a565b905095945050505050565b60006040820190506144286000830185613cff565b61443560208301846142e9565b9392505050565b60006020820190506144516000830184613d25565b92915050565b600060808201905061446c6000830187613d34565b61447960208301866142f8565b6144866040830185613d34565b6144936060830184613d34565b95945050505050565b600060208201905081810360008301526144b68184613d93565b905092915050565b600060208201905081810360008301526144d781613dfd565b9050919050565b600060208201905081810360008301526144f781613e20565b9050919050565b6000602082019050818103600083015261451781613e43565b9050919050565b6000602082019050818103600083015261453781613e66565b9050919050565b6000602082019050818103600083015261455781613e89565b9050919050565b6000602082019050818103600083015261457781613eac565b9050919050565b6000602082019050818103600083015261459781613ecf565b9050919050565b600060208201905081810360008301526145b781613ef2565b9050919050565b600060208201905081810360008301526145d781613f15565b9050919050565b600060208201905081810360008301526145f781613f38565b9050919050565b6000602082019050818103600083015261461781613f5b565b9050919050565b6000602082019050818103600083015261463781613f7e565b9050919050565b6000602082019050818103600083015261465781613fa1565b9050919050565b6000602082019050818103600083015261467781613fc4565b9050919050565b6000602082019050818103600083015261469781613fe7565b9050919050565b600060208201905081810360008301526146b78161400a565b9050919050565b600060208201905081810360008301526146d78161402d565b9050919050565b600060208201905081810360008301526146f781614050565b9050919050565b6000602082019050818103600083015261471781614073565b9050919050565b6000602082019050818103600083015261473781614096565b9050919050565b60006020820190508181036000830152614757816140b9565b9050919050565b60006020820190508181036000830152614777816140dc565b9050919050565b60006020820190508181036000830152614797816140ff565b9050919050565b600060208201905081810360008301526147b781614122565b9050919050565b600060208201905081810360008301526147d781614145565b9050919050565b600060208201905081810360008301526147f781614168565b9050919050565b600060208201905081810360008301526148178161418b565b9050919050565b60006020820190508181036000830152614837816141ae565b9050919050565b60006020820190508181036000830152614857816141d1565b9050919050565b6000602082019050818103600083015261487781614217565b9050919050565b600060208201905081810360008301526148978161423a565b9050919050565b600060208201905081810360008301526148b78161425d565b9050919050565b600060208201905081810360008301526148d781614280565b9050919050565b600060208201905081810360008301526148f7816142a3565b9050919050565b60006020820190508181036000830152614917816142c6565b9050919050565b600060208201905061493360008301846142e9565b92915050565b600060208201905061494e60008301846142f8565b92915050565b600061495e61496f565b905061496a8282614cb1565b919050565b6000604051905090565b600067ffffffffffffffff82111561499457614993614e9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149c0576149bf614e9f565b5b6149c982614eec565b9050602081019050919050565b600067ffffffffffffffff8211156149f1576149f0614e9f565b5b6149fa82614eec565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6082614bf0565b9150614a6b83614bf0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aa057614a9f614db4565b5b828201905092915050565b6000614ab682614bf0565b9150614ac183614bf0565b925082614ad157614ad0614de3565b5b828204905092915050565b6000614ae782614bf0565b9150614af283614bf0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2b57614b2a614db4565b5b828202905092915050565b6000614b4182614bf0565b9150614b4c83614bf0565b925082821015614b5f57614b5e614db4565b5b828203905092915050565b6000614b7582614bd0565b9050919050565b6000614b8782614bd0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614c1282614c19565b9050919050565b6000614c2482614c2b565b9050919050565b6000614c3682614bd0565b9050919050565b82818337600083830152505050565b60005b83811015614c6a578082015181840152602081019050614c4f565b83811115614c79576000848401525b50505050565b60006002820490506001821680614c9757607f821691505b60208210811415614cab57614caa614e12565b5b50919050565b614cba82614eec565b810181811067ffffffffffffffff82111715614cd957614cd8614e9f565b5b80604052505050565b6000614ced82614bf0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d2057614d1f614db4565b5b600182019050919050565b6000614d3682614bfa565b915060ff821415614d4a57614d49614db4565b5b600182019050919050565b6000614d6082614d71565b9050919050565b6000819050919050565b6000614d7c82614efd565b9050919050565b6000614d8e82614bf0565b9150614d9983614bf0565b925082614da957614da8614de3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564206d60008201527f6178206d696e7473207065722061646472657373210000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206f776e206174206c65617374206f6e652043727970746f546f616460008201527f7a20746f206d696e7420696e207468652070726573616c652100000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e20746f207075626c69632e0000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c652063616e6e6f74206d696e74206d6f7265207468616e20332060008201527f43524f414b5a2100000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686572652069732061206c696d6974206f6e206d696e74696e6720746f6f2060008201527f6d616e7920617420612074696d65210000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e742100000000000000000000600082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e2e000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f46696e616c20706861736520697320434c4f5345440000000000000000000000600082015250565b7f4e6f206261636b2d7374657070696e6721000000000000000000000000000000600082015250565b6157f581614b6a565b811461580057600080fd5b50565b61580c81614b7c565b811461581757600080fd5b50565b61582381614b8e565b811461582e57600080fd5b50565b61583a81614b9a565b811461584557600080fd5b50565b61585181614ba4565b811461585c57600080fd5b50565b61586881614bf0565b811461587357600080fd5b50565b61587f81614bfa565b811461588a57600080fd5b5056fea26469706673582212209f2e9800f5ad316a26812d0b95ae5d598c3da12ca8b3a0dbfa3604fb9fc713da64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000643524f414b5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643524f414b5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f177700000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000002d

Deployed Bytecode

0x6080604052600436106102085760003560e01c80636352211e11610118578063b88d4fde116100a0578063e33b7de31161006f578063e33b7de3146107b8578063e985e9c5146107e3578063eb66d2cb14610820578063f2fde38b1461083c578063fe574c88146108655761024f565b8063b88d4fde146106ea578063c52766c614610713578063c87b56dd1461073e578063ce7c2ac21461077b5761024f565b80638da5cb5b116100e75780638da5cb5b1461060557806395d89b41146106305780639852595c1461065b578063a22cb46514610698578063a3ea9785146106c15761024f565b80636352211e1461053757806370a0823114610574578063715018a6146105b15780638b83209b146105c85761024f565b806318160ddd1161019b5780632f745c591161016a5780632f745c59146104405780633a98ef391461047d57806342842e0e146104a85780634f6ccce7146104d157806355f804b31461050e5761024f565b806318160ddd146103a757806319165587146103d257806323b872dd146103fb5780632db11544146104245761024f565b806307192c3a116101d757806307192c3a146102fc578063081812fc14610318578063095ea7b31461035557806311e739351461037e5761024f565b8063014b0c8a1461025457806301ffc9a71461027d57806306fd5133146102ba57806306fdde03146102d15761024f565b3661024f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061023661088e565b34604051610245929190614413565b60405180910390a1005b600080fd5b34801561026057600080fd5b5061027b60048036038101906102769190613b3d565b610896565b005b34801561028957600080fd5b506102a4600480360381019061029f9190613b86565b6109ca565b6040516102b1919061443c565b60405180910390f35b3480156102c657600080fd5b506102cf610a44565b005b3480156102dd57600080fd5b506102e6610add565b6040516102f3919061449c565b60405180910390f35b61031660048036038101906103119190613c29565b610b6f565b005b34801561032457600080fd5b5061033f600480360381019061033a9190613c29565b610bc9565b60405161034c9190614383565b60405180910390f35b34801561036157600080fd5b5061037c60048036038101906103779190613afd565b610c4e565b005b34801561038a57600080fd5b506103a560048036038101906103a0919061394d565b610d66565b005b3480156103b357600080fd5b506103bc610e26565b6040516103c9919061491e565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f4919061397a565b610e33565b005b34801561040757600080fd5b50610422600480360381019061041d91906139e7565b61109b565b005b61043e60048036038101906104399190613c29565b6110fb565b005b34801561044c57600080fd5b5061046760048036038101906104629190613afd565b61115a565b604051610474919061491e565b60405180910390f35b34801561048957600080fd5b506104926111ff565b60405161049f919061491e565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca91906139e7565b611209565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613c29565b611229565b604051610505919061491e565b60405180910390f35b34801561051a57600080fd5b5061053560048036038101906105309190613be0565b61129a565b005b34801561054357600080fd5b5061055e60048036038101906105599190613c29565b611330565b60405161056b9190614383565b60405180910390f35b34801561058057600080fd5b5061059b6004803603810190610596919061394d565b6113e2565b6040516105a8919061491e565b60405180910390f35b3480156105bd57600080fd5b506105c661149a565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613c29565b611522565b6040516105fc9190614383565b60405180910390f35b34801561061157600080fd5b5061061a61156a565b6040516106279190614383565b60405180910390f35b34801561063c57600080fd5b50610645611594565b604051610652919061449c565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d919061394d565b611626565b60405161068f919061491e565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190613abd565b61166f565b005b3480156106cd57600080fd5b506106e860048036038101906106e3919061394d565b6117f0565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613a3a565b6118b0565b005b34801561071f57600080fd5b50610728611912565b6040516107359190614939565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613c29565b611927565b604051610772919061449c565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d919061394d565b611a9a565b6040516107af919061491e565b60405180910390f35b3480156107c457600080fd5b506107cd611ae3565b6040516107da919061491e565b60405180910390f35b3480156107ef57600080fd5b5061080a600480360381019061080591906139a7565b611aed565b604051610817919061443c565b60405180910390f35b61083a60048036038101906108359190613c83565b611b81565b005b34801561084857600080fd5b50610863600480360381019061085e919061394d565b611bf1565b005b34801561087157600080fd5b5061088c60048036038101906108879190613cc3565b611ce9565b005b600033905090565b61089e61088e565b73ffffffffffffffffffffffffffffffffffffffff166108bc61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109099061477e565b60405180910390fd5b601460159054906101000a900460ff1615610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061487e565b60405180910390fd5b60005b81518110156109c6576109786011611e1e565b6109b382828151811061098e5761098d614e70565b5b6020026020010151620f42406109a46011611e34565b6109ae9190614adc565b611e42565b80806109be90614ce2565b915050610965565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3d5750610a3c82611e60565b5b9050919050565b610a4c61088e565b73ffffffffffffffffffffffffffffffffffffffff16610a6a61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab79061477e565b60405180910390fd5b6001601460156101000a81548160ff021916908315150217905550565b606060008054610aec90614c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1890614c7f565b8015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b5050505050905090565b6000610b7a33611f42565b905080610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb39061453e565b60405180910390fd5b610bc582612004565b5050565b6000610bd48261241d565b610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0a9061473e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5982611330565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc1906147fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce961088e565b73ffffffffffffffffffffffffffffffffffffffff161480610d185750610d1781610d1261088e565b611aed565b5b610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e906146be565b60405180910390fd5b610d618383612489565b505050565b610d6e61088e565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61156a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd99061477e565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac906145be565b60405180910390fd5b6000600b5447610ec59190614a55565b90506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f579190614adc565b610f619190614aab565b610f6b9190614b36565b90506000811415610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061469e565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ffc9190614a55565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5461104d9190614a55565b600b8190555061105d8382612542565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161108e92919061439e565b60405180910390a1505050565b6110ac6110a661088e565b82612636565b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e29061485e565b60405180910390fd5b6110f6838383612714565b505050565b600260148054906101000a900460ff1660ff161461114e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111459061459e565b60405180910390fd5b61115781612004565b50565b6000611165836113e2565b82106111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119d906144de565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a54905090565b611224838383604051806020016040528060008152506118b0565b505050565b6000611233610e26565b8210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148be565b60405180910390fd5b6008828154811061128857611287614e70565b5b90600052602060002001549050919050565b6112a261088e565b73ffffffffffffffffffffffffffffffffffffffff166112c061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d9061477e565b60405180910390fd5b806016908051906020019061132c92919061360b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d0906146fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906146de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114a261088e565b73ffffffffffffffffffffffffffffffffffffffff166114c061156a565b73ffffffffffffffffffffffffffffffffffffffff1614611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d9061477e565b60405180910390fd5b6115206000612970565b565b6000600e828154811061153857611537614e70565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115a390614c7f565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf90614c7f565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61167761088e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc906145fe565b60405180910390fd5b80600560006116f261088e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661179f61088e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e4919061443c565b60405180910390a35050565b6117f861088e565b73ffffffffffffffffffffffffffffffffffffffff1661181661156a565b73ffffffffffffffffffffffffffffffffffffffff161461186c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118639061477e565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118c16118bb61088e565b83612636565b611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f79061485e565b60405180910390fd5b61190c84848484612a36565b50505050565b600060148054906101000a900460ff16905090565b60606119328261241d565b611971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906147be565b60405180910390fd5b600060156000848152602001908152602001600020805461199190614c7f565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd90614c7f565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b505050505090506000611a1b612a92565b9050600081511415611a31578192505050611a95565b600082511115611a66578082604051602001611a4e92919061434a565b60405160208183030381529060405292505050611a95565b80611a7085612b24565b604051602001611a8192919061434a565b604051602081830303815290604052925050505b919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033604051602001611b949190614307565b604051602081830303815290604052805190602001209050611be3601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284612c859092919063ffffffff16565b611bec83612004565b505050565b611bf961088e565b73ffffffffffffffffffffffffffffffffffffffff16611c1761156a565b73ffffffffffffffffffffffffffffffffffffffff1614611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c649061477e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd49061455e565b60405180910390fd5b611ce681612970565b50565b611cf161088e565b73ffffffffffffffffffffffffffffffffffffffff16611d0f61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c9061477e565b60405180910390fd5b60148054906101000a900460ff1660ff168160ff1611611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906148fe565b60405180910390fd5b60038160ff161115611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df8906148de565b60405180910390fd5b806014806101000a81548160ff021916908360ff16021790555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b611e5c828260405180602001604052806000815250612daf565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f2b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f3b5750611f3a82612e0a565b5b9050919050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611fa59190614383565b60206040518083038186803b158015611fbd57600080fd5b505afa158015611fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff59190613c56565b90506000811192505050919050565b600160148054906101000a900460ff1660ff1614806120335750600260148054906101000a900460ff1660ff16145b612072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120699061489e565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061483e565b60405180910390fd5b8066f52322698080006120f39190614adc565b341015612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c9061481e565b60405180910390fd5b611b39816121436010611e34565b61214d9190614a55565b111561218e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121859061451e565b60405180910390fd5b600160148054906101000a900460ff1660ff16141561224d57600360ff1681601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff166122079190614a55565b1115612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f9061461e565b60405180910390fd5b612369565b600a811115612291576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612288906147de565b60405180910390fd5b6014813073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016122cd9190614383565b60206040518083038186803b1580156122e557600080fd5b505afa1580156122f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231d9190613c56565b6123279190614a55565b1115612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f906144be565b60405180910390fd5b5b60005b818110156124195761237e6010611e1e565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906123da90614d2b565b91906101000a81548160ff021916908360ff16021790555050612406336124016010611e34565b611e42565b808061241190614ce2565b91505061236c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124fc83611330565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c9061465e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516125ab9061436e565b60006040518083038185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b5050905080612631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126289061463e565b60405180910390fd5b505050565b60006126418261241d565b612680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126779061467e565b60405180910390fd5b600061268b83611330565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126fa57508373ffffffffffffffffffffffffffffffffffffffff166126e284610bc9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061270b575061270a8185611aed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661273482611330565b73ffffffffffffffffffffffffffffffffffffffff161461278a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127819061479e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f1906145de565b60405180910390fd5b612805838383612e74565b612810600082612489565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128609190614b36565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b79190614a55565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a41848484612714565b612a4d84848484612f88565b612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906144fe565b60405180910390fd5b50505050565b606060168054612aa190614c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054612acd90614c7f565b8015612b1a5780601f10612aef57610100808354040283529160200191612b1a565b820191906000526020600020905b815481529060010190602001808311612afd57829003601f168201915b5050505050905090565b60606000821415612b6c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c80565b600082905060005b60008214612b9e578080612b8790614ce2565b915050600a82612b979190614aab565b9150612b74565b60008167ffffffffffffffff811115612bba57612bb9614e9f565b5b6040519080825280601f01601f191660200182016040528015612bec5781602001600182028036833780820191505090505b5090505b60008514612c7957600182612c059190614b36565b9150600a85612c149190614d83565b6030612c209190614a55565b60f81b818381518110612c3657612c35614e70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c729190614aab565b9450612bf0565b8093505050505b919050565b60016040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525082604051602001612ccf929190614322565b6040516020818303038152906040528051906020012084600001518560200151866040015160405160008152602001604052604051612d119493929190614457565b6020604051602081039080840390855afa158015612d33573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da19061475e565b60405180910390fd5b505050565b612db9838361311f565b612dc66000848484612f88565b612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc906144fe565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e7f8383836132ed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ec257612ebd816132f2565b612f01565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f0057612eff838261333b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4457612f3f816134a8565b612f83565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f8257612f818282613579565b5b5b505050565b6000612fa98473ffffffffffffffffffffffffffffffffffffffff166135f8565b15613112578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fd261088e565b8786866040518563ffffffff1660e01b8152600401612ff494939291906143c7565b602060405180830381600087803b15801561300e57600080fd5b505af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c9190613bb3565b60015b6130c2573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b506000815114156130ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b1906144fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613117565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561318f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131869061471e565b60405180910390fd5b6131988161241d565b156131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf9061457e565b60405180910390fd5b6131e460008383612e74565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132349190614a55565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613348846113e2565b6133529190614b36565b9050600060076000848152602001908152602001600020549050818114613437576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134bc9190614b36565b90506000600960008481526020019081526020016000205490506000600883815481106134ec576134eb614e70565b5b90600052602060002001549050806008838154811061350e5761350d614e70565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061355d5761355c614e41565b5b6001900381819060005260206000200160009055905550505050565b6000613584836113e2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461361790614c7f565b90600052602060002090601f0160209004810192826136395760008555613680565b82601f1061365257805160ff1916838001178555613680565b82800160010185558215613680579182015b8281111561367f578251825591602001919060010190613664565b5b50905061368d9190613691565b5090565b5b808211156136aa576000816000905550600101613692565b5090565b60006136c16136bc84614979565b614954565b905080838252602082019050828560208602820111156136e4576136e3614ed8565b5b60005b8581101561371457816136fa88826137a2565b8452602084019350602083019250506001810190506136e7565b5050509392505050565b600061373161372c846149a5565b614954565b90508281526020810184848401111561374d5761374c614edd565b5b613758848285614c3d565b509392505050565b600061377361376e846149d6565b614954565b90508281526020810184848401111561378f5761378e614edd565b5b61379a848285614c3d565b509392505050565b6000813590506137b1816157ec565b92915050565b6000813590506137c681615803565b92915050565b600082601f8301126137e1576137e0614ece565b5b81356137f18482602086016136ae565b91505092915050565b6000813590506138098161581a565b92915050565b60008135905061381e81615831565b92915050565b60008135905061383381615848565b92915050565b60008151905061384881615848565b92915050565b600082601f83011261386357613862614ece565b5b813561387384826020860161371e565b91505092915050565b600082601f83011261389157613890614ece565b5b81356138a1848260208601613760565b91505092915050565b6000606082840312156138c0576138bf614ed3565b5b6138ca6060614954565b905060006138da84828501613938565b60008301525060206138ee8482850161380f565b60208301525060406139028482850161380f565b60408301525092915050565b60008135905061391d8161585f565b92915050565b6000815190506139328161585f565b92915050565b60008135905061394781615876565b92915050565b60006020828403121561396357613962614ee7565b5b6000613971848285016137a2565b91505092915050565b6000602082840312156139905761398f614ee7565b5b600061399e848285016137b7565b91505092915050565b600080604083850312156139be576139bd614ee7565b5b60006139cc858286016137a2565b92505060206139dd858286016137a2565b9150509250929050565b600080600060608486031215613a00576139ff614ee7565b5b6000613a0e868287016137a2565b9350506020613a1f868287016137a2565b9250506040613a308682870161390e565b9150509250925092565b60008060008060808587031215613a5457613a53614ee7565b5b6000613a62878288016137a2565b9450506020613a73878288016137a2565b9350506040613a848782880161390e565b925050606085013567ffffffffffffffff811115613aa557613aa4614ee2565b5b613ab18782880161384e565b91505092959194509250565b60008060408385031215613ad457613ad3614ee7565b5b6000613ae2858286016137a2565b9250506020613af3858286016137fa565b9150509250929050565b60008060408385031215613b1457613b13614ee7565b5b6000613b22858286016137a2565b9250506020613b338582860161390e565b9150509250929050565b600060208284031215613b5357613b52614ee7565b5b600082013567ffffffffffffffff811115613b7157613b70614ee2565b5b613b7d848285016137cc565b91505092915050565b600060208284031215613b9c57613b9b614ee7565b5b6000613baa84828501613824565b91505092915050565b600060208284031215613bc957613bc8614ee7565b5b6000613bd784828501613839565b91505092915050565b600060208284031215613bf657613bf5614ee7565b5b600082013567ffffffffffffffff811115613c1457613c13614ee2565b5b613c208482850161387c565b91505092915050565b600060208284031215613c3f57613c3e614ee7565b5b6000613c4d8482850161390e565b91505092915050565b600060208284031215613c6c57613c6b614ee7565b5b6000613c7a84828501613923565b91505092915050565b60008060808385031215613c9a57613c99614ee7565b5b6000613ca88582860161390e565b9250506020613cb9858286016138aa565b9150509250929050565b600060208284031215613cd957613cd8614ee7565b5b6000613ce784828501613938565b91505092915050565b613cf981614c07565b82525050565b613d0881614b6a565b82525050565b613d1f613d1a82614b6a565b614d55565b82525050565b613d2e81614b8e565b82525050565b613d3d81614b9a565b82525050565b613d54613d4f82614b9a565b614d67565b82525050565b6000613d6582614a07565b613d6f8185614a1d565b9350613d7f818560208601614c4c565b613d8881614eec565b840191505092915050565b6000613d9e82614a12565b613da88185614a39565b9350613db8818560208601614c4c565b613dc181614eec565b840191505092915050565b6000613dd782614a12565b613de18185614a4a565b9350613df1818560208601614c4c565b80840191505092915050565b6000613e0a603583614a39565b9150613e1582614f0a565b604082019050919050565b6000613e2d602b83614a39565b9150613e3882614f59565b604082019050919050565b6000613e50603283614a39565b9150613e5b82614fa8565b604082019050919050565b6000613e73602683614a39565b9150613e7e82614ff7565b604082019050919050565b6000613e96603983614a39565b9150613ea182615046565b604082019050919050565b6000613eb9602683614a39565b9150613ec482615095565b604082019050919050565b6000613edc601c83614a39565b9150613ee7826150e4565b602082019050919050565b6000613eff601e83614a39565b9150613f0a8261510d565b602082019050919050565b6000613f22602683614a39565b9150613f2d82615136565b604082019050919050565b6000613f45602483614a39565b9150613f5082615185565b604082019050919050565b6000613f68601983614a39565b9150613f73826151d4565b602082019050919050565b6000613f8b602783614a39565b9150613f96826151fd565b604082019050919050565b6000613fae603a83614a39565b9150613fb98261524c565b604082019050919050565b6000613fd1601d83614a39565b9150613fdc8261529b565b602082019050919050565b6000613ff4602c83614a39565b9150613fff826152c4565b604082019050919050565b6000614017602b83614a39565b915061402282615313565b604082019050919050565b600061403a603883614a39565b915061404582615362565b604082019050919050565b600061405d602a83614a39565b9150614068826153b1565b604082019050919050565b6000614080602983614a39565b915061408b82615400565b604082019050919050565b60006140a3602083614a39565b91506140ae8261544f565b602082019050919050565b60006140c6602c83614a39565b91506140d182615478565b604082019050919050565b60006140e9601183614a39565b91506140f4826154c7565b602082019050919050565b600061410c602083614a39565b9150614117826154f0565b602082019050919050565b600061412f602983614a39565b915061413a82615519565b604082019050919050565b6000614152602f83614a39565b915061415d82615568565b604082019050919050565b6000614175602f83614a39565b9150614180826155b7565b604082019050919050565b6000614198602183614a39565b91506141a382615606565b604082019050919050565b60006141bb601683614a39565b91506141c682615655565b602082019050919050565b60006141de600d83614a39565b91506141e98261567e565b602082019050919050565b6000614201600083614a2e565b915061420c826156a7565b600082019050919050565b6000614224603183614a39565b915061422f826156aa565b604082019050919050565b6000614247601b83614a39565b9150614252826156f9565b602082019050919050565b600061426a601483614a39565b915061427582615722565b602082019050919050565b600061428d602c83614a39565b91506142988261574b565b604082019050919050565b60006142b0601583614a39565b91506142bb8261579a565b602082019050919050565b60006142d3601183614a39565b91506142de826157c3565b602082019050919050565b6142f281614bf0565b82525050565b61430181614bfa565b82525050565b60006143138284613d0e565b60148201915081905092915050565b600061432e8285613dcc565b915061433a8284613d43565b6020820191508190509392505050565b60006143568285613dcc565b91506143628284613dcc565b91508190509392505050565b6000614379826141f4565b9150819050919050565b60006020820190506143986000830184613cff565b92915050565b60006040820190506143b36000830185613cf0565b6143c060208301846142e9565b9392505050565b60006080820190506143dc6000830187613cff565b6143e96020830186613cff565b6143f660408301856142e9565b81810360608301526144088184613d5a565b905095945050505050565b60006040820190506144286000830185613cff565b61443560208301846142e9565b9392505050565b60006020820190506144516000830184613d25565b92915050565b600060808201905061446c6000830187613d34565b61447960208301866142f8565b6144866040830185613d34565b6144936060830184613d34565b95945050505050565b600060208201905081810360008301526144b68184613d93565b905092915050565b600060208201905081810360008301526144d781613dfd565b9050919050565b600060208201905081810360008301526144f781613e20565b9050919050565b6000602082019050818103600083015261451781613e43565b9050919050565b6000602082019050818103600083015261453781613e66565b9050919050565b6000602082019050818103600083015261455781613e89565b9050919050565b6000602082019050818103600083015261457781613eac565b9050919050565b6000602082019050818103600083015261459781613ecf565b9050919050565b600060208201905081810360008301526145b781613ef2565b9050919050565b600060208201905081810360008301526145d781613f15565b9050919050565b600060208201905081810360008301526145f781613f38565b9050919050565b6000602082019050818103600083015261461781613f5b565b9050919050565b6000602082019050818103600083015261463781613f7e565b9050919050565b6000602082019050818103600083015261465781613fa1565b9050919050565b6000602082019050818103600083015261467781613fc4565b9050919050565b6000602082019050818103600083015261469781613fe7565b9050919050565b600060208201905081810360008301526146b78161400a565b9050919050565b600060208201905081810360008301526146d78161402d565b9050919050565b600060208201905081810360008301526146f781614050565b9050919050565b6000602082019050818103600083015261471781614073565b9050919050565b6000602082019050818103600083015261473781614096565b9050919050565b60006020820190508181036000830152614757816140b9565b9050919050565b60006020820190508181036000830152614777816140dc565b9050919050565b60006020820190508181036000830152614797816140ff565b9050919050565b600060208201905081810360008301526147b781614122565b9050919050565b600060208201905081810360008301526147d781614145565b9050919050565b600060208201905081810360008301526147f781614168565b9050919050565b600060208201905081810360008301526148178161418b565b9050919050565b60006020820190508181036000830152614837816141ae565b9050919050565b60006020820190508181036000830152614857816141d1565b9050919050565b6000602082019050818103600083015261487781614217565b9050919050565b600060208201905081810360008301526148978161423a565b9050919050565b600060208201905081810360008301526148b78161425d565b9050919050565b600060208201905081810360008301526148d781614280565b9050919050565b600060208201905081810360008301526148f7816142a3565b9050919050565b60006020820190508181036000830152614917816142c6565b9050919050565b600060208201905061493360008301846142e9565b92915050565b600060208201905061494e60008301846142f8565b92915050565b600061495e61496f565b905061496a8282614cb1565b919050565b6000604051905090565b600067ffffffffffffffff82111561499457614993614e9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149c0576149bf614e9f565b5b6149c982614eec565b9050602081019050919050565b600067ffffffffffffffff8211156149f1576149f0614e9f565b5b6149fa82614eec565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6082614bf0565b9150614a6b83614bf0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aa057614a9f614db4565b5b828201905092915050565b6000614ab682614bf0565b9150614ac183614bf0565b925082614ad157614ad0614de3565b5b828204905092915050565b6000614ae782614bf0565b9150614af283614bf0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2b57614b2a614db4565b5b828202905092915050565b6000614b4182614bf0565b9150614b4c83614bf0565b925082821015614b5f57614b5e614db4565b5b828203905092915050565b6000614b7582614bd0565b9050919050565b6000614b8782614bd0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614c1282614c19565b9050919050565b6000614c2482614c2b565b9050919050565b6000614c3682614bd0565b9050919050565b82818337600083830152505050565b60005b83811015614c6a578082015181840152602081019050614c4f565b83811115614c79576000848401525b50505050565b60006002820490506001821680614c9757607f821691505b60208210811415614cab57614caa614e12565b5b50919050565b614cba82614eec565b810181811067ffffffffffffffff82111715614cd957614cd8614e9f565b5b80604052505050565b6000614ced82614bf0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d2057614d1f614db4565b5b600182019050919050565b6000614d3682614bfa565b915060ff821415614d4a57614d49614db4565b5b600182019050919050565b6000614d6082614d71565b9050919050565b6000819050919050565b6000614d7c82614efd565b9050919050565b6000614d8e82614bf0565b9150614d9983614bf0565b925082614da957614da8614de3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564206d60008201527f6178206d696e7473207065722061646472657373210000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e672074686973206d616e7920776f756c6420657863656564207360008201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206f776e206174206c65617374206f6e652043727970746f546f616460008201527f7a20746f206d696e7420696e207468652070726573616c652100000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e20746f207075626c69632e0000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c652063616e6e6f74206d696e74206d6f7265207468616e20332060008201527f43524f414b5a2100000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686572652069732061206c696d6974206f6e206d696e74696e6720746f6f2060008201527f6d616e7920617420612074696d65210000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e742100000000000000000000600082015250565b7f4e6f20636f6e7472616374732100000000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446576204d696e74205065726d616e656e746c79204c6f636b65640000000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e2e000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f46696e616c20706861736520697320434c4f5345440000000000000000000000600082015250565b7f4e6f206261636b2d7374657070696e6721000000000000000000000000000000600082015250565b6157f581614b6a565b811461580057600080fd5b50565b61580c81614b7c565b811461581757600080fd5b50565b61582381614b8e565b811461582e57600080fd5b50565b61583a81614b9a565b811461584557600080fd5b50565b61585181614ba4565b811461585c57600080fd5b50565b61586881614bf0565b811461587357600080fd5b50565b61587f81614bfa565b811461588a57600080fd5b5056fea26469706673582212209f2e9800f5ad316a26812d0b95ae5d598c3da12ca8b3a0dbfa3604fb9fc713da64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000643524f414b5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643524f414b5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f177700000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000002d

-----Decoded View---------------
Arg [0] : name (string): CROAKZ
Arg [1] : symbol (string): CROAKZ
Arg [2] : payees (address[]): 0x60A7B634FF8Ab48268Fd2369Ea86F2099a0F1777,0x92BCE497EfE4332a8F611004F67E14093B5d0e8c
Arg [3] : shares_ (uint256[]): 55,45

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 43524f414b5a0000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 43524f414b5a0000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 00000000000000000000000060a7b634ff8ab48268fd2369ea86f2099a0f1777
Arg [10] : 00000000000000000000000092bce497efe4332a8f611004f67e14093b5d0e8c
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [13] : 000000000000000000000000000000000000000000000000000000000000002d


Deployed Bytecode Sourcemap

57599:5493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54301:40;54317:12;:10;:12::i;:::-;54331:9;54301:40;;;;;;;:::i;:::-;;;;;;;;57599:5493;;;;;62659:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34825:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63008:79;;;;;;;;;;;;;:::i;:::-;;21714:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61926:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23273:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22796:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58782:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35465:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55507:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24163:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62465:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35133:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54432:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24573:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35655:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59029:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21408:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21138:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44046:94;;;;;;;;;;;;;:::i;:::-;;55207:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43395:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21883:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55007:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23566:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58911:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24829:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60787:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59506:801;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54803:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54617:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23932:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62157:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44295:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60555:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16171:98;16224:7;16251:10;16244:17;;16171:98;:::o;62659:341::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62757:13:::1;;;;;;;;;;;62756:14;62748:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;62818:9;62813:180;62837:10;:17;62833:1;:21;62813:180;;;62876:28;:16;:26;:28::i;:::-;62919:62;62929:10;62940:1;62929:13;;;;;;;;:::i;:::-;;;;;;;;62973:7;62944:26;:16;:24;:26::i;:::-;:36;;;;:::i;:::-;62919:9;:62::i;:::-;62856:3;;;;;:::i;:::-;;;;62813:180;;;;62659:341:::0;:::o;34825:224::-;34927:4;34966:35;34951:50;;;:11;:50;;;;:90;;;;35005:36;35029:11;35005:23;:36::i;:::-;34951:90;34944:97;;34825:224;;;:::o;63008:79::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63075:4:::1;63059:13;;:20;;;;;;;;;;;;;;;;;;63008:79::o:0;21714:100::-;21768:13;21801:5;21794:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21714:100;:::o;61926:223::-;61990:13;62006:21;62016:10;62006:9;:21::i;:::-;61990:37;;62046:8;62038:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62127:14;62132:8;62127:4;:14::i;:::-;61979:170;61926:223;:::o;23273:221::-;23349:7;23377:16;23385:7;23377;:16::i;:::-;23369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23462:15;:24;23478:7;23462:24;;;;;;;;;;;;;;;;;;;;;23455:31;;23273:221;;;:::o;22796:411::-;22877:13;22893:23;22908:7;22893:14;:23::i;:::-;22877:39;;22941:5;22935:11;;:2;:11;;;;22927:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23035:5;23019:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23044:37;23061:5;23068:12;:10;:12::i;:::-;23044:16;:37::i;:::-;23019:62;22997:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23178:21;23187:2;23191:7;23178:8;:21::i;:::-;22866:341;22796:411;;:::o;58782:121::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58881:14:::1;58865:13;;:30;;;;;;;;;;;;;;;;;;58782:121:::0;:::o;35465:113::-;35526:7;35553:10;:17;;;;35546:24;;35465:113;:::o;55507:613::-;55602:1;55583:7;:16;55591:7;55583:16;;;;;;;;;;;;;;;;:20;55575:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55659:21;55707:14;;55683:21;:38;;;;:::i;:::-;55659:62;;55732:15;55802:9;:18;55812:7;55802:18;;;;;;;;;;;;;;;;55787:12;;55767:7;:16;55775:7;55767:16;;;;;;;;;;;;;;;;55751:13;:32;;;;:::i;:::-;55750:49;;;;:::i;:::-;:70;;;;:::i;:::-;55732:88;;55852:1;55841:7;:12;;55833:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55956:7;55935:9;:18;55945:7;55935:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;55914:9;:18;55924:7;55914:18;;;;;;;;;;;;;;;:49;;;;56008:7;55991:14;;:24;;;;:::i;:::-;55974:14;:41;;;;56028:35;56046:7;56055;56028:17;:35::i;:::-;56079:33;56095:7;56104;56079:33;;;;;;;:::i;:::-;;;;;;;;55564:556;;55507:613;:::o;24163:339::-;24358:41;24377:12;:10;:12::i;:::-;24391:7;24358:18;:41::i;:::-;24350:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24466:28;24476:4;24482:2;24486:7;24466:9;:28::i;:::-;24163:339;;;:::o;62465:156::-;62552:1;62539:9;;;;;;;;;;:14;;;62531:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;62599:14;62604:8;62599:4;:14::i;:::-;62465:156;:::o;35133:256::-;35230:7;35266:23;35283:5;35266:16;:23::i;:::-;35258:5;:31;35250:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35355:12;:19;35368:5;35355:19;;;;;;;;;;;;;;;:26;35375:5;35355:26;;;;;;;;;;;;35348:33;;35133:256;;;;:::o;54432:91::-;54476:7;54503:12;;54496:19;;54432:91;:::o;24573:185::-;24711:39;24728:4;24734:2;24738:7;24711:39;;;;;;;;;;;;:16;:39::i;:::-;24573:185;;;:::o;35655:233::-;35730:7;35766:30;:28;:30::i;:::-;35758:5;:38;35750:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35863:10;35874:5;35863:17;;;;;;;;:::i;:::-;;;;;;;;;;35856:24;;35655:233;;;:::o;59029:109::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59122:8:::1;59103:16;:27;;;;;;;;;;;;:::i;:::-;;59029:109:::0;:::o;21408:239::-;21480:7;21500:13;21516:7;:16;21524:7;21516:16;;;;;;;;;;;;;;;;;;;;;21500:32;;21568:1;21551:19;;:5;:19;;;;21543:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21634:5;21627:12;;;21408:239;;;:::o;21138:208::-;21210:7;21255:1;21238:19;;:5;:19;;;;21230:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21322:9;:16;21332:5;21322:16;;;;;;;;;;;;;;;;21315:23;;21138:208;;;:::o;44046:94::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44111:21:::1;44129:1;44111:9;:21::i;:::-;44046:94::o:0;55207:100::-;55258:7;55285;55293:5;55285:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55278:21;;55207:100;;;:::o;43395:87::-;43441:7;43468:6;;;;;;;;;;;43461:13;;43395:87;:::o;21883:104::-;21939:13;21972:7;21965:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21883:104;:::o;55007:109::-;55063:7;55090:9;:18;55100:7;55090:18;;;;;;;;;;;;;;;;55083:25;;55007:109;;;:::o;23566:295::-;23681:12;:10;:12::i;:::-;23669:24;;:8;:24;;;;23661:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23781:8;23736:18;:32;23755:12;:10;:12::i;:::-;23736:32;;;;;;;;;;;;;;;:42;23769:8;23736:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23834:8;23805:48;;23820:12;:10;:12::i;:::-;23805:48;;;23844:8;23805:48;;;;;;:::i;:::-;;;;;;;;23566:295;;:::o;58911:110::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59001:12:::1;58987:11;;:26;;;;;;;;;;;;;;;;;;58911:110:::0;:::o;24829:328::-;25004:41;25023:12;:10;:12::i;:::-;25037:7;25004:18;:41::i;:::-;24996:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25110:39;25124:4;25130:2;25134:7;25143:5;25110:13;:39::i;:::-;24829:328;;;;:::o;60787:87::-;60832:5;60857:9;;;;;;;;;;60850:16;;60787:87;:::o;59506:801::-;59579:13;59613:16;59621:7;59613;:16::i;:::-;59605:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59694:23;59720:10;:19;59731:7;59720:19;;;;;;;;;;;59694:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59750:18;59771:10;:8;:10::i;:::-;59750:31;;59887:1;59871:4;59865:18;:23;59861:72;;;59912:9;59905:16;;;;;;59861:72;60063:1;60043:9;60037:23;:27;60033:108;;;60112:4;60118:9;60095:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60081:48;;;;;;60033:108;60273:4;60279:18;:7;:16;:18::i;:::-;60256:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60242:57;;;;59506:801;;;;:::o;54803:105::-;54857:7;54884;:16;54892:7;54884:16;;;;;;;;;;;;;;;;54877:23;;54803:105;;;:::o;54617:95::-;54663:7;54690:14;;54683:21;;54617:95;:::o;23932:164::-;24029:4;24053:18;:25;24072:5;24053:25;;;;;;;;;;;;;;;:35;24079:8;24053:35;;;;;;;;;;;;;;;;;;;;;;;;;24046:42;;23932:164;;;;:::o;62157:300::-;62311:18;62359:10;62342:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62332:39;;;;;;62311:60;;62382:42;62400:11;;;;;;;;;;;62413:10;62382:7;:17;;:42;;;;;:::i;:::-;62435:14;62440:8;62435:4;:14::i;:::-;62252:205;62157:300;;:::o;44295:192::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44404:1:::1;44384:22;;:8;:22;;;;44376:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44460:19;44470:8;44460:9;:19::i;:::-;44295:192:::0;:::o;60555:224::-;43626:12;:10;:12::i;:::-;43615:23;;:7;:5;:7::i;:::-;:23;;;43607:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60647:9:::1;::::0;::::1;;;;;;;;60634:22;;:10;:22;;;60626:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;60711:1;60697:10;:15;;;;60689:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;60761:10;60749:9;::::0;:22:::1;;;;;;;;;;;;;;;;;;60555:224:::0;:::o;41920:127::-;42027:1;42009:7;:14;;;:19;;;;;;;;;;;41920:127;:::o;41798:114::-;41863:7;41890;:14;;;41883:21;;41798:114;;;:::o;27651:110::-;27727:26;27737:2;27741:7;27727:26;;;;;;;;;;;;:9;:26::i;:::-;27651:110;;:::o;20769:305::-;20871:4;20923:25;20908:40;;;:11;:40;;;;:105;;;;20980:33;20965:48;;;:11;:48;;;;20908:105;:158;;;;21030:36;21054:11;21030:23;:36::i;:::-;20908:158;20888:178;;20769:305;;;:::o;60315:232::-;60374:4;60391:21;60422:13;;;;;;;;;;;60391:45;;60447:21;60471:14;:24;;;60496:7;60471:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60447:57;;60538:1;60522:13;:17;60515:24;;;;60315:232;;;:::o;60882:1036::-;60955:1;60942:9;;;;;;;;;;:14;;;:32;;;;60973:1;60960:9;;;;;;;;;;:14;;;60942:32;60934:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61032:9;61018:23;;:10;:23;;;61010:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61103:8;58083:11;61091:20;;;;:::i;:::-;61078:9;:33;;61070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57933:4;61179:8;61157:19;:9;:17;:19::i;:::-;:30;;;;:::i;:::-;:43;;61149:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;61273:1;61260:9;;;;;;;;;;:14;;;61256:454;;;58148:1;61320:64;;61351:8;61320:16;:28;61337:10;61320:28;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;;;:::i;:::-;:64;;61312:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;61256:454;;;57985:2;61484:8;:25;;61476:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58037:2;61613:8;61584:4;:14;;;61599:10;61584:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;;:::i;:::-;:56;;61576:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;61256:454;61727:9;61722:189;61746:8;61742:1;:12;61722:189;;;61776:21;:9;:19;:21::i;:::-;61812:16;:28;61829:10;61812:28;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;61857:42;61867:10;61879:19;:9;:17;:19::i;:::-;61857:9;:42::i;:::-;61756:3;;;;;:::i;:::-;;;;61722:189;;;;60882:1036;:::o;26667:127::-;26732:4;26784:1;26756:30;;:7;:16;26764:7;26756:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26749:37;;26667:127;;;:::o;30649:174::-;30751:2;30724:15;:24;30740:7;30724:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30807:7;30803:2;30769:46;;30778:23;30793:7;30778:14;:23::i;:::-;30769:46;;;;;;;;;;;;30649:174;;:::o;9529:317::-;9644:6;9619:21;:31;;9611:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9698:12;9716:9;:14;;9738:6;9716:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9697:52;;;9768:7;9760:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9600:246;9529:317;;:::o;26961:348::-;27054:4;27079:16;27087:7;27079;:16::i;:::-;27071:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27155:13;27171:23;27186:7;27171:14;:23::i;:::-;27155:39;;27224:5;27213:16;;:7;:16;;;:51;;;;27257:7;27233:31;;:20;27245:7;27233:11;:20::i;:::-;:31;;;27213:51;:87;;;;27268:32;27285:5;27292:7;27268:16;:32::i;:::-;27213:87;27205:96;;;26961:348;;;;:::o;29953:578::-;30112:4;30085:31;;:23;30100:7;30085:14;:23::i;:::-;:31;;;30077:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30195:1;30181:16;;:2;:16;;;;30173:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30251:39;30272:4;30278:2;30282:7;30251:20;:39::i;:::-;30355:29;30372:1;30376:7;30355:8;:29::i;:::-;30416:1;30397:9;:15;30407:4;30397:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30445:1;30428:9;:13;30438:2;30428:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30476:2;30457:7;:16;30465:7;30457:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30515:7;30511:2;30496:27;;30505:4;30496:27;;;;;;;;;;;;29953:578;;;:::o;44495:173::-;44551:16;44570:6;;;;;;;;;;;44551:25;;44596:8;44587:6;;:17;;;;;;;;;;;;;;;;;;44651:8;44620:40;;44641:8;44620:40;;;;;;;;;;;;44540:128;44495:173;:::o;26039:315::-;26196:28;26206:4;26212:2;26216:7;26196:9;:28::i;:::-;26243:48;26266:4;26272:2;26276:7;26285:5;26243:22;:48::i;:::-;26235:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26039:315;;;;:::o;59377:117::-;59437:13;59470:16;59463:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59377:117;:::o;16704:723::-;16760:13;16990:1;16981:5;:10;16977:53;;;17008:10;;;;;;;;;;;;;;;;;;;;;16977:53;17040:12;17055:5;17040:20;;17071:14;17096:78;17111:1;17103:4;:9;17096:78;;17129:8;;;;;:::i;:::-;;;;17160:2;17152:10;;;;;:::i;:::-;;;17096:78;;;17184:19;17216:6;17206:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17184:39;;17234:154;17250:1;17241:5;:10;17234:154;;17278:1;17268:11;;;;;:::i;:::-;;;17345:2;17337:5;:10;;;;:::i;:::-;17324:2;:24;;;;:::i;:::-;17311:39;;17294:6;17301;17294:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17374:2;17365:11;;;;;:::i;:::-;;;17234:154;;;17412:6;17398:21;;;;;16704:723;;;;:::o;57079:442::-;57270:198;57329:19;;;;;;;;;;;;;;;;;57350:10;57312:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57302:60;;;;;;57385:4;:6;;;57414:4;:6;;;57443:4;:6;;;57270:198;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57243:225;;:6;:225;;;57221:292;;;;;;;;;;;;:::i;:::-;;;;;;;;;57079:442;;;:::o;27988:321::-;28118:18;28124:2;28128:7;28118:5;:18::i;:::-;28169:54;28200:1;28204:2;28208:7;28217:5;28169:22;:54::i;:::-;28147:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27988:321;;;:::o;19267:157::-;19352:4;19391:25;19376:40;;;:11;:40;;;;19369:47;;19267:157;;;:::o;36501:589::-;36645:45;36672:4;36678:2;36682:7;36645:26;:45::i;:::-;36723:1;36707:18;;:4;:18;;;36703:187;;;36742:40;36774:7;36742:31;:40::i;:::-;36703:187;;;36812:2;36804:10;;:4;:10;;;36800:90;;36831:47;36864:4;36870:7;36831:32;:47::i;:::-;36800:90;36703:187;36918:1;36904:16;;:2;:16;;;36900:183;;;36937:45;36974:7;36937:36;:45::i;:::-;36900:183;;;37010:4;37004:10;;:2;:10;;;37000:83;;37031:40;37059:2;37063:7;37031:27;:40::i;:::-;37000:83;36900:183;36501:589;;;:::o;31388:799::-;31543:4;31564:15;:2;:13;;;:15::i;:::-;31560:620;;;31616:2;31600:36;;;31637:12;:10;:12::i;:::-;31651:4;31657:7;31666:5;31600:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31596:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31859:1;31842:6;:13;:18;31838:272;;;31885:60;;;;;;;;;;:::i;:::-;;;;;;;;31838:272;32060:6;32054:13;32045:6;32041:2;32037:15;32030:38;31596:529;31733:41;;;31723:51;;;:6;:51;;;;31716:58;;;;;31560:620;32164:4;32157:11;;31388:799;;;;;;;:::o;28645:382::-;28739:1;28725:16;;:2;:16;;;;28717:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28798:16;28806:7;28798;:16::i;:::-;28797:17;28789:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:45;28889:1;28893:2;28897:7;28860:20;:45::i;:::-;28935:1;28918:9;:13;28928:2;28918:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28966:2;28947:7;:16;28955:7;28947:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29011:7;29007:2;28986:33;;29003:1;28986:33;;;;;;;;;;;;28645:382;;:::o;32759:126::-;;;;:::o;37813:164::-;37917:10;:17;;;;37890:15;:24;37906:7;37890:24;;;;;;;;;;;:44;;;;37945:10;37961:7;37945:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37813:164;:::o;38604:988::-;38870:22;38920:1;38895:22;38912:4;38895:16;:22::i;:::-;:26;;;;:::i;:::-;38870:51;;38932:18;38953:17;:26;38971:7;38953:26;;;;;;;;;;;;38932:47;;39100:14;39086:10;:28;39082:328;;39131:19;39153:12;:18;39166:4;39153:18;;;;;;;;;;;;;;;:34;39172:14;39153:34;;;;;;;;;;;;39131:56;;39237:11;39204:12;:18;39217:4;39204:18;;;;;;;;;;;;;;;:30;39223:10;39204:30;;;;;;;;;;;:44;;;;39354:10;39321:17;:30;39339:11;39321:30;;;;;;;;;;;:43;;;;39116:294;39082:328;39506:17;:26;39524:7;39506:26;;;;;;;;;;;39499:33;;;39550:12;:18;39563:4;39550:18;;;;;;;;;;;;;;;:34;39569:14;39550:34;;;;;;;;;;;39543:41;;;38685:907;;38604:988;;:::o;39887:1079::-;40140:22;40185:1;40165:10;:17;;;;:21;;;;:::i;:::-;40140:46;;40197:18;40218:15;:24;40234:7;40218:24;;;;;;;;;;;;40197:45;;40569:19;40591:10;40602:14;40591:26;;;;;;;;:::i;:::-;;;;;;;;;;40569:48;;40655:11;40630:10;40641;40630:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40766:10;40735:15;:28;40751:11;40735:28;;;;;;;;;;;:41;;;;40907:15;:24;40923:7;40907:24;;;;;;;;;;;40900:31;;;40942:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39958:1008;;;39887:1079;:::o;37391:221::-;37476:14;37493:20;37510:2;37493:16;:20::i;:::-;37476:37;;37551:7;37524:12;:16;37537:2;37524:16;;;;;;;;;;;;;;;:24;37541:6;37524:24;;;;;;;;;;;:34;;;;37598:6;37569:17;:26;37587:7;37569:26;;;;;;;;;;;:35;;;;37465:147;37391:221;;:::o;8207:387::-;8267:4;8475:12;8542:7;8530:20;8522:28;;8585:1;8578:4;:8;8571:15;;;8207: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:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:370::-;1980:5;2029:3;2022:4;2014:6;2010:17;2006:27;1996:122;;2037:79;;:::i;:::-;1996:122;2154:6;2141:20;2179:94;2269:3;2261:6;2254:4;2246:6;2242:17;2179:94;:::i;:::-;2170:103;;1986:293;1909:370;;;;:::o;2285:133::-;2328:5;2366:6;2353:20;2344:29;;2382:30;2406:5;2382:30;:::i;:::-;2285:133;;;;:::o;2424:139::-;2470:5;2508:6;2495:20;2486:29;;2524:33;2551:5;2524:33;:::i;:::-;2424:139;;;;:::o;2569:137::-;2614:5;2652:6;2639:20;2630:29;;2668:32;2694:5;2668:32;:::i;:::-;2569:137;;;;:::o;2712:141::-;2768:5;2799:6;2793:13;2784:22;;2815:32;2841:5;2815:32;:::i;:::-;2712:141;;;;:::o;2872:338::-;2927:5;2976:3;2969:4;2961:6;2957:17;2953:27;2943:122;;2984:79;;:::i;:::-;2943:122;3101:6;3088:20;3126:78;3200:3;3192:6;3185:4;3177:6;3173:17;3126:78;:::i;:::-;3117:87;;2933:277;2872:338;;;;:::o;3230:340::-;3286:5;3335:3;3328:4;3320:6;3316:17;3312:27;3302:122;;3343:79;;:::i;:::-;3302:122;3460:6;3447:20;3485:79;3560:3;3552:6;3545:4;3537:6;3533:17;3485:79;:::i;:::-;3476:88;;3292:278;3230:340;;;;:::o;3618:731::-;3699:5;3743:4;3731:9;3726:3;3722:19;3718:30;3715:117;;;3751:79;;:::i;:::-;3715:117;3850:21;3866:4;3850:21;:::i;:::-;3841:30;;3927:1;3967:47;4010:3;4001:6;3990:9;3986:22;3967:47;:::i;:::-;3960:4;3953:5;3949:16;3942:73;3881:145;4082:2;4123:49;4168:3;4159:6;4148:9;4144:22;4123:49;:::i;:::-;4116:4;4109:5;4105:16;4098:75;4036:148;4240:2;4281:49;4326:3;4317:6;4306:9;4302:22;4281:49;:::i;:::-;4274:4;4267:5;4263:16;4256:75;4194:148;3618:731;;;;:::o;4355:139::-;4401:5;4439:6;4426:20;4417:29;;4455:33;4482:5;4455:33;:::i;:::-;4355:139;;;;:::o;4500:143::-;4557:5;4588:6;4582:13;4573:22;;4604:33;4631:5;4604:33;:::i;:::-;4500:143;;;;:::o;4649:135::-;4693:5;4731:6;4718:20;4709:29;;4747:31;4772:5;4747:31;:::i;:::-;4649:135;;;;:::o;4790:329::-;4849:6;4898:2;4886:9;4877:7;4873:23;4869:32;4866:119;;;4904:79;;:::i;:::-;4866:119;5024:1;5049:53;5094:7;5085:6;5074:9;5070:22;5049:53;:::i;:::-;5039:63;;4995:117;4790:329;;;;:::o;5125:345::-;5192:6;5241:2;5229:9;5220:7;5216:23;5212:32;5209:119;;;5247:79;;:::i;:::-;5209:119;5367:1;5392:61;5445:7;5436:6;5425:9;5421:22;5392:61;:::i;:::-;5382:71;;5338:125;5125:345;;;;:::o;5476:474::-;5544:6;5552;5601:2;5589:9;5580:7;5576:23;5572:32;5569:119;;;5607:79;;:::i;:::-;5569:119;5727:1;5752:53;5797:7;5788:6;5777:9;5773:22;5752:53;:::i;:::-;5742:63;;5698:117;5854:2;5880:53;5925:7;5916:6;5905:9;5901:22;5880:53;:::i;:::-;5870:63;;5825:118;5476:474;;;;;:::o;5956:619::-;6033:6;6041;6049;6098:2;6086:9;6077:7;6073:23;6069:32;6066:119;;;6104:79;;:::i;:::-;6066:119;6224:1;6249:53;6294:7;6285:6;6274:9;6270:22;6249:53;:::i;:::-;6239:63;;6195:117;6351:2;6377:53;6422:7;6413:6;6402:9;6398:22;6377:53;:::i;:::-;6367:63;;6322:118;6479:2;6505:53;6550:7;6541:6;6530:9;6526:22;6505:53;:::i;:::-;6495:63;;6450:118;5956:619;;;;;:::o;6581:943::-;6676:6;6684;6692;6700;6749:3;6737:9;6728:7;6724:23;6720:33;6717:120;;;6756:79;;:::i;:::-;6717:120;6876:1;6901:53;6946:7;6937:6;6926:9;6922:22;6901:53;:::i;:::-;6891:63;;6847:117;7003:2;7029:53;7074:7;7065:6;7054:9;7050:22;7029:53;:::i;:::-;7019:63;;6974:118;7131:2;7157:53;7202:7;7193:6;7182:9;7178:22;7157:53;:::i;:::-;7147:63;;7102:118;7287:2;7276:9;7272:18;7259:32;7318:18;7310:6;7307:30;7304:117;;;7340:79;;:::i;:::-;7304:117;7445:62;7499:7;7490:6;7479:9;7475:22;7445:62;:::i;:::-;7435:72;;7230:287;6581:943;;;;;;;:::o;7530:468::-;7595:6;7603;7652:2;7640:9;7631:7;7627:23;7623:32;7620:119;;;7658:79;;:::i;:::-;7620:119;7778:1;7803:53;7848:7;7839:6;7828:9;7824:22;7803:53;:::i;:::-;7793:63;;7749:117;7905:2;7931:50;7973:7;7964:6;7953:9;7949:22;7931:50;:::i;:::-;7921:60;;7876:115;7530:468;;;;;:::o;8004:474::-;8072:6;8080;8129:2;8117:9;8108:7;8104:23;8100:32;8097:119;;;8135:79;;:::i;:::-;8097:119;8255:1;8280:53;8325:7;8316:6;8305:9;8301:22;8280:53;:::i;:::-;8270:63;;8226:117;8382:2;8408:53;8453:7;8444:6;8433:9;8429:22;8408:53;:::i;:::-;8398:63;;8353:118;8004:474;;;;;:::o;8484:539::-;8568:6;8617:2;8605:9;8596:7;8592:23;8588:32;8585:119;;;8623:79;;:::i;:::-;8585:119;8771:1;8760:9;8756:17;8743:31;8801:18;8793:6;8790:30;8787:117;;;8823:79;;:::i;:::-;8787:117;8928:78;8998:7;8989:6;8978:9;8974:22;8928:78;:::i;:::-;8918:88;;8714:302;8484:539;;;;:::o;9029:327::-;9087:6;9136:2;9124:9;9115:7;9111:23;9107:32;9104:119;;;9142:79;;:::i;:::-;9104:119;9262:1;9287:52;9331:7;9322:6;9311:9;9307:22;9287:52;:::i;:::-;9277:62;;9233:116;9029:327;;;;:::o;9362:349::-;9431:6;9480:2;9468:9;9459:7;9455:23;9451:32;9448:119;;;9486:79;;:::i;:::-;9448:119;9606:1;9631:63;9686:7;9677:6;9666:9;9662:22;9631:63;:::i;:::-;9621:73;;9577:127;9362:349;;;;:::o;9717:509::-;9786:6;9835:2;9823:9;9814:7;9810:23;9806:32;9803:119;;;9841:79;;:::i;:::-;9803:119;9989:1;9978:9;9974:17;9961:31;10019:18;10011:6;10008:30;10005:117;;;10041:79;;:::i;:::-;10005:117;10146:63;10201:7;10192:6;10181:9;10177:22;10146:63;:::i;:::-;10136:73;;9932:287;9717:509;;;;:::o;10232:329::-;10291:6;10340:2;10328:9;10319:7;10315:23;10311:32;10308:119;;;10346:79;;:::i;:::-;10308:119;10466:1;10491:53;10536:7;10527:6;10516:9;10512:22;10491:53;:::i;:::-;10481:63;;10437:117;10232:329;;;;:::o;10567:351::-;10637:6;10686:2;10674:9;10665:7;10661:23;10657:32;10654:119;;;10692:79;;:::i;:::-;10654:119;10812:1;10837:64;10893:7;10884:6;10873:9;10869:22;10837:64;:::i;:::-;10827:74;;10783:128;10567:351;;;;:::o;10924:539::-;11024:6;11032;11081:3;11069:9;11060:7;11056:23;11052:33;11049:120;;;11088:79;;:::i;:::-;11049:120;11208:1;11233:53;11278:7;11269:6;11258:9;11254:22;11233:53;:::i;:::-;11223:63;;11179:117;11335:2;11361:85;11438:7;11429:6;11418:9;11414:22;11361:85;:::i;:::-;11351:95;;11306:150;10924:539;;;;;:::o;11469:325::-;11526:6;11575:2;11563:9;11554:7;11550:23;11546:32;11543:119;;;11581:79;;:::i;:::-;11543:119;11701:1;11726:51;11769:7;11760:6;11749:9;11745:22;11726:51;:::i;:::-;11716:61;;11672:115;11469:325;;;;:::o;11800:147::-;11895:45;11934:5;11895:45;:::i;:::-;11890:3;11883:58;11800:147;;:::o;11953:118::-;12040:24;12058:5;12040:24;:::i;:::-;12035:3;12028:37;11953:118;;:::o;12077:157::-;12182:45;12202:24;12220:5;12202:24;:::i;:::-;12182:45;:::i;:::-;12177:3;12170:58;12077:157;;:::o;12240:109::-;12321:21;12336:5;12321:21;:::i;:::-;12316:3;12309:34;12240:109;;:::o;12355:118::-;12442:24;12460:5;12442:24;:::i;:::-;12437:3;12430:37;12355:118;;:::o;12479:157::-;12584:45;12604:24;12622:5;12604:24;:::i;:::-;12584:45;:::i;:::-;12579:3;12572:58;12479:157;;:::o;12642:360::-;12728:3;12756:38;12788:5;12756:38;:::i;:::-;12810:70;12873:6;12868:3;12810:70;:::i;:::-;12803:77;;12889:52;12934:6;12929:3;12922:4;12915:5;12911:16;12889:52;:::i;:::-;12966:29;12988:6;12966:29;:::i;:::-;12961:3;12957:39;12950:46;;12732:270;12642:360;;;;:::o;13008:364::-;13096:3;13124:39;13157:5;13124:39;:::i;:::-;13179:71;13243:6;13238:3;13179:71;:::i;:::-;13172:78;;13259:52;13304:6;13299:3;13292:4;13285:5;13281:16;13259:52;:::i;:::-;13336:29;13358:6;13336:29;:::i;:::-;13331:3;13327:39;13320:46;;13100:272;13008:364;;;;:::o;13378:377::-;13484:3;13512:39;13545:5;13512:39;:::i;:::-;13567:89;13649:6;13644:3;13567:89;:::i;:::-;13560:96;;13665:52;13710:6;13705:3;13698:4;13691:5;13687:16;13665:52;:::i;:::-;13742:6;13737:3;13733:16;13726:23;;13488:267;13378:377;;;;:::o;13761:366::-;13903:3;13924:67;13988:2;13983:3;13924:67;:::i;:::-;13917:74;;14000:93;14089:3;14000:93;:::i;:::-;14118:2;14113:3;14109:12;14102:19;;13761:366;;;:::o;14133:::-;14275:3;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14372:93;14461:3;14372:93;:::i;:::-;14490:2;14485:3;14481:12;14474:19;;14133:366;;;:::o;14505:::-;14647:3;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14744:93;14833:3;14744:93;:::i;:::-;14862:2;14857:3;14853:12;14846:19;;14505:366;;;:::o;14877:::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;14877:366;;;:::o;15249:::-;15391:3;15412:67;15476:2;15471:3;15412:67;:::i;:::-;15405:74;;15488:93;15577:3;15488:93;:::i;:::-;15606:2;15601:3;15597:12;15590:19;;15249:366;;;:::o;15621:::-;15763:3;15784:67;15848:2;15843:3;15784:67;:::i;:::-;15777:74;;15860:93;15949:3;15860:93;:::i;:::-;15978:2;15973:3;15969:12;15962:19;;15621:366;;;:::o;15993:::-;16135:3;16156:67;16220:2;16215:3;16156:67;:::i;:::-;16149:74;;16232:93;16321:3;16232:93;:::i;:::-;16350:2;16345:3;16341:12;16334:19;;15993:366;;;:::o;16365:::-;16507:3;16528:67;16592:2;16587:3;16528:67;:::i;:::-;16521:74;;16604:93;16693:3;16604:93;:::i;:::-;16722:2;16717:3;16713:12;16706:19;;16365:366;;;:::o;16737:::-;16879:3;16900:67;16964:2;16959:3;16900:67;:::i;:::-;16893:74;;16976:93;17065:3;16976:93;:::i;:::-;17094:2;17089:3;17085:12;17078:19;;16737:366;;;:::o;17109:::-;17251:3;17272:67;17336:2;17331:3;17272:67;:::i;:::-;17265:74;;17348:93;17437:3;17348:93;:::i;:::-;17466:2;17461:3;17457:12;17450:19;;17109:366;;;:::o;17481:::-;17623:3;17644:67;17708:2;17703:3;17644:67;:::i;:::-;17637:74;;17720:93;17809:3;17720:93;:::i;:::-;17838:2;17833:3;17829:12;17822:19;;17481:366;;;:::o;17853:::-;17995:3;18016:67;18080:2;18075:3;18016:67;:::i;:::-;18009:74;;18092:93;18181:3;18092:93;:::i;:::-;18210:2;18205:3;18201:12;18194:19;;17853:366;;;:::o;18225:::-;18367:3;18388:67;18452:2;18447:3;18388:67;:::i;:::-;18381:74;;18464:93;18553:3;18464:93;:::i;:::-;18582:2;18577:3;18573:12;18566:19;;18225:366;;;:::o;18597:::-;18739:3;18760:67;18824:2;18819:3;18760:67;:::i;:::-;18753:74;;18836:93;18925:3;18836:93;:::i;:::-;18954:2;18949:3;18945:12;18938:19;;18597:366;;;:::o;18969:::-;19111:3;19132:67;19196:2;19191:3;19132:67;:::i;:::-;19125:74;;19208:93;19297:3;19208:93;:::i;:::-;19326:2;19321:3;19317:12;19310:19;;18969:366;;;:::o;19341:::-;19483:3;19504:67;19568:2;19563:3;19504:67;:::i;:::-;19497:74;;19580:93;19669:3;19580:93;:::i;:::-;19698:2;19693:3;19689:12;19682:19;;19341:366;;;:::o;19713:::-;19855:3;19876:67;19940:2;19935:3;19876:67;:::i;:::-;19869:74;;19952:93;20041:3;19952:93;:::i;:::-;20070:2;20065:3;20061:12;20054:19;;19713:366;;;:::o;20085:::-;20227:3;20248:67;20312:2;20307:3;20248:67;:::i;:::-;20241:74;;20324:93;20413:3;20324:93;:::i;:::-;20442:2;20437:3;20433:12;20426:19;;20085:366;;;:::o;20457:::-;20599:3;20620:67;20684:2;20679:3;20620:67;:::i;:::-;20613:74;;20696:93;20785:3;20696:93;:::i;:::-;20814:2;20809:3;20805:12;20798:19;;20457:366;;;:::o;20829:::-;20971:3;20992:67;21056:2;21051:3;20992:67;:::i;:::-;20985:74;;21068:93;21157:3;21068:93;:::i;:::-;21186:2;21181:3;21177:12;21170:19;;20829:366;;;:::o;21201:::-;21343:3;21364:67;21428:2;21423:3;21364:67;:::i;:::-;21357:74;;21440:93;21529:3;21440:93;:::i;:::-;21558:2;21553:3;21549:12;21542:19;;21201:366;;;:::o;21573:::-;21715:3;21736:67;21800:2;21795:3;21736:67;:::i;:::-;21729:74;;21812:93;21901:3;21812:93;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21573:366;;;:::o;21945:::-;22087:3;22108:67;22172:2;22167:3;22108:67;:::i;:::-;22101:74;;22184:93;22273:3;22184:93;:::i;:::-;22302:2;22297:3;22293:12;22286:19;;21945:366;;;:::o;22317:::-;22459:3;22480:67;22544:2;22539:3;22480:67;:::i;:::-;22473:74;;22556:93;22645:3;22556:93;:::i;:::-;22674:2;22669:3;22665:12;22658:19;;22317:366;;;:::o;22689:::-;22831:3;22852:67;22916:2;22911:3;22852:67;:::i;:::-;22845:74;;22928:93;23017:3;22928:93;:::i;:::-;23046:2;23041:3;23037:12;23030:19;;22689:366;;;:::o;23061:::-;23203:3;23224:67;23288:2;23283:3;23224:67;:::i;:::-;23217:74;;23300:93;23389:3;23300:93;:::i;:::-;23418:2;23413:3;23409:12;23402:19;;23061:366;;;:::o;23433:::-;23575:3;23596:67;23660:2;23655:3;23596:67;:::i;:::-;23589:74;;23672:93;23761:3;23672:93;:::i;:::-;23790:2;23785:3;23781:12;23774:19;;23433:366;;;:::o;23805:::-;23947:3;23968:67;24032:2;24027:3;23968:67;:::i;:::-;23961:74;;24044:93;24133:3;24044:93;:::i;:::-;24162:2;24157:3;24153:12;24146:19;;23805:366;;;:::o;24177:::-;24319:3;24340:67;24404:2;24399:3;24340:67;:::i;:::-;24333:74;;24416:93;24505:3;24416:93;:::i;:::-;24534:2;24529:3;24525:12;24518:19;;24177:366;;;:::o;24549:398::-;24708:3;24729:83;24810:1;24805:3;24729:83;:::i;:::-;24722:90;;24821:93;24910:3;24821:93;:::i;:::-;24939:1;24934:3;24930:11;24923:18;;24549:398;;;:::o;24953:366::-;25095:3;25116:67;25180:2;25175:3;25116:67;:::i;:::-;25109:74;;25192:93;25281:3;25192:93;:::i;:::-;25310:2;25305:3;25301:12;25294:19;;24953:366;;;:::o;25325:::-;25467:3;25488:67;25552:2;25547:3;25488:67;:::i;:::-;25481:74;;25564:93;25653:3;25564:93;:::i;:::-;25682:2;25677:3;25673:12;25666:19;;25325:366;;;:::o;25697:::-;25839:3;25860:67;25924:2;25919:3;25860:67;:::i;:::-;25853:74;;25936:93;26025:3;25936:93;:::i;:::-;26054:2;26049:3;26045:12;26038:19;;25697:366;;;:::o;26069:::-;26211:3;26232:67;26296:2;26291:3;26232:67;:::i;:::-;26225:74;;26308:93;26397:3;26308:93;:::i;:::-;26426:2;26421:3;26417:12;26410:19;;26069:366;;;:::o;26441:::-;26583:3;26604:67;26668:2;26663:3;26604:67;:::i;:::-;26597:74;;26680:93;26769:3;26680:93;:::i;:::-;26798:2;26793:3;26789:12;26782:19;;26441:366;;;:::o;26813:::-;26955:3;26976:67;27040:2;27035:3;26976:67;:::i;:::-;26969:74;;27052:93;27141:3;27052:93;:::i;:::-;27170:2;27165:3;27161:12;27154:19;;26813:366;;;:::o;27185:118::-;27272:24;27290:5;27272:24;:::i;:::-;27267:3;27260:37;27185:118;;:::o;27309:112::-;27392:22;27408:5;27392:22;:::i;:::-;27387:3;27380:35;27309:112;;:::o;27427:256::-;27539:3;27554:75;27625:3;27616:6;27554:75;:::i;:::-;27654:2;27649:3;27645:12;27638:19;;27674:3;27667:10;;27427:256;;;;:::o;27689:416::-;27849:3;27871:95;27962:3;27953:6;27871:95;:::i;:::-;27864:102;;27976:75;28047:3;28038:6;27976:75;:::i;:::-;28076:2;28071:3;28067:12;28060:19;;28096:3;28089:10;;27689:416;;;;;:::o;28111:435::-;28291:3;28313:95;28404:3;28395:6;28313:95;:::i;:::-;28306:102;;28425:95;28516:3;28507:6;28425:95;:::i;:::-;28418:102;;28537:3;28530:10;;28111:435;;;;;:::o;28552:379::-;28736:3;28758:147;28901:3;28758:147;:::i;:::-;28751:154;;28922:3;28915:10;;28552:379;;;:::o;28937:222::-;29030:4;29068:2;29057:9;29053:18;29045:26;;29081:71;29149:1;29138:9;29134:17;29125:6;29081:71;:::i;:::-;28937:222;;;;:::o;29165:348::-;29294:4;29332:2;29321:9;29317:18;29309:26;;29345:79;29421:1;29410:9;29406:17;29397:6;29345:79;:::i;:::-;29434:72;29502:2;29491:9;29487:18;29478:6;29434:72;:::i;:::-;29165:348;;;;;:::o;29519:640::-;29714:4;29752:3;29741:9;29737:19;29729:27;;29766:71;29834:1;29823:9;29819:17;29810:6;29766:71;:::i;:::-;29847:72;29915:2;29904:9;29900:18;29891:6;29847:72;:::i;:::-;29929;29997:2;29986:9;29982:18;29973:6;29929:72;:::i;:::-;30048:9;30042:4;30038:20;30033:2;30022:9;30018:18;30011:48;30076:76;30147:4;30138:6;30076:76;:::i;:::-;30068:84;;29519:640;;;;;;;:::o;30165:332::-;30286:4;30324:2;30313:9;30309:18;30301:26;;30337:71;30405:1;30394:9;30390:17;30381:6;30337:71;:::i;:::-;30418:72;30486:2;30475:9;30471:18;30462:6;30418:72;:::i;:::-;30165:332;;;;;:::o;30503:210::-;30590:4;30628:2;30617:9;30613:18;30605:26;;30641:65;30703:1;30692:9;30688:17;30679:6;30641:65;:::i;:::-;30503:210;;;;:::o;30719:545::-;30892:4;30930:3;30919:9;30915:19;30907:27;;30944:71;31012:1;31001:9;30997:17;30988:6;30944:71;:::i;:::-;31025:68;31089:2;31078:9;31074:18;31065:6;31025:68;:::i;:::-;31103:72;31171:2;31160:9;31156:18;31147:6;31103:72;:::i;:::-;31185;31253:2;31242:9;31238:18;31229:6;31185:72;:::i;:::-;30719:545;;;;;;;:::o;31270:313::-;31383:4;31421:2;31410:9;31406:18;31398:26;;31470:9;31464:4;31460:20;31456:1;31445:9;31441:17;31434:47;31498:78;31571:4;31562:6;31498:78;:::i;:::-;31490:86;;31270:313;;;;:::o;31589:419::-;31755:4;31793:2;31782:9;31778:18;31770:26;;31842:9;31836:4;31832:20;31828:1;31817:9;31813:17;31806:47;31870:131;31996:4;31870:131;:::i;:::-;31862:139;;31589:419;;;:::o;32014:::-;32180:4;32218:2;32207:9;32203:18;32195:26;;32267:9;32261:4;32257:20;32253:1;32242:9;32238:17;32231:47;32295:131;32421:4;32295:131;:::i;:::-;32287:139;;32014:419;;;:::o;32439:::-;32605:4;32643:2;32632:9;32628:18;32620:26;;32692:9;32686:4;32682:20;32678:1;32667:9;32663:17;32656:47;32720:131;32846:4;32720:131;:::i;:::-;32712:139;;32439:419;;;:::o;32864:::-;33030:4;33068:2;33057:9;33053:18;33045:26;;33117:9;33111:4;33107:20;33103:1;33092:9;33088:17;33081:47;33145:131;33271:4;33145:131;:::i;:::-;33137:139;;32864:419;;;:::o;33289:::-;33455:4;33493:2;33482:9;33478:18;33470:26;;33542:9;33536:4;33532:20;33528:1;33517:9;33513:17;33506:47;33570:131;33696:4;33570:131;:::i;:::-;33562:139;;33289:419;;;:::o;33714:::-;33880:4;33918:2;33907:9;33903:18;33895:26;;33967:9;33961:4;33957:20;33953:1;33942:9;33938:17;33931:47;33995:131;34121:4;33995:131;:::i;:::-;33987:139;;33714:419;;;:::o;34139:::-;34305:4;34343:2;34332:9;34328:18;34320:26;;34392:9;34386:4;34382:20;34378:1;34367:9;34363:17;34356:47;34420:131;34546:4;34420:131;:::i;:::-;34412:139;;34139:419;;;:::o;34564:::-;34730:4;34768:2;34757:9;34753:18;34745:26;;34817:9;34811:4;34807:20;34803:1;34792:9;34788:17;34781:47;34845:131;34971:4;34845:131;:::i;:::-;34837:139;;34564:419;;;:::o;34989:::-;35155:4;35193:2;35182:9;35178:18;35170:26;;35242:9;35236:4;35232:20;35228:1;35217:9;35213:17;35206:47;35270:131;35396:4;35270:131;:::i;:::-;35262:139;;34989:419;;;:::o;35414:::-;35580:4;35618:2;35607:9;35603:18;35595:26;;35667:9;35661:4;35657:20;35653:1;35642:9;35638:17;35631:47;35695:131;35821:4;35695:131;:::i;:::-;35687:139;;35414:419;;;:::o;35839:::-;36005:4;36043:2;36032:9;36028:18;36020:26;;36092:9;36086:4;36082:20;36078:1;36067:9;36063:17;36056:47;36120:131;36246:4;36120:131;:::i;:::-;36112:139;;35839:419;;;:::o;36264:::-;36430:4;36468:2;36457:9;36453:18;36445:26;;36517:9;36511:4;36507:20;36503:1;36492:9;36488:17;36481:47;36545:131;36671:4;36545:131;:::i;:::-;36537:139;;36264:419;;;:::o;36689:::-;36855:4;36893:2;36882:9;36878:18;36870:26;;36942:9;36936:4;36932:20;36928:1;36917:9;36913:17;36906:47;36970:131;37096:4;36970:131;:::i;:::-;36962:139;;36689:419;;;:::o;37114:::-;37280:4;37318:2;37307:9;37303:18;37295:26;;37367:9;37361:4;37357:20;37353:1;37342:9;37338:17;37331:47;37395:131;37521:4;37395:131;:::i;:::-;37387:139;;37114:419;;;:::o;37539:::-;37705:4;37743:2;37732:9;37728:18;37720:26;;37792:9;37786:4;37782:20;37778:1;37767:9;37763:17;37756:47;37820:131;37946:4;37820:131;:::i;:::-;37812:139;;37539:419;;;:::o;37964:::-;38130:4;38168:2;38157:9;38153:18;38145:26;;38217:9;38211:4;38207:20;38203:1;38192:9;38188:17;38181:47;38245:131;38371:4;38245:131;:::i;:::-;38237:139;;37964:419;;;:::o;38389:::-;38555:4;38593:2;38582:9;38578:18;38570:26;;38642:9;38636:4;38632:20;38628:1;38617:9;38613:17;38606:47;38670:131;38796:4;38670:131;:::i;:::-;38662:139;;38389:419;;;:::o;38814:::-;38980:4;39018:2;39007:9;39003:18;38995:26;;39067:9;39061:4;39057:20;39053:1;39042:9;39038:17;39031:47;39095:131;39221:4;39095:131;:::i;:::-;39087:139;;38814:419;;;:::o;39239:::-;39405:4;39443:2;39432:9;39428:18;39420:26;;39492:9;39486:4;39482:20;39478:1;39467:9;39463:17;39456:47;39520:131;39646:4;39520:131;:::i;:::-;39512:139;;39239:419;;;:::o;39664:::-;39830:4;39868:2;39857:9;39853:18;39845:26;;39917:9;39911:4;39907:20;39903:1;39892:9;39888:17;39881:47;39945:131;40071:4;39945:131;:::i;:::-;39937:139;;39664:419;;;:::o;40089:::-;40255:4;40293:2;40282:9;40278:18;40270:26;;40342:9;40336:4;40332:20;40328:1;40317:9;40313:17;40306:47;40370:131;40496:4;40370:131;:::i;:::-;40362:139;;40089:419;;;:::o;40514:::-;40680:4;40718:2;40707:9;40703:18;40695:26;;40767:9;40761:4;40757:20;40753:1;40742:9;40738:17;40731:47;40795:131;40921:4;40795:131;:::i;:::-;40787:139;;40514:419;;;:::o;40939:::-;41105:4;41143:2;41132:9;41128:18;41120:26;;41192:9;41186:4;41182:20;41178:1;41167:9;41163:17;41156:47;41220:131;41346:4;41220:131;:::i;:::-;41212:139;;40939:419;;;:::o;41364:::-;41530:4;41568:2;41557:9;41553:18;41545:26;;41617:9;41611:4;41607:20;41603:1;41592:9;41588:17;41581:47;41645:131;41771:4;41645:131;:::i;:::-;41637:139;;41364:419;;;:::o;41789:::-;41955:4;41993:2;41982:9;41978:18;41970:26;;42042:9;42036:4;42032:20;42028:1;42017:9;42013:17;42006:47;42070:131;42196:4;42070:131;:::i;:::-;42062:139;;41789:419;;;:::o;42214:::-;42380:4;42418:2;42407:9;42403:18;42395:26;;42467:9;42461:4;42457:20;42453:1;42442:9;42438:17;42431:47;42495:131;42621:4;42495:131;:::i;:::-;42487:139;;42214:419;;;:::o;42639:::-;42805:4;42843:2;42832:9;42828:18;42820:26;;42892:9;42886:4;42882:20;42878:1;42867:9;42863:17;42856:47;42920:131;43046:4;42920:131;:::i;:::-;42912:139;;42639:419;;;:::o;43064:::-;43230:4;43268:2;43257:9;43253:18;43245:26;;43317:9;43311:4;43307:20;43303:1;43292:9;43288:17;43281:47;43345:131;43471:4;43345:131;:::i;:::-;43337:139;;43064:419;;;:::o;43489:::-;43655:4;43693:2;43682:9;43678:18;43670:26;;43742:9;43736:4;43732:20;43728:1;43717:9;43713:17;43706:47;43770:131;43896:4;43770:131;:::i;:::-;43762:139;;43489:419;;;:::o;43914:::-;44080:4;44118:2;44107:9;44103:18;44095:26;;44167:9;44161:4;44157:20;44153:1;44142:9;44138:17;44131:47;44195:131;44321:4;44195:131;:::i;:::-;44187:139;;43914:419;;;:::o;44339:::-;44505:4;44543:2;44532:9;44528:18;44520:26;;44592:9;44586:4;44582:20;44578:1;44567:9;44563:17;44556:47;44620:131;44746:4;44620:131;:::i;:::-;44612:139;;44339:419;;;:::o;44764:::-;44930:4;44968:2;44957:9;44953:18;44945:26;;45017:9;45011:4;45007:20;45003:1;44992:9;44988:17;44981:47;45045:131;45171:4;45045:131;:::i;:::-;45037:139;;44764:419;;;:::o;45189:::-;45355:4;45393:2;45382:9;45378:18;45370:26;;45442:9;45436:4;45432:20;45428:1;45417:9;45413:17;45406:47;45470:131;45596:4;45470:131;:::i;:::-;45462:139;;45189:419;;;:::o;45614:::-;45780:4;45818:2;45807:9;45803:18;45795:26;;45867:9;45861:4;45857:20;45853:1;45842:9;45838:17;45831:47;45895:131;46021:4;45895:131;:::i;:::-;45887:139;;45614:419;;;:::o;46039:::-;46205:4;46243:2;46232:9;46228:18;46220:26;;46292:9;46286:4;46282:20;46278:1;46267:9;46263:17;46256:47;46320:131;46446:4;46320:131;:::i;:::-;46312:139;;46039:419;;;:::o;46464:222::-;46557:4;46595:2;46584:9;46580:18;46572:26;;46608:71;46676:1;46665:9;46661:17;46652:6;46608:71;:::i;:::-;46464:222;;;;:::o;46692:214::-;46781:4;46819:2;46808:9;46804:18;46796:26;;46832:67;46896:1;46885:9;46881:17;46872:6;46832:67;:::i;:::-;46692:214;;;;:::o;46912:129::-;46946:6;46973:20;;:::i;:::-;46963:30;;47002:33;47030:4;47022:6;47002:33;:::i;:::-;46912:129;;;:::o;47047:75::-;47080:6;47113:2;47107:9;47097:19;;47047:75;:::o;47128:311::-;47205:4;47295:18;47287:6;47284:30;47281:56;;;47317:18;;:::i;:::-;47281:56;47367:4;47359:6;47355:17;47347:25;;47427:4;47421;47417:15;47409:23;;47128:311;;;:::o;47445:307::-;47506:4;47596:18;47588:6;47585:30;47582:56;;;47618:18;;:::i;:::-;47582:56;47656:29;47678:6;47656:29;:::i;:::-;47648:37;;47740:4;47734;47730:15;47722:23;;47445:307;;;:::o;47758:308::-;47820:4;47910:18;47902:6;47899:30;47896:56;;;47932:18;;:::i;:::-;47896:56;47970:29;47992:6;47970:29;:::i;:::-;47962:37;;48054:4;48048;48044:15;48036:23;;47758:308;;;:::o;48072:98::-;48123:6;48157:5;48151:12;48141:22;;48072:98;;;:::o;48176:99::-;48228:6;48262:5;48256:12;48246:22;;48176:99;;;:::o;48281:168::-;48364:11;48398:6;48393:3;48386:19;48438:4;48433:3;48429:14;48414:29;;48281:168;;;;:::o;48455:147::-;48556:11;48593:3;48578:18;;48455:147;;;;:::o;48608:169::-;48692:11;48726:6;48721:3;48714:19;48766:4;48761:3;48757:14;48742:29;;48608:169;;;;:::o;48783:148::-;48885:11;48922:3;48907:18;;48783:148;;;;:::o;48937:305::-;48977:3;48996:20;49014:1;48996:20;:::i;:::-;48991:25;;49030:20;49048:1;49030:20;:::i;:::-;49025:25;;49184:1;49116:66;49112:74;49109:1;49106:81;49103:107;;;49190:18;;:::i;:::-;49103:107;49234:1;49231;49227:9;49220:16;;48937:305;;;;:::o;49248:185::-;49288:1;49305:20;49323:1;49305:20;:::i;:::-;49300:25;;49339:20;49357:1;49339:20;:::i;:::-;49334:25;;49378:1;49368:35;;49383:18;;:::i;:::-;49368:35;49425:1;49422;49418:9;49413:14;;49248:185;;;;:::o;49439:348::-;49479:7;49502:20;49520:1;49502:20;:::i;:::-;49497:25;;49536:20;49554:1;49536:20;:::i;:::-;49531:25;;49724:1;49656:66;49652:74;49649:1;49646:81;49641:1;49634:9;49627:17;49623:105;49620:131;;;49731:18;;:::i;:::-;49620:131;49779:1;49776;49772:9;49761:20;;49439:348;;;;:::o;49793:191::-;49833:4;49853:20;49871:1;49853:20;:::i;:::-;49848:25;;49887:20;49905:1;49887:20;:::i;:::-;49882:25;;49926:1;49923;49920:8;49917:34;;;49931:18;;:::i;:::-;49917:34;49976:1;49973;49969:9;49961:17;;49793:191;;;;:::o;49990:96::-;50027:7;50056:24;50074:5;50056:24;:::i;:::-;50045:35;;49990:96;;;:::o;50092:104::-;50137:7;50166:24;50184:5;50166:24;:::i;:::-;50155:35;;50092:104;;;:::o;50202:90::-;50236:7;50279:5;50272:13;50265:21;50254:32;;50202:90;;;:::o;50298:77::-;50335:7;50364:5;50353:16;;50298:77;;;:::o;50381:149::-;50417:7;50457:66;50450:5;50446:78;50435:89;;50381:149;;;:::o;50536:126::-;50573:7;50613:42;50606:5;50602:54;50591:65;;50536:126;;;:::o;50668:77::-;50705:7;50734:5;50723:16;;50668:77;;;:::o;50751:86::-;50786:7;50826:4;50819:5;50815:16;50804:27;;50751:86;;;:::o;50843:134::-;50901:9;50934:37;50965:5;50934:37;:::i;:::-;50921:50;;50843:134;;;:::o;50983:126::-;51033:9;51066:37;51097:5;51066:37;:::i;:::-;51053:50;;50983:126;;;:::o;51115:113::-;51165:9;51198:24;51216:5;51198:24;:::i;:::-;51185:37;;51115:113;;;:::o;51234:154::-;51318:6;51313:3;51308;51295:30;51380:1;51371:6;51366:3;51362:16;51355:27;51234:154;;;:::o;51394:307::-;51462:1;51472:113;51486:6;51483:1;51480:13;51472:113;;;51571:1;51566:3;51562:11;51556:18;51552:1;51547:3;51543:11;51536:39;51508:2;51505:1;51501:10;51496:15;;51472:113;;;51603:6;51600:1;51597:13;51594:101;;;51683:1;51674:6;51669:3;51665:16;51658:27;51594:101;51443:258;51394:307;;;:::o;51707:320::-;51751:6;51788:1;51782:4;51778:12;51768:22;;51835:1;51829:4;51825:12;51856:18;51846:81;;51912:4;51904:6;51900:17;51890:27;;51846:81;51974:2;51966:6;51963:14;51943:18;51940:38;51937:84;;;51993:18;;:::i;:::-;51937:84;51758:269;51707:320;;;:::o;52033:281::-;52116:27;52138:4;52116:27;:::i;:::-;52108:6;52104:40;52246:6;52234:10;52231:22;52210:18;52198:10;52195:34;52192:62;52189:88;;;52257:18;;:::i;:::-;52189:88;52297:10;52293:2;52286:22;52076:238;52033:281;;:::o;52320:233::-;52359:3;52382:24;52400:5;52382:24;:::i;:::-;52373:33;;52428:66;52421:5;52418:77;52415:103;;;52498:18;;:::i;:::-;52415:103;52545:1;52538:5;52534:13;52527:20;;52320:233;;;:::o;52559:167::-;52596:3;52619:22;52635:5;52619:22;:::i;:::-;52610:31;;52663:4;52656:5;52653:15;52650:41;;;52671:18;;:::i;:::-;52650:41;52718:1;52711:5;52707:13;52700:20;;52559:167;;;:::o;52732:100::-;52771:7;52800:26;52820:5;52800:26;:::i;:::-;52789:37;;52732:100;;;:::o;52838:79::-;52877:7;52906:5;52895:16;;52838:79;;;:::o;52923:94::-;52962:7;52991:20;53005:5;52991:20;:::i;:::-;52980:31;;52923:94;;;:::o;53023:176::-;53055:1;53072:20;53090:1;53072:20;:::i;:::-;53067:25;;53106:20;53124:1;53106:20;:::i;:::-;53101:25;;53145:1;53135:35;;53150:18;;:::i;:::-;53135:35;53191:1;53188;53184:9;53179:14;;53023:176;;;;:::o;53205:180::-;53253:77;53250:1;53243:88;53350:4;53347:1;53340:15;53374:4;53371:1;53364:15;53391:180;53439:77;53436:1;53429:88;53536:4;53533:1;53526:15;53560:4;53557:1;53550:15;53577:180;53625:77;53622:1;53615:88;53722:4;53719:1;53712:15;53746:4;53743:1;53736:15;53763:180;53811:77;53808:1;53801:88;53908:4;53905:1;53898:15;53932:4;53929:1;53922:15;53949:180;53997:77;53994:1;53987:88;54094:4;54091:1;54084:15;54118:4;54115:1;54108:15;54135:180;54183:77;54180:1;54173:88;54280:4;54277:1;54270:15;54304:4;54301:1;54294:15;54321:117;54430:1;54427;54420:12;54444:117;54553:1;54550;54543:12;54690:117;54799:1;54796;54789:12;54813:117;54922:1;54919;54912:12;54936:117;55045:1;55042;55035:12;55059:117;55168:1;55165;55158:12;55182:102;55223:6;55274:2;55270:7;55265:2;55258:5;55254:14;55250:28;55240:38;;55182:102;;;:::o;55290:94::-;55323:8;55371:5;55367:2;55363:14;55342:35;;55290:94;;;:::o;55390:240::-;55530:34;55526:1;55518:6;55514:14;55507:58;55599:23;55594:2;55586:6;55582:15;55575:48;55390:240;:::o;55636:230::-;55776:34;55772:1;55764:6;55760:14;55753:58;55845:13;55840:2;55832:6;55828:15;55821:38;55636:230;:::o;55872:237::-;56012:34;56008:1;56000:6;55996:14;55989:58;56081:20;56076:2;56068:6;56064:15;56057:45;55872:237;:::o;56115:225::-;56255:34;56251:1;56243:6;56239:14;56232:58;56324:8;56319:2;56311:6;56307:15;56300:33;56115:225;:::o;56346:244::-;56486:34;56482:1;56474:6;56470:14;56463:58;56555:27;56550:2;56542:6;56538:15;56531:52;56346:244;:::o;56596:225::-;56736:34;56732:1;56724:6;56720:14;56713:58;56805:8;56800:2;56792:6;56788:15;56781:33;56596:225;:::o;56827:178::-;56967:30;56963:1;56955:6;56951:14;56944:54;56827:178;:::o;57011:180::-;57151:32;57147:1;57139:6;57135:14;57128:56;57011:180;:::o;57197:225::-;57337:34;57333:1;57325:6;57321:14;57314:58;57406:8;57401:2;57393:6;57389:15;57382:33;57197:225;:::o;57428:223::-;57568:34;57564:1;57556:6;57552:14;57545:58;57637:6;57632:2;57624:6;57620:15;57613:31;57428:223;:::o;57657:175::-;57797:27;57793:1;57785:6;57781:14;57774:51;57657:175;:::o;57838:226::-;57978:34;57974:1;57966:6;57962:14;57955:58;58047:9;58042:2;58034:6;58030:15;58023:34;57838:226;:::o;58070:245::-;58210:34;58206:1;58198:6;58194:14;58187:58;58279:28;58274:2;58266:6;58262:15;58255:53;58070:245;:::o;58321:179::-;58461:31;58457:1;58449:6;58445:14;58438:55;58321:179;:::o;58506:231::-;58646:34;58642:1;58634:6;58630:14;58623:58;58715:14;58710:2;58702:6;58698:15;58691:39;58506:231;:::o;58743:230::-;58883:34;58879:1;58871:6;58867:14;58860:58;58952:13;58947:2;58939:6;58935:15;58928:38;58743:230;:::o;58979:243::-;59119:34;59115:1;59107:6;59103:14;59096:58;59188:26;59183:2;59175:6;59171:15;59164:51;58979:243;:::o;59228:229::-;59368:34;59364:1;59356:6;59352:14;59345:58;59437:12;59432:2;59424:6;59420:15;59413:37;59228:229;:::o;59463:228::-;59603:34;59599:1;59591:6;59587:14;59580:58;59672:11;59667:2;59659:6;59655:15;59648:36;59463:228;:::o;59697:182::-;59837:34;59833:1;59825:6;59821:14;59814:58;59697:182;:::o;59885:231::-;60025:34;60021:1;60013:6;60009:14;60002:58;60094:14;60089:2;60081:6;60077:15;60070:39;59885:231;:::o;60122:167::-;60262:19;60258:1;60250:6;60246:14;60239:43;60122:167;:::o;60295:182::-;60435:34;60431:1;60423:6;60419:14;60412:58;60295:182;:::o;60483:228::-;60623:34;60619:1;60611:6;60607:14;60600:58;60692:11;60687:2;60679:6;60675:15;60668:36;60483:228;:::o;60717:234::-;60857:34;60853:1;60845:6;60841:14;60834:58;60926:17;60921:2;60913:6;60909:15;60902:42;60717:234;:::o;60957:::-;61097:34;61093:1;61085:6;61081:14;61074:58;61166:17;61161:2;61153:6;61149:15;61142:42;60957:234;:::o;61197:220::-;61337:34;61333:1;61325:6;61321:14;61314:58;61406:3;61401:2;61393:6;61389:15;61382:28;61197:220;:::o;61423:172::-;61563:24;61559:1;61551:6;61547:14;61540:48;61423:172;:::o;61601:163::-;61741:15;61737:1;61729:6;61725:14;61718:39;61601:163;:::o;61770:114::-;;:::o;61890:236::-;62030:34;62026:1;62018:6;62014:14;62007:58;62099:19;62094:2;62086:6;62082:15;62075:44;61890:236;:::o;62132:177::-;62272:29;62268:1;62260:6;62256:14;62249:53;62132:177;:::o;62315:170::-;62455:22;62451:1;62443:6;62439:14;62432:46;62315:170;:::o;62491:231::-;62631:34;62627:1;62619:6;62615:14;62608:58;62700:14;62695:2;62687:6;62683:15;62676:39;62491:231;:::o;62728:171::-;62868:23;62864:1;62856:6;62852:14;62845:47;62728:171;:::o;62905:167::-;63045:19;63041:1;63033:6;63029:14;63022:43;62905:167;:::o;63078:122::-;63151:24;63169:5;63151:24;:::i;:::-;63144:5;63141:35;63131:63;;63190:1;63187;63180:12;63131:63;63078:122;:::o;63206:138::-;63287:32;63313:5;63287:32;:::i;:::-;63280:5;63277:43;63267:71;;63334:1;63331;63324:12;63267:71;63206:138;:::o;63350:116::-;63420:21;63435:5;63420:21;:::i;:::-;63413:5;63410:32;63400:60;;63456:1;63453;63446:12;63400:60;63350:116;:::o;63472:122::-;63545:24;63563:5;63545:24;:::i;:::-;63538:5;63535:35;63525:63;;63584:1;63581;63574:12;63525:63;63472:122;:::o;63600:120::-;63672:23;63689:5;63672:23;:::i;:::-;63665:5;63662:34;63652:62;;63710:1;63707;63700:12;63652:62;63600:120;:::o;63726:122::-;63799:24;63817:5;63799:24;:::i;:::-;63792:5;63789:35;63779:63;;63838:1;63835;63828:12;63779:63;63726:122;:::o;63854:118::-;63925:22;63941:5;63925:22;:::i;:::-;63918:5;63915:33;63905:61;;63962:1;63959;63952:12;63905:61;63854:118;:::o

Swarm Source

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