ETH Price: $3,426.92 (+7.36%)
Gas: 14 Gwei

Token

Cityverse (CV)
 

Overview

Max Total Supply

798 CV

Holders

536

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CV
0x42e0f367782bd443fba7bbebda994bdbb5a53d65
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:
nft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: contracts/creepies.sol



pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';



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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

contract nft is ERC721, Ownable {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCost_ = 0.30 ether;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    //developers wallet address
    address payable private dev = payable(0x318cBF186eB13C74533943b054959867eE44eFFE);

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //marks the timestamp of when the respective sales open
    uint256 public presaleLaunchTime;
    uint256 public publicSaleLaunchTime;
    uint256 public revealTime;
    
    //declaring initial values for variables
    constructor() ERC721('Cityverse', 'CV'){
        numberOfTotalTokens = 0;
        
        maxTotalTokens = 8888;

        unrevealedURI = "ipfs://QmRVyAfU9egivwHCopb84Uph2r4r9BNTE92pjqnEiRQDS4/";

        _safeMint(msg.sender, 1);
        mintsPerAddress[msg.sender] += 1;
        numberOfTotalTokens += 1;
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(numberOfTotalTokens + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= 2, "Maximum 2 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Insufficient Ether to mint this amount of NFTs");
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable {
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
        require(numberOfTotalTokens + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= 2, "Maximum 2 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Insufficient Ether to mint this amount of NFTs");


        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            numberOfTotalTokens += 1;
        }
    }

    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        State saleState_ = saleState();
        require(saleState_ == State.NoSale, "Presale has already opened!");
        presaleLaunchTime = block.timestamp;
    }
    
    //begins the public sale
    function switchToPublicSale() public onlyOwner {
        State saleState_ = saleState();
        require(saleState_ != State.PublicSale, "Public Sale is already live!");
        require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!");
        
        publicSaleLaunchTime = block.timestamp;
    }

    
    //burn the tokens that have not been sold yet
    function burnTokens() public onlyOwner {
        maxTotalTokens = numberOfTotalTokens;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    function totalSupply() public view returns(uint) {
        return numberOfTotalTokens;
    }

    
    //get the funds from the minting of the NFTs
    function retrieveFunds() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, "No funds to retrieve!");

        _withdraw(dev, (balance * 5)/1000);
        _withdraw(payable(msg.sender), accountBalance()); //to avoid dust eth
        
    }

    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }

    //get the current price to mint
    function mintCost() public view returns(uint256) {
        return mintCost_;
    }

    //change the current price to mint
    function changeMintCost(uint newCost) public onlyOwner {
        mintCost_ = newCost;
    }

    //reveal the NFTs
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","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":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052670429d069189e0000600b557380e4929c869102140e69550bbecc20bed61b080c600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073318cbf186eb13c74533943b054959867ee44effe600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000c757600080fd5b506040518060400160405280600981526020017f43697479766572736500000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f435600000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014c929190620007df565b50806001908051906020019062000165929190620007df565b505050620001886200017c6200025960201b60201c565b6200026160201b60201c565b60006008819055506122b86009819055506040518060600160405280603681526020016200590e60369139600f9080519060200190620001ca929190620007df565b50620001de3360016200032760201b60201c565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000230919062000a97565b925050819055506001600860008282546200024c919062000a97565b9250508190555062000cf9565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003498282604051806020016040528060008152506200034d60201b60201c565b5050565b6200035f8383620003bb60201b60201c565b620003746000848484620005a160201b60201c565b620003b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ad9062000a04565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200042e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004259062000a48565b60405180910390fd5b6200043f816200075b60201b60201c565b1562000482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004799062000a26565b60405180910390fd5b6200049660008383620007c760201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004e8919062000a97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005cf8473ffffffffffffffffffffffffffffffffffffffff16620007cc60201b620022161760201c565b156200074e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006016200025960201b60201c565b8786866040518563ffffffff1660e01b8152600401620006259493929190620009b0565b602060405180830381600087803b1580156200064057600080fd5b505af19250505080156200067457506040513d601f19601f82011682018060405250810190620006719190620008a6565b60015b620006fd573d8060008114620006a7576040519150601f19603f3d011682016040523d82523d6000602084013e620006ac565b606091505b50600081511415620006f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ec9062000a04565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000753565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620007ed9062000b94565b90600052602060002090601f0160209004810192826200081157600085556200085d565b82601f106200082c57805160ff19168380011785556200085d565b828001600101855582156200085d579182015b828111156200085c5782518255916020019190600101906200083f565b5b5090506200086c919062000870565b5090565b5b808211156200088b57600081600090555060010162000871565b5090565b600081519050620008a08162000cdf565b92915050565b600060208284031215620008bf57620008be62000c28565b5b6000620008cf848285016200088f565b91505092915050565b620008e38162000af4565b82525050565b6000620008f68262000a6a565b62000902818562000a75565b93506200091481856020860162000b5e565b6200091f8162000c2d565b840191505092915050565b60006200093960328362000a86565b9150620009468262000c3e565b604082019050919050565b600062000960601c8362000a86565b91506200096d8262000c8d565b602082019050919050565b60006200098760208362000a86565b9150620009948262000cb6565b602082019050919050565b620009aa8162000b54565b82525050565b6000608082019050620009c76000830187620008d8565b620009d66020830186620008d8565b620009e560408301856200099f565b8181036060830152620009f98184620008e9565b905095945050505050565b6000602082019050818103600083015262000a1f816200092a565b9050919050565b6000602082019050818103600083015262000a418162000951565b9050919050565b6000602082019050818103600083015262000a638162000978565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000aa48262000b54565b915062000ab18362000b54565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ae95762000ae862000bca565b5b828201905092915050565b600062000b018262000b34565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b7e57808201518184015260208101905062000b61565b8381111562000b8e576000848401525b50505050565b6000600282049050600182168062000bad57607f821691505b6020821081141562000bc45762000bc362000bf9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000cea8162000b08565b811462000cf657600080fd5b50565b614c058062000d096000396000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063ba829d71116100ab578063dcd4e7321161006f578063dcd4e73214610797578063e985e9c5146107b3578063eab41782146107f0578063f2fde38b14610807578063ff9849941461083057610225565b8063ba829d71146106b0578063bdb4b848146106db578063c4d8b9df14610706578063c87b56dd1461072f578063cd5fe7251461076c57610225565b8063a22cb465116100f2578063a22cb46514610600578063a475b5dd14610629578063b0a1c1c414610640578063b3ab66b01461066b578063b88d4fde1461068757610225565b8063715018a61461056a5780637f1921ef146105815780638da5cb5b146105aa57806395d89b41146105d557610225565b80633023eba6116101a6578063603f4d5211610175578063603f4d521461048357806361b20d8c146104ae5780636352211e146104c55780637035bf181461050257806370a082311461052d57610225565b80633023eba6146103b757806332624114146103f457806339a0c6f91461043157806342842e0e1461045a57610225565b8063081812fc116101ed578063081812fc146102d2578063095ea7b31461030f57806318160ddd146103385780631a17fe5e1461036357806323b872dd1461038e57610225565b80630191a6571461022a57806301ffc9a71461025357806306fdde031461029057806308003f78146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130cf565b610847565b005b34801561025f57600080fd5b5061027a600480360381019061027591906132f9565b610907565b6040516102879190613a95565b60405180910390f35b34801561029c57600080fd5b506102a56109e9565b6040516102b29190613b10565b60405180910390f35b3480156102c757600080fd5b506102d0610a7b565b005b3480156102de57600080fd5b506102f960048036038101906102f4919061339c565b610b02565b6040516103069190613a2e565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190613252565b610b87565b005b34801561034457600080fd5b5061034d610c9f565b60405161035a9190613eb2565b60405180910390f35b34801561036f57600080fd5b50610378610ca9565b6040516103859190613eb2565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b0919061313c565b610caf565b005b3480156103c357600080fd5b506103de60048036038101906103d991906130cf565b610d0f565b6040516103eb9190613eb2565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613292565b610d27565b6040516104289190613a95565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613353565b610e25565b005b34801561046657600080fd5b50610481600480360381019061047c919061313c565b610ebb565b005b34801561048f57600080fd5b50610498610edb565b6040516104a59190613af5565b60405180910390f35b3480156104ba57600080fd5b506104c3610f0c565b005b3480156104d157600080fd5b506104ec60048036038101906104e7919061339c565b611030565b6040516104f99190613a2e565b60405180910390f35b34801561050e57600080fd5b506105176110e2565b6040516105249190613b10565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f91906130cf565b611170565b6040516105619190613eb2565b60405180910390f35b34801561057657600080fd5b5061057f611228565b005b34801561058d57600080fd5b506105a860048036038101906105a3919061339c565b6112b0565b005b3480156105b657600080fd5b506105bf611336565b6040516105cc9190613a2e565b60405180910390f35b3480156105e157600080fd5b506105ea611360565b6040516105f79190613b10565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613212565b6113f2565b005b34801561063557600080fd5b5061063e611573565b005b34801561064c57600080fd5b506106556115f8565b6040516106629190613eb2565b60405180910390f35b6106856004803603810190610680919061339c565b61167c565b005b34801561069357600080fd5b506106ae60048036038101906106a9919061318f565b6118ce565b005b3480156106bc57600080fd5b506106c5611930565b6040516106d29190613eb2565b60405180910390f35b3480156106e757600080fd5b506106f0611936565b6040516106fd9190613eb2565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613353565b611940565b005b34801561073b57600080fd5b506107566004803603810190610751919061339c565b6119d6565b6040516107639190613b10565b60405180910390f35b34801561077857600080fd5b50610781611b1b565b60405161078e9190613eb2565b60405180910390f35b6107b160048036038101906107ac91906133c9565b611b21565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906130fc565b611e30565b6040516107e79190613a95565b60405180910390f35b3480156107fc57600080fd5b50610805611ec4565b005b34801561081357600080fd5b5061082e600480360381019061082991906130cf565b611fbd565b005b34801561083c57600080fd5b506108456120b5565b005b61084f612229565b73ffffffffffffffffffffffffffffffffffffffff1661086d611336565b73ffffffffffffffffffffffffffffffffffffffff16146108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba90613d92565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e257506109e182612231565b5b9050919050565b6060600080546109f8906141a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a24906141a9565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83612229565b73ffffffffffffffffffffffffffffffffffffffff16610aa1611336565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90613d92565b60405180910390fd5b600854600981905550565b6000610b0d8261229b565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390613d52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9282611030565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613e32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c22612229565b73ffffffffffffffffffffffffffffffffffffffff161480610c515750610c5081610c4b612229565b611e30565b5b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790613c92565b60405180910390fd5b610c9a8383612307565b505050565b6000600854905090565b60115481565b610cc0610cba612229565b826123c0565b610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690613e72565b60405180910390fd5b610d0a83838361249e565b505050565b600e6020528060005260406000206000915090505481565b6000803086604051602001610d3d929190613998565b604051602081830303815290604052805190602001209050600181604051602001610d6891906139f3565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610d9e9493929190613ab0565b6020604051602081039080840390855afa158015610dc0573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610e2d612229565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611336565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613d92565b60405180910390fd5b80600a9080519060200190610eb7929190612eb9565b5050565b610ed6838383604051806020016040528060008152506118ce565b505050565b6000806010541415610ef05760009050610f09565b60006011541415610f045760019050610f09565b600290505b90565b610f14612229565b73ffffffffffffffffffffffffffffffffffffffff16610f32611336565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90613d92565b60405180910390fd5b6000610f926115f8565b905060008111610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613b32565b60405180910390fd5b61101c600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461100d9190614029565b6110179190613ff8565b6126fa565b61102d336110286115f8565b6126fa565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cf2565b60405180910390fd5b80915050919050565b600f80546110ef906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461111b906141a9565b80156111685780601f1061113d57610100808354040283529160200191611168565b820191906000526020600020905b81548152906001019060200180831161114b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613cd2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611230612229565b73ffffffffffffffffffffffffffffffffffffffff1661124e611336565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90613d92565b60405180910390fd5b6112ae60006127ab565b565b6112b8612229565b73ffffffffffffffffffffffffffffffffffffffff166112d6611336565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613d92565b60405180910390fd5b80600b8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461136f906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461139b906141a9565b80156113e85780601f106113bd576101008083540402835291602001916113e8565b820191906000526020600020905b8154815290600101906020018083116113cb57829003601f168201915b5050505050905090565b6113fa612229565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613c12565b60405180910390fd5b8060056000611475612229565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611522612229565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115679190613a95565b60405180910390a35050565b61157b612229565b73ffffffffffffffffffffffffffffffffffffffff16611599611336565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613d92565b60405180910390fd5b42601281905550565b6000611602612229565b73ffffffffffffffffffffffffffffffffffffffff16611620611336565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d90613d92565b60405180910390fd5b47905090565b6000611686610edb565b905060028081111561169b5761169a614312565b5b8160028111156116ae576116ad614312565b5b146116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613d12565b60405180910390fd5b600954826008546116ff9190613fa2565b1115611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613c32565b60405180910390fd5b600282600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461178d9190613fa2565b11156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c590613db2565b60405180910390fd5b816117d7611936565b6117e19190614029565b341015611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613c72565b60405180910390fd5b60005b828110156118c9576000611838612871565b90506118443382612887565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118949190613fa2565b925050819055506001600860008282546118ae9190613fa2565b925050819055505080806118c19061420c565b915050611826565b505050565b6118df6118d9612229565b836123c0565b61191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613e72565b60405180910390fd5b61192a848484846128a5565b50505050565b60125481565b6000600b54905090565b611948612229565b73ffffffffffffffffffffffffffffffffffffffff16611966611336565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613d92565b60405180910390fd5b80600f90805190602001906119d2929190612eb9565b5050565b60606119e18261229b565b611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790613df2565b60405180910390fd5b60006012541415611abd57600f8054611a38906141a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a64906141a9565b8015611ab15780601f10611a8657610100808354040283529160200191611ab1565b820191906000526020600020905b815481529060010190602001808311611a9457829003601f168201915b50505050509050611b16565b6000611ac7612901565b90506000815111611ae75760405180602001604052806000815250611b12565b80611af184612993565b604051602001611b029291906139c4565b6040516020818303038152906040525b9150505b919050565b60105481565b828282611b3033848484610d27565b611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690613d72565b60405180910390fd5b6000611b79610edb565b905060006002811115611b8f57611b8e614312565b5b816002811115611ba257611ba1614312565b5b1415611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda90613e92565b60405180910390fd5b600280811115611bf657611bf5614312565b5b816002811115611c0957611c08614312565b5b1415611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190613cb2565b60405180910390fd5b60095488600854611c5b9190613fa2565b1115611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390613c32565b60405180910390fd5b600288600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce99190613fa2565b1115611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613db2565b60405180910390fd5b87611d33611936565b611d3d9190614029565b341015611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7690613c72565b60405180910390fd5b60005b88811015611e25576000611d94612871565b9050611da03382612887565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df09190613fa2565b92505081905550600160086000828254611e0a9190613fa2565b92505081905550508080611e1d9061420c565b915050611d82565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ecc612229565b73ffffffffffffffffffffffffffffffffffffffff16611eea611336565b73ffffffffffffffffffffffffffffffffffffffff1614611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613d92565b60405180910390fd5b6000611f4a610edb565b905060006002811115611f6057611f5f614312565b5b816002811115611f7357611f72614312565b5b14611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613e52565b60405180910390fd5b4260108190555050565b611fc5612229565b73ffffffffffffffffffffffffffffffffffffffff16611fe3611336565b73ffffffffffffffffffffffffffffffffffffffff1614612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090613d92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090613b92565b60405180910390fd5b6120b2816127ab565b50565b6120bd612229565b73ffffffffffffffffffffffffffffffffffffffff166120db611336565b73ffffffffffffffffffffffffffffffffffffffff1614612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890613d92565b60405180910390fd5b600061213b610edb565b90506002808111156121505761214f614312565b5b81600281111561216357612162614312565b5b14156121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219b90613b52565b60405180910390fd5b600060028111156121b8576121b7614312565b5b8160028111156121cb576121ca614312565b5b141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613e12565b60405180910390fd5b4260118190555050565b600080823b905060008111915050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237a83611030565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123cb8261229b565b61240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190613c52565b60405180910390fd5b600061241583611030565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061248457508373ffffffffffffffffffffffffffffffffffffffff1661246c84610b02565b73ffffffffffffffffffffffffffffffffffffffff16145b8061249557506124948185611e30565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124be82611030565b73ffffffffffffffffffffffffffffffffffffffff1614612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613dd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257b90613bf2565b60405180910390fd5b61258f838383612af4565b61259a600082612307565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ea9190614083565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126419190613fa2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161272090613a19565b60006040518083038185875af1925050503d806000811461275d576040519150601f19603f3d011682016040523d82523d6000602084013e612762565b606091505b50509050806127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90613bd2565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060016008546128829190613fa2565b905090565b6128a1828260405180602001604052806000815250612af9565b5050565b6128b084848461249e565b6128bc84848484612b54565b6128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290613b72565b60405180910390fd5b50505050565b6060600a8054612910906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461293c906141a9565b80156129895780601f1061295e57610100808354040283529160200191612989565b820191906000526020600020905b81548152906001019060200180831161296c57829003601f168201915b5050505050905090565b606060008214156129db576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aef565b600082905060005b60008214612a0d5780806129f69061420c565b915050600a82612a069190613ff8565b91506129e3565b60008167ffffffffffffffff811115612a2957612a2861439f565b5b6040519080825280601f01601f191660200182016040528015612a5b5781602001600182028036833780820191505090505b5090505b60008514612ae857600182612a749190614083565b9150600a85612a839190614283565b6030612a8f9190613fa2565b60f81b818381518110612aa557612aa4614370565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ae19190613ff8565b9450612a5f565b8093505050505b919050565b505050565b612b038383612ceb565b612b106000848484612b54565b612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4690613b72565b60405180910390fd5b505050565b6000612b758473ffffffffffffffffffffffffffffffffffffffff16612216565b15612cde578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b9e612229565b8786866040518563ffffffff1660e01b8152600401612bc09493929190613a49565b602060405180830381600087803b158015612bda57600080fd5b505af1925050508015612c0b57506040513d601f19601f82011682018060405250810190612c089190613326565b60015b612c8e573d8060008114612c3b576040519150601f19603f3d011682016040523d82523d6000602084013e612c40565b606091505b50600081511415612c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7d90613b72565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290613d32565b60405180910390fd5b612d648161229b565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b90613bb2565b60405180910390fd5b612db060008383612af4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e009190613fa2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ec5906141a9565b90600052602060002090601f016020900481019282612ee75760008555612f2e565b82601f10612f0057805160ff1916838001178555612f2e565b82800160010185558215612f2e579182015b82811115612f2d578251825591602001919060010190612f12565b5b509050612f3b9190612f3f565b5090565b5b80821115612f58576000816000905550600101612f40565b5090565b6000612f6f612f6a84613ef2565b613ecd565b905082815260208101848484011115612f8b57612f8a6143d3565b5b612f96848285614167565b509392505050565b6000612fb1612fac84613f23565b613ecd565b905082815260208101848484011115612fcd57612fcc6143d3565b5b612fd8848285614167565b509392505050565b600081359050612fef81614b45565b92915050565b60008135905061300481614b5c565b92915050565b60008135905061301981614b73565b92915050565b60008135905061302e81614b8a565b92915050565b60008151905061304381614b8a565b92915050565b600082601f83011261305e5761305d6143ce565b5b813561306e848260208601612f5c565b91505092915050565b600082601f83011261308c5761308b6143ce565b5b813561309c848260208601612f9e565b91505092915050565b6000813590506130b481614ba1565b92915050565b6000813590506130c981614bb8565b92915050565b6000602082840312156130e5576130e46143dd565b5b60006130f384828501612fe0565b91505092915050565b60008060408385031215613113576131126143dd565b5b600061312185828601612fe0565b925050602061313285828601612fe0565b9150509250929050565b600080600060608486031215613155576131546143dd565b5b600061316386828701612fe0565b935050602061317486828701612fe0565b9250506040613185868287016130a5565b9150509250925092565b600080600080608085870312156131a9576131a86143dd565b5b60006131b787828801612fe0565b94505060206131c887828801612fe0565b93505060406131d9878288016130a5565b925050606085013567ffffffffffffffff8111156131fa576131f96143d8565b5b61320687828801613049565b91505092959194509250565b60008060408385031215613229576132286143dd565b5b600061323785828601612fe0565b925050602061324885828601612ff5565b9150509250929050565b60008060408385031215613269576132686143dd565b5b600061327785828601612fe0565b9250506020613288858286016130a5565b9150509250929050565b600080600080608085870312156132ac576132ab6143dd565b5b60006132ba87828801612fe0565b94505060206132cb878288016130ba565b93505060406132dc8782880161300a565b92505060606132ed8782880161300a565b91505092959194509250565b60006020828403121561330f5761330e6143dd565b5b600061331d8482850161301f565b91505092915050565b60006020828403121561333c5761333b6143dd565b5b600061334a84828501613034565b91505092915050565b600060208284031215613369576133686143dd565b5b600082013567ffffffffffffffff811115613387576133866143d8565b5b61339384828501613077565b91505092915050565b6000602082840312156133b2576133b16143dd565b5b60006133c0848285016130a5565b91505092915050565b600080600080608085870312156133e3576133e26143dd565b5b60006133f1878288016130a5565b9450506020613402878288016130ba565b93505060406134138782880161300a565b92505060606134248782880161300a565b91505092959194509250565b613439816140b7565b82525050565b61345061344b826140b7565b614255565b82525050565b61345f816140c9565b82525050565b61346e816140d5565b82525050565b613485613480826140d5565b614267565b82525050565b600061349682613f54565b6134a08185613f6a565b93506134b0818560208601614176565b6134b9816143e2565b840191505092915050565b6134cd81614155565b82525050565b60006134de82613f5f565b6134e88185613f86565b93506134f8818560208601614176565b613501816143e2565b840191505092915050565b600061351782613f5f565b6135218185613f97565b9350613531818560208601614176565b80840191505092915050565b600061354a601583613f86565b915061355582614400565b602082019050919050565b600061356d601c83613f97565b915061357882614429565b601c82019050919050565b6000613590601c83613f86565b915061359b82614452565b602082019050919050565b60006135b3603283613f86565b91506135be8261447b565b604082019050919050565b60006135d6602683613f86565b91506135e1826144ca565b604082019050919050565b60006135f9601c83613f86565b915061360482614519565b602082019050919050565b600061361c601483613f86565b915061362782614542565b602082019050919050565b600061363f602483613f86565b915061364a8261456b565b604082019050919050565b6000613662601983613f86565b915061366d826145ba565b602082019050919050565b6000613685601e83613f86565b9150613690826145e3565b602082019050919050565b60006136a8602c83613f86565b91506136b38261460c565b604082019050919050565b60006136cb602e83613f86565b91506136d68261465b565b604082019050919050565b60006136ee603883613f86565b91506136f9826146aa565b604082019050919050565b6000613711602a83613f86565b915061371c826146f9565b604082019050919050565b6000613734602a83613f86565b915061373f82614748565b604082019050919050565b6000613757602983613f86565b915061376282614797565b604082019050919050565b600061377a601c83613f86565b9150613785826147e6565b602082019050919050565b600061379d602083613f86565b91506137a88261480f565b602082019050919050565b60006137c0602c83613f86565b91506137cb82614838565b604082019050919050565b60006137e3600583613f97565b91506137ee82614887565b600582019050919050565b6000613806601183613f86565b9150613811826148b0565b602082019050919050565b6000613829602083613f86565b9150613834826148d9565b602082019050919050565b600061384c602483613f86565b915061385782614902565b604082019050919050565b600061386f602983613f86565b915061387a82614951565b604082019050919050565b6000613892602f83613f86565b915061389d826149a0565b604082019050919050565b60006138b5603d83613f86565b91506138c0826149ef565b604082019050919050565b60006138d8602183613f86565b91506138e382614a3e565b604082019050919050565b60006138fb601b83613f86565b915061390682614a8d565b602082019050919050565b600061391e600083613f7b565b915061392982614ab6565b600082019050919050565b6000613941603183613f86565b915061394c82614ab9565b604082019050919050565b6000613964601583613f86565b915061396f82614b08565b602082019050919050565b6139838161413e565b82525050565b61399281614148565b82525050565b60006139a4828561343f565b6014820191506139b4828461343f565b6014820191508190509392505050565b60006139d0828561350c565b91506139dc828461350c565b91506139e7826137d6565b91508190509392505050565b60006139fe82613560565b9150613a0a8284613474565b60208201915081905092915050565b6000613a2482613911565b9150819050919050565b6000602082019050613a436000830184613430565b92915050565b6000608082019050613a5e6000830187613430565b613a6b6020830186613430565b613a78604083018561397a565b8181036060830152613a8a818461348b565b905095945050505050565b6000602082019050613aaa6000830184613456565b92915050565b6000608082019050613ac56000830187613465565b613ad26020830186613989565b613adf6040830185613465565b613aec6060830184613465565b95945050505050565b6000602082019050613b0a60008301846134c4565b92915050565b60006020820190508181036000830152613b2a81846134d3565b905092915050565b60006020820190508181036000830152613b4b8161353d565b9050919050565b60006020820190508181036000830152613b6b81613583565b9050919050565b60006020820190508181036000830152613b8b816135a6565b9050919050565b60006020820190508181036000830152613bab816135c9565b9050919050565b60006020820190508181036000830152613bcb816135ec565b9050919050565b60006020820190508181036000830152613beb8161360f565b9050919050565b60006020820190508181036000830152613c0b81613632565b9050919050565b60006020820190508181036000830152613c2b81613655565b9050919050565b60006020820190508181036000830152613c4b81613678565b9050919050565b60006020820190508181036000830152613c6b8161369b565b9050919050565b60006020820190508181036000830152613c8b816136be565b9050919050565b60006020820190508181036000830152613cab816136e1565b9050919050565b60006020820190508181036000830152613ccb81613704565b9050919050565b60006020820190508181036000830152613ceb81613727565b9050919050565b60006020820190508181036000830152613d0b8161374a565b9050919050565b60006020820190508181036000830152613d2b8161376d565b9050919050565b60006020820190508181036000830152613d4b81613790565b9050919050565b60006020820190508181036000830152613d6b816137b3565b9050919050565b60006020820190508181036000830152613d8b816137f9565b9050919050565b60006020820190508181036000830152613dab8161381c565b9050919050565b60006020820190508181036000830152613dcb8161383f565b9050919050565b60006020820190508181036000830152613deb81613862565b9050919050565b60006020820190508181036000830152613e0b81613885565b9050919050565b60006020820190508181036000830152613e2b816138a8565b9050919050565b60006020820190508181036000830152613e4b816138cb565b9050919050565b60006020820190508181036000830152613e6b816138ee565b9050919050565b60006020820190508181036000830152613e8b81613934565b9050919050565b60006020820190508181036000830152613eab81613957565b9050919050565b6000602082019050613ec7600083018461397a565b92915050565b6000613ed7613ee8565b9050613ee382826141db565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0d57613f0c61439f565b5b613f16826143e2565b9050602081019050919050565b600067ffffffffffffffff821115613f3e57613f3d61439f565b5b613f47826143e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fad8261413e565b9150613fb88361413e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fed57613fec6142b4565b5b828201905092915050565b60006140038261413e565b915061400e8361413e565b92508261401e5761401d6142e3565b5b828204905092915050565b60006140348261413e565b915061403f8361413e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614078576140776142b4565b5b828202905092915050565b600061408e8261413e565b91506140998361413e565b9250828210156140ac576140ab6142b4565b5b828203905092915050565b60006140c28261411e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411982614b31565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141608261410b565b9050919050565b82818337600083830152505050565b60005b83811015614194578082015181840152602081019050614179565b838111156141a3576000848401525b50505050565b600060028204905060018216806141c157607f821691505b602082108114156141d5576141d4614341565b5b50919050565b6141e4826143e2565b810181811067ffffffffffffffff821117156142035761420261439f565b5b80604052505050565b60006142178261413e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561424a576142496142b4565b5b600182019050919050565b600061426082614271565b9050919050565b6000819050919050565b600061427c826143f3565b9050919050565b600061428e8261413e565b91506142998361413e565b9250826142a9576142a86142e3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420457468657220746f206d696e7420746869732060008201527f616d6f756e74206f66204e465473000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178696d756d2032204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b60038110614b4257614b41614312565b5b50565b614b4e816140b7565b8114614b5957600080fd5b50565b614b65816140c9565b8114614b7057600080fd5b50565b614b7c816140d5565b8114614b8757600080fd5b50565b614b93816140df565b8114614b9e57600080fd5b50565b614baa8161413e565b8114614bb557600080fd5b50565b614bc181614148565b8114614bcc57600080fd5b5056fea2646970667358221220432bcac859ad1bc6a303c10221c07325ae88d006440a1a93dea98dedb04dec8164736f6c63430008070033697066733a2f2f516d52567941665539656769767748436f706238345570683272347239424e54453932706a716e456952514453342f

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063715018a611610123578063ba829d71116100ab578063dcd4e7321161006f578063dcd4e73214610797578063e985e9c5146107b3578063eab41782146107f0578063f2fde38b14610807578063ff9849941461083057610225565b8063ba829d71146106b0578063bdb4b848146106db578063c4d8b9df14610706578063c87b56dd1461072f578063cd5fe7251461076c57610225565b8063a22cb465116100f2578063a22cb46514610600578063a475b5dd14610629578063b0a1c1c414610640578063b3ab66b01461066b578063b88d4fde1461068757610225565b8063715018a61461056a5780637f1921ef146105815780638da5cb5b146105aa57806395d89b41146105d557610225565b80633023eba6116101a6578063603f4d5211610175578063603f4d521461048357806361b20d8c146104ae5780636352211e146104c55780637035bf181461050257806370a082311461052d57610225565b80633023eba6146103b757806332624114146103f457806339a0c6f91461043157806342842e0e1461045a57610225565b8063081812fc116101ed578063081812fc146102d2578063095ea7b31461030f57806318160ddd146103385780631a17fe5e1461036357806323b872dd1461038e57610225565b80630191a6571461022a57806301ffc9a71461025357806306fdde031461029057806308003f78146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130cf565b610847565b005b34801561025f57600080fd5b5061027a600480360381019061027591906132f9565b610907565b6040516102879190613a95565b60405180910390f35b34801561029c57600080fd5b506102a56109e9565b6040516102b29190613b10565b60405180910390f35b3480156102c757600080fd5b506102d0610a7b565b005b3480156102de57600080fd5b506102f960048036038101906102f4919061339c565b610b02565b6040516103069190613a2e565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190613252565b610b87565b005b34801561034457600080fd5b5061034d610c9f565b60405161035a9190613eb2565b60405180910390f35b34801561036f57600080fd5b50610378610ca9565b6040516103859190613eb2565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b0919061313c565b610caf565b005b3480156103c357600080fd5b506103de60048036038101906103d991906130cf565b610d0f565b6040516103eb9190613eb2565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613292565b610d27565b6040516104289190613a95565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613353565b610e25565b005b34801561046657600080fd5b50610481600480360381019061047c919061313c565b610ebb565b005b34801561048f57600080fd5b50610498610edb565b6040516104a59190613af5565b60405180910390f35b3480156104ba57600080fd5b506104c3610f0c565b005b3480156104d157600080fd5b506104ec60048036038101906104e7919061339c565b611030565b6040516104f99190613a2e565b60405180910390f35b34801561050e57600080fd5b506105176110e2565b6040516105249190613b10565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f91906130cf565b611170565b6040516105619190613eb2565b60405180910390f35b34801561057657600080fd5b5061057f611228565b005b34801561058d57600080fd5b506105a860048036038101906105a3919061339c565b6112b0565b005b3480156105b657600080fd5b506105bf611336565b6040516105cc9190613a2e565b60405180910390f35b3480156105e157600080fd5b506105ea611360565b6040516105f79190613b10565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613212565b6113f2565b005b34801561063557600080fd5b5061063e611573565b005b34801561064c57600080fd5b506106556115f8565b6040516106629190613eb2565b60405180910390f35b6106856004803603810190610680919061339c565b61167c565b005b34801561069357600080fd5b506106ae60048036038101906106a9919061318f565b6118ce565b005b3480156106bc57600080fd5b506106c5611930565b6040516106d29190613eb2565b60405180910390f35b3480156106e757600080fd5b506106f0611936565b6040516106fd9190613eb2565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613353565b611940565b005b34801561073b57600080fd5b506107566004803603810190610751919061339c565b6119d6565b6040516107639190613b10565b60405180910390f35b34801561077857600080fd5b50610781611b1b565b60405161078e9190613eb2565b60405180910390f35b6107b160048036038101906107ac91906133c9565b611b21565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906130fc565b611e30565b6040516107e79190613a95565b60405180910390f35b3480156107fc57600080fd5b50610805611ec4565b005b34801561081357600080fd5b5061082e600480360381019061082991906130cf565b611fbd565b005b34801561083c57600080fd5b506108456120b5565b005b61084f612229565b73ffffffffffffffffffffffffffffffffffffffff1661086d611336565b73ffffffffffffffffffffffffffffffffffffffff16146108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba90613d92565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e257506109e182612231565b5b9050919050565b6060600080546109f8906141a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a24906141a9565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83612229565b73ffffffffffffffffffffffffffffffffffffffff16610aa1611336565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90613d92565b60405180910390fd5b600854600981905550565b6000610b0d8261229b565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390613d52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9282611030565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613e32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c22612229565b73ffffffffffffffffffffffffffffffffffffffff161480610c515750610c5081610c4b612229565b611e30565b5b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790613c92565b60405180910390fd5b610c9a8383612307565b505050565b6000600854905090565b60115481565b610cc0610cba612229565b826123c0565b610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690613e72565b60405180910390fd5b610d0a83838361249e565b505050565b600e6020528060005260406000206000915090505481565b6000803086604051602001610d3d929190613998565b604051602081830303815290604052805190602001209050600181604051602001610d6891906139f3565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610d9e9493929190613ab0565b6020604051602081039080840390855afa158015610dc0573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610e2d612229565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611336565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613d92565b60405180910390fd5b80600a9080519060200190610eb7929190612eb9565b5050565b610ed6838383604051806020016040528060008152506118ce565b505050565b6000806010541415610ef05760009050610f09565b60006011541415610f045760019050610f09565b600290505b90565b610f14612229565b73ffffffffffffffffffffffffffffffffffffffff16610f32611336565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90613d92565b60405180910390fd5b6000610f926115f8565b905060008111610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613b32565b60405180910390fd5b61101c600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461100d9190614029565b6110179190613ff8565b6126fa565b61102d336110286115f8565b6126fa565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cf2565b60405180910390fd5b80915050919050565b600f80546110ef906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461111b906141a9565b80156111685780601f1061113d57610100808354040283529160200191611168565b820191906000526020600020905b81548152906001019060200180831161114b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613cd2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611230612229565b73ffffffffffffffffffffffffffffffffffffffff1661124e611336565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90613d92565b60405180910390fd5b6112ae60006127ab565b565b6112b8612229565b73ffffffffffffffffffffffffffffffffffffffff166112d6611336565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613d92565b60405180910390fd5b80600b8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461136f906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461139b906141a9565b80156113e85780601f106113bd576101008083540402835291602001916113e8565b820191906000526020600020905b8154815290600101906020018083116113cb57829003601f168201915b5050505050905090565b6113fa612229565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90613c12565b60405180910390fd5b8060056000611475612229565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611522612229565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115679190613a95565b60405180910390a35050565b61157b612229565b73ffffffffffffffffffffffffffffffffffffffff16611599611336565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613d92565b60405180910390fd5b42601281905550565b6000611602612229565b73ffffffffffffffffffffffffffffffffffffffff16611620611336565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d90613d92565b60405180910390fd5b47905090565b6000611686610edb565b905060028081111561169b5761169a614312565b5b8160028111156116ae576116ad614312565b5b146116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613d12565b60405180910390fd5b600954826008546116ff9190613fa2565b1115611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613c32565b60405180910390fd5b600282600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461178d9190613fa2565b11156117ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c590613db2565b60405180910390fd5b816117d7611936565b6117e19190614029565b341015611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613c72565b60405180910390fd5b60005b828110156118c9576000611838612871565b90506118443382612887565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118949190613fa2565b925050819055506001600860008282546118ae9190613fa2565b925050819055505080806118c19061420c565b915050611826565b505050565b6118df6118d9612229565b836123c0565b61191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613e72565b60405180910390fd5b61192a848484846128a5565b50505050565b60125481565b6000600b54905090565b611948612229565b73ffffffffffffffffffffffffffffffffffffffff16611966611336565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390613d92565b60405180910390fd5b80600f90805190602001906119d2929190612eb9565b5050565b60606119e18261229b565b611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790613df2565b60405180910390fd5b60006012541415611abd57600f8054611a38906141a9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a64906141a9565b8015611ab15780601f10611a8657610100808354040283529160200191611ab1565b820191906000526020600020905b815481529060010190602001808311611a9457829003601f168201915b50505050509050611b16565b6000611ac7612901565b90506000815111611ae75760405180602001604052806000815250611b12565b80611af184612993565b604051602001611b029291906139c4565b6040516020818303038152906040525b9150505b919050565b60105481565b828282611b3033848484610d27565b611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690613d72565b60405180910390fd5b6000611b79610edb565b905060006002811115611b8f57611b8e614312565b5b816002811115611ba257611ba1614312565b5b1415611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda90613e92565b60405180910390fd5b600280811115611bf657611bf5614312565b5b816002811115611c0957611c08614312565b5b1415611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190613cb2565b60405180910390fd5b60095488600854611c5b9190613fa2565b1115611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9390613c32565b60405180910390fd5b600288600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce99190613fa2565b1115611d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2190613db2565b60405180910390fd5b87611d33611936565b611d3d9190614029565b341015611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7690613c72565b60405180910390fd5b60005b88811015611e25576000611d94612871565b9050611da03382612887565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df09190613fa2565b92505081905550600160086000828254611e0a9190613fa2565b92505081905550508080611e1d9061420c565b915050611d82565b505050505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ecc612229565b73ffffffffffffffffffffffffffffffffffffffff16611eea611336565b73ffffffffffffffffffffffffffffffffffffffff1614611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613d92565b60405180910390fd5b6000611f4a610edb565b905060006002811115611f6057611f5f614312565b5b816002811115611f7357611f72614312565b5b14611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613e52565b60405180910390fd5b4260108190555050565b611fc5612229565b73ffffffffffffffffffffffffffffffffffffffff16611fe3611336565b73ffffffffffffffffffffffffffffffffffffffff1614612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090613d92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090613b92565b60405180910390fd5b6120b2816127ab565b50565b6120bd612229565b73ffffffffffffffffffffffffffffffffffffffff166120db611336565b73ffffffffffffffffffffffffffffffffffffffff1614612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212890613d92565b60405180910390fd5b600061213b610edb565b90506002808111156121505761214f614312565b5b81600281111561216357612162614312565b5b14156121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219b90613b52565b60405180910390fd5b600060028111156121b8576121b7614312565b5b8160028111156121cb576121ca614312565b5b141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613e12565b60405180910390fd5b4260118190555050565b600080823b905060008111915050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237a83611030565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123cb8261229b565b61240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190613c52565b60405180910390fd5b600061241583611030565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061248457508373ffffffffffffffffffffffffffffffffffffffff1661246c84610b02565b73ffffffffffffffffffffffffffffffffffffffff16145b8061249557506124948185611e30565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124be82611030565b73ffffffffffffffffffffffffffffffffffffffff1614612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613dd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257b90613bf2565b60405180910390fd5b61258f838383612af4565b61259a600082612307565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ea9190614083565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126419190613fa2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161272090613a19565b60006040518083038185875af1925050503d806000811461275d576040519150601f19603f3d011682016040523d82523d6000602084013e612762565b606091505b50509050806127a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279d90613bd2565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060016008546128829190613fa2565b905090565b6128a1828260405180602001604052806000815250612af9565b5050565b6128b084848461249e565b6128bc84848484612b54565b6128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290613b72565b60405180910390fd5b50505050565b6060600a8054612910906141a9565b80601f016020809104026020016040519081016040528092919081815260200182805461293c906141a9565b80156129895780601f1061295e57610100808354040283529160200191612989565b820191906000526020600020905b81548152906001019060200180831161296c57829003601f168201915b5050505050905090565b606060008214156129db576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612aef565b600082905060005b60008214612a0d5780806129f69061420c565b915050600a82612a069190613ff8565b91506129e3565b60008167ffffffffffffffff811115612a2957612a2861439f565b5b6040519080825280601f01601f191660200182016040528015612a5b5781602001600182028036833780820191505090505b5090505b60008514612ae857600182612a749190614083565b9150600a85612a839190614283565b6030612a8f9190613fa2565b60f81b818381518110612aa557612aa4614370565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ae19190613ff8565b9450612a5f565b8093505050505b919050565b505050565b612b038383612ceb565b612b106000848484612b54565b612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4690613b72565b60405180910390fd5b505050565b6000612b758473ffffffffffffffffffffffffffffffffffffffff16612216565b15612cde578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b9e612229565b8786866040518563ffffffff1660e01b8152600401612bc09493929190613a49565b602060405180830381600087803b158015612bda57600080fd5b505af1925050508015612c0b57506040513d601f19601f82011682018060405250810190612c089190613326565b60015b612c8e573d8060008114612c3b576040519150601f19603f3d011682016040523d82523d6000602084013e612c40565b606091505b50600081511415612c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7d90613b72565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ce3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290613d32565b60405180910390fd5b612d648161229b565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b90613bb2565b60405180910390fd5b612db060008383612af4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e009190613fa2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ec5906141a9565b90600052602060002090601f016020900481019282612ee75760008555612f2e565b82601f10612f0057805160ff1916838001178555612f2e565b82800160010185558215612f2e579182015b82811115612f2d578251825591602001919060010190612f12565b5b509050612f3b9190612f3f565b5090565b5b80821115612f58576000816000905550600101612f40565b5090565b6000612f6f612f6a84613ef2565b613ecd565b905082815260208101848484011115612f8b57612f8a6143d3565b5b612f96848285614167565b509392505050565b6000612fb1612fac84613f23565b613ecd565b905082815260208101848484011115612fcd57612fcc6143d3565b5b612fd8848285614167565b509392505050565b600081359050612fef81614b45565b92915050565b60008135905061300481614b5c565b92915050565b60008135905061301981614b73565b92915050565b60008135905061302e81614b8a565b92915050565b60008151905061304381614b8a565b92915050565b600082601f83011261305e5761305d6143ce565b5b813561306e848260208601612f5c565b91505092915050565b600082601f83011261308c5761308b6143ce565b5b813561309c848260208601612f9e565b91505092915050565b6000813590506130b481614ba1565b92915050565b6000813590506130c981614bb8565b92915050565b6000602082840312156130e5576130e46143dd565b5b60006130f384828501612fe0565b91505092915050565b60008060408385031215613113576131126143dd565b5b600061312185828601612fe0565b925050602061313285828601612fe0565b9150509250929050565b600080600060608486031215613155576131546143dd565b5b600061316386828701612fe0565b935050602061317486828701612fe0565b9250506040613185868287016130a5565b9150509250925092565b600080600080608085870312156131a9576131a86143dd565b5b60006131b787828801612fe0565b94505060206131c887828801612fe0565b93505060406131d9878288016130a5565b925050606085013567ffffffffffffffff8111156131fa576131f96143d8565b5b61320687828801613049565b91505092959194509250565b60008060408385031215613229576132286143dd565b5b600061323785828601612fe0565b925050602061324885828601612ff5565b9150509250929050565b60008060408385031215613269576132686143dd565b5b600061327785828601612fe0565b9250506020613288858286016130a5565b9150509250929050565b600080600080608085870312156132ac576132ab6143dd565b5b60006132ba87828801612fe0565b94505060206132cb878288016130ba565b93505060406132dc8782880161300a565b92505060606132ed8782880161300a565b91505092959194509250565b60006020828403121561330f5761330e6143dd565b5b600061331d8482850161301f565b91505092915050565b60006020828403121561333c5761333b6143dd565b5b600061334a84828501613034565b91505092915050565b600060208284031215613369576133686143dd565b5b600082013567ffffffffffffffff811115613387576133866143d8565b5b61339384828501613077565b91505092915050565b6000602082840312156133b2576133b16143dd565b5b60006133c0848285016130a5565b91505092915050565b600080600080608085870312156133e3576133e26143dd565b5b60006133f1878288016130a5565b9450506020613402878288016130ba565b93505060406134138782880161300a565b92505060606134248782880161300a565b91505092959194509250565b613439816140b7565b82525050565b61345061344b826140b7565b614255565b82525050565b61345f816140c9565b82525050565b61346e816140d5565b82525050565b613485613480826140d5565b614267565b82525050565b600061349682613f54565b6134a08185613f6a565b93506134b0818560208601614176565b6134b9816143e2565b840191505092915050565b6134cd81614155565b82525050565b60006134de82613f5f565b6134e88185613f86565b93506134f8818560208601614176565b613501816143e2565b840191505092915050565b600061351782613f5f565b6135218185613f97565b9350613531818560208601614176565b80840191505092915050565b600061354a601583613f86565b915061355582614400565b602082019050919050565b600061356d601c83613f97565b915061357882614429565b601c82019050919050565b6000613590601c83613f86565b915061359b82614452565b602082019050919050565b60006135b3603283613f86565b91506135be8261447b565b604082019050919050565b60006135d6602683613f86565b91506135e1826144ca565b604082019050919050565b60006135f9601c83613f86565b915061360482614519565b602082019050919050565b600061361c601483613f86565b915061362782614542565b602082019050919050565b600061363f602483613f86565b915061364a8261456b565b604082019050919050565b6000613662601983613f86565b915061366d826145ba565b602082019050919050565b6000613685601e83613f86565b9150613690826145e3565b602082019050919050565b60006136a8602c83613f86565b91506136b38261460c565b604082019050919050565b60006136cb602e83613f86565b91506136d68261465b565b604082019050919050565b60006136ee603883613f86565b91506136f9826146aa565b604082019050919050565b6000613711602a83613f86565b915061371c826146f9565b604082019050919050565b6000613734602a83613f86565b915061373f82614748565b604082019050919050565b6000613757602983613f86565b915061376282614797565b604082019050919050565b600061377a601c83613f86565b9150613785826147e6565b602082019050919050565b600061379d602083613f86565b91506137a88261480f565b602082019050919050565b60006137c0602c83613f86565b91506137cb82614838565b604082019050919050565b60006137e3600583613f97565b91506137ee82614887565b600582019050919050565b6000613806601183613f86565b9150613811826148b0565b602082019050919050565b6000613829602083613f86565b9150613834826148d9565b602082019050919050565b600061384c602483613f86565b915061385782614902565b604082019050919050565b600061386f602983613f86565b915061387a82614951565b604082019050919050565b6000613892602f83613f86565b915061389d826149a0565b604082019050919050565b60006138b5603d83613f86565b91506138c0826149ef565b604082019050919050565b60006138d8602183613f86565b91506138e382614a3e565b604082019050919050565b60006138fb601b83613f86565b915061390682614a8d565b602082019050919050565b600061391e600083613f7b565b915061392982614ab6565b600082019050919050565b6000613941603183613f86565b915061394c82614ab9565b604082019050919050565b6000613964601583613f86565b915061396f82614b08565b602082019050919050565b6139838161413e565b82525050565b61399281614148565b82525050565b60006139a4828561343f565b6014820191506139b4828461343f565b6014820191508190509392505050565b60006139d0828561350c565b91506139dc828461350c565b91506139e7826137d6565b91508190509392505050565b60006139fe82613560565b9150613a0a8284613474565b60208201915081905092915050565b6000613a2482613911565b9150819050919050565b6000602082019050613a436000830184613430565b92915050565b6000608082019050613a5e6000830187613430565b613a6b6020830186613430565b613a78604083018561397a565b8181036060830152613a8a818461348b565b905095945050505050565b6000602082019050613aaa6000830184613456565b92915050565b6000608082019050613ac56000830187613465565b613ad26020830186613989565b613adf6040830185613465565b613aec6060830184613465565b95945050505050565b6000602082019050613b0a60008301846134c4565b92915050565b60006020820190508181036000830152613b2a81846134d3565b905092915050565b60006020820190508181036000830152613b4b8161353d565b9050919050565b60006020820190508181036000830152613b6b81613583565b9050919050565b60006020820190508181036000830152613b8b816135a6565b9050919050565b60006020820190508181036000830152613bab816135c9565b9050919050565b60006020820190508181036000830152613bcb816135ec565b9050919050565b60006020820190508181036000830152613beb8161360f565b9050919050565b60006020820190508181036000830152613c0b81613632565b9050919050565b60006020820190508181036000830152613c2b81613655565b9050919050565b60006020820190508181036000830152613c4b81613678565b9050919050565b60006020820190508181036000830152613c6b8161369b565b9050919050565b60006020820190508181036000830152613c8b816136be565b9050919050565b60006020820190508181036000830152613cab816136e1565b9050919050565b60006020820190508181036000830152613ccb81613704565b9050919050565b60006020820190508181036000830152613ceb81613727565b9050919050565b60006020820190508181036000830152613d0b8161374a565b9050919050565b60006020820190508181036000830152613d2b8161376d565b9050919050565b60006020820190508181036000830152613d4b81613790565b9050919050565b60006020820190508181036000830152613d6b816137b3565b9050919050565b60006020820190508181036000830152613d8b816137f9565b9050919050565b60006020820190508181036000830152613dab8161381c565b9050919050565b60006020820190508181036000830152613dcb8161383f565b9050919050565b60006020820190508181036000830152613deb81613862565b9050919050565b60006020820190508181036000830152613e0b81613885565b9050919050565b60006020820190508181036000830152613e2b816138a8565b9050919050565b60006020820190508181036000830152613e4b816138cb565b9050919050565b60006020820190508181036000830152613e6b816138ee565b9050919050565b60006020820190508181036000830152613e8b81613934565b9050919050565b60006020820190508181036000830152613eab81613957565b9050919050565b6000602082019050613ec7600083018461397a565b92915050565b6000613ed7613ee8565b9050613ee382826141db565b919050565b6000604051905090565b600067ffffffffffffffff821115613f0d57613f0c61439f565b5b613f16826143e2565b9050602081019050919050565b600067ffffffffffffffff821115613f3e57613f3d61439f565b5b613f47826143e2565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fad8261413e565b9150613fb88361413e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fed57613fec6142b4565b5b828201905092915050565b60006140038261413e565b915061400e8361413e565b92508261401e5761401d6142e3565b5b828204905092915050565b60006140348261413e565b915061403f8361413e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614078576140776142b4565b5b828202905092915050565b600061408e8261413e565b91506140998361413e565b9250828210156140ac576140ab6142b4565b5b828203905092915050565b60006140c28261411e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411982614b31565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006141608261410b565b9050919050565b82818337600083830152505050565b60005b83811015614194578082015181840152602081019050614179565b838111156141a3576000848401525b50505050565b600060028204905060018216806141c157607f821691505b602082108114156141d5576141d4614341565b5b50919050565b6141e4826143e2565b810181811067ffffffffffffffff821117156142035761420261439f565b5b80604052505050565b60006142178261413e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561424a576142496142b4565b5b600182019050919050565b600061426082614271565b9050919050565b6000819050919050565b600061427c826143f3565b9050919050565b600061428e8261413e565b91506142998361413e565b9250826142a9576142a86142e3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420457468657220746f206d696e7420746869732060008201527f616d6f756e74206f66204e465473000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178696d756d2032204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b60038110614b4257614b41614312565b5b50565b614b4e816140b7565b8114614b5957600080fd5b50565b614b65816140c9565b8114614b7057600080fd5b50565b614b7c816140d5565b8114614b8757600080fd5b50565b614b93816140df565b8114614b9e57600080fd5b50565b614baa8161413e565b8114614bb557600080fd5b50565b614bc181614148565b8114614bcc57600080fd5b5056fea2646970667358221220432bcac859ad1bc6a303c10221c07325ae88d006440a1a93dea98dedb04dec8164736f6c63430008070033

Deployed Bytecode Sourcemap

34778:8200:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36598:8;;;41449:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22891:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23842:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41122:94;;;;;;;;;;;;;:::i;:::-;;25159:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24682:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41608:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35988:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26049:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35640:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37815:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36825:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26459:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42293:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41766:287;;;;;;;;;;;;;:::i;:::-;;23536:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35848:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23266:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;42767:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24011:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25452:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42891:82;;;;;;;;;;;;;:::i;:::-;;41266:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39109:717;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26715:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36030:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42635:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36946:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39834:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35949:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38180:870;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25818:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40452:215;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40709:348;;;;;;;;;;;;;:::i;:::-;;41449:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41522:6:::1;41514:5;;:14;;;;;;;;;;;;;;;;;;41449:87:::0;:::o;22891:305::-;22993:4;23045:25;23030:40;;;:11;:40;;;;:105;;;;23102:33;23087:48;;;:11;:48;;;;23030:105;:158;;;;23152:36;23176:11;23152:23;:36::i;:::-;23030:158;23010:178;;22891:305;;;:::o;23842:100::-;23896:13;23929:5;23922:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23842:100;:::o;41122:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41189:19:::1;;41172:14;:36;;;;41122:94::o:0;25159:221::-;25235:7;25263:16;25271:7;25263;:16::i;:::-;25255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25348:15;:24;25364:7;25348:24;;;;;;;;;;;;;;;;;;;;;25341:31;;25159:221;;;:::o;24682:411::-;24763:13;24779:23;24794:7;24779:14;:23::i;:::-;24763:39;;24827:5;24821:11;;:2;:11;;;;24813:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24921:5;24905:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24930:37;24947:5;24954:12;:10;:12::i;:::-;24930:16;:37::i;:::-;24905:62;24883:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25064:21;25073:2;25077:7;25064:8;:21::i;:::-;24752:341;24682:411;;:::o;41608:94::-;41651:4;41675:19;;41668:26;;41608:94;:::o;35988:35::-;;;;:::o;26049:339::-;26244:41;26263:12;:10;:12::i;:::-;26277:7;26244:18;:41::i;:::-;26236:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26352:28;26362:4;26368:2;26372:7;26352:9;:28::i;:::-;26049:339;;;:::o;35640:50::-;;;;;;;;;;;;;;;;;:::o;37815:306::-;37914:4;37931:12;37981:4;37988;37956:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37946:48;;;;;;37931:63;;38021:92;38094:4;38041:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;38031:69;;;;;;38102:2;38106;38110;38021:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38012:101;;:5;;;;;;;;;;;:101;;;38005:108;;;37815:306;;;;;;:::o;36825:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36918:8:::1;36900:15;:26;;;;;;;;;;;;:::i;:::-;;36825:109:::0;:::o;26459:185::-;26597:39;26614:4;26620:2;26624:7;26597:39;;;;;;;;;;;;:16;:39::i;:::-;26459:185;;;:::o;42293:297::-;42334:5;42376:1;42355:17;;:22;42351:232;;;42401:12;42394:19;;;;42351:232;42468:1;42444:20;;:25;42440:143;;;42493:13;42486:20;;;;42440:143;42555:16;42548:23;;42293:297;;:::o;41766:287::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41819:15:::1;41837:16;:14;:16::i;:::-;41819:34;;41882:1;41872:7;:11;41864:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;41922:34;41932:3;;;;;;;;;;;41951:4;41948:1;41938:7;:11;;;;:::i;:::-;41937:18;;;;:::i;:::-;41922:9;:34::i;:::-;41967:48;41985:10;41998:16;:14;:16::i;:::-;41967:9;:48::i;:::-;41808:245;41766:287::o:0;23536:239::-;23608:7;23628:13;23644:7;:16;23652:7;23644:16;;;;;;;;;;;;;;;;;;;;;23628:32;;23696:1;23679:19;;:5;:19;;;;23671:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23762:5;23755:12;;;23536:239;;;:::o;35848:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23266:208::-;23338:7;23383:1;23366:19;;:5;:19;;;;23358:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23450:9;:16;23460:5;23450:16;;;;;;;;;;;;;;;;23443:23;;23266:208;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;42767:93::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42845:7:::1;42833:9;:19;;;;42767:93:::0;:::o;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;24011:104::-;24067:13;24100:7;24093:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24011:104;:::o;25452:295::-;25567:12;:10;:12::i;:::-;25555:24;;:8;:24;;;;25547:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25667:8;25622:18;:32;25641:12;:10;:12::i;:::-;25622:32;;;;;;;;;;;;;;;:42;25655:8;25622:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25720:8;25691:48;;25706:12;:10;:12::i;:::-;25691:48;;;25730:8;25691:48;;;;;;:::i;:::-;;;;;;;;25452:295;;:::o;42891:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42950:15:::1;42937:10;:28;;;;42891:82::o:0;41266:109::-;41322:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41346:21:::1;41339:28;;41266:109:::0;:::o;39109:717::-;39175:16;39194:11;:9;:11::i;:::-;39175:30;;39238:16;39224:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;39216:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39338:14;;39328:6;39306:19;;:28;;;;:::i;:::-;:46;;39298:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;39446:1;39436:6;39406:15;:27;39422:10;39406:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;39398:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;39533:6;39520:10;:8;:10::i;:::-;:19;;;;:::i;:::-;39507:9;:32;;39499:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;39610:9;39605:214;39629:6;39625:1;:10;39605:214;;;39657:11;39671:9;:7;:9::i;:::-;39657:23;;39695:26;39705:10;39717:3;39695:9;:26::i;:::-;39767:1;39736:15;:27;39752:10;39736:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;39806:1;39783:19;;:24;;;;;;;:::i;:::-;;;;;;;;39642:177;39637:3;;;;;:::i;:::-;;;;39605:214;;;;39164:662;39109:717;:::o;26715:328::-;26890:41;26909:12;:10;:12::i;:::-;26923:7;26890:18;:41::i;:::-;26882:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26996:39;27010:4;27016:2;27020:7;27029:5;26996:13;:39::i;:::-;26715:328;;;;:::o;36030:25::-;;;;:::o;42635:84::-;42675:7;42702:9;;42695:16;;42635:84;:::o;36946:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37049:14:::1;37033:13;:30;;;;;;;;;;;;:::i;:::-;;36946:125:::0;:::o;39834:568::-;39908:13;39942:17;39950:8;39942:7;:17::i;:::-;39934:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40137:1;40123:10;;:15;40119:272;;;40162:13;40155:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40119:272;40227:21;40251:10;:8;:10::i;:::-;40227:34;;40307:1;40289:7;40283:21;:25;:96;;;;;;;;;;;;;;;;;40335:7;40344:19;:8;:17;:19::i;:::-;40318:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40283:96;40276:103;;;39834:568;;;;:::o;35949:32::-;;;;:::o;38180:870::-;38267:2;38272;38276;37317:41;37338:10;37349:2;37352;37355;37317:20;:41::i;:::-;37308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38306:16:::1;38325:11;:9;:11::i;:::-;38306:30;;38369:12;38355:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;38347:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38440:16;38426:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;38418:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38554:14;;38544:6;38522:19;;:28;;;;:::i;:::-;:46;;38514:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;38662:1;38652:6;38622:15;:27;38638:10;38622:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;38614:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;38749:6;38736:10;:8;:10::i;:::-;:19;;;;:::i;:::-;38723:9;:32;;38715:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;38832:9;38827:214;38851:6;38847:1;:10;38827:214;;;38879:11;38893:9;:7;:9::i;:::-;38879:23;;38917:26;38927:10;38939:3;38917:9;:26::i;:::-;38989:1;38958:15;:27;38974:10;38958:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;39028:1;39005:19;;:24;;;;;;;:::i;:::-;;;;;;;;38864:177;38859:3;;;;;:::i;:::-;;;;38827:214;;;;38295:755;38180:870:::0;;;;;;;:::o;25818:164::-;25915:4;25939:18;:25;25958:5;25939:25;;;;;;;;;;;;;;;:35;25965:8;25939:35;;;;;;;;;;;;;;;;;;;;;;;;;25932:42;;25818:164;;;;:::o;40452:215::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40506:16:::1;40525:11;:9;:11::i;:::-;40506:30;;40569:12;40555:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;40547:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40644:15;40624:17;:35;;;;40495:172;40452:215::o:0;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;40709:348::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40767:16:::1;40786:11;:9;:11::i;:::-;40767:30;;40830:16;40816:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;40808:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40912:12;40898:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;40890:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41034:15;41011:20;:38;;;;40756:301;40709:348::o:0;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;28553:127::-;28618:4;28670:1;28642:30;;:7;:16;28650:7;28642:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28635:37;;28553:127;;;:::o;32535:174::-;32637:2;32610:15;:24;32626:7;32610:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32693:7;32689:2;32655:46;;32664:23;32679:7;32664:14;:23::i;:::-;32655:46;;;;;;;;;;;;32535:174;;:::o;28847:348::-;28940:4;28965:16;28973:7;28965;:16::i;:::-;28957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29041:13;29057:23;29072:7;29057:14;:23::i;:::-;29041:39;;29110:5;29099:16;;:7;:16;;;:51;;;;29143:7;29119:31;;:20;29131:7;29119:11;:20::i;:::-;:31;;;29099:51;:87;;;;29154:32;29171:5;29178:7;29154:16;:32::i;:::-;29099:87;29091:96;;;28847:348;;;;:::o;31839:578::-;31998:4;31971:31;;:23;31986:7;31971:14;:23::i;:::-;:31;;;31963:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32081:1;32067:16;;:2;:16;;;;32059:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32137:39;32158:4;32164:2;32168:7;32137:20;:39::i;:::-;32241:29;32258:1;32262:7;32241:8;:29::i;:::-;32302:1;32283:9;:15;32293:4;32283:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32331:1;32314:9;:13;32324:2;32314:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32362:2;32343:7;:16;32351:7;32343:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32401:7;32397:2;32382:27;;32391:4;32382:27;;;;;;;;;;;;31839:578;;;:::o;42061:183::-;42142:9;42157:7;:12;;42177:6;42157:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42141:47;;;42207:4;42199:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;42130:114;42061:183;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;37127:99::-;37168:7;37217:1;37195:19;;:23;;;;:::i;:::-;37188:30;;37127:99;:::o;29537:110::-;29613:26;29623:2;29627:7;29613:26;;;;;;;;;;;;:9;:26::i;:::-;29537:110;;:::o;27925:315::-;28082:28;28092:4;28098:2;28102:7;28082:9;:28::i;:::-;28129:48;28152:4;28158:2;28162:7;28171:5;28129:22;:48::i;:::-;28121:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27925:315;;;;:::o;36651:116::-;36711:13;36744:15;36737:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36651:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;34645:126::-;;;;:::o;29874:321::-;30004:18;30010:2;30014:7;30004:5;:18::i;:::-;30055:54;30086:1;30090:2;30094:7;30103:5;30055:22;:54::i;:::-;30033:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29874:321;;;:::o;33274:799::-;33429:4;33450:15;:2;:13;;;:15::i;:::-;33446:620;;;33502:2;33486:36;;;33523:12;:10;:12::i;:::-;33537:4;33543:7;33552:5;33486:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33482:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33745:1;33728:6;:13;:18;33724:272;;;33771:60;;;;;;;;;;:::i;:::-;;;;;;;;33724:272;33946:6;33940:13;33931:6;33927:2;33923:15;33916:38;33482:529;33619:41;;;33609:51;;;:6;:51;;;;33602:58;;;;;33446:620;34050:4;34043:11;;33274:799;;;;;;;:::o;30531:382::-;30625:1;30611:16;;:2;:16;;;;30603:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30684:16;30692:7;30684;:16::i;:::-;30683:17;30675:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30746:45;30775:1;30779:2;30783:7;30746:20;:45::i;:::-;30821:1;30804:9;:13;30814:2;30804:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30852:2;30833:7;:16;30841:7;30833:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30897:7;30893:2;30872:33;;30889:1;30872:33;;;;;;;;;;;;30531:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:761::-;8295:6;8303;8311;8319;8368:3;8356:9;8347:7;8343:23;8339:33;8336:120;;;8375:79;;:::i;:::-;8336:120;8495:1;8520:53;8565:7;8556:6;8545:9;8541:22;8520:53;:::i;:::-;8510:63;;8466:117;8622:2;8648:51;8691:7;8682:6;8671:9;8667:22;8648:51;:::i;:::-;8638:61;;8593:116;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8211:761;;;;;;;:::o;8978:118::-;9065:24;9083:5;9065:24;:::i;:::-;9060:3;9053:37;8978:118;;:::o;9102:157::-;9207:45;9227:24;9245:5;9227:24;:::i;:::-;9207:45;:::i;:::-;9202:3;9195:58;9102:157;;:::o;9265:109::-;9346:21;9361:5;9346:21;:::i;:::-;9341:3;9334:34;9265:109;;:::o;9380:118::-;9467:24;9485:5;9467:24;:::i;:::-;9462:3;9455:37;9380:118;;:::o;9504:157::-;9609:45;9629:24;9647:5;9629:24;:::i;:::-;9609:45;:::i;:::-;9604:3;9597:58;9504:157;;:::o;9667:360::-;9753:3;9781:38;9813:5;9781:38;:::i;:::-;9835:70;9898:6;9893:3;9835:70;:::i;:::-;9828:77;;9914:52;9959:6;9954:3;9947:4;9940:5;9936:16;9914:52;:::i;:::-;9991:29;10013:6;9991:29;:::i;:::-;9986:3;9982:39;9975:46;;9757:270;9667:360;;;;:::o;10033:147::-;10128:45;10167:5;10128:45;:::i;:::-;10123:3;10116:58;10033:147;;:::o;10186:364::-;10274:3;10302:39;10335:5;10302:39;:::i;:::-;10357:71;10421:6;10416:3;10357:71;:::i;:::-;10350:78;;10437:52;10482:6;10477:3;10470:4;10463:5;10459:16;10437:52;:::i;:::-;10514:29;10536:6;10514:29;:::i;:::-;10509:3;10505:39;10498:46;;10278:272;10186:364;;;;:::o;10556:377::-;10662:3;10690:39;10723:5;10690:39;:::i;:::-;10745:89;10827:6;10822:3;10745:89;:::i;:::-;10738:96;;10843:52;10888:6;10883:3;10876:4;10869:5;10865:16;10843:52;:::i;:::-;10920:6;10915:3;10911:16;10904:23;;10666:267;10556:377;;;;:::o;10939:366::-;11081:3;11102:67;11166:2;11161:3;11102:67;:::i;:::-;11095:74;;11178:93;11267:3;11178:93;:::i;:::-;11296:2;11291:3;11287:12;11280:19;;10939:366;;;:::o;11311:402::-;11471:3;11492:85;11574:2;11569:3;11492:85;:::i;:::-;11485:92;;11586:93;11675:3;11586:93;:::i;:::-;11704:2;11699:3;11695:12;11688:19;;11311:402;;;:::o;11719:366::-;11861:3;11882:67;11946:2;11941:3;11882:67;:::i;:::-;11875:74;;11958:93;12047:3;11958:93;:::i;:::-;12076:2;12071:3;12067:12;12060:19;;11719:366;;;:::o;12091:::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:400::-;18203:3;18224:84;18306:1;18301:3;18224:84;:::i;:::-;18217:91;;18317:93;18406:3;18317:93;:::i;:::-;18435:1;18430:3;18426:11;18419:18;;18043:400;;;:::o;18449:366::-;18591:3;18612:67;18676:2;18671:3;18612:67;:::i;:::-;18605:74;;18688:93;18777:3;18688:93;:::i;:::-;18806:2;18801:3;18797:12;18790:19;;18449:366;;;:::o;18821:::-;18963:3;18984:67;19048:2;19043:3;18984:67;:::i;:::-;18977:74;;19060:93;19149:3;19060:93;:::i;:::-;19178:2;19173:3;19169:12;19162:19;;18821:366;;;:::o;19193:::-;19335:3;19356:67;19420:2;19415:3;19356:67;:::i;:::-;19349:74;;19432:93;19521:3;19432:93;:::i;:::-;19550:2;19545:3;19541:12;19534:19;;19193:366;;;:::o;19565:::-;19707:3;19728:67;19792:2;19787:3;19728:67;:::i;:::-;19721:74;;19804:93;19893:3;19804:93;:::i;:::-;19922:2;19917:3;19913:12;19906:19;;19565:366;;;:::o;19937:::-;20079:3;20100:67;20164:2;20159:3;20100:67;:::i;:::-;20093:74;;20176:93;20265:3;20176:93;:::i;:::-;20294:2;20289:3;20285:12;20278:19;;19937:366;;;:::o;20309:::-;20451:3;20472:67;20536:2;20531:3;20472:67;:::i;:::-;20465:74;;20548:93;20637:3;20548:93;:::i;:::-;20666:2;20661:3;20657:12;20650:19;;20309:366;;;:::o;20681:::-;20823:3;20844:67;20908:2;20903:3;20844:67;:::i;:::-;20837:74;;20920:93;21009:3;20920:93;:::i;:::-;21038:2;21033:3;21029:12;21022:19;;20681:366;;;:::o;21053:::-;21195:3;21216:67;21280:2;21275:3;21216:67;:::i;:::-;21209:74;;21292:93;21381:3;21292:93;:::i;:::-;21410:2;21405:3;21401:12;21394:19;;21053:366;;;:::o;21425:398::-;21584:3;21605:83;21686:1;21681:3;21605:83;:::i;:::-;21598:90;;21697:93;21786:3;21697:93;:::i;:::-;21815:1;21810:3;21806:11;21799:18;;21425:398;;;:::o;21829:366::-;21971:3;21992:67;22056:2;22051:3;21992:67;:::i;:::-;21985:74;;22068:93;22157:3;22068:93;:::i;:::-;22186:2;22181:3;22177:12;22170:19;;21829:366;;;:::o;22201:::-;22343:3;22364:67;22428:2;22423:3;22364:67;:::i;:::-;22357:74;;22440:93;22529:3;22440:93;:::i;:::-;22558:2;22553:3;22549:12;22542:19;;22201:366;;;:::o;22573:118::-;22660:24;22678:5;22660:24;:::i;:::-;22655:3;22648:37;22573:118;;:::o;22697:112::-;22780:22;22796:5;22780:22;:::i;:::-;22775:3;22768:35;22697:112;;:::o;22815:397::-;22955:3;22970:75;23041:3;23032:6;22970:75;:::i;:::-;23070:2;23065:3;23061:12;23054:19;;23083:75;23154:3;23145:6;23083:75;:::i;:::-;23183:2;23178:3;23174:12;23167:19;;23203:3;23196:10;;22815:397;;;;;:::o;23218:701::-;23499:3;23521:95;23612:3;23603:6;23521:95;:::i;:::-;23514:102;;23633:95;23724:3;23715:6;23633:95;:::i;:::-;23626:102;;23745:148;23889:3;23745:148;:::i;:::-;23738:155;;23910:3;23903:10;;23218:701;;;;;:::o;23925:522::-;24138:3;24160:148;24304:3;24160:148;:::i;:::-;24153:155;;24318:75;24389:3;24380:6;24318:75;:::i;:::-;24418:2;24413:3;24409:12;24402:19;;24438:3;24431:10;;23925:522;;;;:::o;24453:379::-;24637:3;24659:147;24802:3;24659:147;:::i;:::-;24652:154;;24823:3;24816:10;;24453:379;;;:::o;24838:222::-;24931:4;24969:2;24958:9;24954:18;24946:26;;24982:71;25050:1;25039:9;25035:17;25026:6;24982:71;:::i;:::-;24838:222;;;;:::o;25066:640::-;25261:4;25299:3;25288:9;25284:19;25276:27;;25313:71;25381:1;25370:9;25366:17;25357:6;25313:71;:::i;:::-;25394:72;25462:2;25451:9;25447:18;25438:6;25394:72;:::i;:::-;25476;25544:2;25533:9;25529:18;25520:6;25476:72;:::i;:::-;25595:9;25589:4;25585:20;25580:2;25569:9;25565:18;25558:48;25623:76;25694:4;25685:6;25623:76;:::i;:::-;25615:84;;25066:640;;;;;;;:::o;25712:210::-;25799:4;25837:2;25826:9;25822:18;25814:26;;25850:65;25912:1;25901:9;25897:17;25888:6;25850:65;:::i;:::-;25712:210;;;;:::o;25928:545::-;26101:4;26139:3;26128:9;26124:19;26116:27;;26153:71;26221:1;26210:9;26206:17;26197:6;26153:71;:::i;:::-;26234:68;26298:2;26287:9;26283:18;26274:6;26234:68;:::i;:::-;26312:72;26380:2;26369:9;26365:18;26356:6;26312:72;:::i;:::-;26394;26462:2;26451:9;26447:18;26438:6;26394:72;:::i;:::-;25928:545;;;;;;;:::o;26479:238::-;26580:4;26618:2;26607:9;26603:18;26595:26;;26631:79;26707:1;26696:9;26692:17;26683:6;26631:79;:::i;:::-;26479:238;;;;:::o;26723:313::-;26836:4;26874:2;26863:9;26859:18;26851:26;;26923:9;26917:4;26913:20;26909:1;26898:9;26894:17;26887:47;26951:78;27024:4;27015:6;26951:78;:::i;:::-;26943:86;;26723:313;;;;:::o;27042:419::-;27208:4;27246:2;27235:9;27231:18;27223:26;;27295:9;27289:4;27285:20;27281:1;27270:9;27266:17;27259:47;27323:131;27449:4;27323:131;:::i;:::-;27315:139;;27042:419;;;:::o;27467:::-;27633:4;27671:2;27660:9;27656:18;27648:26;;27720:9;27714:4;27710:20;27706:1;27695:9;27691:17;27684:47;27748:131;27874:4;27748:131;:::i;:::-;27740:139;;27467:419;;;:::o;27892:::-;28058:4;28096:2;28085:9;28081:18;28073:26;;28145:9;28139:4;28135:20;28131:1;28120:9;28116:17;28109:47;28173:131;28299:4;28173:131;:::i;:::-;28165:139;;27892:419;;;:::o;28317:::-;28483:4;28521:2;28510:9;28506:18;28498:26;;28570:9;28564:4;28560:20;28556:1;28545:9;28541:17;28534:47;28598:131;28724:4;28598:131;:::i;:::-;28590:139;;28317:419;;;:::o;28742:::-;28908:4;28946:2;28935:9;28931:18;28923:26;;28995:9;28989:4;28985:20;28981:1;28970:9;28966:17;28959:47;29023:131;29149:4;29023:131;:::i;:::-;29015:139;;28742:419;;;:::o;29167:::-;29333:4;29371:2;29360:9;29356:18;29348:26;;29420:9;29414:4;29410:20;29406:1;29395:9;29391:17;29384:47;29448:131;29574:4;29448:131;:::i;:::-;29440:139;;29167:419;;;:::o;29592:::-;29758:4;29796:2;29785:9;29781:18;29773:26;;29845:9;29839:4;29835:20;29831:1;29820:9;29816:17;29809:47;29873:131;29999:4;29873:131;:::i;:::-;29865:139;;29592:419;;;:::o;30017:::-;30183:4;30221:2;30210:9;30206:18;30198:26;;30270:9;30264:4;30260:20;30256:1;30245:9;30241:17;30234:47;30298:131;30424:4;30298:131;:::i;:::-;30290:139;;30017:419;;;:::o;30442:::-;30608:4;30646:2;30635:9;30631:18;30623:26;;30695:9;30689:4;30685:20;30681:1;30670:9;30666:17;30659:47;30723:131;30849:4;30723:131;:::i;:::-;30715:139;;30442:419;;;:::o;30867:::-;31033:4;31071:2;31060:9;31056:18;31048:26;;31120:9;31114:4;31110:20;31106:1;31095:9;31091:17;31084:47;31148:131;31274:4;31148:131;:::i;:::-;31140:139;;30867:419;;;:::o;31292:::-;31458:4;31496:2;31485:9;31481:18;31473:26;;31545:9;31539:4;31535:20;31531:1;31520:9;31516:17;31509:47;31573:131;31699:4;31573:131;:::i;:::-;31565:139;;31292:419;;;:::o;31717:::-;31883:4;31921:2;31910:9;31906:18;31898:26;;31970:9;31964:4;31960:20;31956:1;31945:9;31941:17;31934:47;31998:131;32124:4;31998:131;:::i;:::-;31990:139;;31717:419;;;:::o;32142:::-;32308:4;32346:2;32335:9;32331:18;32323:26;;32395:9;32389:4;32385:20;32381:1;32370:9;32366:17;32359:47;32423:131;32549:4;32423:131;:::i;:::-;32415:139;;32142:419;;;:::o;32567:::-;32733:4;32771:2;32760:9;32756:18;32748:26;;32820:9;32814:4;32810:20;32806:1;32795:9;32791:17;32784:47;32848:131;32974:4;32848:131;:::i;:::-;32840:139;;32567:419;;;:::o;32992:::-;33158:4;33196:2;33185:9;33181:18;33173:26;;33245:9;33239:4;33235:20;33231:1;33220:9;33216:17;33209:47;33273:131;33399:4;33273:131;:::i;:::-;33265:139;;32992:419;;;:::o;33417:::-;33583:4;33621:2;33610:9;33606:18;33598:26;;33670:9;33664:4;33660:20;33656:1;33645:9;33641:17;33634:47;33698:131;33824:4;33698:131;:::i;:::-;33690:139;;33417:419;;;:::o;33842:::-;34008:4;34046:2;34035:9;34031:18;34023:26;;34095:9;34089:4;34085:20;34081:1;34070:9;34066:17;34059:47;34123:131;34249:4;34123:131;:::i;:::-;34115:139;;33842:419;;;:::o;34267:::-;34433:4;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34267:419;;;:::o;34692:::-;34858:4;34896:2;34885:9;34881:18;34873:26;;34945:9;34939:4;34935:20;34931:1;34920:9;34916:17;34909:47;34973:131;35099:4;34973:131;:::i;:::-;34965:139;;34692:419;;;:::o;35117:::-;35283:4;35321:2;35310:9;35306:18;35298:26;;35370:9;35364:4;35360:20;35356:1;35345:9;35341:17;35334:47;35398:131;35524:4;35398:131;:::i;:::-;35390:139;;35117:419;;;:::o;35542:::-;35708:4;35746:2;35735:9;35731:18;35723:26;;35795:9;35789:4;35785:20;35781:1;35770:9;35766:17;35759:47;35823:131;35949:4;35823:131;:::i;:::-;35815:139;;35542:419;;;:::o;35967:::-;36133:4;36171:2;36160:9;36156:18;36148:26;;36220:9;36214:4;36210:20;36206:1;36195:9;36191:17;36184:47;36248:131;36374:4;36248:131;:::i;:::-;36240:139;;35967:419;;;:::o;36392:::-;36558:4;36596:2;36585:9;36581:18;36573:26;;36645:9;36639:4;36635:20;36631:1;36620:9;36616:17;36609:47;36673:131;36799:4;36673:131;:::i;:::-;36665:139;;36392:419;;;:::o;36817:::-;36983:4;37021:2;37010:9;37006:18;36998:26;;37070:9;37064:4;37060:20;37056:1;37045:9;37041:17;37034:47;37098:131;37224:4;37098:131;:::i;:::-;37090:139;;36817:419;;;:::o;37242:::-;37408:4;37446:2;37435:9;37431:18;37423:26;;37495:9;37489:4;37485:20;37481:1;37470:9;37466:17;37459:47;37523:131;37649:4;37523:131;:::i;:::-;37515:139;;37242:419;;;:::o;37667:::-;37833:4;37871:2;37860:9;37856:18;37848:26;;37920:9;37914:4;37910:20;37906:1;37895:9;37891:17;37884:47;37948:131;38074:4;37948:131;:::i;:::-;37940:139;;37667:419;;;:::o;38092:::-;38258:4;38296:2;38285:9;38281:18;38273:26;;38345:9;38339:4;38335:20;38331:1;38320:9;38316:17;38309:47;38373:131;38499:4;38373:131;:::i;:::-;38365:139;;38092:419;;;:::o;38517:::-;38683:4;38721:2;38710:9;38706:18;38698:26;;38770:9;38764:4;38760:20;38756:1;38745:9;38741:17;38734:47;38798:131;38924:4;38798:131;:::i;:::-;38790:139;;38517:419;;;:::o;38942:222::-;39035:4;39073:2;39062:9;39058:18;39050:26;;39086:71;39154:1;39143:9;39139:17;39130:6;39086:71;:::i;:::-;38942:222;;;;:::o;39170:129::-;39204:6;39231:20;;:::i;:::-;39221:30;;39260:33;39288:4;39280:6;39260:33;:::i;:::-;39170:129;;;:::o;39305:75::-;39338:6;39371:2;39365:9;39355:19;;39305:75;:::o;39386:307::-;39447:4;39537:18;39529:6;39526:30;39523:56;;;39559:18;;:::i;:::-;39523:56;39597:29;39619:6;39597:29;:::i;:::-;39589:37;;39681:4;39675;39671:15;39663:23;;39386:307;;;:::o;39699:308::-;39761:4;39851:18;39843:6;39840:30;39837:56;;;39873:18;;:::i;:::-;39837:56;39911:29;39933:6;39911:29;:::i;:::-;39903:37;;39995:4;39989;39985:15;39977:23;;39699:308;;;:::o;40013:98::-;40064:6;40098:5;40092:12;40082:22;;40013:98;;;:::o;40117:99::-;40169:6;40203:5;40197:12;40187:22;;40117:99;;;:::o;40222:168::-;40305:11;40339:6;40334:3;40327:19;40379:4;40374:3;40370:14;40355:29;;40222:168;;;;:::o;40396:147::-;40497:11;40534:3;40519:18;;40396:147;;;;:::o;40549:169::-;40633:11;40667:6;40662:3;40655:19;40707:4;40702:3;40698:14;40683:29;;40549:169;;;;:::o;40724:148::-;40826:11;40863:3;40848:18;;40724:148;;;;:::o;40878:305::-;40918:3;40937:20;40955:1;40937:20;:::i;:::-;40932:25;;40971:20;40989:1;40971:20;:::i;:::-;40966:25;;41125:1;41057:66;41053:74;41050:1;41047:81;41044:107;;;41131:18;;:::i;:::-;41044:107;41175:1;41172;41168:9;41161:16;;40878:305;;;;:::o;41189:185::-;41229:1;41246:20;41264:1;41246:20;:::i;:::-;41241:25;;41280:20;41298:1;41280:20;:::i;:::-;41275:25;;41319:1;41309:35;;41324:18;;:::i;:::-;41309:35;41366:1;41363;41359:9;41354:14;;41189:185;;;;:::o;41380:348::-;41420:7;41443:20;41461:1;41443:20;:::i;:::-;41438:25;;41477:20;41495:1;41477:20;:::i;:::-;41472:25;;41665:1;41597:66;41593:74;41590:1;41587:81;41582:1;41575:9;41568:17;41564:105;41561:131;;;41672:18;;:::i;:::-;41561:131;41720:1;41717;41713:9;41702:20;;41380:348;;;;:::o;41734:191::-;41774:4;41794:20;41812:1;41794:20;:::i;:::-;41789:25;;41828:20;41846:1;41828:20;:::i;:::-;41823:25;;41867:1;41864;41861:8;41858:34;;;41872:18;;:::i;:::-;41858:34;41917:1;41914;41910:9;41902:17;;41734:191;;;;:::o;41931:96::-;41968:7;41997:24;42015:5;41997:24;:::i;:::-;41986:35;;41931:96;;;:::o;42033:90::-;42067:7;42110:5;42103:13;42096:21;42085:32;;42033:90;;;:::o;42129:77::-;42166:7;42195:5;42184:16;;42129:77;;;:::o;42212:149::-;42248:7;42288:66;42281:5;42277:78;42266:89;;42212:149;;;:::o;42367:131::-;42414:7;42443:5;42432:16;;42449:43;42486:5;42449:43;:::i;:::-;42367:131;;;:::o;42504:126::-;42541:7;42581:42;42574:5;42570:54;42559:65;;42504:126;;;:::o;42636:77::-;42673:7;42702:5;42691:16;;42636:77;;;:::o;42719:86::-;42754:7;42794:4;42787:5;42783:16;42772:27;;42719:86;;;:::o;42811:131::-;42869:9;42902:34;42930:5;42902:34;:::i;:::-;42889:47;;42811:131;;;:::o;42948:154::-;43032:6;43027:3;43022;43009:30;43094:1;43085:6;43080:3;43076:16;43069:27;42948:154;;;:::o;43108:307::-;43176:1;43186:113;43200:6;43197:1;43194:13;43186:113;;;43285:1;43280:3;43276:11;43270:18;43266:1;43261:3;43257:11;43250:39;43222:2;43219:1;43215:10;43210:15;;43186:113;;;43317:6;43314:1;43311:13;43308:101;;;43397:1;43388:6;43383:3;43379:16;43372:27;43308:101;43157:258;43108:307;;;:::o;43421:320::-;43465:6;43502:1;43496:4;43492:12;43482:22;;43549:1;43543:4;43539:12;43570:18;43560:81;;43626:4;43618:6;43614:17;43604:27;;43560:81;43688:2;43680:6;43677:14;43657:18;43654:38;43651:84;;;43707:18;;:::i;:::-;43651:84;43472:269;43421:320;;;:::o;43747:281::-;43830:27;43852:4;43830:27;:::i;:::-;43822:6;43818:40;43960:6;43948:10;43945:22;43924:18;43912:10;43909:34;43906:62;43903:88;;;43971:18;;:::i;:::-;43903:88;44011:10;44007:2;44000:22;43790:238;43747:281;;:::o;44034:233::-;44073:3;44096:24;44114:5;44096:24;:::i;:::-;44087:33;;44142:66;44135:5;44132:77;44129:103;;;44212:18;;:::i;:::-;44129:103;44259:1;44252:5;44248:13;44241:20;;44034:233;;;:::o;44273:100::-;44312:7;44341:26;44361:5;44341:26;:::i;:::-;44330:37;;44273:100;;;:::o;44379:79::-;44418:7;44447:5;44436:16;;44379:79;;;:::o;44464:94::-;44503:7;44532:20;44546:5;44532:20;:::i;:::-;44521:31;;44464:94;;;:::o;44564:176::-;44596:1;44613:20;44631:1;44613:20;:::i;:::-;44608:25;;44647:20;44665:1;44647:20;:::i;:::-;44642:25;;44686:1;44676:35;;44691:18;;:::i;:::-;44676:35;44732:1;44729;44725:9;44720:14;;44564:176;;;;:::o;44746:180::-;44794:77;44791:1;44784:88;44891:4;44888:1;44881:15;44915:4;44912:1;44905:15;44932:180;44980:77;44977:1;44970:88;45077:4;45074:1;45067:15;45101:4;45098:1;45091:15;45118:180;45166:77;45163:1;45156:88;45263:4;45260:1;45253:15;45287:4;45284:1;45277:15;45304:180;45352:77;45349:1;45342:88;45449:4;45446:1;45439:15;45473:4;45470:1;45463:15;45490:180;45538:77;45535:1;45528:88;45635:4;45632:1;45625:15;45659:4;45656:1;45649:15;45676:180;45724:77;45721:1;45714:88;45821:4;45818:1;45811:15;45845:4;45842:1;45835:15;45862:117;45971:1;45968;45961:12;45985:117;46094:1;46091;46084:12;46108:117;46217:1;46214;46207:12;46231:117;46340:1;46337;46330:12;46354:102;46395:6;46446:2;46442:7;46437:2;46430:5;46426:14;46422:28;46412:38;;46354:102;;;:::o;46462:94::-;46495:8;46543:5;46539:2;46535:14;46514:35;;46462:94;;;:::o;46562:171::-;46702:23;46698:1;46690:6;46686:14;46679:47;46562:171;:::o;46739:214::-;46879:66;46875:1;46867:6;46863:14;46856:90;46739:214;:::o;46959:178::-;47099:30;47095:1;47087:6;47083:14;47076:54;46959:178;:::o;47143:237::-;47283:34;47279:1;47271:6;47267:14;47260:58;47352:20;47347:2;47339:6;47335:15;47328:45;47143:237;:::o;47386:225::-;47526:34;47522:1;47514:6;47510:14;47503:58;47595:8;47590:2;47582:6;47578:15;47571:33;47386:225;:::o;47617:178::-;47757:30;47753:1;47745:6;47741:14;47734:54;47617:178;:::o;47801:170::-;47941:22;47937:1;47929:6;47925:14;47918:46;47801:170;:::o;47977:223::-;48117:34;48113:1;48105:6;48101:14;48094:58;48186:6;48181:2;48173:6;48169:15;48162:31;47977:223;:::o;48206:175::-;48346:27;48342:1;48334:6;48330:14;48323:51;48206:175;:::o;48387:180::-;48527:32;48523:1;48515:6;48511:14;48504:56;48387:180;:::o;48573:231::-;48713:34;48709:1;48701:6;48697:14;48690:58;48782:14;48777:2;48769:6;48765:15;48758:39;48573:231;:::o;48810:233::-;48950:34;48946:1;48938:6;48934:14;48927:58;49019:16;49014:2;49006:6;49002:15;48995:41;48810:233;:::o;49049:243::-;49189:34;49185:1;49177:6;49173:14;49166:58;49258:26;49253:2;49245:6;49241:15;49234:51;49049:243;:::o;49298:229::-;49438:34;49434:1;49426:6;49422:14;49415:58;49507:12;49502:2;49494:6;49490:15;49483:37;49298:229;:::o;49533:::-;49673:34;49669:1;49661:6;49657:14;49650:58;49742:12;49737:2;49729:6;49725:15;49718:37;49533:229;:::o;49768:228::-;49908:34;49904:1;49896:6;49892:14;49885:58;49977:11;49972:2;49964:6;49960:15;49953:36;49768:228;:::o;50002:178::-;50142:30;50138:1;50130:6;50126:14;50119:54;50002:178;:::o;50186:182::-;50326:34;50322:1;50314:6;50310:14;50303:58;50186:182;:::o;50374:231::-;50514:34;50510:1;50502:6;50498:14;50491:58;50583:14;50578:2;50570:6;50566:15;50559:39;50374:231;:::o;50611:155::-;50751:7;50747:1;50739:6;50735:14;50728:31;50611:155;:::o;50772:167::-;50912:19;50908:1;50900:6;50896:14;50889:43;50772:167;:::o;50945:182::-;51085:34;51081:1;51073:6;51069:14;51062:58;50945:182;:::o;51133:223::-;51273:34;51269:1;51261:6;51257:14;51250:58;51342:6;51337:2;51329:6;51325:15;51318:31;51133:223;:::o;51362:228::-;51502:34;51498:1;51490:6;51486:14;51479:58;51571:11;51566:2;51558:6;51554:15;51547:36;51362:228;:::o;51596:234::-;51736:34;51732:1;51724:6;51720:14;51713:58;51805:17;51800:2;51792:6;51788:15;51781:42;51596:234;:::o;51836:248::-;51976:34;51972:1;51964:6;51960:14;51953:58;52045:31;52040:2;52032:6;52028:15;52021:56;51836:248;:::o;52090:220::-;52230:34;52226:1;52218:6;52214:14;52207:58;52299:3;52294:2;52286:6;52282:15;52275:28;52090:220;:::o;52316:177::-;52456:29;52452:1;52444:6;52440:14;52433:53;52316:177;:::o;52499:114::-;;:::o;52619:236::-;52759:34;52755:1;52747:6;52743:14;52736:58;52828:19;52823:2;52815:6;52811:15;52804:44;52619:236;:::o;52861:171::-;53001:23;52997:1;52989:6;52985:14;52978:47;52861:171;:::o;53038:115::-;53121:1;53114:5;53111:12;53101:46;;53127:18;;:::i;:::-;53101:46;53038:115;:::o;53159:122::-;53232:24;53250:5;53232:24;:::i;:::-;53225:5;53222:35;53212:63;;53271:1;53268;53261:12;53212:63;53159:122;:::o;53287:116::-;53357:21;53372:5;53357:21;:::i;:::-;53350:5;53347:32;53337:60;;53393:1;53390;53383:12;53337:60;53287:116;:::o;53409:122::-;53482:24;53500:5;53482:24;:::i;:::-;53475:5;53472:35;53462:63;;53521:1;53518;53511:12;53462:63;53409:122;:::o;53537:120::-;53609:23;53626:5;53609:23;:::i;:::-;53602:5;53599:34;53589:62;;53647:1;53644;53637:12;53589:62;53537:120;:::o;53663:122::-;53736:24;53754:5;53736:24;:::i;:::-;53729:5;53726:35;53716:63;;53775:1;53772;53765:12;53716:63;53663:122;:::o;53791:118::-;53862:22;53878:5;53862:22;:::i;:::-;53855:5;53852:33;53842:61;;53899:1;53896;53889:12;53842:61;53791:118;:::o

Swarm Source

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