ETH Price: $3,314.92 (+1.21%)
Gas: 5 Gwei

Token

White Town (WTN)
 

Overview

Max Total Supply

2,126 WTN

Holders

158

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 WTN
0xb40ba0a0d437fb3c1e3c4f9e5049cc889aa27483
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:
WhiteTown

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-05
*/

// SPDX-License-Identifier: MIT
//

pragma solidity ^0.8.12;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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 Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 public currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    string internal uri = "ipfs://QM/";

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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(), ".json")) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex && tokenId > 0;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract WhiteTown is ERC721A, Ownable {

    constructor() ERC721A("White Town", "WTN") {}

    uint public maxSupply = 10000;
    bool public saleStatus = true;
    uint public price;   
    uint public maxPerTx = 20;    
    uint public maxPerWallet = 50;
    uint public freeMintPrice = 0;
    uint public maxFreePerTx = 2;    
    uint public maxFreePerWallet = 2;
 
    // ---------------------------------------------------------------------------------------------
    // MAPPINGS
    // ---------------------------------------------------------------------------------------------

    mapping(address => uint) public _minted; 

    mapping(address => uint) public _freeminted; 

    // ---------------------------------------------------------------------------------------------
    // OWNER SETTERS
    // ---------------------------------------------------------------------------------------------

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function setSaleStatus() external onlyOwner {
        saleStatus = !saleStatus;
    }

    function setMaxSupply(uint supply) external onlyOwner {
        maxSupply = supply;
    }

    function setPrice(uint amount) external onlyOwner {
        price = amount;
    }
    
    function setMaxPerTx(uint amount) external onlyOwner {
        maxPerTx = amount;
    }
    
    function setMaxPerWallet(uint amount) external onlyOwner {
        maxPerWallet = amount;
    }

    function setMaxFreePerTx(uint amount) external onlyOwner {
        maxFreePerTx = amount;
    }
    
    function setMaxFreePerWallet(uint amount) external onlyOwner {
        maxFreePerWallet = amount;
    }
    
    function setBaseURI(string calldata _uri) external onlyOwner {
        uri = _uri;
    }

    function getTotalSupply() public view returns(uint) {
        return currentIndex - 1;
    }

    function getMaxSupply() public view returns(uint) {
        return maxSupply;
    }

    function devmint(uint256 amount) external onlyOwner {
        require(currentIndex <= maxSupply, "NOT_ALLOWED!");
        require(((currentIndex + amount)-1) <= maxSupply, "NOT_ENOUGH_TOKENS");
        _safeMint(msg.sender, amount);
    }

    function mintFree(uint256 amount) external payable {
        require(saleStatus, "SALE_NOT_ACTIVE!");
        require(amount * freeMintPrice == msg.value, "NOT_ENOUGH_MONEY!");
        require(amount <= maxFreePerTx, "EXCEEDS_MAX_PER_TX!");
        require(currentIndex <= maxSupply, "NOT_ENOUGH_TOKENS!");
        require(((currentIndex + amount)-1) <= maxSupply, "NOT_ENOUGH_TOKENS");
        require(_freeminted[msg.sender] + amount <= maxFreePerWallet, "EXCEEDS_MAX_PER_WALLET!");
        _safeMint(msg.sender, amount);
        _freeminted[msg.sender] += amount;
    }
    
    function mint(uint256 amount) external payable {
        require(saleStatus, "SALE_NOT_ACTIVE!");
        require(amount * price == msg.value, "NOT_ENOUGH_MONEY!");
        require(amount <= maxPerTx, "EXCEEDS_MAX_PER_TX!");
        require(currentIndex <= maxSupply, "NOT_ENOUGH_TOKENS!");
        require(((currentIndex + amount)-1) <= maxSupply, "NOT_ENOUGH_TOKENS");
        require(_minted[msg.sender] + amount <= maxPerWallet, "EXCEEDS_MAX_PER_WALLET!");
        _safeMint(msg.sender, amount);
        _minted[msg.sender] += amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_freeminted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","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":"maxFreePerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFree","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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxFreePerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260016000556040518060400160405280600a81526020017f697066733a2f2f514d2f00000000000000000000000000000000000000000000815250600390805190602001906200005692919062000233565b506127106009556001600a60006101000a81548160ff0219169083151502179055506014600c556032600d556000600e556002600f5560026010553480156200009e57600080fd5b506040518060400160405280600a81526020017f576869746520546f776e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f57544e000000000000000000000000000000000000000000000000000000000081525081600190805190602001906200012392919062000233565b5080600290805190602001906200013c92919062000233565b5050506200015f620001536200016560201b60201c565b6200016d60201b60201c565b62000347565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002419062000312565b90600052602060002090601f016020900481019282620002655760008555620002b1565b82601f106200028057805160ff1916838001178555620002b1565b82800160010185558215620002b1579182015b82811115620002b057825182559160200191906001019062000293565b5b509050620002c09190620002c4565b5090565b5b80821115620002df576000816000905550600101620002c5565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032b57607f821691505b602082108103620003415762000340620002e3565b5b50919050565b614b6d80620003576000396000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063b88d4fde116100b6578063e268e4d31161007a578063e268e4d3146108fe578063e985e9c514610927578063f2fde38b14610964578063f737c47a1461098d578063f9020e33146109b8578063f968adbe146109e357610267565b8063b88d4fde14610819578063c4e41b2214610842578063c6f6f2161461086d578063c87b56dd14610896578063d5abeb01146108d357610267565b806395d89b411161010857806395d89b4114610737578063a035b1fe14610762578063a0712d681461078d578063a22cb465146107a9578063a4146733146107d2578063a7027357146107ee57610267565b8063715018a6146106645780637dc949b21461067b5780637de77ecc146106a65780638da5cb5b146106e357806391b7f5ed1461070e57610267565b806340f070a8116101dd578063502b33af116101a1578063502b33af1461055857806355f804b31461056f5780636352211e146105985780636d7c4a4b146105d55780636f8b44b0146105fe57806370a082311461062757610267565b806340f070a81461047357806342842e0e1461049c578063453c2310146104c55780634c0f38c2146104f05780634f6ccce71461051b57610267565b80631491c2e51161022f5780631491c2e51461036357806318160ddd146103a057806323b872dd146103cb57806326987b60146103f45780632f745c591461041f5780633ccfd60b1461045c57610267565b806301ffc9a71461026c57806302fb4791146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906133a0565b610a0e565b6040516102a091906133e8565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613439565b610b58565b005b3480156102de57600080fd5b506102e7610c86565b6040516102f491906134ff565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613439565b610d18565b6040516103319190613562565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906135a9565b610d9d565b005b34801561036f57600080fd5b5061038a600480360381019061038591906135e9565b610eb5565b6040516103979190613625565b60405180910390f35b3480156103ac57600080fd5b506103b5610ecd565b6040516103c29190613625565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613640565b610ee3565b005b34801561040057600080fd5b50610409610ef3565b6040516104169190613625565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906135a9565b610ef9565b6040516104539190613625565b60405180910390f35b34801561046857600080fd5b506104716110e9565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613439565b6111ae565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613640565b611234565b005b3480156104d157600080fd5b506104da611254565b6040516104e79190613625565b60405180910390f35b3480156104fc57600080fd5b5061050561125a565b6040516105129190613625565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613439565b611264565b60405161054f9190613625565b60405180910390f35b34801561056457600080fd5b5061056d6112b7565b005b34801561057b57600080fd5b50610596600480360381019061059191906136f8565b61135f565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613439565b6113f1565b6040516105cc9190613562565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613439565b611407565b005b34801561060a57600080fd5b5061062560048036038101906106209190613439565b61148d565b005b34801561063357600080fd5b5061064e600480360381019061064991906135e9565b611513565b60405161065b9190613625565b60405180910390f35b34801561067057600080fd5b506106796115fb565b005b34801561068757600080fd5b50610690611683565b60405161069d9190613625565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906135e9565b611689565b6040516106da9190613625565b60405180910390f35b3480156106ef57600080fd5b506106f86116a1565b6040516107059190613562565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613439565b6116cb565b005b34801561074357600080fd5b5061074c611751565b60405161075991906134ff565b60405180910390f35b34801561076e57600080fd5b506107776117e3565b6040516107849190613625565b60405180910390f35b6107a760048036038101906107a29190613439565b6117e9565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190613771565b611a63565b005b6107ec60048036038101906107e79190613439565b611be3565b005b3480156107fa57600080fd5b50610803611e5d565b6040516108109190613625565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906138e1565b611e63565b005b34801561084e57600080fd5b50610857611ebf565b6040516108649190613625565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613439565b611ed5565b005b3480156108a257600080fd5b506108bd60048036038101906108b89190613439565b611f5b565b6040516108ca91906134ff565b60405180910390f35b3480156108df57600080fd5b506108e8612002565b6040516108f59190613625565b60405180910390f35b34801561090a57600080fd5b5061092560048036038101906109209190613439565b612008565b005b34801561093357600080fd5b5061094e60048036038101906109499190613964565b61208e565b60405161095b91906133e8565b60405180910390f35b34801561097057600080fd5b5061098b600480360381019061098691906135e9565b612122565b005b34801561099957600080fd5b506109a2612219565b6040516109af9190613625565b60405180910390f35b3480156109c457600080fd5b506109cd61221f565b6040516109da91906133e8565b60405180910390f35b3480156109ef57600080fd5b506109f8612232565b604051610a059190613625565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b515750610b5082612238565b5b9050919050565b610b606122a2565b73ffffffffffffffffffffffffffffffffffffffff16610b7e6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb906139f0565b60405180910390fd5b6009546000541115610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290613a5c565b60405180910390fd5b600954600182600054610c2e9190613aab565b610c389190613b01565b1115610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090613b81565b60405180910390fd5b610c8333826122aa565b50565b606060018054610c9590613bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613bd0565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b6000610d23826122c8565b610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990613c73565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610da8826113f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90613d05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e376122a2565b73ffffffffffffffffffffffffffffffffffffffff161480610e665750610e6581610e606122a2565b61208e565b5b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613d97565b60405180910390fd5b610eb08383836122e1565b505050565b60126020528060005260406000206000915090505481565b60006001600054610ede9190613b01565b905090565b610eee838383612393565b505050565b60005481565b6000610f0483611513565b8210610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90613e29565b60405180910390fd5b6000610f4f610ecd565b905060008060005b838110156110a7576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461104957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611099578684036110905781955050505050506110e3565b83806001019450505b508080600101915050610f57565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613ebb565b60405180910390fd5b92915050565b6110f16122a2565b73ffffffffffffffffffffffffffffffffffffffff1661110f6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c906139f0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111ab573d6000803e3d6000fd5b50565b6111b66122a2565b73ffffffffffffffffffffffffffffffffffffffff166111d46116a1565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906139f0565b60405180910390fd5b80600f8190555050565b61124f83838360405180602001604052806000815250611e63565b505050565b600d5481565b6000600954905090565b600061126e610ecd565b82106112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613f4d565b60405180910390fd5b819050919050565b6112bf6122a2565b73ffffffffffffffffffffffffffffffffffffffff166112dd6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a906139f0565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6113676122a2565b73ffffffffffffffffffffffffffffffffffffffff166113856116a1565b73ffffffffffffffffffffffffffffffffffffffff16146113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906139f0565b60405180910390fd5b8181600391906113ec929190613257565b505050565b60006113fc826128d1565b600001519050919050565b61140f6122a2565b73ffffffffffffffffffffffffffffffffffffffff1661142d6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a906139f0565b60405180910390fd5b8060108190555050565b6114956122a2565b73ffffffffffffffffffffffffffffffffffffffff166114b36116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906139f0565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613fdf565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116036122a2565b73ffffffffffffffffffffffffffffffffffffffff166116216116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906139f0565b60405180910390fd5b6116816000612a6b565b565b600f5481565b60116020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116d36122a2565b73ffffffffffffffffffffffffffffffffffffffff166116f16116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e906139f0565b60405180910390fd5b80600b8190555050565b60606002805461176090613bd0565b80601f016020809104026020016040519081016040528092919081815260200182805461178c90613bd0565b80156117d95780601f106117ae576101008083540402835291602001916117d9565b820191906000526020600020905b8154815290600101906020018083116117bc57829003601f168201915b5050505050905090565b600b5481565b600a60009054906101000a900460ff16611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f9061404b565b60405180910390fd5b34600b5482611847919061406b565b14611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614111565b60405180910390fd5b600c548111156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c39061417d565b60405180910390fd5b6009546000541115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906141e9565b60405180910390fd5b6009546001826000546119269190613aab565b6119309190613b01565b1115611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613b81565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119bf9190613aab565b1115611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614255565b60405180910390fd5b611a0a33826122aa565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a599190613aab565b9250508190555050565b611a6b6122a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf906142c1565b60405180910390fd5b8060076000611ae56122a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b926122a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bd791906133e8565b60405180910390a35050565b600a60009054906101000a900460ff16611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c299061404b565b60405180910390fd5b34600e5482611c41919061406b565b14611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614111565b60405180910390fd5b600f54811115611cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbd9061417d565b60405180910390fd5b6009546000541115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906141e9565b60405180910390fd5b600954600182600054611d209190613aab565b611d2a9190613b01565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290613b81565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611db99190613aab565b1115611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190614255565b60405180910390fd5b611e0433826122aa565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613aab565b9250508190555050565b60105481565b611e6e848484612393565b611e7a84848484612b31565b611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614353565b60405180910390fd5b50505050565b60006001600054611ed09190613b01565b905090565b611edd6122a2565b73ffffffffffffffffffffffffffffffffffffffff16611efb6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906139f0565b60405180910390fd5b80600c8190555050565b6060611f66826122c8565b611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c906143e5565b60405180910390fd5b6000611faf612cb8565b90506000815103611fcf5760405180602001604052806000815250611ffa565b80611fd984612d4a565b604051602001611fea92919061448d565b6040516020818303038152906040525b915050919050565b60095481565b6120106122a2565b73ffffffffffffffffffffffffffffffffffffffff1661202e6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b906139f0565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61212a6122a2565b73ffffffffffffffffffffffffffffffffffffffff166121486116a1565b73ffffffffffffffffffffffffffffffffffffffff161461219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122049061452e565b60405180910390fd5b61221681612a6b565b50565b600e5481565b600a60009054906101000a900460ff1681565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6122c4828260405180602001604052806000815250612eaa565b5050565b60008054821080156122da5750600082115b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061239e826128d1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166123c56122a2565b73ffffffffffffffffffffffffffffffffffffffff16148061242157506123ea6122a2565b73ffffffffffffffffffffffffffffffffffffffff1661240984610d18565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243d575061243c82600001516124376122a2565b61208e565b5b90508061247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906145c0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890614652565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612557906146e4565b60405180910390fd5b61256d8585856001612ebc565b61257d60008484600001516122e1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612861576127c0816122c8565b156128605782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ca8585856001612ec2565b5050505050565b6128d96132dd565b6128e2826122c8565b612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614776565b60405180910390fd5b60008290505b60008110612a2a576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1b578092505050612a66565b50808060019003915050612927565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5d90614808565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612b528473ffffffffffffffffffffffffffffffffffffffff16612ec8565b15612cab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b7b6122a2565b8786866040518563ffffffff1660e01b8152600401612b9d949392919061487d565b6020604051808303816000875af1925050508015612bd957506040513d601f19601f82011682018060405250810190612bd691906148de565b60015b612c5b573d8060008114612c09576040519150601f19603f3d011682016040523d82523d6000602084013e612c0e565b606091505b506000815103612c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4a90614353565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cb0565b600190505b949350505050565b606060038054612cc790613bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf390613bd0565b8015612d405780601f10612d1557610100808354040283529160200191612d40565b820191906000526020600020905b815481529060010190602001808311612d2357829003601f168201915b5050505050905090565b606060008203612d91576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ea5565b600082905060005b60008214612dc3578080612dac9061490b565b915050600a82612dbc9190614982565b9150612d99565b60008167ffffffffffffffff811115612ddf57612dde6137b6565b5b6040519080825280601f01601f191660200182016040528015612e115781602001600182028036833780820191505090505b5090505b60008514612e9e57600182612e2a9190613b01565b9150600a85612e3991906149b3565b6030612e459190613aab565b60f81b818381518110612e5b57612e5a6149e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e979190614982565b9450612e15565b8093505050505b919050565b612eb78383836001612edb565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4790614a85565b60405180910390fd5b60008403612f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8a90614b17565b60405180910390fd5b612fa06000868387612ebc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561323a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613225576131e56000888488612b31565b613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b90614353565b60405180910390fd5b5b8180600101925050808060010191505061316e565b5080600081905550506132506000868387612ec2565b5050505050565b82805461326390613bd0565b90600052602060002090601f01602090048101928261328557600085556132cc565b82601f1061329e57803560ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cb5782358255916020019190600101906132b0565b5b5090506132d99190613317565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613330576000816000905550600101613318565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61337d81613348565b811461338857600080fd5b50565b60008135905061339a81613374565b92915050565b6000602082840312156133b6576133b561333e565b5b60006133c48482850161338b565b91505092915050565b60008115159050919050565b6133e2816133cd565b82525050565b60006020820190506133fd60008301846133d9565b92915050565b6000819050919050565b61341681613403565b811461342157600080fd5b50565b6000813590506134338161340d565b92915050565b60006020828403121561344f5761344e61333e565b5b600061345d84828501613424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134a0578082015181840152602081019050613485565b838111156134af576000848401525b50505050565b6000601f19601f8301169050919050565b60006134d182613466565b6134db8185613471565b93506134eb818560208601613482565b6134f4816134b5565b840191505092915050565b6000602082019050818103600083015261351981846134c6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061354c82613521565b9050919050565b61355c81613541565b82525050565b60006020820190506135776000830184613553565b92915050565b61358681613541565b811461359157600080fd5b50565b6000813590506135a38161357d565b92915050565b600080604083850312156135c0576135bf61333e565b5b60006135ce85828601613594565b92505060206135df85828601613424565b9150509250929050565b6000602082840312156135ff576135fe61333e565b5b600061360d84828501613594565b91505092915050565b61361f81613403565b82525050565b600060208201905061363a6000830184613616565b92915050565b6000806000606084860312156136595761365861333e565b5b600061366786828701613594565b935050602061367886828701613594565b925050604061368986828701613424565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126136b8576136b7613693565b5b8235905067ffffffffffffffff8111156136d5576136d4613698565b5b6020830191508360018202830111156136f1576136f061369d565b5b9250929050565b6000806020838503121561370f5761370e61333e565b5b600083013567ffffffffffffffff81111561372d5761372c613343565b5b613739858286016136a2565b92509250509250929050565b61374e816133cd565b811461375957600080fd5b50565b60008135905061376b81613745565b92915050565b600080604083850312156137885761378761333e565b5b600061379685828601613594565b92505060206137a78582860161375c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137ee826134b5565b810181811067ffffffffffffffff8211171561380d5761380c6137b6565b5b80604052505050565b6000613820613334565b905061382c82826137e5565b919050565b600067ffffffffffffffff82111561384c5761384b6137b6565b5b613855826134b5565b9050602081019050919050565b82818337600083830152505050565b600061388461387f84613831565b613816565b9050828152602081018484840111156138a05761389f6137b1565b5b6138ab848285613862565b509392505050565b600082601f8301126138c8576138c7613693565b5b81356138d8848260208601613871565b91505092915050565b600080600080608085870312156138fb576138fa61333e565b5b600061390987828801613594565b945050602061391a87828801613594565b935050604061392b87828801613424565b925050606085013567ffffffffffffffff81111561394c5761394b613343565b5b613958878288016138b3565b91505092959194509250565b6000806040838503121561397b5761397a61333e565b5b600061398985828601613594565b925050602061399a85828601613594565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139da602083613471565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b7f4e4f545f414c4c4f574544210000000000000000000000000000000000000000600082015250565b6000613a46600c83613471565b9150613a5182613a10565b602082019050919050565b60006020820190508181036000830152613a7581613a39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ab682613403565b9150613ac183613403565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613af657613af5613a7c565b5b828201905092915050565b6000613b0c82613403565b9150613b1783613403565b925082821015613b2a57613b29613a7c565b5b828203905092915050565b7f4e4f545f454e4f5547485f544f4b454e53000000000000000000000000000000600082015250565b6000613b6b601183613471565b9150613b7682613b35565b602082019050919050565b60006020820190508181036000830152613b9a81613b5e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be857607f821691505b602082108103613bfb57613bfa613ba1565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613c5d602d83613471565b9150613c6882613c01565b604082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cef602283613471565b9150613cfa82613c93565b604082019050919050565b60006020820190508181036000830152613d1e81613ce2565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613d81603983613471565b9150613d8c82613d25565b604082019050919050565b60006020820190508181036000830152613db081613d74565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e13602283613471565b9150613e1e82613db7565b604082019050919050565b60006020820190508181036000830152613e4281613e06565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613ea5602e83613471565b9150613eb082613e49565b604082019050919050565b60006020820190508181036000830152613ed481613e98565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f37602383613471565b9150613f4282613edb565b604082019050919050565b60006020820190508181036000830152613f6681613f2a565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613fc9602b83613471565b9150613fd482613f6d565b604082019050919050565b60006020820190508181036000830152613ff881613fbc565b9050919050565b7f53414c455f4e4f545f4143544956452100000000000000000000000000000000600082015250565b6000614035601083613471565b915061404082613fff565b602082019050919050565b6000602082019050818103600083015261406481614028565b9050919050565b600061407682613403565b915061408183613403565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140ba576140b9613a7c565b5b828202905092915050565b7f4e4f545f454e4f5547485f4d4f4e455921000000000000000000000000000000600082015250565b60006140fb601183613471565b9150614106826140c5565b602082019050919050565b6000602082019050818103600083015261412a816140ee565b9050919050565b7f455843454544535f4d41585f5045525f54582100000000000000000000000000600082015250565b6000614167601383613471565b915061417282614131565b602082019050919050565b600060208201905081810360008301526141968161415a565b9050919050565b7f4e4f545f454e4f5547485f544f4b454e53210000000000000000000000000000600082015250565b60006141d3601283613471565b91506141de8261419d565b602082019050919050565b60006020820190508181036000830152614202816141c6565b9050919050565b7f455843454544535f4d41585f5045525f57414c4c455421000000000000000000600082015250565b600061423f601783613471565b915061424a82614209565b602082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006142ab601a83613471565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061433d603383613471565b9150614348826142e1565b604082019050919050565b6000602082019050818103600083015261436c81614330565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143cf602f83613471565b91506143da82614373565b604082019050919050565b600060208201905081810360008301526143fe816143c2565b9050919050565b600081905092915050565b600061441b82613466565b6144258185614405565b9350614435818560208601613482565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614477600583614405565b915061448282614441565b600582019050919050565b60006144998285614410565b91506144a58284614410565b91506144b08261446a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614518602683613471565b9150614523826144bc565b604082019050919050565b600060208201905081810360008301526145478161450b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006145aa603283613471565b91506145b58261454e565b604082019050919050565b600060208201905081810360008301526145d98161459d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061463c602683613471565b9150614647826145e0565b604082019050919050565b6000602082019050818103600083015261466b8161462f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146ce602583613471565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614760602a83613471565b915061476b82614704565b604082019050919050565b6000602082019050818103600083015261478f81614753565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006147f2602f83613471565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061484f82614828565b6148598185614833565b9350614869818560208601613482565b614872816134b5565b840191505092915050565b60006080820190506148926000830187613553565b61489f6020830186613553565b6148ac6040830185613616565b81810360608301526148be8184614844565b905095945050505050565b6000815190506148d881613374565b92915050565b6000602082840312156148f4576148f361333e565b5b6000614902848285016148c9565b91505092915050565b600061491682613403565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361494857614947613a7c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061498d82613403565b915061499883613403565b9250826149a8576149a7614953565b5b828204905092915050565b60006149be82613403565b91506149c983613403565b9250826149d9576149d8614953565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a6f602183613471565b9150614a7a82614a13565b604082019050919050565b60006020820190508181036000830152614a9e81614a62565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614b01602883613471565b9150614b0c82614aa5565b604082019050919050565b60006020820190508181036000830152614b3081614af4565b905091905056fea26469706673582212206acd241c88f84cff575ad4f790eedaea509a3255c70e2d96fc77ae2773b2ea6564736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063715018a611610144578063b88d4fde116100b6578063e268e4d31161007a578063e268e4d3146108fe578063e985e9c514610927578063f2fde38b14610964578063f737c47a1461098d578063f9020e33146109b8578063f968adbe146109e357610267565b8063b88d4fde14610819578063c4e41b2214610842578063c6f6f2161461086d578063c87b56dd14610896578063d5abeb01146108d357610267565b806395d89b411161010857806395d89b4114610737578063a035b1fe14610762578063a0712d681461078d578063a22cb465146107a9578063a4146733146107d2578063a7027357146107ee57610267565b8063715018a6146106645780637dc949b21461067b5780637de77ecc146106a65780638da5cb5b146106e357806391b7f5ed1461070e57610267565b806340f070a8116101dd578063502b33af116101a1578063502b33af1461055857806355f804b31461056f5780636352211e146105985780636d7c4a4b146105d55780636f8b44b0146105fe57806370a082311461062757610267565b806340f070a81461047357806342842e0e1461049c578063453c2310146104c55780634c0f38c2146104f05780634f6ccce71461051b57610267565b80631491c2e51161022f5780631491c2e51461036357806318160ddd146103a057806323b872dd146103cb57806326987b60146103f45780632f745c591461041f5780633ccfd60b1461045c57610267565b806301ffc9a71461026c57806302fb4791146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906133a0565b610a0e565b6040516102a091906133e8565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613439565b610b58565b005b3480156102de57600080fd5b506102e7610c86565b6040516102f491906134ff565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190613439565b610d18565b6040516103319190613562565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906135a9565b610d9d565b005b34801561036f57600080fd5b5061038a600480360381019061038591906135e9565b610eb5565b6040516103979190613625565b60405180910390f35b3480156103ac57600080fd5b506103b5610ecd565b6040516103c29190613625565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613640565b610ee3565b005b34801561040057600080fd5b50610409610ef3565b6040516104169190613625565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906135a9565b610ef9565b6040516104539190613625565b60405180910390f35b34801561046857600080fd5b506104716110e9565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613439565b6111ae565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613640565b611234565b005b3480156104d157600080fd5b506104da611254565b6040516104e79190613625565b60405180910390f35b3480156104fc57600080fd5b5061050561125a565b6040516105129190613625565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d9190613439565b611264565b60405161054f9190613625565b60405180910390f35b34801561056457600080fd5b5061056d6112b7565b005b34801561057b57600080fd5b50610596600480360381019061059191906136f8565b61135f565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613439565b6113f1565b6040516105cc9190613562565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613439565b611407565b005b34801561060a57600080fd5b5061062560048036038101906106209190613439565b61148d565b005b34801561063357600080fd5b5061064e600480360381019061064991906135e9565b611513565b60405161065b9190613625565b60405180910390f35b34801561067057600080fd5b506106796115fb565b005b34801561068757600080fd5b50610690611683565b60405161069d9190613625565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906135e9565b611689565b6040516106da9190613625565b60405180910390f35b3480156106ef57600080fd5b506106f86116a1565b6040516107059190613562565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613439565b6116cb565b005b34801561074357600080fd5b5061074c611751565b60405161075991906134ff565b60405180910390f35b34801561076e57600080fd5b506107776117e3565b6040516107849190613625565b60405180910390f35b6107a760048036038101906107a29190613439565b6117e9565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190613771565b611a63565b005b6107ec60048036038101906107e79190613439565b611be3565b005b3480156107fa57600080fd5b50610803611e5d565b6040516108109190613625565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b91906138e1565b611e63565b005b34801561084e57600080fd5b50610857611ebf565b6040516108649190613625565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613439565b611ed5565b005b3480156108a257600080fd5b506108bd60048036038101906108b89190613439565b611f5b565b6040516108ca91906134ff565b60405180910390f35b3480156108df57600080fd5b506108e8612002565b6040516108f59190613625565b60405180910390f35b34801561090a57600080fd5b5061092560048036038101906109209190613439565b612008565b005b34801561093357600080fd5b5061094e60048036038101906109499190613964565b61208e565b60405161095b91906133e8565b60405180910390f35b34801561097057600080fd5b5061098b600480360381019061098691906135e9565b612122565b005b34801561099957600080fd5b506109a2612219565b6040516109af9190613625565b60405180910390f35b3480156109c457600080fd5b506109cd61221f565b6040516109da91906133e8565b60405180910390f35b3480156109ef57600080fd5b506109f8612232565b604051610a059190613625565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b515750610b5082612238565b5b9050919050565b610b606122a2565b73ffffffffffffffffffffffffffffffffffffffff16610b7e6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb906139f0565b60405180910390fd5b6009546000541115610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290613a5c565b60405180910390fd5b600954600182600054610c2e9190613aab565b610c389190613b01565b1115610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090613b81565b60405180910390fd5b610c8333826122aa565b50565b606060018054610c9590613bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190613bd0565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b6000610d23826122c8565b610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990613c73565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610da8826113f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90613d05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e376122a2565b73ffffffffffffffffffffffffffffffffffffffff161480610e665750610e6581610e606122a2565b61208e565b5b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613d97565b60405180910390fd5b610eb08383836122e1565b505050565b60126020528060005260406000206000915090505481565b60006001600054610ede9190613b01565b905090565b610eee838383612393565b505050565b60005481565b6000610f0483611513565b8210610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90613e29565b60405180910390fd5b6000610f4f610ecd565b905060008060005b838110156110a7576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461104957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611099578684036110905781955050505050506110e3565b83806001019450505b508080600101915050610f57565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613ebb565b60405180910390fd5b92915050565b6110f16122a2565b73ffffffffffffffffffffffffffffffffffffffff1661110f6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c906139f0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111ab573d6000803e3d6000fd5b50565b6111b66122a2565b73ffffffffffffffffffffffffffffffffffffffff166111d46116a1565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611221906139f0565b60405180910390fd5b80600f8190555050565b61124f83838360405180602001604052806000815250611e63565b505050565b600d5481565b6000600954905090565b600061126e610ecd565b82106112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a690613f4d565b60405180910390fd5b819050919050565b6112bf6122a2565b73ffffffffffffffffffffffffffffffffffffffff166112dd6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a906139f0565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6113676122a2565b73ffffffffffffffffffffffffffffffffffffffff166113856116a1565b73ffffffffffffffffffffffffffffffffffffffff16146113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906139f0565b60405180910390fd5b8181600391906113ec929190613257565b505050565b60006113fc826128d1565b600001519050919050565b61140f6122a2565b73ffffffffffffffffffffffffffffffffffffffff1661142d6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a906139f0565b60405180910390fd5b8060108190555050565b6114956122a2565b73ffffffffffffffffffffffffffffffffffffffff166114b36116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611500906139f0565b60405180910390fd5b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90613fdf565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116036122a2565b73ffffffffffffffffffffffffffffffffffffffff166116216116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906139f0565b60405180910390fd5b6116816000612a6b565b565b600f5481565b60116020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116d36122a2565b73ffffffffffffffffffffffffffffffffffffffff166116f16116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173e906139f0565b60405180910390fd5b80600b8190555050565b60606002805461176090613bd0565b80601f016020809104026020016040519081016040528092919081815260200182805461178c90613bd0565b80156117d95780601f106117ae576101008083540402835291602001916117d9565b820191906000526020600020905b8154815290600101906020018083116117bc57829003601f168201915b5050505050905090565b600b5481565b600a60009054906101000a900460ff16611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f9061404b565b60405180910390fd5b34600b5482611847919061406b565b14611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614111565b60405180910390fd5b600c548111156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c39061417d565b60405180910390fd5b6009546000541115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906141e9565b60405180910390fd5b6009546001826000546119269190613aab565b6119309190613b01565b1115611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613b81565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119bf9190613aab565b1115611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614255565b60405180910390fd5b611a0a33826122aa565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a599190613aab565b9250508190555050565b611a6b6122a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf906142c1565b60405180910390fd5b8060076000611ae56122a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b926122a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bd791906133e8565b60405180910390a35050565b600a60009054906101000a900460ff16611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c299061404b565b60405180910390fd5b34600e5482611c41919061406b565b14611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614111565b60405180910390fd5b600f54811115611cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbd9061417d565b60405180910390fd5b6009546000541115611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906141e9565b60405180910390fd5b600954600182600054611d209190613aab565b611d2a9190613b01565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290613b81565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611db99190613aab565b1115611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190614255565b60405180910390fd5b611e0433826122aa565b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613aab565b9250508190555050565b60105481565b611e6e848484612393565b611e7a84848484612b31565b611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614353565b60405180910390fd5b50505050565b60006001600054611ed09190613b01565b905090565b611edd6122a2565b73ffffffffffffffffffffffffffffffffffffffff16611efb6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f48906139f0565b60405180910390fd5b80600c8190555050565b6060611f66826122c8565b611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c906143e5565b60405180910390fd5b6000611faf612cb8565b90506000815103611fcf5760405180602001604052806000815250611ffa565b80611fd984612d4a565b604051602001611fea92919061448d565b6040516020818303038152906040525b915050919050565b60095481565b6120106122a2565b73ffffffffffffffffffffffffffffffffffffffff1661202e6116a1565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b906139f0565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61212a6122a2565b73ffffffffffffffffffffffffffffffffffffffff166121486116a1565b73ffffffffffffffffffffffffffffffffffffffff161461219e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612195906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122049061452e565b60405180910390fd5b61221681612a6b565b50565b600e5481565b600a60009054906101000a900460ff1681565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6122c4828260405180602001604052806000815250612eaa565b5050565b60008054821080156122da5750600082115b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061239e826128d1565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166123c56122a2565b73ffffffffffffffffffffffffffffffffffffffff16148061242157506123ea6122a2565b73ffffffffffffffffffffffffffffffffffffffff1661240984610d18565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243d575061243c82600001516124376122a2565b61208e565b5b90508061247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906145c0565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e890614652565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612557906146e4565b60405180910390fd5b61256d8585856001612ebc565b61257d60008484600001516122e1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612861576127c0816122c8565b156128605782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ca8585856001612ec2565b5050505050565b6128d96132dd565b6128e2826122c8565b612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890614776565b60405180910390fd5b60008290505b60008110612a2a576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1b578092505050612a66565b50808060019003915050612927565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5d90614808565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612b528473ffffffffffffffffffffffffffffffffffffffff16612ec8565b15612cab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b7b6122a2565b8786866040518563ffffffff1660e01b8152600401612b9d949392919061487d565b6020604051808303816000875af1925050508015612bd957506040513d601f19601f82011682018060405250810190612bd691906148de565b60015b612c5b573d8060008114612c09576040519150601f19603f3d011682016040523d82523d6000602084013e612c0e565b606091505b506000815103612c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4a90614353565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cb0565b600190505b949350505050565b606060038054612cc790613bd0565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf390613bd0565b8015612d405780601f10612d1557610100808354040283529160200191612d40565b820191906000526020600020905b815481529060010190602001808311612d2357829003601f168201915b5050505050905090565b606060008203612d91576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ea5565b600082905060005b60008214612dc3578080612dac9061490b565b915050600a82612dbc9190614982565b9150612d99565b60008167ffffffffffffffff811115612ddf57612dde6137b6565b5b6040519080825280601f01601f191660200182016040528015612e115781602001600182028036833780820191505090505b5090505b60008514612e9e57600182612e2a9190613b01565b9150600a85612e3991906149b3565b6030612e459190613aab565b60f81b818381518110612e5b57612e5a6149e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e979190614982565b9450612e15565b8093505050505b919050565b612eb78383836001612edb565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4790614a85565b60405180910390fd5b60008403612f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8a90614b17565b60405180910390fd5b612fa06000868387612ebc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561323a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613225576131e56000888488612b31565b613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b90614353565b60405180910390fd5b5b8180600101925050808060010191505061316e565b5080600081905550506132506000868387612ec2565b5050505050565b82805461326390613bd0565b90600052602060002090601f01602090048101928261328557600085556132cc565b82601f1061329e57803560ff19168380011785556132cc565b828001600101855582156132cc579182015b828111156132cb5782358255916020019190600101906132b0565b5b5090506132d99190613317565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613330576000816000905550600101613318565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61337d81613348565b811461338857600080fd5b50565b60008135905061339a81613374565b92915050565b6000602082840312156133b6576133b561333e565b5b60006133c48482850161338b565b91505092915050565b60008115159050919050565b6133e2816133cd565b82525050565b60006020820190506133fd60008301846133d9565b92915050565b6000819050919050565b61341681613403565b811461342157600080fd5b50565b6000813590506134338161340d565b92915050565b60006020828403121561344f5761344e61333e565b5b600061345d84828501613424565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134a0578082015181840152602081019050613485565b838111156134af576000848401525b50505050565b6000601f19601f8301169050919050565b60006134d182613466565b6134db8185613471565b93506134eb818560208601613482565b6134f4816134b5565b840191505092915050565b6000602082019050818103600083015261351981846134c6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061354c82613521565b9050919050565b61355c81613541565b82525050565b60006020820190506135776000830184613553565b92915050565b61358681613541565b811461359157600080fd5b50565b6000813590506135a38161357d565b92915050565b600080604083850312156135c0576135bf61333e565b5b60006135ce85828601613594565b92505060206135df85828601613424565b9150509250929050565b6000602082840312156135ff576135fe61333e565b5b600061360d84828501613594565b91505092915050565b61361f81613403565b82525050565b600060208201905061363a6000830184613616565b92915050565b6000806000606084860312156136595761365861333e565b5b600061366786828701613594565b935050602061367886828701613594565b925050604061368986828701613424565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126136b8576136b7613693565b5b8235905067ffffffffffffffff8111156136d5576136d4613698565b5b6020830191508360018202830111156136f1576136f061369d565b5b9250929050565b6000806020838503121561370f5761370e61333e565b5b600083013567ffffffffffffffff81111561372d5761372c613343565b5b613739858286016136a2565b92509250509250929050565b61374e816133cd565b811461375957600080fd5b50565b60008135905061376b81613745565b92915050565b600080604083850312156137885761378761333e565b5b600061379685828601613594565b92505060206137a78582860161375c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137ee826134b5565b810181811067ffffffffffffffff8211171561380d5761380c6137b6565b5b80604052505050565b6000613820613334565b905061382c82826137e5565b919050565b600067ffffffffffffffff82111561384c5761384b6137b6565b5b613855826134b5565b9050602081019050919050565b82818337600083830152505050565b600061388461387f84613831565b613816565b9050828152602081018484840111156138a05761389f6137b1565b5b6138ab848285613862565b509392505050565b600082601f8301126138c8576138c7613693565b5b81356138d8848260208601613871565b91505092915050565b600080600080608085870312156138fb576138fa61333e565b5b600061390987828801613594565b945050602061391a87828801613594565b935050604061392b87828801613424565b925050606085013567ffffffffffffffff81111561394c5761394b613343565b5b613958878288016138b3565b91505092959194509250565b6000806040838503121561397b5761397a61333e565b5b600061398985828601613594565b925050602061399a85828601613594565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139da602083613471565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b7f4e4f545f414c4c4f574544210000000000000000000000000000000000000000600082015250565b6000613a46600c83613471565b9150613a5182613a10565b602082019050919050565b60006020820190508181036000830152613a7581613a39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ab682613403565b9150613ac183613403565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613af657613af5613a7c565b5b828201905092915050565b6000613b0c82613403565b9150613b1783613403565b925082821015613b2a57613b29613a7c565b5b828203905092915050565b7f4e4f545f454e4f5547485f544f4b454e53000000000000000000000000000000600082015250565b6000613b6b601183613471565b9150613b7682613b35565b602082019050919050565b60006020820190508181036000830152613b9a81613b5e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be857607f821691505b602082108103613bfb57613bfa613ba1565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613c5d602d83613471565b9150613c6882613c01565b604082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cef602283613471565b9150613cfa82613c93565b604082019050919050565b60006020820190508181036000830152613d1e81613ce2565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613d81603983613471565b9150613d8c82613d25565b604082019050919050565b60006020820190508181036000830152613db081613d74565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e13602283613471565b9150613e1e82613db7565b604082019050919050565b60006020820190508181036000830152613e4281613e06565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613ea5602e83613471565b9150613eb082613e49565b604082019050919050565b60006020820190508181036000830152613ed481613e98565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f37602383613471565b9150613f4282613edb565b604082019050919050565b60006020820190508181036000830152613f6681613f2a565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613fc9602b83613471565b9150613fd482613f6d565b604082019050919050565b60006020820190508181036000830152613ff881613fbc565b9050919050565b7f53414c455f4e4f545f4143544956452100000000000000000000000000000000600082015250565b6000614035601083613471565b915061404082613fff565b602082019050919050565b6000602082019050818103600083015261406481614028565b9050919050565b600061407682613403565b915061408183613403565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140ba576140b9613a7c565b5b828202905092915050565b7f4e4f545f454e4f5547485f4d4f4e455921000000000000000000000000000000600082015250565b60006140fb601183613471565b9150614106826140c5565b602082019050919050565b6000602082019050818103600083015261412a816140ee565b9050919050565b7f455843454544535f4d41585f5045525f54582100000000000000000000000000600082015250565b6000614167601383613471565b915061417282614131565b602082019050919050565b600060208201905081810360008301526141968161415a565b9050919050565b7f4e4f545f454e4f5547485f544f4b454e53210000000000000000000000000000600082015250565b60006141d3601283613471565b91506141de8261419d565b602082019050919050565b60006020820190508181036000830152614202816141c6565b9050919050565b7f455843454544535f4d41585f5045525f57414c4c455421000000000000000000600082015250565b600061423f601783613471565b915061424a82614209565b602082019050919050565b6000602082019050818103600083015261426e81614232565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006142ab601a83613471565b91506142b682614275565b602082019050919050565b600060208201905081810360008301526142da8161429e565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061433d603383613471565b9150614348826142e1565b604082019050919050565b6000602082019050818103600083015261436c81614330565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143cf602f83613471565b91506143da82614373565b604082019050919050565b600060208201905081810360008301526143fe816143c2565b9050919050565b600081905092915050565b600061441b82613466565b6144258185614405565b9350614435818560208601613482565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614477600583614405565b915061448282614441565b600582019050919050565b60006144998285614410565b91506144a58284614410565b91506144b08261446a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614518602683613471565b9150614523826144bc565b604082019050919050565b600060208201905081810360008301526145478161450b565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006145aa603283613471565b91506145b58261454e565b604082019050919050565b600060208201905081810360008301526145d98161459d565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061463c602683613471565b9150614647826145e0565b604082019050919050565b6000602082019050818103600083015261466b8161462f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146ce602583613471565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614760602a83613471565b915061476b82614704565b604082019050919050565b6000602082019050818103600083015261478f81614753565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006147f2602f83613471565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061484f82614828565b6148598185614833565b9350614869818560208601613482565b614872816134b5565b840191505092915050565b60006080820190506148926000830187613553565b61489f6020830186613553565b6148ac6040830185613616565b81810360608301526148be8184614844565b905095945050505050565b6000815190506148d881613374565b92915050565b6000602082840312156148f4576148f361333e565b5b6000614902848285016148c9565b91505092915050565b600061491682613403565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361494857614947613a7c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061498d82613403565b915061499883613403565b9250826149a8576149a7614953565b5b828204905092915050565b60006149be82613403565b91506149c983613403565b9250826149d9576149d8614953565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a6f602183613471565b9150614a7a82614a13565b604082019050919050565b60006020820190508181036000830152614a9e81614a62565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000614b01602883613471565b9150614b0c82614aa5565b604082019050919050565b60006020820190508181036000830152614b3081614af4565b905091905056fea26469706673582212206acd241c88f84cff575ad4f790eedaea509a3255c70e2d96fc77ae2773b2ea6564736f6c634300080e0033

Deployed Bytecode Sourcemap

38338:3472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25189:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40411:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27075:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28647:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28168:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38999:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23442:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29523:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22484:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24110:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39280:109;;;;;;;;;;;;;:::i;:::-;;39892:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29756:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38574:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40318:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23623:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39397:87;;;;;;;;;;;;;:::i;:::-;;40118:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26884:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40001:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39492:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25625:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4369:94;;;;;;;;;;;;;:::i;:::-;;38646:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38950:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3718:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39591:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27244:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38511:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41254:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28933:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40661:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38685:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30004:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40216:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39686:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27419:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38439:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39787:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29292:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4618:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38610:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38475;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38538:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25189:372;25291:4;25343:25;25328:40;;;:11;:40;;;;:105;;;;25400:33;25385:48;;;:11;:48;;;;25328:105;:172;;;;25465:35;25450:50;;;:11;:50;;;;25328:172;:225;;;;25517:36;25541:11;25517:23;:36::i;:::-;25328:225;25308:245;;25189:372;;;:::o;40411:242::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40498:9:::1;;40482:12;;:25;;40474:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;40574:9;;40568:1;40560:6;40545:12;;:21;;;;:::i;:::-;40544:25;;;;:::i;:::-;40543:40;;40535:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;40616:29;40626:10;40638:6;40616:9;:29::i;:::-;40411:242:::0;:::o;27075:100::-;27129:13;27162:5;27155:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27075:100;:::o;28647:214::-;28715:7;28743:16;28751:7;28743;:16::i;:::-;28735:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28829:15;:24;28845:7;28829:24;;;;;;;;;;;;;;;;;;;;;28822:31;;28647:214;;;:::o;28168:413::-;28241:13;28257:24;28273:7;28257:15;:24::i;:::-;28241:40;;28306:5;28300:11;;:2;:11;;;28292:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28401:5;28385:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28410:37;28427:5;28434:12;:10;:12::i;:::-;28410:16;:37::i;:::-;28385:62;28363:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28545:28;28554:2;28558:7;28567:5;28545:8;:28::i;:::-;28230:351;28168:413;;:::o;38999:43::-;;;;;;;;;;;;;;;;;:::o;23442:104::-;23495:7;23537:1;23522:12;;:16;;;;:::i;:::-;23515:23;;23442:104;:::o;29523:162::-;29649:28;29659:4;29665:2;29669:7;29649:9;:28::i;:::-;29523:162;;;:::o;22484:31::-;;;;:::o;24110:1007::-;24199:7;24235:16;24245:5;24235:9;:16::i;:::-;24227:5;:24;24219:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24301:22;24326:13;:11;:13::i;:::-;24301:38;;24350:19;24380:25;24569:9;24564:466;24584:14;24580:1;:18;24564:466;;;24624:31;24658:11;:14;24670:1;24658:14;;;;;;;;;;;24624:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24721:1;24695:28;;:9;:14;;;:28;;;24691:111;;24768:9;:14;;;24748:34;;24691:111;24845:5;24824:26;;:17;:26;;;24820:195;;24894:5;24879:11;:20;24875:85;;24935:1;24928:8;;;;;;;;;24875:85;24982:13;;;;;;;24820:195;24605:425;24600:3;;;;;;;24564:466;;;;25053:56;;;;;;;;;;:::i;:::-;;;;;;;;24110:1007;;;;;:::o;39280:109::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39338:10:::1;39330:28;;:51;39359:21;39330:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;39280:109::o:0;39892:97::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39975:6:::1;39960:12;:21;;;;39892:97:::0;:::o;29756:177::-;29886:39;29903:4;29909:2;29913:7;29886:39;;;;;;;;;;;;:16;:39::i;:::-;29756:177;;;:::o;38574:29::-;;;;:::o;40318:85::-;40362:4;40386:9;;40379:16;;40318:85;:::o;23623:187::-;23690:7;23726:13;:11;:13::i;:::-;23718:5;:21;23710:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23797:5;23790:12;;23623:187;;;:::o;39397:87::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39466:10:::1;;;;;;;;;;;39465:11;39452:10;;:24;;;;;;;;;;;;;;;;;;39397:87::o:0;40118:90::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40196:4:::1;;40190:3;:10;;;;;;;:::i;:::-;;40118:90:::0;;:::o;26884:124::-;26948:7;26975:20;26987:7;26975:11;:20::i;:::-;:25;;;26968:32;;26884:124;;;:::o;40001:105::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40092:6:::1;40073:16;:25;;;;40001:105:::0;:::o;39492:91::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39569:6:::1;39557:9;:18;;;;39492:91:::0;:::o;25625:221::-;25689:7;25734:1;25717:19;;:5;:19;;;25709:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25810:12;:19;25823:5;25810:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25802:36;;25795:43;;25625:221;;;:::o;4369:94::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4434:21:::1;4452:1;4434:9;:21::i;:::-;4369:94::o:0;38646:28::-;;;;:::o;38950:39::-;;;;;;;;;;;;;;;;;:::o;3718:87::-;3764:7;3791:6;;;;;;;;;;;3784:13;;3718:87;:::o;39591:83::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39660:6:::1;39652:5;:14;;;;39591:83:::0;:::o;27244:104::-;27300:13;27333:7;27326:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27244:104;:::o;38511:17::-;;;;:::o;41254:553::-;41320:10;;;;;;;;;;;41312:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41388:9;41379:5;;41370:6;:14;;;;:::i;:::-;:27;41362:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41448:8;;41438:6;:18;;41430:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;41515:9;;41499:12;;:25;;41491:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41597:9;;41591:1;41583:6;41568:12;;:21;;;;:::i;:::-;41567:25;;;;:::i;:::-;41566:40;;41558:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41679:12;;41669:6;41647:7;:19;41655:10;41647:19;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:44;;41639:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;41730:29;41740:10;41752:6;41730:9;:29::i;:::-;41793:6;41770:7;:19;41778:10;41770:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;41254:553;:::o;28933:288::-;29040:12;:10;:12::i;:::-;29028:24;;:8;:24;;;29020:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29141:8;29096:18;:32;29115:12;:10;:12::i;:::-;29096:32;;;;;;;;;;;;;;;:42;29129:8;29096:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29194:8;29165:48;;29180:12;:10;:12::i;:::-;29165:48;;;29204:8;29165:48;;;;;;:::i;:::-;;;;;;;;28933:288;;:::o;40661:581::-;40731:10;;;;;;;;;;;40723:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;40807:9;40790:13;;40781:6;:22;;;;:::i;:::-;:35;40773:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40867:12;;40857:6;:22;;40849:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;40938:9;;40922:12;;:25;;40914:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41020:9;;41014:1;41006:6;40991:12;;:21;;;;:::i;:::-;40990:25;;;;:::i;:::-;40989:40;;40981:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41106:16;;41096:6;41070:11;:23;41082:10;41070:23;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:52;;41062:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;41161:29;41171:10;41183:6;41161:9;:29::i;:::-;41228:6;41201:11;:23;41213:10;41201:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;40661:581;:::o;38685:32::-;;;;:::o;30004:355::-;30163:28;30173:4;30179:2;30183:7;30163:9;:28::i;:::-;30224:48;30247:4;30253:2;30257:7;30266:5;30224:22;:48::i;:::-;30202:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30004:355;;;;:::o;40216:94::-;40262:4;40301:1;40286:12;;:16;;;;:::i;:::-;40279:23;;40216:94;:::o;39686:89::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39761:6:::1;39750:8;:17;;;;39686:89:::0;:::o;27419:344::-;27492:13;27526:16;27534:7;27526;:16::i;:::-;27518:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27607:21;27631:10;:8;:10::i;:::-;27607:34;;27684:1;27665:7;27659:21;:26;:96;;;;;;;;;;;;;;;;;27712:7;27721:18;:7;:16;:18::i;:::-;27695:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27659:96;27652:103;;;27419:344;;;:::o;38439:29::-;;;;:::o;39787:97::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39870:6:::1;39855:12;:21;;;;39787:97:::0;:::o;29292:164::-;29389:4;29413:18;:25;29432:5;29413:25;;;;;;;;;;;;;;;:35;29439:8;29413:35;;;;;;;;;;;;;;;;;;;;;;;;;29406:42;;29292:164;;;;:::o;4618:192::-;3949:12;:10;:12::i;:::-;3938:23;;:7;:5;:7::i;:::-;:23;;;3930:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4727:1:::1;4707:22;;:8;:22;;::::0;4699:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4783:19;4793:8;4783:9;:19::i;:::-;4618:192:::0;:::o;38610:29::-;;;;:::o;38475:::-;;;;;;;;;;;;;:::o;38538:25::-;;;;:::o;15320:157::-;15405:4;15444:25;15429:40;;;:11;:40;;;;15422:47;;15320:157;;;:::o;2594:98::-;2647:7;2674:10;2667:17;;2594:98;:::o;30748:104::-;30817:27;30827:2;30831:8;30817:27;;;;;;;;;;;;:9;:27::i;:::-;30748:104;;:::o;30614:126::-;30671:4;30705:12;;30695:7;:22;:37;;;;;30731:1;30721:7;:11;30695:37;30688:44;;30614:126;;;:::o;35549:196::-;35691:2;35664:15;:24;35680:7;35664:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35729:7;35725:2;35709:28;;35718:5;35709:28;;;;;;;;;;;;35549:196;;;:::o;33429:2002::-;33544:35;33582:20;33594:7;33582:11;:20::i;:::-;33544:58;;33615:22;33657:13;:18;;;33641:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33716:12;:10;:12::i;:::-;33692:36;;:20;33704:7;33692:11;:20::i;:::-;:36;;;33641:87;:154;;;;33745:50;33762:13;:18;;;33782:12;:10;:12::i;:::-;33745:16;:50::i;:::-;33641:154;33615:181;;33817:17;33809:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;33932:4;33910:26;;:13;:18;;;:26;;;33902:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34012:1;33998:16;;:2;:16;;;33990:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34069:43;34091:4;34097:2;34101:7;34110:1;34069:21;:43::i;:::-;34177:49;34194:1;34198:7;34207:13;:18;;;34177:8;:49::i;:::-;34552:1;34522:12;:18;34535:4;34522:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34596:1;34568:12;:16;34581:2;34568:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34642:2;34614:11;:20;34626:7;34614:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;34704:15;34659:11;:20;34671:7;34659:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;34972:19;35004:1;34994:7;:11;34972:33;;35065:1;35024:43;;:11;:24;35036:11;35024:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35020:295;;35092:20;35100:11;35092:7;:20::i;:::-;35088:212;;;35169:13;:18;;;35137:11;:24;35149:11;35137:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35252:13;:28;;;35210:11;:24;35222:11;35210:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;35088:212;35020:295;34497:829;35362:7;35358:2;35343:27;;35352:4;35343:27;;;;;;;;;;;;35381:42;35402:4;35408:2;35412:7;35421:1;35381:20;:42::i;:::-;33533:1898;;33429:2002;;;:::o;26285:537::-;26346:21;;:::i;:::-;26388:16;26396:7;26388;:16::i;:::-;26380:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26494:12;26509:7;26494:22;;26489:245;26526:1;26518:4;:9;26489:245;;26556:31;26590:11;:17;26602:4;26590:17;;;;;;;;;;;26556:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26656:1;26630:28;;:9;:14;;;:28;;;26626:93;;26690:9;26683:16;;;;;;26626:93;26537:197;26529:6;;;;;;;;26489:245;;;;26757:57;;;;;;;;;;:::i;:::-;;;;;;;;26285:537;;;;:::o;4818:173::-;4874:16;4893:6;;;;;;;;;;;4874:25;;4919:8;4910:6;;:17;;;;;;;;;;;;;;;;;;4974:8;4943:40;;4964:8;4943:40;;;;;;;;;;;;4863:128;4818:173;:::o;36310:804::-;36465:4;36486:15;:2;:13;;;:15::i;:::-;36482:625;;;36538:2;36522:36;;;36559:12;:10;:12::i;:::-;36573:4;36579:7;36588:5;36522:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36518:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36785:1;36768:6;:13;:18;36764:273;;36811:61;;;;;;;;;;:::i;:::-;;;;;;;;36764:273;36987:6;36981:13;36972:6;36968:2;36964:15;36957:38;36518:534;36655:45;;;36645:55;;;:6;:55;;;;36638:62;;;;;36482:625;37091:4;37084:11;;36310:804;;;;;;;:::o;28011:95::-;28062:13;28095:3;28088:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28011:95;:::o;293:723::-;349:13;579:1;570:5;:10;566:53;;597:10;;;;;;;;;;;;;;;;;;;;;566:53;629:12;644:5;629:20;;660:14;685:78;700:1;692:4;:9;685:78;;718:8;;;;;:::i;:::-;;;;749:2;741:10;;;;;:::i;:::-;;;685:78;;;773:19;805:6;795:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;773:39;;823:154;839:1;830:5;:10;823:154;;867:1;857:11;;;;;:::i;:::-;;;934:2;926:5;:10;;;;:::i;:::-;913:2;:24;;;;:::i;:::-;900:39;;883:6;890;883:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;963:2;954:11;;;;;:::i;:::-;;;823:154;;;1001:6;987:21;;;;;293:723;;;;:::o;31215:163::-;31338:32;31344:2;31348:8;31358:5;31365:4;31338:5;:32::i;:::-;31215:163;;;:::o;37602:159::-;;;;;:::o;38173:158::-;;;;;:::o;5679:387::-;5739:4;5947:12;6014:7;6002:20;5994:28;;6057:1;6050:4;:8;6043:15;;;5679:387;;;:::o;31637:1538::-;31776:20;31799:12;;31776:35;;31844:1;31830:16;;:2;:16;;;31822:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31915:1;31903:8;:13;31895:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31974:61;32004:1;32008:2;32012:12;32026:8;31974:21;:61::i;:::-;32349:8;32313:12;:16;32326:2;32313:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32414:8;32373:12;:16;32386:2;32373:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32473:2;32440:11;:25;32452:12;32440:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32540:15;32490:11;:25;32502:12;32490:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32573:20;32596:12;32573:35;;32630:9;32625:415;32645:8;32641:1;:12;32625:415;;;32709:12;32705:2;32684:38;;32701:1;32684:38;;;;;;;;;;;;32745:4;32741:249;;;32808:59;32839:1;32843:2;32847:12;32861:5;32808:22;:59::i;:::-;32774:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32741:249;33010:14;;;;;;;32655:3;;;;;;;32625:415;;;;33071:12;33056;:27;;;;32288:807;33107:60;33136:1;33140:2;33144:12;33158:8;33107:20;:60::i;:::-;31765:1410;31637:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6633:553;6691:8;6701:6;6751:3;6744:4;6736:6;6732:17;6728:27;6718:122;;6759:79;;:::i;:::-;6718:122;6872:6;6859:20;6849:30;;6902:18;6894:6;6891:30;6888:117;;;6924:79;;:::i;:::-;6888:117;7038:4;7030:6;7026:17;7014:29;;7092:3;7084:4;7076:6;7072:17;7062:8;7058:32;7055:41;7052:128;;;7099:79;;:::i;:::-;7052:128;6633:553;;;;;:::o;7192:529::-;7263:6;7271;7320:2;7308:9;7299:7;7295:23;7291:32;7288:119;;;7326:79;;:::i;:::-;7288:119;7474:1;7463:9;7459:17;7446:31;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:65;7696:7;7687:6;7676:9;7672:22;7639:65;:::i;:::-;7621:83;;;;7417:297;7192:529;;;;;:::o;7727:116::-;7797:21;7812:5;7797:21;:::i;:::-;7790:5;7787:32;7777:60;;7833:1;7830;7823:12;7777:60;7727:116;:::o;7849:133::-;7892:5;7930:6;7917:20;7908:29;;7946:30;7970:5;7946:30;:::i;:::-;7849:133;;;;:::o;7988:468::-;8053:6;8061;8110:2;8098:9;8089:7;8085:23;8081:32;8078:119;;;8116:79;;:::i;:::-;8078:119;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8363:2;8389:50;8431:7;8422:6;8411:9;8407:22;8389:50;:::i;:::-;8379:60;;8334:115;7988:468;;;;;:::o;8462:117::-;8571:1;8568;8561:12;8585:180;8633:77;8630:1;8623:88;8730:4;8727:1;8720:15;8754:4;8751:1;8744:15;8771:281;8854:27;8876:4;8854:27;:::i;:::-;8846:6;8842:40;8984:6;8972:10;8969:22;8948:18;8936:10;8933:34;8930:62;8927:88;;;8995:18;;:::i;:::-;8927:88;9035:10;9031:2;9024:22;8814:238;8771:281;;:::o;9058:129::-;9092:6;9119:20;;:::i;:::-;9109:30;;9148:33;9176:4;9168:6;9148:33;:::i;:::-;9058:129;;;:::o;9193:307::-;9254:4;9344:18;9336:6;9333:30;9330:56;;;9366:18;;:::i;:::-;9330:56;9404:29;9426:6;9404:29;:::i;:::-;9396:37;;9488:4;9482;9478:15;9470:23;;9193:307;;;:::o;9506:154::-;9590:6;9585:3;9580;9567:30;9652:1;9643:6;9638:3;9634:16;9627:27;9506:154;;;:::o;9666:410::-;9743:5;9768:65;9784:48;9825:6;9784:48;:::i;:::-;9768:65;:::i;:::-;9759:74;;9856:6;9849:5;9842:21;9894:4;9887:5;9883:16;9932:3;9923:6;9918:3;9914:16;9911:25;9908:112;;;9939:79;;:::i;:::-;9908:112;10029:41;10063:6;10058:3;10053;10029:41;:::i;:::-;9749:327;9666:410;;;;;:::o;10095:338::-;10150:5;10199:3;10192:4;10184:6;10180:17;10176:27;10166:122;;10207:79;;:::i;:::-;10166:122;10324:6;10311:20;10349:78;10423:3;10415:6;10408:4;10400:6;10396:17;10349:78;:::i;:::-;10340:87;;10156:277;10095:338;;;;:::o;10439:943::-;10534:6;10542;10550;10558;10607:3;10595:9;10586:7;10582:23;10578:33;10575:120;;;10614:79;;:::i;:::-;10575:120;10734:1;10759:53;10804:7;10795:6;10784:9;10780:22;10759:53;:::i;:::-;10749:63;;10705:117;10861:2;10887:53;10932:7;10923:6;10912:9;10908:22;10887:53;:::i;:::-;10877:63;;10832:118;10989:2;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10960:118;11145:2;11134:9;11130:18;11117:32;11176:18;11168:6;11165:30;11162:117;;;11198:79;;:::i;:::-;11162:117;11303:62;11357:7;11348:6;11337:9;11333:22;11303:62;:::i;:::-;11293:72;;11088:287;10439:943;;;;;;;:::o;11388:474::-;11456:6;11464;11513:2;11501:9;11492:7;11488:23;11484:32;11481:119;;;11519:79;;:::i;:::-;11481:119;11639:1;11664:53;11709:7;11700:6;11689:9;11685:22;11664:53;:::i;:::-;11654:63;;11610:117;11766:2;11792:53;11837:7;11828:6;11817:9;11813:22;11792:53;:::i;:::-;11782:63;;11737:118;11388:474;;;;;:::o;11868:182::-;12008:34;12004:1;11996:6;11992:14;11985:58;11868:182;:::o;12056:366::-;12198:3;12219:67;12283:2;12278:3;12219:67;:::i;:::-;12212:74;;12295:93;12384:3;12295:93;:::i;:::-;12413:2;12408:3;12404:12;12397:19;;12056:366;;;:::o;12428:419::-;12594:4;12632:2;12621:9;12617:18;12609:26;;12681:9;12675:4;12671:20;12667:1;12656:9;12652:17;12645:47;12709:131;12835:4;12709:131;:::i;:::-;12701:139;;12428:419;;;:::o;12853:162::-;12993:14;12989:1;12981:6;12977:14;12970:38;12853:162;:::o;13021:366::-;13163:3;13184:67;13248:2;13243:3;13184:67;:::i;:::-;13177:74;;13260:93;13349:3;13260:93;:::i;:::-;13378:2;13373:3;13369:12;13362:19;;13021:366;;;:::o;13393:419::-;13559:4;13597:2;13586:9;13582:18;13574:26;;13646:9;13640:4;13636:20;13632:1;13621:9;13617:17;13610:47;13674:131;13800:4;13674:131;:::i;:::-;13666:139;;13393:419;;;:::o;13818:180::-;13866:77;13863:1;13856:88;13963:4;13960:1;13953:15;13987:4;13984:1;13977:15;14004:305;14044:3;14063:20;14081:1;14063:20;:::i;:::-;14058:25;;14097:20;14115:1;14097:20;:::i;:::-;14092:25;;14251:1;14183:66;14179:74;14176:1;14173:81;14170:107;;;14257:18;;:::i;:::-;14170:107;14301:1;14298;14294:9;14287:16;;14004:305;;;;:::o;14315:191::-;14355:4;14375:20;14393:1;14375:20;:::i;:::-;14370:25;;14409:20;14427:1;14409:20;:::i;:::-;14404:25;;14448:1;14445;14442:8;14439:34;;;14453:18;;:::i;:::-;14439:34;14498:1;14495;14491:9;14483:17;;14315:191;;;;:::o;14512:167::-;14652:19;14648:1;14640:6;14636:14;14629:43;14512:167;:::o;14685:366::-;14827:3;14848:67;14912:2;14907:3;14848:67;:::i;:::-;14841:74;;14924:93;15013:3;14924:93;:::i;:::-;15042:2;15037:3;15033:12;15026:19;;14685:366;;;:::o;15057:419::-;15223:4;15261:2;15250:9;15246:18;15238:26;;15310:9;15304:4;15300:20;15296:1;15285:9;15281:17;15274:47;15338:131;15464:4;15338:131;:::i;:::-;15330:139;;15057:419;;;:::o;15482:180::-;15530:77;15527:1;15520:88;15627:4;15624:1;15617:15;15651:4;15648:1;15641:15;15668:320;15712:6;15749:1;15743:4;15739:12;15729:22;;15796:1;15790:4;15786:12;15817:18;15807:81;;15873:4;15865:6;15861:17;15851:27;;15807:81;15935:2;15927:6;15924:14;15904:18;15901:38;15898:84;;15954:18;;:::i;:::-;15898:84;15719:269;15668:320;;;:::o;15994:232::-;16134:34;16130:1;16122:6;16118:14;16111:58;16203:15;16198:2;16190:6;16186:15;16179:40;15994:232;:::o;16232:366::-;16374:3;16395:67;16459:2;16454:3;16395:67;:::i;:::-;16388:74;;16471:93;16560:3;16471:93;:::i;:::-;16589:2;16584:3;16580:12;16573:19;;16232:366;;;:::o;16604:419::-;16770:4;16808:2;16797:9;16793:18;16785:26;;16857:9;16851:4;16847:20;16843:1;16832:9;16828:17;16821:47;16885:131;17011:4;16885:131;:::i;:::-;16877:139;;16604:419;;;:::o;17029:221::-;17169:34;17165:1;17157:6;17153:14;17146:58;17238:4;17233:2;17225:6;17221:15;17214:29;17029:221;:::o;17256:366::-;17398:3;17419:67;17483:2;17478:3;17419:67;:::i;:::-;17412:74;;17495:93;17584:3;17495:93;:::i;:::-;17613:2;17608:3;17604:12;17597:19;;17256:366;;;:::o;17628:419::-;17794:4;17832:2;17821:9;17817:18;17809:26;;17881:9;17875:4;17871:20;17867:1;17856:9;17852:17;17845:47;17909:131;18035:4;17909:131;:::i;:::-;17901:139;;17628:419;;;:::o;18053:244::-;18193:34;18189:1;18181:6;18177:14;18170:58;18262:27;18257:2;18249:6;18245:15;18238:52;18053:244;:::o;18303:366::-;18445:3;18466:67;18530:2;18525:3;18466:67;:::i;:::-;18459:74;;18542:93;18631:3;18542:93;:::i;:::-;18660:2;18655:3;18651:12;18644:19;;18303:366;;;:::o;18675:419::-;18841:4;18879:2;18868:9;18864:18;18856:26;;18928:9;18922:4;18918:20;18914:1;18903:9;18899:17;18892:47;18956:131;19082:4;18956:131;:::i;:::-;18948:139;;18675:419;;;:::o;19100:221::-;19240:34;19236:1;19228:6;19224:14;19217:58;19309:4;19304:2;19296:6;19292:15;19285:29;19100:221;:::o;19327:366::-;19469:3;19490:67;19554:2;19549:3;19490:67;:::i;:::-;19483:74;;19566:93;19655:3;19566:93;:::i;:::-;19684:2;19679:3;19675:12;19668:19;;19327:366;;;:::o;19699:419::-;19865:4;19903:2;19892:9;19888:18;19880:26;;19952:9;19946:4;19942:20;19938:1;19927:9;19923:17;19916:47;19980:131;20106:4;19980:131;:::i;:::-;19972:139;;19699:419;;;:::o;20124:233::-;20264:34;20260:1;20252:6;20248:14;20241:58;20333:16;20328:2;20320:6;20316:15;20309:41;20124:233;:::o;20363:366::-;20505:3;20526:67;20590:2;20585:3;20526:67;:::i;:::-;20519:74;;20602:93;20691:3;20602:93;:::i;:::-;20720:2;20715:3;20711:12;20704:19;;20363:366;;;:::o;20735:419::-;20901:4;20939:2;20928:9;20924:18;20916:26;;20988:9;20982:4;20978:20;20974:1;20963:9;20959:17;20952:47;21016:131;21142:4;21016:131;:::i;:::-;21008:139;;20735:419;;;:::o;21160:222::-;21300:34;21296:1;21288:6;21284:14;21277:58;21369:5;21364:2;21356:6;21352:15;21345:30;21160:222;:::o;21388:366::-;21530:3;21551:67;21615:2;21610:3;21551:67;:::i;:::-;21544:74;;21627:93;21716:3;21627:93;:::i;:::-;21745:2;21740:3;21736:12;21729:19;;21388:366;;;:::o;21760:419::-;21926:4;21964:2;21953:9;21949:18;21941:26;;22013:9;22007:4;22003:20;21999:1;21988:9;21984:17;21977:47;22041:131;22167:4;22041:131;:::i;:::-;22033:139;;21760:419;;;:::o;22185:230::-;22325:34;22321:1;22313:6;22309:14;22302:58;22394:13;22389:2;22381:6;22377:15;22370:38;22185:230;:::o;22421:366::-;22563:3;22584:67;22648:2;22643:3;22584:67;:::i;:::-;22577:74;;22660:93;22749:3;22660:93;:::i;:::-;22778:2;22773:3;22769:12;22762:19;;22421:366;;;:::o;22793:419::-;22959:4;22997:2;22986:9;22982:18;22974:26;;23046:9;23040:4;23036:20;23032:1;23021:9;23017:17;23010:47;23074:131;23200:4;23074:131;:::i;:::-;23066:139;;22793:419;;;:::o;23218:166::-;23358:18;23354:1;23346:6;23342:14;23335:42;23218:166;:::o;23390:366::-;23532:3;23553:67;23617:2;23612:3;23553:67;:::i;:::-;23546:74;;23629:93;23718:3;23629:93;:::i;:::-;23747:2;23742:3;23738:12;23731:19;;23390:366;;;:::o;23762:419::-;23928:4;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:131;24169:4;24043:131;:::i;:::-;24035:139;;23762:419;;;:::o;24187:348::-;24227:7;24250:20;24268:1;24250:20;:::i;:::-;24245:25;;24284:20;24302:1;24284:20;:::i;:::-;24279:25;;24472:1;24404:66;24400:74;24397:1;24394:81;24389:1;24382:9;24375:17;24371:105;24368:131;;;24479:18;;:::i;:::-;24368:131;24527:1;24524;24520:9;24509:20;;24187:348;;;;:::o;24541:167::-;24681:19;24677:1;24669:6;24665:14;24658:43;24541:167;:::o;24714:366::-;24856:3;24877:67;24941:2;24936:3;24877:67;:::i;:::-;24870:74;;24953:93;25042:3;24953:93;:::i;:::-;25071:2;25066:3;25062:12;25055:19;;24714:366;;;:::o;25086:419::-;25252:4;25290:2;25279:9;25275:18;25267:26;;25339:9;25333:4;25329:20;25325:1;25314:9;25310:17;25303:47;25367:131;25493:4;25367:131;:::i;:::-;25359:139;;25086:419;;;:::o;25511:169::-;25651:21;25647:1;25639:6;25635:14;25628:45;25511:169;:::o;25686:366::-;25828:3;25849:67;25913:2;25908:3;25849:67;:::i;:::-;25842:74;;25925:93;26014:3;25925:93;:::i;:::-;26043:2;26038:3;26034:12;26027:19;;25686:366;;;:::o;26058:419::-;26224:4;26262:2;26251:9;26247:18;26239:26;;26311:9;26305:4;26301:20;26297:1;26286:9;26282:17;26275:47;26339:131;26465:4;26339:131;:::i;:::-;26331:139;;26058:419;;;:::o;26483:168::-;26623:20;26619:1;26611:6;26607:14;26600:44;26483:168;:::o;26657:366::-;26799:3;26820:67;26884:2;26879:3;26820:67;:::i;:::-;26813:74;;26896:93;26985:3;26896:93;:::i;:::-;27014:2;27009:3;27005:12;26998:19;;26657:366;;;:::o;27029:419::-;27195:4;27233:2;27222:9;27218:18;27210:26;;27282:9;27276:4;27272:20;27268:1;27257:9;27253:17;27246:47;27310:131;27436:4;27310:131;:::i;:::-;27302:139;;27029:419;;;:::o;27454:173::-;27594:25;27590:1;27582:6;27578:14;27571:49;27454:173;:::o;27633:366::-;27775:3;27796:67;27860:2;27855:3;27796:67;:::i;:::-;27789:74;;27872:93;27961:3;27872:93;:::i;:::-;27990:2;27985:3;27981:12;27974:19;;27633:366;;;:::o;28005:419::-;28171:4;28209:2;28198:9;28194:18;28186:26;;28258:9;28252:4;28248:20;28244:1;28233:9;28229:17;28222:47;28286:131;28412:4;28286:131;:::i;:::-;28278:139;;28005:419;;;:::o;28430:176::-;28570:28;28566:1;28558:6;28554:14;28547:52;28430:176;:::o;28612:366::-;28754:3;28775:67;28839:2;28834:3;28775:67;:::i;:::-;28768:74;;28851:93;28940:3;28851:93;:::i;:::-;28969:2;28964:3;28960:12;28953:19;;28612:366;;;:::o;28984:419::-;29150:4;29188:2;29177:9;29173:18;29165:26;;29237:9;29231:4;29227:20;29223:1;29212:9;29208:17;29201:47;29265:131;29391:4;29265:131;:::i;:::-;29257:139;;28984:419;;;:::o;29409:238::-;29549:34;29545:1;29537:6;29533:14;29526:58;29618:21;29613:2;29605:6;29601:15;29594:46;29409:238;:::o;29653:366::-;29795:3;29816:67;29880:2;29875:3;29816:67;:::i;:::-;29809:74;;29892:93;29981:3;29892:93;:::i;:::-;30010:2;30005:3;30001:12;29994:19;;29653:366;;;:::o;30025:419::-;30191:4;30229:2;30218:9;30214:18;30206:26;;30278:9;30272:4;30268:20;30264:1;30253:9;30249:17;30242:47;30306:131;30432:4;30306:131;:::i;:::-;30298:139;;30025:419;;;:::o;30450:234::-;30590:34;30586:1;30578:6;30574:14;30567:58;30659:17;30654:2;30646:6;30642:15;30635:42;30450:234;:::o;30690:366::-;30832:3;30853:67;30917:2;30912:3;30853:67;:::i;:::-;30846:74;;30929:93;31018:3;30929:93;:::i;:::-;31047:2;31042:3;31038:12;31031:19;;30690:366;;;:::o;31062:419::-;31228:4;31266:2;31255:9;31251:18;31243:26;;31315:9;31309:4;31305:20;31301:1;31290:9;31286:17;31279:47;31343:131;31469:4;31343:131;:::i;:::-;31335:139;;31062:419;;;:::o;31487:148::-;31589:11;31626:3;31611:18;;31487:148;;;;:::o;31641:377::-;31747:3;31775:39;31808:5;31775:39;:::i;:::-;31830:89;31912:6;31907:3;31830:89;:::i;:::-;31823:96;;31928:52;31973:6;31968:3;31961:4;31954:5;31950:16;31928:52;:::i;:::-;32005:6;32000:3;31996:16;31989:23;;31751:267;31641:377;;;;:::o;32024:155::-;32164:7;32160:1;32152:6;32148:14;32141:31;32024:155;:::o;32185:400::-;32345:3;32366:84;32448:1;32443:3;32366:84;:::i;:::-;32359:91;;32459:93;32548:3;32459:93;:::i;:::-;32577:1;32572:3;32568:11;32561:18;;32185:400;;;:::o;32591:701::-;32872:3;32894:95;32985:3;32976:6;32894:95;:::i;:::-;32887:102;;33006:95;33097:3;33088:6;33006:95;:::i;:::-;32999:102;;33118:148;33262:3;33118:148;:::i;:::-;33111:155;;33283:3;33276:10;;32591:701;;;;;:::o;33298:225::-;33438:34;33434:1;33426:6;33422:14;33415:58;33507:8;33502:2;33494:6;33490:15;33483:33;33298:225;:::o;33529:366::-;33671:3;33692:67;33756:2;33751:3;33692:67;:::i;:::-;33685:74;;33768:93;33857:3;33768:93;:::i;:::-;33886:2;33881:3;33877:12;33870:19;;33529:366;;;:::o;33901:419::-;34067:4;34105:2;34094:9;34090:18;34082:26;;34154:9;34148:4;34144:20;34140:1;34129:9;34125:17;34118:47;34182:131;34308:4;34182:131;:::i;:::-;34174:139;;33901:419;;;:::o;34326:237::-;34466:34;34462:1;34454:6;34450:14;34443:58;34535:20;34530:2;34522:6;34518:15;34511:45;34326:237;:::o;34569:366::-;34711:3;34732:67;34796:2;34791:3;34732:67;:::i;:::-;34725:74;;34808:93;34897:3;34808:93;:::i;:::-;34926:2;34921:3;34917:12;34910:19;;34569:366;;;:::o;34941:419::-;35107:4;35145:2;35134:9;35130:18;35122:26;;35194:9;35188:4;35184:20;35180:1;35169:9;35165:17;35158:47;35222:131;35348:4;35222:131;:::i;:::-;35214:139;;34941:419;;;:::o;35366:225::-;35506:34;35502:1;35494:6;35490:14;35483:58;35575:8;35570:2;35562:6;35558:15;35551:33;35366:225;:::o;35597:366::-;35739:3;35760:67;35824:2;35819:3;35760:67;:::i;:::-;35753:74;;35836:93;35925:3;35836:93;:::i;:::-;35954:2;35949:3;35945:12;35938:19;;35597:366;;;:::o;35969:419::-;36135:4;36173:2;36162:9;36158:18;36150:26;;36222:9;36216:4;36212:20;36208:1;36197:9;36193:17;36186:47;36250:131;36376:4;36250:131;:::i;:::-;36242:139;;35969:419;;;:::o;36394:224::-;36534:34;36530:1;36522:6;36518:14;36511:58;36603:7;36598:2;36590:6;36586:15;36579:32;36394:224;:::o;36624:366::-;36766:3;36787:67;36851:2;36846:3;36787:67;:::i;:::-;36780:74;;36863:93;36952:3;36863:93;:::i;:::-;36981:2;36976:3;36972:12;36965:19;;36624:366;;;:::o;36996:419::-;37162:4;37200:2;37189:9;37185:18;37177:26;;37249:9;37243:4;37239:20;37235:1;37224:9;37220:17;37213:47;37277:131;37403:4;37277:131;:::i;:::-;37269:139;;36996:419;;;:::o;37421:229::-;37561:34;37557:1;37549:6;37545:14;37538:58;37630:12;37625:2;37617:6;37613:15;37606:37;37421:229;:::o;37656:366::-;37798:3;37819:67;37883:2;37878:3;37819:67;:::i;:::-;37812:74;;37895:93;37984:3;37895:93;:::i;:::-;38013:2;38008:3;38004:12;37997:19;;37656:366;;;:::o;38028:419::-;38194:4;38232:2;38221:9;38217:18;38209:26;;38281:9;38275:4;38271:20;38267:1;38256:9;38252:17;38245:47;38309:131;38435:4;38309:131;:::i;:::-;38301:139;;38028:419;;;:::o;38453:234::-;38593:34;38589:1;38581:6;38577:14;38570:58;38662:17;38657:2;38649:6;38645:15;38638:42;38453:234;:::o;38693:366::-;38835:3;38856:67;38920:2;38915:3;38856:67;:::i;:::-;38849:74;;38932:93;39021:3;38932:93;:::i;:::-;39050:2;39045:3;39041:12;39034:19;;38693:366;;;:::o;39065:419::-;39231:4;39269:2;39258:9;39254:18;39246:26;;39318:9;39312:4;39308:20;39304:1;39293:9;39289:17;39282:47;39346:131;39472:4;39346:131;:::i;:::-;39338:139;;39065:419;;;:::o;39490:98::-;39541:6;39575:5;39569:12;39559:22;;39490:98;;;:::o;39594:168::-;39677:11;39711:6;39706:3;39699:19;39751:4;39746:3;39742:14;39727:29;;39594:168;;;;:::o;39768:360::-;39854:3;39882:38;39914:5;39882:38;:::i;:::-;39936:70;39999:6;39994:3;39936:70;:::i;:::-;39929:77;;40015:52;40060:6;40055:3;40048:4;40041:5;40037:16;40015:52;:::i;:::-;40092:29;40114:6;40092:29;:::i;:::-;40087:3;40083:39;40076:46;;39858:270;39768:360;;;;:::o;40134:640::-;40329:4;40367:3;40356:9;40352:19;40344:27;;40381:71;40449:1;40438:9;40434:17;40425:6;40381:71;:::i;:::-;40462:72;40530:2;40519:9;40515:18;40506:6;40462:72;:::i;:::-;40544;40612:2;40601:9;40597:18;40588:6;40544:72;:::i;:::-;40663:9;40657:4;40653:20;40648:2;40637:9;40633:18;40626:48;40691:76;40762:4;40753:6;40691:76;:::i;:::-;40683:84;;40134:640;;;;;;;:::o;40780:141::-;40836:5;40867:6;40861:13;40852:22;;40883:32;40909:5;40883:32;:::i;:::-;40780:141;;;;:::o;40927:349::-;40996:6;41045:2;41033:9;41024:7;41020:23;41016:32;41013:119;;;41051:79;;:::i;:::-;41013:119;41171:1;41196:63;41251:7;41242:6;41231:9;41227:22;41196:63;:::i;:::-;41186:73;;41142:127;40927:349;;;;:::o;41282:233::-;41321:3;41344:24;41362:5;41344:24;:::i;:::-;41335:33;;41390:66;41383:5;41380:77;41377:103;;41460:18;;:::i;:::-;41377:103;41507:1;41500:5;41496:13;41489:20;;41282:233;;;:::o;41521:180::-;41569:77;41566:1;41559:88;41666:4;41663:1;41656:15;41690:4;41687:1;41680:15;41707:185;41747:1;41764:20;41782:1;41764:20;:::i;:::-;41759:25;;41798:20;41816:1;41798:20;:::i;:::-;41793:25;;41837:1;41827:35;;41842:18;;:::i;:::-;41827:35;41884:1;41881;41877:9;41872:14;;41707:185;;;;:::o;41898:176::-;41930:1;41947:20;41965:1;41947:20;:::i;:::-;41942:25;;41981:20;41999:1;41981:20;:::i;:::-;41976:25;;42020:1;42010:35;;42025:18;;:::i;:::-;42010:35;42066:1;42063;42059:9;42054:14;;41898:176;;;;:::o;42080:180::-;42128:77;42125:1;42118:88;42225:4;42222:1;42215:15;42249:4;42246:1;42239:15;42266:220;42406:34;42402:1;42394:6;42390:14;42383:58;42475:3;42470:2;42462:6;42458:15;42451:28;42266:220;:::o;42492:366::-;42634:3;42655:67;42719:2;42714:3;42655:67;:::i;:::-;42648:74;;42731:93;42820:3;42731:93;:::i;:::-;42849:2;42844:3;42840:12;42833:19;;42492:366;;;:::o;42864:419::-;43030:4;43068:2;43057:9;43053:18;43045:26;;43117:9;43111:4;43107:20;43103:1;43092:9;43088:17;43081:47;43145:131;43271:4;43145:131;:::i;:::-;43137:139;;42864:419;;;:::o;43289:227::-;43429:34;43425:1;43417:6;43413:14;43406:58;43498:10;43493:2;43485:6;43481:15;43474:35;43289:227;:::o;43522:366::-;43664:3;43685:67;43749:2;43744:3;43685:67;:::i;:::-;43678:74;;43761:93;43850:3;43761:93;:::i;:::-;43879:2;43874:3;43870:12;43863:19;;43522:366;;;:::o;43894:419::-;44060:4;44098:2;44087:9;44083:18;44075:26;;44147:9;44141:4;44137:20;44133:1;44122:9;44118:17;44111:47;44175:131;44301:4;44175:131;:::i;:::-;44167:139;;43894:419;;;:::o

Swarm Source

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