ETH Price: $3,321.30 (-1.54%)
Gas: 1 Gwei

Token

IconGirl ($IGT)
 

Overview

Max Total Supply

3 $IGT

Holders

3

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
besidebest.eth
Balance
1 $IGT
0x081e92f8b195999d71b8c88d042da75f8be8ed9f
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:
IconGirlNFT

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-06-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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


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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

    bool private _paused;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

interface Ifashion{
 function checkLockValidity(address account, uint256 [] memory fashion_tokenIds) external;
 function lockFashionItems(address account, uint256 [] memory fashion_tokenIds) external;
 function unlockFashionItems(address account, uint256 [] memory fashion_tokenIds) external;
}
contract IconGirlNFT is ERC721Enumerable, Ownable, Pausable {
 using Address for address;
 using Strings for uint256;

 using SafeMath for uint256;
 using Counters for Counters.Counter;
 Counters.Counter private _tokenIdTracker;
 
 string public baseUri;
 address[] public whitelists;
 address public fashion_item = 0xFC7FedA4B25144d751272b6F6F6E2725Ffd51a13;
 uint256 public MAX_SUPPLY = 1000;
 uint256 public iconGirl_price = 5 * 10**16; // 0.05 ETH

 mapping(address => mapping(uint => uint[])) public burnedFashionItems;
 mapping(address => bool) public whitelisted;
 constructor () ERC721 ("IconGirl", "$IGT") {
  setBaseURI("https://api.icon.fashion/api/getTokenURI/icongirl/");
  pause(true);
 }

 // Override so the openzeppelin tokenURI() method will use this method to create the full tokenURI instead
 function _baseURI() internal view virtual override returns (string memory) {
  return baseUri;
 }

 modifier saleIsOpen {
  require(totalSupply() <= MAX_SUPPLY, "Sale end");
  if (_msgSender() != owner()) {
   require(!paused(), "Pausable: paused");
  }
  _;
 }

 function mintIconGirl(uint256 [] memory fashion_tokenIds) public payable saleIsOpen {
  Ifashion(fashion_item).lockFashionItems(msg.sender, fashion_tokenIds);
  _mintAnElement();
  burnedFashionItems[msg.sender][getLastTokenID()] = fashion_tokenIds;
 }

 // undress IconGirl
 function undressIconGirl(uint256 collectionId) public saleIsOpen {
  Ifashion(fashion_item).unlockFashionItems(msg.sender, burnedFashionItems[msg.sender][collectionId]);
  _burn(collectionId);
 }

 function burnIconGirl(uint256 tokenId) public saleIsOpen {
  // require(msg.sender==owner(), "Only owner can burn");
  _burn(tokenId);
 }

 // mint one Token to sender
 function _mintAnElement() private {
  _tokenIdTracker.increment();
  uint256 _tokenId = getLastTokenID();
  _safeMint(msg.sender, _tokenId);
 }

 // See which address owns which tokens
 function tokensOfOwner(address addr) public view returns(uint256[] memory) {
  uint256 tokenCount = balanceOf(addr);
  uint256[] memory tokensId = new uint256[](tokenCount);
  for(uint256 i; i < tokenCount; i++) {
   tokensId[i] = tokenOfOwnerByIndex(addr, i);
  }
  return tokensId;
 }

 function getLastTokenID() public view returns (uint256) {
  return _tokenIdTracker.current();
 }

 // check if it is paused
 function isPaused() public view returns (bool) {
  return paused();
 }

 function setFashionToken(address new_address) public onlyOwner {
  fashion_item = new_address;
 }

 // return Token URI
 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()))
   : "";
 }

 // set the state of minting
 function pause(bool val) public onlyOwner {
  if (val == true) {
   _pause();
   return;
  }
  _unpause();
 }

 // Set a different price for Icongirl in case ETH changes drastically
 function setIcongirlPrice(uint256 newPrice) public onlyOwner {
  iconGirl_price = newPrice;
 }

 // withdraw all coins
 function withdrawAll() public onlyOwner {
  uint256 balance = address(this).balance;
  require(balance > 0, "There is no balance to withdraw");
  _widthdraw(msg.sender, balance );
 }

 function _widthdraw(address _address, uint256 _amount) private {
  (bool success, ) = _address.call{value: _amount}("");
  require(success, "Transfer failed.");
 }

 // set BaseURL
 function setBaseURI(string memory _baseUri) public onlyOwner {
  baseUri = _baseUri;
 }

 // set MAX_SUPPLY
 function setMaxSupply(uint256 _count) public onlyOwner {
  MAX_SUPPLY = _count;
 }

 // add user's address to whitelist
 function addWhitelistUser(address[] memory _user) public onlyOwner {
  for(uint256 idx = 0; idx < _user.length; idx++) {
   require(whitelisted[_user[idx]] == false, "already set");
   whitelisted[_user[idx]] = true;
   whitelists.push(_user[idx]);
  }
 }

 // remove user's address to whitelist
 function removeWhitelistUser(address[] memory _user) public onlyOwner {
  for(uint256 idx = 0; idx < _user.length; idx++) {
   require(whitelisted[_user[idx]] == true, "not exist");
   whitelisted[_user[idx]] = false;
   removeWhitelistByValue(_user[idx]);
  }
 }

 function removeWhitelistByValue(address value) internal {
  uint i = 0;
  while (whitelists[i] != value) {
   i++;
  }
  removeWhitelistByIndex(i);
 }

 function removeWhitelistByIndex(uint i) internal {
  while (i<whitelists.length-1) {
   whitelists[i] = whitelists[i+1];
   i++;
  }
  whitelists.pop();
 }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"}],"name":"addWhitelistUser","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":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnIconGirl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedFashionItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fashion_item","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":[],"name":"getLastTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iconGirl_price","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":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"fashion_tokenIds","type":"uint256[]"}],"name":"mintIconGirl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_address","type":"address"}],"name":"setFashionToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setIcongirlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"undressIconGirl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelists","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273fc7feda4b25144d751272b6f6f6e2725ffd51a13600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600f5566b1a2bc2ec500006010553480156200007757600080fd5b506040518060400160405280600881526020017f49636f6e4769726c0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f24494754000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000fc92919062000585565b5080600190805190602001906200011592919062000585565b505050620001386200012c6200019560201b60201c565b6200019d60201b60201c565b6000600a60146101000a81548160ff0219169083151502179055506200017d60405180606001604052806032815260200162005f06603291396200026360201b60201c565b6200018f60016200030e60201b60201c565b62000863565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002736200019560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000299620003d560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e9906200071c565b60405180910390fd5b80600c90805190602001906200030a92919062000585565b5050565b6200031e6200019560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000344620003d560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000394906200071c565b60405180910390fd5b600115158115151415620003c157620003bb620003ff60201b60201c565b620003d2565b620003d1620004b760201b60201c565b5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200040f6200056e60201b60201c565b1562000452576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044990620006fa565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200049e6200019560201b60201c565b604051620004ad9190620006bb565b60405180910390a1565b620004c76200056e60201b60201c565b62000509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050090620006d8565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa620005556200019560201b60201c565b604051620005649190620006bb565b60405180910390a1565b6000600a60149054906101000a900460ff16905090565b828054620005939062000783565b90600052602060002090601f016020900481019282620005b7576000855562000603565b82601f10620005d257805160ff191683800117855562000603565b8280016001018555821562000603579182015b8281111562000602578251825591602001919060010190620005e5565b5b50905062000612919062000616565b5090565b5b808211156200063157600081600090555060010162000617565b5090565b62000640816200074f565b82525050565b6000620006556014836200073e565b91506200066282620007e8565b602082019050919050565b60006200067c6010836200073e565b9150620006898262000811565b602082019050919050565b6000620006a36020836200073e565b9150620006b0826200083a565b602082019050919050565b6000602082019050620006d2600083018462000635565b92915050565b60006020820190508181036000830152620006f38162000646565b9050919050565b6000602082019050818103600083015262000715816200066d565b9050919050565b60006020820190508181036000830152620007378162000694565b9050919050565b600082825260208201905092915050565b60006200075c8262000763565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200079c57607f821691505b60208210811415620007b357620007b2620007b9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61569380620008736000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063c0bd9c7d1161007a578063c0bd9c7d14610878578063c87b56dd14610894578063d936547e146108d1578063e985e9c51461090e578063f2fde38b1461094b578063fe4d5add1461097457610246565b8063a22cb465146107a7578063a522b9c2146107d0578063b187bd26146107f9578063b88d4fde14610824578063bb7e51701461084d57610246565b80638da5cb5b116100fd5780638da5cb5b146106d457806391420d8c146106ff57806395d89b4114610728578063999abb7b146107535780639abc83201461077c57610246565b806370a0823114610601578063715018a61461063e5780638462151c14610655578063853828b6146106925780638aefc3ca146106a957610246565b80632f745c59116101c757806355f804b31161018b57806355f804b31461051e5780635c975abb146105475780635e197f53146105725780636352211e1461059b5780636f8b44b0146105d857610246565b80632f745c591461042757806332cb6b0c1461046457806338cc307c1461048f57806342842e0e146104b85780634f6ccce7146104e157610246565b8063095ea7b31161020e578063095ea7b3146103565780630e0941371461037f57806318160ddd146103aa5780631bc3f461146103d557806323b872dd146103fe57610246565b806301ffc9a71461024b57806302329a2914610288578063043e88e0146102b157806306fdde03146102ee578063081812fc14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613fce565b6109b1565b60405161027f9190614708565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613fa1565b610a2b565b005b3480156102bd57600080fd5b506102d860048036038101906102d39190613ebc565b610acd565b6040516102e59190614a65565b60405180910390f35b3480156102fa57600080fd5b50610303610b0b565b6040516103109190614723565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190614071565b610b9d565b60405161034d919061461f565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613e7c565b610c22565b005b34801561038b57600080fd5b50610394610d3a565b6040516103a19190614a65565b60405180910390f35b3480156103b657600080fd5b506103bf610d4b565b6040516103cc9190614a65565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613f0f565b610d58565b005b34801561040a57600080fd5b5061042560048036038101906104209190613d66565b610f93565b005b34801561043357600080fd5b5061044e60048036038101906104499190613e7c565b610ff3565b60405161045b9190614a65565b60405180910390f35b34801561047057600080fd5b50610479611098565b6040516104869190614a65565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190614071565b61109e565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613d66565b611124565b005b3480156104ed57600080fd5b5061050860048036038101906105039190614071565b611144565b6040516105159190614a65565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190614028565b6111b5565b005b34801561055357600080fd5b5061055c61124b565b6040516105699190614708565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190614071565b611262565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190614071565b611344565b6040516105cf919061461f565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190614071565b6113f6565b005b34801561060d57600080fd5b5061062860048036038101906106239190613cf9565b61147c565b6040516106359190614a65565b60405180910390f35b34801561064a57600080fd5b50610653611534565b005b34801561066157600080fd5b5061067c60048036038101906106779190613cf9565b6115bc565b60405161068991906146e6565b60405180910390f35b34801561069e57600080fd5b506106a761166a565b005b3480156106b557600080fd5b506106be61173b565b6040516106cb919061461f565b60405180910390f35b3480156106e057600080fd5b506106e9611761565b6040516106f6919061461f565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190614071565b61178b565b005b34801561073457600080fd5b5061073d61194b565b60405161074a9190614723565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613f0f565b6119dd565b005b34801561078857600080fd5b50610791611bbe565b60405161079e9190614723565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c99190613e3c565b611c4c565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613cf9565b611c62565b005b34801561080557600080fd5b5061080e611d22565b60405161081b9190614708565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613db9565b611d31565b005b34801561085957600080fd5b50610862611d93565b60405161086f9190614a65565b60405180910390f35b610892600480360381019061088d9190613f58565b611d99565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190614071565b611f75565b6040516108c89190614723565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613cf9565b61201c565b6040516109059190614708565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190613d26565b61203c565b6040516109429190614708565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613cf9565b6120d0565b005b34801561098057600080fd5b5061099b60048036038101906109969190614071565b6121c8565b6040516109a8919061461f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a245750610a2382612207565b5b9050919050565b610a336122e9565b73ffffffffffffffffffffffffffffffffffffffff16610a51611761565b73ffffffffffffffffffffffffffffffffffffffff1614610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90614985565b60405180910390fd5b600115158115151415610ac157610abc6122f1565b610aca565b610ac9612394565b5b50565b60116020528260005260406000206020528160005260406000208181548110610af557600080fd5b9060005260206000200160009250925050505481565b606060008054610b1a90614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690614d8e565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b5050505050905090565b6000610ba882612436565b610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614965565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2d82611344565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c95906149c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cbd6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610cec5750610ceb81610ce66122e9565b61203c565b5b610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d22906148c5565b60405180910390fd5b610d3583836124a2565b505050565b6000610d46600b61255b565b905090565b6000600880549050905090565b610d606122e9565b73ffffffffffffffffffffffffffffffffffffffff16610d7e611761565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614985565b60405180910390fd5b60005b8151811015610f8f576000151560126000848481518110610dfb57610dfa614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614a45565b60405180910390fd5b600160126000848481518110610ea657610ea5614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d828281518110610f1457610f13614f41565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610f8790614e0b565b915050610dd7565b5050565b610fa4610f9e6122e9565b82612569565b610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90614a05565b60405180910390fd5b610fee838383612647565b505050565b6000610ffe8361147c565b821061103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690614765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b6110a66122e9565b73ffffffffffffffffffffffffffffffffffffffff166110c4611761565b73ffffffffffffffffffffffffffffffffffffffff161461111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190614985565b60405180910390fd5b8060108190555050565b61113f83838360405180602001604052806000815250611d31565b505050565b600061114e610d4b565b821061118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690614a25565b60405180910390fd5b600882815481106111a3576111a2614f41565b5b90600052602060002001549050919050565b6111bd6122e9565b73ffffffffffffffffffffffffffffffffffffffff166111db611761565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614985565b60405180910390fd5b80600c9080519060200190611247929190613984565b5050565b6000600a60149054906101000a900460ff16905090565b600f5461126d610d4b565b11156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590614945565b60405180910390fd5b6112b6611761565b73ffffffffffffffffffffffffffffffffffffffff166112d46122e9565b73ffffffffffffffffffffffffffffffffffffffff1614611338576112f761124b565b15611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e906148a5565b60405180910390fd5b5b611341816128ae565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490614905565b60405180910390fd5b80915050919050565b6113fe6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661141c611761565b73ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990614985565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e4906148e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153c6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661155a611761565b73ffffffffffffffffffffffffffffffffffffffff16146115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a790614985565b60405180910390fd5b6115ba60006129cb565b565b606060006115c98361147c565b905060008167ffffffffffffffff8111156115e7576115e6614f70565b5b6040519080825280602002602001820160405280156116155781602001602082028036833780820191505090505b50905060005b8281101561165f5761162d8582610ff3565b8282815181106116405761163f614f41565b5b602002602001018181525050808061165790614e0b565b91505061161b565b508092505050919050565b6116726122e9565b73ffffffffffffffffffffffffffffffffffffffff16611690611761565b73ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614985565b60405180910390fd5b60004790506000811161172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614885565b60405180910390fd5b6117383382612a91565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f54611796610d4b565b11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90614945565b60405180910390fd5b6117df611761565b73ffffffffffffffffffffffffffffffffffffffff166117fd6122e9565b73ffffffffffffffffffffffffffffffffffffffff16146118615761182061124b565b15611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906148a5565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0cc3c0d33601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206040518363ffffffff1660e01b815260040161190d9291906146b6565b600060405180830381600087803b15801561192757600080fd5b505af115801561193b573d6000803e3d6000fd5b50505050611948816128ae565b50565b60606001805461195a90614d8e565b80601f016020809104026020016040519081016040528092919081815260200182805461198690614d8e565b80156119d35780601f106119a8576101008083540402835291602001916119d3565b820191906000526020600020905b8154815290600101906020018083116119b657829003601f168201915b5050505050905090565b6119e56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611a03611761565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614985565b60405180910390fd5b60005b8151811015611bba576001151560126000848481518110611a8057611a7f614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614865565b60405180910390fd5b600060126000848481518110611b2b57611b2a614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ba7828281518110611b9a57611b99614f41565b5b6020026020010151612b42565b8080611bb290614e0b565b915050611a5c565b5050565b600c8054611bcb90614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf790614d8e565b8015611c445780601f10611c1957610100808354040283529160200191611c44565b820191906000526020600020905b815481529060010190602001808311611c2757829003601f168201915b505050505081565b611c5e611c576122e9565b8383612bd6565b5050565b611c6a6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611c88611761565b73ffffffffffffffffffffffffffffffffffffffff1614611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd590614985565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d2c61124b565b905090565b611d42611d3c6122e9565b83612569565b611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890614a05565b60405180910390fd5b611d8d84848484612d43565b50505050565b60105481565b600f54611da4610d4b565b1115611de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddc90614945565b60405180910390fd5b611ded611761565b73ffffffffffffffffffffffffffffffffffffffff16611e0b6122e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e6f57611e2e61124b565b15611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e65906148a5565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631534d11233836040518363ffffffff1660e01b8152600401611ecc929190614686565b600060405180830381600087803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b50505050611f06612d9f565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611f50610d3a565b81526020019081526020016000209080519060200190611f71929190613a0a565b5050565b6060611f8082612436565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906149a5565b60405180910390fd5b6000611fc9612dc2565b90506000815111611fe95760405180602001604052806000815250612014565b80611ff384612e54565b6040516020016120049291906145e6565b6040516020818303038152906040525b915050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d86122e9565b73ffffffffffffffffffffffffffffffffffffffff166120f6611761565b73ffffffffffffffffffffffffffffffffffffffff161461214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614985565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b3906147a5565b60405180910390fd5b6121c5816129cb565b50565b600d81815481106121d857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122e257506122e182612fb5565b5b9050919050565b600033905090565b6122f961124b565b15612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906148a5565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861237d6122e9565b60405161238a919061461f565b60405180910390a1565b61239c61124b565b6123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614745565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61241f6122e9565b60405161242c919061461f565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661251583611344565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061257482612436565b6125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614845565b60405180910390fd5b60006125be83611344565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260057506125ff818561203c565b5b8061263e57508373ffffffffffffffffffffffffffffffffffffffff1661262684610b9d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661266782611344565b73ffffffffffffffffffffffffffffffffffffffff16146126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b4906147c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272490614805565b60405180910390fd5b61273883838361301f565b6127436000826124a2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127939190614c9a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127ea9190614c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a9838383613133565b505050565b60006128b982611344565b90506128c78160008461301f565b6128d26000836124a2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129229190614c9a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c781600084613133565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612ab79061460a565b60006040518083038185875af1925050503d8060008114612af4576040519150601f19603f3d011682016040523d82523d6000602084013e612af9565b606091505b5050905080612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b34906149e5565b60405180910390fd5b505050565b60005b8173ffffffffffffffffffffffffffffffffffffffff16600d8281548110612b7057612b6f614f41565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bc9578080612bc190614e0b565b915050612b45565b612bd281613138565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614825565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d369190614708565b60405180910390a3505050565b612d4e848484612647565b612d5a84848484613256565b612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9090614785565b60405180910390fd5b50505050565b612da9600b6133ed565b6000612db3610d3a565b9050612dbf3382613403565b50565b6060600c8054612dd190614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054612dfd90614d8e565b8015612e4a5780601f10612e1f57610100808354040283529160200191612e4a565b820191906000526020600020905b815481529060010190602001808311612e2d57829003601f168201915b5050505050905090565b60606000821415612e9c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb0565b600082905060005b60008214612ece578080612eb790614e0b565b915050600a82612ec79190614c69565b9150612ea4565b60008167ffffffffffffffff811115612eea57612ee9614f70565b5b6040519080825280601f01601f191660200182016040528015612f1c5781602001600182028036833780820191505090505b5090505b60008514612fa957600182612f359190614c9a565b9150600a85612f449190614e54565b6030612f509190614c13565b60f81b818381518110612f6657612f65614f41565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fa29190614c69565b9450612f20565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61302a838383613421565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561306d5761306881613426565b6130ac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130ab576130aa838261346f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ef576130ea816135dc565b61312e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461312d5761312c82826136ad565b5b5b505050565b505050565b5b6001600d8054905061314b9190614c9a565b81101561320c57600d6001826131619190614c13565b8154811061317257613171614f41565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d82815481106131b1576131b0614f41565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061320490614e0b565b915050613139565b600d80548061321e5761321d614f12565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b60006132778473ffffffffffffffffffffffffffffffffffffffff1661372c565b156133e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132a06122e9565b8786866040518563ffffffff1660e01b81526004016132c2949392919061463a565b602060405180830381600087803b1580156132dc57600080fd5b505af192505050801561330d57506040513d601f19601f8201168201806040525081019061330a9190613ffb565b60015b613390573d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b50600081511415613388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337f90614785565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133e5565b600190505b949350505050565b6001816000016000828254019250508190555050565b61341d82826040518060200160405280600081525061374f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161347c8461147c565b6134869190614c9a565b905060006007600084815260200190815260200160002054905081811461356b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135f09190614c9a565b90506000600960008481526020019081526020016000205490506000600883815481106136205761361f614f41565b5b90600052602060002001549050806008838154811061364257613641614f41565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061369157613690614f12565b5b6001900381819060005260206000200160009055905550505050565b60006136b88361147c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61375983836137aa565b6137666000848484613256565b6137a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379c90614785565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381190614925565b60405180910390fd5b61382381612436565b15613863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385a906147e5565b60405180910390fd5b61386f6000838361301f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138bf9190614c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461398060008383613133565b5050565b82805461399090614d8e565b90600052602060002090601f0160209004810192826139b257600085556139f9565b82601f106139cb57805160ff19168380011785556139f9565b828001600101855582156139f9579182015b828111156139f85782518255916020019190600101906139dd565b5b509050613a069190613a57565b5090565b828054828255906000526020600020908101928215613a46579160200282015b82811115613a45578251825591602001919060010190613a2a565b5b509050613a539190613a57565b5090565b5b80821115613a70576000816000905550600101613a58565b5090565b6000613a87613a8284614aa5565b614a80565b90508083825260208201905082856020860282011115613aaa57613aa9614fb7565b5b60005b85811015613ada5781613ac08882613bd8565b845260208401935060208301925050600181019050613aad565b5050509392505050565b6000613af7613af284614ad1565b614a80565b90508083825260208201905082856020860282011115613b1a57613b19614fb7565b5b60005b85811015613b4a5781613b308882613ce4565b845260208401935060208301925050600181019050613b1d565b5050509392505050565b6000613b67613b6284614afd565b614a80565b905082815260208101848484011115613b8357613b82614fbc565b5b613b8e848285614d4c565b509392505050565b6000613ba9613ba484614b2e565b614a80565b905082815260208101848484011115613bc557613bc4614fbc565b5b613bd0848285614d4c565b509392505050565b600081359050613be781615601565b92915050565b600082601f830112613c0257613c01614fb2565b5b8135613c12848260208601613a74565b91505092915050565b600082601f830112613c3057613c2f614fb2565b5b8135613c40848260208601613ae4565b91505092915050565b600081359050613c5881615618565b92915050565b600081359050613c6d8161562f565b92915050565b600081519050613c828161562f565b92915050565b600082601f830112613c9d57613c9c614fb2565b5b8135613cad848260208601613b54565b91505092915050565b600082601f830112613ccb57613cca614fb2565b5b8135613cdb848260208601613b96565b91505092915050565b600081359050613cf381615646565b92915050565b600060208284031215613d0f57613d0e614fc6565b5b6000613d1d84828501613bd8565b91505092915050565b60008060408385031215613d3d57613d3c614fc6565b5b6000613d4b85828601613bd8565b9250506020613d5c85828601613bd8565b9150509250929050565b600080600060608486031215613d7f57613d7e614fc6565b5b6000613d8d86828701613bd8565b9350506020613d9e86828701613bd8565b9250506040613daf86828701613ce4565b9150509250925092565b60008060008060808587031215613dd357613dd2614fc6565b5b6000613de187828801613bd8565b9450506020613df287828801613bd8565b9350506040613e0387828801613ce4565b925050606085013567ffffffffffffffff811115613e2457613e23614fc1565b5b613e3087828801613c88565b91505092959194509250565b60008060408385031215613e5357613e52614fc6565b5b6000613e6185828601613bd8565b9250506020613e7285828601613c49565b9150509250929050565b60008060408385031215613e9357613e92614fc6565b5b6000613ea185828601613bd8565b9250506020613eb285828601613ce4565b9150509250929050565b600080600060608486031215613ed557613ed4614fc6565b5b6000613ee386828701613bd8565b9350506020613ef486828701613ce4565b9250506040613f0586828701613ce4565b9150509250925092565b600060208284031215613f2557613f24614fc6565b5b600082013567ffffffffffffffff811115613f4357613f42614fc1565b5b613f4f84828501613bed565b91505092915050565b600060208284031215613f6e57613f6d614fc6565b5b600082013567ffffffffffffffff811115613f8c57613f8b614fc1565b5b613f9884828501613c1b565b91505092915050565b600060208284031215613fb757613fb6614fc6565b5b6000613fc584828501613c49565b91505092915050565b600060208284031215613fe457613fe3614fc6565b5b6000613ff284828501613c5e565b91505092915050565b60006020828403121561401157614010614fc6565b5b600061401f84828501613c73565b91505092915050565b60006020828403121561403e5761403d614fc6565b5b600082013567ffffffffffffffff81111561405c5761405b614fc1565b5b61406884828501613cb6565b91505092915050565b60006020828403121561408757614086614fc6565b5b600061409584828501613ce4565b91505092915050565b60006140aa83836145c8565b60208301905092915050565b6140bf81614cd8565b82525050565b60006140d082614b84565b6140da8185614bca565b93506140e583614b5f565b8060005b838110156141165781516140fd888261409e565b975061410883614bb0565b9250506001810190506140e9565b5085935050505092915050565b600061412e82614b8f565b6141388185614bca565b935061414383614b6f565b8060005b8381101561417b5761415882614f9f565b614162888261409e565b975061416d83614bbd565b925050600181019050614147565b5085935050505092915050565b61419181614cea565b82525050565b60006141a282614b9a565b6141ac8185614bdb565b93506141bc818560208601614d5b565b6141c581614fcb565b840191505092915050565b60006141db82614ba5565b6141e58185614bf7565b93506141f5818560208601614d5b565b6141fe81614fcb565b840191505092915050565b600061421482614ba5565b61421e8185614c08565b935061422e818560208601614d5b565b80840191505092915050565b6000614247601483614bf7565b915061425282614fe9565b602082019050919050565b600061426a602b83614bf7565b915061427582615012565b604082019050919050565b600061428d603283614bf7565b915061429882615061565b604082019050919050565b60006142b0602683614bf7565b91506142bb826150b0565b604082019050919050565b60006142d3602583614bf7565b91506142de826150ff565b604082019050919050565b60006142f6601c83614bf7565b91506143018261514e565b602082019050919050565b6000614319602483614bf7565b915061432482615177565b604082019050919050565b600061433c601983614bf7565b9150614347826151c6565b602082019050919050565b600061435f602c83614bf7565b915061436a826151ef565b604082019050919050565b6000614382600983614bf7565b915061438d8261523e565b602082019050919050565b60006143a5601f83614bf7565b91506143b082615267565b602082019050919050565b60006143c8601083614bf7565b91506143d382615290565b602082019050919050565b60006143eb603883614bf7565b91506143f6826152b9565b604082019050919050565b600061440e602a83614bf7565b915061441982615308565b604082019050919050565b6000614431602983614bf7565b915061443c82615357565b604082019050919050565b6000614454602083614bf7565b915061445f826153a6565b602082019050919050565b6000614477600883614bf7565b9150614482826153cf565b602082019050919050565b600061449a602c83614bf7565b91506144a5826153f8565b604082019050919050565b60006144bd602083614bf7565b91506144c882615447565b602082019050919050565b60006144e0602f83614bf7565b91506144eb82615470565b604082019050919050565b6000614503602183614bf7565b915061450e826154bf565b604082019050919050565b6000614526600083614bec565b91506145318261550e565b600082019050919050565b6000614549601083614bf7565b915061455482615511565b602082019050919050565b600061456c603183614bf7565b91506145778261553a565b604082019050919050565b600061458f602c83614bf7565b915061459a82615589565b604082019050919050565b60006145b2600b83614bf7565b91506145bd826155d8565b602082019050919050565b6145d181614d42565b82525050565b6145e081614d42565b82525050565b60006145f28285614209565b91506145fe8284614209565b91508190509392505050565b600061461582614519565b9150819050919050565b600060208201905061463460008301846140b6565b92915050565b600060808201905061464f60008301876140b6565b61465c60208301866140b6565b61466960408301856145d7565b818103606083015261467b8184614197565b905095945050505050565b600060408201905061469b60008301856140b6565b81810360208301526146ad81846140c5565b90509392505050565b60006040820190506146cb60008301856140b6565b81810360208301526146dd8184614123565b90509392505050565b6000602082019050818103600083015261470081846140c5565b905092915050565b600060208201905061471d6000830184614188565b92915050565b6000602082019050818103600083015261473d81846141d0565b905092915050565b6000602082019050818103600083015261475e8161423a565b9050919050565b6000602082019050818103600083015261477e8161425d565b9050919050565b6000602082019050818103600083015261479e81614280565b9050919050565b600060208201905081810360008301526147be816142a3565b9050919050565b600060208201905081810360008301526147de816142c6565b9050919050565b600060208201905081810360008301526147fe816142e9565b9050919050565b6000602082019050818103600083015261481e8161430c565b9050919050565b6000602082019050818103600083015261483e8161432f565b9050919050565b6000602082019050818103600083015261485e81614352565b9050919050565b6000602082019050818103600083015261487e81614375565b9050919050565b6000602082019050818103600083015261489e81614398565b9050919050565b600060208201905081810360008301526148be816143bb565b9050919050565b600060208201905081810360008301526148de816143de565b9050919050565b600060208201905081810360008301526148fe81614401565b9050919050565b6000602082019050818103600083015261491e81614424565b9050919050565b6000602082019050818103600083015261493e81614447565b9050919050565b6000602082019050818103600083015261495e8161446a565b9050919050565b6000602082019050818103600083015261497e8161448d565b9050919050565b6000602082019050818103600083015261499e816144b0565b9050919050565b600060208201905081810360008301526149be816144d3565b9050919050565b600060208201905081810360008301526149de816144f6565b9050919050565b600060208201905081810360008301526149fe8161453c565b9050919050565b60006020820190508181036000830152614a1e8161455f565b9050919050565b60006020820190508181036000830152614a3e81614582565b9050919050565b60006020820190508181036000830152614a5e816145a5565b9050919050565b6000602082019050614a7a60008301846145d7565b92915050565b6000614a8a614a9b565b9050614a968282614dda565b919050565b6000604051905090565b600067ffffffffffffffff821115614ac057614abf614f70565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aec57614aeb614f70565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b1857614b17614f70565b5b614b2182614fcb565b9050602081019050919050565b600067ffffffffffffffff821115614b4957614b48614f70565b5b614b5282614fcb565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000600182019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1e82614d42565b9150614c2983614d42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5e57614c5d614e85565b5b828201905092915050565b6000614c7482614d42565b9150614c7f83614d42565b925082614c8f57614c8e614eb4565b5b828204905092915050565b6000614ca582614d42565b9150614cb083614d42565b925082821015614cc357614cc2614e85565b5b828203905092915050565b6000819050919050565b6000614ce382614d22565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d79578082015181840152602081019050614d5e565b83811115614d88576000848401525b50505050565b60006002820490506001821680614da657607f821691505b60208210811415614dba57614db9614ee3565b5b50919050565b6000614dd3614dce83614fdc565b614cce565b9050919050565b614de382614fcb565b810181811067ffffffffffffffff82111715614e0257614e01614f70565b5b80604052505050565b6000614e1682614d42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e4957614e48614e85565b5b600182019050919050565b6000614e5f82614d42565b9150614e6a83614d42565b925082614e7a57614e79614eb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614fab8254614dc0565b9050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f742065786973740000000000000000000000000000000000000000000000600082015250565b7f5468657265206973206e6f2062616c616e636520746f20776974686472617700600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b61560a81614cd8565b811461561557600080fd5b50565b61562181614cea565b811461562c57600080fd5b50565b61563881614cf6565b811461564357600080fd5b50565b61564f81614d42565b811461565a57600080fd5b5056fea2646970667358221220ddfa9eeb5d1e95d4add67e4c833b63af8232d1c6f6e3186e332fb8323f223ec964736f6c6343000807003368747470733a2f2f6170692e69636f6e2e66617368696f6e2f6170692f676574546f6b656e5552492f69636f6e6769726c2f

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063c0bd9c7d1161007a578063c0bd9c7d14610878578063c87b56dd14610894578063d936547e146108d1578063e985e9c51461090e578063f2fde38b1461094b578063fe4d5add1461097457610246565b8063a22cb465146107a7578063a522b9c2146107d0578063b187bd26146107f9578063b88d4fde14610824578063bb7e51701461084d57610246565b80638da5cb5b116100fd5780638da5cb5b146106d457806391420d8c146106ff57806395d89b4114610728578063999abb7b146107535780639abc83201461077c57610246565b806370a0823114610601578063715018a61461063e5780638462151c14610655578063853828b6146106925780638aefc3ca146106a957610246565b80632f745c59116101c757806355f804b31161018b57806355f804b31461051e5780635c975abb146105475780635e197f53146105725780636352211e1461059b5780636f8b44b0146105d857610246565b80632f745c591461042757806332cb6b0c1461046457806338cc307c1461048f57806342842e0e146104b85780634f6ccce7146104e157610246565b8063095ea7b31161020e578063095ea7b3146103565780630e0941371461037f57806318160ddd146103aa5780631bc3f461146103d557806323b872dd146103fe57610246565b806301ffc9a71461024b57806302329a2914610288578063043e88e0146102b157806306fdde03146102ee578063081812fc14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613fce565b6109b1565b60405161027f9190614708565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613fa1565b610a2b565b005b3480156102bd57600080fd5b506102d860048036038101906102d39190613ebc565b610acd565b6040516102e59190614a65565b60405180910390f35b3480156102fa57600080fd5b50610303610b0b565b6040516103109190614723565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190614071565b610b9d565b60405161034d919061461f565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613e7c565b610c22565b005b34801561038b57600080fd5b50610394610d3a565b6040516103a19190614a65565b60405180910390f35b3480156103b657600080fd5b506103bf610d4b565b6040516103cc9190614a65565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613f0f565b610d58565b005b34801561040a57600080fd5b5061042560048036038101906104209190613d66565b610f93565b005b34801561043357600080fd5b5061044e60048036038101906104499190613e7c565b610ff3565b60405161045b9190614a65565b60405180910390f35b34801561047057600080fd5b50610479611098565b6040516104869190614a65565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190614071565b61109e565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613d66565b611124565b005b3480156104ed57600080fd5b5061050860048036038101906105039190614071565b611144565b6040516105159190614a65565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190614028565b6111b5565b005b34801561055357600080fd5b5061055c61124b565b6040516105699190614708565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190614071565b611262565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190614071565b611344565b6040516105cf919061461f565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190614071565b6113f6565b005b34801561060d57600080fd5b5061062860048036038101906106239190613cf9565b61147c565b6040516106359190614a65565b60405180910390f35b34801561064a57600080fd5b50610653611534565b005b34801561066157600080fd5b5061067c60048036038101906106779190613cf9565b6115bc565b60405161068991906146e6565b60405180910390f35b34801561069e57600080fd5b506106a761166a565b005b3480156106b557600080fd5b506106be61173b565b6040516106cb919061461f565b60405180910390f35b3480156106e057600080fd5b506106e9611761565b6040516106f6919061461f565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190614071565b61178b565b005b34801561073457600080fd5b5061073d61194b565b60405161074a9190614723565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613f0f565b6119dd565b005b34801561078857600080fd5b50610791611bbe565b60405161079e9190614723565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c99190613e3c565b611c4c565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613cf9565b611c62565b005b34801561080557600080fd5b5061080e611d22565b60405161081b9190614708565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613db9565b611d31565b005b34801561085957600080fd5b50610862611d93565b60405161086f9190614a65565b60405180910390f35b610892600480360381019061088d9190613f58565b611d99565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190614071565b611f75565b6040516108c89190614723565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613cf9565b61201c565b6040516109059190614708565b60405180910390f35b34801561091a57600080fd5b5061093560048036038101906109309190613d26565b61203c565b6040516109429190614708565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613cf9565b6120d0565b005b34801561098057600080fd5b5061099b60048036038101906109969190614071565b6121c8565b6040516109a8919061461f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a245750610a2382612207565b5b9050919050565b610a336122e9565b73ffffffffffffffffffffffffffffffffffffffff16610a51611761565b73ffffffffffffffffffffffffffffffffffffffff1614610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90614985565b60405180910390fd5b600115158115151415610ac157610abc6122f1565b610aca565b610ac9612394565b5b50565b60116020528260005260406000206020528160005260406000208181548110610af557600080fd5b9060005260206000200160009250925050505481565b606060008054610b1a90614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690614d8e565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b5050505050905090565b6000610ba882612436565b610be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bde90614965565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2d82611344565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c95906149c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cbd6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610cec5750610ceb81610ce66122e9565b61203c565b5b610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d22906148c5565b60405180910390fd5b610d3583836124a2565b505050565b6000610d46600b61255b565b905090565b6000600880549050905090565b610d606122e9565b73ffffffffffffffffffffffffffffffffffffffff16610d7e611761565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614985565b60405180910390fd5b60005b8151811015610f8f576000151560126000848481518110610dfb57610dfa614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614a45565b60405180910390fd5b600160126000848481518110610ea657610ea5614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d828281518110610f1457610f13614f41565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610f8790614e0b565b915050610dd7565b5050565b610fa4610f9e6122e9565b82612569565b610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda90614a05565b60405180910390fd5b610fee838383612647565b505050565b6000610ffe8361147c565b821061103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690614765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b6110a66122e9565b73ffffffffffffffffffffffffffffffffffffffff166110c4611761565b73ffffffffffffffffffffffffffffffffffffffff161461111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190614985565b60405180910390fd5b8060108190555050565b61113f83838360405180602001604052806000815250611d31565b505050565b600061114e610d4b565b821061118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690614a25565b60405180910390fd5b600882815481106111a3576111a2614f41565b5b90600052602060002001549050919050565b6111bd6122e9565b73ffffffffffffffffffffffffffffffffffffffff166111db611761565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614985565b60405180910390fd5b80600c9080519060200190611247929190613984565b5050565b6000600a60149054906101000a900460ff16905090565b600f5461126d610d4b565b11156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590614945565b60405180910390fd5b6112b6611761565b73ffffffffffffffffffffffffffffffffffffffff166112d46122e9565b73ffffffffffffffffffffffffffffffffffffffff1614611338576112f761124b565b15611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e906148a5565b60405180910390fd5b5b611341816128ae565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490614905565b60405180910390fd5b80915050919050565b6113fe6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661141c611761565b73ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990614985565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e4906148e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153c6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661155a611761565b73ffffffffffffffffffffffffffffffffffffffff16146115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a790614985565b60405180910390fd5b6115ba60006129cb565b565b606060006115c98361147c565b905060008167ffffffffffffffff8111156115e7576115e6614f70565b5b6040519080825280602002602001820160405280156116155781602001602082028036833780820191505090505b50905060005b8281101561165f5761162d8582610ff3565b8282815181106116405761163f614f41565b5b602002602001018181525050808061165790614e0b565b91505061161b565b508092505050919050565b6116726122e9565b73ffffffffffffffffffffffffffffffffffffffff16611690611761565b73ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614985565b60405180910390fd5b60004790506000811161172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614885565b60405180910390fd5b6117383382612a91565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f54611796610d4b565b11156117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90614945565b60405180910390fd5b6117df611761565b73ffffffffffffffffffffffffffffffffffffffff166117fd6122e9565b73ffffffffffffffffffffffffffffffffffffffff16146118615761182061124b565b15611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906148a5565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0cc3c0d33601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206040518363ffffffff1660e01b815260040161190d9291906146b6565b600060405180830381600087803b15801561192757600080fd5b505af115801561193b573d6000803e3d6000fd5b50505050611948816128ae565b50565b60606001805461195a90614d8e565b80601f016020809104026020016040519081016040528092919081815260200182805461198690614d8e565b80156119d35780601f106119a8576101008083540402835291602001916119d3565b820191906000526020600020905b8154815290600101906020018083116119b657829003601f168201915b5050505050905090565b6119e56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611a03611761565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614985565b60405180910390fd5b60005b8151811015611bba576001151560126000848481518110611a8057611a7f614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614865565b60405180910390fd5b600060126000848481518110611b2b57611b2a614f41565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ba7828281518110611b9a57611b99614f41565b5b6020026020010151612b42565b8080611bb290614e0b565b915050611a5c565b5050565b600c8054611bcb90614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf790614d8e565b8015611c445780601f10611c1957610100808354040283529160200191611c44565b820191906000526020600020905b815481529060010190602001808311611c2757829003601f168201915b505050505081565b611c5e611c576122e9565b8383612bd6565b5050565b611c6a6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611c88611761565b73ffffffffffffffffffffffffffffffffffffffff1614611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd590614985565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d2c61124b565b905090565b611d42611d3c6122e9565b83612569565b611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890614a05565b60405180910390fd5b611d8d84848484612d43565b50505050565b60105481565b600f54611da4610d4b565b1115611de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddc90614945565b60405180910390fd5b611ded611761565b73ffffffffffffffffffffffffffffffffffffffff16611e0b6122e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e6f57611e2e61124b565b15611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e65906148a5565b60405180910390fd5b5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631534d11233836040518363ffffffff1660e01b8152600401611ecc929190614686565b600060405180830381600087803b158015611ee657600080fd5b505af1158015611efa573d6000803e3d6000fd5b50505050611f06612d9f565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611f50610d3a565b81526020019081526020016000209080519060200190611f71929190613a0a565b5050565b6060611f8082612436565b611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906149a5565b60405180910390fd5b6000611fc9612dc2565b90506000815111611fe95760405180602001604052806000815250612014565b80611ff384612e54565b6040516020016120049291906145e6565b6040516020818303038152906040525b915050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d86122e9565b73ffffffffffffffffffffffffffffffffffffffff166120f6611761565b73ffffffffffffffffffffffffffffffffffffffff161461214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614985565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b3906147a5565b60405180910390fd5b6121c5816129cb565b50565b600d81815481106121d857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122e257506122e182612fb5565b5b9050919050565b600033905090565b6122f961124b565b15612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906148a5565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861237d6122e9565b60405161238a919061461f565b60405180910390a1565b61239c61124b565b6123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614745565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61241f6122e9565b60405161242c919061461f565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661251583611344565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061257482612436565b6125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614845565b60405180910390fd5b60006125be83611344565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260057506125ff818561203c565b5b8061263e57508373ffffffffffffffffffffffffffffffffffffffff1661262684610b9d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661266782611344565b73ffffffffffffffffffffffffffffffffffffffff16146126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b4906147c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272490614805565b60405180910390fd5b61273883838361301f565b6127436000826124a2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127939190614c9a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127ea9190614c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a9838383613133565b505050565b60006128b982611344565b90506128c78160008461301f565b6128d26000836124a2565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129229190614c9a565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c781600084613133565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612ab79061460a565b60006040518083038185875af1925050503d8060008114612af4576040519150601f19603f3d011682016040523d82523d6000602084013e612af9565b606091505b5050905080612b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b34906149e5565b60405180910390fd5b505050565b60005b8173ffffffffffffffffffffffffffffffffffffffff16600d8281548110612b7057612b6f614f41565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bc9578080612bc190614e0b565b915050612b45565b612bd281613138565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3c90614825565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d369190614708565b60405180910390a3505050565b612d4e848484612647565b612d5a84848484613256565b612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9090614785565b60405180910390fd5b50505050565b612da9600b6133ed565b6000612db3610d3a565b9050612dbf3382613403565b50565b6060600c8054612dd190614d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054612dfd90614d8e565b8015612e4a5780601f10612e1f57610100808354040283529160200191612e4a565b820191906000526020600020905b815481529060010190602001808311612e2d57829003601f168201915b5050505050905090565b60606000821415612e9c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb0565b600082905060005b60008214612ece578080612eb790614e0b565b915050600a82612ec79190614c69565b9150612ea4565b60008167ffffffffffffffff811115612eea57612ee9614f70565b5b6040519080825280601f01601f191660200182016040528015612f1c5781602001600182028036833780820191505090505b5090505b60008514612fa957600182612f359190614c9a565b9150600a85612f449190614e54565b6030612f509190614c13565b60f81b818381518110612f6657612f65614f41565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fa29190614c69565b9450612f20565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61302a838383613421565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561306d5761306881613426565b6130ac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130ab576130aa838261346f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ef576130ea816135dc565b61312e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461312d5761312c82826136ad565b5b5b505050565b505050565b5b6001600d8054905061314b9190614c9a565b81101561320c57600d6001826131619190614c13565b8154811061317257613171614f41565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d82815481106131b1576131b0614f41565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061320490614e0b565b915050613139565b600d80548061321e5761321d614f12565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b60006132778473ffffffffffffffffffffffffffffffffffffffff1661372c565b156133e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132a06122e9565b8786866040518563ffffffff1660e01b81526004016132c2949392919061463a565b602060405180830381600087803b1580156132dc57600080fd5b505af192505050801561330d57506040513d601f19601f8201168201806040525081019061330a9190613ffb565b60015b613390573d806000811461333d576040519150601f19603f3d011682016040523d82523d6000602084013e613342565b606091505b50600081511415613388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337f90614785565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133e5565b600190505b949350505050565b6001816000016000828254019250508190555050565b61341d82826040518060200160405280600081525061374f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161347c8461147c565b6134869190614c9a565b905060006007600084815260200190815260200160002054905081811461356b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135f09190614c9a565b90506000600960008481526020019081526020016000205490506000600883815481106136205761361f614f41565b5b90600052602060002001549050806008838154811061364257613641614f41565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061369157613690614f12565b5b6001900381819060005260206000200160009055905550505050565b60006136b88361147c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61375983836137aa565b6137666000848484613256565b6137a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379c90614785565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381190614925565b60405180910390fd5b61382381612436565b15613863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385a906147e5565b60405180910390fd5b61386f6000838361301f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138bf9190614c13565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461398060008383613133565b5050565b82805461399090614d8e565b90600052602060002090601f0160209004810192826139b257600085556139f9565b82601f106139cb57805160ff19168380011785556139f9565b828001600101855582156139f9579182015b828111156139f85782518255916020019190600101906139dd565b5b509050613a069190613a57565b5090565b828054828255906000526020600020908101928215613a46579160200282015b82811115613a45578251825591602001919060010190613a2a565b5b509050613a539190613a57565b5090565b5b80821115613a70576000816000905550600101613a58565b5090565b6000613a87613a8284614aa5565b614a80565b90508083825260208201905082856020860282011115613aaa57613aa9614fb7565b5b60005b85811015613ada5781613ac08882613bd8565b845260208401935060208301925050600181019050613aad565b5050509392505050565b6000613af7613af284614ad1565b614a80565b90508083825260208201905082856020860282011115613b1a57613b19614fb7565b5b60005b85811015613b4a5781613b308882613ce4565b845260208401935060208301925050600181019050613b1d565b5050509392505050565b6000613b67613b6284614afd565b614a80565b905082815260208101848484011115613b8357613b82614fbc565b5b613b8e848285614d4c565b509392505050565b6000613ba9613ba484614b2e565b614a80565b905082815260208101848484011115613bc557613bc4614fbc565b5b613bd0848285614d4c565b509392505050565b600081359050613be781615601565b92915050565b600082601f830112613c0257613c01614fb2565b5b8135613c12848260208601613a74565b91505092915050565b600082601f830112613c3057613c2f614fb2565b5b8135613c40848260208601613ae4565b91505092915050565b600081359050613c5881615618565b92915050565b600081359050613c6d8161562f565b92915050565b600081519050613c828161562f565b92915050565b600082601f830112613c9d57613c9c614fb2565b5b8135613cad848260208601613b54565b91505092915050565b600082601f830112613ccb57613cca614fb2565b5b8135613cdb848260208601613b96565b91505092915050565b600081359050613cf381615646565b92915050565b600060208284031215613d0f57613d0e614fc6565b5b6000613d1d84828501613bd8565b91505092915050565b60008060408385031215613d3d57613d3c614fc6565b5b6000613d4b85828601613bd8565b9250506020613d5c85828601613bd8565b9150509250929050565b600080600060608486031215613d7f57613d7e614fc6565b5b6000613d8d86828701613bd8565b9350506020613d9e86828701613bd8565b9250506040613daf86828701613ce4565b9150509250925092565b60008060008060808587031215613dd357613dd2614fc6565b5b6000613de187828801613bd8565b9450506020613df287828801613bd8565b9350506040613e0387828801613ce4565b925050606085013567ffffffffffffffff811115613e2457613e23614fc1565b5b613e3087828801613c88565b91505092959194509250565b60008060408385031215613e5357613e52614fc6565b5b6000613e6185828601613bd8565b9250506020613e7285828601613c49565b9150509250929050565b60008060408385031215613e9357613e92614fc6565b5b6000613ea185828601613bd8565b9250506020613eb285828601613ce4565b9150509250929050565b600080600060608486031215613ed557613ed4614fc6565b5b6000613ee386828701613bd8565b9350506020613ef486828701613ce4565b9250506040613f0586828701613ce4565b9150509250925092565b600060208284031215613f2557613f24614fc6565b5b600082013567ffffffffffffffff811115613f4357613f42614fc1565b5b613f4f84828501613bed565b91505092915050565b600060208284031215613f6e57613f6d614fc6565b5b600082013567ffffffffffffffff811115613f8c57613f8b614fc1565b5b613f9884828501613c1b565b91505092915050565b600060208284031215613fb757613fb6614fc6565b5b6000613fc584828501613c49565b91505092915050565b600060208284031215613fe457613fe3614fc6565b5b6000613ff284828501613c5e565b91505092915050565b60006020828403121561401157614010614fc6565b5b600061401f84828501613c73565b91505092915050565b60006020828403121561403e5761403d614fc6565b5b600082013567ffffffffffffffff81111561405c5761405b614fc1565b5b61406884828501613cb6565b91505092915050565b60006020828403121561408757614086614fc6565b5b600061409584828501613ce4565b91505092915050565b60006140aa83836145c8565b60208301905092915050565b6140bf81614cd8565b82525050565b60006140d082614b84565b6140da8185614bca565b93506140e583614b5f565b8060005b838110156141165781516140fd888261409e565b975061410883614bb0565b9250506001810190506140e9565b5085935050505092915050565b600061412e82614b8f565b6141388185614bca565b935061414383614b6f565b8060005b8381101561417b5761415882614f9f565b614162888261409e565b975061416d83614bbd565b925050600181019050614147565b5085935050505092915050565b61419181614cea565b82525050565b60006141a282614b9a565b6141ac8185614bdb565b93506141bc818560208601614d5b565b6141c581614fcb565b840191505092915050565b60006141db82614ba5565b6141e58185614bf7565b93506141f5818560208601614d5b565b6141fe81614fcb565b840191505092915050565b600061421482614ba5565b61421e8185614c08565b935061422e818560208601614d5b565b80840191505092915050565b6000614247601483614bf7565b915061425282614fe9565b602082019050919050565b600061426a602b83614bf7565b915061427582615012565b604082019050919050565b600061428d603283614bf7565b915061429882615061565b604082019050919050565b60006142b0602683614bf7565b91506142bb826150b0565b604082019050919050565b60006142d3602583614bf7565b91506142de826150ff565b604082019050919050565b60006142f6601c83614bf7565b91506143018261514e565b602082019050919050565b6000614319602483614bf7565b915061432482615177565b604082019050919050565b600061433c601983614bf7565b9150614347826151c6565b602082019050919050565b600061435f602c83614bf7565b915061436a826151ef565b604082019050919050565b6000614382600983614bf7565b915061438d8261523e565b602082019050919050565b60006143a5601f83614bf7565b91506143b082615267565b602082019050919050565b60006143c8601083614bf7565b91506143d382615290565b602082019050919050565b60006143eb603883614bf7565b91506143f6826152b9565b604082019050919050565b600061440e602a83614bf7565b915061441982615308565b604082019050919050565b6000614431602983614bf7565b915061443c82615357565b604082019050919050565b6000614454602083614bf7565b915061445f826153a6565b602082019050919050565b6000614477600883614bf7565b9150614482826153cf565b602082019050919050565b600061449a602c83614bf7565b91506144a5826153f8565b604082019050919050565b60006144bd602083614bf7565b91506144c882615447565b602082019050919050565b60006144e0602f83614bf7565b91506144eb82615470565b604082019050919050565b6000614503602183614bf7565b915061450e826154bf565b604082019050919050565b6000614526600083614bec565b91506145318261550e565b600082019050919050565b6000614549601083614bf7565b915061455482615511565b602082019050919050565b600061456c603183614bf7565b91506145778261553a565b604082019050919050565b600061458f602c83614bf7565b915061459a82615589565b604082019050919050565b60006145b2600b83614bf7565b91506145bd826155d8565b602082019050919050565b6145d181614d42565b82525050565b6145e081614d42565b82525050565b60006145f28285614209565b91506145fe8284614209565b91508190509392505050565b600061461582614519565b9150819050919050565b600060208201905061463460008301846140b6565b92915050565b600060808201905061464f60008301876140b6565b61465c60208301866140b6565b61466960408301856145d7565b818103606083015261467b8184614197565b905095945050505050565b600060408201905061469b60008301856140b6565b81810360208301526146ad81846140c5565b90509392505050565b60006040820190506146cb60008301856140b6565b81810360208301526146dd8184614123565b90509392505050565b6000602082019050818103600083015261470081846140c5565b905092915050565b600060208201905061471d6000830184614188565b92915050565b6000602082019050818103600083015261473d81846141d0565b905092915050565b6000602082019050818103600083015261475e8161423a565b9050919050565b6000602082019050818103600083015261477e8161425d565b9050919050565b6000602082019050818103600083015261479e81614280565b9050919050565b600060208201905081810360008301526147be816142a3565b9050919050565b600060208201905081810360008301526147de816142c6565b9050919050565b600060208201905081810360008301526147fe816142e9565b9050919050565b6000602082019050818103600083015261481e8161430c565b9050919050565b6000602082019050818103600083015261483e8161432f565b9050919050565b6000602082019050818103600083015261485e81614352565b9050919050565b6000602082019050818103600083015261487e81614375565b9050919050565b6000602082019050818103600083015261489e81614398565b9050919050565b600060208201905081810360008301526148be816143bb565b9050919050565b600060208201905081810360008301526148de816143de565b9050919050565b600060208201905081810360008301526148fe81614401565b9050919050565b6000602082019050818103600083015261491e81614424565b9050919050565b6000602082019050818103600083015261493e81614447565b9050919050565b6000602082019050818103600083015261495e8161446a565b9050919050565b6000602082019050818103600083015261497e8161448d565b9050919050565b6000602082019050818103600083015261499e816144b0565b9050919050565b600060208201905081810360008301526149be816144d3565b9050919050565b600060208201905081810360008301526149de816144f6565b9050919050565b600060208201905081810360008301526149fe8161453c565b9050919050565b60006020820190508181036000830152614a1e8161455f565b9050919050565b60006020820190508181036000830152614a3e81614582565b9050919050565b60006020820190508181036000830152614a5e816145a5565b9050919050565b6000602082019050614a7a60008301846145d7565b92915050565b6000614a8a614a9b565b9050614a968282614dda565b919050565b6000604051905090565b600067ffffffffffffffff821115614ac057614abf614f70565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aec57614aeb614f70565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b1857614b17614f70565b5b614b2182614fcb565b9050602081019050919050565b600067ffffffffffffffff821115614b4957614b48614f70565b5b614b5282614fcb565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000600182019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1e82614d42565b9150614c2983614d42565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5e57614c5d614e85565b5b828201905092915050565b6000614c7482614d42565b9150614c7f83614d42565b925082614c8f57614c8e614eb4565b5b828204905092915050565b6000614ca582614d42565b9150614cb083614d42565b925082821015614cc357614cc2614e85565b5b828203905092915050565b6000819050919050565b6000614ce382614d22565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d79578082015181840152602081019050614d5e565b83811115614d88576000848401525b50505050565b60006002820490506001821680614da657607f821691505b60208210811415614dba57614db9614ee3565b5b50919050565b6000614dd3614dce83614fdc565b614cce565b9050919050565b614de382614fcb565b810181811067ffffffffffffffff82111715614e0257614e01614f70565b5b80604052505050565b6000614e1682614d42565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e4957614e48614e85565b5b600182019050919050565b6000614e5f82614d42565b9150614e6a83614d42565b925082614e7a57614e79614eb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614fab8254614dc0565b9050919050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f742065786973740000000000000000000000000000000000000000000000600082015250565b7f5468657265206973206e6f2062616c616e636520746f20776974686472617700600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f616c726561647920736574000000000000000000000000000000000000000000600082015250565b61560a81614cd8565b811461561557600080fd5b50565b61562181614cea565b811461562c57600080fd5b50565b61563881614cf6565b811461564357600080fd5b50565b61564f81614d42565b811461565a57600080fd5b5056fea2646970667358221220ddfa9eeb5d1e95d4add67e4c833b63af8232d1c6f6e3186e332fb8323f223ec964736f6c63430008070033

Deployed Bytecode Sourcemap

56006:4813:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34991:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58978:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56474:69;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21137:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22697:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22220:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58269:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35631:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59914:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23447:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35299:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56378:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59170:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23857:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35821:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59674:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44511:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57603:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20831:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59788:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20561:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42709:103;;;;;;;;;;;;;:::i;:::-;;57971:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59295:186;;;;;;;;;;;;;:::i;:::-;;56302:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42058:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57400:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21306:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60220:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56246:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22990:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58476:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58399:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24113:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56414:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57117:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58602:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56547:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23216:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42967:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56271:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34991:224;35093:4;35132:35;35117:50;;;:11;:50;;;;:90;;;;35171:36;35195:11;35171:23;:36::i;:::-;35117:90;35110:97;;34991:224;;;:::o;58978:115::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59036:4:::1;59029:11;;:3;:11;;;59025:49;;;59048:8;:6;:8::i;:::-;59062:7;;59025:49;59078:10;:8;:10::i;:::-;42349:1;58978:115:::0;:::o;56474:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21137:100::-;21191:13;21224:5;21217:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21137:100;:::o;22697:221::-;22773:7;22801:16;22809:7;22801;:16::i;:::-;22793:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22886:15;:24;22902:7;22886:24;;;;;;;;;;;;;;;;;;;;;22879:31;;22697:221;;;:::o;22220:411::-;22301:13;22317:23;22332:7;22317:14;:23::i;:::-;22301:39;;22365:5;22359:11;;:2;:11;;;;22351:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22459:5;22443:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22468:37;22485:5;22492:12;:10;:12::i;:::-;22468:16;:37::i;:::-;22443:62;22421:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22602:21;22611:2;22615:7;22602:8;:21::i;:::-;22290:341;22220:411;;:::o;58269:98::-;58316:7;58337:25;:15;:23;:25::i;:::-;58330:32;;58269:98;:::o;35631:113::-;35692:7;35719:10;:17;;;;35712:24;;35631:113;:::o;59914:261::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59990:11:::1;59986:185;60013:5;:12;60007:3;:18;59986:185;;;60075:5;60048:32;;:11;:23;60060:5;60066:3;60060:10;;;;;;;;:::i;:::-;;;;;;;;60048:23;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;60040:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;60128:4;60102:11;:23;60114:5;60120:3;60114:10;;;;;;;;:::i;:::-;;;;;;;;60102:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;60138:10;60154:5;60160:3;60154:10;;;;;;;;:::i;:::-;;;;;;;;60138:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60027:5;;;;;:::i;:::-;;;;59986:185;;;;59914:261:::0;:::o;23447:339::-;23642:41;23661:12;:10;:12::i;:::-;23675:7;23642:18;:41::i;:::-;23634:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23750:28;23760:4;23766:2;23770:7;23750:9;:28::i;:::-;23447:339;;;:::o;35299:256::-;35396:7;35432:23;35449:5;35432:16;:23::i;:::-;35424:5;:31;35416:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35521:12;:19;35534:5;35521:19;;;;;;;;;;;;;;;:26;35541:5;35521:26;;;;;;;;;;;;35514:33;;35299:256;;;;:::o;56378:32::-;;;;:::o;59170:96::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59253:8:::1;59236:14;:25;;;;59170:96:::0;:::o;23857:185::-;23995:39;24012:4;24018:2;24022:7;23995:39;;;;;;;;;;;;:16;:39::i;:::-;23857:185;;;:::o;35821:233::-;35896:7;35932:30;:28;:30::i;:::-;35924:5;:38;35916:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36029:10;36040:5;36029:17;;;;;;;;:::i;:::-;;;;;;;;;;36022:24;;35821:233;;;:::o;59674:89::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59750:8:::1;59740:7;:18;;;;;;;;;;;;:::i;:::-;;59674:89:::0;:::o;44511:86::-;44558:4;44582:7;;;;;;;;;;;44575:14;;44511:86;:::o;57603:140::-;56995:10;;56978:13;:11;:13::i;:::-;:27;;56970:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57043:7;:5;:7::i;:::-;57027:23;;:12;:10;:12::i;:::-;:23;;;57023:79;;57067:8;:6;:8::i;:::-;57066:9;57058:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57023:79;57724:14:::1;57730:7;57724:5;:14::i;:::-;57603:140:::0;:::o;20831:239::-;20903:7;20923:13;20939:7;:16;20947:7;20939:16;;;;;;;;;;;;;;;;;;;;;20923:32;;20991:1;20974:19;;:5;:19;;;;20966:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21057:5;21050:12;;;20831:239;;;:::o;59788:84::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59861:6:::1;59848:10;:19;;;;59788:84:::0;:::o;20561:208::-;20633:7;20678:1;20661:19;;:5;:19;;;;20653:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20745:9;:16;20755:5;20745:16;;;;;;;;;;;;;;;;20738:23;;20561:208;;;:::o;42709:103::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42774:30:::1;42801:1;42774:18;:30::i;:::-;42709:103::o:0;57971:293::-;58028:16;58051:18;58072:15;58082:4;58072:9;:15::i;:::-;58051:36;;58092:25;58134:10;58120:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58092:53;;58154:9;58150:90;58169:10;58165:1;:14;58150:90;;;58206:28;58226:4;58232:1;58206:19;:28::i;:::-;58192:8;58201:1;58192:11;;;;;;;;:::i;:::-;;;;;;;:42;;;;;58181:3;;;;;:::i;:::-;;;;58150:90;;;;58251:8;58244:15;;;;57971:293;;;:::o;59295:186::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59340:15:::1;59358:21;59340:39;;59402:1;59392:7;:11;59384:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59444:32;59455:10;59467:7;59444:10;:32::i;:::-;59335:146;59295:186::o:0;56302:72::-;;;;;;;;;;;;;:::o;42058:87::-;42104:7;42131:6;;;;;;;;;;;42124:13;;42058:87;:::o;57400:198::-;56995:10;;56978:13;:11;:13::i;:::-;:27;;56970:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57043:7;:5;:7::i;:::-;57027:23;;:12;:10;:12::i;:::-;:23;;;57023:79;;57067:8;:6;:8::i;:::-;57066:9;57058:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57023:79;57479:12:::1;;;;;;;;;;;57470:41;;;57512:10;57524:18;:30;57543:10;57524:30;;;;;;;;;;;;;;;:44;57555:12;57524:44;;;;;;;;;;;57470:99;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57574:19;57580:12;57574:5;:19::i;:::-;57400:198:::0;:::o;21306:104::-;21362:13;21395:7;21388:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21306:104;:::o;60220:269::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60299:11:::1;60295:190;60322:5;:12;60316:3;:18;60295:190;;;60384:4;60357:31;;:11;:23;60369:5;60375:3;60369:10;;;;;;;;:::i;:::-;;;;;;;;60357:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;60349:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60434:5;60408:11;:23;60420:5;60426:3;60420:10;;;;;;;;:::i;:::-;;;;;;;;60408:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;60445:34;60468:5;60474:3;60468:10;;;;;;;;:::i;:::-;;;;;;;;60445:22;:34::i;:::-;60336:5;;;;;:::i;:::-;;;;60295:190;;;;60220:269:::0;:::o;56246:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22990:155::-;23085:52;23104:12;:10;:12::i;:::-;23118:8;23128;23085:18;:52::i;:::-;22990:155;;:::o;58476:99::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58559:11:::1;58544:12;;:26;;;;;;;;;;;;;;;;;;58476:99:::0;:::o;58399:72::-;58440:4;58458:8;:6;:8::i;:::-;58451:15;;58399:72;:::o;24113:328::-;24288:41;24307:12;:10;:12::i;:::-;24321:7;24288:18;:41::i;:::-;24280:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24394:39;24408:4;24414:2;24418:7;24427:5;24394:13;:39::i;:::-;24113:328;;;;:::o;56414:42::-;;;;:::o;57117:256::-;56995:10;;56978:13;:11;:13::i;:::-;:27;;56970:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57043:7;:5;:7::i;:::-;57027:23;;:12;:10;:12::i;:::-;:23;;;57023:79;;57067:8;:6;:8::i;:::-;57066:9;57058:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;57023:79;57215:12:::1;;;;;;;;;;;57206:39;;;57246:10;57258:16;57206:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57280:16;:14;:16::i;:::-;57352;57301:18;:30;57320:10;57301:30;;;;;;;;;;;;;;;:48;57332:16;:14;:16::i;:::-;57301:48;;;;;;;;;;;:67;;;;;;;;;;;;:::i;:::-;;57117:256:::0;:::o;58602:341::-;58675:13;58705:16;58713:7;58705;:16::i;:::-;58697:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58777:28;58808:10;:8;:10::i;:::-;58777:41;;58861:1;58836:14;58830:28;:32;:108;;;;;;;;;;;;;;;;;58893:14;58909:18;:7;:16;:18::i;:::-;58876:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58830:108;58823:115;;;58602:341;;;:::o;56547:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;23216:164::-;23313:4;23337:18;:25;23356:5;23337:25;;;;;;;;;;;;;;;:35;23363:8;23337:35;;;;;;;;;;;;;;;;;;;;;;;;;23330:42;;23216:164;;;;:::o;42967:201::-;42289:12;:10;:12::i;:::-;42278:23;;:7;:5;:7::i;:::-;:23;;;42270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43076:1:::1;43056:22;;:8;:22;;;;43048:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43132:28;43151:8;43132:18;:28::i;:::-;42967:201:::0;:::o;56271:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20192:305::-;20294:4;20346:25;20331:40;;;:11;:40;;;;:105;;;;20403:33;20388:48;;;:11;:48;;;;20331:105;:158;;;;20453:36;20477:11;20453:23;:36::i;:::-;20331:158;20311:178;;20192:305;;;:::o;15898:98::-;15951:7;15978:10;15971:17;;15898:98;:::o;45311:118::-;44837:8;:6;:8::i;:::-;44836:9;44828:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45381:4:::1;45371:7;;:14;;;;;;;;;;;;;;;;;;45401:20;45408:12;:10;:12::i;:::-;45401:20;;;;;;:::i;:::-;;;;;;;;45311:118::o:0;45570:120::-;45114:8;:6;:8::i;:::-;45106:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45639:5:::1;45629:7;;:15;;;;;;;;;;;;;;;;;;45660:22;45669:12;:10;:12::i;:::-;45660:22;;;;;;:::i;:::-;;;;;;;;45570:120::o:0;25951:127::-;26016:4;26068:1;26040:30;;:7;:16;26048:7;26040:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26033:37;;25951:127;;;:::o;30097:174::-;30199:2;30172:15;:24;30188:7;30172:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30255:7;30251:2;30217:46;;30226:23;30241:7;30226:14;:23::i;:::-;30217:46;;;;;;;;;;;;30097:174;;:::o;53303:114::-;53368:7;53395;:14;;;53388:21;;53303:114;;;:::o;26245:348::-;26338:4;26363:16;26371:7;26363;:16::i;:::-;26355:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26439:13;26455:23;26470:7;26455:14;:23::i;:::-;26439:39;;26508:5;26497:16;;:7;:16;;;:52;;;;26517:32;26534:5;26541:7;26517:16;:32::i;:::-;26497:52;:87;;;;26577:7;26553:31;;:20;26565:7;26553:11;:20::i;:::-;:31;;;26497:87;26489:96;;;26245:348;;;;:::o;29354:625::-;29513:4;29486:31;;:23;29501:7;29486:14;:23::i;:::-;:31;;;29478:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29592:1;29578:16;;:2;:16;;;;29570:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29648:39;29669:4;29675:2;29679:7;29648:20;:39::i;:::-;29752:29;29769:1;29773:7;29752:8;:29::i;:::-;29813:1;29794:9;:15;29804:4;29794:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29842:1;29825:9;:13;29835:2;29825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29873:2;29854:7;:16;29862:7;29854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29912:7;29908:2;29893:27;;29902:4;29893:27;;;;;;;;;;;;29933:38;29953:4;29959:2;29963:7;29933:19;:38::i;:::-;29354:625;;;:::o;28597:420::-;28657:13;28673:23;28688:7;28673:14;:23::i;:::-;28657:39;;28709:48;28730:5;28745:1;28749:7;28709:20;:48::i;:::-;28798:29;28815:1;28819:7;28798:8;:29::i;:::-;28860:1;28840:9;:16;28850:5;28840:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28879:7;:16;28887:7;28879:16;;;;;;;;;;;;28872:23;;;;;;;;;;;28941:7;28937:1;28913:36;;28922:5;28913:36;;;;;;;;;;;;28962:47;28982:5;28997:1;29001:7;28962:19;:47::i;:::-;28646:371;28597:420;:::o;43328:191::-;43402:16;43421:6;;;;;;;;;;;43402:25;;43447:8;43438:6;;:17;;;;;;;;;;;;;;;;;;43502:8;43471:40;;43492:8;43471:40;;;;;;;;;;;;43391:128;43328:191;:::o;59486:166::-;59555:12;59573:8;:13;;59594:7;59573:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59554:52;;;59619:7;59611:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;59549:103;59486:166;;:::o;60494:156::-;60555:6;60570:46;60594:5;60577:22;;:10;60588:1;60577:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:22;;;60570:46;;60607:3;;;;;:::i;:::-;;;;60570:46;;;60620:25;60643:1;60620:22;:25::i;:::-;60550:100;60494:156;:::o;30413:315::-;30568:8;30559:17;;:5;:17;;;;30551:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30655:8;30617:18;:25;30636:5;30617:25;;;;;;;;;;;;;;;:35;30643:8;30617:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30701:8;30679:41;;30694:5;30679:41;;;30711:8;30679:41;;;;;;:::i;:::-;;;;;;;;30413:315;;;:::o;25323:::-;25480:28;25490:4;25496:2;25500:7;25480:9;:28::i;:::-;25527:48;25550:4;25556:2;25560:7;25569:5;25527:22;:48::i;:::-;25519:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25323:315;;;;:::o;57778:147::-;57817:27;:15;:25;:27::i;:::-;57849:16;57868;:14;:16::i;:::-;57849:35;;57889:31;57899:10;57911:8;57889:9;:31::i;:::-;57812:113;57778:147::o;56841:99::-;56901:13;56928:7;56921:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56841:99;:::o;16340:723::-;16396:13;16626:1;16617:5;:10;16613:53;;;16644:10;;;;;;;;;;;;;;;;;;;;;16613:53;16676:12;16691:5;16676:20;;16707:14;16732:78;16747:1;16739:4;:9;16732:78;;16765:8;;;;;:::i;:::-;;;;16796:2;16788:10;;;;;:::i;:::-;;;16732:78;;;16820:19;16852:6;16842:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16820:39;;16870:154;16886:1;16877:5;:10;16870:154;;16914:1;16904:11;;;;;:::i;:::-;;;16981:2;16973:5;:10;;;;:::i;:::-;16960:2;:24;;;;:::i;:::-;16947:39;;16930:6;16937;16930:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17010:2;17001:11;;;;;:::i;:::-;;;16870:154;;;17048:6;17034:21;;;;;16340:723;;;;:::o;18799:157::-;18884:4;18923:25;18908:40;;;:11;:40;;;;18901:47;;18799:157;;;:::o;36667:589::-;36811:45;36838:4;36844:2;36848:7;36811:26;:45::i;:::-;36889:1;36873:18;;:4;:18;;;36869:187;;;36908:40;36940:7;36908:31;:40::i;:::-;36869:187;;;36978:2;36970:10;;:4;:10;;;36966:90;;36997:47;37030:4;37036:7;36997:32;:47::i;:::-;36966:90;36869:187;37084:1;37070:16;;:2;:16;;;37066:183;;;37103:45;37140:7;37103:36;:45::i;:::-;37066:183;;;37176:4;37170:10;;:2;:10;;;37166:83;;37197:40;37225:2;37229:7;37197:27;:40::i;:::-;37166:83;37066:183;36667:589;;;:::o;33175:125::-;;;;:::o;60655:161::-;60709:82;60736:1;60718:10;:17;;;;:19;;;;:::i;:::-;60716:1;:21;60709:82;;;60761:10;60774:1;60772;:3;;;;:::i;:::-;60761:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60745:10;60756:1;60745:13;;;;;;;;:::i;:::-;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;60782:3;;;;;:::i;:::-;;;;60709:82;;;60795:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;60655:161;:::o;31293:799::-;31448:4;31469:15;:2;:13;;;:15::i;:::-;31465:620;;;31521:2;31505:36;;;31542:12;:10;:12::i;:::-;31556:4;31562:7;31571:5;31505:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31501:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31764:1;31747:6;:13;:18;31743:272;;;31790:60;;;;;;;;;;:::i;:::-;;;;;;;;31743:272;31965:6;31959:13;31950:6;31946:2;31942:15;31935:38;31501:529;31638:41;;;31628:51;;;:6;:51;;;;31621:58;;;;;31465:620;32069:4;32062:11;;31293:799;;;;;;;:::o;53425:127::-;53532:1;53514:7;:14;;;:19;;;;;;;;;;;53425:127;:::o;26935:110::-;27011:26;27021:2;27025:7;27011:26;;;;;;;;;;;;:9;:26::i;:::-;26935:110;;:::o;32664:126::-;;;;:::o;37979:164::-;38083:10;:17;;;;38056:15;:24;38072:7;38056:24;;;;;;;;;;;:44;;;;38111:10;38127:7;38111:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37979:164;:::o;38770:988::-;39036:22;39086:1;39061:22;39078:4;39061:16;:22::i;:::-;:26;;;;:::i;:::-;39036:51;;39098:18;39119:17;:26;39137:7;39119:26;;;;;;;;;;;;39098:47;;39266:14;39252:10;:28;39248:328;;39297:19;39319:12;:18;39332:4;39319:18;;;;;;;;;;;;;;;:34;39338:14;39319:34;;;;;;;;;;;;39297:56;;39403:11;39370:12;:18;39383:4;39370:18;;;;;;;;;;;;;;;:30;39389:10;39370:30;;;;;;;;;;;:44;;;;39520:10;39487:17;:30;39505:11;39487:30;;;;;;;;;;;:43;;;;39282:294;39248:328;39672:17;:26;39690:7;39672:26;;;;;;;;;;;39665:33;;;39716:12;:18;39729:4;39716:18;;;;;;;;;;;;;;;:34;39735:14;39716:34;;;;;;;;;;;39709:41;;;38851:907;;38770:988;;:::o;40053:1079::-;40306:22;40351:1;40331:10;:17;;;;:21;;;;:::i;:::-;40306:46;;40363:18;40384:15;:24;40400:7;40384:24;;;;;;;;;;;;40363:45;;40735:19;40757:10;40768:14;40757:26;;;;;;;;:::i;:::-;;;;;;;;;;40735:48;;40821:11;40796:10;40807;40796:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40932:10;40901:15;:28;40917:11;40901:28;;;;;;;;;;;:41;;;;41073:15;:24;41089:7;41073:24;;;;;;;;;;;41066:31;;;41108:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40124:1008;;;40053:1079;:::o;37557:221::-;37642:14;37659:20;37676:2;37659:16;:20::i;:::-;37642:37;;37717:7;37690:12;:16;37703:2;37690:16;;;;;;;;;;;;;;;:24;37707:6;37690:24;;;;;;;;;;;:34;;;;37764:6;37735:17;:26;37753:7;37735:26;;;;;;;;;;;:35;;;;37631:147;37557:221;;:::o;8088:326::-;8148:4;8405:1;8383:7;:19;;;:23;8376:30;;8088:326;;;:::o;27272:321::-;27402:18;27408:2;27412:7;27402:5;:18::i;:::-;27453:54;27484:1;27488:2;27492:7;27501:5;27453:22;:54::i;:::-;27431:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27272:321;;;:::o;27929:439::-;28023:1;28009:16;;:2;:16;;;;28001:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28082:16;28090:7;28082;:16::i;:::-;28081:17;28073:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28144:45;28173:1;28177:2;28181:7;28144:20;:45::i;:::-;28219:1;28202:9;:13;28212:2;28202:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28250:2;28231:7;:16;28239:7;28231:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28295:7;28291:2;28270:33;;28287:1;28270:33;;;;;;;;;;;;28316:44;28344:1;28348:2;28352:7;28316:19;:44::i;:::-;27929:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:619::-;7973:6;7981;7989;8038:2;8026:9;8017:7;8013:23;8009:32;8006:119;;;8044:79;;:::i;:::-;8006:119;8164:1;8189:53;8234:7;8225:6;8214:9;8210:22;8189:53;:::i;:::-;8179:63;;8135:117;8291:2;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;:::i;:::-;8307:63;;8262:118;8419:2;8445:53;8490:7;8481:6;8470:9;8466:22;8445:53;:::i;:::-;8435:63;;8390:118;7896:619;;;;;:::o;8521:539::-;8605:6;8654:2;8642:9;8633:7;8629:23;8625:32;8622:119;;;8660:79;;:::i;:::-;8622:119;8808:1;8797:9;8793:17;8780:31;8838:18;8830:6;8827:30;8824:117;;;8860:79;;:::i;:::-;8824:117;8965:78;9035:7;9026:6;9015:9;9011:22;8965:78;:::i;:::-;8955:88;;8751:302;8521:539;;;;:::o;9066:::-;9150:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:119;;;9205:79;;:::i;:::-;9167:119;9353:1;9342:9;9338:17;9325:31;9383:18;9375:6;9372:30;9369:117;;;9405:79;;:::i;:::-;9369:117;9510:78;9580:7;9571:6;9560:9;9556:22;9510:78;:::i;:::-;9500:88;;9296:302;9066:539;;;;:::o;9611:323::-;9667:6;9716:2;9704:9;9695:7;9691:23;9687:32;9684:119;;;9722:79;;:::i;:::-;9684:119;9842:1;9867:50;9909:7;9900:6;9889:9;9885:22;9867:50;:::i;:::-;9857:60;;9813:114;9611:323;;;;:::o;9940:327::-;9998:6;10047:2;10035:9;10026:7;10022:23;10018:32;10015:119;;;10053:79;;:::i;:::-;10015:119;10173:1;10198:52;10242:7;10233:6;10222:9;10218:22;10198:52;:::i;:::-;10188:62;;10144:116;9940:327;;;;:::o;10273:349::-;10342:6;10391:2;10379:9;10370:7;10366:23;10362:32;10359:119;;;10397:79;;:::i;:::-;10359:119;10517:1;10542:63;10597:7;10588:6;10577:9;10573:22;10542:63;:::i;:::-;10532:73;;10488:127;10273:349;;;;:::o;10628:509::-;10697:6;10746:2;10734:9;10725:7;10721:23;10717:32;10714:119;;;10752:79;;:::i;:::-;10714:119;10900:1;10889:9;10885:17;10872:31;10930:18;10922:6;10919:30;10916:117;;;10952:79;;:::i;:::-;10916:117;11057:63;11112:7;11103:6;11092:9;11088:22;11057:63;:::i;:::-;11047:73;;10843:287;10628:509;;;;:::o;11143:329::-;11202:6;11251:2;11239:9;11230:7;11226:23;11222:32;11219:119;;;11257:79;;:::i;:::-;11219:119;11377:1;11402:53;11447:7;11438:6;11427:9;11423:22;11402:53;:::i;:::-;11392:63;;11348:117;11143:329;;;;:::o;11478:179::-;11547:10;11568:46;11610:3;11602:6;11568:46;:::i;:::-;11646:4;11641:3;11637:14;11623:28;;11478:179;;;;:::o;11663:118::-;11750:24;11768:5;11750:24;:::i;:::-;11745:3;11738:37;11663:118;;:::o;11817:732::-;11936:3;11965:54;12013:5;11965:54;:::i;:::-;12035:86;12114:6;12109:3;12035:86;:::i;:::-;12028:93;;12145:56;12195:5;12145:56;:::i;:::-;12224:7;12255:1;12240:284;12265:6;12262:1;12259:13;12240:284;;;12341:6;12335:13;12368:63;12427:3;12412:13;12368:63;:::i;:::-;12361:70;;12454:60;12507:6;12454:60;:::i;:::-;12444:70;;12300:224;12287:1;12284;12280:9;12275:14;;12240:284;;;12244:14;12540:3;12533:10;;11941:608;;;11817:732;;;;:::o;12585:751::-;12701:3;12730:51;12775:5;12730:51;:::i;:::-;12797:86;12876:6;12871:3;12797:86;:::i;:::-;12790:93;;12907:53;12954:5;12907:53;:::i;:::-;12983:7;13014:1;12999:312;13024:6;13021:1;13018:13;12999:312;;;13094:44;13131:6;13094:44;:::i;:::-;13158:63;13217:3;13202:13;13158:63;:::i;:::-;13151:70;;13244:57;13294:6;13244:57;:::i;:::-;13234:67;;13059:252;13046:1;13043;13039:9;13034:14;;12999:312;;;13003:14;13327:3;13320:10;;12706:630;;;12585:751;;;;:::o;13342:109::-;13423:21;13438:5;13423:21;:::i;:::-;13418:3;13411:34;13342:109;;:::o;13457:360::-;13543:3;13571:38;13603:5;13571:38;:::i;:::-;13625:70;13688:6;13683:3;13625:70;:::i;:::-;13618:77;;13704:52;13749:6;13744:3;13737:4;13730:5;13726:16;13704:52;:::i;:::-;13781:29;13803:6;13781:29;:::i;:::-;13776:3;13772:39;13765:46;;13547:270;13457:360;;;;:::o;13823:364::-;13911:3;13939:39;13972:5;13939:39;:::i;:::-;13994:71;14058:6;14053:3;13994:71;:::i;:::-;13987:78;;14074:52;14119:6;14114:3;14107:4;14100:5;14096:16;14074:52;:::i;:::-;14151:29;14173:6;14151:29;:::i;:::-;14146:3;14142:39;14135:46;;13915:272;13823:364;;;;:::o;14193:377::-;14299:3;14327:39;14360:5;14327:39;:::i;:::-;14382:89;14464:6;14459:3;14382:89;:::i;:::-;14375:96;;14480:52;14525:6;14520:3;14513:4;14506:5;14502:16;14480:52;:::i;:::-;14557:6;14552:3;14548:16;14541:23;;14303:267;14193:377;;;;:::o;14576:366::-;14718:3;14739:67;14803:2;14798:3;14739:67;:::i;:::-;14732:74;;14815:93;14904:3;14815:93;:::i;:::-;14933:2;14928:3;14924:12;14917:19;;14576:366;;;:::o;14948:::-;15090:3;15111:67;15175:2;15170:3;15111:67;:::i;:::-;15104:74;;15187:93;15276:3;15187:93;:::i;:::-;15305:2;15300:3;15296:12;15289:19;;14948:366;;;:::o;15320:::-;15462:3;15483:67;15547:2;15542:3;15483:67;:::i;:::-;15476:74;;15559:93;15648:3;15559:93;:::i;:::-;15677:2;15672:3;15668:12;15661:19;;15320:366;;;:::o;15692:::-;15834:3;15855:67;15919:2;15914:3;15855:67;:::i;:::-;15848:74;;15931:93;16020:3;15931:93;:::i;:::-;16049:2;16044:3;16040:12;16033:19;;15692:366;;;:::o;16064:::-;16206:3;16227:67;16291:2;16286:3;16227:67;:::i;:::-;16220:74;;16303:93;16392:3;16303:93;:::i;:::-;16421:2;16416:3;16412:12;16405:19;;16064:366;;;:::o;16436:::-;16578:3;16599:67;16663:2;16658:3;16599:67;:::i;:::-;16592:74;;16675:93;16764:3;16675:93;:::i;:::-;16793:2;16788:3;16784:12;16777:19;;16436:366;;;:::o;16808:::-;16950:3;16971:67;17035:2;17030:3;16971:67;:::i;:::-;16964:74;;17047:93;17136:3;17047:93;:::i;:::-;17165:2;17160:3;17156:12;17149:19;;16808:366;;;:::o;17180:::-;17322:3;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17419:93;17508:3;17419:93;:::i;:::-;17537:2;17532:3;17528:12;17521:19;;17180:366;;;:::o;17552:::-;17694:3;17715:67;17779:2;17774:3;17715:67;:::i;:::-;17708:74;;17791:93;17880:3;17791:93;:::i;:::-;17909:2;17904:3;17900:12;17893:19;;17552:366;;;:::o;17924:365::-;18066:3;18087:66;18151:1;18146:3;18087:66;:::i;:::-;18080:73;;18162:93;18251:3;18162:93;:::i;:::-;18280:2;18275:3;18271:12;18264:19;;17924:365;;;:::o;18295:366::-;18437:3;18458:67;18522:2;18517:3;18458:67;:::i;:::-;18451:74;;18534:93;18623:3;18534:93;:::i;:::-;18652:2;18647:3;18643:12;18636:19;;18295:366;;;:::o;18667:::-;18809:3;18830:67;18894:2;18889:3;18830:67;:::i;:::-;18823:74;;18906:93;18995:3;18906:93;:::i;:::-;19024:2;19019:3;19015:12;19008:19;;18667:366;;;:::o;19039:::-;19181:3;19202:67;19266:2;19261:3;19202:67;:::i;:::-;19195:74;;19278:93;19367:3;19278:93;:::i;:::-;19396:2;19391:3;19387:12;19380:19;;19039:366;;;:::o;19411:::-;19553:3;19574:67;19638:2;19633:3;19574:67;:::i;:::-;19567:74;;19650:93;19739:3;19650:93;:::i;:::-;19768:2;19763:3;19759:12;19752:19;;19411:366;;;:::o;19783:::-;19925:3;19946:67;20010:2;20005:3;19946:67;:::i;:::-;19939:74;;20022:93;20111:3;20022:93;:::i;:::-;20140:2;20135:3;20131:12;20124:19;;19783:366;;;:::o;20155:::-;20297:3;20318:67;20382:2;20377:3;20318:67;:::i;:::-;20311:74;;20394:93;20483:3;20394:93;:::i;:::-;20512:2;20507:3;20503:12;20496:19;;20155:366;;;:::o;20527:365::-;20669:3;20690:66;20754:1;20749:3;20690:66;:::i;:::-;20683:73;;20765:93;20854:3;20765:93;:::i;:::-;20883:2;20878:3;20874:12;20867:19;;20527:365;;;:::o;20898:366::-;21040:3;21061:67;21125:2;21120:3;21061:67;:::i;:::-;21054:74;;21137:93;21226:3;21137:93;:::i;:::-;21255:2;21250:3;21246:12;21239:19;;20898:366;;;:::o;21270:::-;21412:3;21433:67;21497:2;21492:3;21433:67;:::i;:::-;21426:74;;21509:93;21598:3;21509:93;:::i;:::-;21627:2;21622:3;21618:12;21611:19;;21270:366;;;:::o;21642:::-;21784:3;21805:67;21869:2;21864:3;21805:67;:::i;:::-;21798:74;;21881:93;21970:3;21881:93;:::i;:::-;21999:2;21994:3;21990:12;21983:19;;21642:366;;;:::o;22014:::-;22156:3;22177:67;22241:2;22236:3;22177:67;:::i;:::-;22170:74;;22253:93;22342:3;22253:93;:::i;:::-;22371:2;22366:3;22362:12;22355:19;;22014:366;;;:::o;22386:398::-;22545:3;22566:83;22647:1;22642:3;22566:83;:::i;:::-;22559:90;;22658:93;22747:3;22658:93;:::i;:::-;22776:1;22771:3;22767:11;22760:18;;22386:398;;;:::o;22790:366::-;22932:3;22953:67;23017:2;23012:3;22953:67;:::i;:::-;22946:74;;23029:93;23118:3;23029:93;:::i;:::-;23147:2;23142:3;23138:12;23131:19;;22790:366;;;:::o;23162:::-;23304:3;23325:67;23389:2;23384:3;23325:67;:::i;:::-;23318:74;;23401:93;23490:3;23401:93;:::i;:::-;23519:2;23514:3;23510:12;23503:19;;23162:366;;;:::o;23534:::-;23676:3;23697:67;23761:2;23756:3;23697:67;:::i;:::-;23690:74;;23773:93;23862:3;23773:93;:::i;:::-;23891:2;23886:3;23882:12;23875:19;;23534:366;;;:::o;23906:::-;24048:3;24069:67;24133:2;24128:3;24069:67;:::i;:::-;24062:74;;24145:93;24234:3;24145:93;:::i;:::-;24263:2;24258:3;24254:12;24247:19;;23906:366;;;:::o;24278:108::-;24355:24;24373:5;24355:24;:::i;:::-;24350:3;24343:37;24278:108;;:::o;24392:118::-;24479:24;24497:5;24479:24;:::i;:::-;24474:3;24467:37;24392:118;;:::o;24516:435::-;24696:3;24718:95;24809:3;24800:6;24718:95;:::i;:::-;24711:102;;24830:95;24921:3;24912:6;24830:95;:::i;:::-;24823:102;;24942:3;24935:10;;24516:435;;;;;:::o;24957:379::-;25141:3;25163:147;25306:3;25163:147;:::i;:::-;25156:154;;25327:3;25320:10;;24957:379;;;:::o;25342:222::-;25435:4;25473:2;25462:9;25458:18;25450:26;;25486:71;25554:1;25543:9;25539:17;25530:6;25486:71;:::i;:::-;25342:222;;;;:::o;25570:640::-;25765:4;25803:3;25792:9;25788:19;25780:27;;25817:71;25885:1;25874:9;25870:17;25861:6;25817:71;:::i;:::-;25898:72;25966:2;25955:9;25951:18;25942:6;25898:72;:::i;:::-;25980;26048:2;26037:9;26033:18;26024:6;25980:72;:::i;:::-;26099:9;26093:4;26089:20;26084:2;26073:9;26069:18;26062:48;26127:76;26198:4;26189:6;26127:76;:::i;:::-;26119:84;;25570:640;;;;;;;:::o;26216:483::-;26387:4;26425:2;26414:9;26410:18;26402:26;;26438:71;26506:1;26495:9;26491:17;26482:6;26438:71;:::i;:::-;26556:9;26550:4;26546:20;26541:2;26530:9;26526:18;26519:48;26584:108;26687:4;26678:6;26584:108;:::i;:::-;26576:116;;26216:483;;;;;:::o;26705:477::-;26873:4;26911:2;26900:9;26896:18;26888:26;;26924:71;26992:1;26981:9;26977:17;26968:6;26924:71;:::i;:::-;27042:9;27036:4;27032:20;27027:2;27016:9;27012:18;27005:48;27070:105;27170:4;27161:6;27070:105;:::i;:::-;27062:113;;26705:477;;;;;:::o;27188:373::-;27331:4;27369:2;27358:9;27354:18;27346:26;;27418:9;27412:4;27408:20;27404:1;27393:9;27389:17;27382:47;27446:108;27549:4;27540:6;27446:108;:::i;:::-;27438:116;;27188:373;;;;:::o;27567:210::-;27654:4;27692:2;27681:9;27677:18;27669:26;;27705:65;27767:1;27756:9;27752:17;27743:6;27705:65;:::i;:::-;27567:210;;;;:::o;27783:313::-;27896:4;27934:2;27923:9;27919:18;27911:26;;27983:9;27977:4;27973:20;27969:1;27958:9;27954:17;27947:47;28011:78;28084:4;28075:6;28011:78;:::i;:::-;28003:86;;27783:313;;;;:::o;28102:419::-;28268:4;28306:2;28295:9;28291:18;28283:26;;28355:9;28349:4;28345:20;28341:1;28330:9;28326:17;28319:47;28383:131;28509:4;28383:131;:::i;:::-;28375:139;;28102:419;;;:::o;28527:::-;28693:4;28731:2;28720:9;28716:18;28708:26;;28780:9;28774:4;28770:20;28766:1;28755:9;28751:17;28744:47;28808:131;28934:4;28808:131;:::i;:::-;28800:139;;28527:419;;;:::o;28952:::-;29118:4;29156:2;29145:9;29141:18;29133:26;;29205:9;29199:4;29195:20;29191:1;29180:9;29176:17;29169:47;29233:131;29359:4;29233:131;:::i;:::-;29225:139;;28952:419;;;:::o;29377:::-;29543:4;29581:2;29570:9;29566:18;29558:26;;29630:9;29624:4;29620:20;29616:1;29605:9;29601:17;29594:47;29658:131;29784:4;29658:131;:::i;:::-;29650:139;;29377:419;;;:::o;29802:::-;29968:4;30006:2;29995:9;29991:18;29983:26;;30055:9;30049:4;30045:20;30041:1;30030:9;30026:17;30019:47;30083:131;30209:4;30083:131;:::i;:::-;30075:139;;29802:419;;;:::o;30227:::-;30393:4;30431:2;30420:9;30416:18;30408:26;;30480:9;30474:4;30470:20;30466:1;30455:9;30451:17;30444:47;30508:131;30634:4;30508:131;:::i;:::-;30500:139;;30227:419;;;:::o;30652:::-;30818:4;30856:2;30845:9;30841:18;30833:26;;30905:9;30899:4;30895:20;30891:1;30880:9;30876:17;30869:47;30933:131;31059:4;30933:131;:::i;:::-;30925:139;;30652:419;;;:::o;31077:::-;31243:4;31281:2;31270:9;31266:18;31258:26;;31330:9;31324:4;31320:20;31316:1;31305:9;31301:17;31294:47;31358:131;31484:4;31358:131;:::i;:::-;31350:139;;31077:419;;;:::o;31502:::-;31668:4;31706:2;31695:9;31691:18;31683:26;;31755:9;31749:4;31745:20;31741:1;31730:9;31726:17;31719:47;31783:131;31909:4;31783:131;:::i;:::-;31775:139;;31502:419;;;:::o;31927:::-;32093:4;32131:2;32120:9;32116:18;32108:26;;32180:9;32174:4;32170:20;32166:1;32155:9;32151:17;32144:47;32208:131;32334:4;32208:131;:::i;:::-;32200:139;;31927:419;;;:::o;32352:::-;32518:4;32556:2;32545:9;32541:18;32533:26;;32605:9;32599:4;32595:20;32591:1;32580:9;32576:17;32569:47;32633:131;32759:4;32633:131;:::i;:::-;32625:139;;32352:419;;;:::o;32777:::-;32943:4;32981:2;32970:9;32966:18;32958:26;;33030:9;33024:4;33020:20;33016:1;33005:9;33001:17;32994:47;33058:131;33184:4;33058:131;:::i;:::-;33050:139;;32777:419;;;:::o;33202:::-;33368:4;33406:2;33395:9;33391:18;33383:26;;33455:9;33449:4;33445:20;33441:1;33430:9;33426:17;33419:47;33483:131;33609:4;33483:131;:::i;:::-;33475:139;;33202:419;;;:::o;33627:::-;33793:4;33831:2;33820:9;33816:18;33808:26;;33880:9;33874:4;33870:20;33866:1;33855:9;33851:17;33844:47;33908:131;34034:4;33908:131;:::i;:::-;33900:139;;33627:419;;;:::o;34052:::-;34218:4;34256:2;34245:9;34241:18;34233:26;;34305:9;34299:4;34295:20;34291:1;34280:9;34276:17;34269:47;34333:131;34459:4;34333:131;:::i;:::-;34325:139;;34052:419;;;:::o;34477:::-;34643:4;34681:2;34670:9;34666:18;34658:26;;34730:9;34724:4;34720:20;34716:1;34705:9;34701:17;34694:47;34758:131;34884:4;34758:131;:::i;:::-;34750:139;;34477:419;;;:::o;34902:::-;35068:4;35106:2;35095:9;35091:18;35083:26;;35155:9;35149:4;35145:20;35141:1;35130:9;35126:17;35119:47;35183:131;35309:4;35183:131;:::i;:::-;35175:139;;34902:419;;;:::o;35327:::-;35493:4;35531:2;35520:9;35516:18;35508:26;;35580:9;35574:4;35570:20;35566:1;35555:9;35551:17;35544:47;35608:131;35734:4;35608:131;:::i;:::-;35600:139;;35327:419;;;:::o;35752:::-;35918:4;35956:2;35945:9;35941:18;35933:26;;36005:9;35999:4;35995:20;35991:1;35980:9;35976:17;35969:47;36033:131;36159:4;36033:131;:::i;:::-;36025:139;;35752:419;;;:::o;36177:::-;36343:4;36381:2;36370:9;36366:18;36358:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36458:131;36584:4;36458:131;:::i;:::-;36450:139;;36177:419;;;:::o;36602:::-;36768:4;36806:2;36795:9;36791:18;36783:26;;36855:9;36849:4;36845:20;36841:1;36830:9;36826:17;36819:47;36883:131;37009:4;36883:131;:::i;:::-;36875:139;;36602:419;;;:::o;37027:::-;37193:4;37231:2;37220:9;37216:18;37208:26;;37280:9;37274:4;37270:20;37266:1;37255:9;37251:17;37244:47;37308:131;37434:4;37308:131;:::i;:::-;37300:139;;37027:419;;;:::o;37452:::-;37618:4;37656:2;37645:9;37641:18;37633:26;;37705:9;37699:4;37695:20;37691:1;37680:9;37676:17;37669:47;37733:131;37859:4;37733:131;:::i;:::-;37725:139;;37452:419;;;:::o;37877:::-;38043:4;38081:2;38070:9;38066:18;38058:26;;38130:9;38124:4;38120:20;38116:1;38105:9;38101:17;38094:47;38158:131;38284:4;38158:131;:::i;:::-;38150:139;;37877:419;;;:::o;38302:::-;38468:4;38506:2;38495:9;38491:18;38483:26;;38555:9;38549:4;38545:20;38541:1;38530:9;38526:17;38519:47;38583:131;38709:4;38583:131;:::i;:::-;38575:139;;38302:419;;;:::o;38727:222::-;38820:4;38858:2;38847:9;38843:18;38835:26;;38871:71;38939:1;38928:9;38924:17;38915:6;38871:71;:::i;:::-;38727:222;;;;:::o;38955:129::-;38989:6;39016:20;;:::i;:::-;39006:30;;39045:33;39073:4;39065:6;39045:33;:::i;:::-;38955:129;;;:::o;39090:75::-;39123:6;39156:2;39150:9;39140:19;;39090:75;:::o;39171:311::-;39248:4;39338:18;39330:6;39327:30;39324:56;;;39360:18;;:::i;:::-;39324:56;39410:4;39402:6;39398:17;39390:25;;39470:4;39464;39460:15;39452:23;;39171:311;;;:::o;39488:::-;39565:4;39655:18;39647:6;39644:30;39641:56;;;39677:18;;:::i;:::-;39641:56;39727:4;39719:6;39715:17;39707:25;;39787:4;39781;39777:15;39769:23;;39488:311;;;:::o;39805:307::-;39866:4;39956:18;39948:6;39945:30;39942:56;;;39978:18;;:::i;:::-;39942:56;40016:29;40038:6;40016:29;:::i;:::-;40008:37;;40100:4;40094;40090:15;40082:23;;39805:307;;;:::o;40118:308::-;40180:4;40270:18;40262:6;40259:30;40256:56;;;40292:18;;:::i;:::-;40256:56;40330:29;40352:6;40330:29;:::i;:::-;40322:37;;40414:4;40408;40404:15;40396:23;;40118:308;;;:::o;40432:132::-;40499:4;40522:3;40514:11;;40552:4;40547:3;40543:14;40535:22;;40432:132;;;:::o;40570:156::-;40634:4;40657:3;40649:11;;40680:3;40677:1;40670:14;40714:4;40711:1;40701:18;40693:26;;40570:156;;;:::o;40732:114::-;40799:6;40833:5;40827:12;40817:22;;40732:114;;;:::o;40852:111::-;40916:6;40950:5;40944:12;40934:22;;40852:111;;;:::o;40969:98::-;41020:6;41054:5;41048:12;41038:22;;40969:98;;;:::o;41073:99::-;41125:6;41159:5;41153:12;41143:22;;41073:99;;;:::o;41178:113::-;41248:4;41280;41275:3;41271:14;41263:22;;41178:113;;;:::o;41297:110::-;41364:4;41396;41391:3;41387:14;41379:22;;41297:110;;;:::o;41413:184::-;41512:11;41546:6;41541:3;41534:19;41586:4;41581:3;41577:14;41562:29;;41413:184;;;;:::o;41603:168::-;41686:11;41720:6;41715:3;41708:19;41760:4;41755:3;41751:14;41736:29;;41603:168;;;;:::o;41777:147::-;41878:11;41915:3;41900:18;;41777:147;;;;:::o;41930:169::-;42014:11;42048:6;42043:3;42036:19;42088:4;42083:3;42079:14;42064:29;;41930:169;;;;:::o;42105:148::-;42207:11;42244:3;42229:18;;42105:148;;;;:::o;42259:305::-;42299:3;42318:20;42336:1;42318:20;:::i;:::-;42313:25;;42352:20;42370:1;42352:20;:::i;:::-;42347:25;;42506:1;42438:66;42434:74;42431:1;42428:81;42425:107;;;42512:18;;:::i;:::-;42425:107;42556:1;42553;42549:9;42542:16;;42259:305;;;;:::o;42570:185::-;42610:1;42627:20;42645:1;42627:20;:::i;:::-;42622:25;;42661:20;42679:1;42661:20;:::i;:::-;42656:25;;42700:1;42690:35;;42705:18;;:::i;:::-;42690:35;42747:1;42744;42740:9;42735:14;;42570:185;;;;:::o;42761:191::-;42801:4;42821:20;42839:1;42821:20;:::i;:::-;42816:25;;42855:20;42873:1;42855:20;:::i;:::-;42850:25;;42894:1;42891;42888:8;42885:34;;;42899:18;;:::i;:::-;42885:34;42944:1;42941;42937:9;42929:17;;42761:191;;;;:::o;42958:90::-;43008:7;43037:5;43026:16;;42958:90;;;:::o;43054:96::-;43091:7;43120:24;43138:5;43120:24;:::i;:::-;43109:35;;43054:96;;;:::o;43156:90::-;43190:7;43233:5;43226:13;43219:21;43208:32;;43156:90;;;:::o;43252:149::-;43288:7;43328:66;43321:5;43317:78;43306:89;;43252:149;;;:::o;43407:126::-;43444:7;43484:42;43477:5;43473:54;43462:65;;43407:126;;;:::o;43539:77::-;43576:7;43605:5;43594:16;;43539:77;;;:::o;43622:154::-;43706:6;43701:3;43696;43683:30;43768:1;43759:6;43754:3;43750:16;43743:27;43622:154;;;:::o;43782:307::-;43850:1;43860:113;43874:6;43871:1;43868:13;43860:113;;;43959:1;43954:3;43950:11;43944:18;43940:1;43935:3;43931:11;43924:39;43896:2;43893:1;43889:10;43884:15;;43860:113;;;43991:6;43988:1;43985:13;43982:101;;;44071:1;44062:6;44057:3;44053:16;44046:27;43982:101;43831:258;43782:307;;;:::o;44095:320::-;44139:6;44176:1;44170:4;44166:12;44156:22;;44223:1;44217:4;44213:12;44244:18;44234:81;;44300:4;44292:6;44288:17;44278:27;;44234:81;44362:2;44354:6;44351:14;44331:18;44328:38;44325:84;;;44381:18;;:::i;:::-;44325:84;44146:269;44095:320;;;:::o;44421:166::-;44490:5;44515:66;44546:34;44569:10;44546:34;:::i;:::-;44515:66;:::i;:::-;44506:75;;44421:166;;;:::o;44593:281::-;44676:27;44698:4;44676:27;:::i;:::-;44668:6;44664:40;44806:6;44794:10;44791:22;44770:18;44758:10;44755:34;44752:62;44749:88;;;44817:18;;:::i;:::-;44749:88;44857:10;44853:2;44846:22;44636:238;44593:281;;:::o;44880:233::-;44919:3;44942:24;44960:5;44942:24;:::i;:::-;44933:33;;44988:66;44981:5;44978:77;44975:103;;;45058:18;;:::i;:::-;44975:103;45105:1;45098:5;45094:13;45087:20;;44880:233;;;:::o;45119:176::-;45151:1;45168:20;45186:1;45168:20;:::i;:::-;45163:25;;45202:20;45220:1;45202:20;:::i;:::-;45197:25;;45241:1;45231:35;;45246:18;;:::i;:::-;45231:35;45287:1;45284;45280:9;45275:14;;45119:176;;;;:::o;45301:180::-;45349:77;45346:1;45339:88;45446:4;45443:1;45436:15;45470:4;45467:1;45460:15;45487:180;45535:77;45532:1;45525:88;45632:4;45629:1;45622:15;45656:4;45653:1;45646:15;45673:180;45721:77;45718:1;45711:88;45818:4;45815:1;45808:15;45842:4;45839:1;45832:15;45859:180;45907:77;45904:1;45897:88;46004:4;46001:1;45994:15;46028:4;46025:1;46018:15;46045:180;46093:77;46090:1;46083:88;46190:4;46187:1;46180:15;46214:4;46211:1;46204:15;46231:180;46279:77;46276:1;46269:88;46376:4;46373:1;46366:15;46400:4;46397:1;46390:15;46417:144;46472:5;46497:57;46548:4;46542:11;46497:57;:::i;:::-;46488:66;;46417:144;;;:::o;46567:117::-;46676:1;46673;46666:12;46690:117;46799:1;46796;46789:12;46813:117;46922:1;46919;46912:12;46936:117;47045:1;47042;47035:12;47059:117;47168:1;47165;47158:12;47182:102;47223:6;47274:2;47270:7;47265:2;47258:5;47254:14;47250:28;47240:38;;47182:102;;;:::o;47290:::-;47332:8;47379:5;47376:1;47372:13;47351:34;;47290:102;;;:::o;47398:170::-;47538:22;47534:1;47526:6;47522:14;47515:46;47398:170;:::o;47574:230::-;47714:34;47710:1;47702:6;47698:14;47691:58;47783:13;47778:2;47770:6;47766:15;47759:38;47574:230;:::o;47810:237::-;47950:34;47946:1;47938:6;47934:14;47927:58;48019:20;48014:2;48006:6;48002:15;47995:45;47810:237;:::o;48053:225::-;48193:34;48189:1;48181:6;48177:14;48170:58;48262:8;48257:2;48249:6;48245:15;48238:33;48053:225;:::o;48284:224::-;48424:34;48420:1;48412:6;48408:14;48401:58;48493:7;48488:2;48480:6;48476:15;48469:32;48284:224;:::o;48514:178::-;48654:30;48650:1;48642:6;48638:14;48631:54;48514:178;:::o;48698:223::-;48838:34;48834:1;48826:6;48822:14;48815:58;48907:6;48902:2;48894:6;48890:15;48883:31;48698:223;:::o;48927:175::-;49067:27;49063:1;49055:6;49051:14;49044:51;48927:175;:::o;49108:231::-;49248:34;49244:1;49236:6;49232:14;49225:58;49317:14;49312:2;49304:6;49300:15;49293:39;49108:231;:::o;49345:159::-;49485:11;49481:1;49473:6;49469:14;49462:35;49345:159;:::o;49510:181::-;49650:33;49646:1;49638:6;49634:14;49627:57;49510:181;:::o;49697:166::-;49837:18;49833:1;49825:6;49821:14;49814:42;49697:166;:::o;49869:243::-;50009:34;50005:1;49997:6;49993:14;49986:58;50078:26;50073:2;50065:6;50061:15;50054:51;49869:243;:::o;50118:229::-;50258:34;50254:1;50246:6;50242:14;50235:58;50327:12;50322:2;50314:6;50310:15;50303:37;50118:229;:::o;50353:228::-;50493:34;50489:1;50481:6;50477:14;50470:58;50562:11;50557:2;50549:6;50545:15;50538:36;50353:228;:::o;50587:182::-;50727:34;50723:1;50715:6;50711:14;50704:58;50587:182;:::o;50775:158::-;50915:10;50911:1;50903:6;50899:14;50892:34;50775:158;:::o;50939:231::-;51079:34;51075:1;51067:6;51063:14;51056:58;51148:14;51143:2;51135:6;51131:15;51124:39;50939:231;:::o;51176:182::-;51316:34;51312:1;51304:6;51300:14;51293:58;51176:182;:::o;51364:234::-;51504:34;51500:1;51492:6;51488:14;51481:58;51573:17;51568:2;51560:6;51556:15;51549:42;51364:234;:::o;51604:220::-;51744:34;51740:1;51732:6;51728:14;51721:58;51813:3;51808:2;51800:6;51796:15;51789:28;51604:220;:::o;51830:114::-;;:::o;51950:166::-;52090:18;52086:1;52078:6;52074:14;52067:42;51950:166;:::o;52122:236::-;52262:34;52258:1;52250:6;52246:14;52239:58;52331:19;52326:2;52318:6;52314:15;52307:44;52122:236;:::o;52364:231::-;52504:34;52500:1;52492:6;52488:14;52481:58;52573:14;52568:2;52560:6;52556:15;52549:39;52364:231;:::o;52601:161::-;52741:13;52737:1;52729:6;52725:14;52718:37;52601:161;:::o;52768:122::-;52841:24;52859:5;52841:24;:::i;:::-;52834:5;52831:35;52821:63;;52880:1;52877;52870:12;52821:63;52768:122;:::o;52896:116::-;52966:21;52981:5;52966:21;:::i;:::-;52959:5;52956:32;52946:60;;53002:1;52999;52992:12;52946:60;52896:116;:::o;53018:120::-;53090:23;53107:5;53090:23;:::i;:::-;53083:5;53080:34;53070:62;;53128:1;53125;53118:12;53070:62;53018:120;:::o;53144:122::-;53217:24;53235:5;53217:24;:::i;:::-;53210:5;53207:35;53197:63;;53256:1;53253;53246:12;53197:63;53144:122;:::o

Swarm Source

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