ETH Price: $3,004.16 (+1.12%)
Gas: 6 Gwei

Token

KEVOLUTION NFT (KEVO)
 

Overview

Max Total Supply

4,534 KEVO

Holders

788

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 KEVO
0x8394f023ca9fd93a42d1c5f156e428d88f25b299
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Kevolution

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/*

                                             
                            ::::::::::::::::::::::::::::::::::                            
                            #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                            
                      :%%%%%***@@@============================%%%%%+                      
                   .==+*****+++@@@----------------------------******==:                   
                 ..-@@#---==+**@@@---------------------------------+@@+..                 
                 @@%-----=++%@@---------------------------------------*@@:                
              +##+++-----=++%@@---------------------------------------+**###              
              #@@-----===+**@@@+++++=----------------=+++++++++++-----=++%@@              
              #@@-----=++#@@@@@@@@@@#----------------*@@@@@@@@@@%--------%@@              
           +%%***+++++*@@+..........-@@*----------+@@+..........-@@#-----+**%%%           
           *@@%#######*++:          .++***=-----***++:  :========+++**+--+++@@@           
           *@@@@@@@@@@*                =@@+-----@@#     *@@@@@@@#  -@@*--+++@@@           
           *@@*++--+@@*                =@@+-----@@#     *@@@@@@@#  -@@*--+++@@@           
           *@@*++--+@@*                =@@+-----@@#     *@@@@@@@#  -@@*--+++@@@           
        .::*%%*++--+@@*  .:::::        =@@+-----@@#     =#######+  -@@*--=++%%%::.        
        =@@#++=----+@@*  =@@@@@        =@@+-----@@#                -@@*-----+++@@*        
        =@@#++=----+@@#::*@@@@@      ::*@@+-----@@%::.           ::=@@*-----+++@@*        
        =@@#++=----=##*++******.....:++*##=-----##*++-..........:++*##+-----+++@@*        
        =@@#++=-------+@@*::::::::::+@@*----------+@@*::::::::::=@@#--------+++@@*        
        =@@#++=----------*@@@@@@@@@@#----------------*@@@@@@@@@@%-----------+++@@*        
        =@@#++=----------+**********+----------------+**********+-----------+++@@*        
        =@@#++=-------------------------------------------------------------+++@@*        
        =@@#++=-------------------------------------------------------------+++@@*        
        =@@#+++++--------------@@@@@@@@@@@@@@@@@@@@@@@@@@@@+-------------++++++@@*        
        =@@#+++++--------------###@@@@@@@@@@@@@@@@@@@@@@%##=-------------++++++@@*        
        =@@#+++++-----------------@@@@@@@@@@@@@@@@@@@@@@+----------------++++++@@*        
           *@@*+++++--------------------------------------------------=+++++@@@           
           *@@*+++++--------------------------------------------------=+++++@@@           
           +%%***+++=====----------------------------------------======++***%%%           
              #@@++++++++=--------------------------------------=++++++++%@@              
              .::%%%%%#++++++++----------------------------=+++++++*%%%%%=::              
                 +++++*########============================*#######*+++++.                
                      -@@@@@@@@++++++++++++++++++++++++++++%@@@@@@@*                      
                               @@@@@@@@@@@@@@@@@@@@@@@@@@@@:                              
                               ============================.                              
                                                                 

## KEVolution is an experimental play to win blockchain gaming event and meme based series of 5 derivative NFT sets. ##
## Find matches between sets to win a share of 270 ETH in prizes and free mints galore. ##

https://kevolution.art
https://twitter.com/kevolutionNFTs

*/

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

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

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]

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


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

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


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

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

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


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

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


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    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]

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


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

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


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

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

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

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

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


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

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


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


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

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








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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



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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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

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


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

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

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

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

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

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

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

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


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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File contracts/Kevolution.sol

//SPDX-License-Identifier: Unlicense




contract Kevolution is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
  mapping(uint256 => string) public baseURIs;
  bool public paused = true;

  uint256 public constant MAX_VERSION_SUPPLY = 4444;
  uint256 public constant FINAL_VERSION = 5;

  mapping(uint256 => uint256) public versionSupply;
  mapping(uint256 => uint256) public versionPrice;

  address public addyKevLogicContract;

  event PairMinted(address indexed to, uint256 indexed rootTokenId, uint256 indexed version, uint256 newMintTokenId);

  constructor() ERC721('KEVOLUTION NFT', 'KEVO') { }

  /** ONLY OWNER */

  function setBaseURI(string memory _uri, uint256 _version) external onlyOwner {
    baseURIs[_version] = _uri;
  }

  function setKevLogicContract(address _address) external onlyOwner {
    addyKevLogicContract = _address;
  }

  function setPrice(uint256 _version, uint256 _price) external onlyOwner {
    versionPrice[_version] = _price;
  }

  function setPause(bool _pause) external onlyOwner {
    paused = _pause;
  }

  function withdrawTokens(address _tokenAddress) external onlyOwner {
    uint256 amount = IERC20(_tokenAddress).balanceOf(address(this));

    IERC20(_tokenAddress).transfer(owner(), amount);
  }

  function withdrawETH() external onlyOwner {
    uint256 amount = address(this).balance;

    (bool success, ) = owner().call{ value: amount }('');
    require(success, 'Failed to send Ether');
  }

  /** PUBLIC */

  function freeMint(uint256 _amount) external nonReentrant {
    require(!paused, 'Minting is paused');

    require(_amount > 0, 'Amount should be 1 or more');
    require(_amount <= 10, 'Amount should be 10 or less');

    uint256 supply = totalSupply();
    require(supply + _amount <= MAX_VERSION_SUPPLY, 'Exceeds free mint supply');

    require(balanceOf(_msgSender()) + _amount <= 20, 'Max 20 per wallet');

    for (uint256 i = 0; i < _amount; i++) {
      _safeMint(msg.sender, supply + i + 1);
    }
  }

  function mint(uint256 _amount, uint256 _version) external payable nonReentrant {
    require(!paused, 'Minting is paused');

    uint256 supply = totalSupply();

    require(_version >= 2, 'Version must be 2 or higher');
    require(_version <= FINAL_VERSION, 'Version exceeds max');

    if (_version == 2) {
      require(supply >= MAX_VERSION_SUPPLY, 'Free mint must be sold out first');
    } else {
      require(supply >= MAX_VERSION_SUPPLY * 2, 'Version 2 must be sold out first');
    }

    require(versionPrice[_version] > 0, 'Price must be set');
    require(_amount > 0, 'Amount should be 1 or more');
    require(_amount <= 10, 'Amount should be 10 or less');

    require(msg.value >= versionPrice[_version] * _amount, 'Invalid price');
    require(versionSupply[_version] + _amount <= MAX_VERSION_SUPPLY, 'Exceeds version supply');

    uint256 tokenId = ((_version - 1) * MAX_VERSION_SUPPLY) + versionSupply[_version] + 1;

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

    versionSupply[_version] += _amount;
  }

  function version(uint256 _tokenId) public view returns (uint256) {
    if (!_exists(_tokenId)) {
      return 0;
    }

    return ((_tokenId - 1) / MAX_VERSION_SUPPLY) + 1;
  }

  function pairMint(
    address _to,
    uint256 _rootTokenId,
    uint256 _version
  ) external {
    require(!paused, 'Minting is paused');

    require(_msgSender() == addyKevLogicContract, 'Access denied');

    require(_version > 2, 'Version must be 3 or higher');
    require(_version <= FINAL_VERSION, 'Version exceeds max');
    require(versionSupply[_version] + 1 <= MAX_VERSION_SUPPLY, 'Exceeds version supply');

    uint256 tokenId = ((_version - 1) * MAX_VERSION_SUPPLY) + versionSupply[_version] + 1;

    if (_version == FINAL_VERSION) {
      tokenId = (MAX_VERSION_SUPPLY * (FINAL_VERSION - 1)) + _rootTokenId;
    }

    _safeMint(_to, tokenId);

    versionSupply[_version]++;

    emit PairMinted(_to, _rootTokenId, _version, tokenId);
  }

  /** OVERRIDES */
  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    string memory baseURI = baseURIs[version(_tokenId)];
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, Strings.toString(_tokenId)))
        : '';
  }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"rootTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMintTokenId","type":"uint256"}],"name":"PairMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FINAL_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VERSION_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addyKevLogicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"baseURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_rootTokenId","type":"uint256"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"pairMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_uri","type":"string"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setKevLogicContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_version","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"versionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"versionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600e81526020017f4b45564f4c5554494f4e204e46540000000000000000000000000000000000008152506040518060400160405280600481526020017f4b45564f000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b1929190620001c9565b508060019080519060200190620000ca929190620001c9565b505050620000ed620000e1620000fb60201b60201c565b6200010360201b60201c565b6001600b81905550620002de565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d79062000279565b90600052602060002090601f016020900481019282620001fb576000855562000247565b82601f106200021657805160ff191683800117855562000247565b8280016001018555821562000247579182015b828111156200024657825182559160200191906001019062000229565b5b5090506200025691906200025a565b5090565b5b80821115620002755760008160009055506001016200025b565b5090565b600060028204905060018216806200029257607f821691505b60208210811415620002a957620002a8620002af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61527d80620002ee6000396000f3fe60806040526004361061020e5760003560e01c8063715018a611610118578063bedb86fb116100a0578063e086e5ec1161006f578063e086e5ec146107d5578063e985e9c5146107ec578063e9bb140f14610829578063f2fde38b14610854578063f7d975771461087d5761020e565b8063bedb86fb146106f5578063c87b56dd1461071e578063ccf335ff1461075b578063d3cbde31146107985761020e565b806391898c52116100e757806391898c521461062657806395d89b411461064f5780639bd9d18d1461067a578063a22cb465146106a3578063b88d4fde146106cc5761020e565b8063715018a61461057e5780637c928fe9146105955780638da5cb5b146105be57806391564206146105e95761020e565b80633f31b81e1161019b5780634f6ccce71161016a5780634f6ccce7146104715780635c975abb146104ae5780636352211e146104d95780636e76f5571461051657806370a08231146105415761020e565b80633f31b81e146103b757806342842e0e146103e257806349df728c1461040b5780634d05721a146104345761020e565b8063095ea7b3116101e2578063095ea7b3146102e157806318160ddd1461030a5780631b2ef1ca1461033557806323b872dd146103515780632f745c591461037a5761020e565b80629f25ff1461021357806301ffc9a71461023c57806306fdde0314610279578063081812fc146102a4575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613a3c565b6108a6565b005b34801561024857600080fd5b50610263600480360381019061025e91906139ea565b61094e565b6040516102709190614180565b60405180910390f35b34801561028557600080fd5b5061028e610960565b60405161029b919061419b565b60405180910390f35b3480156102b057600080fd5b506102cb60048036038101906102c69190613a90565b6109f2565b6040516102d891906140f0565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061390d565b610a77565b005b34801561031657600080fd5b5061031f610b8f565b60405161032c91906145fd565b60405180910390f35b61034f600480360381019061034a9190613ae2565b610b9c565b005b34801561035d57600080fd5b5061037860048036038101906103739190613807565b610fcb565b005b34801561038657600080fd5b506103a1600480360381019061039c919061390d565b61102b565b6040516103ae91906145fd565b60405180910390f35b3480156103c357600080fd5b506103cc6110d0565b6040516103d991906145fd565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613807565b6110d5565b005b34801561041757600080fd5b50610432600480360381019061042d91906137a2565b6110f5565b005b34801561044057600080fd5b5061045b60048036038101906104569190613a90565b611297565b60405161046891906145fd565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613a90565b6112af565b6040516104a591906145fd565b60405180910390f35b3480156104ba57600080fd5b506104c3611346565b6040516104d09190614180565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190613a90565b611359565b60405161050d91906140f0565b60405180910390f35b34801561052257600080fd5b5061052b61140b565b60405161053891906145fd565b60405180910390f35b34801561054d57600080fd5b50610568600480360381019061056391906137a2565b611411565b60405161057591906145fd565b60405180910390f35b34801561058a57600080fd5b506105936114c9565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613a90565b611551565b005b3480156105ca57600080fd5b506105d361177c565b6040516105e091906140f0565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613a90565b6117a6565b60405161061d919061419b565b60405180910390f35b34801561063257600080fd5b5061064d600480360381019061064891906137a2565b611846565b005b34801561065b57600080fd5b50610664611906565b604051610671919061419b565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613949565b611998565b005b3480156106af57600080fd5b506106ca60048036038101906106c591906138d1565b611c6d565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613856565b611c83565b005b34801561070157600080fd5b5061071c60048036038101906107179190613998565b611ce5565b005b34801561072a57600080fd5b5061074560048036038101906107409190613a90565b611d7e565b604051610752919061419b565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190613a90565b611ec1565b60405161078f91906145fd565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190613a90565b611ed9565b6040516107cc91906145fd565b60405180910390f35b3480156107e157600080fd5b506107ea611f1f565b005b3480156107f857600080fd5b50610813600480360381019061080e91906137cb565b612057565b6040516108209190614180565b60405180910390f35b34801561083557600080fd5b5061083e6120eb565b60405161084b91906140f0565b60405180910390f35b34801561086057600080fd5b5061087b600480360381019061087691906137a2565b612111565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613ae2565b612209565b005b6108ae6122a1565b73ffffffffffffffffffffffffffffffffffffffff166108cc61177c565b73ffffffffffffffffffffffffffffffffffffffff1614610922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109199061441d565b60405180910390fd5b81600c6000838152602001908152602001600020908051906020019061094992919061359c565b505050565b6000610959826122a9565b9050919050565b60606000805461096f906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461099b906148b8565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82612323565b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a33906143fd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8282611359565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea9061447d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b126122a1565b73ffffffffffffffffffffffffffffffffffffffff161480610b415750610b4081610b3b6122a1565b612057565b5b610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b779061435d565b60405180910390fd5b610b8a838361238f565b505050565b6000600880549050905090565b6002600b541415610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd99061457d565b60405180910390fd5b6002600b81905550600d60009054906101000a900460ff1615610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906144bd565b60405180910390fd5b6000610c44610b8f565b90506002821015610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906143bd565b60405180910390fd5b6005821115610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc5906145dd565b60405180910390fd5b6002821415610d215761115c811015610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061431d565b60405180910390fd5b610d73565b600261115c610d309190614774565b811015610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d69906144dd565b60405180910390fd5b5b6000600f60008481526020019081526020016000205411610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061459d565b60405180910390fd5b60008311610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906145bd565b60405180910390fd5b600a831115610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906141bd565b60405180910390fd5b82600f600084815260200190815260200160002054610e6f9190614774565b341015610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea89061455d565b60405180910390fd5b61115c83600e600085815260200190815260200160002054610ed391906146ed565b1115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b906141dd565b60405180910390fd5b60006001600e60008581526020019081526020016000205461115c600186610f3c91906147ce565b610f469190614774565b610f5091906146ed565b610f5a91906146ed565b905060005b84811015610f9257610f713383612448565b8180610f7c9061491b565b9250508080610f8a9061491b565b915050610f5f565b5083600e60008581526020019081526020016000206000828254610fb691906146ed565b9250508190555050506001600b819055505050565b610fdc610fd66122a1565b82612466565b61101b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110129061449d565b60405180910390fd5b611026838383612544565b505050565b600061103683611411565b8210611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e906141fd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600581565b6110f083838360405180602001604052806000815250611c83565b505050565b6110fd6122a1565b73ffffffffffffffffffffffffffffffffffffffff1661111b61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111689061441d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111ac91906140f0565b60206040518083038186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fc9190613ab9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61122261177c565b836040518363ffffffff1660e01b8152600401611240929190614157565b602060405180830381600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129291906139c1565b505050565b600e6020528060005260406000206000915090505481565b60006112b9610b8f565b82106112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906144fd565b60405180910390fd5b60088281548110611334577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061439d565b60405180910390fd5b80915050919050565b61115c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114799061437d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114d16122a1565b73ffffffffffffffffffffffffffffffffffffffff166114ef61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061441d565b60405180910390fd5b61154f60006127a0565b565b6002600b541415611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e9061457d565b60405180910390fd5b6002600b81905550600d60009054906101000a900460ff16156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e6906144bd565b60405180910390fd5b60008111611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611629906145bd565b60405180910390fd5b600a811115611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d906141bd565b60405180910390fd5b6000611680610b8f565b905061115c828261169191906146ed565b11156116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c99061425d565b60405180910390fd5b6014826116e56116e06122a1565b611411565b6116ef91906146ed565b1115611730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117279061429d565b60405180910390fd5b60005b8281101561176f5761175c336001838561174d91906146ed565b61175791906146ed565b612448565b80806117679061491b565b915050611733565b50506001600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60205280600052604060002060009150905080546117c5906148b8565b80601f01602080910402602001604051908101604052809291908181526020018280546117f1906148b8565b801561183e5780601f106118135761010080835404028352916020019161183e565b820191906000526020600020905b81548152906001019060200180831161182157829003601f168201915b505050505081565b61184e6122a1565b73ffffffffffffffffffffffffffffffffffffffff1661186c61177c565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061441d565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611915906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611941906148b8565b801561198e5780601f106119635761010080835404028352916020019161198e565b820191906000526020600020905b81548152906001019060200180831161197157829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df906144bd565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a296122a1565b73ffffffffffffffffffffffffffffffffffffffff1614611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061453d565b60405180910390fd5b60028111611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab99061451d565b60405180910390fd5b6005811115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd906145dd565b60405180910390fd5b61115c6001600e600084815260200190815260200160002054611b2991906146ed565b1115611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b61906141dd565b60405180910390fd5b60006001600e60008481526020019081526020016000205461115c600185611b9291906147ce565b611b9c9190614774565b611ba691906146ed565b611bb091906146ed565b90506005821415611be4578260016005611bca91906147ce565b61115c611bd79190614774565b611be191906146ed565b90505b611bee8482612448565b600e60008381526020019081526020016000206000815480929190611c129061491b565b919050555081838573ffffffffffffffffffffffffffffffffffffffff167f2365f88fc0e4d3086622918879eb645308f6b3fde06305db16513c967e2ff0f984604051611c5f91906145fd565b60405180910390a450505050565b611c7f611c786122a1565b8383612866565b5050565b611c94611c8e6122a1565b83612466565b611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9061449d565b60405180910390fd5b611cdf848484846129d3565b50505050565b611ced6122a1565b73ffffffffffffffffffffffffffffffffffffffff16611d0b61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d589061441d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060611d8982612323565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061445d565b60405180910390fd5b6000600c6000611dd785611ed9565b81526020019081526020016000208054611df0906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1c906148b8565b8015611e695780601f10611e3e57610100808354040283529160200191611e69565b820191906000526020600020905b815481529060010190602001808311611e4c57829003601f168201915b505050505090506000815111611e8e5760405180602001604052806000815250611eb9565b80611e9884612a2f565b604051602001611ea99291906140b7565b6040516020818303038152906040525b915050919050565b600f6020528060005260406000206000915090505481565b6000611ee482612323565b611ef15760009050611f1a565b600161115c600184611f0391906147ce565b611f0d9190614743565b611f1791906146ed565b90505b919050565b611f276122a1565b73ffffffffffffffffffffffffffffffffffffffff16611f4561177c565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061441d565b60405180910390fd5b60004790506000611faa61177c565b73ffffffffffffffffffffffffffffffffffffffff1682604051611fcd906140db565b60006040518083038185875af1925050503d806000811461200a576040519150601f19603f3d011682016040523d82523d6000602084013e61200f565b606091505b5050905080612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906142bd565b60405180910390fd5b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121196122a1565b73ffffffffffffffffffffffffffffffffffffffff1661213761177c565b73ffffffffffffffffffffffffffffffffffffffff161461218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121849061441d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f49061423d565b60405180910390fd5b612206816127a0565b50565b6122116122a1565b73ffffffffffffffffffffffffffffffffffffffff1661222f61177c565b73ffffffffffffffffffffffffffffffffffffffff1614612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c9061441d565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231c575061231b82612bdc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661240283611359565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612462828260405180602001604052806000815250612cbe565b5050565b600061247182612323565b6124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a79061433d565b60405180910390fd5b60006124bb83611359565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252a57508373ffffffffffffffffffffffffffffffffffffffff16612512846109f2565b73ffffffffffffffffffffffffffffffffffffffff16145b8061253b575061253a8185612057565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661256482611359565b73ffffffffffffffffffffffffffffffffffffffff16146125ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b19061443d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561262a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621906142dd565b60405180910390fd5b612635838383612d19565b61264060008261238f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269091906147ce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e791906146ed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc906142fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129c69190614180565b60405180910390a3505050565b6129de848484612544565b6129ea84848484612d29565b612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a209061421d565b60405180910390fd5b50505050565b60606000821415612a77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bd7565b600082905060005b60008214612aa9578080612a929061491b565b915050600a82612aa29190614743565b9150612a7f565b60008167ffffffffffffffff811115612aeb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b60008514612bd057600182612b3691906147ce565b9150600a85612b459190614964565b6030612b5191906146ed565b60f81b818381518110612b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bc99190614743565b9450612b21565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ca757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cb75750612cb682612ec0565b5b9050919050565b612cc88383612f2a565b612cd56000848484612d29565b612d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0b9061421d565b60405180910390fd5b505050565b612d248383836130f8565b505050565b6000612d4a8473ffffffffffffffffffffffffffffffffffffffff1661320c565b15612eb3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d736122a1565b8786866040518563ffffffff1660e01b8152600401612d95949392919061410b565b602060405180830381600087803b158015612daf57600080fd5b505af1925050508015612de057506040513d601f19601f82011682018060405250810190612ddd9190613a13565b60015b612e63573d8060008114612e10576040519150601f19603f3d011682016040523d82523d6000602084013e612e15565b606091505b50600081511415612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e529061421d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb8565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f91906143dd565b60405180910390fd5b612fa381612323565b15612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda9061427d565b60405180910390fd5b612fef60008383612d19565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461303f91906146ed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61310383838361321f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131465761314181613224565b613185565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318457613183838261326d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c8576131c3816133da565b613207565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461320657613205828261351d565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161327a84611411565b61328491906147ce565b9050600060076000848152602001908152602001600020549050818114613369576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133ee91906147ce565b9050600060096000848152602001908152602001600020549050600060088381548110613444577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061348c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613501577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061352883611411565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135a8906148b8565b90600052602060002090601f0160209004810192826135ca5760008555613611565b82601f106135e357805160ff1916838001178555613611565b82800160010185558215613611579182015b828111156136105782518255916020019190600101906135f5565b5b50905061361e9190613622565b5090565b5b8082111561363b576000816000905550600101613623565b5090565b600061365261364d8461463d565b614618565b90508281526020810184848401111561366a57600080fd5b613675848285614876565b509392505050565b600061369061368b8461466e565b614618565b9050828152602081018484840111156136a857600080fd5b6136b3848285614876565b509392505050565b6000813590506136ca816151eb565b92915050565b6000813590506136df81615202565b92915050565b6000815190506136f481615202565b92915050565b60008135905061370981615219565b92915050565b60008151905061371e81615219565b92915050565b600082601f83011261373557600080fd5b813561374584826020860161363f565b91505092915050565b600082601f83011261375f57600080fd5b813561376f84826020860161367d565b91505092915050565b60008135905061378781615230565b92915050565b60008151905061379c81615230565b92915050565b6000602082840312156137b457600080fd5b60006137c2848285016136bb565b91505092915050565b600080604083850312156137de57600080fd5b60006137ec858286016136bb565b92505060206137fd858286016136bb565b9150509250929050565b60008060006060848603121561381c57600080fd5b600061382a868287016136bb565b935050602061383b868287016136bb565b925050604061384c86828701613778565b9150509250925092565b6000806000806080858703121561386c57600080fd5b600061387a878288016136bb565b945050602061388b878288016136bb565b935050604061389c87828801613778565b925050606085013567ffffffffffffffff8111156138b957600080fd5b6138c587828801613724565b91505092959194509250565b600080604083850312156138e457600080fd5b60006138f2858286016136bb565b9250506020613903858286016136d0565b9150509250929050565b6000806040838503121561392057600080fd5b600061392e858286016136bb565b925050602061393f85828601613778565b9150509250929050565b60008060006060848603121561395e57600080fd5b600061396c868287016136bb565b935050602061397d86828701613778565b925050604061398e86828701613778565b9150509250925092565b6000602082840312156139aa57600080fd5b60006139b8848285016136d0565b91505092915050565b6000602082840312156139d357600080fd5b60006139e1848285016136e5565b91505092915050565b6000602082840312156139fc57600080fd5b6000613a0a848285016136fa565b91505092915050565b600060208284031215613a2557600080fd5b6000613a338482850161370f565b91505092915050565b60008060408385031215613a4f57600080fd5b600083013567ffffffffffffffff811115613a6957600080fd5b613a758582860161374e565b9250506020613a8685828601613778565b9150509250929050565b600060208284031215613aa257600080fd5b6000613ab084828501613778565b91505092915050565b600060208284031215613acb57600080fd5b6000613ad98482850161378d565b91505092915050565b60008060408385031215613af557600080fd5b6000613b0385828601613778565b9250506020613b1485828601613778565b9150509250929050565b613b2781614802565b82525050565b613b3681614814565b82525050565b6000613b478261469f565b613b5181856146b5565b9350613b61818560208601614885565b613b6a81614a51565b840191505092915050565b6000613b80826146aa565b613b8a81856146d1565b9350613b9a818560208601614885565b613ba381614a51565b840191505092915050565b6000613bb9826146aa565b613bc381856146e2565b9350613bd3818560208601614885565b80840191505092915050565b6000613bec601b836146d1565b9150613bf782614a62565b602082019050919050565b6000613c0f6016836146d1565b9150613c1a82614a8b565b602082019050919050565b6000613c32602b836146d1565b9150613c3d82614ab4565b604082019050919050565b6000613c556032836146d1565b9150613c6082614b03565b604082019050919050565b6000613c786026836146d1565b9150613c8382614b52565b604082019050919050565b6000613c9b6018836146d1565b9150613ca682614ba1565b602082019050919050565b6000613cbe601c836146d1565b9150613cc982614bca565b602082019050919050565b6000613ce16011836146d1565b9150613cec82614bf3565b602082019050919050565b6000613d046014836146d1565b9150613d0f82614c1c565b602082019050919050565b6000613d276024836146d1565b9150613d3282614c45565b604082019050919050565b6000613d4a6019836146d1565b9150613d5582614c94565b602082019050919050565b6000613d6d6020836146d1565b9150613d7882614cbd565b602082019050919050565b6000613d90602c836146d1565b9150613d9b82614ce6565b604082019050919050565b6000613db36038836146d1565b9150613dbe82614d35565b604082019050919050565b6000613dd6602a836146d1565b9150613de182614d84565b604082019050919050565b6000613df96029836146d1565b9150613e0482614dd3565b604082019050919050565b6000613e1c601b836146d1565b9150613e2782614e22565b602082019050919050565b6000613e3f6020836146d1565b9150613e4a82614e4b565b602082019050919050565b6000613e62602c836146d1565b9150613e6d82614e74565b604082019050919050565b6000613e856020836146d1565b9150613e9082614ec3565b602082019050919050565b6000613ea86029836146d1565b9150613eb382614eec565b604082019050919050565b6000613ecb602f836146d1565b9150613ed682614f3b565b604082019050919050565b6000613eee6021836146d1565b9150613ef982614f8a565b604082019050919050565b6000613f116000836146c6565b9150613f1c82614fd9565b600082019050919050565b6000613f346031836146d1565b9150613f3f82614fdc565b604082019050919050565b6000613f576011836146d1565b9150613f628261502b565b602082019050919050565b6000613f7a6020836146d1565b9150613f8582615054565b602082019050919050565b6000613f9d602c836146d1565b9150613fa88261507d565b604082019050919050565b6000613fc0601b836146d1565b9150613fcb826150cc565b602082019050919050565b6000613fe3600d836146d1565b9150613fee826150f5565b602082019050919050565b6000614006600d836146d1565b91506140118261511e565b602082019050919050565b6000614029601f836146d1565b915061403482615147565b602082019050919050565b600061404c6011836146d1565b915061405782615170565b602082019050919050565b600061406f601a836146d1565b915061407a82615199565b602082019050919050565b60006140926013836146d1565b915061409d826151c2565b602082019050919050565b6140b18161486c565b82525050565b60006140c38285613bae565b91506140cf8284613bae565b91508190509392505050565b60006140e682613f04565b9150819050919050565b60006020820190506141056000830184613b1e565b92915050565b60006080820190506141206000830187613b1e565b61412d6020830186613b1e565b61413a60408301856140a8565b818103606083015261414c8184613b3c565b905095945050505050565b600060408201905061416c6000830185613b1e565b61417960208301846140a8565b9392505050565b60006020820190506141956000830184613b2d565b92915050565b600060208201905081810360008301526141b58184613b75565b905092915050565b600060208201905081810360008301526141d681613bdf565b9050919050565b600060208201905081810360008301526141f681613c02565b9050919050565b6000602082019050818103600083015261421681613c25565b9050919050565b6000602082019050818103600083015261423681613c48565b9050919050565b6000602082019050818103600083015261425681613c6b565b9050919050565b6000602082019050818103600083015261427681613c8e565b9050919050565b6000602082019050818103600083015261429681613cb1565b9050919050565b600060208201905081810360008301526142b681613cd4565b9050919050565b600060208201905081810360008301526142d681613cf7565b9050919050565b600060208201905081810360008301526142f681613d1a565b9050919050565b6000602082019050818103600083015261431681613d3d565b9050919050565b6000602082019050818103600083015261433681613d60565b9050919050565b6000602082019050818103600083015261435681613d83565b9050919050565b6000602082019050818103600083015261437681613da6565b9050919050565b6000602082019050818103600083015261439681613dc9565b9050919050565b600060208201905081810360008301526143b681613dec565b9050919050565b600060208201905081810360008301526143d681613e0f565b9050919050565b600060208201905081810360008301526143f681613e32565b9050919050565b6000602082019050818103600083015261441681613e55565b9050919050565b6000602082019050818103600083015261443681613e78565b9050919050565b6000602082019050818103600083015261445681613e9b565b9050919050565b6000602082019050818103600083015261447681613ebe565b9050919050565b6000602082019050818103600083015261449681613ee1565b9050919050565b600060208201905081810360008301526144b681613f27565b9050919050565b600060208201905081810360008301526144d681613f4a565b9050919050565b600060208201905081810360008301526144f681613f6d565b9050919050565b6000602082019050818103600083015261451681613f90565b9050919050565b6000602082019050818103600083015261453681613fb3565b9050919050565b6000602082019050818103600083015261455681613fd6565b9050919050565b6000602082019050818103600083015261457681613ff9565b9050919050565b600060208201905081810360008301526145968161401c565b9050919050565b600060208201905081810360008301526145b68161403f565b9050919050565b600060208201905081810360008301526145d681614062565b9050919050565b600060208201905081810360008301526145f681614085565b9050919050565b600060208201905061461260008301846140a8565b92915050565b6000614622614633565b905061462e82826148ea565b919050565b6000604051905090565b600067ffffffffffffffff82111561465857614657614a22565b5b61466182614a51565b9050602081019050919050565b600067ffffffffffffffff82111561468957614688614a22565b5b61469282614a51565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146f88261486c565b91506147038361486c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473857614737614995565b5b828201905092915050565b600061474e8261486c565b91506147598361486c565b925082614769576147686149c4565b5b828204905092915050565b600061477f8261486c565b915061478a8361486c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147c3576147c2614995565b5b828202905092915050565b60006147d98261486c565b91506147e48361486c565b9250828210156147f7576147f6614995565b5b828203905092915050565b600061480d8261484c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148a3578082015181840152602081019050614888565b838111156148b2576000848401525b50505050565b600060028204905060018216806148d057607f821691505b602082108114156148e4576148e36149f3565b5b50919050565b6148f382614a51565b810181811067ffffffffffffffff8211171561491257614911614a22565b5b80604052505050565b60006149268261486c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561495957614958614995565b5b600182019050919050565b600061496f8261486c565b915061497a8361486c565b92508261498a576149896149c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416d6f756e742073686f756c64206265203130206f72206c6573730000000000600082015250565b7f457863656564732076657273696f6e20737570706c7900000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732066726565206d696e7420737570706c790000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178203230207065722077616c6c6574000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f46726565206d696e74206d75737420626520736f6c64206f7574206669727374600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f56657273696f6e206d7573742062652032206f72206869676865720000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f56657273696f6e2032206d75737420626520736f6c64206f7574206669727374600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f56657273696f6e206d7573742062652033206f72206869676865720000000000600082015250565b7f4163636573732064656e69656400000000000000000000000000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5072696365206d75737420626520736574000000000000000000000000000000600082015250565b7f416d6f756e742073686f756c642062652031206f72206d6f7265000000000000600082015250565b7f56657273696f6e2065786365656473206d617800000000000000000000000000600082015250565b6151f481614802565b81146151ff57600080fd5b50565b61520b81614814565b811461521657600080fd5b50565b61522281614820565b811461522d57600080fd5b50565b6152398161486c565b811461524457600080fd5b5056fea264697066735822122075da0c129c93a39e06a1ed7cab9c58a7924b35c29b1375e2b8ff5ce183e9226f64736f6c63430008040033

Deployed Bytecode

0x60806040526004361061020e5760003560e01c8063715018a611610118578063bedb86fb116100a0578063e086e5ec1161006f578063e086e5ec146107d5578063e985e9c5146107ec578063e9bb140f14610829578063f2fde38b14610854578063f7d975771461087d5761020e565b8063bedb86fb146106f5578063c87b56dd1461071e578063ccf335ff1461075b578063d3cbde31146107985761020e565b806391898c52116100e757806391898c521461062657806395d89b411461064f5780639bd9d18d1461067a578063a22cb465146106a3578063b88d4fde146106cc5761020e565b8063715018a61461057e5780637c928fe9146105955780638da5cb5b146105be57806391564206146105e95761020e565b80633f31b81e1161019b5780634f6ccce71161016a5780634f6ccce7146104715780635c975abb146104ae5780636352211e146104d95780636e76f5571461051657806370a08231146105415761020e565b80633f31b81e146103b757806342842e0e146103e257806349df728c1461040b5780634d05721a146104345761020e565b8063095ea7b3116101e2578063095ea7b3146102e157806318160ddd1461030a5780631b2ef1ca1461033557806323b872dd146103515780632f745c591461037a5761020e565b80629f25ff1461021357806301ffc9a71461023c57806306fdde0314610279578063081812fc146102a4575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613a3c565b6108a6565b005b34801561024857600080fd5b50610263600480360381019061025e91906139ea565b61094e565b6040516102709190614180565b60405180910390f35b34801561028557600080fd5b5061028e610960565b60405161029b919061419b565b60405180910390f35b3480156102b057600080fd5b506102cb60048036038101906102c69190613a90565b6109f2565b6040516102d891906140f0565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061390d565b610a77565b005b34801561031657600080fd5b5061031f610b8f565b60405161032c91906145fd565b60405180910390f35b61034f600480360381019061034a9190613ae2565b610b9c565b005b34801561035d57600080fd5b5061037860048036038101906103739190613807565b610fcb565b005b34801561038657600080fd5b506103a1600480360381019061039c919061390d565b61102b565b6040516103ae91906145fd565b60405180910390f35b3480156103c357600080fd5b506103cc6110d0565b6040516103d991906145fd565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613807565b6110d5565b005b34801561041757600080fd5b50610432600480360381019061042d91906137a2565b6110f5565b005b34801561044057600080fd5b5061045b60048036038101906104569190613a90565b611297565b60405161046891906145fd565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190613a90565b6112af565b6040516104a591906145fd565b60405180910390f35b3480156104ba57600080fd5b506104c3611346565b6040516104d09190614180565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190613a90565b611359565b60405161050d91906140f0565b60405180910390f35b34801561052257600080fd5b5061052b61140b565b60405161053891906145fd565b60405180910390f35b34801561054d57600080fd5b50610568600480360381019061056391906137a2565b611411565b60405161057591906145fd565b60405180910390f35b34801561058a57600080fd5b506105936114c9565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613a90565b611551565b005b3480156105ca57600080fd5b506105d361177c565b6040516105e091906140f0565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613a90565b6117a6565b60405161061d919061419b565b60405180910390f35b34801561063257600080fd5b5061064d600480360381019061064891906137a2565b611846565b005b34801561065b57600080fd5b50610664611906565b604051610671919061419b565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613949565b611998565b005b3480156106af57600080fd5b506106ca60048036038101906106c591906138d1565b611c6d565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613856565b611c83565b005b34801561070157600080fd5b5061071c60048036038101906107179190613998565b611ce5565b005b34801561072a57600080fd5b5061074560048036038101906107409190613a90565b611d7e565b604051610752919061419b565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190613a90565b611ec1565b60405161078f91906145fd565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba9190613a90565b611ed9565b6040516107cc91906145fd565b60405180910390f35b3480156107e157600080fd5b506107ea611f1f565b005b3480156107f857600080fd5b50610813600480360381019061080e91906137cb565b612057565b6040516108209190614180565b60405180910390f35b34801561083557600080fd5b5061083e6120eb565b60405161084b91906140f0565b60405180910390f35b34801561086057600080fd5b5061087b600480360381019061087691906137a2565b612111565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613ae2565b612209565b005b6108ae6122a1565b73ffffffffffffffffffffffffffffffffffffffff166108cc61177c565b73ffffffffffffffffffffffffffffffffffffffff1614610922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109199061441d565b60405180910390fd5b81600c6000838152602001908152602001600020908051906020019061094992919061359c565b505050565b6000610959826122a9565b9050919050565b60606000805461096f906148b8565b80601f016020809104026020016040519081016040528092919081815260200182805461099b906148b8565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82612323565b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a33906143fd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8282611359565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea9061447d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b126122a1565b73ffffffffffffffffffffffffffffffffffffffff161480610b415750610b4081610b3b6122a1565b612057565b5b610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b779061435d565b60405180910390fd5b610b8a838361238f565b505050565b6000600880549050905090565b6002600b541415610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd99061457d565b60405180910390fd5b6002600b81905550600d60009054906101000a900460ff1615610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906144bd565b60405180910390fd5b6000610c44610b8f565b90506002821015610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906143bd565b60405180910390fd5b6005821115610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc5906145dd565b60405180910390fd5b6002821415610d215761115c811015610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061431d565b60405180910390fd5b610d73565b600261115c610d309190614774565b811015610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d69906144dd565b60405180910390fd5b5b6000600f60008481526020019081526020016000205411610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061459d565b60405180910390fd5b60008311610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906145bd565b60405180910390fd5b600a831115610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906141bd565b60405180910390fd5b82600f600084815260200190815260200160002054610e6f9190614774565b341015610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea89061455d565b60405180910390fd5b61115c83600e600085815260200190815260200160002054610ed391906146ed565b1115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b906141dd565b60405180910390fd5b60006001600e60008581526020019081526020016000205461115c600186610f3c91906147ce565b610f469190614774565b610f5091906146ed565b610f5a91906146ed565b905060005b84811015610f9257610f713383612448565b8180610f7c9061491b565b9250508080610f8a9061491b565b915050610f5f565b5083600e60008581526020019081526020016000206000828254610fb691906146ed565b9250508190555050506001600b819055505050565b610fdc610fd66122a1565b82612466565b61101b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110129061449d565b60405180910390fd5b611026838383612544565b505050565b600061103683611411565b8210611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e906141fd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600581565b6110f083838360405180602001604052806000815250611c83565b505050565b6110fd6122a1565b73ffffffffffffffffffffffffffffffffffffffff1661111b61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111689061441d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111ac91906140f0565b60206040518083038186803b1580156111c457600080fd5b505afa1580156111d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fc9190613ab9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61122261177c565b836040518363ffffffff1660e01b8152600401611240929190614157565b602060405180830381600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129291906139c1565b505050565b600e6020528060005260406000206000915090505481565b60006112b9610b8f565b82106112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906144fd565b60405180910390fd5b60088281548110611334577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061439d565b60405180910390fd5b80915050919050565b61115c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114799061437d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114d16122a1565b73ffffffffffffffffffffffffffffffffffffffff166114ef61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061441d565b60405180910390fd5b61154f60006127a0565b565b6002600b541415611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e9061457d565b60405180910390fd5b6002600b81905550600d60009054906101000a900460ff16156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e6906144bd565b60405180910390fd5b60008111611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611629906145bd565b60405180910390fd5b600a811115611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d906141bd565b60405180910390fd5b6000611680610b8f565b905061115c828261169191906146ed565b11156116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c99061425d565b60405180910390fd5b6014826116e56116e06122a1565b611411565b6116ef91906146ed565b1115611730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117279061429d565b60405180910390fd5b60005b8281101561176f5761175c336001838561174d91906146ed565b61175791906146ed565b612448565b80806117679061491b565b915050611733565b50506001600b8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60205280600052604060002060009150905080546117c5906148b8565b80601f01602080910402602001604051908101604052809291908181526020018280546117f1906148b8565b801561183e5780601f106118135761010080835404028352916020019161183e565b820191906000526020600020905b81548152906001019060200180831161182157829003601f168201915b505050505081565b61184e6122a1565b73ffffffffffffffffffffffffffffffffffffffff1661186c61177c565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061441d565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060018054611915906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611941906148b8565b801561198e5780601f106119635761010080835404028352916020019161198e565b820191906000526020600020905b81548152906001019060200180831161197157829003601f168201915b5050505050905090565b600d60009054906101000a900460ff16156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df906144bd565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a296122a1565b73ffffffffffffffffffffffffffffffffffffffff1614611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061453d565b60405180910390fd5b60028111611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab99061451d565b60405180910390fd5b6005811115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd906145dd565b60405180910390fd5b61115c6001600e600084815260200190815260200160002054611b2991906146ed565b1115611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b61906141dd565b60405180910390fd5b60006001600e60008481526020019081526020016000205461115c600185611b9291906147ce565b611b9c9190614774565b611ba691906146ed565b611bb091906146ed565b90506005821415611be4578260016005611bca91906147ce565b61115c611bd79190614774565b611be191906146ed565b90505b611bee8482612448565b600e60008381526020019081526020016000206000815480929190611c129061491b565b919050555081838573ffffffffffffffffffffffffffffffffffffffff167f2365f88fc0e4d3086622918879eb645308f6b3fde06305db16513c967e2ff0f984604051611c5f91906145fd565b60405180910390a450505050565b611c7f611c786122a1565b8383612866565b5050565b611c94611c8e6122a1565b83612466565b611cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cca9061449d565b60405180910390fd5b611cdf848484846129d3565b50505050565b611ced6122a1565b73ffffffffffffffffffffffffffffffffffffffff16611d0b61177c565b73ffffffffffffffffffffffffffffffffffffffff1614611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d589061441d565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6060611d8982612323565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf9061445d565b60405180910390fd5b6000600c6000611dd785611ed9565b81526020019081526020016000208054611df0906148b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1c906148b8565b8015611e695780601f10611e3e57610100808354040283529160200191611e69565b820191906000526020600020905b815481529060010190602001808311611e4c57829003601f168201915b505050505090506000815111611e8e5760405180602001604052806000815250611eb9565b80611e9884612a2f565b604051602001611ea99291906140b7565b6040516020818303038152906040525b915050919050565b600f6020528060005260406000206000915090505481565b6000611ee482612323565b611ef15760009050611f1a565b600161115c600184611f0391906147ce565b611f0d9190614743565b611f1791906146ed565b90505b919050565b611f276122a1565b73ffffffffffffffffffffffffffffffffffffffff16611f4561177c565b73ffffffffffffffffffffffffffffffffffffffff1614611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061441d565b60405180910390fd5b60004790506000611faa61177c565b73ffffffffffffffffffffffffffffffffffffffff1682604051611fcd906140db565b60006040518083038185875af1925050503d806000811461200a576040519150601f19603f3d011682016040523d82523d6000602084013e61200f565b606091505b5050905080612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906142bd565b60405180910390fd5b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121196122a1565b73ffffffffffffffffffffffffffffffffffffffff1661213761177c565b73ffffffffffffffffffffffffffffffffffffffff161461218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121849061441d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f49061423d565b60405180910390fd5b612206816127a0565b50565b6122116122a1565b73ffffffffffffffffffffffffffffffffffffffff1661222f61177c565b73ffffffffffffffffffffffffffffffffffffffff1614612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c9061441d565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231c575061231b82612bdc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661240283611359565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612462828260405180602001604052806000815250612cbe565b5050565b600061247182612323565b6124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a79061433d565b60405180910390fd5b60006124bb83611359565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061252a57508373ffffffffffffffffffffffffffffffffffffffff16612512846109f2565b73ffffffffffffffffffffffffffffffffffffffff16145b8061253b575061253a8185612057565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661256482611359565b73ffffffffffffffffffffffffffffffffffffffff16146125ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b19061443d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561262a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621906142dd565b60405180910390fd5b612635838383612d19565b61264060008261238f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269091906147ce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e791906146ed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cc906142fd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129c69190614180565b60405180910390a3505050565b6129de848484612544565b6129ea84848484612d29565b612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a209061421d565b60405180910390fd5b50505050565b60606000821415612a77576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bd7565b600082905060005b60008214612aa9578080612a929061491b565b915050600a82612aa29190614743565b9150612a7f565b60008167ffffffffffffffff811115612aeb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b60008514612bd057600182612b3691906147ce565b9150600a85612b459190614964565b6030612b5191906146ed565b60f81b818381518110612b8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bc99190614743565b9450612b21565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ca757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cb75750612cb682612ec0565b5b9050919050565b612cc88383612f2a565b612cd56000848484612d29565b612d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0b9061421d565b60405180910390fd5b505050565b612d248383836130f8565b505050565b6000612d4a8473ffffffffffffffffffffffffffffffffffffffff1661320c565b15612eb3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d736122a1565b8786866040518563ffffffff1660e01b8152600401612d95949392919061410b565b602060405180830381600087803b158015612daf57600080fd5b505af1925050508015612de057506040513d601f19601f82011682018060405250810190612ddd9190613a13565b60015b612e63573d8060008114612e10576040519150601f19603f3d011682016040523d82523d6000602084013e612e15565b606091505b50600081511415612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e529061421d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb8565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f91906143dd565b60405180910390fd5b612fa381612323565b15612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda9061427d565b60405180910390fd5b612fef60008383612d19565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461303f91906146ed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61310383838361321f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131465761314181613224565b613185565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318457613183838261326d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131c8576131c3816133da565b613207565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461320657613205828261351d565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161327a84611411565b61328491906147ce565b9050600060076000848152602001908152602001600020549050818114613369576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133ee91906147ce565b9050600060096000848152602001908152602001600020549050600060088381548110613444577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061348c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613501577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061352883611411565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135a8906148b8565b90600052602060002090601f0160209004810192826135ca5760008555613611565b82601f106135e357805160ff1916838001178555613611565b82800160010185558215613611579182015b828111156136105782518255916020019190600101906135f5565b5b50905061361e9190613622565b5090565b5b8082111561363b576000816000905550600101613623565b5090565b600061365261364d8461463d565b614618565b90508281526020810184848401111561366a57600080fd5b613675848285614876565b509392505050565b600061369061368b8461466e565b614618565b9050828152602081018484840111156136a857600080fd5b6136b3848285614876565b509392505050565b6000813590506136ca816151eb565b92915050565b6000813590506136df81615202565b92915050565b6000815190506136f481615202565b92915050565b60008135905061370981615219565b92915050565b60008151905061371e81615219565b92915050565b600082601f83011261373557600080fd5b813561374584826020860161363f565b91505092915050565b600082601f83011261375f57600080fd5b813561376f84826020860161367d565b91505092915050565b60008135905061378781615230565b92915050565b60008151905061379c81615230565b92915050565b6000602082840312156137b457600080fd5b60006137c2848285016136bb565b91505092915050565b600080604083850312156137de57600080fd5b60006137ec858286016136bb565b92505060206137fd858286016136bb565b9150509250929050565b60008060006060848603121561381c57600080fd5b600061382a868287016136bb565b935050602061383b868287016136bb565b925050604061384c86828701613778565b9150509250925092565b6000806000806080858703121561386c57600080fd5b600061387a878288016136bb565b945050602061388b878288016136bb565b935050604061389c87828801613778565b925050606085013567ffffffffffffffff8111156138b957600080fd5b6138c587828801613724565b91505092959194509250565b600080604083850312156138e457600080fd5b60006138f2858286016136bb565b9250506020613903858286016136d0565b9150509250929050565b6000806040838503121561392057600080fd5b600061392e858286016136bb565b925050602061393f85828601613778565b9150509250929050565b60008060006060848603121561395e57600080fd5b600061396c868287016136bb565b935050602061397d86828701613778565b925050604061398e86828701613778565b9150509250925092565b6000602082840312156139aa57600080fd5b60006139b8848285016136d0565b91505092915050565b6000602082840312156139d357600080fd5b60006139e1848285016136e5565b91505092915050565b6000602082840312156139fc57600080fd5b6000613a0a848285016136fa565b91505092915050565b600060208284031215613a2557600080fd5b6000613a338482850161370f565b91505092915050565b60008060408385031215613a4f57600080fd5b600083013567ffffffffffffffff811115613a6957600080fd5b613a758582860161374e565b9250506020613a8685828601613778565b9150509250929050565b600060208284031215613aa257600080fd5b6000613ab084828501613778565b91505092915050565b600060208284031215613acb57600080fd5b6000613ad98482850161378d565b91505092915050565b60008060408385031215613af557600080fd5b6000613b0385828601613778565b9250506020613b1485828601613778565b9150509250929050565b613b2781614802565b82525050565b613b3681614814565b82525050565b6000613b478261469f565b613b5181856146b5565b9350613b61818560208601614885565b613b6a81614a51565b840191505092915050565b6000613b80826146aa565b613b8a81856146d1565b9350613b9a818560208601614885565b613ba381614a51565b840191505092915050565b6000613bb9826146aa565b613bc381856146e2565b9350613bd3818560208601614885565b80840191505092915050565b6000613bec601b836146d1565b9150613bf782614a62565b602082019050919050565b6000613c0f6016836146d1565b9150613c1a82614a8b565b602082019050919050565b6000613c32602b836146d1565b9150613c3d82614ab4565b604082019050919050565b6000613c556032836146d1565b9150613c6082614b03565b604082019050919050565b6000613c786026836146d1565b9150613c8382614b52565b604082019050919050565b6000613c9b6018836146d1565b9150613ca682614ba1565b602082019050919050565b6000613cbe601c836146d1565b9150613cc982614bca565b602082019050919050565b6000613ce16011836146d1565b9150613cec82614bf3565b602082019050919050565b6000613d046014836146d1565b9150613d0f82614c1c565b602082019050919050565b6000613d276024836146d1565b9150613d3282614c45565b604082019050919050565b6000613d4a6019836146d1565b9150613d5582614c94565b602082019050919050565b6000613d6d6020836146d1565b9150613d7882614cbd565b602082019050919050565b6000613d90602c836146d1565b9150613d9b82614ce6565b604082019050919050565b6000613db36038836146d1565b9150613dbe82614d35565b604082019050919050565b6000613dd6602a836146d1565b9150613de182614d84565b604082019050919050565b6000613df96029836146d1565b9150613e0482614dd3565b604082019050919050565b6000613e1c601b836146d1565b9150613e2782614e22565b602082019050919050565b6000613e3f6020836146d1565b9150613e4a82614e4b565b602082019050919050565b6000613e62602c836146d1565b9150613e6d82614e74565b604082019050919050565b6000613e856020836146d1565b9150613e9082614ec3565b602082019050919050565b6000613ea86029836146d1565b9150613eb382614eec565b604082019050919050565b6000613ecb602f836146d1565b9150613ed682614f3b565b604082019050919050565b6000613eee6021836146d1565b9150613ef982614f8a565b604082019050919050565b6000613f116000836146c6565b9150613f1c82614fd9565b600082019050919050565b6000613f346031836146d1565b9150613f3f82614fdc565b604082019050919050565b6000613f576011836146d1565b9150613f628261502b565b602082019050919050565b6000613f7a6020836146d1565b9150613f8582615054565b602082019050919050565b6000613f9d602c836146d1565b9150613fa88261507d565b604082019050919050565b6000613fc0601b836146d1565b9150613fcb826150cc565b602082019050919050565b6000613fe3600d836146d1565b9150613fee826150f5565b602082019050919050565b6000614006600d836146d1565b91506140118261511e565b602082019050919050565b6000614029601f836146d1565b915061403482615147565b602082019050919050565b600061404c6011836146d1565b915061405782615170565b602082019050919050565b600061406f601a836146d1565b915061407a82615199565b602082019050919050565b60006140926013836146d1565b915061409d826151c2565b602082019050919050565b6140b18161486c565b82525050565b60006140c38285613bae565b91506140cf8284613bae565b91508190509392505050565b60006140e682613f04565b9150819050919050565b60006020820190506141056000830184613b1e565b92915050565b60006080820190506141206000830187613b1e565b61412d6020830186613b1e565b61413a60408301856140a8565b818103606083015261414c8184613b3c565b905095945050505050565b600060408201905061416c6000830185613b1e565b61417960208301846140a8565b9392505050565b60006020820190506141956000830184613b2d565b92915050565b600060208201905081810360008301526141b58184613b75565b905092915050565b600060208201905081810360008301526141d681613bdf565b9050919050565b600060208201905081810360008301526141f681613c02565b9050919050565b6000602082019050818103600083015261421681613c25565b9050919050565b6000602082019050818103600083015261423681613c48565b9050919050565b6000602082019050818103600083015261425681613c6b565b9050919050565b6000602082019050818103600083015261427681613c8e565b9050919050565b6000602082019050818103600083015261429681613cb1565b9050919050565b600060208201905081810360008301526142b681613cd4565b9050919050565b600060208201905081810360008301526142d681613cf7565b9050919050565b600060208201905081810360008301526142f681613d1a565b9050919050565b6000602082019050818103600083015261431681613d3d565b9050919050565b6000602082019050818103600083015261433681613d60565b9050919050565b6000602082019050818103600083015261435681613d83565b9050919050565b6000602082019050818103600083015261437681613da6565b9050919050565b6000602082019050818103600083015261439681613dc9565b9050919050565b600060208201905081810360008301526143b681613dec565b9050919050565b600060208201905081810360008301526143d681613e0f565b9050919050565b600060208201905081810360008301526143f681613e32565b9050919050565b6000602082019050818103600083015261441681613e55565b9050919050565b6000602082019050818103600083015261443681613e78565b9050919050565b6000602082019050818103600083015261445681613e9b565b9050919050565b6000602082019050818103600083015261447681613ebe565b9050919050565b6000602082019050818103600083015261449681613ee1565b9050919050565b600060208201905081810360008301526144b681613f27565b9050919050565b600060208201905081810360008301526144d681613f4a565b9050919050565b600060208201905081810360008301526144f681613f6d565b9050919050565b6000602082019050818103600083015261451681613f90565b9050919050565b6000602082019050818103600083015261453681613fb3565b9050919050565b6000602082019050818103600083015261455681613fd6565b9050919050565b6000602082019050818103600083015261457681613ff9565b9050919050565b600060208201905081810360008301526145968161401c565b9050919050565b600060208201905081810360008301526145b68161403f565b9050919050565b600060208201905081810360008301526145d681614062565b9050919050565b600060208201905081810360008301526145f681614085565b9050919050565b600060208201905061461260008301846140a8565b92915050565b6000614622614633565b905061462e82826148ea565b919050565b6000604051905090565b600067ffffffffffffffff82111561465857614657614a22565b5b61466182614a51565b9050602081019050919050565b600067ffffffffffffffff82111561468957614688614a22565b5b61469282614a51565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146f88261486c565b91506147038361486c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473857614737614995565b5b828201905092915050565b600061474e8261486c565b91506147598361486c565b925082614769576147686149c4565b5b828204905092915050565b600061477f8261486c565b915061478a8361486c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147c3576147c2614995565b5b828202905092915050565b60006147d98261486c565b91506147e48361486c565b9250828210156147f7576147f6614995565b5b828203905092915050565b600061480d8261484c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156148a3578082015181840152602081019050614888565b838111156148b2576000848401525b50505050565b600060028204905060018216806148d057607f821691505b602082108114156148e4576148e36149f3565b5b50919050565b6148f382614a51565b810181811067ffffffffffffffff8211171561491257614911614a22565b5b80604052505050565b60006149268261486c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561495957614958614995565b5b600182019050919050565b600061496f8261486c565b915061497a8361486c565b92508261498a576149896149c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416d6f756e742073686f756c64206265203130206f72206c6573730000000000600082015250565b7f457863656564732076657273696f6e20737570706c7900000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732066726565206d696e7420737570706c790000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d6178203230207065722077616c6c6574000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f46726565206d696e74206d75737420626520736f6c64206f7574206669727374600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f56657273696f6e206d7573742062652032206f72206869676865720000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e6720697320706175736564000000000000000000000000000000600082015250565b7f56657273696f6e2032206d75737420626520736f6c64206f7574206669727374600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f56657273696f6e206d7573742062652033206f72206869676865720000000000600082015250565b7f4163636573732064656e69656400000000000000000000000000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5072696365206d75737420626520736574000000000000000000000000000000600082015250565b7f416d6f756e742073686f756c642062652031206f72206d6f7265000000000000600082015250565b7f56657273696f6e2065786365656473206d617800000000000000000000000000600082015250565b6151f481614802565b81146151ff57600080fd5b50565b61520b81614814565b811461521657600080fd5b50565b61522281614820565b811461522d57600080fd5b50565b6152398161486c565b811461524457600080fd5b5056fea264697066735822122075da0c129c93a39e06a1ed7cab9c58a7924b35c29b1375e2b8ff5ce183e9226f64736f6c63430008040033

Deployed Bytecode Sourcemap

53521:4982:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54130:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58299:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25626:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27185:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26708:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39803:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55533:1118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27935:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39471:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53733:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28345:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54572:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53781:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39993:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53647:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25320:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53679:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25050:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49880:103;;;;;;;;;;;;;:::i;:::-;;55002:525;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49229:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53600:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54251:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25795:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56846:782;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27478:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28601:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54488:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57654:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53834:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56657:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54776:201;;;;;;;;;;;;;:::i;:::-;;27704:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53888:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50138:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54367:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54130;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54235:4:::1;54214:8;:18;54223:8;54214:18;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;54130:115:::0;;:::o;58299:201::-;58435:4;58458:36;58482:11;58458:23;:36::i;:::-;58451:43;;58299:201;;;:::o;25626:100::-;25680:13;25713:5;25706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25626:100;:::o;27185:221::-;27261:7;27289:16;27297:7;27289;:16::i;:::-;27281:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27374:15;:24;27390:7;27374:24;;;;;;;;;;;;;;;;;;;;;27367:31;;27185:221;;;:::o;26708:411::-;26789:13;26805:23;26820:7;26805:14;:23::i;:::-;26789:39;;26853:5;26847:11;;:2;:11;;;;26839:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26947:5;26931:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26956:37;26973:5;26980:12;:10;:12::i;:::-;26956:16;:37::i;:::-;26931:62;26909:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27090:21;27099:2;27103:7;27090:8;:21::i;:::-;26708:411;;;:::o;39803:113::-;39864:7;39891:10;:17;;;;39884:24;;39803:113;:::o;55533:1118::-;52490:1;53088:7;;:19;;53080:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52490:1;53221:7;:18;;;;55628:6:::1;;;;;;;;;;;55627:7;55619:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55665:14;55682:13;:11;:13::i;:::-;55665:30;;55724:1;55712:8;:13;;55704:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53773:1;55772:8;:25;;55764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55846:1;55834:8;:13;55830:209;;;53724:4;55866:6;:28;;55858:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55830:209;;;55993:1;53724:4;55972:22;;;;:::i;:::-;55962:6;:32;;55954:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55830:209;56080:1;56055:12;:22;56068:8;56055:22;;;;;;;;;;;;:26;56047:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56128:1;56118:7;:11;56110:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56186:2;56175:7;:13;;56167:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56275:7;56250:12;:22;56263:8;56250:22;;;;;;;;;;;;:32;;;;:::i;:::-;56237:9;:45;;56229:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53724:4;56341:7;56315:13;:23;56329:8;56315:23;;;;;;;;;;;;:33;;;;:::i;:::-;:55;;56307:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;56406:15;56490:1;56464:13;:23;56478:8;56464:23;;;;;;;;;;;;53724:4;56437:1;56426:8;:12;;;;:::i;:::-;56425:35;;;;:::i;:::-;56424:63;;;;:::i;:::-;:67;;;;:::i;:::-;56406:85;;56505:9;56500:103;56524:7;56520:1;:11;56500:103;;;56547:30;56557:10;56569:7;56547:9;:30::i;:::-;56586:9;;;;;:::i;:::-;;;;56533:3;;;;;:::i;:::-;;;;56500:103;;;;56638:7;56611:13;:23;56625:8;56611:23;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;53252:1;;52446::::0;53400:7;:22;;;;55533:1118;;:::o;27935:339::-;28130:41;28149:12;:10;:12::i;:::-;28163:7;28130:18;:41::i;:::-;28122:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28238:28;28248:4;28254:2;28258:7;28238:9;:28::i;:::-;27935:339;;;:::o;39471:256::-;39568:7;39604:23;39621:5;39604:16;:23::i;:::-;39596:5;:31;39588:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39693:12;:19;39706:5;39693:19;;;;;;;;;;;;;;;:26;39713:5;39693:26;;;;;;;;;;;;39686:33;;39471:256;;;;:::o;53733:41::-;53773:1;53733:41;:::o;28345:185::-;28483:39;28500:4;28506:2;28510:7;28483:39;;;;;;;;;;;;:16;:39::i;:::-;28345:185;;;:::o;54572:198::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54645:14:::1;54669:13;54662:31;;;54702:4;54662:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54645:63;;54724:13;54717:30;;;54748:7;:5;:7::i;:::-;54757:6;54717:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49520:1;54572:198:::0;:::o;53781:48::-;;;;;;;;;;;;;;;;;:::o;39993:233::-;40068:7;40104:30;:28;:30::i;:::-;40096:5;:38;40088:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40201:10;40212:5;40201:17;;;;;;;;;;;;;;;;;;;;;;;;40194:24;;39993:233;;;:::o;53647:25::-;;;;;;;;;;;;;:::o;25320:239::-;25392:7;25412:13;25428:7;:16;25436:7;25428:16;;;;;;;;;;;;;;;;;;;;;25412:32;;25480:1;25463:19;;:5;:19;;;;25455:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25546:5;25539:12;;;25320:239;;;:::o;53679:49::-;53724:4;53679:49;:::o;25050:208::-;25122:7;25167:1;25150:19;;:5;:19;;;;25142:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25234:9;:16;25244:5;25234:16;;;;;;;;;;;;;;;;25227:23;;25050:208;;;:::o;49880:103::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49945:30:::1;49972:1;49945:18;:30::i;:::-;49880:103::o:0;55002:525::-;52490:1;53088:7;;:19;;53080:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52490:1;53221:7;:18;;;;55075:6:::1;;;;;;;;;;;55074:7;55066:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55130:1;55120:7;:11;55112:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55188:2;55177:7;:13;;55169:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;55231:14;55248:13;:11;:13::i;:::-;55231:30;;53724:4;55285:7;55276:6;:16;;;;:::i;:::-;:38;;55268:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55397:2;55386:7;55360:23;55370:12;:10;:12::i;:::-;55360:9;:23::i;:::-;:33;;;;:::i;:::-;:39;;55352:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;55435:9;55430:92;55454:7;55450:1;:11;55430:92;;;55477:37;55487:10;55512:1;55508;55499:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;55477:9;:37::i;:::-;55463:3;;;;;:::i;:::-;;;;55430:92;;;;53252:1;52446::::0;53400:7;:22;;;;55002:525;:::o;49229:87::-;49275:7;49302:6;;;;;;;;;;;49295:13;;49229:87;:::o;53600:42::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54251:110::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54347:8:::1;54324:20;;:31;;;;;;;;;;;;;;;;;;54251:110:::0;:::o;25795:104::-;25851:13;25884:7;25877:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25795:104;:::o;56846:782::-;56962:6;;;;;;;;;;;56961:7;56953:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;57023:20;;;;;;;;;;;57007:36;;:12;:10;:12::i;:::-;:36;;;56999:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57089:1;57078:8;:12;57070:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;53773:1;57137:8;:25;;57129:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53724:4;57227:1;57201:13;:23;57215:8;57201:23;;;;;;;;;;;;:27;;;;:::i;:::-;:49;;57193:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57286:15;57370:1;57344:13;:23;57358:8;57344:23;;;;;;;;;;;;53724:4;57317:1;57306:8;:12;;;;:::i;:::-;57305:35;;;;:::i;:::-;57304:63;;;;:::i;:::-;:67;;;;:::i;:::-;57286:85;;53773:1;57384:8;:25;57380:115;;;57475:12;57469:1;53773;57453:17;;;;:::i;:::-;53724:4;57431:40;;;;:::i;:::-;57430:57;;;;:::i;:::-;57420:67;;57380:115;57503:23;57513:3;57518:7;57503:9;:23::i;:::-;57535:13;:23;57549:8;57535:23;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;57604:8;57590:12;57585:3;57574:48;;;57614:7;57574:48;;;;;;:::i;:::-;;;;;;;;56846:782;;;;:::o;27478:155::-;27573:52;27592:12;:10;:12::i;:::-;27606:8;27616;27573:18;:52::i;:::-;27478:155;;:::o;28601:328::-;28776:41;28795:12;:10;:12::i;:::-;28809:7;28776:18;:41::i;:::-;28768:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28882:39;28896:4;28902:2;28906:7;28915:5;28882:13;:39::i;:::-;28601:328;;;;:::o;54488:78::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54554:6:::1;54545;;:15;;;;;;;;;;;;;;;;;;54488:78:::0;:::o;57654:372::-;57728:13;57758:17;57766:8;57758:7;:17::i;:::-;57750:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57836:21;57860:8;:27;57869:17;57877:8;57869:7;:17::i;:::-;57860:27;;;;;;;;;;;57836:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57932:1;57914:7;57908:21;:25;:112;;;;;;;;;;;;;;;;;57969:7;57978:26;57995:8;57978:16;:26::i;:::-;57952:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57908:112;57894:126;;;57654:372;;;:::o;53834:47::-;;;;;;;;;;;;;;;;;:::o;56657:183::-;56713:7;56734:17;56742:8;56734:7;:17::i;:::-;56729:49;;56769:1;56762:8;;;;56729:49;56833:1;53724:4;56806:1;56795:8;:12;;;;:::i;:::-;56794:35;;;;:::i;:::-;56793:41;;;;:::i;:::-;56786:48;;56657:183;;;;:::o;54776:201::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54825:14:::1;54842:21;54825:38;;54873:12;54891:7;:5;:7::i;:::-;:12;;54912:6;54891:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54872:52;;;54939:7;54931:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;49520:1;;54776:201::o:0;27704:164::-;27801:4;27825:18;:25;27844:5;27825:25;;;;;;;;;;;;;;;:35;27851:8;27825:35;;;;;;;;;;;;;;;;;;;;;;;;;27818:42;;27704:164;;;;:::o;53888:35::-;;;;;;;;;;;;;:::o;50138:201::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50247:1:::1;50227:22;;:8;:22;;;;50219:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50303:28;50322:8;50303:18;:28::i;:::-;50138:201:::0;:::o;54367:115::-;49460:12;:10;:12::i;:::-;49449:23;;:7;:5;:7::i;:::-;:23;;;49441:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54470:6:::1;54445:12;:22;54458:8;54445:22;;;;;;;;;;;:31;;;;54367:115:::0;;:::o;19983:98::-;20036:7;20063:10;20056:17;;19983:98;:::o;39163:224::-;39265:4;39304:35;39289:50;;;:11;:50;;;;:90;;;;39343:36;39367:11;39343:23;:36::i;:::-;39289:90;39282:97;;39163:224;;;:::o;30439:127::-;30504:4;30556:1;30528:30;;:7;:16;30536:7;30528:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30521:37;;30439:127;;;:::o;34421:174::-;34523:2;34496:15;:24;34512:7;34496:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34579:7;34575:2;34541:46;;34550:23;34565:7;34550:14;:23::i;:::-;34541:46;;;;;;;;;;;;34421:174;;:::o;31423:110::-;31499:26;31509:2;31513:7;31499:26;;;;;;;;;;;;:9;:26::i;:::-;31423:110;;:::o;30733:348::-;30826:4;30851:16;30859:7;30851;:16::i;:::-;30843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30927:13;30943:23;30958:7;30943:14;:23::i;:::-;30927:39;;30996:5;30985:16;;:7;:16;;;:51;;;;31029:7;31005:31;;:20;31017:7;31005:11;:20::i;:::-;:31;;;30985:51;:87;;;;31040:32;31057:5;31064:7;31040:16;:32::i;:::-;30985:87;30977:96;;;30733:348;;;;:::o;33725:578::-;33884:4;33857:31;;:23;33872:7;33857:14;:23::i;:::-;:31;;;33849:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33967:1;33953:16;;:2;:16;;;;33945:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34023:39;34044:4;34050:2;34054:7;34023:20;:39::i;:::-;34127:29;34144:1;34148:7;34127:8;:29::i;:::-;34188:1;34169:9;:15;34179:4;34169:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34217:1;34200:9;:13;34210:2;34200:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34248:2;34229:7;:16;34237:7;34229:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34287:7;34283:2;34268:27;;34277:4;34268:27;;;;;;;;;;;;33725:578;;;:::o;50499:191::-;50573:16;50592:6;;;;;;;;;;;50573:25;;50618:8;50609:6;;:17;;;;;;;;;;;;;;;;;;50673:8;50642:40;;50663:8;50642:40;;;;;;;;;;;;50499:191;;:::o;34737:315::-;34892:8;34883:17;;:5;:17;;;;34875:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34979:8;34941:18;:25;34960:5;34941:25;;;;;;;;;;;;;;;:35;34967:8;34941:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35025:8;35003:41;;35018:5;35003:41;;;35035:8;35003:41;;;;;;:::i;:::-;;;;;;;;34737:315;;;:::o;29811:::-;29968:28;29978:4;29984:2;29988:7;29968:9;:28::i;:::-;30015:48;30038:4;30044:2;30048:7;30057:5;30015:22;:48::i;:::-;30007:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29811:315;;;;:::o;20543:723::-;20599:13;20829:1;20820:5;:10;20816:53;;;20847:10;;;;;;;;;;;;;;;;;;;;;20816:53;20879:12;20894:5;20879:20;;20910:14;20935:78;20950:1;20942:4;:9;20935:78;;20968:8;;;;;:::i;:::-;;;;20999:2;20991:10;;;;;:::i;:::-;;;20935:78;;;21023:19;21055:6;21045:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21023:39;;21073:154;21089:1;21080:5;:10;21073:154;;21117:1;21107:11;;;;;:::i;:::-;;;21184:2;21176:5;:10;;;;:::i;:::-;21163:2;:24;;;;:::i;:::-;21150:39;;21133:6;21140;21133:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;21213:2;21204:11;;;;;:::i;:::-;;;21073:154;;;21251:6;21237:21;;;;;20543:723;;;;:::o;24681:305::-;24783:4;24835:25;24820:40;;;:11;:40;;;;:105;;;;24892:33;24877:48;;;:11;:48;;;;24820:105;:158;;;;24942:36;24966:11;24942:23;:36::i;:::-;24820:158;24800:178;;24681:305;;;:::o;31760:321::-;31890:18;31896:2;31900:7;31890:5;:18::i;:::-;31941:54;31972:1;31976:2;31980:7;31989:5;31941:22;:54::i;:::-;31919:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31760:321;;;:::o;58032:203::-;58184:45;58211:4;58217:2;58221:7;58184:26;:45::i;:::-;58032:203;;;:::o;35617:799::-;35772:4;35793:15;:2;:13;;;:15::i;:::-;35789:620;;;35845:2;35829:36;;;35866:12;:10;:12::i;:::-;35880:4;35886:7;35895:5;35829:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36088:1;36071:6;:13;:18;36067:272;;;36114:60;;;;;;;;;;:::i;:::-;;;;;;;;36067:272;36289:6;36283:13;36274:6;36270:2;36266:15;36259:38;35825:529;35962:41;;;35952:51;;;:6;:51;;;;35945:58;;;;;35789:620;36393:4;36386:11;;35617:799;;;;;;;:::o;23146:157::-;23231:4;23270:25;23255:40;;;:11;:40;;;;23248:47;;23146:157;;;:::o;32417:382::-;32511:1;32497:16;;:2;:16;;;;32489:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:16;32578:7;32570;:16::i;:::-;32569:17;32561:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32632:45;32661:1;32665:2;32669:7;32632:20;:45::i;:::-;32707:1;32690:9;:13;32700:2;32690:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32738:2;32719:7;:16;32727:7;32719:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32783:7;32779:2;32758:33;;32775:1;32758:33;;;;;;;;;;;;32417:382;;:::o;40839:589::-;40983:45;41010:4;41016:2;41020:7;40983:26;:45::i;:::-;41061:1;41045:18;;:4;:18;;;41041:187;;;41080:40;41112:7;41080:31;:40::i;:::-;41041:187;;;41150:2;41142:10;;:4;:10;;;41138:90;;41169:47;41202:4;41208:7;41169:32;:47::i;:::-;41138:90;41041:187;41256:1;41242:16;;:2;:16;;;41238:183;;;41275:45;41312:7;41275:36;:45::i;:::-;41238:183;;;41348:4;41342:10;;:2;:10;;;41338:83;;41369:40;41397:2;41401:7;41369:27;:40::i;:::-;41338:83;41238:183;40839:589;;;:::o;11992:387::-;12052:4;12260:12;12327:7;12315:20;12307:28;;12370:1;12363:4;:8;12356:15;;;11992:387;;;:::o;36988:126::-;;;;:::o;42151:164::-;42255:10;:17;;;;42228:15;:24;42244:7;42228:24;;;;;;;;;;;:44;;;;42283:10;42299:7;42283:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42151:164;:::o;42942:988::-;43208:22;43258:1;43233:22;43250:4;43233:16;:22::i;:::-;:26;;;;:::i;:::-;43208:51;;43270:18;43291:17;:26;43309:7;43291:26;;;;;;;;;;;;43270:47;;43438:14;43424:10;:28;43420:328;;43469:19;43491:12;:18;43504:4;43491:18;;;;;;;;;;;;;;;:34;43510:14;43491:34;;;;;;;;;;;;43469:56;;43575:11;43542:12;:18;43555:4;43542:18;;;;;;;;;;;;;;;:30;43561:10;43542:30;;;;;;;;;;;:44;;;;43692:10;43659:17;:30;43677:11;43659:30;;;;;;;;;;;:43;;;;43420:328;;43844:17;:26;43862:7;43844:26;;;;;;;;;;;43837:33;;;43888:12;:18;43901:4;43888:18;;;;;;;;;;;;;;;:34;43907:14;43888:34;;;;;;;;;;;43881:41;;;42942:988;;;;:::o;44225:1079::-;44478:22;44523:1;44503:10;:17;;;;:21;;;;:::i;:::-;44478:46;;44535:18;44556:15;:24;44572:7;44556:24;;;;;;;;;;;;44535:45;;44907:19;44929:10;44940:14;44929:26;;;;;;;;;;;;;;;;;;;;;;;;44907:48;;44993:11;44968:10;44979;44968:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45104:10;45073:15;:28;45089:11;45073:28;;;;;;;;;;;:41;;;;45245:15;:24;45261:7;45245:24;;;;;;;;;;;45238:31;;;45280:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44225:1079;;;;:::o;41729:221::-;41814:14;41831:20;41848:2;41831:16;:20::i;:::-;41814:37;;41889:7;41862:12;:16;41875:2;41862:16;;;;;;;;;;;;;;;:24;41879:6;41862:24;;;;;;;;;;;:34;;;;41936:6;41907:17;:26;41925:7;41907:26;;;;;;;;;;;:35;;;;41729:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1045:5;1076:6;1070:13;1061:22;;1092:30;1116:5;1092:30;:::i;:::-;1051:77;;;;:::o;1134:137::-;1179:5;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;1333:5;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;1492:5;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;1784:5;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;2053:5;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:143::-;2209:5;2240:6;2234:13;2225:22;;2256:33;2283:5;2256:33;:::i;:::-;2215:80;;;;:::o;2301:262::-;2360:6;2409:2;2397:9;2388:7;2384:23;2380:32;2377:2;;;2425:1;2422;2415:12;2377:2;2468:1;2493:53;2538:7;2529:6;2518:9;2514:22;2493:53;:::i;:::-;2483:63;;2439:117;2367:196;;;;:::o;2569:407::-;2637:6;2645;2694:2;2682:9;2673:7;2669:23;2665:32;2662:2;;;2710:1;2707;2700:12;2662:2;2753:1;2778:53;2823:7;2814:6;2803:9;2799:22;2778:53;:::i;:::-;2768:63;;2724:117;2880:2;2906:53;2951:7;2942:6;2931:9;2927:22;2906:53;:::i;:::-;2896:63;;2851:118;2652:324;;;;;:::o;2982:552::-;3059:6;3067;3075;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;3140:1;3137;3130:12;3092:2;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;3310:2;3336:53;3381:7;3372:6;3361:9;3357:22;3336:53;:::i;:::-;3326:63;;3281:118;3438:2;3464:53;3509:7;3500:6;3489:9;3485:22;3464:53;:::i;:::-;3454:63;;3409:118;3082:452;;;;;:::o;3540:809::-;3635:6;3643;3651;3659;3708:3;3696:9;3687:7;3683:23;3679:33;3676:2;;;3725:1;3722;3715:12;3676:2;3768:1;3793:53;3838:7;3829:6;3818:9;3814:22;3793:53;:::i;:::-;3783:63;;3739:117;3895:2;3921:53;3966:7;3957:6;3946:9;3942:22;3921:53;:::i;:::-;3911:63;;3866:118;4023:2;4049:53;4094:7;4085:6;4074:9;4070:22;4049:53;:::i;:::-;4039:63;;3994:118;4179:2;4168:9;4164:18;4151:32;4210:18;4202:6;4199:30;4196:2;;;4242:1;4239;4232:12;4196:2;4270:62;4324:7;4315:6;4304:9;4300:22;4270:62;:::i;:::-;4260:72;;4122:220;3666:683;;;;;;;:::o;4355:401::-;4420:6;4428;4477:2;4465:9;4456:7;4452:23;4448:32;4445:2;;;4493:1;4490;4483:12;4445:2;4536:1;4561:53;4606:7;4597:6;4586:9;4582:22;4561:53;:::i;:::-;4551:63;;4507:117;4663:2;4689:50;4731:7;4722:6;4711:9;4707:22;4689:50;:::i;:::-;4679:60;;4634:115;4435:321;;;;;:::o;4762:407::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:2;;;4903:1;4900;4893:12;4855:2;4946:1;4971:53;5016:7;5007:6;4996:9;4992:22;4971:53;:::i;:::-;4961:63;;4917:117;5073:2;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;:::i;:::-;5089:63;;5044:118;4845:324;;;;;:::o;5175:552::-;5252:6;5260;5268;5317:2;5305:9;5296:7;5292:23;5288:32;5285:2;;;5333:1;5330;5323:12;5285:2;5376:1;5401:53;5446:7;5437:6;5426:9;5422:22;5401:53;:::i;:::-;5391:63;;5347:117;5503:2;5529:53;5574:7;5565:6;5554:9;5550:22;5529:53;:::i;:::-;5519:63;;5474:118;5631:2;5657:53;5702:7;5693:6;5682:9;5678:22;5657:53;:::i;:::-;5647:63;;5602:118;5275:452;;;;;:::o;5733:256::-;5789:6;5838:2;5826:9;5817:7;5813:23;5809:32;5806:2;;;5854:1;5851;5844:12;5806:2;5897:1;5922:50;5964:7;5955:6;5944:9;5940:22;5922:50;:::i;:::-;5912:60;;5868:114;5796:193;;;;:::o;5995:278::-;6062:6;6111:2;6099:9;6090:7;6086:23;6082:32;6079:2;;;6127:1;6124;6117:12;6079:2;6170:1;6195:61;6248:7;6239:6;6228:9;6224:22;6195:61;:::i;:::-;6185:71;;6141:125;6069:204;;;;:::o;6279:260::-;6337:6;6386:2;6374:9;6365:7;6361:23;6357:32;6354:2;;;6402:1;6399;6392:12;6354:2;6445:1;6470:52;6514:7;6505:6;6494:9;6490:22;6470:52;:::i;:::-;6460:62;;6416:116;6344:195;;;;:::o;6545:282::-;6614:6;6663:2;6651:9;6642:7;6638:23;6634:32;6631:2;;;6679:1;6676;6669:12;6631:2;6722:1;6747:63;6802:7;6793:6;6782:9;6778:22;6747:63;:::i;:::-;6737:73;;6693:127;6621:206;;;;:::o;6833:520::-;6911:6;6919;6968:2;6956:9;6947:7;6943:23;6939:32;6936:2;;;6984:1;6981;6974:12;6936:2;7055:1;7044:9;7040:17;7027:31;7085:18;7077:6;7074:30;7071:2;;;7117:1;7114;7107:12;7071:2;7145:63;7200:7;7191:6;7180:9;7176:22;7145:63;:::i;:::-;7135:73;;6998:220;7257:2;7283:53;7328:7;7319:6;7308:9;7304:22;7283:53;:::i;:::-;7273:63;;7228:118;6926:427;;;;;:::o;7359:262::-;7418:6;7467:2;7455:9;7446:7;7442:23;7438:32;7435:2;;;7483:1;7480;7473:12;7435:2;7526:1;7551:53;7596:7;7587:6;7576:9;7572:22;7551:53;:::i;:::-;7541:63;;7497:117;7425:196;;;;:::o;7627:284::-;7697:6;7746:2;7734:9;7725:7;7721:23;7717:32;7714:2;;;7762:1;7759;7752:12;7714:2;7805:1;7830:64;7886:7;7877:6;7866:9;7862:22;7830:64;:::i;:::-;7820:74;;7776:128;7704:207;;;;:::o;7917:407::-;7985:6;7993;8042:2;8030:9;8021:7;8017:23;8013:32;8010:2;;;8058:1;8055;8048:12;8010:2;8101:1;8126:53;8171:7;8162:6;8151:9;8147:22;8126:53;:::i;:::-;8116:63;;8072:117;8228:2;8254:53;8299:7;8290:6;8279:9;8275:22;8254:53;:::i;:::-;8244:63;;8199:118;8000:324;;;;;:::o;8330:118::-;8417:24;8435:5;8417:24;:::i;:::-;8412:3;8405:37;8395:53;;:::o;8454:109::-;8535:21;8550:5;8535:21;:::i;:::-;8530:3;8523:34;8513:50;;:::o;8569:360::-;8655:3;8683:38;8715:5;8683:38;:::i;:::-;8737:70;8800:6;8795:3;8737:70;:::i;:::-;8730:77;;8816:52;8861:6;8856:3;8849:4;8842:5;8838:16;8816:52;:::i;:::-;8893:29;8915:6;8893:29;:::i;:::-;8888:3;8884:39;8877:46;;8659:270;;;;;:::o;8935:364::-;9023:3;9051:39;9084:5;9051:39;:::i;:::-;9106:71;9170:6;9165:3;9106:71;:::i;:::-;9099:78;;9186:52;9231:6;9226:3;9219:4;9212:5;9208:16;9186:52;:::i;:::-;9263:29;9285:6;9263:29;:::i;:::-;9258:3;9254:39;9247:46;;9027:272;;;;;:::o;9305:377::-;9411:3;9439:39;9472:5;9439:39;:::i;:::-;9494:89;9576:6;9571:3;9494:89;:::i;:::-;9487:96;;9592:52;9637:6;9632:3;9625:4;9618:5;9614:16;9592:52;:::i;:::-;9669:6;9664:3;9660:16;9653:23;;9415:267;;;;;:::o;9688:366::-;9830:3;9851:67;9915:2;9910:3;9851:67;:::i;:::-;9844:74;;9927:93;10016:3;9927:93;:::i;:::-;10045:2;10040:3;10036:12;10029:19;;9834:220;;;:::o;10060:366::-;10202:3;10223:67;10287:2;10282:3;10223:67;:::i;:::-;10216:74;;10299:93;10388:3;10299:93;:::i;:::-;10417:2;10412:3;10408:12;10401:19;;10206:220;;;:::o;10432:366::-;10574:3;10595:67;10659:2;10654:3;10595:67;:::i;:::-;10588:74;;10671:93;10760:3;10671:93;:::i;:::-;10789:2;10784:3;10780:12;10773:19;;10578:220;;;:::o;10804:366::-;10946:3;10967:67;11031:2;11026:3;10967:67;:::i;:::-;10960:74;;11043:93;11132:3;11043:93;:::i;:::-;11161:2;11156:3;11152:12;11145:19;;10950:220;;;:::o;11176:366::-;11318:3;11339:67;11403:2;11398:3;11339:67;:::i;:::-;11332:74;;11415:93;11504:3;11415:93;:::i;:::-;11533:2;11528:3;11524:12;11517:19;;11322:220;;;:::o;11548:366::-;11690:3;11711:67;11775:2;11770:3;11711:67;:::i;:::-;11704:74;;11787:93;11876:3;11787:93;:::i;:::-;11905:2;11900:3;11896:12;11889:19;;11694:220;;;:::o;11920:366::-;12062:3;12083:67;12147:2;12142:3;12083:67;:::i;:::-;12076:74;;12159:93;12248:3;12159:93;:::i;:::-;12277:2;12272:3;12268:12;12261:19;;12066:220;;;:::o;12292:366::-;12434:3;12455:67;12519:2;12514:3;12455:67;:::i;:::-;12448:74;;12531:93;12620:3;12531:93;:::i;:::-;12649:2;12644:3;12640:12;12633:19;;12438:220;;;:::o;12664:366::-;12806:3;12827:67;12891:2;12886:3;12827:67;:::i;:::-;12820:74;;12903:93;12992:3;12903:93;:::i;:::-;13021:2;13016:3;13012:12;13005:19;;12810:220;;;:::o;13036:366::-;13178:3;13199:67;13263:2;13258:3;13199:67;:::i;:::-;13192:74;;13275:93;13364:3;13275:93;:::i;:::-;13393:2;13388:3;13384:12;13377:19;;13182:220;;;:::o;13408:366::-;13550:3;13571:67;13635:2;13630:3;13571:67;:::i;:::-;13564:74;;13647:93;13736:3;13647:93;:::i;:::-;13765:2;13760:3;13756:12;13749:19;;13554:220;;;:::o;13780:366::-;13922:3;13943:67;14007:2;14002:3;13943:67;:::i;:::-;13936:74;;14019:93;14108:3;14019:93;:::i;:::-;14137:2;14132:3;14128:12;14121:19;;13926:220;;;:::o;14152:366::-;14294:3;14315:67;14379:2;14374:3;14315:67;:::i;:::-;14308:74;;14391:93;14480:3;14391:93;:::i;:::-;14509:2;14504:3;14500:12;14493:19;;14298:220;;;:::o;14524:366::-;14666:3;14687:67;14751:2;14746:3;14687:67;:::i;:::-;14680:74;;14763:93;14852:3;14763:93;:::i;:::-;14881:2;14876:3;14872:12;14865:19;;14670:220;;;:::o;14896:366::-;15038:3;15059:67;15123:2;15118:3;15059:67;:::i;:::-;15052:74;;15135:93;15224:3;15135:93;:::i;:::-;15253:2;15248:3;15244:12;15237:19;;15042:220;;;:::o;15268:366::-;15410:3;15431:67;15495:2;15490:3;15431:67;:::i;:::-;15424:74;;15507:93;15596:3;15507:93;:::i;:::-;15625:2;15620:3;15616:12;15609:19;;15414:220;;;:::o;15640:366::-;15782:3;15803:67;15867:2;15862:3;15803:67;:::i;:::-;15796:74;;15879:93;15968:3;15879:93;:::i;:::-;15997:2;15992:3;15988:12;15981:19;;15786:220;;;:::o;16012:366::-;16154:3;16175:67;16239:2;16234:3;16175:67;:::i;:::-;16168:74;;16251:93;16340:3;16251:93;:::i;:::-;16369:2;16364:3;16360:12;16353:19;;16158:220;;;:::o;16384:366::-;16526:3;16547:67;16611:2;16606:3;16547:67;:::i;:::-;16540:74;;16623:93;16712:3;16623:93;:::i;:::-;16741:2;16736:3;16732:12;16725:19;;16530:220;;;:::o;16756:366::-;16898:3;16919:67;16983:2;16978:3;16919:67;:::i;:::-;16912:74;;16995:93;17084:3;16995:93;:::i;:::-;17113:2;17108:3;17104:12;17097:19;;16902:220;;;:::o;17128:366::-;17270:3;17291:67;17355:2;17350:3;17291:67;:::i;:::-;17284:74;;17367:93;17456:3;17367:93;:::i;:::-;17485:2;17480:3;17476:12;17469:19;;17274:220;;;:::o;17500:366::-;17642:3;17663:67;17727:2;17722:3;17663:67;:::i;:::-;17656:74;;17739:93;17828:3;17739:93;:::i;:::-;17857:2;17852:3;17848:12;17841:19;;17646:220;;;:::o;17872:366::-;18014:3;18035:67;18099:2;18094:3;18035:67;:::i;:::-;18028:74;;18111:93;18200:3;18111:93;:::i;:::-;18229:2;18224:3;18220:12;18213:19;;18018:220;;;:::o;18244:398::-;18403:3;18424:83;18505:1;18500:3;18424:83;:::i;:::-;18417:90;;18516:93;18605:3;18516:93;:::i;:::-;18634:1;18629:3;18625:11;18618:18;;18407:235;;;:::o;18648:366::-;18790:3;18811:67;18875:2;18870:3;18811:67;:::i;:::-;18804:74;;18887:93;18976:3;18887:93;:::i;:::-;19005:2;19000:3;18996:12;18989:19;;18794:220;;;:::o;19020:366::-;19162:3;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19259:93;19348:3;19259:93;:::i;:::-;19377:2;19372:3;19368:12;19361:19;;19166:220;;;:::o;19392:366::-;19534:3;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19631:93;19720:3;19631:93;:::i;:::-;19749:2;19744:3;19740:12;19733:19;;19538:220;;;:::o;19764:366::-;19906:3;19927:67;19991:2;19986:3;19927:67;:::i;:::-;19920:74;;20003:93;20092:3;20003:93;:::i;:::-;20121:2;20116:3;20112:12;20105:19;;19910:220;;;:::o;20136:366::-;20278:3;20299:67;20363:2;20358:3;20299:67;:::i;:::-;20292:74;;20375:93;20464:3;20375:93;:::i;:::-;20493:2;20488:3;20484:12;20477:19;;20282:220;;;:::o;20508:366::-;20650:3;20671:67;20735:2;20730:3;20671:67;:::i;:::-;20664:74;;20747:93;20836:3;20747:93;:::i;:::-;20865:2;20860:3;20856:12;20849:19;;20654:220;;;:::o;20880:366::-;21022:3;21043:67;21107:2;21102:3;21043:67;:::i;:::-;21036:74;;21119:93;21208:3;21119:93;:::i;:::-;21237:2;21232:3;21228:12;21221:19;;21026:220;;;:::o;21252:366::-;21394:3;21415:67;21479:2;21474:3;21415:67;:::i;:::-;21408:74;;21491:93;21580:3;21491:93;:::i;:::-;21609:2;21604:3;21600:12;21593:19;;21398:220;;;:::o;21624:366::-;21766:3;21787:67;21851:2;21846:3;21787:67;:::i;:::-;21780:74;;21863:93;21952:3;21863:93;:::i;:::-;21981:2;21976:3;21972:12;21965:19;;21770:220;;;:::o;21996:366::-;22138:3;22159:67;22223:2;22218:3;22159:67;:::i;:::-;22152:74;;22235:93;22324:3;22235:93;:::i;:::-;22353:2;22348:3;22344:12;22337:19;;22142:220;;;:::o;22368:366::-;22510:3;22531:67;22595:2;22590:3;22531:67;:::i;:::-;22524:74;;22607:93;22696:3;22607:93;:::i;:::-;22725:2;22720:3;22716:12;22709:19;;22514:220;;;:::o;22740:118::-;22827:24;22845:5;22827:24;:::i;:::-;22822:3;22815:37;22805:53;;:::o;22864:435::-;23044:3;23066:95;23157:3;23148:6;23066:95;:::i;:::-;23059:102;;23178:95;23269:3;23260:6;23178:95;:::i;:::-;23171:102;;23290:3;23283:10;;23048:251;;;;;:::o;23305:379::-;23489:3;23511:147;23654:3;23511:147;:::i;:::-;23504:154;;23675:3;23668:10;;23493:191;;;:::o;23690:222::-;23783:4;23821:2;23810:9;23806:18;23798:26;;23834:71;23902:1;23891:9;23887:17;23878:6;23834:71;:::i;:::-;23788:124;;;;:::o;23918:640::-;24113:4;24151:3;24140:9;24136:19;24128:27;;24165:71;24233:1;24222:9;24218:17;24209:6;24165:71;:::i;:::-;24246:72;24314:2;24303:9;24299:18;24290:6;24246:72;:::i;:::-;24328;24396:2;24385:9;24381:18;24372:6;24328:72;:::i;:::-;24447:9;24441:4;24437:20;24432:2;24421:9;24417:18;24410:48;24475:76;24546:4;24537:6;24475:76;:::i;:::-;24467:84;;24118:440;;;;;;;:::o;24564:332::-;24685:4;24723:2;24712:9;24708:18;24700:26;;24736:71;24804:1;24793:9;24789:17;24780:6;24736:71;:::i;:::-;24817:72;24885:2;24874:9;24870:18;24861:6;24817:72;:::i;:::-;24690:206;;;;;:::o;24902:210::-;24989:4;25027:2;25016:9;25012:18;25004:26;;25040:65;25102:1;25091:9;25087:17;25078:6;25040:65;:::i;:::-;24994:118;;;;:::o;25118:313::-;25231:4;25269:2;25258:9;25254:18;25246:26;;25318:9;25312:4;25308:20;25304:1;25293:9;25289:17;25282:47;25346:78;25419:4;25410:6;25346:78;:::i;:::-;25338:86;;25236:195;;;;:::o;25437:419::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25690:9;25684:4;25680:20;25676:1;25665:9;25661:17;25654:47;25718:131;25844:4;25718:131;:::i;:::-;25710:139;;25608:248;;;:::o;25862:419::-;26028:4;26066:2;26055:9;26051:18;26043:26;;26115:9;26109:4;26105:20;26101:1;26090:9;26086:17;26079:47;26143:131;26269:4;26143:131;:::i;:::-;26135:139;;26033:248;;;:::o;26287:419::-;26453:4;26491:2;26480:9;26476:18;26468:26;;26540:9;26534:4;26530:20;26526:1;26515:9;26511:17;26504:47;26568:131;26694:4;26568:131;:::i;:::-;26560:139;;26458:248;;;:::o;26712:419::-;26878:4;26916:2;26905:9;26901:18;26893:26;;26965:9;26959:4;26955:20;26951:1;26940:9;26936:17;26929:47;26993:131;27119:4;26993:131;:::i;:::-;26985:139;;26883:248;;;:::o;27137:419::-;27303:4;27341:2;27330:9;27326:18;27318:26;;27390:9;27384:4;27380:20;27376:1;27365:9;27361:17;27354:47;27418:131;27544:4;27418:131;:::i;:::-;27410:139;;27308:248;;;:::o;27562:419::-;27728:4;27766:2;27755:9;27751:18;27743:26;;27815:9;27809:4;27805:20;27801:1;27790:9;27786:17;27779:47;27843:131;27969:4;27843:131;:::i;:::-;27835:139;;27733:248;;;:::o;27987:419::-;28153:4;28191:2;28180:9;28176:18;28168:26;;28240:9;28234:4;28230:20;28226:1;28215:9;28211:17;28204:47;28268:131;28394:4;28268:131;:::i;:::-;28260:139;;28158:248;;;:::o;28412:419::-;28578:4;28616:2;28605:9;28601:18;28593:26;;28665:9;28659:4;28655:20;28651:1;28640:9;28636:17;28629:47;28693:131;28819:4;28693:131;:::i;:::-;28685:139;;28583:248;;;:::o;28837:419::-;29003:4;29041:2;29030:9;29026:18;29018:26;;29090:9;29084:4;29080:20;29076:1;29065:9;29061:17;29054:47;29118:131;29244:4;29118:131;:::i;:::-;29110:139;;29008:248;;;:::o;29262:419::-;29428:4;29466:2;29455:9;29451:18;29443:26;;29515:9;29509:4;29505:20;29501:1;29490:9;29486:17;29479:47;29543:131;29669:4;29543:131;:::i;:::-;29535:139;;29433:248;;;:::o;29687:419::-;29853:4;29891:2;29880:9;29876:18;29868:26;;29940:9;29934:4;29930:20;29926:1;29915:9;29911:17;29904:47;29968:131;30094:4;29968:131;:::i;:::-;29960:139;;29858:248;;;:::o;30112:419::-;30278:4;30316:2;30305:9;30301:18;30293:26;;30365:9;30359:4;30355:20;30351:1;30340:9;30336:17;30329:47;30393:131;30519:4;30393:131;:::i;:::-;30385:139;;30283:248;;;:::o;30537:419::-;30703:4;30741:2;30730:9;30726:18;30718:26;;30790:9;30784:4;30780:20;30776:1;30765:9;30761:17;30754:47;30818:131;30944:4;30818:131;:::i;:::-;30810:139;;30708:248;;;:::o;30962:419::-;31128:4;31166:2;31155:9;31151:18;31143:26;;31215:9;31209:4;31205:20;31201:1;31190:9;31186:17;31179:47;31243:131;31369:4;31243:131;:::i;:::-;31235:139;;31133:248;;;:::o;31387:419::-;31553:4;31591:2;31580:9;31576:18;31568:26;;31640:9;31634:4;31630:20;31626:1;31615:9;31611:17;31604:47;31668:131;31794:4;31668:131;:::i;:::-;31660:139;;31558:248;;;:::o;31812:419::-;31978:4;32016:2;32005:9;32001:18;31993:26;;32065:9;32059:4;32055:20;32051:1;32040:9;32036:17;32029:47;32093:131;32219:4;32093:131;:::i;:::-;32085:139;;31983:248;;;:::o;32237:419::-;32403:4;32441:2;32430:9;32426:18;32418:26;;32490:9;32484:4;32480:20;32476:1;32465:9;32461:17;32454:47;32518:131;32644:4;32518:131;:::i;:::-;32510:139;;32408:248;;;:::o;32662:419::-;32828:4;32866:2;32855:9;32851:18;32843:26;;32915:9;32909:4;32905:20;32901:1;32890:9;32886:17;32879:47;32943:131;33069:4;32943:131;:::i;:::-;32935:139;;32833:248;;;:::o;33087:419::-;33253:4;33291:2;33280:9;33276:18;33268:26;;33340:9;33334:4;33330:20;33326:1;33315:9;33311:17;33304:47;33368:131;33494:4;33368:131;:::i;:::-;33360:139;;33258:248;;;:::o;33512:419::-;33678:4;33716:2;33705:9;33701:18;33693:26;;33765:9;33759:4;33755:20;33751:1;33740:9;33736:17;33729:47;33793:131;33919:4;33793:131;:::i;:::-;33785:139;;33683:248;;;:::o;33937:419::-;34103:4;34141:2;34130:9;34126:18;34118:26;;34190:9;34184:4;34180:20;34176:1;34165:9;34161:17;34154:47;34218:131;34344:4;34218:131;:::i;:::-;34210:139;;34108:248;;;:::o;34362:419::-;34528:4;34566:2;34555:9;34551:18;34543:26;;34615:9;34609:4;34605:20;34601:1;34590:9;34586:17;34579:47;34643:131;34769:4;34643:131;:::i;:::-;34635:139;;34533:248;;;:::o;34787:419::-;34953:4;34991:2;34980:9;34976:18;34968:26;;35040:9;35034:4;35030:20;35026:1;35015:9;35011:17;35004:47;35068:131;35194:4;35068:131;:::i;:::-;35060:139;;34958:248;;;:::o;35212:419::-;35378:4;35416:2;35405:9;35401:18;35393:26;;35465:9;35459:4;35455:20;35451:1;35440:9;35436:17;35429:47;35493:131;35619:4;35493:131;:::i;:::-;35485:139;;35383:248;;;:::o;35637:419::-;35803:4;35841:2;35830:9;35826:18;35818:26;;35890:9;35884:4;35880:20;35876:1;35865:9;35861:17;35854:47;35918:131;36044:4;35918:131;:::i;:::-;35910:139;;35808:248;;;:::o;36062:419::-;36228:4;36266:2;36255:9;36251:18;36243:26;;36315:9;36309:4;36305:20;36301:1;36290:9;36286:17;36279:47;36343:131;36469:4;36343:131;:::i;:::-;36335:139;;36233:248;;;:::o;36487:419::-;36653:4;36691:2;36680:9;36676:18;36668:26;;36740:9;36734:4;36730:20;36726:1;36715:9;36711:17;36704:47;36768:131;36894:4;36768:131;:::i;:::-;36760:139;;36658:248;;;:::o;36912:419::-;37078:4;37116:2;37105:9;37101:18;37093:26;;37165:9;37159:4;37155:20;37151:1;37140:9;37136:17;37129:47;37193:131;37319:4;37193:131;:::i;:::-;37185:139;;37083:248;;;:::o;37337:419::-;37503:4;37541:2;37530:9;37526:18;37518:26;;37590:9;37584:4;37580:20;37576:1;37565:9;37561:17;37554:47;37618:131;37744:4;37618:131;:::i;:::-;37610:139;;37508:248;;;:::o;37762:419::-;37928:4;37966:2;37955:9;37951:18;37943:26;;38015:9;38009:4;38005:20;38001:1;37990:9;37986:17;37979:47;38043:131;38169:4;38043:131;:::i;:::-;38035:139;;37933:248;;;:::o;38187:419::-;38353:4;38391:2;38380:9;38376:18;38368:26;;38440:9;38434:4;38430:20;38426:1;38415:9;38411:17;38404:47;38468:131;38594:4;38468:131;:::i;:::-;38460:139;;38358:248;;;:::o;38612:419::-;38778:4;38816:2;38805:9;38801:18;38793:26;;38865:9;38859:4;38855:20;38851:1;38840:9;38836:17;38829:47;38893:131;39019:4;38893:131;:::i;:::-;38885:139;;38783:248;;;:::o;39037:419::-;39203:4;39241:2;39230:9;39226:18;39218:26;;39290:9;39284:4;39280:20;39276:1;39265:9;39261:17;39254:47;39318:131;39444:4;39318:131;:::i;:::-;39310:139;;39208:248;;;:::o;39462:419::-;39628:4;39666:2;39655:9;39651:18;39643:26;;39715:9;39709:4;39705:20;39701:1;39690:9;39686:17;39679:47;39743:131;39869:4;39743:131;:::i;:::-;39735:139;;39633:248;;;:::o;39887:222::-;39980:4;40018:2;40007:9;40003:18;39995:26;;40031:71;40099:1;40088:9;40084:17;40075:6;40031:71;:::i;:::-;39985:124;;;;:::o;40115:129::-;40149:6;40176:20;;:::i;:::-;40166:30;;40205:33;40233:4;40225:6;40205:33;:::i;:::-;40156:88;;;:::o;40250:75::-;40283:6;40316:2;40310:9;40300:19;;40290:35;:::o;40331:307::-;40392:4;40482:18;40474:6;40471:30;40468:2;;;40504:18;;:::i;:::-;40468:2;40542:29;40564:6;40542:29;:::i;:::-;40534:37;;40626:4;40620;40616:15;40608:23;;40397:241;;;:::o;40644:308::-;40706:4;40796:18;40788:6;40785:30;40782:2;;;40818:18;;:::i;:::-;40782:2;40856:29;40878:6;40856:29;:::i;:::-;40848:37;;40940:4;40934;40930:15;40922:23;;40711:241;;;:::o;40958:98::-;41009:6;41043:5;41037:12;41027:22;;41016:40;;;:::o;41062:99::-;41114:6;41148:5;41142:12;41132:22;;41121:40;;;:::o;41167:168::-;41250:11;41284:6;41279:3;41272:19;41324:4;41319:3;41315:14;41300:29;;41262:73;;;;:::o;41341:147::-;41442:11;41479:3;41464:18;;41454:34;;;;:::o;41494:169::-;41578:11;41612:6;41607:3;41600:19;41652:4;41647:3;41643:14;41628:29;;41590:73;;;;:::o;41669:148::-;41771:11;41808:3;41793:18;;41783:34;;;;:::o;41823:305::-;41863:3;41882:20;41900:1;41882:20;:::i;:::-;41877:25;;41916:20;41934:1;41916:20;:::i;:::-;41911:25;;42070:1;42002:66;41998:74;41995:1;41992:81;41989:2;;;42076:18;;:::i;:::-;41989:2;42120:1;42117;42113:9;42106:16;;41867:261;;;;:::o;42134:185::-;42174:1;42191:20;42209:1;42191:20;:::i;:::-;42186:25;;42225:20;42243:1;42225:20;:::i;:::-;42220:25;;42264:1;42254:2;;42269:18;;:::i;:::-;42254:2;42311:1;42308;42304:9;42299:14;;42176:143;;;;:::o;42325:348::-;42365:7;42388:20;42406:1;42388:20;:::i;:::-;42383:25;;42422:20;42440:1;42422:20;:::i;:::-;42417:25;;42610:1;42542:66;42538:74;42535:1;42532:81;42527:1;42520:9;42513:17;42509:105;42506:2;;;42617:18;;:::i;:::-;42506:2;42665:1;42662;42658:9;42647:20;;42373:300;;;;:::o;42679:191::-;42719:4;42739:20;42757:1;42739:20;:::i;:::-;42734:25;;42773:20;42791:1;42773:20;:::i;:::-;42768:25;;42812:1;42809;42806:8;42803:2;;;42817:18;;:::i;:::-;42803:2;42862:1;42859;42855:9;42847:17;;42724:146;;;;:::o;42876:96::-;42913:7;42942:24;42960:5;42942:24;:::i;:::-;42931:35;;42921:51;;;:::o;42978:90::-;43012:7;43055:5;43048:13;43041:21;43030:32;;43020:48;;;:::o;43074:149::-;43110:7;43150:66;43143:5;43139:78;43128:89;;43118:105;;;:::o;43229:126::-;43266:7;43306:42;43299:5;43295:54;43284:65;;43274:81;;;:::o;43361:77::-;43398:7;43427:5;43416:16;;43406:32;;;:::o;43444:154::-;43528:6;43523:3;43518;43505:30;43590:1;43581:6;43576:3;43572:16;43565:27;43495:103;;;:::o;43604:307::-;43672:1;43682:113;43696:6;43693:1;43690:13;43682:113;;;43781:1;43776:3;43772:11;43766:18;43762:1;43757:3;43753:11;43746:39;43718:2;43715:1;43711:10;43706:15;;43682:113;;;43813:6;43810:1;43807:13;43804:2;;;43893:1;43884:6;43879:3;43875:16;43868:27;43804:2;43653:258;;;;:::o;43917:320::-;43961:6;43998:1;43992:4;43988:12;43978:22;;44045:1;44039:4;44035:12;44066:18;44056:2;;44122:4;44114:6;44110:17;44100:27;;44056:2;44184;44176:6;44173:14;44153:18;44150:38;44147:2;;;44203:18;;:::i;:::-;44147:2;43968:269;;;;:::o;44243:281::-;44326:27;44348:4;44326:27;:::i;:::-;44318:6;44314:40;44456:6;44444:10;44441:22;44420:18;44408:10;44405:34;44402:62;44399:2;;;44467:18;;:::i;:::-;44399:2;44507:10;44503:2;44496:22;44286:238;;;:::o;44530:233::-;44569:3;44592:24;44610:5;44592:24;:::i;:::-;44583:33;;44638:66;44631:5;44628:77;44625:2;;;44708:18;;:::i;:::-;44625:2;44755:1;44748:5;44744:13;44737:20;;44573:190;;;:::o;44769:176::-;44801:1;44818:20;44836:1;44818:20;:::i;:::-;44813:25;;44852:20;44870:1;44852:20;:::i;:::-;44847:25;;44891:1;44881:2;;44896:18;;:::i;:::-;44881:2;44937:1;44934;44930:9;44925:14;;44803:142;;;;:::o;44951:180::-;44999:77;44996:1;44989:88;45096:4;45093:1;45086:15;45120:4;45117:1;45110:15;45137:180;45185:77;45182:1;45175:88;45282:4;45279:1;45272:15;45306:4;45303:1;45296:15;45323:180;45371:77;45368:1;45361:88;45468:4;45465:1;45458:15;45492:4;45489:1;45482:15;45509:180;45557:77;45554:1;45547:88;45654:4;45651:1;45644:15;45678:4;45675:1;45668:15;45695:102;45736:6;45787:2;45783:7;45778:2;45771:5;45767:14;45763:28;45753:38;;45743:54;;;:::o;45803:177::-;45943:29;45939:1;45931:6;45927:14;45920:53;45909:71;:::o;45986:172::-;46126:24;46122:1;46114:6;46110:14;46103:48;46092:66;:::o;46164:230::-;46304:34;46300:1;46292:6;46288:14;46281:58;46373:13;46368:2;46360:6;46356:15;46349:38;46270:124;:::o;46400:237::-;46540:34;46536:1;46528:6;46524:14;46517:58;46609:20;46604:2;46596:6;46592:15;46585:45;46506:131;:::o;46643:225::-;46783:34;46779:1;46771:6;46767:14;46760:58;46852:8;46847:2;46839:6;46835:15;46828:33;46749:119;:::o;46874:174::-;47014:26;47010:1;47002:6;46998:14;46991:50;46980:68;:::o;47054:178::-;47194:30;47190:1;47182:6;47178:14;47171:54;47160:72;:::o;47238:167::-;47378:19;47374:1;47366:6;47362:14;47355:43;47344:61;:::o;47411:170::-;47551:22;47547:1;47539:6;47535:14;47528:46;47517:64;:::o;47587:223::-;47727:34;47723:1;47715:6;47711:14;47704:58;47796:6;47791:2;47783:6;47779:15;47772:31;47693:117;:::o;47816:175::-;47956:27;47952:1;47944:6;47940:14;47933:51;47922:69;:::o;47997:182::-;48137:34;48133:1;48125:6;48121:14;48114:58;48103:76;:::o;48185:231::-;48325:34;48321:1;48313:6;48309:14;48302:58;48394:14;48389:2;48381:6;48377:15;48370:39;48291:125;:::o;48422:243::-;48562:34;48558:1;48550:6;48546:14;48539:58;48631:26;48626:2;48618:6;48614:15;48607:51;48528:137;:::o;48671:229::-;48811:34;48807:1;48799:6;48795:14;48788:58;48880:12;48875:2;48867:6;48863:15;48856:37;48777:123;:::o;48906:228::-;49046:34;49042:1;49034:6;49030:14;49023:58;49115:11;49110:2;49102:6;49098:15;49091:36;49012:122;:::o;49140:177::-;49280:29;49276:1;49268:6;49264:14;49257:53;49246:71;:::o;49323:182::-;49463:34;49459:1;49451:6;49447:14;49440:58;49429:76;:::o;49511:231::-;49651:34;49647:1;49639:6;49635:14;49628:58;49720:14;49715:2;49707:6;49703:15;49696:39;49617:125;:::o;49748:182::-;49888:34;49884:1;49876:6;49872:14;49865:58;49854:76;:::o;49936:228::-;50076:34;50072:1;50064:6;50060:14;50053:58;50145:11;50140:2;50132:6;50128:15;50121:36;50042:122;:::o;50170:234::-;50310:34;50306:1;50298:6;50294:14;50287:58;50379:17;50374:2;50366:6;50362:15;50355:42;50276:128;:::o;50410:220::-;50550:34;50546:1;50538:6;50534:14;50527:58;50619:3;50614:2;50606:6;50602:15;50595:28;50516:114;:::o;50636:::-;50742:8;:::o;50756:236::-;50896:34;50892:1;50884:6;50880:14;50873:58;50965:19;50960:2;50952:6;50948:15;50941:44;50862:130;:::o;50998:167::-;51138:19;51134:1;51126:6;51122:14;51115:43;51104:61;:::o;51171:182::-;51311:34;51307:1;51299:6;51295:14;51288:58;51277:76;:::o;51359:231::-;51499:34;51495:1;51487:6;51483:14;51476:58;51568:14;51563:2;51555:6;51551:15;51544:39;51465:125;:::o;51596:177::-;51736:29;51732:1;51724:6;51720:14;51713:53;51702:71;:::o;51779:163::-;51919:15;51915:1;51907:6;51903:14;51896:39;51885:57;:::o;51948:163::-;52088:15;52084:1;52076:6;52072:14;52065:39;52054:57;:::o;52117:181::-;52257:33;52253:1;52245:6;52241:14;52234:57;52223:75;:::o;52304:167::-;52444:19;52440:1;52432:6;52428:14;52421:43;52410:61;:::o;52477:176::-;52617:28;52613:1;52605:6;52601:14;52594:52;52583:70;:::o;52659:169::-;52799:21;52795:1;52787:6;52783:14;52776:45;52765:63;:::o;52834:122::-;52907:24;52925:5;52907:24;:::i;:::-;52900:5;52897:35;52887:2;;52946:1;52943;52936:12;52887:2;52877:79;:::o;52962:116::-;53032:21;53047:5;53032:21;:::i;:::-;53025:5;53022:32;53012:2;;53068:1;53065;53058:12;53012:2;53002:76;:::o;53084:120::-;53156:23;53173:5;53156:23;:::i;:::-;53149:5;53146:34;53136:2;;53194:1;53191;53184:12;53136:2;53126:78;:::o;53210:122::-;53283:24;53301:5;53283:24;:::i;:::-;53276:5;53273:35;53263:2;;53322:1;53319;53312:12;53263:2;53253:79;:::o

Swarm Source

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