ETH Price: $3,834.51 (+5.46%)

SteamPunk Hunter (SPH)
 

Overview

TokenID

4743

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
SteamPunk

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 14: SteamPunk.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "./Ownable.sol";
import "./ERC2981.sol";
import "./Address.sol";
import "./Strings.sol";
import "./ERC721AQueryable.sol";

contract SteamPunk is ERC2981, ERC721AQueryable, Ownable {
    using Address for address payable;
    using Strings for uint256;

    uint256 public price = 0.005 ether;
    uint256 public maxSupply = 5000;
    uint256 public walletLimit = 10;

    uint256 public publicSupply = 1500;
    uint256 public publicMinted = 0;

    bool public started = false;
    string public baseURI =
        "ipfs://QmSJ5QBNEsdcL3swFpNDkgrYNHq9KiFcwK735RBDtS9juC/";
    address private _devWallet = 0x1a93694Ce4D1c0F18cBcf7e5491656C77Bcd86dE;

    mapping(address => uint256) public walletMinted;
    mapping(address => uint256) public WhiteListMinted;

    constructor() ERC721A("SteamPunk Hunter", "SPH") {}

    function mint(uint32 amount) external payable {
        require(started, "Sale is not started");
        require(amount + totalSupply() <= maxSupply, "Exceed max supply");
        require(amount + publicMinted <= publicSupply, "Exceed max supply");
        publicMinted = publicMinted + amount;

        require(
            amount + walletMinted[msg.sender] <= walletLimit,
            " Exceed wallet limit"
        );
        walletMinted[msg.sender] = walletMinted[msg.sender] + amount;

        require(msg.value >= amount * price, "Insufficient fund");
        payable(_devWallet).sendValue(address(this).balance);
        _safeMint(msg.sender, amount);
    }

    function Freemint(uint32 amount) external {
        require(totalSupply() + amount <= maxSupply, "Exceed max supply");
        require(
            amount <= WhiteListMinted[msg.sender],
            "Exceed max whitelist supply"
        );
        WhiteListMinted[msg.sender] = WhiteListMinted[msg.sender] - amount;
        _safeMint(msg.sender, amount);
    }

    function setWhiteList(
        address[] memory _whiteList,
        uint256[] memory _whiteListNum
    ) external onlyOwner {
        uint256 len = _whiteList.length;
        for (uint256 i = 0; i < len; i++) {
            WhiteListMinted[_whiteList[i]] = _whiteListNum[i];
        }
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC2981, ERC721A)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function setStarted(bool _started) external onlyOwner {
        started = _started;
    }

    function setMetadataURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 14: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) /
            _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator)
        internal
        virtual
    {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 5 of 14: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * 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)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (
            to.isContract() &&
            !_checkContractOnERC721Received(from, to, tokenId, _data)
        ) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    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;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 6 of 14: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./ERC721A.sol";

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId)
        public
        view
        returns (TokenOwnership memory)
    {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds)
        external
        view
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](
                tokenIdsLength
            );
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (
                uint256 i = start;
                i != stop && tokenIdsIdx != tokenIdsMaxLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner)
        external
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (
                uint256 i = _startTokenId();
                tokenIdsIdx != tokenIdsLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 14: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 9 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint32","name":"amount","type":"uint32"}],"name":"Freemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhiteListMinted","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_started","type":"bool"}],"name":"setStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whiteList","type":"address[]"},{"internalType":"uint256[]","name":"_whiteListNum","type":"uint256[]"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526611c37937e08000600b55611388600c55600a600d556105dc600e556000600f556000601060006101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200543c60369139601190816200006a9190620004e9565b50731a93694ce4d1c0f18cbcf7e5491656c77bcd86de601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000cd57600080fd5b506040518060400160405280601081526020017f537465616d50756e6b2048756e746572000000000000000000000000000000008152506040518060400160405280600381526020017f535048000000000000000000000000000000000000000000000000000000000081525081600490816200014b9190620004e9565b5080600590816200015d9190620004e9565b506200016e6200019c60201b60201c565b6002819055505050620001966200018a620001a160201b60201c565b620001a960201b60201c565b620005d0565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f157607f821691505b602082108103620003075762000306620002a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000332565b6200037d868362000332565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ca620003c4620003be8462000395565b6200039f565b62000395565b9050919050565b6000819050919050565b620003e683620003a9565b620003fe620003f582620003d1565b8484546200033f565b825550505050565b600090565b6200041562000406565b62000422818484620003db565b505050565b5b818110156200044a576200043e6000826200040b565b60018101905062000428565b5050565b601f821115620004995762000463816200030d565b6200046e8462000322565b810160208510156200047e578190505b620004966200048d8562000322565b83018262000427565b50505b505050565b600082821c905092915050565b6000620004be600019846008026200049e565b1980831691505092915050565b6000620004d98383620004ab565b9150826002028217905092915050565b620004f4826200026f565b67ffffffffffffffff81111562000510576200050f6200027a565b5b6200051c8254620002d8565b620005298282856200044e565b600060209050601f8311600181146200056157600084156200054c578287015190505b620005588582620004cb565b865550620005c8565b601f19841662000571866200030d565b60005b828110156200059b5784890151825560018201915060208501945060208101905062000574565b86831015620005bb5784890151620005b7601f891682620004ab565b8355505b6001600288020188555050505b505050505050565b614e5c80620005e06000396000f3fe60806040526004361061021a5760003560e01c80638462151c11610123578063a71bbebe116100ab578063d5abeb011161006f578063d5abeb0114610813578063e39465561461083e578063e985e9c514610867578063ef6b141a146108a4578063f2fde38b146108cd5761021a565b8063a71bbebe14610717578063b88d4fde14610733578063c23dc68f1461075c578063c87b56dd14610799578063d3738fc8146107d65761021a565b806399a2557a116100f257806399a2557a14610632578063a035b1fe1461066f578063a22cb4651461069a578063a4f4f8af146106c3578063a6ff3dd5146106ee5761021a565b80638462151c146105625780638a2650621461059f5780638da5cb5b146105dc57806395d89b41146106075761021a565b80633ccfd60b116101a65780636352211e116101755780636352211e1461047d5780636c0360eb146104ba57806370a08231146104e5578063715018a614610522578063750521f5146105395761021a565b80633ccfd60b146103d557806342842e0e146103ec5780635bbb2177146104155780635e84d723146104525761021a565b806318160ddd116101ed57806318160ddd146102ed5780631f2698ab1461031857806323b872dd146103435780632a55205a1461036c5780633c8463a1146103aa5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613699565b6108f6565b60405161025391906136e1565b60405180910390f35b34801561026857600080fd5b506102716109d8565b60405161027e9190613795565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906137ed565b610a6a565b6040516102bb919061385b565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906138a2565b610ae6565b005b3480156102f957600080fd5b50610302610bf0565b60405161030f91906138f1565b60405180910390f35b34801561032457600080fd5b5061032d610c07565b60405161033a91906136e1565b60405180910390f35b34801561034f57600080fd5b5061036a6004803603810190610365919061390c565b610c1a565b005b34801561037857600080fd5b50610393600480360381019061038e919061395f565b610c2a565b6040516103a192919061399f565b60405180910390f35b3480156103b657600080fd5b506103bf610e14565b6040516103cc91906138f1565b60405180910390f35b3480156103e157600080fd5b506103ea610e1a565b005b3480156103f857600080fd5b50610413600480360381019061040e919061390c565b610ec1565b005b34801561042157600080fd5b5061043c60048036038101906104379190613b10565b610ee1565b6040516104499190613c8b565b60405180910390f35b34801561045e57600080fd5b50610467610fa2565b60405161047491906138f1565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f91906137ed565b610fa8565b6040516104b1919061385b565b60405180910390f35b3480156104c657600080fd5b506104cf610fbe565b6040516104dc9190613795565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613cad565b61104c565b60405161051991906138f1565b60405180910390f35b34801561052e57600080fd5b5061053761111b565b005b34801561054557600080fd5b50610560600480360381019061055b9190613d8f565b6111a3565b005b34801561056e57600080fd5b5061058960048036038101906105849190613cad565b611232565b6040516105969190613e96565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613cad565b61142d565b6040516105d391906138f1565b60405180910390f35b3480156105e857600080fd5b506105f1611445565b6040516105fe919061385b565b60405180910390f35b34801561061357600080fd5b5061061c61146f565b6040516106299190613795565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613eb8565b611501565b6040516106669190613e96565b60405180910390f35b34801561067b57600080fd5b506106846117c0565b60405161069191906138f1565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613f37565b6117c6565b005b3480156106cf57600080fd5b506106d861193d565b6040516106e591906138f1565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190613fb3565b611943565b005b610731600480360381019061072c9190613fb3565b611acf565b005b34801561073f57600080fd5b5061075a60048036038101906107559190614081565b611dca565b005b34801561076857600080fd5b50610783600480360381019061077e91906137ed565b611e46565b6040516107909190614146565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb91906137ed565b611f63565b6040516107cd9190613795565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613cad565b611fd6565b60405161080a91906138f1565b60405180910390f35b34801561081f57600080fd5b50610828611fee565b60405161083591906138f1565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190614224565b611ff4565b005b34801561087357600080fd5b5061088e6004803603810190610889919061429c565b612112565b60405161089b91906136e1565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906142dc565b6121a6565b005b3480156108d957600080fd5b506108f460048036038101906108ef9190613cad565b61223f565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c157507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d157506109d082612336565b5b9050919050565b6060600480546109e790614338565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390614338565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582612418565b610aab576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af182610fa8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b58576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b77612466565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba95750610ba781610ba2612466565b612112565b155b15610be0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610beb83838361246e565b505050565b6000610bfa612520565b6003546002540303905090565b601060009054906101000a900460ff1681565b610c25838383612525565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610dbf5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610dc96129d9565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610df59190614398565b610dff9190614421565b90508160000151819350935050509250929050565b600d5481565b610e22612466565b73ffffffffffffffffffffffffffffffffffffffff16610e40611445565b73ffffffffffffffffffffffffffffffffffffffff1614610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061449e565b60405180910390fd5b610ebf473373ffffffffffffffffffffffffffffffffffffffff166129e390919063ffffffff16565b565b610edc83838360405180602001604052806000815250611dca565b505050565b606060008251905060008167ffffffffffffffff811115610f0557610f046139cd565b5b604051908082528060200260200182016040528015610f3e57816020015b610f2b6135ea565b815260200190600190039081610f235790505b50905060005b828114610f9757610f6e858281518110610f6157610f606144be565b5b6020026020010151611e46565b828281518110610f8157610f806144be565b5b6020026020010181905250806001019050610f44565b508092505050919050565b600e5481565b6000610fb382612ad7565b600001519050919050565b60118054610fcb90614338565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff790614338565b80156110445780601f1061101957610100808354040283529160200191611044565b820191906000526020600020905b81548152906001019060200180831161102757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611123612466565b73ffffffffffffffffffffffffffffffffffffffff16611141611445565b73ffffffffffffffffffffffffffffffffffffffff1614611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061449e565b60405180910390fd5b6111a16000612d66565b565b6111ab612466565b73ffffffffffffffffffffffffffffffffffffffff166111c9611445565b73ffffffffffffffffffffffffffffffffffffffff161461121f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112169061449e565b60405180910390fd5b806011908161122e9190614699565b5050565b606060008060006112428561104c565b905060008167ffffffffffffffff8111156112605761125f6139cd565b5b60405190808252806020026020018201604052801561128e5781602001602082028036833780820191505090505b5090506112996135ea565b60006112a3612520565b90505b83861461141f57600660008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015161141457600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113b957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114135780838780600101985081518110611406576114056144be565b5b6020026020010181815250505b5b8060010190506112a6565b508195505050505050919050565b60146020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461147e90614338565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90614338565b80156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b5050505050905090565b606081831061153c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600254905061154c612520565b85101561155e5761155b612520565b94505b8084111561156a578093505b60006115758761104c565b905084861015611598576000868603905081811015611592578091505b5061159d565b600090505b60008167ffffffffffffffff8111156115b9576115b86139cd565b5b6040519080825280602002602001820160405280156115e75781602001602082028036833780820191505090505b509050600082036115fe57809450505050506117b9565b600061160988611e46565b90506000816040015161161e57816000015190505b60008990505b8881141580156116345750848714155b156117ab57600660008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050925082604001516117a057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461174557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361179f5780848880600101995081518110611792576117916144be565b5b6020026020010181815250505b5b806001019050611624565b508583528296505050505050505b9392505050565b600b5481565b6117ce612466565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611832576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061183f612466565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ec612466565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193191906136e1565b60405180910390a35050565b600f5481565b600c548163ffffffff16611955610bf0565b61195f919061476b565b11156119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979061480d565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548163ffffffff161115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614879565b60405180910390fd5b8063ffffffff16601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a799190614899565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611acc338263ffffffff16612e2c565b50565b601060009054906101000a900460ff16611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614919565b60405180910390fd5b600c54611b29610bf0565b8263ffffffff16611b3a919061476b565b1115611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b729061480d565b60405180910390fd5b600e54600f548263ffffffff16611b92919061476b565b1115611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca9061480d565b60405180910390fd5b8063ffffffff16600f54611be7919061476b565b600f81905550600d54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548263ffffffff16611c41919061476b565b1115611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990614985565b60405180910390fd5b8063ffffffff16601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd3919061476b565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b548163ffffffff16611d2a9190614398565b341015611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906149f1565b60405180910390fd5b611db747601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129e390919063ffffffff16565b611dc7338263ffffffff16612e2c565b50565b611dd5848484612525565b611df48373ffffffffffffffffffffffffffffffffffffffff16612e4a565b8015611e095750611e0784848484612e6d565b155b15611e40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611e4e6135ea565b611e566135ea565b611e5e612520565b831080611e6d57506002548310155b15611e7b5780915050611f5e565b600660008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611f515780915050611f5e565b611f5a83612ad7565b9150505b919050565b6060611f6e82612418565b611fa4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011611faf83612fbd565b604051602001611fc0929190614ad0565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090505481565b600c5481565b611ffc612466565b73ffffffffffffffffffffffffffffffffffffffff1661201a611445565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120679061449e565b60405180910390fd5b60008251905060005b8181101561210c57828181518110612094576120936144be565b5b6020026020010151601460008684815181106120b3576120b26144be565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061210490614af4565b915050612079565b50505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ae612466565b73ffffffffffffffffffffffffffffffffffffffff166121cc611445565b73ffffffffffffffffffffffffffffffffffffffff1614612222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122199061449e565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b612247612466565b73ffffffffffffffffffffffffffffffffffffffff16612265611445565b73ffffffffffffffffffffffffffffffffffffffff16146122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b29061449e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232190614bae565b60405180910390fd5b61233381612d66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061241157506124108261311d565b5b9050919050565b600081612423612520565b11158015612432575060025482105b801561245f575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061253082612ad7565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125bc612466565b73ffffffffffffffffffffffffffffffffffffffff1614806125eb57506125ea856125e5612466565b612112565b5b8061263057506125f9612466565b73ffffffffffffffffffffffffffffffffffffffff1661261884610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612669576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126cf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126dc8585856001613197565b6126e86000848761246e565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361296757600254821461296657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129d2858585600161319d565b5050505050565b6000612710905090565b80471015612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d90614c1a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612a4c90614c6b565b60006040518083038185875af1925050503d8060008114612a89576040519150601f19603f3d011682016040523d82523d6000602084013e612a8e565b606091505b5050905080612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614cf2565b60405180910390fd5b505050565b612adf6135ea565b600082905080612aed612520565b11158015612afc575060025481105b15612d2f576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c11578092505050612d61565b5b600115612d2c57818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d27578092505050612d61565b612c12565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e468282604051806020016040528060008152506131a3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e93612466565b8786866040518563ffffffff1660e01b8152600401612eb59493929190614d67565b6020604051808303816000875af1925050508015612ef157506040513d601f19601f82011682018060405250810190612eee9190614dc8565b60015b612f6a573d8060008114612f21576040519150601f19603f3d011682016040523d82523d6000602084013e612f26565b606091505b506000815103612f62576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613004576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613118565b600082905060005b6000821461303657808061301f90614af4565b915050600a8261302f9190614421565b915061300c565b60008167ffffffffffffffff811115613052576130516139cd565b5b6040519080825280601f01601f1916602001820160405280156130845781602001600182028036833780820191505090505b5090505b600085146131115760018261309d9190614899565b9150600a856130ac9190614df5565b60306130b8919061476b565b60f81b8183815181106130ce576130cd6144be565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561310a9190614421565b9450613088565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613190575061318f826131b5565b5b9050919050565b50505050565b50505050565b6131b0838383600161321f565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361328c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036132c6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d36000868387613197565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561349d575061349c8773ffffffffffffffffffffffffffffffffffffffff16612e4a565b5b15613562575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135126000888480600101955088612e6d565b613548576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134a357826002541461355d57600080fd5b6135cd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613563575b8160028190555050506135e3600086838761319d565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61367681613641565b811461368157600080fd5b50565b6000813590506136938161366d565b92915050565b6000602082840312156136af576136ae613637565b5b60006136bd84828501613684565b91505092915050565b60008115159050919050565b6136db816136c6565b82525050565b60006020820190506136f660008301846136d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561373657808201518184015260208101905061371b565b83811115613745576000848401525b50505050565b6000601f19601f8301169050919050565b6000613767826136fc565b6137718185613707565b9350613781818560208601613718565b61378a8161374b565b840191505092915050565b600060208201905081810360008301526137af818461375c565b905092915050565b6000819050919050565b6137ca816137b7565b81146137d557600080fd5b50565b6000813590506137e7816137c1565b92915050565b60006020828403121561380357613802613637565b5b6000613811848285016137d8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138458261381a565b9050919050565b6138558161383a565b82525050565b6000602082019050613870600083018461384c565b92915050565b61387f8161383a565b811461388a57600080fd5b50565b60008135905061389c81613876565b92915050565b600080604083850312156138b9576138b8613637565b5b60006138c78582860161388d565b92505060206138d8858286016137d8565b9150509250929050565b6138eb816137b7565b82525050565b600060208201905061390660008301846138e2565b92915050565b60008060006060848603121561392557613924613637565b5b60006139338682870161388d565b93505060206139448682870161388d565b9250506040613955868287016137d8565b9150509250925092565b6000806040838503121561397657613975613637565b5b6000613984858286016137d8565b9250506020613995858286016137d8565b9150509250929050565b60006040820190506139b4600083018561384c565b6139c160208301846138e2565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a058261374b565b810181811067ffffffffffffffff82111715613a2457613a236139cd565b5b80604052505050565b6000613a3761362d565b9050613a4382826139fc565b919050565b600067ffffffffffffffff821115613a6357613a626139cd565b5b602082029050602081019050919050565b600080fd5b6000613a8c613a8784613a48565b613a2d565b90508083825260208201905060208402830185811115613aaf57613aae613a74565b5b835b81811015613ad85780613ac488826137d8565b845260208401935050602081019050613ab1565b5050509392505050565b600082601f830112613af757613af66139c8565b5b8135613b07848260208601613a79565b91505092915050565b600060208284031215613b2657613b25613637565b5b600082013567ffffffffffffffff811115613b4457613b4361363c565b5b613b5084828501613ae2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b8e8161383a565b82525050565b600067ffffffffffffffff82169050919050565b613bb181613b94565b82525050565b613bc0816136c6565b82525050565b606082016000820151613bdc6000850182613b85565b506020820151613bef6020850182613ba8565b506040820151613c026040850182613bb7565b50505050565b6000613c148383613bc6565b60608301905092915050565b6000602082019050919050565b6000613c3882613b59565b613c428185613b64565b9350613c4d83613b75565b8060005b83811015613c7e578151613c658882613c08565b9750613c7083613c20565b925050600181019050613c51565b5085935050505092915050565b60006020820190508181036000830152613ca58184613c2d565b905092915050565b600060208284031215613cc357613cc2613637565b5b6000613cd18482850161388d565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cfa57613cf96139cd565b5b613d038261374b565b9050602081019050919050565b82818337600083830152505050565b6000613d32613d2d84613cdf565b613a2d565b905082815260208101848484011115613d4e57613d4d613cda565b5b613d59848285613d10565b509392505050565b600082601f830112613d7657613d756139c8565b5b8135613d86848260208601613d1f565b91505092915050565b600060208284031215613da557613da4613637565b5b600082013567ffffffffffffffff811115613dc357613dc261363c565b5b613dcf84828501613d61565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0d816137b7565b82525050565b6000613e1f8383613e04565b60208301905092915050565b6000602082019050919050565b6000613e4382613dd8565b613e4d8185613de3565b9350613e5883613df4565b8060005b83811015613e89578151613e708882613e13565b9750613e7b83613e2b565b925050600181019050613e5c565b5085935050505092915050565b60006020820190508181036000830152613eb08184613e38565b905092915050565b600080600060608486031215613ed157613ed0613637565b5b6000613edf8682870161388d565b9350506020613ef0868287016137d8565b9250506040613f01868287016137d8565b9150509250925092565b613f14816136c6565b8114613f1f57600080fd5b50565b600081359050613f3181613f0b565b92915050565b60008060408385031215613f4e57613f4d613637565b5b6000613f5c8582860161388d565b9250506020613f6d85828601613f22565b9150509250929050565b600063ffffffff82169050919050565b613f9081613f77565b8114613f9b57600080fd5b50565b600081359050613fad81613f87565b92915050565b600060208284031215613fc957613fc8613637565b5b6000613fd784828501613f9e565b91505092915050565b600067ffffffffffffffff821115613ffb57613ffa6139cd565b5b6140048261374b565b9050602081019050919050565b600061402461401f84613fe0565b613a2d565b9050828152602081018484840111156140405761403f613cda565b5b61404b848285613d10565b509392505050565b600082601f830112614068576140676139c8565b5b8135614078848260208601614011565b91505092915050565b6000806000806080858703121561409b5761409a613637565b5b60006140a98782880161388d565b94505060206140ba8782880161388d565b93505060406140cb878288016137d8565b925050606085013567ffffffffffffffff8111156140ec576140eb61363c565b5b6140f887828801614053565b91505092959194509250565b60608201600082015161411a6000850182613b85565b50602082015161412d6020850182613ba8565b5060408201516141406040850182613bb7565b50505050565b600060608201905061415b6000830184614104565b92915050565b600067ffffffffffffffff82111561417c5761417b6139cd565b5b602082029050602081019050919050565b60006141a061419b84614161565b613a2d565b905080838252602082019050602084028301858111156141c3576141c2613a74565b5b835b818110156141ec57806141d8888261388d565b8452602084019350506020810190506141c5565b5050509392505050565b600082601f83011261420b5761420a6139c8565b5b813561421b84826020860161418d565b91505092915050565b6000806040838503121561423b5761423a613637565b5b600083013567ffffffffffffffff8111156142595761425861363c565b5b614265858286016141f6565b925050602083013567ffffffffffffffff8111156142865761428561363c565b5b61429285828601613ae2565b9150509250929050565b600080604083850312156142b3576142b2613637565b5b60006142c18582860161388d565b92505060206142d28582860161388d565b9150509250929050565b6000602082840312156142f2576142f1613637565b5b600061430084828501613f22565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061435057607f821691505b60208210810361436357614362614309565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143a3826137b7565b91506143ae836137b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e7576143e6614369565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442c826137b7565b9150614437836137b7565b925082614447576144466143f2565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614488602083613707565b915061449382614452565b602082019050919050565b600060208201905081810360008301526144b78161447b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261454f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614512565b6145598683614512565b95508019841693508086168417925050509392505050565b6000819050919050565b600061459661459161458c846137b7565b614571565b6137b7565b9050919050565b6000819050919050565b6145b08361457b565b6145c46145bc8261459d565b84845461451f565b825550505050565b600090565b6145d96145cc565b6145e48184846145a7565b505050565b5b81811015614608576145fd6000826145d1565b6001810190506145ea565b5050565b601f82111561464d5761461e816144ed565b61462784614502565b81016020851015614636578190505b61464a61464285614502565b8301826145e9565b50505b505050565b600082821c905092915050565b600061467060001984600802614652565b1980831691505092915050565b6000614689838361465f565b9150826002028217905092915050565b6146a2826136fc565b67ffffffffffffffff8111156146bb576146ba6139cd565b5b6146c58254614338565b6146d082828561460c565b600060209050601f83116001811461470357600084156146f1578287015190505b6146fb858261467d565b865550614763565b601f198416614711866144ed565b60005b8281101561473957848901518255600182019150602085019450602081019050614714565b868310156147565784890151614752601f89168261465f565b8355505b6001600288020188555050505b505050505050565b6000614776826137b7565b9150614781836137b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147b6576147b5614369565b5b828201905092915050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b60006147f7601183613707565b9150614802826147c1565b602082019050919050565b60006020820190508181036000830152614826816147ea565b9050919050565b7f457863656564206d61782077686974656c69737420737570706c790000000000600082015250565b6000614863601b83613707565b915061486e8261482d565b602082019050919050565b6000602082019050818103600083015261489281614856565b9050919050565b60006148a4826137b7565b91506148af836137b7565b9250828210156148c2576148c1614369565b5b828203905092915050565b7f53616c65206973206e6f74207374617274656400000000000000000000000000600082015250565b6000614903601383613707565b915061490e826148cd565b602082019050919050565b60006020820190508181036000830152614932816148f6565b9050919050565b7f204578636565642077616c6c6574206c696d6974000000000000000000000000600082015250565b600061496f601483613707565b915061497a82614939565b602082019050919050565b6000602082019050818103600083015261499e81614962565b9050919050565b7f496e73756666696369656e742066756e64000000000000000000000000000000600082015250565b60006149db601183613707565b91506149e6826149a5565b602082019050919050565b60006020820190508181036000830152614a0a816149ce565b9050919050565b600081905092915050565b60008154614a2981614338565b614a338186614a11565b94506001821660008114614a4e5760018114614a6357614a96565b60ff1983168652811515820286019350614a96565b614a6c856144ed565b60005b83811015614a8e57815481890152600182019150602081019050614a6f565b838801955050505b50505092915050565b6000614aaa826136fc565b614ab48185614a11565b9350614ac4818560208601613718565b80840191505092915050565b6000614adc8285614a1c565b9150614ae88284614a9f565b91508190509392505050565b6000614aff826137b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3157614b30614369565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b98602683613707565b9150614ba382614b3c565b604082019050919050565b60006020820190508181036000830152614bc781614b8b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614c04601d83613707565b9150614c0f82614bce565b602082019050919050565b60006020820190508181036000830152614c3381614bf7565b9050919050565b600081905092915050565b50565b6000614c55600083614c3a565b9150614c6082614c45565b600082019050919050565b6000614c7682614c48565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614cdc603a83613707565b9150614ce782614c80565b604082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d3982614d12565b614d438185614d1d565b9350614d53818560208601613718565b614d5c8161374b565b840191505092915050565b6000608082019050614d7c600083018761384c565b614d89602083018661384c565b614d9660408301856138e2565b8181036060830152614da88184614d2e565b905095945050505050565b600081519050614dc28161366d565b92915050565b600060208284031215614dde57614ddd613637565b5b6000614dec84828501614db3565b91505092915050565b6000614e00826137b7565b9150614e0b836137b7565b925082614e1b57614e1a6143f2565b5b82820690509291505056fea2646970667358221220344fb45b51767c6c8eb92fe93c1a349be806f82d5c185789fb545471ead5121664736f6c634300080f0033697066733a2f2f516d534a3551424e457364634c33737746704e446b6772594e4871394b694663774b3733355242447453396a75432f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80638462151c11610123578063a71bbebe116100ab578063d5abeb011161006f578063d5abeb0114610813578063e39465561461083e578063e985e9c514610867578063ef6b141a146108a4578063f2fde38b146108cd5761021a565b8063a71bbebe14610717578063b88d4fde14610733578063c23dc68f1461075c578063c87b56dd14610799578063d3738fc8146107d65761021a565b806399a2557a116100f257806399a2557a14610632578063a035b1fe1461066f578063a22cb4651461069a578063a4f4f8af146106c3578063a6ff3dd5146106ee5761021a565b80638462151c146105625780638a2650621461059f5780638da5cb5b146105dc57806395d89b41146106075761021a565b80633ccfd60b116101a65780636352211e116101755780636352211e1461047d5780636c0360eb146104ba57806370a08231146104e5578063715018a614610522578063750521f5146105395761021a565b80633ccfd60b146103d557806342842e0e146103ec5780635bbb2177146104155780635e84d723146104525761021a565b806318160ddd116101ed57806318160ddd146102ed5780631f2698ab1461031857806323b872dd146103435780632a55205a1461036c5780633c8463a1146103aa5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613699565b6108f6565b60405161025391906136e1565b60405180910390f35b34801561026857600080fd5b506102716109d8565b60405161027e9190613795565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906137ed565b610a6a565b6040516102bb919061385b565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906138a2565b610ae6565b005b3480156102f957600080fd5b50610302610bf0565b60405161030f91906138f1565b60405180910390f35b34801561032457600080fd5b5061032d610c07565b60405161033a91906136e1565b60405180910390f35b34801561034f57600080fd5b5061036a6004803603810190610365919061390c565b610c1a565b005b34801561037857600080fd5b50610393600480360381019061038e919061395f565b610c2a565b6040516103a192919061399f565b60405180910390f35b3480156103b657600080fd5b506103bf610e14565b6040516103cc91906138f1565b60405180910390f35b3480156103e157600080fd5b506103ea610e1a565b005b3480156103f857600080fd5b50610413600480360381019061040e919061390c565b610ec1565b005b34801561042157600080fd5b5061043c60048036038101906104379190613b10565b610ee1565b6040516104499190613c8b565b60405180910390f35b34801561045e57600080fd5b50610467610fa2565b60405161047491906138f1565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f91906137ed565b610fa8565b6040516104b1919061385b565b60405180910390f35b3480156104c657600080fd5b506104cf610fbe565b6040516104dc9190613795565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613cad565b61104c565b60405161051991906138f1565b60405180910390f35b34801561052e57600080fd5b5061053761111b565b005b34801561054557600080fd5b50610560600480360381019061055b9190613d8f565b6111a3565b005b34801561056e57600080fd5b5061058960048036038101906105849190613cad565b611232565b6040516105969190613e96565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613cad565b61142d565b6040516105d391906138f1565b60405180910390f35b3480156105e857600080fd5b506105f1611445565b6040516105fe919061385b565b60405180910390f35b34801561061357600080fd5b5061061c61146f565b6040516106299190613795565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190613eb8565b611501565b6040516106669190613e96565b60405180910390f35b34801561067b57600080fd5b506106846117c0565b60405161069191906138f1565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613f37565b6117c6565b005b3480156106cf57600080fd5b506106d861193d565b6040516106e591906138f1565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190613fb3565b611943565b005b610731600480360381019061072c9190613fb3565b611acf565b005b34801561073f57600080fd5b5061075a60048036038101906107559190614081565b611dca565b005b34801561076857600080fd5b50610783600480360381019061077e91906137ed565b611e46565b6040516107909190614146565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb91906137ed565b611f63565b6040516107cd9190613795565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613cad565b611fd6565b60405161080a91906138f1565b60405180910390f35b34801561081f57600080fd5b50610828611fee565b60405161083591906138f1565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190614224565b611ff4565b005b34801561087357600080fd5b5061088e6004803603810190610889919061429c565b612112565b60405161089b91906136e1565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906142dc565b6121a6565b005b3480156108d957600080fd5b506108f460048036038101906108ef9190613cad565b61223f565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c157507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d157506109d082612336565b5b9050919050565b6060600480546109e790614338565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1390614338565b8015610a605780601f10610a3557610100808354040283529160200191610a60565b820191906000526020600020905b815481529060010190602001808311610a4357829003601f168201915b5050505050905090565b6000610a7582612418565b610aab576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af182610fa8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b58576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b77612466565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ba95750610ba781610ba2612466565b612112565b155b15610be0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610beb83838361246e565b505050565b6000610bfa612520565b6003546002540303905090565b601060009054906101000a900460ff1681565b610c25838383612525565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610dbf5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610dc96129d9565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610df59190614398565b610dff9190614421565b90508160000151819350935050509250929050565b600d5481565b610e22612466565b73ffffffffffffffffffffffffffffffffffffffff16610e40611445565b73ffffffffffffffffffffffffffffffffffffffff1614610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061449e565b60405180910390fd5b610ebf473373ffffffffffffffffffffffffffffffffffffffff166129e390919063ffffffff16565b565b610edc83838360405180602001604052806000815250611dca565b505050565b606060008251905060008167ffffffffffffffff811115610f0557610f046139cd565b5b604051908082528060200260200182016040528015610f3e57816020015b610f2b6135ea565b815260200190600190039081610f235790505b50905060005b828114610f9757610f6e858281518110610f6157610f606144be565b5b6020026020010151611e46565b828281518110610f8157610f806144be565b5b6020026020010181905250806001019050610f44565b508092505050919050565b600e5481565b6000610fb382612ad7565b600001519050919050565b60118054610fcb90614338565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff790614338565b80156110445780601f1061101957610100808354040283529160200191611044565b820191906000526020600020905b81548152906001019060200180831161102757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110b3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611123612466565b73ffffffffffffffffffffffffffffffffffffffff16611141611445565b73ffffffffffffffffffffffffffffffffffffffff1614611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061449e565b60405180910390fd5b6111a16000612d66565b565b6111ab612466565b73ffffffffffffffffffffffffffffffffffffffff166111c9611445565b73ffffffffffffffffffffffffffffffffffffffff161461121f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112169061449e565b60405180910390fd5b806011908161122e9190614699565b5050565b606060008060006112428561104c565b905060008167ffffffffffffffff8111156112605761125f6139cd565b5b60405190808252806020026020018201604052801561128e5781602001602082028036833780820191505090505b5090506112996135ea565b60006112a3612520565b90505b83861461141f57600660008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015161141457600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146113b957816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114135780838780600101985081518110611406576114056144be565b5b6020026020010181815250505b5b8060010190506112a6565b508195505050505050919050565b60146020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461147e90614338565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90614338565b80156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b5050505050905090565b606081831061153c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600254905061154c612520565b85101561155e5761155b612520565b94505b8084111561156a578093505b60006115758761104c565b905084861015611598576000868603905081811015611592578091505b5061159d565b600090505b60008167ffffffffffffffff8111156115b9576115b86139cd565b5b6040519080825280602002602001820160405280156115e75781602001602082028036833780820191505090505b509050600082036115fe57809450505050506117b9565b600061160988611e46565b90506000816040015161161e57816000015190505b60008990505b8881141580156116345750848714155b156117ab57600660008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050925082604001516117a057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461174557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361179f5780848880600101995081518110611792576117916144be565b5b6020026020010181815250505b5b806001019050611624565b508583528296505050505050505b9392505050565b600b5481565b6117ce612466565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611832576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009600061183f612466565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ec612466565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161193191906136e1565b60405180910390a35050565b600f5481565b600c548163ffffffff16611955610bf0565b61195f919061476b565b11156119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979061480d565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548163ffffffff161115611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90614879565b60405180910390fd5b8063ffffffff16601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a799190614899565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611acc338263ffffffff16612e2c565b50565b601060009054906101000a900460ff16611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614919565b60405180910390fd5b600c54611b29610bf0565b8263ffffffff16611b3a919061476b565b1115611b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b729061480d565b60405180910390fd5b600e54600f548263ffffffff16611b92919061476b565b1115611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca9061480d565b60405180910390fd5b8063ffffffff16600f54611be7919061476b565b600f81905550600d54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548263ffffffff16611c41919061476b565b1115611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990614985565b60405180910390fd5b8063ffffffff16601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cd3919061476b565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b548163ffffffff16611d2a9190614398565b341015611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906149f1565b60405180910390fd5b611db747601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129e390919063ffffffff16565b611dc7338263ffffffff16612e2c565b50565b611dd5848484612525565b611df48373ffffffffffffffffffffffffffffffffffffffff16612e4a565b8015611e095750611e0784848484612e6d565b155b15611e40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611e4e6135ea565b611e566135ea565b611e5e612520565b831080611e6d57506002548310155b15611e7b5780915050611f5e565b600660008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611f515780915050611f5e565b611f5a83612ad7565b9150505b919050565b6060611f6e82612418565b611fa4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011611faf83612fbd565b604051602001611fc0929190614ad0565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090505481565b600c5481565b611ffc612466565b73ffffffffffffffffffffffffffffffffffffffff1661201a611445565b73ffffffffffffffffffffffffffffffffffffffff1614612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120679061449e565b60405180910390fd5b60008251905060005b8181101561210c57828181518110612094576120936144be565b5b6020026020010151601460008684815181106120b3576120b26144be565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061210490614af4565b915050612079565b50505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ae612466565b73ffffffffffffffffffffffffffffffffffffffff166121cc611445565b73ffffffffffffffffffffffffffffffffffffffff1614612222576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122199061449e565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b612247612466565b73ffffffffffffffffffffffffffffffffffffffff16612265611445565b73ffffffffffffffffffffffffffffffffffffffff16146122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b29061449e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232190614bae565b60405180910390fd5b61233381612d66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061241157506124108261311d565b5b9050919050565b600081612423612520565b11158015612432575060025482105b801561245f575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061253082612ad7565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125bc612466565b73ffffffffffffffffffffffffffffffffffffffff1614806125eb57506125ea856125e5612466565b612112565b5b8061263057506125f9612466565b73ffffffffffffffffffffffffffffffffffffffff1661261884610a6a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612669576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126cf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126dc8585856001613197565b6126e86000848761246e565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361296757600254821461296657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129d2858585600161319d565b5050505050565b6000612710905090565b80471015612a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1d90614c1a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612a4c90614c6b565b60006040518083038185875af1925050503d8060008114612a89576040519150601f19603f3d011682016040523d82523d6000602084013e612a8e565b606091505b5050905080612ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac990614cf2565b60405180910390fd5b505050565b612adf6135ea565b600082905080612aed612520565b11158015612afc575060025481105b15612d2f576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c11578092505050612d61565b5b600115612d2c57818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d27578092505050612d61565b612c12565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e468282604051806020016040528060008152506131a3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e93612466565b8786866040518563ffffffff1660e01b8152600401612eb59493929190614d67565b6020604051808303816000875af1925050508015612ef157506040513d601f19601f82011682018060405250810190612eee9190614dc8565b60015b612f6a573d8060008114612f21576040519150601f19603f3d011682016040523d82523d6000602084013e612f26565b606091505b506000815103612f62576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613004576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613118565b600082905060005b6000821461303657808061301f90614af4565b915050600a8261302f9190614421565b915061300c565b60008167ffffffffffffffff811115613052576130516139cd565b5b6040519080825280601f01601f1916602001820160405280156130845781602001600182028036833780820191505090505b5090505b600085146131115760018261309d9190614899565b9150600a856130ac9190614df5565b60306130b8919061476b565b60f81b8183815181106130ce576130cd6144be565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561310a9190614421565b9450613088565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613190575061318f826131b5565b5b9050919050565b50505050565b50505050565b6131b0838383600161321f565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361328c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036132c6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132d36000868387613197565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561349d575061349c8773ffffffffffffffffffffffffffffffffffffffff16612e4a565b5b15613562575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135126000888480600101955088612e6d565b613548576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134a357826002541461355d57600080fd5b6135cd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613563575b8160028190555050506135e3600086838761319d565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61367681613641565b811461368157600080fd5b50565b6000813590506136938161366d565b92915050565b6000602082840312156136af576136ae613637565b5b60006136bd84828501613684565b91505092915050565b60008115159050919050565b6136db816136c6565b82525050565b60006020820190506136f660008301846136d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561373657808201518184015260208101905061371b565b83811115613745576000848401525b50505050565b6000601f19601f8301169050919050565b6000613767826136fc565b6137718185613707565b9350613781818560208601613718565b61378a8161374b565b840191505092915050565b600060208201905081810360008301526137af818461375c565b905092915050565b6000819050919050565b6137ca816137b7565b81146137d557600080fd5b50565b6000813590506137e7816137c1565b92915050565b60006020828403121561380357613802613637565b5b6000613811848285016137d8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138458261381a565b9050919050565b6138558161383a565b82525050565b6000602082019050613870600083018461384c565b92915050565b61387f8161383a565b811461388a57600080fd5b50565b60008135905061389c81613876565b92915050565b600080604083850312156138b9576138b8613637565b5b60006138c78582860161388d565b92505060206138d8858286016137d8565b9150509250929050565b6138eb816137b7565b82525050565b600060208201905061390660008301846138e2565b92915050565b60008060006060848603121561392557613924613637565b5b60006139338682870161388d565b93505060206139448682870161388d565b9250506040613955868287016137d8565b9150509250925092565b6000806040838503121561397657613975613637565b5b6000613984858286016137d8565b9250506020613995858286016137d8565b9150509250929050565b60006040820190506139b4600083018561384c565b6139c160208301846138e2565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a058261374b565b810181811067ffffffffffffffff82111715613a2457613a236139cd565b5b80604052505050565b6000613a3761362d565b9050613a4382826139fc565b919050565b600067ffffffffffffffff821115613a6357613a626139cd565b5b602082029050602081019050919050565b600080fd5b6000613a8c613a8784613a48565b613a2d565b90508083825260208201905060208402830185811115613aaf57613aae613a74565b5b835b81811015613ad85780613ac488826137d8565b845260208401935050602081019050613ab1565b5050509392505050565b600082601f830112613af757613af66139c8565b5b8135613b07848260208601613a79565b91505092915050565b600060208284031215613b2657613b25613637565b5b600082013567ffffffffffffffff811115613b4457613b4361363c565b5b613b5084828501613ae2565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b8e8161383a565b82525050565b600067ffffffffffffffff82169050919050565b613bb181613b94565b82525050565b613bc0816136c6565b82525050565b606082016000820151613bdc6000850182613b85565b506020820151613bef6020850182613ba8565b506040820151613c026040850182613bb7565b50505050565b6000613c148383613bc6565b60608301905092915050565b6000602082019050919050565b6000613c3882613b59565b613c428185613b64565b9350613c4d83613b75565b8060005b83811015613c7e578151613c658882613c08565b9750613c7083613c20565b925050600181019050613c51565b5085935050505092915050565b60006020820190508181036000830152613ca58184613c2d565b905092915050565b600060208284031215613cc357613cc2613637565b5b6000613cd18482850161388d565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cfa57613cf96139cd565b5b613d038261374b565b9050602081019050919050565b82818337600083830152505050565b6000613d32613d2d84613cdf565b613a2d565b905082815260208101848484011115613d4e57613d4d613cda565b5b613d59848285613d10565b509392505050565b600082601f830112613d7657613d756139c8565b5b8135613d86848260208601613d1f565b91505092915050565b600060208284031215613da557613da4613637565b5b600082013567ffffffffffffffff811115613dc357613dc261363c565b5b613dcf84828501613d61565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e0d816137b7565b82525050565b6000613e1f8383613e04565b60208301905092915050565b6000602082019050919050565b6000613e4382613dd8565b613e4d8185613de3565b9350613e5883613df4565b8060005b83811015613e89578151613e708882613e13565b9750613e7b83613e2b565b925050600181019050613e5c565b5085935050505092915050565b60006020820190508181036000830152613eb08184613e38565b905092915050565b600080600060608486031215613ed157613ed0613637565b5b6000613edf8682870161388d565b9350506020613ef0868287016137d8565b9250506040613f01868287016137d8565b9150509250925092565b613f14816136c6565b8114613f1f57600080fd5b50565b600081359050613f3181613f0b565b92915050565b60008060408385031215613f4e57613f4d613637565b5b6000613f5c8582860161388d565b9250506020613f6d85828601613f22565b9150509250929050565b600063ffffffff82169050919050565b613f9081613f77565b8114613f9b57600080fd5b50565b600081359050613fad81613f87565b92915050565b600060208284031215613fc957613fc8613637565b5b6000613fd784828501613f9e565b91505092915050565b600067ffffffffffffffff821115613ffb57613ffa6139cd565b5b6140048261374b565b9050602081019050919050565b600061402461401f84613fe0565b613a2d565b9050828152602081018484840111156140405761403f613cda565b5b61404b848285613d10565b509392505050565b600082601f830112614068576140676139c8565b5b8135614078848260208601614011565b91505092915050565b6000806000806080858703121561409b5761409a613637565b5b60006140a98782880161388d565b94505060206140ba8782880161388d565b93505060406140cb878288016137d8565b925050606085013567ffffffffffffffff8111156140ec576140eb61363c565b5b6140f887828801614053565b91505092959194509250565b60608201600082015161411a6000850182613b85565b50602082015161412d6020850182613ba8565b5060408201516141406040850182613bb7565b50505050565b600060608201905061415b6000830184614104565b92915050565b600067ffffffffffffffff82111561417c5761417b6139cd565b5b602082029050602081019050919050565b60006141a061419b84614161565b613a2d565b905080838252602082019050602084028301858111156141c3576141c2613a74565b5b835b818110156141ec57806141d8888261388d565b8452602084019350506020810190506141c5565b5050509392505050565b600082601f83011261420b5761420a6139c8565b5b813561421b84826020860161418d565b91505092915050565b6000806040838503121561423b5761423a613637565b5b600083013567ffffffffffffffff8111156142595761425861363c565b5b614265858286016141f6565b925050602083013567ffffffffffffffff8111156142865761428561363c565b5b61429285828601613ae2565b9150509250929050565b600080604083850312156142b3576142b2613637565b5b60006142c18582860161388d565b92505060206142d28582860161388d565b9150509250929050565b6000602082840312156142f2576142f1613637565b5b600061430084828501613f22565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061435057607f821691505b60208210810361436357614362614309565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143a3826137b7565b91506143ae836137b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e7576143e6614369565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442c826137b7565b9150614437836137b7565b925082614447576144466143f2565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614488602083613707565b915061449382614452565b602082019050919050565b600060208201905081810360008301526144b78161447b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261454f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614512565b6145598683614512565b95508019841693508086168417925050509392505050565b6000819050919050565b600061459661459161458c846137b7565b614571565b6137b7565b9050919050565b6000819050919050565b6145b08361457b565b6145c46145bc8261459d565b84845461451f565b825550505050565b600090565b6145d96145cc565b6145e48184846145a7565b505050565b5b81811015614608576145fd6000826145d1565b6001810190506145ea565b5050565b601f82111561464d5761461e816144ed565b61462784614502565b81016020851015614636578190505b61464a61464285614502565b8301826145e9565b50505b505050565b600082821c905092915050565b600061467060001984600802614652565b1980831691505092915050565b6000614689838361465f565b9150826002028217905092915050565b6146a2826136fc565b67ffffffffffffffff8111156146bb576146ba6139cd565b5b6146c58254614338565b6146d082828561460c565b600060209050601f83116001811461470357600084156146f1578287015190505b6146fb858261467d565b865550614763565b601f198416614711866144ed565b60005b8281101561473957848901518255600182019150602085019450602081019050614714565b868310156147565784890151614752601f89168261465f565b8355505b6001600288020188555050505b505050505050565b6000614776826137b7565b9150614781836137b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147b6576147b5614369565b5b828201905092915050565b7f457863656564206d617820737570706c79000000000000000000000000000000600082015250565b60006147f7601183613707565b9150614802826147c1565b602082019050919050565b60006020820190508181036000830152614826816147ea565b9050919050565b7f457863656564206d61782077686974656c69737420737570706c790000000000600082015250565b6000614863601b83613707565b915061486e8261482d565b602082019050919050565b6000602082019050818103600083015261489281614856565b9050919050565b60006148a4826137b7565b91506148af836137b7565b9250828210156148c2576148c1614369565b5b828203905092915050565b7f53616c65206973206e6f74207374617274656400000000000000000000000000600082015250565b6000614903601383613707565b915061490e826148cd565b602082019050919050565b60006020820190508181036000830152614932816148f6565b9050919050565b7f204578636565642077616c6c6574206c696d6974000000000000000000000000600082015250565b600061496f601483613707565b915061497a82614939565b602082019050919050565b6000602082019050818103600083015261499e81614962565b9050919050565b7f496e73756666696369656e742066756e64000000000000000000000000000000600082015250565b60006149db601183613707565b91506149e6826149a5565b602082019050919050565b60006020820190508181036000830152614a0a816149ce565b9050919050565b600081905092915050565b60008154614a2981614338565b614a338186614a11565b94506001821660008114614a4e5760018114614a6357614a96565b60ff1983168652811515820286019350614a96565b614a6c856144ed565b60005b83811015614a8e57815481890152600182019150602081019050614a6f565b838801955050505b50505092915050565b6000614aaa826136fc565b614ab48185614a11565b9350614ac4818560208601613718565b80840191505092915050565b6000614adc8285614a1c565b9150614ae88284614a9f565b91508190509392505050565b6000614aff826137b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3157614b30614369565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b98602683613707565b9150614ba382614b3c565b604082019050919050565b60006020820190508181036000830152614bc781614b8b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614c04601d83613707565b9150614c0f82614bce565b602082019050919050565b60006020820190508181036000830152614c3381614bf7565b9050919050565b600081905092915050565b50565b6000614c55600083614c3a565b9150614c6082614c45565b600082019050919050565b6000614c7682614c48565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614cdc603a83613707565b9150614ce782614c80565b604082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614d3982614d12565b614d438185614d1d565b9350614d53818560208601613718565b614d5c8161374b565b840191505092915050565b6000608082019050614d7c600083018761384c565b614d89602083018661384c565b614d9660408301856138e2565b8181036060830152614da88184614d2e565b905095945050505050565b600081519050614dc28161366d565b92915050565b600060208284031215614dde57614ddd613637565b5b6000614dec84828501614db3565b91505092915050565b6000614e00826137b7565b9150614e0b836137b7565b925082614e1b57614e1a6143f2565b5b82820690509291505056fea2646970667358221220344fb45b51767c6c8eb92fe93c1a349be806f82d5c185789fb545471ead5121664736f6c634300080f0033

Deployed Bytecode Sourcemap

196:3055:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2285:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7632:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9232:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8795:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3686:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;534:27:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10220:170:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1750:507:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;413:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2843:110;;;;;;;;;;;;;:::i;:::-;;10461:185:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1517:523:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;453:34:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7440:125:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;568:89:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4856:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1739:103:11;;;;;;;;;;;;;:::i;:::-;;2741:94:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5443:980:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;798:50:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1088:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7801:104:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2430:2564:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;334:34:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9549:319:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;494:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1604:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;916:680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10717:406:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;917:441:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2961:287:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;744:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;375:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1980:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9939:214:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2642:91:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1997:238:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:349:12;2433:4;2490:26;2475:41;;;:11;:41;;;;:98;;;;2548:25;2533:40;;;:11;:40;;;;2475:98;:151;;;;2590:36;2614:11;2590:23;:36::i;:::-;2475:151;2455:171;;2285:349;;;:::o;7632:100:4:-;7686:13;7719:5;7712:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:100;:::o;9232:245::-;9336:7;9366:16;9374:7;9366;:16::i;:::-;9361:64;;9391:34;;;;;;;;;;;;;;9361:64;9445:15;:24;9461:7;9445:24;;;;;;;;;;;;;;;;;;;;;9438:31;;9232:245;;;:::o;8795:371::-;8868:13;8884:24;8900:7;8884:15;:24::i;:::-;8868:40;;8929:5;8923:11;;:2;:11;;;8919:48;;8943:24;;;;;;;;;;;;;;8919:48;9000:5;8984:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9010:37;9027:5;9034:12;:10;:12::i;:::-;9010:16;:37::i;:::-;9009:38;8984:63;8980:138;;;9071:35;;;;;;;;;;;;;;8980:138;9130:28;9139:2;9143:7;9152:5;9130:8;:28::i;:::-;8857:309;8795:371;;:::o;3686:303::-;3730:7;3955:15;:13;:15::i;:::-;3940:12;;3924:13;;:28;:46;3917:53;;3686:303;:::o;534:27:12:-;;;;;;;;;;;;;:::o;10220:170:4:-;10354:28;10364:4;10370:2;10374:7;10354:9;:28::i;:::-;10220:170;;;:::o;1750:507:3:-;1894:7;1903;1928:26;1957:17;:27;1975:8;1957:27;;;;;;;;;;;1928:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2029:1;2001:30;;:7;:16;;;:30;;;1997:92;;2058:19;2048:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1997:92;2101:21;2179:17;:15;:17::i;:::-;2125:71;;2139:7;:23;;;2126:36;;:10;:36;;;;:::i;:::-;2125:71;;;;:::i;:::-;2101:95;;2217:7;:16;;;2235:13;2209:40;;;;;;1750:507;;;;;:::o;413:31:12:-;;;;:::o;2843:110::-;1319:12:11;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2893:52:12::1;2923:21;2901:10;2893:29;;;;:52;;;;:::i;:::-;2843:110::o:0;10461:185:4:-;10599:39;10616:4;10622:2;10626:7;10599:39;;;;;;;;;;;;:16;:39::i;:::-;10461:185;;;:::o;1517:523:5:-;1624:23;1690:22;1715:8;:15;1690:40;;1745:34;1821:14;1782:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1745:105;;1870:9;1865:125;1886:14;1881:1;:19;1865:125;;1942:32;1962:8;1971:1;1962:11;;;;;;;;:::i;:::-;;;;;;;;1942:19;:32::i;:::-;1926:10;1937:1;1926:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1902:3;;;;;1865:125;;;;2011:10;2004:17;;;;1517:523;;;:::o;453:34:12:-;;;;:::o;7440:125:4:-;7504:7;7531:21;7544:7;7531:12;:21::i;:::-;:26;;;7524:33;;7440:125;;;:::o;568:89:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4856:206:4:-;4920:7;4961:1;4944:19;;:5;:19;;;4940:60;;4972:28;;;;;;;;;;;;;;4940:60;5026:12;:19;5039:5;5026:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5018:36;;5011:43;;4856:206;;;:::o;1739:103:11:-;1319:12;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1804:30:::1;1831:1;1804:18;:30::i;:::-;1739:103::o:0;2741:94:12:-;1319:12:11;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2824:3:12::1;2814:7;:13;;;;;;:::i;:::-;;2741:94:::0;:::o;5443:980:5:-;5531:16;5590:19;5624:25;5664:22;5689:16;5699:5;5689:9;:16::i;:::-;5664:41;;5720:25;5762:14;5748:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5720:57;;5792:31;;:::i;:::-;5861:9;5873:15;:13;:15::i;:::-;5861:27;;5838:537;5922:14;5907:11;:29;5838:537;;6005:11;:14;6017:1;6005:14;;;;;;;;;;;5993:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6042:9;:16;;;6083:8;6038:73;6159:1;6133:28;;:9;:14;;;:28;;;6129:111;;6206:9;:14;;;6186:34;;6129:111;6283:5;6262:26;;:17;:26;;;6258:102;;6339:1;6313:8;6322:13;;;;;;6313:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6258:102;5838:537;5955:3;;;;;5838:537;;;;6396:8;6389:15;;;;;;;5443:980;;;:::o;798:50:12:-;;;;;;;;;;;;;;;;;:::o;1088:87:11:-;1134:7;1161:6;;;;;;;;;;;1154:13;;1088:87;:::o;7801:104:4:-;7857:13;7890:7;7883:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7801:104;:::o;2430:2564:5:-;2556:16;2623:4;2614:5;:13;2610:45;;2636:19;;;;;;;;;;;;;;2610:45;2670:19;2704:17;2724:13;;2704:33;;2823:15;:13;:15::i;:::-;2815:5;:23;2811:87;;;2867:15;:13;:15::i;:::-;2859:23;;2811:87;2978:9;2971:4;:16;2967:73;;;3015:9;3008:16;;2967:73;3054:25;3082:16;3092:5;3082:9;:16::i;:::-;3054:44;;3276:4;3268:5;:12;3264:278;;;3301:19;3330:5;3323:4;:12;3301:34;;3372:17;3358:11;:31;3354:111;;;3434:11;3414:31;;3354:111;3282:198;3264:278;;;3525:1;3505:21;;3264:278;3556:25;3598:17;3584:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3556:60;;3656:1;3635:17;:22;3631:78;;3685:8;3678:15;;;;;;;;3631:78;3853:31;3887:26;3907:5;3887:19;:26::i;:::-;3853:60;;3928:25;4173:9;:16;;;4168:92;;4230:9;:14;;;4210:34;;4168:92;4297:9;4309:5;4297:17;;4274:543;4338:4;4333:1;:9;;:45;;;;;4361:17;4346:11;:32;;4333:45;4274:543;;;4447:11;:14;4459:1;4447:14;;;;;;;;;;;4435:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4484:9;:16;;;4525:8;4480:73;4601:1;4575:28;;:9;:14;;;:28;;;4571:111;;4648:9;:14;;;4628:34;;4571:111;4725:5;4704:26;;:17;:26;;;4700:102;;4781:1;4755:8;4764:13;;;;;;4755:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4700:102;4274:543;4397:3;;;;;4274:543;;;;4919:11;4909:8;4902:29;4967:8;4960:15;;;;;;;;2430:2564;;;;;;:::o;334:34:12:-;;;;:::o;9549:319:4:-;9692:12;:10;:12::i;:::-;9680:24;;:8;:24;;;9676:54;;9713:17;;;;;;;;;;;;;;9676:54;9788:8;9743:18;:32;9762:12;:10;:12::i;:::-;9743:32;;;;;;;;;;;;;;;:42;9776:8;9743:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;9841:8;9812:48;;9827:12;:10;:12::i;:::-;9812:48;;;9851:8;9812:48;;;;;;:::i;:::-;;;;;;;;9549:319;;:::o;494:31:12:-;;;;:::o;1604:368::-;1691:9;;1681:6;1665:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;1657:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1765:15;:27;1781:10;1765:27;;;;;;;;;;;;;;;;1755:6;:37;;;;1733:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1918:6;1888:36;;:15;:27;1904:10;1888:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;1858:15;:27;1874:10;1858:27;;;;;;;;;;;;;;;:66;;;;1935:29;1945:10;1957:6;1935:29;;:9;:29::i;:::-;1604:368;:::o;916:680::-;981:7;;;;;;;;;;;973:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;1057:9;;1040:13;:11;:13::i;:::-;1031:6;:22;;;;;;:::i;:::-;:35;;1023:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1132:12;;1116;;1107:6;:21;;;;;;:::i;:::-;:37;;1099:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1207:6;1192:21;;:12;;:21;;;;:::i;:::-;1177:12;:36;;;;1285:11;;1257:12;:24;1270:10;1257:24;;;;;;;;;;;;;;;;1248:6;:33;;;;;;:::i;:::-;:48;;1226:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;1409:6;1382:33;;:12;:24;1395:10;1382:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;1355:12;:24;1368:10;1355:24;;;;;;;;;;;;;;;:60;;;;1458:5;;1449:6;:14;;;;;;:::i;:::-;1436:9;:27;;1428:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1496:52;1526:21;1504:10;;;;;;;;;;;1496:29;;;;:52;;;;:::i;:::-;1559:29;1569:10;1581:6;1559:29;;:9;:29::i;:::-;916:680;:::o;10717:406:4:-;10884:28;10894:4;10900:2;10904:7;10884:9;:28::i;:::-;10941:15;:2;:13;;;:15::i;:::-;:89;;;;;10974:56;11005:4;11011:2;11015:7;11024:5;10974:30;:56::i;:::-;10973:57;10941:89;10923:193;;;11064:40;;;;;;;;;;;;;;10923:193;10717:406;;;;:::o;917:441:5:-;1011:21;;:::i;:::-;1050:31;;:::i;:::-;1106:15;:13;:15::i;:::-;1096:7;:25;:53;;;;1136:13;;1125:7;:24;;1096:53;1092:102;;;1173:9;1166:16;;;;;1092:102;1216:11;:20;1228:7;1216:20;;;;;;;;;;;1204:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1251:9;:16;;;1247:65;;;1291:9;1284:16;;;;;1247:65;1329:21;1342:7;1329:12;:21::i;:::-;1322:28;;;917:441;;;;:::o;2961:287:12:-;3079:13;3115:16;3123:7;3115;:16::i;:::-;3110:59;;3140:29;;;;;;;;;;;;;;3110:59;3211:7;3220:18;:7;:16;:18::i;:::-;3194:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3180:60;;2961:287;;;:::o;744:47::-;;;;;;;;;;;;;;;;;:::o;375:31::-;;;;:::o;1980:297::-;1319:12:11;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2118:11:12::1;2132:10;:17;2118:31;;2165:9;2160:110;2184:3;2180:1;:7;2160:110;;;2242:13;2256:1;2242:16;;;;;;;;:::i;:::-;;;;;;;;2209:15;:30;2225:10;2236:1;2225:13;;;;;;;;:::i;:::-;;;;;;;;2209:30;;;;;;;;;;;;;;;:49;;;;2189:3;;;;;:::i;:::-;;;;2160:110;;;;2107:170;1980:297:::0;;:::o;9939:214:4:-;10081:4;10110:18;:25;10129:5;10110:25;;;;;;;;;;;;;;;:35;10136:8;10110:35;;;;;;;;;;;;;;;;;;;;;;;;;10103:42;;9939:214;;;;:::o;2642:91:12:-;1319:12:11;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2717:8:12::1;2707:7;;:18;;;;;;;;;;;;;;;;;;2642:91:::0;:::o;1997:238:11:-;1319:12;:10;:12::i;:::-;1308:23;;:7;:5;:7::i;:::-;:23;;;1300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2120:1:::1;2100:22;;:8;:22;;::::0;2078:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2199:28;2218:8;2199:18;:28::i;:::-;1997:238:::0;:::o;4437:355:4:-;4584:4;4641:25;4626:40;;;:11;:40;;;;:105;;;;4698:33;4683:48;;;:11;:48;;;;4626:105;:158;;;;4748:36;4772:11;4748:23;:36::i;:::-;4626:158;4606:178;;4437:355;;;:::o;11378:213::-;11435:4;11491:7;11472:15;:13;:15::i;:::-;:26;;:66;;;;;11525:13;;11515:7;:23;11472:66;:111;;;;;11556:11;:20;11568:7;11556:20;;;;;;;;;;;:27;;;;;;;;;;;;11555:28;11472:111;11452:131;;11378:213;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;19765:196:4:-;19907:2;19880:15;:24;19896:7;19880:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19945:7;19941:2;19925:28;;19934:5;19925:28;;;;;;;;;;;;19765:196;;;:::o;3460:92::-;3516:7;3460:92;:::o;14708:2130::-;14823:35;14861:21;14874:7;14861:12;:21::i;:::-;14823:59;;14921:4;14899:26;;:13;:18;;;:26;;;14895:67;;14934:28;;;;;;;;;;;;;;14895:67;14975:22;15017:4;15001:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;15038:36;15055:4;15061:12;:10;:12::i;:::-;15038:16;:36::i;:::-;15001:73;:126;;;;15115:12;:10;:12::i;:::-;15091:36;;:20;15103:7;15091:11;:20::i;:::-;:36;;;15001:126;14975:153;;15146:17;15141:66;;15172:35;;;;;;;;;;;;;;15141:66;15236:1;15222:16;;:2;:16;;;15218:52;;15247:23;;;;;;;;;;;;;;15218:52;15283:43;15305:4;15311:2;15315:7;15324:1;15283:21;:43::i;:::-;15391:35;15408:1;15412:7;15421:4;15391:8;:35::i;:::-;15752:1;15722:12;:18;15735:4;15722:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15796:1;15768:12;:16;15781:2;15768:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15814:31;15848:11;:20;15860:7;15848:20;;;;;;;;;;;15814:54;;15899:2;15883:8;:13;;;:18;;;;;;;;;;;;;;;;;;15949:15;15916:8;:23;;;:49;;;;;;;;;;;;;;;;;;16217:19;16249:1;16239:7;:11;16217:33;;16265:31;16299:11;:24;16311:11;16299:24;;;;;;;;;;;16265:58;;16367:1;16342:27;;:8;:13;;;;;;;;;;;;:27;;;16338:384;;16552:13;;16537:11;:28;16533:174;;16606:4;16590:8;:13;;;:20;;;;;;;;;;;;;;;;;;16659:13;:28;;;16633:8;:23;;;:54;;;;;;;;;;;;;;;;;;16533:174;16338:384;15697:1036;;;16769:7;16765:2;16750:27;;16759:4;16750:27;;;;;;;;;;;;16788:42;16809:4;16815:2;16819:7;16828:1;16788:20;:42::i;:::-;14812:2026;;14708:2130;;;:::o;2539:97:3:-;2597:6;2623:5;2616:12;;2539:97;:::o;2471:391:0:-;2600:6;2575:21;:31;;2553:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2677:12;2695:9;:14;;2717:6;2695:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2676:52;;;2761:7;2739:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;2542:320;2471:391;;:::o;6237:1141:4:-;6326:21;;:::i;:::-;6365:12;6380:7;6365:22;;6448:4;6429:15;:13;:15::i;:::-;:23;;:47;;;;;6463:13;;6456:4;:20;6429:47;6425:886;;;6497:31;6531:11;:17;6543:4;6531:17;;;;;;;;;;;6497:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6572:9;:16;;;6567:729;;6643:1;6617:28;;:9;:14;;;:28;;;6613:101;;6681:9;6674:16;;;;;;6613:101;7016:261;7023:4;7016:261;;;7056:6;;;;;;;;7101:11;:17;7113:4;7101:17;;;;;;;;;;;7089:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7175:1;7149:28;;:9;:14;;;:28;;;7145:109;;7217:9;7210:16;;;;;;7145:109;7016:261;;;6567:729;6478:833;6425:886;7339:31;;;;;;;;;;;;;;6237:1141;;;;:::o;2395:191:11:-;2469:16;2488:6;;;;;;;;;;;2469:25;;2514:8;2505:6;;:17;;;;;;;;;;;;;;;;;;2569:8;2538:40;;2559:8;2538:40;;;;;;;;;;;;2458:128;2395:191;:::o;11599:104:4:-;11668:27;11678:2;11682:8;11668:27;;;;;;;;;;;;:9;:27::i;:::-;11599:104;;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;20453:772:4:-;20616:4;20666:2;20650:36;;;20705:12;:10;:12::i;:::-;20736:4;20759:7;20785:5;20650:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20633:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20993:1;20976:6;:13;:18;20972:235;;21022:40;;;;;;;;;;;;;;20972:235;21165:6;21159:13;21150:6;21146:2;21142:15;21135:38;20633:585;20871:45;;;20861:55;;;:6;:55;;;;20854:62;;;20453:772;;;;;;:::o;342:723:13:-;398:13;628:1;619:5;:10;615:53;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;1404:291:3:-;1551:4;1608:26;1593:41;;;:11;:41;;;;:94;;;;1651:36;1675:11;1651:23;:36::i;:::-;1593:94;1573:114;;1404:291;;;:::o;21873:159:4:-;;;;;:::o;22691:158::-;;;;;:::o;12066:163::-;12189:32;12195:2;12199:8;12209:5;12216:4;12189:5;:32::i;:::-;12066:163;;;:::o;854:207:2:-;984:4;1028:25;1013:40;;;:11;:40;;;;1006:47;;854:207;;;:::o;12488:1966:4:-;12627:20;12650:13;;12627:36;;12692:1;12678:16;;:2;:16;;;12674:48;;12703:19;;;;;;;;;;;;;;12674:48;12749:1;12737:8;:13;12733:44;;12759:18;;;;;;;;;;;;;;12733:44;12790:61;12820:1;12824:2;12828:12;12842:8;12790:21;:61::i;:::-;13163:8;13128:12;:16;13141:2;13128:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13227:8;13187:12;:16;13200:2;13187:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13286:2;13253:11;:25;13265:12;13253:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13353:15;13303:11;:25;13315:12;13303:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13386:20;13409:12;13386:35;;13436:11;13465:8;13450:12;:23;13436:37;;13494:4;:23;;;;;13502:15;:2;:13;;;:15::i;:::-;13494:23;13490:832;;;13538:505;13594:12;13590:2;13569:38;;13586:1;13569:38;;;;;;;;;;;;13661:212;13730:1;13763:2;13796:14;;;;;;13841:5;13661:30;:212::i;:::-;13630:365;;13931:40;;;;;;;;;;;;;;13630:365;14038:3;14022:12;:19;13538:505;;14124:12;14107:13;;:29;14103:43;;14138:8;;;14103:43;13490:832;;;14187:120;14243:14;;;;;;14239:2;14218:40;;14235:1;14218:40;;;;;;;;;;;;14302:3;14286:12;:19;14187:120;;13490:832;14352:12;14336:13;:28;;;;13103:1273;;14386:60;14415:1;14419:2;14423:12;14437:8;14386:20;:60::i;:::-;12616:1838;12488:1966;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::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:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:332::-;6516:4;6554:2;6543:9;6539:18;6531:26;;6567:71;6635:1;6624:9;6620:17;6611:6;6567:71;:::i;:::-;6648:72;6716:2;6705:9;6701:18;6692:6;6648:72;:::i;:::-;6395:332;;;;;:::o;6733:117::-;6842:1;6839;6832:12;6856:180;6904:77;6901:1;6894:88;7001:4;6998:1;6991:15;7025:4;7022:1;7015:15;7042:281;7125:27;7147:4;7125:27;:::i;:::-;7117:6;7113:40;7255:6;7243:10;7240:22;7219:18;7207:10;7204:34;7201:62;7198:88;;;7266:18;;:::i;:::-;7198:88;7306:10;7302:2;7295:22;7085:238;7042:281;;:::o;7329:129::-;7363:6;7390:20;;:::i;:::-;7380:30;;7419:33;7447:4;7439:6;7419:33;:::i;:::-;7329:129;;;:::o;7464:311::-;7541:4;7631:18;7623:6;7620:30;7617:56;;;7653:18;;:::i;:::-;7617:56;7703:4;7695:6;7691:17;7683:25;;7763:4;7757;7753:15;7745:23;;7464:311;;;:::o;7781:117::-;7890:1;7887;7880:12;7921:710;8017:5;8042:81;8058:64;8115:6;8058:64;:::i;:::-;8042:81;:::i;:::-;8033:90;;8143:5;8172:6;8165:5;8158:21;8206:4;8199:5;8195:16;8188:23;;8259:4;8251:6;8247:17;8239:6;8235:30;8288:3;8280:6;8277:15;8274:122;;;8307:79;;:::i;:::-;8274:122;8422:6;8405:220;8439:6;8434:3;8431:15;8405:220;;;8514:3;8543:37;8576:3;8564:10;8543:37;:::i;:::-;8538:3;8531:50;8610:4;8605:3;8601:14;8594:21;;8481:144;8465:4;8460:3;8456:14;8449:21;;8405:220;;;8409:21;8023:608;;7921:710;;;;;:::o;8654:370::-;8725:5;8774:3;8767:4;8759:6;8755:17;8751:27;8741:122;;8782:79;;:::i;:::-;8741:122;8899:6;8886:20;8924:94;9014:3;9006:6;8999:4;8991:6;8987:17;8924:94;:::i;:::-;8915:103;;8731:293;8654:370;;;;:::o;9030:539::-;9114:6;9163:2;9151:9;9142:7;9138:23;9134:32;9131:119;;;9169:79;;:::i;:::-;9131:119;9317:1;9306:9;9302:17;9289:31;9347:18;9339:6;9336:30;9333:117;;;9369:79;;:::i;:::-;9333:117;9474:78;9544:7;9535:6;9524:9;9520:22;9474:78;:::i;:::-;9464:88;;9260:302;9030:539;;;;:::o;9575:145::-;9673:6;9707:5;9701:12;9691:22;;9575:145;;;:::o;9726:215::-;9856:11;9890:6;9885:3;9878:19;9930:4;9925:3;9921:14;9906:29;;9726:215;;;;:::o;9947:163::-;10045:4;10068:3;10060:11;;10098:4;10093:3;10089:14;10081:22;;9947:163;;;:::o;10116:108::-;10193:24;10211:5;10193:24;:::i;:::-;10188:3;10181:37;10116:108;;:::o;10230:101::-;10266:7;10306:18;10299:5;10295:30;10284:41;;10230:101;;;:::o;10337:105::-;10412:23;10429:5;10412:23;:::i;:::-;10407:3;10400:36;10337:105;;:::o;10448:99::-;10519:21;10534:5;10519:21;:::i;:::-;10514:3;10507:34;10448:99;;:::o;10623:687::-;10772:4;10767:3;10763:14;10859:4;10852:5;10848:16;10842:23;10878:63;10935:4;10930:3;10926:14;10912:12;10878:63;:::i;:::-;10787:164;11043:4;11036:5;11032:16;11026:23;11062:61;11117:4;11112:3;11108:14;11094:12;11062:61;:::i;:::-;10961:172;11217:4;11210:5;11206:16;11200:23;11236:57;11287:4;11282:3;11278:14;11264:12;11236:57;:::i;:::-;11143:160;10741:569;10623:687;;:::o;11316:303::-;11447:10;11468:108;11572:3;11564:6;11468:108;:::i;:::-;11608:4;11603:3;11599:14;11585:28;;11316:303;;;;:::o;11625:144::-;11726:4;11758;11753:3;11749:14;11741:22;;11625:144;;;:::o;11849:980::-;12030:3;12059:85;12138:5;12059:85;:::i;:::-;12160:117;12270:6;12265:3;12160:117;:::i;:::-;12153:124;;12301:87;12382:5;12301:87;:::i;:::-;12411:7;12442:1;12427:377;12452:6;12449:1;12446:13;12427:377;;;12528:6;12522:13;12555:125;12676:3;12661:13;12555:125;:::i;:::-;12548:132;;12703:91;12787:6;12703:91;:::i;:::-;12693:101;;12487:317;12474:1;12471;12467:9;12462:14;;12427:377;;;12431:14;12820:3;12813:10;;12035:794;;;11849:980;;;;:::o;12835:497::-;13040:4;13078:2;13067:9;13063:18;13055:26;;13127:9;13121:4;13117:20;13113:1;13102:9;13098:17;13091:47;13155:170;13320:4;13311:6;13155:170;:::i;:::-;13147:178;;12835:497;;;;:::o;13338:329::-;13397:6;13446:2;13434:9;13425:7;13421:23;13417:32;13414:119;;;13452:79;;:::i;:::-;13414:119;13572:1;13597:53;13642:7;13633:6;13622:9;13618:22;13597:53;:::i;:::-;13587:63;;13543:117;13338:329;;;;:::o;13673:117::-;13782:1;13779;13772:12;13796:308;13858:4;13948:18;13940:6;13937:30;13934:56;;;13970:18;;:::i;:::-;13934:56;14008:29;14030:6;14008:29;:::i;:::-;14000:37;;14092:4;14086;14082:15;14074:23;;13796:308;;;:::o;14110:154::-;14194:6;14189:3;14184;14171:30;14256:1;14247:6;14242:3;14238:16;14231:27;14110:154;;;:::o;14270:412::-;14348:5;14373:66;14389:49;14431:6;14389:49;:::i;:::-;14373:66;:::i;:::-;14364:75;;14462:6;14455:5;14448:21;14500:4;14493:5;14489:16;14538:3;14529:6;14524:3;14520:16;14517:25;14514:112;;;14545:79;;:::i;:::-;14514:112;14635:41;14669:6;14664:3;14659;14635:41;:::i;:::-;14354:328;14270:412;;;;;:::o;14702:340::-;14758:5;14807:3;14800:4;14792:6;14788:17;14784:27;14774:122;;14815:79;;:::i;:::-;14774:122;14932:6;14919:20;14957:79;15032:3;15024:6;15017:4;15009:6;15005:17;14957:79;:::i;:::-;14948:88;;14764:278;14702:340;;;;:::o;15048:509::-;15117:6;15166:2;15154:9;15145:7;15141:23;15137:32;15134:119;;;15172:79;;:::i;:::-;15134:119;15320:1;15309:9;15305:17;15292:31;15350:18;15342:6;15339:30;15336:117;;;15372:79;;:::i;:::-;15336:117;15477:63;15532:7;15523:6;15512:9;15508:22;15477:63;:::i;:::-;15467:73;;15263:287;15048:509;;;;:::o;15563:114::-;15630:6;15664:5;15658:12;15648:22;;15563:114;;;:::o;15683:184::-;15782:11;15816:6;15811:3;15804:19;15856:4;15851:3;15847:14;15832:29;;15683:184;;;;:::o;15873:132::-;15940:4;15963:3;15955:11;;15993:4;15988:3;15984:14;15976:22;;15873:132;;;:::o;16011:108::-;16088:24;16106:5;16088:24;:::i;:::-;16083:3;16076:37;16011:108;;:::o;16125:179::-;16194:10;16215:46;16257:3;16249:6;16215:46;:::i;:::-;16293:4;16288:3;16284:14;16270:28;;16125:179;;;;:::o;16310:113::-;16380:4;16412;16407:3;16403:14;16395:22;;16310:113;;;:::o;16459:732::-;16578:3;16607:54;16655:5;16607:54;:::i;:::-;16677:86;16756:6;16751:3;16677:86;:::i;:::-;16670:93;;16787:56;16837:5;16787:56;:::i;:::-;16866:7;16897:1;16882:284;16907:6;16904:1;16901:13;16882:284;;;16983:6;16977:13;17010:63;17069:3;17054:13;17010:63;:::i;:::-;17003:70;;17096:60;17149:6;17096:60;:::i;:::-;17086:70;;16942:224;16929:1;16926;16922:9;16917:14;;16882:284;;;16886:14;17182:3;17175:10;;16583:608;;;16459:732;;;;:::o;17197:373::-;17340:4;17378:2;17367:9;17363:18;17355:26;;17427:9;17421:4;17417:20;17413:1;17402:9;17398:17;17391:47;17455:108;17558:4;17549:6;17455:108;:::i;:::-;17447:116;;17197:373;;;;:::o;17576:619::-;17653:6;17661;17669;17718:2;17706:9;17697:7;17693:23;17689:32;17686:119;;;17724:79;;:::i;:::-;17686:119;17844:1;17869:53;17914:7;17905:6;17894:9;17890:22;17869:53;:::i;:::-;17859:63;;17815:117;17971:2;17997:53;18042:7;18033:6;18022:9;18018:22;17997:53;:::i;:::-;17987:63;;17942:118;18099:2;18125:53;18170:7;18161:6;18150:9;18146:22;18125:53;:::i;:::-;18115:63;;18070:118;17576:619;;;;;:::o;18201:116::-;18271:21;18286:5;18271:21;:::i;:::-;18264:5;18261:32;18251:60;;18307:1;18304;18297:12;18251:60;18201:116;:::o;18323:133::-;18366:5;18404:6;18391:20;18382:29;;18420:30;18444:5;18420:30;:::i;:::-;18323:133;;;;:::o;18462:468::-;18527:6;18535;18584:2;18572:9;18563:7;18559:23;18555:32;18552:119;;;18590:79;;:::i;:::-;18552:119;18710:1;18735:53;18780:7;18771:6;18760:9;18756:22;18735:53;:::i;:::-;18725:63;;18681:117;18837:2;18863:50;18905:7;18896:6;18885:9;18881:22;18863:50;:::i;:::-;18853:60;;18808:115;18462:468;;;;;:::o;18936:93::-;18972:7;19012:10;19005:5;19001:22;18990:33;;18936:93;;;:::o;19035:120::-;19107:23;19124:5;19107:23;:::i;:::-;19100:5;19097:34;19087:62;;19145:1;19142;19135:12;19087:62;19035:120;:::o;19161:137::-;19206:5;19244:6;19231:20;19222:29;;19260:32;19286:5;19260:32;:::i;:::-;19161:137;;;;:::o;19304:327::-;19362:6;19411:2;19399:9;19390:7;19386:23;19382:32;19379:119;;;19417:79;;:::i;:::-;19379:119;19537:1;19562:52;19606:7;19597:6;19586:9;19582:22;19562:52;:::i;:::-;19552:62;;19508:116;19304:327;;;;:::o;19637:307::-;19698:4;19788:18;19780:6;19777:30;19774:56;;;19810:18;;:::i;:::-;19774:56;19848:29;19870:6;19848:29;:::i;:::-;19840:37;;19932:4;19926;19922:15;19914:23;;19637:307;;;:::o;19950:410::-;20027:5;20052:65;20068:48;20109:6;20068:48;:::i;:::-;20052:65;:::i;:::-;20043:74;;20140:6;20133:5;20126:21;20178:4;20171:5;20167:16;20216:3;20207:6;20202:3;20198:16;20195:25;20192:112;;;20223:79;;:::i;:::-;20192:112;20313:41;20347:6;20342:3;20337;20313:41;:::i;:::-;20033:327;19950:410;;;;;:::o;20379:338::-;20434:5;20483:3;20476:4;20468:6;20464:17;20460:27;20450:122;;20491:79;;:::i;:::-;20450:122;20608:6;20595:20;20633:78;20707:3;20699:6;20692:4;20684:6;20680:17;20633:78;:::i;:::-;20624:87;;20440:277;20379:338;;;;:::o;20723:943::-;20818:6;20826;20834;20842;20891:3;20879:9;20870:7;20866:23;20862:33;20859:120;;;20898:79;;:::i;:::-;20859:120;21018:1;21043:53;21088:7;21079:6;21068:9;21064:22;21043:53;:::i;:::-;21033:63;;20989:117;21145:2;21171:53;21216:7;21207:6;21196:9;21192:22;21171:53;:::i;:::-;21161:63;;21116:118;21273:2;21299:53;21344:7;21335:6;21324:9;21320:22;21299:53;:::i;:::-;21289:63;;21244:118;21429:2;21418:9;21414:18;21401:32;21460:18;21452:6;21449:30;21446:117;;;21482:79;;:::i;:::-;21446:117;21587:62;21641:7;21632:6;21621:9;21617:22;21587:62;:::i;:::-;21577:72;;21372:287;20723:943;;;;;;;:::o;21742:697::-;21901:4;21896:3;21892:14;21988:4;21981:5;21977:16;21971:23;22007:63;22064:4;22059:3;22055:14;22041:12;22007:63;:::i;:::-;21916:164;22172:4;22165:5;22161:16;22155:23;22191:61;22246:4;22241:3;22237:14;22223:12;22191:61;:::i;:::-;22090:172;22346:4;22339:5;22335:16;22329:23;22365:57;22416:4;22411:3;22407:14;22393:12;22365:57;:::i;:::-;22272:160;21870:569;21742:697;;:::o;22445:346::-;22600:4;22638:2;22627:9;22623:18;22615:26;;22651:133;22781:1;22770:9;22766:17;22757:6;22651:133;:::i;:::-;22445:346;;;;:::o;22797:311::-;22874:4;22964:18;22956:6;22953:30;22950:56;;;22986:18;;:::i;:::-;22950:56;23036:4;23028:6;23024:17;23016:25;;23096:4;23090;23086:15;23078:23;;22797:311;;;:::o;23131:710::-;23227:5;23252:81;23268:64;23325:6;23268:64;:::i;:::-;23252:81;:::i;:::-;23243:90;;23353:5;23382:6;23375:5;23368:21;23416:4;23409:5;23405:16;23398:23;;23469:4;23461:6;23457:17;23449:6;23445:30;23498:3;23490:6;23487:15;23484:122;;;23517:79;;:::i;:::-;23484:122;23632:6;23615:220;23649:6;23644:3;23641:15;23615:220;;;23724:3;23753:37;23786:3;23774:10;23753:37;:::i;:::-;23748:3;23741:50;23820:4;23815:3;23811:14;23804:21;;23691:144;23675:4;23670:3;23666:14;23659:21;;23615:220;;;23619:21;23233:608;;23131:710;;;;;:::o;23864:370::-;23935:5;23984:3;23977:4;23969:6;23965:17;23961:27;23951:122;;23992:79;;:::i;:::-;23951:122;24109:6;24096:20;24134:94;24224:3;24216:6;24209:4;24201:6;24197:17;24134:94;:::i;:::-;24125:103;;23941:293;23864:370;;;;:::o;24240:894::-;24358:6;24366;24415:2;24403:9;24394:7;24390:23;24386:32;24383:119;;;24421:79;;:::i;:::-;24383:119;24569:1;24558:9;24554:17;24541:31;24599:18;24591:6;24588:30;24585:117;;;24621:79;;:::i;:::-;24585:117;24726:78;24796:7;24787:6;24776:9;24772:22;24726:78;:::i;:::-;24716:88;;24512:302;24881:2;24870:9;24866:18;24853:32;24912:18;24904:6;24901:30;24898:117;;;24934:79;;:::i;:::-;24898:117;25039:78;25109:7;25100:6;25089:9;25085:22;25039:78;:::i;:::-;25029:88;;24824:303;24240:894;;;;;:::o;25140:474::-;25208:6;25216;25265:2;25253:9;25244:7;25240:23;25236:32;25233:119;;;25271:79;;:::i;:::-;25233:119;25391:1;25416:53;25461:7;25452:6;25441:9;25437:22;25416:53;:::i;:::-;25406:63;;25362:117;25518:2;25544:53;25589:7;25580:6;25569:9;25565:22;25544:53;:::i;:::-;25534:63;;25489:118;25140:474;;;;;:::o;25620:323::-;25676:6;25725:2;25713:9;25704:7;25700:23;25696:32;25693:119;;;25731:79;;:::i;:::-;25693:119;25851:1;25876:50;25918:7;25909:6;25898:9;25894:22;25876:50;:::i;:::-;25866:60;;25822:114;25620:323;;;;:::o;25949:180::-;25997:77;25994:1;25987:88;26094:4;26091:1;26084:15;26118:4;26115:1;26108:15;26135:320;26179:6;26216:1;26210:4;26206:12;26196:22;;26263:1;26257:4;26253:12;26284:18;26274:81;;26340:4;26332:6;26328:17;26318:27;;26274:81;26402:2;26394:6;26391:14;26371:18;26368:38;26365:84;;26421:18;;:::i;:::-;26365:84;26186:269;26135:320;;;:::o;26461:180::-;26509:77;26506:1;26499:88;26606:4;26603:1;26596:15;26630:4;26627:1;26620:15;26647:348;26687:7;26710:20;26728:1;26710:20;:::i;:::-;26705:25;;26744:20;26762:1;26744:20;:::i;:::-;26739:25;;26932:1;26864:66;26860:74;26857:1;26854:81;26849:1;26842:9;26835:17;26831:105;26828:131;;;26939:18;;:::i;:::-;26828:131;26987:1;26984;26980:9;26969:20;;26647:348;;;;:::o;27001:180::-;27049:77;27046:1;27039:88;27146:4;27143:1;27136:15;27170:4;27167:1;27160:15;27187:185;27227:1;27244:20;27262:1;27244:20;:::i;:::-;27239:25;;27278:20;27296:1;27278:20;:::i;:::-;27273:25;;27317:1;27307:35;;27322:18;;:::i;:::-;27307:35;27364:1;27361;27357:9;27352:14;;27187:185;;;;:::o;27378:182::-;27518:34;27514:1;27506:6;27502:14;27495:58;27378:182;:::o;27566:366::-;27708:3;27729:67;27793:2;27788:3;27729:67;:::i;:::-;27722:74;;27805:93;27894:3;27805:93;:::i;:::-;27923:2;27918:3;27914:12;27907:19;;27566:366;;;:::o;27938:419::-;28104:4;28142:2;28131:9;28127:18;28119:26;;28191:9;28185:4;28181:20;28177:1;28166:9;28162:17;28155:47;28219:131;28345:4;28219:131;:::i;:::-;28211:139;;27938:419;;;:::o;28363:180::-;28411:77;28408:1;28401:88;28508:4;28505:1;28498:15;28532:4;28529:1;28522:15;28549:141;28598:4;28621:3;28613:11;;28644:3;28641:1;28634:14;28678:4;28675:1;28665:18;28657:26;;28549:141;;;:::o;28696:93::-;28733:6;28780:2;28775;28768:5;28764:14;28760:23;28750:33;;28696:93;;;:::o;28795:107::-;28839:8;28889:5;28883:4;28879:16;28858:37;;28795:107;;;;:::o;28908:393::-;28977:6;29027:1;29015:10;29011:18;29050:97;29080:66;29069:9;29050:97;:::i;:::-;29168:39;29198:8;29187:9;29168:39;:::i;:::-;29156:51;;29240:4;29236:9;29229:5;29225:21;29216:30;;29289:4;29279:8;29275:19;29268:5;29265:30;29255:40;;28984:317;;28908:393;;;;;:::o;29307:60::-;29335:3;29356:5;29349:12;;29307:60;;;:::o;29373:142::-;29423:9;29456:53;29474:34;29483:24;29501:5;29483:24;:::i;:::-;29474:34;:::i;:::-;29456:53;:::i;:::-;29443:66;;29373:142;;;:::o;29521:75::-;29564:3;29585:5;29578:12;;29521:75;;;:::o;29602:269::-;29712:39;29743:7;29712:39;:::i;:::-;29773:91;29822:41;29846:16;29822:41;:::i;:::-;29814:6;29807:4;29801:11;29773:91;:::i;:::-;29767:4;29760:105;29678:193;29602:269;;;:::o;29877:73::-;29922:3;29877:73;:::o;29956:189::-;30033:32;;:::i;:::-;30074:65;30132:6;30124;30118:4;30074:65;:::i;:::-;30009:136;29956:189;;:::o;30151:186::-;30211:120;30228:3;30221:5;30218:14;30211:120;;;30282:39;30319:1;30312:5;30282:39;:::i;:::-;30255:1;30248:5;30244:13;30235:22;;30211:120;;;30151:186;;:::o;30343:543::-;30444:2;30439:3;30436:11;30433:446;;;30478:38;30510:5;30478:38;:::i;:::-;30562:29;30580:10;30562:29;:::i;:::-;30552:8;30548:44;30745:2;30733:10;30730:18;30727:49;;;30766:8;30751:23;;30727:49;30789:80;30845:22;30863:3;30845:22;:::i;:::-;30835:8;30831:37;30818:11;30789:80;:::i;:::-;30448:431;;30433:446;30343:543;;;:::o;30892:117::-;30946:8;30996:5;30990:4;30986:16;30965:37;;30892:117;;;;:::o;31015:169::-;31059:6;31092:51;31140:1;31136:6;31128:5;31125:1;31121:13;31092:51;:::i;:::-;31088:56;31173:4;31167;31163:15;31153:25;;31066:118;31015:169;;;;:::o;31189:295::-;31265:4;31411:29;31436:3;31430:4;31411:29;:::i;:::-;31403:37;;31473:3;31470:1;31466:11;31460:4;31457:21;31449:29;;31189:295;;;;:::o;31489:1395::-;31606:37;31639:3;31606:37;:::i;:::-;31708:18;31700:6;31697:30;31694:56;;;31730:18;;:::i;:::-;31694:56;31774:38;31806:4;31800:11;31774:38;:::i;:::-;31859:67;31919:6;31911;31905:4;31859:67;:::i;:::-;31953:1;31977:4;31964:17;;32009:2;32001:6;31998:14;32026:1;32021:618;;;;32683:1;32700:6;32697:77;;;32749:9;32744:3;32740:19;32734:26;32725:35;;32697:77;32800:67;32860:6;32853:5;32800:67;:::i;:::-;32794:4;32787:81;32656:222;31991:887;;32021:618;32073:4;32069:9;32061:6;32057:22;32107:37;32139:4;32107:37;:::i;:::-;32166:1;32180:208;32194:7;32191:1;32188:14;32180:208;;;32273:9;32268:3;32264:19;32258:26;32250:6;32243:42;32324:1;32316:6;32312:14;32302:24;;32371:2;32360:9;32356:18;32343:31;;32217:4;32214:1;32210:12;32205:17;;32180:208;;;32416:6;32407:7;32404:19;32401:179;;;32474:9;32469:3;32465:19;32459:26;32517:48;32559:4;32551:6;32547:17;32536:9;32517:48;:::i;:::-;32509:6;32502:64;32424:156;32401:179;32626:1;32622;32614:6;32610:14;32606:22;32600:4;32593:36;32028:611;;;31991:887;;31581:1303;;;31489:1395;;:::o;32890:305::-;32930:3;32949:20;32967:1;32949:20;:::i;:::-;32944:25;;32983:20;33001:1;32983:20;:::i;:::-;32978:25;;33137:1;33069:66;33065:74;33062:1;33059:81;33056:107;;;33143:18;;:::i;:::-;33056:107;33187:1;33184;33180:9;33173:16;;32890:305;;;;:::o;33201:167::-;33341:19;33337:1;33329:6;33325:14;33318:43;33201:167;:::o;33374:366::-;33516:3;33537:67;33601:2;33596:3;33537:67;:::i;:::-;33530:74;;33613:93;33702:3;33613:93;:::i;:::-;33731:2;33726:3;33722:12;33715:19;;33374:366;;;:::o;33746:419::-;33912:4;33950:2;33939:9;33935:18;33927:26;;33999:9;33993:4;33989:20;33985:1;33974:9;33970:17;33963:47;34027:131;34153:4;34027:131;:::i;:::-;34019:139;;33746:419;;;:::o;34171:177::-;34311:29;34307:1;34299:6;34295:14;34288:53;34171:177;:::o;34354:366::-;34496:3;34517:67;34581:2;34576:3;34517:67;:::i;:::-;34510:74;;34593:93;34682:3;34593:93;:::i;:::-;34711:2;34706:3;34702:12;34695:19;;34354:366;;;:::o;34726:419::-;34892:4;34930:2;34919:9;34915:18;34907:26;;34979:9;34973:4;34969:20;34965:1;34954:9;34950:17;34943:47;35007:131;35133:4;35007:131;:::i;:::-;34999:139;;34726:419;;;:::o;35151:191::-;35191:4;35211:20;35229:1;35211:20;:::i;:::-;35206:25;;35245:20;35263:1;35245:20;:::i;:::-;35240:25;;35284:1;35281;35278:8;35275:34;;;35289:18;;:::i;:::-;35275:34;35334:1;35331;35327:9;35319:17;;35151:191;;;;:::o;35348:169::-;35488:21;35484:1;35476:6;35472:14;35465:45;35348:169;:::o;35523:366::-;35665:3;35686:67;35750:2;35745:3;35686:67;:::i;:::-;35679:74;;35762:93;35851:3;35762:93;:::i;:::-;35880:2;35875:3;35871:12;35864:19;;35523:366;;;:::o;35895:419::-;36061:4;36099:2;36088:9;36084:18;36076:26;;36148:9;36142:4;36138:20;36134:1;36123:9;36119:17;36112:47;36176:131;36302:4;36176:131;:::i;:::-;36168:139;;35895:419;;;:::o;36320:170::-;36460:22;36456:1;36448:6;36444:14;36437:46;36320:170;:::o;36496:366::-;36638:3;36659:67;36723:2;36718:3;36659:67;:::i;:::-;36652:74;;36735:93;36824:3;36735:93;:::i;:::-;36853:2;36848:3;36844:12;36837:19;;36496:366;;;:::o;36868:419::-;37034:4;37072:2;37061:9;37057:18;37049:26;;37121:9;37115:4;37111:20;37107:1;37096:9;37092:17;37085:47;37149:131;37275:4;37149:131;:::i;:::-;37141:139;;36868:419;;;:::o;37293:167::-;37433:19;37429:1;37421:6;37417:14;37410:43;37293:167;:::o;37466:366::-;37608:3;37629:67;37693:2;37688:3;37629:67;:::i;:::-;37622:74;;37705:93;37794:3;37705:93;:::i;:::-;37823:2;37818:3;37814:12;37807:19;;37466:366;;;:::o;37838:419::-;38004:4;38042:2;38031:9;38027:18;38019:26;;38091:9;38085:4;38081:20;38077:1;38066:9;38062:17;38055:47;38119:131;38245:4;38119:131;:::i;:::-;38111:139;;37838:419;;;:::o;38263:148::-;38365:11;38402:3;38387:18;;38263:148;;;;:::o;38441:874::-;38544:3;38581:5;38575:12;38610:36;38636:9;38610:36;:::i;:::-;38662:89;38744:6;38739:3;38662:89;:::i;:::-;38655:96;;38782:1;38771:9;38767:17;38798:1;38793:166;;;;38973:1;38968:341;;;;38760:549;;38793:166;38877:4;38873:9;38862;38858:25;38853:3;38846:38;38939:6;38932:14;38925:22;38917:6;38913:35;38908:3;38904:45;38897:52;;38793:166;;38968:341;39035:38;39067:5;39035:38;:::i;:::-;39095:1;39109:154;39123:6;39120:1;39117:13;39109:154;;;39197:7;39191:14;39187:1;39182:3;39178:11;39171:35;39247:1;39238:7;39234:15;39223:26;;39145:4;39142:1;39138:12;39133:17;;39109:154;;;39292:6;39287:3;39283:16;39276:23;;38975:334;;38760:549;;38548:767;;38441:874;;;;:::o;39321:377::-;39427:3;39455:39;39488:5;39455:39;:::i;:::-;39510:89;39592:6;39587:3;39510:89;:::i;:::-;39503:96;;39608:52;39653:6;39648:3;39641:4;39634:5;39630:16;39608:52;:::i;:::-;39685:6;39680:3;39676:16;39669:23;;39431:267;39321:377;;;;:::o;39704:429::-;39881:3;39903:92;39991:3;39982:6;39903:92;:::i;:::-;39896:99;;40012:95;40103:3;40094:6;40012:95;:::i;:::-;40005:102;;40124:3;40117:10;;39704:429;;;;;:::o;40139:233::-;40178:3;40201:24;40219:5;40201:24;:::i;:::-;40192:33;;40247:66;40240:5;40237:77;40234:103;;40317:18;;:::i;:::-;40234:103;40364:1;40357:5;40353:13;40346:20;;40139:233;;;:::o;40378:225::-;40518:34;40514:1;40506:6;40502:14;40495:58;40587:8;40582:2;40574:6;40570:15;40563:33;40378:225;:::o;40609:366::-;40751:3;40772:67;40836:2;40831:3;40772:67;:::i;:::-;40765:74;;40848:93;40937:3;40848:93;:::i;:::-;40966:2;40961:3;40957:12;40950:19;;40609:366;;;:::o;40981:419::-;41147:4;41185:2;41174:9;41170:18;41162:26;;41234:9;41228:4;41224:20;41220:1;41209:9;41205:17;41198:47;41262:131;41388:4;41262:131;:::i;:::-;41254:139;;40981:419;;;:::o;41406:179::-;41546:31;41542:1;41534:6;41530:14;41523:55;41406:179;:::o;41591:366::-;41733:3;41754:67;41818:2;41813:3;41754:67;:::i;:::-;41747:74;;41830:93;41919:3;41830:93;:::i;:::-;41948:2;41943:3;41939:12;41932:19;;41591:366;;;:::o;41963:419::-;42129:4;42167:2;42156:9;42152:18;42144:26;;42216:9;42210:4;42206:20;42202:1;42191:9;42187:17;42180:47;42244:131;42370:4;42244:131;:::i;:::-;42236:139;;41963:419;;;:::o;42388:147::-;42489:11;42526:3;42511:18;;42388:147;;;;:::o;42541:114::-;;:::o;42661:398::-;42820:3;42841:83;42922:1;42917:3;42841:83;:::i;:::-;42834:90;;42933:93;43022:3;42933:93;:::i;:::-;43051:1;43046:3;43042:11;43035:18;;42661:398;;;:::o;43065:379::-;43249:3;43271:147;43414:3;43271:147;:::i;:::-;43264:154;;43435:3;43428:10;;43065:379;;;:::o;43450:245::-;43590:34;43586:1;43578:6;43574:14;43567:58;43659:28;43654:2;43646:6;43642:15;43635:53;43450:245;:::o;43701:366::-;43843:3;43864:67;43928:2;43923:3;43864:67;:::i;:::-;43857:74;;43940:93;44029:3;43940:93;:::i;:::-;44058:2;44053:3;44049:12;44042:19;;43701:366;;;:::o;44073:419::-;44239:4;44277:2;44266:9;44262:18;44254:26;;44326:9;44320:4;44316:20;44312:1;44301:9;44297:17;44290:47;44354:131;44480:4;44354:131;:::i;:::-;44346:139;;44073:419;;;:::o;44498:98::-;44549:6;44583:5;44577:12;44567:22;;44498:98;;;:::o;44602:168::-;44685:11;44719:6;44714:3;44707:19;44759:4;44754:3;44750:14;44735:29;;44602:168;;;;:::o;44776:360::-;44862:3;44890:38;44922:5;44890:38;:::i;:::-;44944:70;45007:6;45002:3;44944:70;:::i;:::-;44937:77;;45023:52;45068:6;45063:3;45056:4;45049:5;45045:16;45023:52;:::i;:::-;45100:29;45122:6;45100:29;:::i;:::-;45095:3;45091:39;45084:46;;44866:270;44776:360;;;;:::o;45142:640::-;45337:4;45375:3;45364:9;45360:19;45352:27;;45389:71;45457:1;45446:9;45442:17;45433:6;45389:71;:::i;:::-;45470:72;45538:2;45527:9;45523:18;45514:6;45470:72;:::i;:::-;45552;45620:2;45609:9;45605:18;45596:6;45552:72;:::i;:::-;45671:9;45665:4;45661:20;45656:2;45645:9;45641:18;45634:48;45699:76;45770:4;45761:6;45699:76;:::i;:::-;45691:84;;45142:640;;;;;;;:::o;45788:141::-;45844:5;45875:6;45869:13;45860:22;;45891:32;45917:5;45891:32;:::i;:::-;45788:141;;;;:::o;45935:349::-;46004:6;46053:2;46041:9;46032:7;46028:23;46024:32;46021:119;;;46059:79;;:::i;:::-;46021:119;46179:1;46204:63;46259:7;46250:6;46239:9;46235:22;46204:63;:::i;:::-;46194:73;;46150:127;45935:349;;;;:::o;46290:176::-;46322:1;46339:20;46357:1;46339:20;:::i;:::-;46334:25;;46373:20;46391:1;46373:20;:::i;:::-;46368:25;;46412:1;46402:35;;46417:18;;:::i;:::-;46402:35;46458:1;46455;46451:9;46446:14;;46290:176;;;;:::o

Swarm Source

ipfs://344fb45b51767c6c8eb92fe93c1a349be806f82d5c185789fb545471ead51216
Loading...
Loading
Loading...
Loading
[ 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.