ETH Price: $2,518.92 (+1.13%)

Token

RugDollz (RUGZ)
 

Overview

Max Total Supply

136 RUGZ

Holders

27

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 RUGZ
0x957f8e6ad17233f57a06d1bc42f17f606121b42b
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:
RugDollz

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-10-28
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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


// OpenZeppelin Contracts (last updated v4.7.0) (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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (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


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/RugDollz.sol



pragma solidity >=0.7.0 <0.9.0;



contract RugDollz is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 0.0085 ether;
  uint256 public cost2ndBatch = 0.012 ether;
  uint256 public maxSupply = 5555;
  uint256 public maxMintAmount = 20;
  uint256 public royaltyFeesInBips;
  bool public paused = true;
  address royaltyReciever;
  address[] public twentyMintEarlyInvestor;
  address[] public fourtyMintEarlyInvestor;
  address[] public sixtyMintEarlyInvestor;
  mapping(address => uint256) public mintCount;
  mapping(address => uint256) public mintCountTwentyWL;
  mapping(address => uint256) public mintCountFourtyWL;
  mapping(address => uint256) public mintCountSixtyWL;

  constructor() ERC721("RugDollz", "RUGZ") {
    setBaseURI("https://bafybeihh6aw5w7kvdjbmy6hpp2twpta4odrqwlqhweifcdnhjnfymgqjku.ipfs.nftstorage.link/"); 
    royaltyFeesInBips = 750;
    royaltyReciever = msg.sender;
  }

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

  // public
  function mint(uint256 _mintAmount) public payable {
    uint256 supply = totalSupply();
    if ((isOnTwentyMintEarlyInvestor(msg.sender) && getMintCountTwentyWL() + _mintAmount <= 20) || (isOnFourtyMintEarlyInvestor(msg.sender) && getMintCountFourtyWL() + _mintAmount <= 40) || (isOnSixtyMintEarlyInvestor(msg.sender) && getMintCountSixtyWL() + _mintAmount <= 60)){
      require(!paused);
      require(_mintAmount > 0);
      require(_mintAmount <= maxMintAmount);
      require(supply + _mintAmount <= 5555);
      if (isOnTwentyMintEarlyInvestor(msg.sender)){
        require(getMintCountTwentyWL() + _mintAmount <= 20);
        mintCountTwentyWL[msg.sender] += _mintAmount;
      }
      else if (isOnFourtyMintEarlyInvestor(msg.sender)){
        require(getMintCountFourtyWL() + _mintAmount <= 40);
        mintCountFourtyWL[msg.sender] += _mintAmount;
      }
      else if(isOnSixtyMintEarlyInvestor(msg.sender)){
        require(getMintCountSixtyWL() + _mintAmount <= 60);
        mintCountSixtyWL[msg.sender] += _mintAmount;
      }
    }
    else{
      if (msg.sender != owner()) {
            require(!paused);
            require(_mintAmount > 0);
            require(_mintAmount <= maxMintAmount);
            require(supply + _mintAmount <= 3800 + getTotalEarlyInvestorMint());
            require(getMintCount() < 250);
            if (supply <= 1900 + getTotalEarlyInvestorMint()){
              require(msg.value >= cost * _mintAmount);
            }
            else if(supply <= 3800 + getTotalEarlyInvestorMint()){
              require(msg.value >= cost2ndBatch * _mintAmount);
            }
        }
      else{
          require(_mintAmount > 0);
          require(supply + _mintAmount <= 5555);
        }
    }

    mintCount[msg.sender] += _mintAmount;

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

   function isOnTwentyMintEarlyInvestor(address _user) public view returns (bool){
    for(uint256 i = 0; i<twentyMintEarlyInvestor.length; i++){
        if(twentyMintEarlyInvestor[i] == _user){
            return true;
        }
    }
    return false;
  }

   function isOnFourtyMintEarlyInvestor(address _user) public view returns (bool){
    for(uint256 i = 0; i<fourtyMintEarlyInvestor.length; i++){
        if(fourtyMintEarlyInvestor[i] == _user){
            return true;
        }
    }
    return false;
  }

   function isOnSixtyMintEarlyInvestor(address _user) public view returns (bool){
    for(uint256 i = 0; i<sixtyMintEarlyInvestor.length; i++){
        if(sixtyMintEarlyInvestor[i] == _user){
            return true;
        }
    }
    return false;
  }

    function getMintCount() public view returns (uint256) {
        return mintCount[msg.sender];
    }

    function getMintCountTwentyWL() public view returns (uint256) {
        return mintCountTwentyWL[msg.sender];
    }

    function getMintCountFourtyWL() public view returns (uint256) {
        return mintCountFourtyWL[msg.sender];
    }

    function getMintCountSixtyWL() public view returns (uint256) {
        return mintCountSixtyWL[msg.sender];
    }

  function getTotalEarlyInvestorMint() public view returns(uint256) {
    uint256 som = 0;
    for(uint256 i = 0; i<twentyMintEarlyInvestor.length; i++){
      som = som + mintCountTwentyWL[twentyMintEarlyInvestor[i]];
    }
    for(uint256 i = 0; i<fourtyMintEarlyInvestor.length; i++){
      som = som + mintCountFourtyWL[fourtyMintEarlyInvestor[i]];
    }
    for(uint256 i = 0; i<sixtyMintEarlyInvestor.length; i++){
      som = som + mintCountSixtyWL[sixtyMintEarlyInvestor[i]];
    }
    return som;
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }
  

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable) returns (bool){
    return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
  }

   function royaltyInfo(uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount){
    return(royaltyReciever, calculateRoyalty(_salePrice));
     }

  function calculateRoyalty(uint256 _salePrice) view public returns(uint256){
    return (_salePrice / 10000) * royaltyFeesInBips;
    }

  function getCost(address _sender) view public returns(uint256){
    uint256 supply = totalSupply();
    if (isOnTwentyMintEarlyInvestor(_sender) && mintCountTwentyWL[_sender] < 20 || isOnFourtyMintEarlyInvestor(_sender) && mintCountFourtyWL[_sender] < 40 || isOnSixtyMintEarlyInvestor(_sender) && mintCountSixtyWL[_sender] < 60){
      return 0;
    }
    else{
      if (supply <= 1900 + getTotalEarlyInvestorMint()){
        return cost;
      }
      else if(supply <= 3800 + getTotalEarlyInvestorMint()){
        return cost2ndBatch;
      }
    }
  }

  //only owner

  function airdrop(uint256 _amount, address airdropToWallet) public onlyOwner {
      uint256 supply = totalSupply();
      require(_amount <= maxMintAmount);
      require(supply + _amount <= 5555);
      require(_amount > 0);
      for (uint256 i = 1; i <= _amount; i++) {
        _safeMint(airdropToWallet, supply + i);
      }
    }  

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }  

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function addTwentyMintEarlyInvestor(address[] calldata _users) public onlyOwner {
    delete twentyMintEarlyInvestor;
    twentyMintEarlyInvestor = _users;
  }

  function addFourtyMintEarlyInvestor(address[] calldata _users) public onlyOwner {
    delete fourtyMintEarlyInvestor;
    fourtyMintEarlyInvestor = _users;
  }

  function addSixtyMintEarlyInvestor(address[] calldata _users) public onlyOwner {
    delete sixtyMintEarlyInvestor;
    sixtyMintEarlyInvestor = _users;
  }

  function withdraw() public payable onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function setRoyaltyInfo(address _reciever, uint256 _royaltyFeesInBips) public onlyOwner{
    royaltyReciever = _reciever;
    royaltyFeesInBips = _royaltyFeesInBips;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addFourtyMintEarlyInvestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addSixtyMintEarlyInvestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addTwentyMintEarlyInvestor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"airdropToWallet","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"calculateRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost2ndBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fourtyMintEarlyInvestor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"_sender","type":"address"}],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCountFourtyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCountSixtyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCountTwentyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalEarlyInvestorMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isOnFourtyMintEarlyInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isOnSixtyMintEarlyInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isOnTwentyMintEarlyInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCountFourtyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCountSixtyWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCountTwentyWL","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyFeesInBips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"},{"internalType":"uint256","name":"_royaltyFeesInBips","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sixtyMintEarlyInvestor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"twentyMintEarlyInvestor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000519291906200038b565b50661e32b478974000600d55662aa1efb94e0000600e556115b3600f5560146010556001601260006101000a81548160ff0219169083151502179055503480156200009b57600080fd5b506040518060400160405280600881526020017f527567446f6c6c7a0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5255475a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001209291906200038b565b508060019080519060200190620001399291906200038b565b5050506200015c62000150620001d660201b60201c565b620001de60201b60201c565b62000186604051806080016040528060598152602001620057b960599139620002a460201b60201c565b6102ee60118190555033601260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000523565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b4620002d060201b60201c565b80600b9080519060200190620002cc9291906200038b565b5050565b620002e0620001d660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003066200036160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003569062000462565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003999062000495565b90600052602060002090601f016020900481019282620003bd576000855562000409565b82601f10620003d857805160ff191683800117855562000409565b8280016001018555821562000409579182015b8281111562000408578251825591602001919060010190620003eb565b5b5090506200041891906200041c565b5090565b5b80821115620004375760008160009055506001016200041d565b5090565b60006200044a60208362000484565b91506200045782620004fa565b602082019050919050565b600060208201905081810360008301526200047d816200043b565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004ae57607f821691505b60208210811415620004c557620004c4620004cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61528680620005336000396000f3fe6080604052600436106103765760003560e01c80637b8ffa1b116101d1578063bc63f02e11610102578063d5abeb01116100a0578063e4d8e73b1161006f578063e4d8e73b14610d6d578063e985e9c514610d96578063ed9ec88814610dd3578063f2fde38b14610e1057610376565b8063d5abeb0114610cb3578063d965c05f14610cde578063da3ef23f14610d1b578063e2e784d514610d4457610376565b8063c87b56dd116100dc578063c87b56dd14610bd0578063cc2f222114610c0d578063cef6d36814610c4a578063d0f2c76b14610c8857610376565b8063bc63f02e14610b3f578063c3c90f3914610b68578063c668286214610ba557610376565b806398e2ce301161016f578063a22cb46511610149578063a22cb46514610a73578063a2e6961314610a9c578063b47d788214610ad9578063b88d4fde14610b1657610376565b806398e2ce30146109ef5780639f6d971314610a2c578063a0712d6814610a5757610376565b80638da5cb5b116101ab5780638da5cb5b146109435780638fc3b5491461096e57806395d89b4114610999578063987b935d146109c457610376565b80637b8ffa1b1461088c5780638b88a687146108c95780638ca17eb91461090657610376565b80633ccfd60b116102ab5780635c975abb1161024957806370a082311161022357806370a08231146107e2578063715018a61461081f57806373c7400e14610836578063762620881461086157610376565b80635c975abb1461074f5780636352211e1461077a5780636c0360eb146107b757610376565b806344a0d68a1161028557806344a0d68a14610683578063453a25cf146106ac5780634f6ccce7146106e957806355f804b31461072657610376565b80633ccfd60b1461061357806342842e0e1461061d578063438b63001461064657610376565b806318160ddd1161031857806323b872dd116102f257806323b872dd146105475780632677fbae1461057057806328c89b81146105995780632f745c59146105d657610376565b806318160ddd146104c8578063193ebbbc146104f3578063239c70ae1461051c57610376565b8063081812fc11610354578063081812fc1461040c578063095ea7b3146104495780630eea152c1461047257806313faede61461049d57610376565b806301ffc9a71461037b57806302329a29146103b857806306fdde03146103e1575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614024565b610e39565b6040516103af9190614653565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613ff7565b610e7b565b005b3480156103ed57600080fd5b506103f6610ea0565b604051610403919061466e565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906140c7565b610f32565b60405161044091906145a1565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613f6a565b610f78565b005b34801561047e57600080fd5b50610487611090565b6040516104949190614890565b60405180910390f35b3480156104a957600080fd5b506104b26110d7565b6040516104bf9190614890565b60405180910390f35b3480156104d457600080fd5b506104dd6110dd565b6040516104ea9190614890565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613faa565b6110ea565b005b34801561052857600080fd5b50610531611116565b60405161053e9190614890565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613e54565b61111c565b005b34801561057c57600080fd5b5061059760048036038101906105929190613faa565b61117c565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190613de7565b6111a8565b6040516105cd9190614890565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613f6a565b6111c0565b60405161060a9190614890565b60405180910390f35b61061b611265565b005b34801561062957600080fd5b50610644600480360381019061063f9190613e54565b6112ed565b005b34801561065257600080fd5b5061066d60048036038101906106689190613de7565b61130d565b60405161067a9190614631565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a591906140c7565b6113bb565b005b3480156106b857600080fd5b506106d360048036038101906106ce9190613de7565b6113cd565b6040516106e09190614890565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906140c7565b6113e5565b60405161071d9190614890565b60405180910390f35b34801561073257600080fd5b5061074d6004803603810190610748919061407e565b611456565b005b34801561075b57600080fd5b50610764611478565b6040516107719190614653565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c91906140c7565b61148b565b6040516107ae91906145a1565b60405180910390f35b3480156107c357600080fd5b506107cc61153d565b6040516107d9919061466e565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190613de7565b6115cb565b6040516108169190614890565b60405180910390f35b34801561082b57600080fd5b50610834611683565b005b34801561084257600080fd5b5061084b611697565b6040516108589190614890565b60405180910390f35b34801561086d57600080fd5b5061087661169d565b6040516108839190614890565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae91906140c7565b6116e4565b6040516108c091906145a1565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb9190613de7565b611723565b6040516108fd9190614890565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613de7565b61189c565b60405161093a9190614890565b60405180910390f35b34801561094f57600080fd5b506109586118b4565b60405161096591906145a1565b60405180910390f35b34801561097a57600080fd5b506109836118de565b6040516109909190614890565b60405180910390f35b3480156109a557600080fd5b506109ae611925565b6040516109bb919061466e565b60405180910390f35b3480156109d057600080fd5b506109d96119b7565b6040516109e69190614890565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a1191906140c7565b611bd2565b604051610a2391906145a1565b60405180910390f35b348015610a3857600080fd5b50610a41611c11565b604051610a4e9190614890565b60405180910390f35b610a716004803603810190610a6c91906140c7565b611c58565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190613f2a565b6120bd565b005b348015610aa857600080fd5b50610ac36004803603810190610abe91906140c7565b6120d3565b604051610ad09190614890565b60405180910390f35b348015610ae557600080fd5b50610b006004803603810190610afb91906140c7565b6120f7565b604051610b0d91906145a1565b60405180910390f35b348015610b2257600080fd5b50610b3d6004803603810190610b389190613ea7565b612136565b005b348015610b4b57600080fd5b50610b666004803603810190610b6191906140f4565b612198565b005b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190613de7565b61221e565b604051610b9c9190614653565b60405180910390f35b348015610bb157600080fd5b50610bba6122cd565b604051610bc7919061466e565b60405180910390f35b348015610bdc57600080fd5b50610bf76004803603810190610bf291906140c7565b61235b565b604051610c04919061466e565b60405180910390f35b348015610c1957600080fd5b50610c346004803603810190610c2f9190613de7565b612405565b604051610c419190614653565b60405180910390f35b348015610c5657600080fd5b50610c716004803603810190610c6c91906140c7565b6124b4565b604051610c7f929190614608565b60405180910390f35b348015610c9457600080fd5b50610c9d6124ec565b604051610caa9190614890565b60405180910390f35b348015610cbf57600080fd5b50610cc86124f2565b604051610cd59190614890565b60405180910390f35b348015610cea57600080fd5b50610d056004803603810190610d009190613de7565b6124f8565b604051610d129190614653565b60405180910390f35b348015610d2757600080fd5b50610d426004803603810190610d3d919061407e565b6125a7565b005b348015610d5057600080fd5b50610d6b6004803603810190610d669190613f6a565b6125c9565b005b348015610d7957600080fd5b50610d946004803603810190610d8f9190613faa565b61261d565b005b348015610da257600080fd5b50610dbd6004803603810190610db89190613e14565b612649565b604051610dca9190614653565b60405180910390f35b348015610ddf57600080fd5b50610dfa6004803603810190610df59190613de7565b6126dd565b604051610e079190614890565b60405180910390f35b348015610e1c57600080fd5b50610e376004803603810190610e329190613de7565b6126f5565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e745750610e7382612779565b5b9050919050565b610e836127f3565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610eaf90614b99565b80601f0160208091040260200160405190810160405280929190818152602001828054610edb90614b99565b8015610f285780601f10610efd57610100808354040283529160200191610f28565b820191906000526020600020905b815481529060010190602001808311610f0b57829003601f168201915b5050505050905090565b6000610f3d82612871565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f838261148b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614830565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110136128bc565b73ffffffffffffffffffffffffffffffffffffffff16148061104257506110418161103c6128bc565b612649565b5b611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890614790565b60405180910390fd5b61108b83836128c4565b505050565b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600d5481565b6000600880549050905090565b6110f26127f3565b601460006111009190613ae4565b818160149190611111929190613b05565b505050565b60105481565b61112d6111276128bc565b8261297d565b61116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390614870565b60405180910390fd5b611177838383612a12565b505050565b6111846127f3565b601560006111929190613ae4565b8181601591906111a3929190613b05565b505050565b60176020528060005260406000206000915090505481565b60006111cb836115cb565b821061120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614690565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61126d6127f3565b60006112776118b4565b73ffffffffffffffffffffffffffffffffffffffff164760405161129a9061458c565b60006040518083038185875af1925050503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b50509050806112ea57600080fd5b50565b61130883838360405180602001604052806000815250612136565b505050565b6060600061131a836115cb565b905060008167ffffffffffffffff81111561133857611337614d61565b5b6040519080825280602002602001820160405280156113665781602001602082028036833780820191505090505b50905060005b828110156113b05761137e85826111c0565b82828151811061139157611390614d32565b5b60200260200101818152505080806113a890614bfc565b91505061136c565b508092505050919050565b6113c36127f3565b80600d8190555050565b60186020528060005260406000206000915090505481565b60006113ef6110dd565b8210611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614850565b60405180910390fd5b6008828154811061144457611443614d32565b5b90600052602060002001549050919050565b61145e6127f3565b80600b9080519060200190611474929190613ba5565b5050565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614810565b60405180910390fd5b80915050919050565b600b805461154a90614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461157690614b99565b80156115c35780601f10611598576101008083540402835291602001916115c3565b820191906000526020600020905b8154815290600101906020018083116115a657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390614770565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b6127f3565b6116956000612c79565b565b60115481565b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b601581815481106116f457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061172e6110dd565b90506117398361221e565b801561178457506014601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b806117df575061179383612405565b80156117de57506028601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b5b8061183a57506117ee836124f8565b80156118395750603c601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b5b15611849576000915050611897565b6118516119b7565b61076c61185e91906149ce565b811161186f57600d54915050611897565b6118776119b7565b610ed861188491906149ce565b811161189557600e54915050611897565b505b919050565b60196020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60606001805461193490614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461196090614b99565b80156119ad5780601f10611982576101008083540402835291602001916119ad565b820191906000526020600020905b81548152906001019060200180831161199057829003601f168201915b5050505050905090565b6000806000905060005b601380549050811015611a6c5760176000601383815481106119e6576119e5614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611a5791906149ce565b91508080611a6490614bfc565b9150506119c1565b5060005b601480549050811015611b1b576018600060148381548110611a9557611a94614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b0691906149ce565b91508080611b1390614bfc565b915050611a70565b5060005b601580549050811015611bca576019600060158381548110611b4457611b43614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611bb591906149ce565b91508080611bc290614bfc565b915050611b1f565b508091505090565b60148181548110611be257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000611c626110dd565b9050611c6d3361221e565b8015611c8c5750601482611c7f611c11565b611c8991906149ce565b11155b80611cbb5750611c9b33612405565b8015611cba5750602882611cad61169d565b611cb791906149ce565b11155b5b80611cea5750611cca336124f8565b8015611ce95750603c82611cdc611090565b611ce691906149ce565b11155b5b15611edd57601260009054906101000a900460ff1615611d0957600080fd5b60008211611d1657600080fd5b601054821115611d2557600080fd5b6115b38282611d3491906149ce565b1115611d3f57600080fd5b611d483361221e565b15611dc857601482611d58611c11565b611d6291906149ce565b1115611d6d57600080fd5b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbc91906149ce565b92505081905550611ed8565b611dd133612405565b15611e5157602882611de161169d565b611deb91906149ce565b1115611df657600080fd5b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e4591906149ce565b92505081905550611ed7565b611e5a336124f8565b15611ed657603c82611e6a611090565b611e7491906149ce565b1115611e7f57600080fd5b81601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ece91906149ce565b925050819055505b5b5b61202c565b611ee56118b4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200357601260009054906101000a900460ff1615611f3157600080fd5b60008211611f3e57600080fd5b601054821115611f4d57600080fd5b611f556119b7565b610ed8611f6291906149ce565b8282611f6e91906149ce565b1115611f7957600080fd5b60fa611f836118de565b10611f8d57600080fd5b611f956119b7565b61076c611fa291906149ce565b8111611fc75781600d54611fb69190614a55565b341015611fc257600080fd5b611ffe565b611fcf6119b7565b610ed8611fdc91906149ce565b8111611ffd5781600e54611ff09190614a55565b341015611ffc57600080fd5b5b5b61202b565b6000821161201057600080fd5b6115b3828261201f91906149ce565b111561202a57600080fd5b5b5b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207b91906149ce565b925050819055506000600190505b8281116120b8576120a53382846120a091906149ce565b612d3f565b80806120b090614bfc565b915050612089565b505050565b6120cf6120c86128bc565b8383612d5d565b5050565b6000601154612710836120e69190614a24565b6120f09190614a55565b9050919050565b6013818154811061210757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121476121416128bc565b8361297d565b612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90614870565b60405180910390fd5b61219284848484612eca565b50505050565b6121a06127f3565b60006121aa6110dd565b90506010548311156121bb57600080fd5b6115b383826121ca91906149ce565b11156121d557600080fd5b600083116121e257600080fd5b6000600190505b8381116122185761220583828461220091906149ce565b612d3f565b808061221090614bfc565b9150506121e9565b50505050565b600080600090505b6013805490508110156122c2578273ffffffffffffffffffffffffffffffffffffffff166013828154811061225e5761225d614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122af5760019150506122c8565b80806122ba90614bfc565b915050612226565b50600090505b919050565b600c80546122da90614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461230690614b99565b80156123535780601f1061232857610100808354040283529160200191612353565b820191906000526020600020905b81548152906001019060200180831161233657829003601f168201915b505050505081565b606061236682612f26565b6123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c906147f0565b60405180910390fd5b60006123af612f92565b905060008151116123cf57604051806020016040528060008152506123fd565b806123d984613024565b600c6040516020016123ed9392919061455b565b6040516020818303038152906040525b915050919050565b600080600090505b6014805490508110156124a9578273ffffffffffffffffffffffffffffffffffffffff166014828154811061244557612444614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124965760019150506124af565b80806124a190614bfc565b91505061240d565b50600090505b919050565b600080601260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166124e3846120d3565b91509150915091565b600e5481565b600f5481565b600080600090505b60158054905081101561259c578273ffffffffffffffffffffffffffffffffffffffff166015828154811061253857612537614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125895760019150506125a2565b808061259490614bfc565b915050612500565b50600090505b919050565b6125af6127f3565b80600c90805190602001906125c5929190613ba5565b5050565b6125d16127f3565b81601260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806011819055505050565b6126256127f3565b601360006126339190613ae4565b818160139190612644929190613b05565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915090505481565b6126fd6127f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561276d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612764906146d0565b60405180910390fd5b61277681612c79565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ec57506127eb82613185565b5b9050919050565b6127fb6128bc565b73ffffffffffffffffffffffffffffffffffffffff166128196118b4565b73ffffffffffffffffffffffffffffffffffffffff161461286f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612866906147d0565b60405180910390fd5b565b61287a81612f26565b6128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090614810565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129378361148b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806129898361148b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129cb57506129ca8185612649565b5b80612a0957508373ffffffffffffffffffffffffffffffffffffffff166129f184610f32565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a328261148b565b73ffffffffffffffffffffffffffffffffffffffff1614612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f906146f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aef90614730565b60405180910390fd5b612b03838383613267565b612b0e6000826128c4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5e9190614aaf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb591906149ce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7483838361337b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d59828260405180602001604052806000815250613380565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc390614750565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ebd9190614653565b60405180910390a3505050565b612ed5848484612a12565b612ee1848484846133db565b612f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f17906146b0565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612fa190614b99565b80601f0160208091040260200160405190810160405280929190818152602001828054612fcd90614b99565b801561301a5780601f10612fef5761010080835404028352916020019161301a565b820191906000526020600020905b815481529060010190602001808311612ffd57829003601f168201915b5050505050905090565b6060600082141561306c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613180565b600082905060005b6000821461309e57808061308790614bfc565b915050600a826130979190614a24565b9150613074565b60008167ffffffffffffffff8111156130ba576130b9614d61565b5b6040519080825280601f01601f1916602001820160405280156130ec5781602001600182028036833780820191505090505b5090505b60008514613179576001826131059190614aaf565b9150600a856131149190614c45565b603061312091906149ce565b60f81b81838151811061313657613135614d32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131729190614a24565b94506130f0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061325057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613260575061325f82613572565b5b9050919050565b6132728383836135dc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132b5576132b0816135e1565b6132f4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132f3576132f2838261362a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133375761333281613797565b613376565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613375576133748282613868565b5b5b505050565b505050565b61338a83836138e7565b61339760008484846133db565b6133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd906146b0565b60405180910390fd5b505050565b60006133fc8473ffffffffffffffffffffffffffffffffffffffff16613ac1565b15613565578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134256128bc565b8786866040518563ffffffff1660e01b815260040161344794939291906145bc565b602060405180830381600087803b15801561346157600080fd5b505af192505050801561349257506040513d601f19601f8201168201806040525081019061348f9190614051565b60015b613515573d80600081146134c2576040519150601f19603f3d011682016040523d82523d6000602084013e6134c7565b606091505b5060008151141561350d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613504906146b0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061356a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613637846115cb565b6136419190614aaf565b9050600060076000848152602001908152602001600020549050818114613726576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137ab9190614aaf565b90506000600960008481526020019081526020016000205490506000600883815481106137db576137da614d32565b5b9060005260206000200154905080600883815481106137fd576137fc614d32565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061384c5761384b614d03565b5b6001900381819060005260206000200160009055905550505050565b6000613873836115cb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394e906147b0565b60405180910390fd5b61396081612f26565b156139a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399790614710565b60405180910390fd5b6139ac60008383613267565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139fc91906149ce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613abd6000838361337b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5080546000825590600052602060002090810190613b029190613c2b565b50565b828054828255906000526020600020908101928215613b94579160200282015b82811115613b9357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b25565b5b509050613ba19190613c2b565b5090565b828054613bb190614b99565b90600052602060002090601f016020900481019282613bd35760008555613c1a565b82601f10613bec57805160ff1916838001178555613c1a565b82800160010185558215613c1a579182015b82811115613c19578251825591602001919060010190613bfe565b5b509050613c279190613c2b565b5090565b5b80821115613c44576000816000905550600101613c2c565b5090565b6000613c5b613c56846148d0565b6148ab565b905082815260208101848484011115613c7757613c76614d9f565b5b613c82848285614b57565b509392505050565b6000613c9d613c9884614901565b6148ab565b905082815260208101848484011115613cb957613cb8614d9f565b5b613cc4848285614b57565b509392505050565b600081359050613cdb816151f4565b92915050565b60008083601f840112613cf757613cf6614d95565b5b8235905067ffffffffffffffff811115613d1457613d13614d90565b5b602083019150836020820283011115613d3057613d2f614d9a565b5b9250929050565b600081359050613d468161520b565b92915050565b600081359050613d5b81615222565b92915050565b600081519050613d7081615222565b92915050565b600082601f830112613d8b57613d8a614d95565b5b8135613d9b848260208601613c48565b91505092915050565b600082601f830112613db957613db8614d95565b5b8135613dc9848260208601613c8a565b91505092915050565b600081359050613de181615239565b92915050565b600060208284031215613dfd57613dfc614da9565b5b6000613e0b84828501613ccc565b91505092915050565b60008060408385031215613e2b57613e2a614da9565b5b6000613e3985828601613ccc565b9250506020613e4a85828601613ccc565b9150509250929050565b600080600060608486031215613e6d57613e6c614da9565b5b6000613e7b86828701613ccc565b9350506020613e8c86828701613ccc565b9250506040613e9d86828701613dd2565b9150509250925092565b60008060008060808587031215613ec157613ec0614da9565b5b6000613ecf87828801613ccc565b9450506020613ee087828801613ccc565b9350506040613ef187828801613dd2565b925050606085013567ffffffffffffffff811115613f1257613f11614da4565b5b613f1e87828801613d76565b91505092959194509250565b60008060408385031215613f4157613f40614da9565b5b6000613f4f85828601613ccc565b9250506020613f6085828601613d37565b9150509250929050565b60008060408385031215613f8157613f80614da9565b5b6000613f8f85828601613ccc565b9250506020613fa085828601613dd2565b9150509250929050565b60008060208385031215613fc157613fc0614da9565b5b600083013567ffffffffffffffff811115613fdf57613fde614da4565b5b613feb85828601613ce1565b92509250509250929050565b60006020828403121561400d5761400c614da9565b5b600061401b84828501613d37565b91505092915050565b60006020828403121561403a57614039614da9565b5b600061404884828501613d4c565b91505092915050565b60006020828403121561406757614066614da9565b5b600061407584828501613d61565b91505092915050565b60006020828403121561409457614093614da9565b5b600082013567ffffffffffffffff8111156140b2576140b1614da4565b5b6140be84828501613da4565b91505092915050565b6000602082840312156140dd576140dc614da9565b5b60006140eb84828501613dd2565b91505092915050565b6000806040838503121561410b5761410a614da9565b5b600061411985828601613dd2565b925050602061412a85828601613ccc565b9150509250929050565b6000614140838361453d565b60208301905092915050565b61415581614ae3565b82525050565b600061416682614957565b6141708185614985565b935061417b83614932565b8060005b838110156141ac5781516141938882614134565b975061419e83614978565b92505060018101905061417f565b5085935050505092915050565b6141c281614af5565b82525050565b60006141d382614962565b6141dd8185614996565b93506141ed818560208601614b66565b6141f681614dae565b840191505092915050565b600061420c8261496d565b61421681856149b2565b9350614226818560208601614b66565b61422f81614dae565b840191505092915050565b60006142458261496d565b61424f81856149c3565b935061425f818560208601614b66565b80840191505092915050565b6000815461427881614b99565b61428281866149c3565b9450600182166000811461429d57600181146142ae576142e1565b60ff198316865281860193506142e1565b6142b785614942565b60005b838110156142d9578154818901526001820191506020810190506142ba565b838801955050505b50505092915050565b60006142f7602b836149b2565b915061430282614dbf565b604082019050919050565b600061431a6032836149b2565b915061432582614e0e565b604082019050919050565b600061433d6026836149b2565b915061434882614e5d565b604082019050919050565b60006143606025836149b2565b915061436b82614eac565b604082019050919050565b6000614383601c836149b2565b915061438e82614efb565b602082019050919050565b60006143a66024836149b2565b91506143b182614f24565b604082019050919050565b60006143c96019836149b2565b91506143d482614f73565b602082019050919050565b60006143ec6029836149b2565b91506143f782614f9c565b604082019050919050565b600061440f603e836149b2565b915061441a82614feb565b604082019050919050565b60006144326020836149b2565b915061443d8261503a565b602082019050919050565b60006144556020836149b2565b915061446082615063565b602082019050919050565b6000614478602f836149b2565b91506144838261508c565b604082019050919050565b600061449b6018836149b2565b91506144a6826150db565b602082019050919050565b60006144be6021836149b2565b91506144c982615104565b604082019050919050565b60006144e16000836149a7565b91506144ec82615153565b600082019050919050565b6000614504602c836149b2565b915061450f82615156565b604082019050919050565b6000614527602e836149b2565b9150614532826151a5565b604082019050919050565b61454681614b4d565b82525050565b61455581614b4d565b82525050565b6000614567828661423a565b9150614573828561423a565b915061457f828461426b565b9150819050949350505050565b6000614597826144d4565b9150819050919050565b60006020820190506145b6600083018461414c565b92915050565b60006080820190506145d1600083018761414c565b6145de602083018661414c565b6145eb604083018561454c565b81810360608301526145fd81846141c8565b905095945050505050565b600060408201905061461d600083018561414c565b61462a602083018461454c565b9392505050565b6000602082019050818103600083015261464b818461415b565b905092915050565b600060208201905061466860008301846141b9565b92915050565b600060208201905081810360008301526146888184614201565b905092915050565b600060208201905081810360008301526146a9816142ea565b9050919050565b600060208201905081810360008301526146c98161430d565b9050919050565b600060208201905081810360008301526146e981614330565b9050919050565b6000602082019050818103600083015261470981614353565b9050919050565b6000602082019050818103600083015261472981614376565b9050919050565b6000602082019050818103600083015261474981614399565b9050919050565b60006020820190508181036000830152614769816143bc565b9050919050565b60006020820190508181036000830152614789816143df565b9050919050565b600060208201905081810360008301526147a981614402565b9050919050565b600060208201905081810360008301526147c981614425565b9050919050565b600060208201905081810360008301526147e981614448565b9050919050565b600060208201905081810360008301526148098161446b565b9050919050565b600060208201905081810360008301526148298161448e565b9050919050565b60006020820190508181036000830152614849816144b1565b9050919050565b60006020820190508181036000830152614869816144f7565b9050919050565b600060208201905081810360008301526148898161451a565b9050919050565b60006020820190506148a5600083018461454c565b92915050565b60006148b56148c6565b90506148c18282614bcb565b919050565b6000604051905090565b600067ffffffffffffffff8211156148eb576148ea614d61565b5b6148f482614dae565b9050602081019050919050565b600067ffffffffffffffff82111561491c5761491b614d61565b5b61492582614dae565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d982614b4d565b91506149e483614b4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1957614a18614c76565b5b828201905092915050565b6000614a2f82614b4d565b9150614a3a83614b4d565b925082614a4a57614a49614ca5565b5b828204905092915050565b6000614a6082614b4d565b9150614a6b83614b4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614aa457614aa3614c76565b5b828202905092915050565b6000614aba82614b4d565b9150614ac583614b4d565b925082821015614ad857614ad7614c76565b5b828203905092915050565b6000614aee82614b2d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b84578082015181840152602081019050614b69565b83811115614b93576000848401525b50505050565b60006002820490506001821680614bb157607f821691505b60208210811415614bc557614bc4614cd4565b5b50919050565b614bd482614dae565b810181811067ffffffffffffffff82111715614bf357614bf2614d61565b5b80604052505050565b6000614c0782614b4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3a57614c39614c76565b5b600182019050919050565b6000614c5082614b4d565b9150614c5b83614b4d565b925082614c6b57614c6a614ca5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6151fd81614ae3565b811461520857600080fd5b50565b61521481614af5565b811461521f57600080fd5b50565b61522b81614b01565b811461523657600080fd5b50565b61524281614b4d565b811461524d57600080fd5b5056fea26469706673582212208fd2844646ffcd0b872a58e18902f59afed1c68b39a2c6c367b2800cc95d144c64736f6c6343000807003368747470733a2f2f6261667962656968683661773577376b76646a626d7936687070327477707461346f647271776c71687765696663646e686a6e66796d67716a6b752e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x6080604052600436106103765760003560e01c80637b8ffa1b116101d1578063bc63f02e11610102578063d5abeb01116100a0578063e4d8e73b1161006f578063e4d8e73b14610d6d578063e985e9c514610d96578063ed9ec88814610dd3578063f2fde38b14610e1057610376565b8063d5abeb0114610cb3578063d965c05f14610cde578063da3ef23f14610d1b578063e2e784d514610d4457610376565b8063c87b56dd116100dc578063c87b56dd14610bd0578063cc2f222114610c0d578063cef6d36814610c4a578063d0f2c76b14610c8857610376565b8063bc63f02e14610b3f578063c3c90f3914610b68578063c668286214610ba557610376565b806398e2ce301161016f578063a22cb46511610149578063a22cb46514610a73578063a2e6961314610a9c578063b47d788214610ad9578063b88d4fde14610b1657610376565b806398e2ce30146109ef5780639f6d971314610a2c578063a0712d6814610a5757610376565b80638da5cb5b116101ab5780638da5cb5b146109435780638fc3b5491461096e57806395d89b4114610999578063987b935d146109c457610376565b80637b8ffa1b1461088c5780638b88a687146108c95780638ca17eb91461090657610376565b80633ccfd60b116102ab5780635c975abb1161024957806370a082311161022357806370a08231146107e2578063715018a61461081f57806373c7400e14610836578063762620881461086157610376565b80635c975abb1461074f5780636352211e1461077a5780636c0360eb146107b757610376565b806344a0d68a1161028557806344a0d68a14610683578063453a25cf146106ac5780634f6ccce7146106e957806355f804b31461072657610376565b80633ccfd60b1461061357806342842e0e1461061d578063438b63001461064657610376565b806318160ddd1161031857806323b872dd116102f257806323b872dd146105475780632677fbae1461057057806328c89b81146105995780632f745c59146105d657610376565b806318160ddd146104c8578063193ebbbc146104f3578063239c70ae1461051c57610376565b8063081812fc11610354578063081812fc1461040c578063095ea7b3146104495780630eea152c1461047257806313faede61461049d57610376565b806301ffc9a71461037b57806302329a29146103b857806306fdde03146103e1575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614024565b610e39565b6040516103af9190614653565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613ff7565b610e7b565b005b3480156103ed57600080fd5b506103f6610ea0565b604051610403919061466e565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906140c7565b610f32565b60405161044091906145a1565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613f6a565b610f78565b005b34801561047e57600080fd5b50610487611090565b6040516104949190614890565b60405180910390f35b3480156104a957600080fd5b506104b26110d7565b6040516104bf9190614890565b60405180910390f35b3480156104d457600080fd5b506104dd6110dd565b6040516104ea9190614890565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613faa565b6110ea565b005b34801561052857600080fd5b50610531611116565b60405161053e9190614890565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613e54565b61111c565b005b34801561057c57600080fd5b5061059760048036038101906105929190613faa565b61117c565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190613de7565b6111a8565b6040516105cd9190614890565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190613f6a565b6111c0565b60405161060a9190614890565b60405180910390f35b61061b611265565b005b34801561062957600080fd5b50610644600480360381019061063f9190613e54565b6112ed565b005b34801561065257600080fd5b5061066d60048036038101906106689190613de7565b61130d565b60405161067a9190614631565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a591906140c7565b6113bb565b005b3480156106b857600080fd5b506106d360048036038101906106ce9190613de7565b6113cd565b6040516106e09190614890565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b91906140c7565b6113e5565b60405161071d9190614890565b60405180910390f35b34801561073257600080fd5b5061074d6004803603810190610748919061407e565b611456565b005b34801561075b57600080fd5b50610764611478565b6040516107719190614653565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c91906140c7565b61148b565b6040516107ae91906145a1565b60405180910390f35b3480156107c357600080fd5b506107cc61153d565b6040516107d9919061466e565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190613de7565b6115cb565b6040516108169190614890565b60405180910390f35b34801561082b57600080fd5b50610834611683565b005b34801561084257600080fd5b5061084b611697565b6040516108589190614890565b60405180910390f35b34801561086d57600080fd5b5061087661169d565b6040516108839190614890565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae91906140c7565b6116e4565b6040516108c091906145a1565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb9190613de7565b611723565b6040516108fd9190614890565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613de7565b61189c565b60405161093a9190614890565b60405180910390f35b34801561094f57600080fd5b506109586118b4565b60405161096591906145a1565b60405180910390f35b34801561097a57600080fd5b506109836118de565b6040516109909190614890565b60405180910390f35b3480156109a557600080fd5b506109ae611925565b6040516109bb919061466e565b60405180910390f35b3480156109d057600080fd5b506109d96119b7565b6040516109e69190614890565b60405180910390f35b3480156109fb57600080fd5b50610a166004803603810190610a1191906140c7565b611bd2565b604051610a2391906145a1565b60405180910390f35b348015610a3857600080fd5b50610a41611c11565b604051610a4e9190614890565b60405180910390f35b610a716004803603810190610a6c91906140c7565b611c58565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190613f2a565b6120bd565b005b348015610aa857600080fd5b50610ac36004803603810190610abe91906140c7565b6120d3565b604051610ad09190614890565b60405180910390f35b348015610ae557600080fd5b50610b006004803603810190610afb91906140c7565b6120f7565b604051610b0d91906145a1565b60405180910390f35b348015610b2257600080fd5b50610b3d6004803603810190610b389190613ea7565b612136565b005b348015610b4b57600080fd5b50610b666004803603810190610b6191906140f4565b612198565b005b348015610b7457600080fd5b50610b8f6004803603810190610b8a9190613de7565b61221e565b604051610b9c9190614653565b60405180910390f35b348015610bb157600080fd5b50610bba6122cd565b604051610bc7919061466e565b60405180910390f35b348015610bdc57600080fd5b50610bf76004803603810190610bf291906140c7565b61235b565b604051610c04919061466e565b60405180910390f35b348015610c1957600080fd5b50610c346004803603810190610c2f9190613de7565b612405565b604051610c419190614653565b60405180910390f35b348015610c5657600080fd5b50610c716004803603810190610c6c91906140c7565b6124b4565b604051610c7f929190614608565b60405180910390f35b348015610c9457600080fd5b50610c9d6124ec565b604051610caa9190614890565b60405180910390f35b348015610cbf57600080fd5b50610cc86124f2565b604051610cd59190614890565b60405180910390f35b348015610cea57600080fd5b50610d056004803603810190610d009190613de7565b6124f8565b604051610d129190614653565b60405180910390f35b348015610d2757600080fd5b50610d426004803603810190610d3d919061407e565b6125a7565b005b348015610d5057600080fd5b50610d6b6004803603810190610d669190613f6a565b6125c9565b005b348015610d7957600080fd5b50610d946004803603810190610d8f9190613faa565b61261d565b005b348015610da257600080fd5b50610dbd6004803603810190610db89190613e14565b612649565b604051610dca9190614653565b60405180910390f35b348015610ddf57600080fd5b50610dfa6004803603810190610df59190613de7565b6126dd565b604051610e079190614890565b60405180910390f35b348015610e1c57600080fd5b50610e376004803603810190610e329190613de7565b6126f5565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e745750610e7382612779565b5b9050919050565b610e836127f3565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610eaf90614b99565b80601f0160208091040260200160405190810160405280929190818152602001828054610edb90614b99565b8015610f285780601f10610efd57610100808354040283529160200191610f28565b820191906000526020600020905b815481529060010190602001808311610f0b57829003601f168201915b5050505050905090565b6000610f3d82612871565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f838261148b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614830565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110136128bc565b73ffffffffffffffffffffffffffffffffffffffff16148061104257506110418161103c6128bc565b612649565b5b611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890614790565b60405180910390fd5b61108b83836128c4565b505050565b6000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600d5481565b6000600880549050905090565b6110f26127f3565b601460006111009190613ae4565b818160149190611111929190613b05565b505050565b60105481565b61112d6111276128bc565b8261297d565b61116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390614870565b60405180910390fd5b611177838383612a12565b505050565b6111846127f3565b601560006111929190613ae4565b8181601591906111a3929190613b05565b505050565b60176020528060005260406000206000915090505481565b60006111cb836115cb565b821061120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614690565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61126d6127f3565b60006112776118b4565b73ffffffffffffffffffffffffffffffffffffffff164760405161129a9061458c565b60006040518083038185875af1925050503d80600081146112d7576040519150601f19603f3d011682016040523d82523d6000602084013e6112dc565b606091505b50509050806112ea57600080fd5b50565b61130883838360405180602001604052806000815250612136565b505050565b6060600061131a836115cb565b905060008167ffffffffffffffff81111561133857611337614d61565b5b6040519080825280602002602001820160405280156113665781602001602082028036833780820191505090505b50905060005b828110156113b05761137e85826111c0565b82828151811061139157611390614d32565b5b60200260200101818152505080806113a890614bfc565b91505061136c565b508092505050919050565b6113c36127f3565b80600d8190555050565b60186020528060005260406000206000915090505481565b60006113ef6110dd565b8210611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614850565b60405180910390fd5b6008828154811061144457611443614d32565b5b90600052602060002001549050919050565b61145e6127f3565b80600b9080519060200190611474929190613ba5565b5050565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614810565b60405180910390fd5b80915050919050565b600b805461154a90614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461157690614b99565b80156115c35780601f10611598576101008083540402835291602001916115c3565b820191906000526020600020905b8154815290600101906020018083116115a657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163390614770565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61168b6127f3565b6116956000612c79565b565b60115481565b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b601581815481106116f457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061172e6110dd565b90506117398361221e565b801561178457506014601760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b806117df575061179383612405565b80156117de57506028601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b5b8061183a57506117ee836124f8565b80156118395750603c601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b5b15611849576000915050611897565b6118516119b7565b61076c61185e91906149ce565b811161186f57600d54915050611897565b6118776119b7565b610ed861188491906149ce565b811161189557600e54915050611897565b505b919050565b60196020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60606001805461193490614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461196090614b99565b80156119ad5780601f10611982576101008083540402835291602001916119ad565b820191906000526020600020905b81548152906001019060200180831161199057829003601f168201915b5050505050905090565b6000806000905060005b601380549050811015611a6c5760176000601383815481106119e6576119e5614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611a5791906149ce565b91508080611a6490614bfc565b9150506119c1565b5060005b601480549050811015611b1b576018600060148381548110611a9557611a94614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b0691906149ce565b91508080611b1390614bfc565b915050611a70565b5060005b601580549050811015611bca576019600060158381548110611b4457611b43614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611bb591906149ce565b91508080611bc290614bfc565b915050611b1f565b508091505090565b60148181548110611be257600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000611c626110dd565b9050611c6d3361221e565b8015611c8c5750601482611c7f611c11565b611c8991906149ce565b11155b80611cbb5750611c9b33612405565b8015611cba5750602882611cad61169d565b611cb791906149ce565b11155b5b80611cea5750611cca336124f8565b8015611ce95750603c82611cdc611090565b611ce691906149ce565b11155b5b15611edd57601260009054906101000a900460ff1615611d0957600080fd5b60008211611d1657600080fd5b601054821115611d2557600080fd5b6115b38282611d3491906149ce565b1115611d3f57600080fd5b611d483361221e565b15611dc857601482611d58611c11565b611d6291906149ce565b1115611d6d57600080fd5b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbc91906149ce565b92505081905550611ed8565b611dd133612405565b15611e5157602882611de161169d565b611deb91906149ce565b1115611df657600080fd5b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e4591906149ce565b92505081905550611ed7565b611e5a336124f8565b15611ed657603c82611e6a611090565b611e7491906149ce565b1115611e7f57600080fd5b81601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ece91906149ce565b925050819055505b5b5b61202c565b611ee56118b4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200357601260009054906101000a900460ff1615611f3157600080fd5b60008211611f3e57600080fd5b601054821115611f4d57600080fd5b611f556119b7565b610ed8611f6291906149ce565b8282611f6e91906149ce565b1115611f7957600080fd5b60fa611f836118de565b10611f8d57600080fd5b611f956119b7565b61076c611fa291906149ce565b8111611fc75781600d54611fb69190614a55565b341015611fc257600080fd5b611ffe565b611fcf6119b7565b610ed8611fdc91906149ce565b8111611ffd5781600e54611ff09190614a55565b341015611ffc57600080fd5b5b5b61202b565b6000821161201057600080fd5b6115b3828261201f91906149ce565b111561202a57600080fd5b5b5b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207b91906149ce565b925050819055506000600190505b8281116120b8576120a53382846120a091906149ce565b612d3f565b80806120b090614bfc565b915050612089565b505050565b6120cf6120c86128bc565b8383612d5d565b5050565b6000601154612710836120e69190614a24565b6120f09190614a55565b9050919050565b6013818154811061210757600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121476121416128bc565b8361297d565b612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90614870565b60405180910390fd5b61219284848484612eca565b50505050565b6121a06127f3565b60006121aa6110dd565b90506010548311156121bb57600080fd5b6115b383826121ca91906149ce565b11156121d557600080fd5b600083116121e257600080fd5b6000600190505b8381116122185761220583828461220091906149ce565b612d3f565b808061221090614bfc565b9150506121e9565b50505050565b600080600090505b6013805490508110156122c2578273ffffffffffffffffffffffffffffffffffffffff166013828154811061225e5761225d614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122af5760019150506122c8565b80806122ba90614bfc565b915050612226565b50600090505b919050565b600c80546122da90614b99565b80601f016020809104026020016040519081016040528092919081815260200182805461230690614b99565b80156123535780601f1061232857610100808354040283529160200191612353565b820191906000526020600020905b81548152906001019060200180831161233657829003601f168201915b505050505081565b606061236682612f26565b6123a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239c906147f0565b60405180910390fd5b60006123af612f92565b905060008151116123cf57604051806020016040528060008152506123fd565b806123d984613024565b600c6040516020016123ed9392919061455b565b6040516020818303038152906040525b915050919050565b600080600090505b6014805490508110156124a9578273ffffffffffffffffffffffffffffffffffffffff166014828154811061244557612444614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124965760019150506124af565b80806124a190614bfc565b91505061240d565b50600090505b919050565b600080601260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166124e3846120d3565b91509150915091565b600e5481565b600f5481565b600080600090505b60158054905081101561259c578273ffffffffffffffffffffffffffffffffffffffff166015828154811061253857612537614d32565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125895760019150506125a2565b808061259490614bfc565b915050612500565b50600090505b919050565b6125af6127f3565b80600c90805190602001906125c5929190613ba5565b5050565b6125d16127f3565b81601260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806011819055505050565b6126256127f3565b601360006126339190613ae4565b818160139190612644929190613b05565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915090505481565b6126fd6127f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561276d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612764906146d0565b60405180910390fd5b61277681612c79565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ec57506127eb82613185565b5b9050919050565b6127fb6128bc565b73ffffffffffffffffffffffffffffffffffffffff166128196118b4565b73ffffffffffffffffffffffffffffffffffffffff161461286f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612866906147d0565b60405180910390fd5b565b61287a81612f26565b6128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090614810565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129378361148b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806129898361148b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129cb57506129ca8185612649565b5b80612a0957508373ffffffffffffffffffffffffffffffffffffffff166129f184610f32565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a328261148b565b73ffffffffffffffffffffffffffffffffffffffff1614612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f906146f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aef90614730565b60405180910390fd5b612b03838383613267565b612b0e6000826128c4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5e9190614aaf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb591906149ce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7483838361337b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d59828260405180602001604052806000815250613380565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc390614750565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ebd9190614653565b60405180910390a3505050565b612ed5848484612a12565b612ee1848484846133db565b612f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f17906146b0565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612fa190614b99565b80601f0160208091040260200160405190810160405280929190818152602001828054612fcd90614b99565b801561301a5780601f10612fef5761010080835404028352916020019161301a565b820191906000526020600020905b815481529060010190602001808311612ffd57829003601f168201915b5050505050905090565b6060600082141561306c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613180565b600082905060005b6000821461309e57808061308790614bfc565b915050600a826130979190614a24565b9150613074565b60008167ffffffffffffffff8111156130ba576130b9614d61565b5b6040519080825280601f01601f1916602001820160405280156130ec5781602001600182028036833780820191505090505b5090505b60008514613179576001826131059190614aaf565b9150600a856131149190614c45565b603061312091906149ce565b60f81b81838151811061313657613135614d32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131729190614a24565b94506130f0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061325057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613260575061325f82613572565b5b9050919050565b6132728383836135dc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132b5576132b0816135e1565b6132f4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132f3576132f2838261362a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133375761333281613797565b613376565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613375576133748282613868565b5b5b505050565b505050565b61338a83836138e7565b61339760008484846133db565b6133d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cd906146b0565b60405180910390fd5b505050565b60006133fc8473ffffffffffffffffffffffffffffffffffffffff16613ac1565b15613565578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134256128bc565b8786866040518563ffffffff1660e01b815260040161344794939291906145bc565b602060405180830381600087803b15801561346157600080fd5b505af192505050801561349257506040513d601f19601f8201168201806040525081019061348f9190614051565b60015b613515573d80600081146134c2576040519150601f19603f3d011682016040523d82523d6000602084013e6134c7565b606091505b5060008151141561350d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613504906146b0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061356a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613637846115cb565b6136419190614aaf565b9050600060076000848152602001908152602001600020549050818114613726576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137ab9190614aaf565b90506000600960008481526020019081526020016000205490506000600883815481106137db576137da614d32565b5b9060005260206000200154905080600883815481106137fd576137fc614d32565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061384c5761384b614d03565b5b6001900381819060005260206000200160009055905550505050565b6000613873836115cb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394e906147b0565b60405180910390fd5b61396081612f26565b156139a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399790614710565b60405180910390fd5b6139ac60008383613267565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139fc91906149ce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613abd6000838361337b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5080546000825590600052602060002090810190613b029190613c2b565b50565b828054828255906000526020600020908101928215613b94579160200282015b82811115613b9357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b25565b5b509050613ba19190613c2b565b5090565b828054613bb190614b99565b90600052602060002090601f016020900481019282613bd35760008555613c1a565b82601f10613bec57805160ff1916838001178555613c1a565b82800160010185558215613c1a579182015b82811115613c19578251825591602001919060010190613bfe565b5b509050613c279190613c2b565b5090565b5b80821115613c44576000816000905550600101613c2c565b5090565b6000613c5b613c56846148d0565b6148ab565b905082815260208101848484011115613c7757613c76614d9f565b5b613c82848285614b57565b509392505050565b6000613c9d613c9884614901565b6148ab565b905082815260208101848484011115613cb957613cb8614d9f565b5b613cc4848285614b57565b509392505050565b600081359050613cdb816151f4565b92915050565b60008083601f840112613cf757613cf6614d95565b5b8235905067ffffffffffffffff811115613d1457613d13614d90565b5b602083019150836020820283011115613d3057613d2f614d9a565b5b9250929050565b600081359050613d468161520b565b92915050565b600081359050613d5b81615222565b92915050565b600081519050613d7081615222565b92915050565b600082601f830112613d8b57613d8a614d95565b5b8135613d9b848260208601613c48565b91505092915050565b600082601f830112613db957613db8614d95565b5b8135613dc9848260208601613c8a565b91505092915050565b600081359050613de181615239565b92915050565b600060208284031215613dfd57613dfc614da9565b5b6000613e0b84828501613ccc565b91505092915050565b60008060408385031215613e2b57613e2a614da9565b5b6000613e3985828601613ccc565b9250506020613e4a85828601613ccc565b9150509250929050565b600080600060608486031215613e6d57613e6c614da9565b5b6000613e7b86828701613ccc565b9350506020613e8c86828701613ccc565b9250506040613e9d86828701613dd2565b9150509250925092565b60008060008060808587031215613ec157613ec0614da9565b5b6000613ecf87828801613ccc565b9450506020613ee087828801613ccc565b9350506040613ef187828801613dd2565b925050606085013567ffffffffffffffff811115613f1257613f11614da4565b5b613f1e87828801613d76565b91505092959194509250565b60008060408385031215613f4157613f40614da9565b5b6000613f4f85828601613ccc565b9250506020613f6085828601613d37565b9150509250929050565b60008060408385031215613f8157613f80614da9565b5b6000613f8f85828601613ccc565b9250506020613fa085828601613dd2565b9150509250929050565b60008060208385031215613fc157613fc0614da9565b5b600083013567ffffffffffffffff811115613fdf57613fde614da4565b5b613feb85828601613ce1565b92509250509250929050565b60006020828403121561400d5761400c614da9565b5b600061401b84828501613d37565b91505092915050565b60006020828403121561403a57614039614da9565b5b600061404884828501613d4c565b91505092915050565b60006020828403121561406757614066614da9565b5b600061407584828501613d61565b91505092915050565b60006020828403121561409457614093614da9565b5b600082013567ffffffffffffffff8111156140b2576140b1614da4565b5b6140be84828501613da4565b91505092915050565b6000602082840312156140dd576140dc614da9565b5b60006140eb84828501613dd2565b91505092915050565b6000806040838503121561410b5761410a614da9565b5b600061411985828601613dd2565b925050602061412a85828601613ccc565b9150509250929050565b6000614140838361453d565b60208301905092915050565b61415581614ae3565b82525050565b600061416682614957565b6141708185614985565b935061417b83614932565b8060005b838110156141ac5781516141938882614134565b975061419e83614978565b92505060018101905061417f565b5085935050505092915050565b6141c281614af5565b82525050565b60006141d382614962565b6141dd8185614996565b93506141ed818560208601614b66565b6141f681614dae565b840191505092915050565b600061420c8261496d565b61421681856149b2565b9350614226818560208601614b66565b61422f81614dae565b840191505092915050565b60006142458261496d565b61424f81856149c3565b935061425f818560208601614b66565b80840191505092915050565b6000815461427881614b99565b61428281866149c3565b9450600182166000811461429d57600181146142ae576142e1565b60ff198316865281860193506142e1565b6142b785614942565b60005b838110156142d9578154818901526001820191506020810190506142ba565b838801955050505b50505092915050565b60006142f7602b836149b2565b915061430282614dbf565b604082019050919050565b600061431a6032836149b2565b915061432582614e0e565b604082019050919050565b600061433d6026836149b2565b915061434882614e5d565b604082019050919050565b60006143606025836149b2565b915061436b82614eac565b604082019050919050565b6000614383601c836149b2565b915061438e82614efb565b602082019050919050565b60006143a66024836149b2565b91506143b182614f24565b604082019050919050565b60006143c96019836149b2565b91506143d482614f73565b602082019050919050565b60006143ec6029836149b2565b91506143f782614f9c565b604082019050919050565b600061440f603e836149b2565b915061441a82614feb565b604082019050919050565b60006144326020836149b2565b915061443d8261503a565b602082019050919050565b60006144556020836149b2565b915061446082615063565b602082019050919050565b6000614478602f836149b2565b91506144838261508c565b604082019050919050565b600061449b6018836149b2565b91506144a6826150db565b602082019050919050565b60006144be6021836149b2565b91506144c982615104565b604082019050919050565b60006144e16000836149a7565b91506144ec82615153565b600082019050919050565b6000614504602c836149b2565b915061450f82615156565b604082019050919050565b6000614527602e836149b2565b9150614532826151a5565b604082019050919050565b61454681614b4d565b82525050565b61455581614b4d565b82525050565b6000614567828661423a565b9150614573828561423a565b915061457f828461426b565b9150819050949350505050565b6000614597826144d4565b9150819050919050565b60006020820190506145b6600083018461414c565b92915050565b60006080820190506145d1600083018761414c565b6145de602083018661414c565b6145eb604083018561454c565b81810360608301526145fd81846141c8565b905095945050505050565b600060408201905061461d600083018561414c565b61462a602083018461454c565b9392505050565b6000602082019050818103600083015261464b818461415b565b905092915050565b600060208201905061466860008301846141b9565b92915050565b600060208201905081810360008301526146888184614201565b905092915050565b600060208201905081810360008301526146a9816142ea565b9050919050565b600060208201905081810360008301526146c98161430d565b9050919050565b600060208201905081810360008301526146e981614330565b9050919050565b6000602082019050818103600083015261470981614353565b9050919050565b6000602082019050818103600083015261472981614376565b9050919050565b6000602082019050818103600083015261474981614399565b9050919050565b60006020820190508181036000830152614769816143bc565b9050919050565b60006020820190508181036000830152614789816143df565b9050919050565b600060208201905081810360008301526147a981614402565b9050919050565b600060208201905081810360008301526147c981614425565b9050919050565b600060208201905081810360008301526147e981614448565b9050919050565b600060208201905081810360008301526148098161446b565b9050919050565b600060208201905081810360008301526148298161448e565b9050919050565b60006020820190508181036000830152614849816144b1565b9050919050565b60006020820190508181036000830152614869816144f7565b9050919050565b600060208201905081810360008301526148898161451a565b9050919050565b60006020820190506148a5600083018461454c565b92915050565b60006148b56148c6565b90506148c18282614bcb565b919050565b6000604051905090565b600067ffffffffffffffff8211156148eb576148ea614d61565b5b6148f482614dae565b9050602081019050919050565b600067ffffffffffffffff82111561491c5761491b614d61565b5b61492582614dae565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d982614b4d565b91506149e483614b4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1957614a18614c76565b5b828201905092915050565b6000614a2f82614b4d565b9150614a3a83614b4d565b925082614a4a57614a49614ca5565b5b828204905092915050565b6000614a6082614b4d565b9150614a6b83614b4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614aa457614aa3614c76565b5b828202905092915050565b6000614aba82614b4d565b9150614ac583614b4d565b925082821015614ad857614ad7614c76565b5b828203905092915050565b6000614aee82614b2d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b84578082015181840152602081019050614b69565b83811115614b93576000848401525b50505050565b60006002820490506001821680614bb157607f821691505b60208210811415614bc557614bc4614cd4565b5b50919050565b614bd482614dae565b810181811067ffffffffffffffff82111715614bf357614bf2614d61565b5b80604052505050565b6000614c0782614b4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3a57614c39614c76565b5b600182019050919050565b6000614c5082614b4d565b9150614c5b83614b4d565b925082614c6b57614c6a614ca5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6151fd81614ae3565b811461520857600080fd5b50565b61521481614af5565b811461521f57600080fd5b50565b61522b81614b01565b811461523657600080fd5b50565b61524281614b4d565b811461524d57600080fd5b5056fea26469706673582212208fd2844646ffcd0b872a58e18902f59afed1c68b39a2c6c367b2800cc95d144c64736f6c63430008070033

Deployed Bytecode Sourcemap

46269:8302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51882:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53665:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26777:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28290:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27807:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50489:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46421:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40683:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53912:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46542:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28990:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54080:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46858:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40351:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54245:145;;;:::i;:::-;;29397:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51135:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53339:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46915:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40873:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53433:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46617:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26488:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46353:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26219:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5306:103;;;;;;;;;;;;;:::i;:::-;;46580:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50364:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46765:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52395:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46972:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4658:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50130:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26946:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50610:519;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46720:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50239:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47395:1926;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28533:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52253:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46675:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29653:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52987:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49328:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46379:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51478:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49596:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52074:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;46460:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46506:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49864:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53537:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54396:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53744:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28759:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46809:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5564:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51882:185;51977:4;52011:10;51996:25;;:11;:25;;;;:65;;;;52025:36;52049:11;52025:23;:36::i;:::-;51996:65;51989:72;;51882:185;;;:::o;53665:73::-;4544:13;:11;:13::i;:::-;53726:6:::1;53717;;:15;;;;;;;;;;;;;;;;;;53665:73:::0;:::o;26777:100::-;26831:13;26864:5;26857:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26777:100;:::o;28290:171::-;28366:7;28386:23;28401:7;28386:14;:23::i;:::-;28429:15;:24;28445:7;28429:24;;;;;;;;;;;;;;;;;;;;;28422:31;;28290:171;;;:::o;27807:417::-;27888:13;27904:23;27919:7;27904:14;:23::i;:::-;27888:39;;27952:5;27946:11;;:2;:11;;;;27938:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28046:5;28030:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28055:37;28072:5;28079:12;:10;:12::i;:::-;28055:16;:37::i;:::-;28030:62;28008:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28195:21;28204:2;28208:7;28195:8;:21::i;:::-;27877:347;27807:417;;:::o;50489:115::-;50541:7;50568:16;:28;50585:10;50568:28;;;;;;;;;;;;;;;;50561:35;;50489:115;:::o;46421:34::-;;;;:::o;40683:113::-;40744:7;40771:10;:17;;;;40764:24;;40683:113;:::o;53912:162::-;4544:13;:11;:13::i;:::-;54006:23:::1;;53999:30;;;;:::i;:::-;54062:6;;54036:23;:32;;;;;;;:::i;:::-;;53912:162:::0;;:::o;46542:33::-;;;;:::o;28990:336::-;29185:41;29204:12;:10;:12::i;:::-;29218:7;29185:18;:41::i;:::-;29177:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29290:28;29300:4;29306:2;29310:7;29290:9;:28::i;:::-;28990:336;;;:::o;54080:159::-;4544:13;:11;:13::i;:::-;54173:22:::1;;54166:29;;;;:::i;:::-;54227:6;;54202:22;:31;;;;;;;:::i;:::-;;54080:159:::0;;:::o;46858:52::-;;;;;;;;;;;;;;;;;:::o;40351:256::-;40448:7;40484:23;40501:5;40484:16;:23::i;:::-;40476:5;:31;40468:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40573:12;:19;40586:5;40573:19;;;;;;;;;;;;;;;:26;40593:5;40573:26;;;;;;;;;;;;40566:33;;40351:256;;;;:::o;54245:145::-;4544:13;:11;:13::i;:::-;54298:7:::1;54319;:5;:7::i;:::-;54311:21;;54340;54311:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54297:69;;;54381:2;54373:11;;;::::0;::::1;;54290:100;54245:145::o:0;29397:185::-;29535:39;29552:4;29558:2;29562:7;29535:39;;;;;;;;;;;;:16;:39::i;:::-;29397:185;;;:::o;51135:333::-;51195:16;51223:23;51249:17;51259:6;51249:9;:17::i;:::-;51223:43;;51273:25;51315:15;51301:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51273:58;;51343:9;51338:103;51358:15;51354:1;:19;51338:103;;;51403:30;51423:6;51431:1;51403:19;:30::i;:::-;51389:8;51398:1;51389:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;51375:3;;;;;:::i;:::-;;;;51338:103;;;;51454:8;51447:15;;;;51135:333;;;:::o;53339:86::-;4544:13;:11;:13::i;:::-;53409:8:::1;53402:4;:15;;;;53339:86:::0;:::o;46915:52::-;;;;;;;;;;;;;;;;;:::o;40873:233::-;40948:7;40984:30;:28;:30::i;:::-;40976:5;:38;40968:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41081:10;41092:5;41081:17;;;;;;;;:::i;:::-;;;;;;;;;;41074:24;;40873:233;;;:::o;53433:98::-;4544:13;:11;:13::i;:::-;53514:11:::1;53504:7;:21;;;;;;;;;;;;:::i;:::-;;53433:98:::0;:::o;46617:25::-;;;;;;;;;;;;;:::o;26488:222::-;26560:7;26580:13;26596:7;:16;26604:7;26596:16;;;;;;;;;;;;;;;;;;;;;26580:32;;26648:1;26631:19;;:5;:19;;;;26623:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26697:5;26690:12;;;26488:222;;;:::o;46353:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26219:207::-;26291:7;26336:1;26319:19;;:5;:19;;;;26311:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26402:9;:16;26412:5;26402:16;;;;;;;;;;;;;;;;26395:23;;26219:207;;;:::o;5306:103::-;4544:13;:11;:13::i;:::-;5371:30:::1;5398:1;5371:18;:30::i;:::-;5306:103::o:0;46580:32::-;;;;:::o;50364:117::-;50417:7;50444:17;:29;50462:10;50444:29;;;;;;;;;;;;;;;;50437:36;;50364:117;:::o;46765:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52395:568::-;52449:7;52464:14;52481:13;:11;:13::i;:::-;52464:30;;52505:36;52533:7;52505:27;:36::i;:::-;:71;;;;;52574:2;52545:17;:26;52563:7;52545:26;;;;;;;;;;;;;;;;:31;52505:71;:146;;;;52580:36;52608:7;52580:27;:36::i;:::-;:71;;;;;52649:2;52620:17;:26;52638:7;52620:26;;;;;;;;;;;;;;;;:31;52580:71;52505:146;:219;;;;52655:35;52682:7;52655:26;:35::i;:::-;:69;;;;;52722:2;52694:16;:25;52711:7;52694:25;;;;;;;;;;;;;;;;:30;52655:69;52505:219;52501:457;;;52741:1;52734:8;;;;;52501:457;52790:27;:25;:27::i;:::-;52783:4;:34;;;;:::i;:::-;52773:6;:44;52769:182;;52836:4;;52829:11;;;;;52769:182;52883:27;:25;:27::i;:::-;52876:4;:34;;;;:::i;:::-;52866:6;:44;52863:88;;52929:12;;52922:19;;;;;52863:88;52457:506;52395:568;;;;:::o;46972:51::-;;;;;;;;;;;;;;;;;:::o;4658:87::-;4704:7;4731:6;;;;;;;;;;;4724:13;;4658:87;:::o;50130:101::-;50175:7;50202:9;:21;50212:10;50202:21;;;;;;;;;;;;;;;;50195:28;;50130:101;:::o;26946:104::-;27002:13;27035:7;27028:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26946:104;:::o;50610:519::-;50667:7;50683:11;50697:1;50683:15;;50709:9;50705:131;50726:23;:30;;;;50724:1;:32;50705:131;;;50783:17;:45;50801:23;50825:1;50801:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50783:45;;;;;;;;;;;;;;;;50777:3;:51;;;;:::i;:::-;50771:57;;50758:3;;;;;:::i;:::-;;;;50705:131;;;;50846:9;50842:131;50863:23;:30;;;;50861:1;:32;50842:131;;;50920:17;:45;50938:23;50962:1;50938:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50920:45;;;;;;;;;;;;;;;;50914:3;:51;;;;:::i;:::-;50908:57;;50895:3;;;;;:::i;:::-;;;;50842:131;;;;50983:9;50979:128;51000:22;:29;;;;50998:1;:31;50979:128;;;51056:16;:43;51073:22;51096:1;51073:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51056:43;;;;;;;;;;;;;;;;51050:3;:49;;;;:::i;:::-;51044:55;;51031:3;;;;;:::i;:::-;;;;50979:128;;;;51120:3;51113:10;;;50610:519;:::o;46720:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50239:117::-;50292:7;50319:17;:29;50337:10;50319:29;;;;;;;;;;;;;;;;50312:36;;50239:117;:::o;47395:1926::-;47452:14;47469:13;:11;:13::i;:::-;47452:30;;47494:39;47522:10;47494:27;:39::i;:::-;:85;;;;;47577:2;47562:11;47537:22;:20;:22::i;:::-;:36;;;;:::i;:::-;:42;;47494:85;47493:178;;;;47585:39;47613:10;47585:27;:39::i;:::-;:85;;;;;47668:2;47653:11;47628:22;:20;:22::i;:::-;:36;;;;:::i;:::-;:42;;47585:85;47493:178;:267;;;;47676:38;47703:10;47676:26;:38::i;:::-;:83;;;;;47757:2;47742:11;47718:21;:19;:21::i;:::-;:35;;;;:::i;:::-;:41;;47676:83;47493:267;47489:1681;;;47779:6;;;;;;;;;;;47778:7;47770:16;;;;;;47817:1;47803:11;:15;47795:24;;;;;;47851:13;;47836:11;:28;;47828:37;;;;;;47906:4;47891:11;47882:6;:20;;;;:::i;:::-;:28;;47874:37;;;;;;47924:39;47952:10;47924:27;:39::i;:::-;47920:535;;;48023:2;48008:11;47983:22;:20;:22::i;:::-;:36;;;;:::i;:::-;:42;;47975:51;;;;;;48070:11;48037:17;:29;48055:10;48037:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;47920:535;;;48108:39;48136:10;48108:27;:39::i;:::-;48104:351;;;48207:2;48192:11;48167:22;:20;:22::i;:::-;:36;;;;:::i;:::-;:42;;48159:51;;;;;;48254:11;48221:17;:29;48239:10;48221:29;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;48104:351;;;48291:38;48318:10;48291:26;:38::i;:::-;48288:167;;;48388:2;48373:11;48349:21;:19;:21::i;:::-;:35;;;;:::i;:::-;:41;;48341:50;;;;;;48434:11;48402:16;:28;48419:10;48402:28;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;48288:167;48104:351;47920:535;47489:1681;;;48499:7;:5;:7::i;:::-;48485:21;;:10;:21;;;48481:682;;48532:6;;;;;;;;;;;48531:7;48523:16;;;;;;48576:1;48562:11;:15;48554:24;;;;;;48616:13;;48601:11;:28;;48593:37;;;;;;48684:27;:25;:27::i;:::-;48677:4;:34;;;;:::i;:::-;48662:11;48653:6;:20;;;;:::i;:::-;:58;;48645:67;;;;;;48752:3;48735:14;:12;:14::i;:::-;:20;48727:29;;;;;;48792:27;:25;:27::i;:::-;48785:4;:34;;;;:::i;:::-;48775:6;:44;48771:270;;48865:11;48858:4;;:18;;;;:::i;:::-;48845:9;:31;;48837:40;;;;;;48771:270;;;48932:27;:25;:27::i;:::-;48925:4;:34;;;;:::i;:::-;48915:6;:44;48912:129;;49013:11;48998:12;;:26;;;;:::i;:::-;48985:9;:39;;48977:48;;;;;;48912:129;48771:270;48481:682;;;49099:1;49085:11;:15;49077:24;;;;;;49146:4;49131:11;49122:6;:20;;;;:::i;:::-;:28;;49114:37;;;;;;48481:682;47489:1681;49203:11;49178:9;:21;49188:10;49178:21;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;49228:9;49240:1;49228:13;;49223:93;49248:11;49243:1;:16;49223:93;;49275:33;49285:10;49306:1;49297:6;:10;;;;:::i;:::-;49275:9;:33::i;:::-;49261:3;;;;;:::i;:::-;;;;49223:93;;;;47445:1876;47395:1926;:::o;28533:155::-;28628:52;28647:12;:10;:12::i;:::-;28661:8;28671;28628:18;:52::i;:::-;28533:155;;:::o;52253:136::-;52319:7;52364:17;;52355:5;52342:10;:18;;;;:::i;:::-;52341:40;;;;:::i;:::-;52334:47;;52253:136;;;:::o;46675:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29653:323::-;29827:41;29846:12;:10;:12::i;:::-;29860:7;29827:18;:41::i;:::-;29819:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29930:38;29944:4;29950:2;29954:7;29963:4;29930:13;:38::i;:::-;29653:323;;;;:::o;52987:342::-;4544:13;:11;:13::i;:::-;53072:14:::1;53089:13;:11;:13::i;:::-;53072:30;;53130:13;;53119:7;:24;;53111:33;;;::::0;::::1;;53181:4;53170:7;53161:6;:16;;;;:::i;:::-;:24;;53153:33;;;::::0;::::1;;53213:1;53203:7;:11;53195:20;;;::::0;::::1;;53229:9;53241:1;53229:13;;53224:98;53249:7;53244:1;:12;53224:98;;53274:38;53284:15;53310:1;53301:6;:10;;;;:::i;:::-;53274:9;:38::i;:::-;53258:3;;;;;:::i;:::-;;;;53224:98;;;;53063:266;52987:342:::0;;:::o;49328:261::-;49401:4;49417:9;49429:1;49417:13;;49413:152;49434:23;:30;;;;49432:1;:32;49413:152;;;49514:5;49484:35;;:23;49508:1;49484:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:35;;;49481:77;;;49542:4;49535:11;;;;;49481:77;49466:3;;;;;:::i;:::-;;;;49413:152;;;;49578:5;49571:12;;49328:261;;;;:::o;46379:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51478:398::-;51551:13;51592:16;51600:7;51592;:16::i;:::-;51576:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51682:28;51713:10;:8;:10::i;:::-;51682:41;;51768:1;51743:14;51737:28;:32;:133;;;;;;;;;;;;;;;;;51805:14;51821:18;:7;:16;:18::i;:::-;51841:13;51788:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51737:133;51730:140;;;51478:398;;;:::o;49596:261::-;49669:4;49685:9;49697:1;49685:13;;49681:152;49702:23;:30;;;;49700:1;:32;49681:152;;;49782:5;49752:35;;:23;49776:1;49752:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:35;;;49749:77;;;49810:4;49803:11;;;;;49749:77;49734:3;;;;;:::i;:::-;;;;49681:152;;;;49846:5;49839:12;;49596:261;;;;:::o;52074:173::-;52138:16;52156:21;52192:15;;;;;;;;;;;52209:28;52226:10;52209:16;:28::i;:::-;52185:53;;;;52074:173;;;:::o;46460:41::-;;;;:::o;46506:31::-;;;;:::o;49864:258::-;49936:4;49952:9;49964:1;49952:13;;49948:150;49969:22;:29;;;;49967:1;:31;49948:150;;;50047:5;50018:34;;:22;50041:1;50018:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;;50015:76;;;50075:4;50068:11;;;;;50015:76;50000:3;;;;;:::i;:::-;;;;49948:150;;;;50111:5;50104:12;;49864:258;;;;:::o;53537:122::-;4544:13;:11;:13::i;:::-;53636:17:::1;53620:13;:33;;;;;;;;;;;;:::i;:::-;;53537:122:::0;:::o;54396:172::-;4544:13;:11;:13::i;:::-;54508:9:::1;54490:15;;:27;;;;;;;;;;;;;;;;;;54544:18;54524:17;:38;;;;54396:172:::0;;:::o;53744:162::-;4544:13;:11;:13::i;:::-;53838:23:::1;;53831:30;;;;:::i;:::-;53894:6;;53868:23;:32;;;;;;;:::i;:::-;;53744:162:::0;;:::o;28759:164::-;28856:4;28880:18;:25;28899:5;28880:25;;;;;;;;;;;;;;;:35;28906:8;28880:35;;;;;;;;;;;;;;;;;;;;;;;;;28873:42;;28759:164;;;;:::o;46809:44::-;;;;;;;;;;;;;;;;;:::o;5564:201::-;4544:13;:11;:13::i;:::-;5673:1:::1;5653:22;;:8;:22;;;;5645:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5729:28;5748:8;5729:18;:28::i;:::-;5564:201:::0;:::o;40043:224::-;40145:4;40184:35;40169:50;;;:11;:50;;;;:90;;;;40223:36;40247:11;40223:23;:36::i;:::-;40169:90;40162:97;;40043:224;;;:::o;4823:132::-;4898:12;:10;:12::i;:::-;4887:23;;:7;:5;:7::i;:::-;:23;;;4879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4823:132::o;36265:135::-;36347:16;36355:7;36347;:16::i;:::-;36339:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36265:135;:::o;3209:98::-;3262:7;3289:10;3282:17;;3209:98;:::o;35544:174::-;35646:2;35619:15;:24;35635:7;35619:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35702:7;35698:2;35664:46;;35673:23;35688:7;35673:14;:23::i;:::-;35664:46;;;;;;;;;;;;35544:174;;:::o;31777:264::-;31870:4;31887:13;31903:23;31918:7;31903:14;:23::i;:::-;31887:39;;31956:5;31945:16;;:7;:16;;;:52;;;;31965:32;31982:5;31989:7;31965:16;:32::i;:::-;31945:52;:87;;;;32025:7;32001:31;;:20;32013:7;32001:11;:20::i;:::-;:31;;;31945:87;31937:96;;;31777:264;;;;:::o;34800:625::-;34959:4;34932:31;;:23;34947:7;34932:14;:23::i;:::-;:31;;;34924:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35038:1;35024:16;;:2;:16;;;;35016:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35094:39;35115:4;35121:2;35125:7;35094:20;:39::i;:::-;35198:29;35215:1;35219:7;35198:8;:29::i;:::-;35259:1;35240:9;:15;35250:4;35240:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35288:1;35271:9;:13;35281:2;35271:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35319:2;35300:7;:16;35308:7;35300:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35358:7;35354:2;35339:27;;35348:4;35339:27;;;;;;;;;;;;35379:38;35399:4;35405:2;35409:7;35379:19;:38::i;:::-;34800:625;;;:::o;5925:191::-;5999:16;6018:6;;;;;;;;;;;5999:25;;6044:8;6035:6;;:17;;;;;;;;;;;;;;;;;;6099:8;6068:40;;6089:8;6068:40;;;;;;;;;;;;5988:128;5925:191;:::o;32383:110::-;32459:26;32469:2;32473:7;32459:26;;;;;;;;;;;;:9;:26::i;:::-;32383:110;;:::o;35861:315::-;36016:8;36007:17;;:5;:17;;;;35999:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36103:8;36065:18;:25;36084:5;36065:25;;;;;;;;;;;;;;;:35;36091:8;36065:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36149:8;36127:41;;36142:5;36127:41;;;36159:8;36127:41;;;;;;:::i;:::-;;;;;;;;35861:315;;;:::o;30857:313::-;31013:28;31023:4;31029:2;31033:7;31013:9;:28::i;:::-;31060:47;31083:4;31089:2;31093:7;31102:4;31060:22;:47::i;:::-;31052:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30857:313;;;;:::o;31483:127::-;31548:4;31600:1;31572:30;;:7;:16;31580:7;31572:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31565:37;;31483:127;;;:::o;47274:102::-;47334:13;47363:7;47356:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47274:102;:::o;463:723::-;519:13;749:1;740:5;:10;736:53;;;767:10;;;;;;;;;;;;;;;;;;;;;736:53;799:12;814:5;799:20;;830:14;855:78;870:1;862:4;:9;855:78;;888:8;;;;;:::i;:::-;;;;919:2;911:10;;;;;:::i;:::-;;;855:78;;;943:19;975:6;965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;943:39;;993:154;1009:1;1000:5;:10;993:154;;1037:1;1027:11;;;;;:::i;:::-;;;1104:2;1096:5;:10;;;;:::i;:::-;1083:2;:24;;;;:::i;:::-;1070:39;;1053:6;1060;1053:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1133:2;1124:11;;;;;:::i;:::-;;;993:154;;;1171:6;1157:21;;;;;463:723;;;;:::o;25850:305::-;25952:4;26004:25;25989:40;;;:11;:40;;;;:105;;;;26061:33;26046:48;;;:11;:48;;;;25989:105;:158;;;;26111:36;26135:11;26111:23;:36::i;:::-;25989:158;25969:178;;25850:305;;;:::o;41719:589::-;41863:45;41890:4;41896:2;41900:7;41863:26;:45::i;:::-;41941:1;41925:18;;:4;:18;;;41921:187;;;41960:40;41992:7;41960:31;:40::i;:::-;41921:187;;;42030:2;42022:10;;:4;:10;;;42018:90;;42049:47;42082:4;42088:7;42049:32;:47::i;:::-;42018:90;41921:187;42136:1;42122:16;;:2;:16;;;42118:183;;;42155:45;42192:7;42155:36;:45::i;:::-;42118:183;;;42228:4;42222:10;;:2;:10;;;42218:83;;42249:40;42277:2;42281:7;42249:27;:40::i;:::-;42218:83;42118:183;41719:589;;;:::o;38900:125::-;;;;:::o;32720:319::-;32849:18;32855:2;32859:7;32849:5;:18::i;:::-;32900:53;32931:1;32935:2;32939:7;32948:4;32900:22;:53::i;:::-;32878:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32720:319;;;:::o;36964:853::-;37118:4;37139:15;:2;:13;;;:15::i;:::-;37135:675;;;37191:2;37175:36;;;37212:12;:10;:12::i;:::-;37226:4;37232:7;37241:4;37175:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37171:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37433:1;37416:6;:13;:18;37412:328;;;37459:60;;;;;;;;;;:::i;:::-;;;;;;;;37412:328;37690:6;37684:13;37675:6;37671:2;37667:15;37660:38;37171:584;37307:41;;;37297:51;;;:6;:51;;;;37290:58;;;;;37135:675;37794:4;37787:11;;36964:853;;;;;;;:::o;17512:157::-;17597:4;17636:25;17621:40;;;:11;:40;;;;17614:47;;17512:157;;;:::o;38389:126::-;;;;:::o;43031:164::-;43135:10;:17;;;;43108:15;:24;43124:7;43108:24;;;;;;;;;;;:44;;;;43163:10;43179:7;43163:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43031:164;:::o;43822:988::-;44088:22;44138:1;44113:22;44130:4;44113:16;:22::i;:::-;:26;;;;:::i;:::-;44088:51;;44150:18;44171:17;:26;44189:7;44171:26;;;;;;;;;;;;44150:47;;44318:14;44304:10;:28;44300:328;;44349:19;44371:12;:18;44384:4;44371:18;;;;;;;;;;;;;;;:34;44390:14;44371:34;;;;;;;;;;;;44349:56;;44455:11;44422:12;:18;44435:4;44422:18;;;;;;;;;;;;;;;:30;44441:10;44422:30;;;;;;;;;;;:44;;;;44572:10;44539:17;:30;44557:11;44539:30;;;;;;;;;;;:43;;;;44334:294;44300:328;44724:17;:26;44742:7;44724:26;;;;;;;;;;;44717:33;;;44768:12;:18;44781:4;44768:18;;;;;;;;;;;;;;;:34;44787:14;44768:34;;;;;;;;;;;44761:41;;;43903:907;;43822:988;;:::o;45105:1079::-;45358:22;45403:1;45383:10;:17;;;;:21;;;;:::i;:::-;45358:46;;45415:18;45436:15;:24;45452:7;45436:24;;;;;;;;;;;;45415:45;;45787:19;45809:10;45820:14;45809:26;;;;;;;;:::i;:::-;;;;;;;;;;45787:48;;45873:11;45848:10;45859;45848:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45984:10;45953:15;:28;45969:11;45953:28;;;;;;;;;;;:41;;;;46125:15;:24;46141:7;46125:24;;;;;;;;;;;46118:31;;;46160:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45176:1008;;;45105:1079;:::o;42609:221::-;42694:14;42711:20;42728:2;42711:16;:20::i;:::-;42694:37;;42769:7;42742:12;:16;42755:2;42742:16;;;;;;;;;;;;;;;:24;42759:6;42742:24;;;;;;;;;;;:34;;;;42816:6;42787:17;:26;42805:7;42787:26;;;;;;;;;;;:35;;;;42683:147;42609:221;;:::o;33375:439::-;33469:1;33455:16;;:2;:16;;;;33447:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33528:16;33536:7;33528;:16::i;:::-;33527:17;33519:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33590:45;33619:1;33623:2;33627:7;33590:20;:45::i;:::-;33665:1;33648:9;:13;33658:2;33648:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33696:2;33677:7;:16;33685:7;33677:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33741:7;33737:2;33716:33;;33733:1;33716:33;;;;;;;;;;;;33762:44;33790:1;33794:2;33798:7;33762:19;:44::i;:::-;33375:439;;:::o;7356:326::-;7416:4;7673:1;7651:7;:19;;;:23;7644:30;;7356:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:323::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:50;7074:7;7065:6;7054:9;7050:22;7032:50;:::i;:::-;7022:60;;6978:114;6776:323;;;;:::o;7105:327::-;7163:6;7212:2;7200:9;7191:7;7187:23;7183:32;7180:119;;;7218:79;;:::i;:::-;7180:119;7338:1;7363:52;7407:7;7398:6;7387:9;7383:22;7363:52;:::i;:::-;7353:62;;7309:116;7105:327;;;;:::o;7438:349::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:63;7762:7;7753:6;7742:9;7738:22;7707:63;:::i;:::-;7697:73;;7653:127;7438:349;;;;:::o;7793:509::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8222:63;8277:7;8268:6;8257:9;8253:22;8222:63;:::i;:::-;8212:73;;8008:287;7793:509;;;;:::o;8308:329::-;8367:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:119;;;8422:79;;:::i;:::-;8384:119;8542:1;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8513:117;8308:329;;;;:::o;8643:474::-;8711:6;8719;8768:2;8756:9;8747:7;8743:23;8739:32;8736:119;;;8774:79;;:::i;:::-;8736:119;8894:1;8919:53;8964:7;8955:6;8944:9;8940:22;8919:53;:::i;:::-;8909:63;;8865:117;9021:2;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8992:118;8643:474;;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9462:732::-;9581:3;9610:54;9658:5;9610:54;:::i;:::-;9680:86;9759:6;9754:3;9680:86;:::i;:::-;9673:93;;9790:56;9840:5;9790:56;:::i;:::-;9869:7;9900:1;9885:284;9910:6;9907:1;9904:13;9885:284;;;9986:6;9980:13;10013:63;10072:3;10057:13;10013:63;:::i;:::-;10006:70;;10099:60;10152:6;10099:60;:::i;:::-;10089:70;;9945:224;9932:1;9929;9925:9;9920:14;;9885:284;;;9889:14;10185:3;10178:10;;9586:608;;;9462:732;;;;:::o;10200:109::-;10281:21;10296:5;10281:21;:::i;:::-;10276:3;10269:34;10200:109;;:::o;10315:360::-;10401:3;10429:38;10461:5;10429:38;:::i;:::-;10483:70;10546:6;10541:3;10483:70;:::i;:::-;10476:77;;10562:52;10607:6;10602:3;10595:4;10588:5;10584:16;10562:52;:::i;:::-;10639:29;10661:6;10639:29;:::i;:::-;10634:3;10630:39;10623:46;;10405:270;10315:360;;;;:::o;10681:364::-;10769:3;10797:39;10830:5;10797:39;:::i;:::-;10852:71;10916:6;10911:3;10852:71;:::i;:::-;10845:78;;10932:52;10977:6;10972:3;10965:4;10958:5;10954:16;10932:52;:::i;:::-;11009:29;11031:6;11009:29;:::i;:::-;11004:3;11000:39;10993:46;;10773:272;10681:364;;;;:::o;11051:377::-;11157:3;11185:39;11218:5;11185:39;:::i;:::-;11240:89;11322:6;11317:3;11240:89;:::i;:::-;11233:96;;11338:52;11383:6;11378:3;11371:4;11364:5;11360:16;11338:52;:::i;:::-;11415:6;11410:3;11406:16;11399:23;;11161:267;11051:377;;;;:::o;11458:845::-;11561:3;11598:5;11592:12;11627:36;11653:9;11627:36;:::i;:::-;11679:89;11761:6;11756:3;11679:89;:::i;:::-;11672:96;;11799:1;11788:9;11784:17;11815:1;11810:137;;;;11961:1;11956:341;;;;11777:520;;11810:137;11894:4;11890:9;11879;11875:25;11870:3;11863:38;11930:6;11925:3;11921:16;11914:23;;11810:137;;11956:341;12023:38;12055:5;12023:38;:::i;:::-;12083:1;12097:154;12111:6;12108:1;12105:13;12097:154;;;12185:7;12179:14;12175:1;12170:3;12166:11;12159:35;12235:1;12226:7;12222:15;12211:26;;12133:4;12130:1;12126:12;12121:17;;12097:154;;;12280:6;12275:3;12271:16;12264:23;;11963:334;;11777:520;;11565:738;;11458:845;;;;:::o;12309:366::-;12451:3;12472:67;12536:2;12531:3;12472:67;:::i;:::-;12465:74;;12548:93;12637:3;12548:93;:::i;:::-;12666:2;12661:3;12657:12;12650:19;;12309:366;;;:::o;12681:::-;12823:3;12844:67;12908:2;12903:3;12844:67;:::i;:::-;12837:74;;12920:93;13009:3;12920:93;:::i;:::-;13038:2;13033:3;13029:12;13022:19;;12681:366;;;:::o;13053:::-;13195:3;13216:67;13280:2;13275:3;13216:67;:::i;:::-;13209:74;;13292:93;13381:3;13292:93;:::i;:::-;13410:2;13405:3;13401:12;13394:19;;13053:366;;;:::o;13425:::-;13567:3;13588:67;13652:2;13647:3;13588:67;:::i;:::-;13581:74;;13664:93;13753:3;13664:93;:::i;:::-;13782:2;13777:3;13773:12;13766:19;;13425:366;;;:::o;13797:::-;13939:3;13960:67;14024:2;14019:3;13960:67;:::i;:::-;13953:74;;14036:93;14125:3;14036:93;:::i;:::-;14154:2;14149:3;14145:12;14138:19;;13797:366;;;:::o;14169:::-;14311:3;14332:67;14396:2;14391:3;14332:67;:::i;:::-;14325:74;;14408:93;14497:3;14408:93;:::i;:::-;14526:2;14521:3;14517:12;14510:19;;14169:366;;;:::o;14541:::-;14683:3;14704:67;14768:2;14763:3;14704:67;:::i;:::-;14697:74;;14780:93;14869:3;14780:93;:::i;:::-;14898:2;14893:3;14889:12;14882:19;;14541:366;;;:::o;14913:::-;15055:3;15076:67;15140:2;15135:3;15076:67;:::i;:::-;15069:74;;15152:93;15241:3;15152:93;:::i;:::-;15270:2;15265:3;15261:12;15254:19;;14913:366;;;:::o;15285:::-;15427:3;15448:67;15512:2;15507:3;15448:67;:::i;:::-;15441:74;;15524:93;15613:3;15524:93;:::i;:::-;15642:2;15637:3;15633:12;15626:19;;15285:366;;;:::o;15657:::-;15799:3;15820:67;15884:2;15879:3;15820:67;:::i;:::-;15813:74;;15896:93;15985:3;15896:93;:::i;:::-;16014:2;16009:3;16005:12;15998:19;;15657:366;;;:::o;16029:::-;16171:3;16192:67;16256:2;16251:3;16192:67;:::i;:::-;16185:74;;16268:93;16357:3;16268:93;:::i;:::-;16386:2;16381:3;16377:12;16370:19;;16029:366;;;:::o;16401:::-;16543:3;16564:67;16628:2;16623:3;16564:67;:::i;:::-;16557:74;;16640:93;16729:3;16640:93;:::i;:::-;16758:2;16753:3;16749:12;16742:19;;16401:366;;;:::o;16773:::-;16915:3;16936:67;17000:2;16995:3;16936:67;:::i;:::-;16929:74;;17012:93;17101:3;17012:93;:::i;:::-;17130:2;17125:3;17121:12;17114:19;;16773:366;;;:::o;17145:::-;17287:3;17308:67;17372:2;17367:3;17308:67;:::i;:::-;17301:74;;17384:93;17473:3;17384:93;:::i;:::-;17502:2;17497:3;17493:12;17486:19;;17145:366;;;:::o;17517:398::-;17676:3;17697:83;17778:1;17773:3;17697:83;:::i;:::-;17690:90;;17789:93;17878:3;17789:93;:::i;:::-;17907:1;17902:3;17898:11;17891:18;;17517:398;;;:::o;17921:366::-;18063:3;18084:67;18148:2;18143:3;18084:67;:::i;:::-;18077:74;;18160:93;18249:3;18160:93;:::i;:::-;18278:2;18273:3;18269:12;18262:19;;17921:366;;;:::o;18293:::-;18435:3;18456:67;18520:2;18515:3;18456:67;:::i;:::-;18449:74;;18532:93;18621:3;18532:93;:::i;:::-;18650:2;18645:3;18641:12;18634:19;;18293:366;;;:::o;18665:108::-;18742:24;18760:5;18742:24;:::i;:::-;18737:3;18730:37;18665:108;;:::o;18779:118::-;18866:24;18884:5;18866:24;:::i;:::-;18861:3;18854:37;18779:118;;:::o;18903:589::-;19128:3;19150:95;19241:3;19232:6;19150:95;:::i;:::-;19143:102;;19262:95;19353:3;19344:6;19262:95;:::i;:::-;19255:102;;19374:92;19462:3;19453:6;19374:92;:::i;:::-;19367:99;;19483:3;19476:10;;18903:589;;;;;;:::o;19498:379::-;19682:3;19704:147;19847:3;19704:147;:::i;:::-;19697:154;;19868:3;19861:10;;19498:379;;;:::o;19883:222::-;19976:4;20014:2;20003:9;19999:18;19991:26;;20027:71;20095:1;20084:9;20080:17;20071:6;20027:71;:::i;:::-;19883:222;;;;:::o;20111:640::-;20306:4;20344:3;20333:9;20329:19;20321:27;;20358:71;20426:1;20415:9;20411:17;20402:6;20358:71;:::i;:::-;20439:72;20507:2;20496:9;20492:18;20483:6;20439:72;:::i;:::-;20521;20589:2;20578:9;20574:18;20565:6;20521:72;:::i;:::-;20640:9;20634:4;20630:20;20625:2;20614:9;20610:18;20603:48;20668:76;20739:4;20730:6;20668:76;:::i;:::-;20660:84;;20111:640;;;;;;;:::o;20757:332::-;20878:4;20916:2;20905:9;20901:18;20893:26;;20929:71;20997:1;20986:9;20982:17;20973:6;20929:71;:::i;:::-;21010:72;21078:2;21067:9;21063:18;21054:6;21010:72;:::i;:::-;20757:332;;;;;:::o;21095:373::-;21238:4;21276:2;21265:9;21261:18;21253:26;;21325:9;21319:4;21315:20;21311:1;21300:9;21296:17;21289:47;21353:108;21456:4;21447:6;21353:108;:::i;:::-;21345:116;;21095:373;;;;:::o;21474:210::-;21561:4;21599:2;21588:9;21584:18;21576:26;;21612:65;21674:1;21663:9;21659:17;21650:6;21612:65;:::i;:::-;21474:210;;;;:::o;21690:313::-;21803:4;21841:2;21830:9;21826:18;21818:26;;21890:9;21884:4;21880:20;21876:1;21865:9;21861:17;21854:47;21918:78;21991:4;21982:6;21918:78;:::i;:::-;21910:86;;21690:313;;;;:::o;22009:419::-;22175:4;22213:2;22202:9;22198:18;22190:26;;22262:9;22256:4;22252:20;22248:1;22237:9;22233:17;22226:47;22290:131;22416:4;22290:131;:::i;:::-;22282:139;;22009:419;;;:::o;22434:::-;22600:4;22638:2;22627:9;22623:18;22615:26;;22687:9;22681:4;22677:20;22673:1;22662:9;22658:17;22651:47;22715:131;22841:4;22715:131;:::i;:::-;22707:139;;22434:419;;;:::o;22859:::-;23025:4;23063:2;23052:9;23048:18;23040:26;;23112:9;23106:4;23102:20;23098:1;23087:9;23083:17;23076:47;23140:131;23266:4;23140:131;:::i;:::-;23132:139;;22859:419;;;:::o;23284:::-;23450:4;23488:2;23477:9;23473:18;23465:26;;23537:9;23531:4;23527:20;23523:1;23512:9;23508:17;23501:47;23565:131;23691:4;23565:131;:::i;:::-;23557:139;;23284:419;;;:::o;23709:::-;23875:4;23913:2;23902:9;23898:18;23890:26;;23962:9;23956:4;23952:20;23948:1;23937:9;23933:17;23926:47;23990:131;24116:4;23990:131;:::i;:::-;23982:139;;23709:419;;;:::o;24134:::-;24300:4;24338:2;24327:9;24323:18;24315:26;;24387:9;24381:4;24377:20;24373:1;24362:9;24358:17;24351:47;24415:131;24541:4;24415:131;:::i;:::-;24407:139;;24134:419;;;:::o;24559:::-;24725:4;24763:2;24752:9;24748:18;24740:26;;24812:9;24806:4;24802:20;24798:1;24787:9;24783:17;24776:47;24840:131;24966:4;24840:131;:::i;:::-;24832:139;;24559:419;;;:::o;24984:::-;25150:4;25188:2;25177:9;25173:18;25165:26;;25237:9;25231:4;25227:20;25223:1;25212:9;25208:17;25201:47;25265:131;25391:4;25265:131;:::i;:::-;25257:139;;24984:419;;;:::o;25409:::-;25575:4;25613:2;25602:9;25598:18;25590:26;;25662:9;25656:4;25652:20;25648:1;25637:9;25633:17;25626:47;25690:131;25816:4;25690:131;:::i;:::-;25682:139;;25409:419;;;:::o;25834:::-;26000:4;26038:2;26027:9;26023:18;26015:26;;26087:9;26081:4;26077:20;26073:1;26062:9;26058:17;26051:47;26115:131;26241:4;26115:131;:::i;:::-;26107:139;;25834:419;;;:::o;26259:::-;26425:4;26463:2;26452:9;26448:18;26440:26;;26512:9;26506:4;26502:20;26498:1;26487:9;26483:17;26476:47;26540:131;26666:4;26540:131;:::i;:::-;26532:139;;26259:419;;;:::o;26684:::-;26850:4;26888:2;26877:9;26873:18;26865:26;;26937:9;26931:4;26927:20;26923:1;26912:9;26908:17;26901:47;26965:131;27091:4;26965:131;:::i;:::-;26957:139;;26684:419;;;:::o;27109:::-;27275:4;27313:2;27302:9;27298:18;27290:26;;27362:9;27356:4;27352:20;27348:1;27337:9;27333:17;27326:47;27390:131;27516:4;27390:131;:::i;:::-;27382:139;;27109:419;;;:::o;27534:::-;27700:4;27738:2;27727:9;27723:18;27715:26;;27787:9;27781:4;27777:20;27773:1;27762:9;27758:17;27751:47;27815:131;27941:4;27815:131;:::i;:::-;27807:139;;27534:419;;;:::o;27959:::-;28125:4;28163:2;28152:9;28148:18;28140:26;;28212:9;28206:4;28202:20;28198:1;28187:9;28183:17;28176:47;28240:131;28366:4;28240:131;:::i;:::-;28232:139;;27959:419;;;:::o;28384:::-;28550:4;28588:2;28577:9;28573:18;28565:26;;28637:9;28631:4;28627:20;28623:1;28612:9;28608:17;28601:47;28665:131;28791:4;28665:131;:::i;:::-;28657:139;;28384:419;;;:::o;28809:222::-;28902:4;28940:2;28929:9;28925:18;28917:26;;28953:71;29021:1;29010:9;29006:17;28997:6;28953:71;:::i;:::-;28809:222;;;;:::o;29037:129::-;29071:6;29098:20;;:::i;:::-;29088:30;;29127:33;29155:4;29147:6;29127:33;:::i;:::-;29037:129;;;:::o;29172:75::-;29205:6;29238:2;29232:9;29222:19;;29172:75;:::o;29253:307::-;29314:4;29404:18;29396:6;29393:30;29390:56;;;29426:18;;:::i;:::-;29390:56;29464:29;29486:6;29464:29;:::i;:::-;29456:37;;29548:4;29542;29538:15;29530:23;;29253:307;;;:::o;29566:308::-;29628:4;29718:18;29710:6;29707:30;29704:56;;;29740:18;;:::i;:::-;29704:56;29778:29;29800:6;29778:29;:::i;:::-;29770:37;;29862:4;29856;29852:15;29844:23;;29566:308;;;:::o;29880:132::-;29947:4;29970:3;29962:11;;30000:4;29995:3;29991:14;29983:22;;29880:132;;;:::o;30018:141::-;30067:4;30090:3;30082:11;;30113:3;30110:1;30103:14;30147:4;30144:1;30134:18;30126:26;;30018:141;;;:::o;30165:114::-;30232:6;30266:5;30260:12;30250:22;;30165:114;;;:::o;30285:98::-;30336:6;30370:5;30364:12;30354:22;;30285:98;;;:::o;30389:99::-;30441:6;30475:5;30469:12;30459:22;;30389:99;;;:::o;30494:113::-;30564:4;30596;30591:3;30587:14;30579:22;;30494:113;;;:::o;30613:184::-;30712:11;30746:6;30741:3;30734:19;30786:4;30781:3;30777:14;30762:29;;30613:184;;;;:::o;30803:168::-;30886:11;30920:6;30915:3;30908:19;30960:4;30955:3;30951:14;30936:29;;30803:168;;;;:::o;30977:147::-;31078:11;31115:3;31100:18;;30977:147;;;;:::o;31130:169::-;31214:11;31248:6;31243:3;31236:19;31288:4;31283:3;31279:14;31264:29;;31130:169;;;;:::o;31305:148::-;31407:11;31444:3;31429:18;;31305:148;;;;:::o;31459:305::-;31499:3;31518:20;31536:1;31518:20;:::i;:::-;31513:25;;31552:20;31570:1;31552:20;:::i;:::-;31547:25;;31706:1;31638:66;31634:74;31631:1;31628:81;31625:107;;;31712:18;;:::i;:::-;31625:107;31756:1;31753;31749:9;31742:16;;31459:305;;;;:::o;31770:185::-;31810:1;31827:20;31845:1;31827:20;:::i;:::-;31822:25;;31861:20;31879:1;31861:20;:::i;:::-;31856:25;;31900:1;31890:35;;31905:18;;:::i;:::-;31890:35;31947:1;31944;31940:9;31935:14;;31770:185;;;;:::o;31961:348::-;32001:7;32024:20;32042:1;32024:20;:::i;:::-;32019:25;;32058:20;32076:1;32058:20;:::i;:::-;32053:25;;32246:1;32178:66;32174:74;32171:1;32168:81;32163:1;32156:9;32149:17;32145:105;32142:131;;;32253:18;;:::i;:::-;32142:131;32301:1;32298;32294:9;32283:20;;31961:348;;;;:::o;32315:191::-;32355:4;32375:20;32393:1;32375:20;:::i;:::-;32370:25;;32409:20;32427:1;32409:20;:::i;:::-;32404:25;;32448:1;32445;32442:8;32439:34;;;32453:18;;:::i;:::-;32439:34;32498:1;32495;32491:9;32483:17;;32315:191;;;;:::o;32512:96::-;32549:7;32578:24;32596:5;32578:24;:::i;:::-;32567:35;;32512:96;;;:::o;32614:90::-;32648:7;32691:5;32684:13;32677:21;32666:32;;32614:90;;;:::o;32710:149::-;32746:7;32786:66;32779:5;32775:78;32764:89;;32710:149;;;:::o;32865:126::-;32902:7;32942:42;32935:5;32931:54;32920:65;;32865:126;;;:::o;32997:77::-;33034:7;33063:5;33052:16;;32997:77;;;:::o;33080:154::-;33164:6;33159:3;33154;33141:30;33226:1;33217:6;33212:3;33208:16;33201:27;33080:154;;;:::o;33240:307::-;33308:1;33318:113;33332:6;33329:1;33326:13;33318:113;;;33417:1;33412:3;33408:11;33402:18;33398:1;33393:3;33389:11;33382:39;33354:2;33351:1;33347:10;33342:15;;33318:113;;;33449:6;33446:1;33443:13;33440:101;;;33529:1;33520:6;33515:3;33511:16;33504:27;33440:101;33289:258;33240:307;;;:::o;33553:320::-;33597:6;33634:1;33628:4;33624:12;33614:22;;33681:1;33675:4;33671:12;33702:18;33692:81;;33758:4;33750:6;33746:17;33736:27;;33692:81;33820:2;33812:6;33809:14;33789:18;33786:38;33783:84;;;33839:18;;:::i;:::-;33783:84;33604:269;33553:320;;;:::o;33879:281::-;33962:27;33984:4;33962:27;:::i;:::-;33954:6;33950:40;34092:6;34080:10;34077:22;34056:18;34044:10;34041:34;34038:62;34035:88;;;34103:18;;:::i;:::-;34035:88;34143:10;34139:2;34132:22;33922:238;33879:281;;:::o;34166:233::-;34205:3;34228:24;34246:5;34228:24;:::i;:::-;34219:33;;34274:66;34267:5;34264:77;34261:103;;;34344:18;;:::i;:::-;34261:103;34391:1;34384:5;34380:13;34373:20;;34166:233;;;:::o;34405:176::-;34437:1;34454:20;34472:1;34454:20;:::i;:::-;34449:25;;34488:20;34506:1;34488:20;:::i;:::-;34483:25;;34527:1;34517:35;;34532:18;;:::i;:::-;34517:35;34573:1;34570;34566:9;34561:14;;34405:176;;;;:::o;34587:180::-;34635:77;34632:1;34625:88;34732:4;34729:1;34722:15;34756:4;34753:1;34746:15;34773:180;34821:77;34818:1;34811:88;34918:4;34915:1;34908:15;34942:4;34939:1;34932:15;34959:180;35007:77;35004:1;34997:88;35104:4;35101:1;35094:15;35128:4;35125:1;35118:15;35145:180;35193:77;35190:1;35183:88;35290:4;35287:1;35280:15;35314:4;35311:1;35304:15;35331:180;35379:77;35376:1;35369:88;35476:4;35473:1;35466:15;35500:4;35497:1;35490:15;35517:180;35565:77;35562:1;35555:88;35662:4;35659:1;35652:15;35686:4;35683:1;35676:15;35703:117;35812:1;35809;35802:12;35826:117;35935:1;35932;35925:12;35949:117;36058:1;36055;36048:12;36072:117;36181:1;36178;36171:12;36195:117;36304:1;36301;36294:12;36318:117;36427:1;36424;36417:12;36441:102;36482:6;36533:2;36529:7;36524:2;36517:5;36513:14;36509:28;36499:38;;36441:102;;;:::o;36549:230::-;36689:34;36685:1;36677:6;36673:14;36666:58;36758:13;36753:2;36745:6;36741:15;36734:38;36549:230;:::o;36785:237::-;36925:34;36921:1;36913:6;36909:14;36902:58;36994:20;36989:2;36981:6;36977:15;36970:45;36785:237;:::o;37028:225::-;37168:34;37164:1;37156:6;37152:14;37145:58;37237:8;37232:2;37224:6;37220:15;37213:33;37028:225;:::o;37259:224::-;37399:34;37395:1;37387:6;37383:14;37376:58;37468:7;37463:2;37455:6;37451:15;37444:32;37259:224;:::o;37489:178::-;37629:30;37625:1;37617:6;37613:14;37606:54;37489:178;:::o;37673:223::-;37813:34;37809:1;37801:6;37797:14;37790:58;37882:6;37877:2;37869:6;37865:15;37858:31;37673:223;:::o;37902:175::-;38042:27;38038:1;38030:6;38026:14;38019:51;37902:175;:::o;38083:228::-;38223:34;38219:1;38211:6;38207:14;38200:58;38292:11;38287:2;38279:6;38275:15;38268:36;38083:228;:::o;38317:249::-;38457:34;38453:1;38445:6;38441:14;38434:58;38526:32;38521:2;38513:6;38509:15;38502:57;38317:249;:::o;38572:182::-;38712:34;38708:1;38700:6;38696:14;38689:58;38572:182;:::o;38760:::-;38900:34;38896:1;38888:6;38884:14;38877:58;38760:182;:::o;38948:234::-;39088:34;39084:1;39076:6;39072:14;39065:58;39157:17;39152:2;39144:6;39140:15;39133:42;38948:234;:::o;39188:174::-;39328:26;39324:1;39316:6;39312:14;39305:50;39188:174;:::o;39368:220::-;39508:34;39504:1;39496:6;39492:14;39485:58;39577:3;39572:2;39564:6;39560:15;39553:28;39368:220;:::o;39594:114::-;;:::o;39714:231::-;39854:34;39850:1;39842:6;39838:14;39831:58;39923:14;39918:2;39910:6;39906:15;39899:39;39714:231;:::o;39951:233::-;40091:34;40087:1;40079:6;40075:14;40068:58;40160:16;40155:2;40147:6;40143:15;40136:41;39951:233;:::o;40190:122::-;40263:24;40281:5;40263:24;:::i;:::-;40256:5;40253:35;40243:63;;40302:1;40299;40292:12;40243:63;40190:122;:::o;40318:116::-;40388:21;40403:5;40388:21;:::i;:::-;40381:5;40378:32;40368:60;;40424:1;40421;40414:12;40368:60;40318:116;:::o;40440:120::-;40512:23;40529:5;40512:23;:::i;:::-;40505:5;40502:34;40492:62;;40550:1;40547;40540:12;40492:62;40440:120;:::o;40566:122::-;40639:24;40657:5;40639:24;:::i;:::-;40632:5;40629:35;40619:63;;40678:1;40675;40668:12;40619:63;40566:122;:::o

Swarm Source

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