ETH Price: $2,920.94 (+2.81%)
Gas: 7.51 Gwei
 

Overview

Max Total Supply

215 SOSVGR

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 SOSVGR
0xfcA455FcDe734ED6C5f522729989D0043DEc0022
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:
SOSVengers

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-26
*/

// File @openzeppelin/contracts/utils/[email protected]
// 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 @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev 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 @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/math/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/SOSVengers.sol

pragma solidity >=0.8.0 <0.9.0;





contract SOSVengers is ERC721Enumerable, Ownable {
  using SafeMath for uint256;

  uint constant public maxTokens = 5555;
  
	uint256 constant public mintPrice = 15555555 ether; 

  bool public mintStarted = false;
  uint public tokensMinted = 0;
  uint public batchLimit = 5;
  string public baseURI = "ipfs://QmXHrX2JVKqs29fQqyghBPzDvsaxgVmWYXQxsLTT3LvYWk/";

  IERC20 public sosToken;

  constructor(address sosTokenAddress) ERC721("SOSvengers", "SOSVGR") {
    sosToken = IERC20(sosTokenAddress);
  }

  function mint(uint tokensToMint) public payable {
    require(mintStarted, "Mint is not started");
    require(tokensToMint <= batchLimit, "Not in batch limit");
    require(tokensMinted + tokensToMint <= maxTokens, "Too much tokens to mint");

    uint256 cost = tokensToMint.mul(mintPrice);
    uint256 allowance = sosToken.allowance(msg.sender, address(this));
    require(allowance >= cost, "Not enough allowance of SOS");

    sosToken.transferFrom(msg.sender, address(this), cost);

    for(uint16 i = 0; i < tokensToMint; i++) {
      uint256 id = tokensMinted + 1;
      _mint(msg.sender, id);
      tokensMinted += 1;
    }
  }

  function withdraw() public onlyOwner {
    sosToken.transfer(owner(), sosToken.balanceOf(address(this)));
  }

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

  function setBaseURI(string memory newBaseURI) external onlyOwner {
		baseURI = newBaseURI;
	}

  function startMint() external onlyOwner {
    mintStarted = true;
  }

  function pauseMint() external onlyOwner {
    mintStarted = false;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"sosTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":[],"name":"batchLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sosToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600b556005600c556040518060600160405280603681526020016200470260369139600d90805190602001906200005a92919062000264565b503480156200006857600080fd5b50604051620047383803806200473883398181016040528101906200008e91906200032b565b6040518060400160405280600a81526020017f534f5376656e67657273000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f534f53564752000000000000000000000000000000000000000000000000000081525081600090805190602001906200011292919062000264565b5080600190805190602001906200012b92919062000264565b5050506200014e620001426200019660201b60201c565b6200019e60201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200040a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000272906200038b565b90600052602060002090601f016020900481019282620002965760008555620002e2565b82601f10620002b157805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e1578251825591602001919060010190620002c4565b5b509050620002f19190620002f5565b5090565b5b8082111562000310576000816000905550600101620002f6565b5090565b6000815190506200032581620003f0565b92915050565b6000602082840312156200033e57600080fd5b60006200034e8482850162000314565b91505092915050565b600062000364826200036b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003a457607f821691505b60208210811415620003bb57620003ba620003c1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620003fb8162000357565b81146200040757600080fd5b50565b6142e8806200041a6000396000f3fe6080604052600436106101d85760003560e01c80636c0360eb11610102578063a9722cf311610095578063cd85cdb511610064578063cd85cdb51461068d578063e8315742146106a4578063e985e9c5146106cf578063f2fde38b1461070c576101d8565b8063a9722cf3146105d1578063b88d4fde146105fc578063c2e63e6014610625578063c87b56dd14610650576101d8565b80638da5cb5b116100d15780638da5cb5b1461053657806395d89b4114610561578063a0712d681461058c578063a22cb465146105a8576101d8565b80636c0360eb1461048c5780636de9f32b146104b757806370a08231146104e2578063715018a61461051f576101d8565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103be57806355f804b3146103fb5780636352211e146104245780636817c76c14610461576101d8565b80632f745c59146103165780633ccfd60b1461035357806342842e0e1461036a578063474740b114610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632be09561146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612f13565b610735565b60405161021191906134ed565b60405180910390f35b34801561022657600080fd5b5061022f6107af565b60405161023c9190613523565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612fa6565b610841565b60405161027991906133fd565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612eae565b6108c6565b005b3480156102b757600080fd5b506102c06109de565b6040516102cd9190613805565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612da8565b6109eb565b005b34801561030b57600080fd5b50610314610a4b565b005b34801561032257600080fd5b5061033d60048036038101906103389190612eae565b610ae4565b60405161034a9190613805565b60405180910390f35b34801561035f57600080fd5b50610368610b89565b005b34801561037657600080fd5b50610391600480360381019061038c9190612da8565b610d68565b005b34801561039f57600080fd5b506103a8610d88565b6040516103b59190613805565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612fa6565b610d8e565b6040516103f29190613805565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612f65565b610e25565b005b34801561043057600080fd5b5061044b60048036038101906104469190612fa6565b610ebb565b60405161045891906133fd565b60405180910390f35b34801561046d57600080fd5b50610476610f6d565b6040516104839190613805565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae9190613523565b60405180910390f35b3480156104c357600080fd5b506104cc61100a565b6040516104d99190613805565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612d43565b611010565b6040516105169190613805565b60405180910390f35b34801561052b57600080fd5b506105346110c8565b005b34801561054257600080fd5b5061054b611150565b60405161055891906133fd565b60405180910390f35b34801561056d57600080fd5b5061057661117a565b6040516105839190613523565b60405180910390f35b6105a660048036038101906105a19190612fa6565b61120c565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190612e72565b61151a565b005b3480156105dd57600080fd5b506105e6611530565b6040516105f391906134ed565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e9190612df7565b611543565b005b34801561063157600080fd5b5061063a6115a5565b6040516106479190613508565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612fa6565b6115cb565b6040516106849190613523565b60405180910390f35b34801561069957600080fd5b506106a2611672565b005b3480156106b057600080fd5b506106b961170b565b6040516106c69190613805565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190612d6c565b611711565b60405161070391906134ed565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190612d43565b6117a5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a857506107a78261189d565b5b9050919050565b6060600080546107be90613ae7565b80601f01602080910402602001604051908101604052809291908181526020018280546107ea90613ae7565b80156108375780601f1061080c57610100808354040283529160200191610837565b820191906000526020600020905b81548152906001019060200180831161081a57829003601f168201915b5050505050905090565b600061084c8261197f565b61088b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610882906136e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d182610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093990613765565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109616119eb565b73ffffffffffffffffffffffffffffffffffffffff161480610990575061098f8161098a6119eb565b611711565b5b6109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690613645565b60405180910390fd5b6109d983836119f3565b505050565b6000600880549050905090565b6109fc6109f66119eb565b82611aac565b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a32906137a5565b60405180910390fd5b610a46838383611b8a565b505050565b610a536119eb565b73ffffffffffffffffffffffffffffffffffffffff16610a71611150565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613705565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000610aef83611010565b8210610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613545565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b916119eb565b73ffffffffffffffffffffffffffffffffffffffff16610baf611150565b73ffffffffffffffffffffffffffffffffffffffff1614610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc90613705565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c4b611150565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca691906133fd565b60206040518083038186803b158015610cbe57600080fd5b505afa158015610cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf69190612fcf565b6040518363ffffffff1660e01b8152600401610d139291906134c4565b602060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d659190612eea565b50565b610d8383838360405180602001604052806000815250611543565b505050565b600c5481565b6000610d986109de565b8210610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd0906137e5565b60405180910390fd5b60088281548110610e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e2d6119eb565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611150565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613705565b60405180910390fd5b80600d9080519060200190610eb7929190612b3d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b90613685565b60405180910390fd5b80915050919050565b6a0cde045385d561f9ac000081565b600d8054610f8990613ae7565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb590613ae7565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613665565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d06119eb565b73ffffffffffffffffffffffffffffffffffffffff166110ee611150565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90613705565b60405180910390fd5b61114e6000611de6565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461118990613ae7565b80601f01602080910402602001604051908101604052809291908181526020018280546111b590613ae7565b80156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b5050505050905090565b600a60149054906101000a900460ff1661125b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611252906136a5565b60405180910390fd5b600c548111156112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790613785565b60405180910390fd5b6115b381600b546112b191906138ea565b11156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e9906137c5565b60405180910390fd5b60006113126a0cde045385d561f9ac000083611eac90919063ffffffff16565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611373929190613418565b60206040518083038186803b15801561138b57600080fd5b505afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190612fcf565b905081811015611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff906135c5565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161146793929190613441565b602060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b99190612eea565b5060005b838161ffff1610156115145760006001600b546114da91906138ea565b90506114e63382611ec2565b6001600b60008282546114f991906138ea565b9250508190555050808061150c90613b4a565b9150506114bd565b50505050565b61152c6115256119eb565b8383612090565b5050565b600a60149054906101000a900460ff1681565b61155461154e6119eb565b83611aac565b611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a906137a5565b60405180910390fd5b61159f848484846121fd565b50505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606115d68261197f565b611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90613745565b60405180910390fd5b600061161f612259565b9050600081511161163f576040518060200160405280600081525061166a565b80611649846122eb565b60405160200161165a9291906133d9565b6040516020818303038152906040525b915050919050565b61167a6119eb565b73ffffffffffffffffffffffffffffffffffffffff16611698611150565b73ffffffffffffffffffffffffffffffffffffffff16146116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613705565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6115b381565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117ad6119eb565b73ffffffffffffffffffffffffffffffffffffffff166117cb611150565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613705565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890613585565b60405180910390fd5b61189a81611de6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061196857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611978575061197782612498565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a6683610ebb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ab78261197f565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613625565b60405180910390fd5b6000611b0183610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b7057508373ffffffffffffffffffffffffffffffffffffffff16611b5884610841565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b815750611b808185611711565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611baa82610ebb565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906135e5565b60405180910390fd5b611c7b838383612502565b611c866000826119f3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cd691906139cb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d91906138ea565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611eba9190613971565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906136c5565b60405180910390fd5b611f3b8161197f565b15611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f72906135a5565b60405180910390fd5b611f8760008383612502565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd791906138ea565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613605565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121f091906134ed565b60405180910390a3505050565b612208848484611b8a565b61221484848484612616565b612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613565565b60405180910390fd5b50505050565b6060600d805461226890613ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461229490613ae7565b80156122e15780601f106122b6576101008083540402835291602001916122e1565b820191906000526020600020905b8154815290600101906020018083116122c457829003601f168201915b5050505050905090565b60606000821415612333576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612493565b600082905060005b6000821461236557808061234e90613b75565b915050600a8261235e9190613940565b915061233b565b60008167ffffffffffffffff8111156123a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123d95781602001600182028036833780820191505090505b5090505b6000851461248c576001826123f291906139cb565b9150600a856124019190613bbe565b603061240d91906138ea565b60f81b818381518110612449577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124859190613940565b94506123dd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61250d8383836127ad565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125505761254b816127b2565b61258f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461258e5761258d83826127fb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d2576125cd81612968565b612611565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126105761260f8282612aab565b5b5b505050565b60006126378473ffffffffffffffffffffffffffffffffffffffff16612b2a565b156127a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126606119eb565b8786866040518563ffffffff1660e01b81526004016126829493929190613478565b602060405180830381600087803b15801561269c57600080fd5b505af19250505080156126cd57506040513d601f19601f820116820180604052508101906126ca9190612f3c565b60015b612750573d80600081146126fd576040519150601f19603f3d011682016040523d82523d6000602084013e612702565b606091505b50600081511415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90613565565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161280884611010565b61281291906139cb565b90506000600760008481526020019081526020016000205490508181146128f7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061297c91906139cb565b90506000600960008481526020019081526020016000205490506000600883815481106129d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ab683611010565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b4990613ae7565b90600052602060002090601f016020900481019282612b6b5760008555612bb2565b82601f10612b8457805160ff1916838001178555612bb2565b82800160010185558215612bb2579182015b82811115612bb1578251825591602001919060010190612b96565b5b509050612bbf9190612bc3565b5090565b5b80821115612bdc576000816000905550600101612bc4565b5090565b6000612bf3612bee84613845565b613820565b905082815260208101848484011115612c0b57600080fd5b612c16848285613aa5565b509392505050565b6000612c31612c2c84613876565b613820565b905082815260208101848484011115612c4957600080fd5b612c54848285613aa5565b509392505050565b600081359050612c6b81614256565b92915050565b600081359050612c808161426d565b92915050565b600081519050612c958161426d565b92915050565b600081359050612caa81614284565b92915050565b600081519050612cbf81614284565b92915050565b600082601f830112612cd657600080fd5b8135612ce6848260208601612be0565b91505092915050565b600082601f830112612d0057600080fd5b8135612d10848260208601612c1e565b91505092915050565b600081359050612d288161429b565b92915050565b600081519050612d3d8161429b565b92915050565b600060208284031215612d5557600080fd5b6000612d6384828501612c5c565b91505092915050565b60008060408385031215612d7f57600080fd5b6000612d8d85828601612c5c565b9250506020612d9e85828601612c5c565b9150509250929050565b600080600060608486031215612dbd57600080fd5b6000612dcb86828701612c5c565b9350506020612ddc86828701612c5c565b9250506040612ded86828701612d19565b9150509250925092565b60008060008060808587031215612e0d57600080fd5b6000612e1b87828801612c5c565b9450506020612e2c87828801612c5c565b9350506040612e3d87828801612d19565b925050606085013567ffffffffffffffff811115612e5a57600080fd5b612e6687828801612cc5565b91505092959194509250565b60008060408385031215612e8557600080fd5b6000612e9385828601612c5c565b9250506020612ea485828601612c71565b9150509250929050565b60008060408385031215612ec157600080fd5b6000612ecf85828601612c5c565b9250506020612ee085828601612d19565b9150509250929050565b600060208284031215612efc57600080fd5b6000612f0a84828501612c86565b91505092915050565b600060208284031215612f2557600080fd5b6000612f3384828501612c9b565b91505092915050565b600060208284031215612f4e57600080fd5b6000612f5c84828501612cb0565b91505092915050565b600060208284031215612f7757600080fd5b600082013567ffffffffffffffff811115612f9157600080fd5b612f9d84828501612cef565b91505092915050565b600060208284031215612fb857600080fd5b6000612fc684828501612d19565b91505092915050565b600060208284031215612fe157600080fd5b6000612fef84828501612d2e565b91505092915050565b613001816139ff565b82525050565b61301081613a11565b82525050565b6000613021826138a7565b61302b81856138bd565b935061303b818560208601613ab4565b61304481613cab565b840191505092915050565b61305881613a81565b82525050565b6000613069826138b2565b61307381856138ce565b9350613083818560208601613ab4565b61308c81613cab565b840191505092915050565b60006130a2826138b2565b6130ac81856138df565b93506130bc818560208601613ab4565b80840191505092915050565b60006130d5602b836138ce565b91506130e082613cbc565b604082019050919050565b60006130f86032836138ce565b915061310382613d0b565b604082019050919050565b600061311b6026836138ce565b915061312682613d5a565b604082019050919050565b600061313e601c836138ce565b915061314982613da9565b602082019050919050565b6000613161601b836138ce565b915061316c82613dd2565b602082019050919050565b60006131846024836138ce565b915061318f82613dfb565b604082019050919050565b60006131a76019836138ce565b91506131b282613e4a565b602082019050919050565b60006131ca602c836138ce565b91506131d582613e73565b604082019050919050565b60006131ed6038836138ce565b91506131f882613ec2565b604082019050919050565b6000613210602a836138ce565b915061321b82613f11565b604082019050919050565b60006132336029836138ce565b915061323e82613f60565b604082019050919050565b60006132566013836138ce565b915061326182613faf565b602082019050919050565b60006132796020836138ce565b915061328482613fd8565b602082019050919050565b600061329c602c836138ce565b91506132a782614001565b604082019050919050565b60006132bf6020836138ce565b91506132ca82614050565b602082019050919050565b60006132e26029836138ce565b91506132ed82614079565b604082019050919050565b6000613305602f836138ce565b9150613310826140c8565b604082019050919050565b60006133286021836138ce565b915061333382614117565b604082019050919050565b600061334b6012836138ce565b915061335682614166565b602082019050919050565b600061336e6031836138ce565b91506133798261418f565b604082019050919050565b60006133916017836138ce565b915061339c826141de565b602082019050919050565b60006133b4602c836138ce565b91506133bf82614207565b604082019050919050565b6133d381613a77565b82525050565b60006133e58285613097565b91506133f18284613097565b91508190509392505050565b60006020820190506134126000830184612ff8565b92915050565b600060408201905061342d6000830185612ff8565b61343a6020830184612ff8565b9392505050565b60006060820190506134566000830186612ff8565b6134636020830185612ff8565b61347060408301846133ca565b949350505050565b600060808201905061348d6000830187612ff8565b61349a6020830186612ff8565b6134a760408301856133ca565b81810360608301526134b98184613016565b905095945050505050565b60006040820190506134d96000830185612ff8565b6134e660208301846133ca565b9392505050565b60006020820190506135026000830184613007565b92915050565b600060208201905061351d600083018461304f565b92915050565b6000602082019050818103600083015261353d818461305e565b905092915050565b6000602082019050818103600083015261355e816130c8565b9050919050565b6000602082019050818103600083015261357e816130eb565b9050919050565b6000602082019050818103600083015261359e8161310e565b9050919050565b600060208201905081810360008301526135be81613131565b9050919050565b600060208201905081810360008301526135de81613154565b9050919050565b600060208201905081810360008301526135fe81613177565b9050919050565b6000602082019050818103600083015261361e8161319a565b9050919050565b6000602082019050818103600083015261363e816131bd565b9050919050565b6000602082019050818103600083015261365e816131e0565b9050919050565b6000602082019050818103600083015261367e81613203565b9050919050565b6000602082019050818103600083015261369e81613226565b9050919050565b600060208201905081810360008301526136be81613249565b9050919050565b600060208201905081810360008301526136de8161326c565b9050919050565b600060208201905081810360008301526136fe8161328f565b9050919050565b6000602082019050818103600083015261371e816132b2565b9050919050565b6000602082019050818103600083015261373e816132d5565b9050919050565b6000602082019050818103600083015261375e816132f8565b9050919050565b6000602082019050818103600083015261377e8161331b565b9050919050565b6000602082019050818103600083015261379e8161333e565b9050919050565b600060208201905081810360008301526137be81613361565b9050919050565b600060208201905081810360008301526137de81613384565b9050919050565b600060208201905081810360008301526137fe816133a7565b9050919050565b600060208201905061381a60008301846133ca565b92915050565b600061382a61383b565b90506138368282613b19565b919050565b6000604051905090565b600067ffffffffffffffff8211156138605761385f613c7c565b5b61386982613cab565b9050602081019050919050565b600067ffffffffffffffff82111561389157613890613c7c565b5b61389a82613cab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138f582613a77565b915061390083613a77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561393557613934613bef565b5b828201905092915050565b600061394b82613a77565b915061395683613a77565b92508261396657613965613c1e565b5b828204905092915050565b600061397c82613a77565b915061398783613a77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c0576139bf613bef565b5b828202905092915050565b60006139d682613a77565b91506139e183613a77565b9250828210156139f4576139f3613bef565b5b828203905092915050565b6000613a0a82613a57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a8c82613a93565b9050919050565b6000613a9e82613a57565b9050919050565b82818337600083830152505050565b60005b83811015613ad2578082015181840152602081019050613ab7565b83811115613ae1576000848401525b50505050565b60006002820490506001821680613aff57607f821691505b60208210811415613b1357613b12613c4d565b5b50919050565b613b2282613cab565b810181811067ffffffffffffffff82111715613b4157613b40613c7c565b5b80604052505050565b6000613b5582613a49565b915061ffff821415613b6a57613b69613bef565b5b600182019050919050565b6000613b8082613a77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb357613bb2613bef565b5b600182019050919050565b6000613bc982613a77565b9150613bd483613a77565b925082613be457613be3613c1e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f75676820616c6c6f77616e6365206f6620534f530000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74206973206e6f74207374617274656400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e206261746368206c696d69740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546f6f206d75636820746f6b656e7320746f206d696e74000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61425f816139ff565b811461426a57600080fd5b50565b61427681613a11565b811461428157600080fd5b50565b61428d81613a1d565b811461429857600080fd5b50565b6142a481613a77565b81146142af57600080fd5b5056fea2646970667358221220bee4cf6fd2022d4c4e49cc36e412e3b825d065a35b1dd7c0541fe7548b7b3ce364736f6c63430008040033697066733a2f2f516d58487258324a564b7173323966517179676842507a447673617867566d5759585178734c5454334c7659576b2f0000000000000000000000003b484b82567a09e2588a13d54d032153f0c0aee0

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636c0360eb11610102578063a9722cf311610095578063cd85cdb511610064578063cd85cdb51461068d578063e8315742146106a4578063e985e9c5146106cf578063f2fde38b1461070c576101d8565b8063a9722cf3146105d1578063b88d4fde146105fc578063c2e63e6014610625578063c87b56dd14610650576101d8565b80638da5cb5b116100d15780638da5cb5b1461053657806395d89b4114610561578063a0712d681461058c578063a22cb465146105a8576101d8565b80636c0360eb1461048c5780636de9f32b146104b757806370a08231146104e2578063715018a61461051f576101d8565b80632f745c591161017a5780634f6ccce7116101495780634f6ccce7146103be57806355f804b3146103fb5780636352211e146104245780636817c76c14610461576101d8565b80632f745c59146103165780633ccfd60b1461035357806342842e0e1461036a578063474740b114610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632be09561146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612f13565b610735565b60405161021191906134ed565b60405180910390f35b34801561022657600080fd5b5061022f6107af565b60405161023c9190613523565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612fa6565b610841565b60405161027991906133fd565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612eae565b6108c6565b005b3480156102b757600080fd5b506102c06109de565b6040516102cd9190613805565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612da8565b6109eb565b005b34801561030b57600080fd5b50610314610a4b565b005b34801561032257600080fd5b5061033d60048036038101906103389190612eae565b610ae4565b60405161034a9190613805565b60405180910390f35b34801561035f57600080fd5b50610368610b89565b005b34801561037657600080fd5b50610391600480360381019061038c9190612da8565b610d68565b005b34801561039f57600080fd5b506103a8610d88565b6040516103b59190613805565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612fa6565b610d8e565b6040516103f29190613805565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612f65565b610e25565b005b34801561043057600080fd5b5061044b60048036038101906104469190612fa6565b610ebb565b60405161045891906133fd565b60405180910390f35b34801561046d57600080fd5b50610476610f6d565b6040516104839190613805565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae9190613523565b60405180910390f35b3480156104c357600080fd5b506104cc61100a565b6040516104d99190613805565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612d43565b611010565b6040516105169190613805565b60405180910390f35b34801561052b57600080fd5b506105346110c8565b005b34801561054257600080fd5b5061054b611150565b60405161055891906133fd565b60405180910390f35b34801561056d57600080fd5b5061057661117a565b6040516105839190613523565b60405180910390f35b6105a660048036038101906105a19190612fa6565b61120c565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190612e72565b61151a565b005b3480156105dd57600080fd5b506105e6611530565b6040516105f391906134ed565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e9190612df7565b611543565b005b34801561063157600080fd5b5061063a6115a5565b6040516106479190613508565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190612fa6565b6115cb565b6040516106849190613523565b60405180910390f35b34801561069957600080fd5b506106a2611672565b005b3480156106b057600080fd5b506106b961170b565b6040516106c69190613805565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190612d6c565b611711565b60405161070391906134ed565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190612d43565b6117a5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a857506107a78261189d565b5b9050919050565b6060600080546107be90613ae7565b80601f01602080910402602001604051908101604052809291908181526020018280546107ea90613ae7565b80156108375780601f1061080c57610100808354040283529160200191610837565b820191906000526020600020905b81548152906001019060200180831161081a57829003601f168201915b5050505050905090565b600061084c8261197f565b61088b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610882906136e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d182610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093990613765565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109616119eb565b73ffffffffffffffffffffffffffffffffffffffff161480610990575061098f8161098a6119eb565b611711565b5b6109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690613645565b60405180910390fd5b6109d983836119f3565b505050565b6000600880549050905090565b6109fc6109f66119eb565b82611aac565b610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a32906137a5565b60405180910390fd5b610a46838383611b8a565b505050565b610a536119eb565b73ffffffffffffffffffffffffffffffffffffffff16610a71611150565b73ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613705565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000610aef83611010565b8210610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790613545565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b916119eb565b73ffffffffffffffffffffffffffffffffffffffff16610baf611150565b73ffffffffffffffffffffffffffffffffffffffff1614610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc90613705565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c4b611150565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca691906133fd565b60206040518083038186803b158015610cbe57600080fd5b505afa158015610cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf69190612fcf565b6040518363ffffffff1660e01b8152600401610d139291906134c4565b602060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d659190612eea565b50565b610d8383838360405180602001604052806000815250611543565b505050565b600c5481565b6000610d986109de565b8210610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd0906137e5565b60405180910390fd5b60088281548110610e13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e2d6119eb565b73ffffffffffffffffffffffffffffffffffffffff16610e4b611150565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613705565b60405180910390fd5b80600d9080519060200190610eb7929190612b3d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b90613685565b60405180910390fd5b80915050919050565b6a0cde045385d561f9ac000081565b600d8054610f8990613ae7565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb590613ae7565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613665565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d06119eb565b73ffffffffffffffffffffffffffffffffffffffff166110ee611150565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90613705565b60405180910390fd5b61114e6000611de6565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461118990613ae7565b80601f01602080910402602001604051908101604052809291908181526020018280546111b590613ae7565b80156112025780601f106111d757610100808354040283529160200191611202565b820191906000526020600020905b8154815290600101906020018083116111e557829003601f168201915b5050505050905090565b600a60149054906101000a900460ff1661125b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611252906136a5565b60405180910390fd5b600c548111156112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790613785565b60405180910390fd5b6115b381600b546112b191906138ea565b11156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e9906137c5565b60405180910390fd5b60006113126a0cde045385d561f9ac000083611eac90919063ffffffff16565b90506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611373929190613418565b60206040518083038186803b15801561138b57600080fd5b505afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190612fcf565b905081811015611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff906135c5565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161146793929190613441565b602060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b99190612eea565b5060005b838161ffff1610156115145760006001600b546114da91906138ea565b90506114e63382611ec2565b6001600b60008282546114f991906138ea565b9250508190555050808061150c90613b4a565b9150506114bd565b50505050565b61152c6115256119eb565b8383612090565b5050565b600a60149054906101000a900460ff1681565b61155461154e6119eb565b83611aac565b611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a906137a5565b60405180910390fd5b61159f848484846121fd565b50505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606115d68261197f565b611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90613745565b60405180910390fd5b600061161f612259565b9050600081511161163f576040518060200160405280600081525061166a565b80611649846122eb565b60405160200161165a9291906133d9565b6040516020818303038152906040525b915050919050565b61167a6119eb565b73ffffffffffffffffffffffffffffffffffffffff16611698611150565b73ffffffffffffffffffffffffffffffffffffffff16146116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613705565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6115b381565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117ad6119eb565b73ffffffffffffffffffffffffffffffffffffffff166117cb611150565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613705565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890613585565b60405180910390fd5b61189a81611de6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061196857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611978575061197782612498565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a6683610ebb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ab78261197f565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613625565b60405180910390fd5b6000611b0183610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b7057508373ffffffffffffffffffffffffffffffffffffffff16611b5884610841565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b815750611b808185611711565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611baa82610ebb565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613725565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906135e5565b60405180910390fd5b611c7b838383612502565b611c866000826119f3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cd691906139cb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d91906138ea565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611eba9190613971565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906136c5565b60405180910390fd5b611f3b8161197f565b15611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f72906135a5565b60405180910390fd5b611f8760008383612502565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd791906138ea565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613605565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121f091906134ed565b60405180910390a3505050565b612208848484611b8a565b61221484848484612616565b612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613565565b60405180910390fd5b50505050565b6060600d805461226890613ae7565b80601f016020809104026020016040519081016040528092919081815260200182805461229490613ae7565b80156122e15780601f106122b6576101008083540402835291602001916122e1565b820191906000526020600020905b8154815290600101906020018083116122c457829003601f168201915b5050505050905090565b60606000821415612333576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612493565b600082905060005b6000821461236557808061234e90613b75565b915050600a8261235e9190613940565b915061233b565b60008167ffffffffffffffff8111156123a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123d95781602001600182028036833780820191505090505b5090505b6000851461248c576001826123f291906139cb565b9150600a856124019190613bbe565b603061240d91906138ea565b60f81b818381518110612449577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124859190613940565b94506123dd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61250d8383836127ad565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125505761254b816127b2565b61258f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461258e5761258d83826127fb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d2576125cd81612968565b612611565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126105761260f8282612aab565b5b5b505050565b60006126378473ffffffffffffffffffffffffffffffffffffffff16612b2a565b156127a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126606119eb565b8786866040518563ffffffff1660e01b81526004016126829493929190613478565b602060405180830381600087803b15801561269c57600080fd5b505af19250505080156126cd57506040513d601f19601f820116820180604052508101906126ca9190612f3c565b60015b612750573d80600081146126fd576040519150601f19603f3d011682016040523d82523d6000602084013e612702565b606091505b50600081511415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90613565565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161280884611010565b61281291906139cb565b90506000600760008481526020019081526020016000205490508181146128f7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061297c91906139cb565b90506000600960008481526020019081526020016000205490506000600883815481106129d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ab683611010565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b4990613ae7565b90600052602060002090601f016020900481019282612b6b5760008555612bb2565b82601f10612b8457805160ff1916838001178555612bb2565b82800160010185558215612bb2579182015b82811115612bb1578251825591602001919060010190612b96565b5b509050612bbf9190612bc3565b5090565b5b80821115612bdc576000816000905550600101612bc4565b5090565b6000612bf3612bee84613845565b613820565b905082815260208101848484011115612c0b57600080fd5b612c16848285613aa5565b509392505050565b6000612c31612c2c84613876565b613820565b905082815260208101848484011115612c4957600080fd5b612c54848285613aa5565b509392505050565b600081359050612c6b81614256565b92915050565b600081359050612c808161426d565b92915050565b600081519050612c958161426d565b92915050565b600081359050612caa81614284565b92915050565b600081519050612cbf81614284565b92915050565b600082601f830112612cd657600080fd5b8135612ce6848260208601612be0565b91505092915050565b600082601f830112612d0057600080fd5b8135612d10848260208601612c1e565b91505092915050565b600081359050612d288161429b565b92915050565b600081519050612d3d8161429b565b92915050565b600060208284031215612d5557600080fd5b6000612d6384828501612c5c565b91505092915050565b60008060408385031215612d7f57600080fd5b6000612d8d85828601612c5c565b9250506020612d9e85828601612c5c565b9150509250929050565b600080600060608486031215612dbd57600080fd5b6000612dcb86828701612c5c565b9350506020612ddc86828701612c5c565b9250506040612ded86828701612d19565b9150509250925092565b60008060008060808587031215612e0d57600080fd5b6000612e1b87828801612c5c565b9450506020612e2c87828801612c5c565b9350506040612e3d87828801612d19565b925050606085013567ffffffffffffffff811115612e5a57600080fd5b612e6687828801612cc5565b91505092959194509250565b60008060408385031215612e8557600080fd5b6000612e9385828601612c5c565b9250506020612ea485828601612c71565b9150509250929050565b60008060408385031215612ec157600080fd5b6000612ecf85828601612c5c565b9250506020612ee085828601612d19565b9150509250929050565b600060208284031215612efc57600080fd5b6000612f0a84828501612c86565b91505092915050565b600060208284031215612f2557600080fd5b6000612f3384828501612c9b565b91505092915050565b600060208284031215612f4e57600080fd5b6000612f5c84828501612cb0565b91505092915050565b600060208284031215612f7757600080fd5b600082013567ffffffffffffffff811115612f9157600080fd5b612f9d84828501612cef565b91505092915050565b600060208284031215612fb857600080fd5b6000612fc684828501612d19565b91505092915050565b600060208284031215612fe157600080fd5b6000612fef84828501612d2e565b91505092915050565b613001816139ff565b82525050565b61301081613a11565b82525050565b6000613021826138a7565b61302b81856138bd565b935061303b818560208601613ab4565b61304481613cab565b840191505092915050565b61305881613a81565b82525050565b6000613069826138b2565b61307381856138ce565b9350613083818560208601613ab4565b61308c81613cab565b840191505092915050565b60006130a2826138b2565b6130ac81856138df565b93506130bc818560208601613ab4565b80840191505092915050565b60006130d5602b836138ce565b91506130e082613cbc565b604082019050919050565b60006130f86032836138ce565b915061310382613d0b565b604082019050919050565b600061311b6026836138ce565b915061312682613d5a565b604082019050919050565b600061313e601c836138ce565b915061314982613da9565b602082019050919050565b6000613161601b836138ce565b915061316c82613dd2565b602082019050919050565b60006131846024836138ce565b915061318f82613dfb565b604082019050919050565b60006131a76019836138ce565b91506131b282613e4a565b602082019050919050565b60006131ca602c836138ce565b91506131d582613e73565b604082019050919050565b60006131ed6038836138ce565b91506131f882613ec2565b604082019050919050565b6000613210602a836138ce565b915061321b82613f11565b604082019050919050565b60006132336029836138ce565b915061323e82613f60565b604082019050919050565b60006132566013836138ce565b915061326182613faf565b602082019050919050565b60006132796020836138ce565b915061328482613fd8565b602082019050919050565b600061329c602c836138ce565b91506132a782614001565b604082019050919050565b60006132bf6020836138ce565b91506132ca82614050565b602082019050919050565b60006132e26029836138ce565b91506132ed82614079565b604082019050919050565b6000613305602f836138ce565b9150613310826140c8565b604082019050919050565b60006133286021836138ce565b915061333382614117565b604082019050919050565b600061334b6012836138ce565b915061335682614166565b602082019050919050565b600061336e6031836138ce565b91506133798261418f565b604082019050919050565b60006133916017836138ce565b915061339c826141de565b602082019050919050565b60006133b4602c836138ce565b91506133bf82614207565b604082019050919050565b6133d381613a77565b82525050565b60006133e58285613097565b91506133f18284613097565b91508190509392505050565b60006020820190506134126000830184612ff8565b92915050565b600060408201905061342d6000830185612ff8565b61343a6020830184612ff8565b9392505050565b60006060820190506134566000830186612ff8565b6134636020830185612ff8565b61347060408301846133ca565b949350505050565b600060808201905061348d6000830187612ff8565b61349a6020830186612ff8565b6134a760408301856133ca565b81810360608301526134b98184613016565b905095945050505050565b60006040820190506134d96000830185612ff8565b6134e660208301846133ca565b9392505050565b60006020820190506135026000830184613007565b92915050565b600060208201905061351d600083018461304f565b92915050565b6000602082019050818103600083015261353d818461305e565b905092915050565b6000602082019050818103600083015261355e816130c8565b9050919050565b6000602082019050818103600083015261357e816130eb565b9050919050565b6000602082019050818103600083015261359e8161310e565b9050919050565b600060208201905081810360008301526135be81613131565b9050919050565b600060208201905081810360008301526135de81613154565b9050919050565b600060208201905081810360008301526135fe81613177565b9050919050565b6000602082019050818103600083015261361e8161319a565b9050919050565b6000602082019050818103600083015261363e816131bd565b9050919050565b6000602082019050818103600083015261365e816131e0565b9050919050565b6000602082019050818103600083015261367e81613203565b9050919050565b6000602082019050818103600083015261369e81613226565b9050919050565b600060208201905081810360008301526136be81613249565b9050919050565b600060208201905081810360008301526136de8161326c565b9050919050565b600060208201905081810360008301526136fe8161328f565b9050919050565b6000602082019050818103600083015261371e816132b2565b9050919050565b6000602082019050818103600083015261373e816132d5565b9050919050565b6000602082019050818103600083015261375e816132f8565b9050919050565b6000602082019050818103600083015261377e8161331b565b9050919050565b6000602082019050818103600083015261379e8161333e565b9050919050565b600060208201905081810360008301526137be81613361565b9050919050565b600060208201905081810360008301526137de81613384565b9050919050565b600060208201905081810360008301526137fe816133a7565b9050919050565b600060208201905061381a60008301846133ca565b92915050565b600061382a61383b565b90506138368282613b19565b919050565b6000604051905090565b600067ffffffffffffffff8211156138605761385f613c7c565b5b61386982613cab565b9050602081019050919050565b600067ffffffffffffffff82111561389157613890613c7c565b5b61389a82613cab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138f582613a77565b915061390083613a77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561393557613934613bef565b5b828201905092915050565b600061394b82613a77565b915061395683613a77565b92508261396657613965613c1e565b5b828204905092915050565b600061397c82613a77565b915061398783613a77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139c0576139bf613bef565b5b828202905092915050565b60006139d682613a77565b91506139e183613a77565b9250828210156139f4576139f3613bef565b5b828203905092915050565b6000613a0a82613a57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a8c82613a93565b9050919050565b6000613a9e82613a57565b9050919050565b82818337600083830152505050565b60005b83811015613ad2578082015181840152602081019050613ab7565b83811115613ae1576000848401525b50505050565b60006002820490506001821680613aff57607f821691505b60208210811415613b1357613b12613c4d565b5b50919050565b613b2282613cab565b810181811067ffffffffffffffff82111715613b4157613b40613c7c565b5b80604052505050565b6000613b5582613a49565b915061ffff821415613b6a57613b69613bef565b5b600182019050919050565b6000613b8082613a77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb357613bb2613bef565b5b600182019050919050565b6000613bc982613a77565b9150613bd483613a77565b925082613be457613be3613c1e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f75676820616c6c6f77616e6365206f6620534f530000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74206973206e6f74207374617274656400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420696e206261746368206c696d69740000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546f6f206d75636820746f6b656e7320746f206d696e74000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61425f816139ff565b811461426a57600080fd5b50565b61427681613a11565b811461428157600080fd5b50565b61428d81613a1d565b811461429857600080fd5b50565b6142a481613a77565b81146142af57600080fd5b5056fea2646970667358221220bee4cf6fd2022d4c4e49cc36e412e3b825d065a35b1dd7c0541fe7548b7b3ce364736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003b484b82567a09e2588A13D54D032153f0c0aEe0

-----Decoded View---------------
Arg [0] : sosTokenAddress (address): 0x3b484b82567a09e2588A13D54D032153f0c0aEe0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b484b82567a09e2588A13D54D032153f0c0aEe0


Deployed Bytecode Sourcemap

54517:1657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41255:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27668:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29227:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28750:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41895:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29977:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56022:71;;;;;;;;;;;;;:::i;:::-;;41563:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55702:111;;;;;;;;;;;;;:::i;:::-;;30387:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54776:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42085:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55921:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27362:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54649:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54807:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54743:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27092:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2645:103;;;;;;;;;;;;;:::i;:::-;;1994:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27837:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55044:652;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29520:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54707:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30643:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54894:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28012:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56099:72;;;;;;;;;;;;;:::i;:::-;;54604:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29746:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2903:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41255:224;41357:4;41396:35;41381:50;;;:11;:50;;;;:90;;;;41435:36;41459:11;41435:23;:36::i;:::-;41381:90;41374:97;;41255:224;;;:::o;27668:100::-;27722:13;27755:5;27748:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27668:100;:::o;29227:221::-;29303:7;29331:16;29339:7;29331;:16::i;:::-;29323:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29416:15;:24;29432:7;29416:24;;;;;;;;;;;;;;;;;;;;;29409:31;;29227:221;;;:::o;28750:411::-;28831:13;28847:23;28862:7;28847:14;:23::i;:::-;28831:39;;28895:5;28889:11;;:2;:11;;;;28881:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28989:5;28973:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28998:37;29015:5;29022:12;:10;:12::i;:::-;28998:16;:37::i;:::-;28973:62;28951:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29132:21;29141:2;29145:7;29132:8;:21::i;:::-;28750:411;;;:::o;41895:113::-;41956:7;41983:10;:17;;;;41976:24;;41895:113;:::o;29977:339::-;30172:41;30191:12;:10;:12::i;:::-;30205:7;30172:18;:41::i;:::-;30164:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30280:28;30290:4;30296:2;30300:7;30280:9;:28::i;:::-;29977:339;;;:::o;56022:71::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56083:4:::1;56069:11;;:18;;;;;;;;;;;;;;;;;;56022:71::o:0;41563:256::-;41660:7;41696:23;41713:5;41696:16;:23::i;:::-;41688:5;:31;41680:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41785:12;:19;41798:5;41785:19;;;;;;;;;;;;;;;:26;41805:5;41785:26;;;;;;;;;;;;41778:33;;41563:256;;;;:::o;55702:111::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55746:8:::1;;;;;;;;;;;:17;;;55764:7;:5;:7::i;:::-;55773:8;;;;;;;;;;;:18;;;55800:4;55773:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55746:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55702:111::o:0;30387:185::-;30525:39;30542:4;30548:2;30552:7;30525:39;;;;;;;;;;;;:16;:39::i;:::-;30387:185;;;:::o;54776:26::-;;;;:::o;42085:233::-;42160:7;42196:30;:28;:30::i;:::-;42188:5;:38;42180:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42293:10;42304:5;42293:17;;;;;;;;;;;;;;;;;;;;;;;;42286:24;;42085:233;;;:::o;55921:95::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56001:10:::1;55991:7;:20;;;;;;;;;;;;:::i;:::-;;55921:95:::0;:::o;27362:239::-;27434:7;27454:13;27470:7;:16;27478:7;27470:16;;;;;;;;;;;;;;;;;;;;;27454:32;;27522:1;27505:19;;:5;:19;;;;27497:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27588:5;27581:12;;;27362:239;;;:::o;54649:50::-;54685:14;54649:50;:::o;54807:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54743:28::-;;;;:::o;27092:208::-;27164:7;27209:1;27192:19;;:5;:19;;;;27184:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27276:9;:16;27286:5;27276:16;;;;;;;;;;;;;;;;27269:23;;27092:208;;;:::o;2645:103::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2710:30:::1;2737:1;2710:18;:30::i;:::-;2645:103::o:0;1994:87::-;2040:7;2067:6;;;;;;;;;;;2060:13;;1994:87;:::o;27837:104::-;27893:13;27926:7;27919:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27837:104;:::o;55044:652::-;55107:11;;;;;;;;;;;55099:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;55173:10;;55157:12;:26;;55149:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54637:4;55236:12;55221;;:27;;;;:::i;:::-;:40;;55213:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55298:12;55313:27;54685:14;55313:12;:16;;:27;;;;:::i;:::-;55298:42;;55347:17;55367:8;;;;;;;;;;;:18;;;55386:10;55406:4;55367:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55347:65;;55440:4;55427:9;:17;;55419:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55485:8;;;;;;;;;;;:21;;;55507:10;55527:4;55534;55485:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55552:8;55548:143;55570:12;55566:1;:16;;;55548:143;;;55598:10;55626:1;55611:12;;:16;;;;:::i;:::-;55598:29;;55636:21;55642:10;55654:2;55636:5;:21::i;:::-;55682:1;55666:12;;:17;;;;;;;:::i;:::-;;;;;;;;55548:143;55584:3;;;;;:::i;:::-;;;;55548:143;;;;55044:652;;;:::o;29520:155::-;29615:52;29634:12;:10;:12::i;:::-;29648:8;29658;29615:18;:52::i;:::-;29520:155;;:::o;54707:31::-;;;;;;;;;;;;;:::o;30643:328::-;30818:41;30837:12;:10;:12::i;:::-;30851:7;30818:18;:41::i;:::-;30810:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30924:39;30938:4;30944:2;30948:7;30957:5;30924:13;:39::i;:::-;30643:328;;;;:::o;54894:22::-;;;;;;;;;;;;;:::o;28012:334::-;28085:13;28119:16;28127:7;28119;:16::i;:::-;28111:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28200:21;28224:10;:8;:10::i;:::-;28200:34;;28276:1;28258:7;28252:21;:25;:86;;;;;;;;;;;;;;;;;28304:7;28313:18;:7;:16;:18::i;:::-;28287:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28252:86;28245:93;;;28012:334;;;:::o;56099:72::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56160:5:::1;56146:11;;:19;;;;;;;;;;;;;;;;;;56099:72::o:0;54604:37::-;54637:4;54604:37;:::o;29746:164::-;29843:4;29867:18;:25;29886:5;29867:25;;;;;;;;;;;;;;;:35;29893:8;29867:35;;;;;;;;;;;;;;;;;;;;;;;;;29860:42;;29746:164;;;;:::o;2903:201::-;2225:12;:10;:12::i;:::-;2214:23;;:7;:5;:7::i;:::-;:23;;;2206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3012:1:::1;2992:22;;:8;:22;;;;2984:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3068:28;3087:8;3068:18;:28::i;:::-;2903:201:::0;:::o;26723:305::-;26825:4;26877:25;26862:40;;;:11;:40;;;;:105;;;;26934:33;26919:48;;;:11;:48;;;;26862:105;:158;;;;26984:36;27008:11;26984:23;:36::i;:::-;26862:158;26842:178;;26723:305;;;:::o;32481:127::-;32546:4;32598:1;32570:30;;:7;:16;32578:7;32570:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32563:37;;32481:127;;;:::o;714:98::-;767:7;794:10;787:17;;714:98;:::o;36463:174::-;36565:2;36538:15;:24;36554:7;36538:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36621:7;36617:2;36583:46;;36592:23;36607:7;36592:14;:23::i;:::-;36583:46;;;;;;;;;;;;36463:174;;:::o;32775:348::-;32868:4;32893:16;32901:7;32893;:16::i;:::-;32885:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32969:13;32985:23;33000:7;32985:14;:23::i;:::-;32969:39;;33038:5;33027:16;;:7;:16;;;:51;;;;33071:7;33047:31;;:20;33059:7;33047:11;:20::i;:::-;:31;;;33027:51;:87;;;;33082:32;33099:5;33106:7;33082:16;:32::i;:::-;33027:87;33019:96;;;32775:348;;;;:::o;35767:578::-;35926:4;35899:31;;:23;35914:7;35899:14;:23::i;:::-;:31;;;35891:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36009:1;35995:16;;:2;:16;;;;35987:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36065:39;36086:4;36092:2;36096:7;36065:20;:39::i;:::-;36169:29;36186:1;36190:7;36169:8;:29::i;:::-;36230:1;36211:9;:15;36221:4;36211:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36259:1;36242:9;:13;36252:2;36242:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36290:2;36271:7;:16;36279:7;36271:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36329:7;36325:2;36310:27;;36319:4;36310:27;;;;;;;;;;;;35767:578;;;:::o;3264:191::-;3338:16;3357:6;;;;;;;;;;;3338:25;;3383:8;3374:6;;:17;;;;;;;;;;;;;;;;;;3438:8;3407:40;;3428:8;3407:40;;;;;;;;;;;;3264:191;;:::o;51009:98::-;51067:7;51098:1;51094;:5;;;;:::i;:::-;51087:12;;51009:98;;;;:::o;34459:382::-;34553:1;34539:16;;:2;:16;;;;34531:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34612:16;34620:7;34612;:16::i;:::-;34611:17;34603:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34674:45;34703:1;34707:2;34711:7;34674:20;:45::i;:::-;34749:1;34732:9;:13;34742:2;34732:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34780:2;34761:7;:16;34769:7;34761:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34825:7;34821:2;34800:33;;34817:1;34800:33;;;;;;;;;;;;34459:382;;:::o;36779:315::-;36934:8;36925:17;;:5;:17;;;;36917:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37021:8;36983:18;:25;37002:5;36983:25;;;;;;;;;;;;;;;:35;37009:8;36983:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37067:8;37045:41;;37060:5;37045:41;;;37077:8;37045:41;;;;;;:::i;:::-;;;;;;;;36779:315;;;:::o;31853:::-;32010:28;32020:4;32026:2;32030:7;32010:9;:28::i;:::-;32057:48;32080:4;32086:2;32090:7;32099:5;32057:22;:48::i;:::-;32049:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31853:315;;;;:::o;55819:96::-;55871:13;55902:7;55895:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55819:96;:::o;22535:723::-;22591:13;22821:1;22812:5;:10;22808:53;;;22839:10;;;;;;;;;;;;;;;;;;;;;22808:53;22871:12;22886:5;22871:20;;22902:14;22927:78;22942:1;22934:4;:9;22927:78;;22960:8;;;;;:::i;:::-;;;;22991:2;22983:10;;;;;:::i;:::-;;;22927:78;;;23015:19;23047:6;23037:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23015:39;;23065:154;23081:1;23072:5;:10;23065:154;;23109:1;23099:11;;;;;:::i;:::-;;;23176:2;23168:5;:10;;;;:::i;:::-;23155:2;:24;;;;:::i;:::-;23142:39;;23125:6;23132;23125:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;23205:2;23196:11;;;;;:::i;:::-;;;23065:154;;;23243:6;23229:21;;;;;22535:723;;;;:::o;25163:157::-;25248:4;25287:25;25272:40;;;:11;:40;;;;25265:47;;25163:157;;;:::o;42931:589::-;43075:45;43102:4;43108:2;43112:7;43075:26;:45::i;:::-;43153:1;43137:18;;:4;:18;;;43133:187;;;43172:40;43204:7;43172:31;:40::i;:::-;43133:187;;;43242:2;43234:10;;:4;:10;;;43230:90;;43261:47;43294:4;43300:7;43261:32;:47::i;:::-;43230:90;43133:187;43348:1;43334:16;;:2;:16;;;43330:183;;;43367:45;43404:7;43367:36;:45::i;:::-;43330:183;;;43440:4;43434:10;;:2;:10;;;43430:83;;43461:40;43489:2;43493:7;43461:27;:40::i;:::-;43430:83;43330:183;42931:589;;;:::o;37659:799::-;37814:4;37835:15;:2;:13;;;:15::i;:::-;37831:620;;;37887:2;37871:36;;;37908:12;:10;:12::i;:::-;37922:4;37928:7;37937:5;37871:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37867:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38130:1;38113:6;:13;:18;38109:272;;;38156:60;;;;;;;;;;:::i;:::-;;;;;;;;38109:272;38331:6;38325:13;38316:6;38312:2;38308:15;38301:38;37867:529;38004:41;;;37994:51;;;:6;:51;;;;37987:58;;;;;37831:620;38435:4;38428:11;;37659:799;;;;;;;:::o;39030:126::-;;;;:::o;44243:164::-;44347:10;:17;;;;44320:15;:24;44336:7;44320:24;;;;;;;;;;;:44;;;;44375:10;44391:7;44375:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44243:164;:::o;45034:988::-;45300:22;45350:1;45325:22;45342:4;45325:16;:22::i;:::-;:26;;;;:::i;:::-;45300:51;;45362:18;45383:17;:26;45401:7;45383:26;;;;;;;;;;;;45362:47;;45530:14;45516:10;:28;45512:328;;45561:19;45583:12;:18;45596:4;45583:18;;;;;;;;;;;;;;;:34;45602:14;45583:34;;;;;;;;;;;;45561:56;;45667:11;45634:12;:18;45647:4;45634:18;;;;;;;;;;;;;;;:30;45653:10;45634:30;;;;;;;;;;;:44;;;;45784:10;45751:17;:30;45769:11;45751:30;;;;;;;;;;;:43;;;;45512:328;;45936:17;:26;45954:7;45936:26;;;;;;;;;;;45929:33;;;45980:12;:18;45993:4;45980:18;;;;;;;;;;;;;;;:34;45999:14;45980:34;;;;;;;;;;;45973:41;;;45034:988;;;;:::o;46317:1079::-;46570:22;46615:1;46595:10;:17;;;;:21;;;;:::i;:::-;46570:46;;46627:18;46648:15;:24;46664:7;46648:24;;;;;;;;;;;;46627:45;;46999:19;47021:10;47032:14;47021:26;;;;;;;;;;;;;;;;;;;;;;;;46999:48;;47085:11;47060:10;47071;47060:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;47196:10;47165:15;:28;47181:11;47165:28;;;;;;;;;;;:41;;;;47337:15;:24;47353:7;47337:24;;;;;;;;;;;47330:31;;;47372:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46317:1079;;;;:::o;43821:221::-;43906:14;43923:20;43940:2;43923:16;:20::i;:::-;43906:37;;43981:7;43954:12;:16;43967:2;43954:16;;;;;;;;;;;;;;;:24;43971:6;43954:24;;;;;;;;;;;:34;;;;44028:6;43999:17;:26;44017:7;43999:26;;;;;;;;;;;:35;;;;43821:221;;;:::o;14833:387::-;14893:4;15101:12;15168:7;15156:20;15148:28;;15211:1;15204:4;:8;15197:15;;;14833:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1045:5;1076:6;1070:13;1061:22;;1092:30;1116:5;1092:30;:::i;:::-;1051:77;;;;:::o;1134:137::-;1179:5;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;1333:5;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;1492:5;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;1784:5;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;2053:5;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:143::-;2209:5;2240:6;2234:13;2225:22;;2256:33;2283:5;2256:33;:::i;:::-;2215:80;;;;:::o;2301:262::-;2360:6;2409:2;2397:9;2388:7;2384:23;2380:32;2377:2;;;2425:1;2422;2415:12;2377:2;2468:1;2493:53;2538:7;2529:6;2518:9;2514:22;2493:53;:::i;:::-;2483:63;;2439:117;2367:196;;;;:::o;2569:407::-;2637:6;2645;2694:2;2682:9;2673:7;2669:23;2665:32;2662:2;;;2710:1;2707;2700:12;2662:2;2753:1;2778:53;2823:7;2814:6;2803:9;2799:22;2778:53;:::i;:::-;2768:63;;2724:117;2880:2;2906:53;2951:7;2942:6;2931:9;2927:22;2906:53;:::i;:::-;2896:63;;2851:118;2652:324;;;;;:::o;2982:552::-;3059:6;3067;3075;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;3140:1;3137;3130:12;3092:2;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;3310:2;3336:53;3381:7;3372:6;3361:9;3357:22;3336:53;:::i;:::-;3326:63;;3281:118;3438:2;3464:53;3509:7;3500:6;3489:9;3485:22;3464:53;:::i;:::-;3454:63;;3409:118;3082:452;;;;;:::o;3540:809::-;3635:6;3643;3651;3659;3708:3;3696:9;3687:7;3683:23;3679:33;3676:2;;;3725:1;3722;3715:12;3676:2;3768:1;3793:53;3838:7;3829:6;3818:9;3814:22;3793:53;:::i;:::-;3783:63;;3739:117;3895:2;3921:53;3966:7;3957:6;3946:9;3942:22;3921:53;:::i;:::-;3911:63;;3866:118;4023:2;4049:53;4094:7;4085:6;4074:9;4070:22;4049:53;:::i;:::-;4039:63;;3994:118;4179:2;4168:9;4164:18;4151:32;4210:18;4202:6;4199:30;4196:2;;;4242:1;4239;4232:12;4196:2;4270:62;4324:7;4315:6;4304:9;4300:22;4270:62;:::i;:::-;4260:72;;4122:220;3666:683;;;;;;;:::o;4355:401::-;4420:6;4428;4477:2;4465:9;4456:7;4452:23;4448:32;4445:2;;;4493:1;4490;4483:12;4445:2;4536:1;4561:53;4606:7;4597:6;4586:9;4582:22;4561:53;:::i;:::-;4551:63;;4507:117;4663:2;4689:50;4731:7;4722:6;4711:9;4707:22;4689:50;:::i;:::-;4679:60;;4634:115;4435:321;;;;;:::o;4762:407::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:2;;;4903:1;4900;4893:12;4855:2;4946:1;4971:53;5016:7;5007:6;4996:9;4992:22;4971:53;:::i;:::-;4961:63;;4917:117;5073:2;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;:::i;:::-;5089:63;;5044:118;4845:324;;;;;:::o;5175:278::-;5242:6;5291:2;5279:9;5270:7;5266:23;5262:32;5259:2;;;5307:1;5304;5297:12;5259:2;5350:1;5375:61;5428:7;5419:6;5408:9;5404:22;5375:61;:::i;:::-;5365:71;;5321:125;5249:204;;;;:::o;5459:260::-;5517:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:2;;;5582:1;5579;5572:12;5534:2;5625:1;5650:52;5694:7;5685:6;5674:9;5670:22;5650:52;:::i;:::-;5640:62;;5596:116;5524:195;;;;:::o;5725:282::-;5794:6;5843:2;5831:9;5822:7;5818:23;5814:32;5811:2;;;5859:1;5856;5849:12;5811:2;5902:1;5927:63;5982:7;5973:6;5962:9;5958:22;5927:63;:::i;:::-;5917:73;;5873:127;5801:206;;;;:::o;6013:375::-;6082:6;6131:2;6119:9;6110:7;6106:23;6102:32;6099:2;;;6147:1;6144;6137:12;6099:2;6218:1;6207:9;6203:17;6190:31;6248:18;6240:6;6237:30;6234:2;;;6280:1;6277;6270:12;6234:2;6308:63;6363:7;6354:6;6343:9;6339:22;6308:63;:::i;:::-;6298:73;;6161:220;6089:299;;;;:::o;6394:262::-;6453:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:2;;;6518:1;6515;6508:12;6470:2;6561:1;6586:53;6631:7;6622:6;6611:9;6607:22;6586:53;:::i;:::-;6576:63;;6532:117;6460:196;;;;:::o;6662:284::-;6732:6;6781:2;6769:9;6760:7;6756:23;6752:32;6749:2;;;6797:1;6794;6787:12;6749:2;6840:1;6865:64;6921:7;6912:6;6901:9;6897:22;6865:64;:::i;:::-;6855:74;;6811:128;6739:207;;;;:::o;6952:118::-;7039:24;7057:5;7039:24;:::i;:::-;7034:3;7027:37;7017:53;;:::o;7076:109::-;7157:21;7172:5;7157:21;:::i;:::-;7152:3;7145:34;7135:50;;:::o;7191:360::-;7277:3;7305:38;7337:5;7305:38;:::i;:::-;7359:70;7422:6;7417:3;7359:70;:::i;:::-;7352:77;;7438:52;7483:6;7478:3;7471:4;7464:5;7460:16;7438:52;:::i;:::-;7515:29;7537:6;7515:29;:::i;:::-;7510:3;7506:39;7499:46;;7281:270;;;;;:::o;7557:159::-;7658:51;7703:5;7658:51;:::i;:::-;7653:3;7646:64;7636:80;;:::o;7722:364::-;7810:3;7838:39;7871:5;7838:39;:::i;:::-;7893:71;7957:6;7952:3;7893:71;:::i;:::-;7886:78;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7814:272;;;;;:::o;8092:377::-;8198:3;8226:39;8259:5;8226:39;:::i;:::-;8281:89;8363:6;8358:3;8281:89;:::i;:::-;8274:96;;8379:52;8424:6;8419:3;8412:4;8405:5;8401:16;8379:52;:::i;:::-;8456:6;8451:3;8447:16;8440:23;;8202:267;;;;;:::o;8475:366::-;8617:3;8638:67;8702:2;8697:3;8638:67;:::i;:::-;8631:74;;8714:93;8803:3;8714:93;:::i;:::-;8832:2;8827:3;8823:12;8816:19;;8621:220;;;:::o;8847:366::-;8989:3;9010:67;9074:2;9069:3;9010:67;:::i;:::-;9003:74;;9086:93;9175:3;9086:93;:::i;:::-;9204:2;9199:3;9195:12;9188:19;;8993:220;;;:::o;9219:366::-;9361:3;9382:67;9446:2;9441:3;9382:67;:::i;:::-;9375:74;;9458:93;9547:3;9458:93;:::i;:::-;9576:2;9571:3;9567:12;9560:19;;9365:220;;;:::o;9591:366::-;9733:3;9754:67;9818:2;9813:3;9754:67;:::i;:::-;9747:74;;9830:93;9919:3;9830:93;:::i;:::-;9948:2;9943:3;9939:12;9932:19;;9737:220;;;:::o;9963:366::-;10105:3;10126:67;10190:2;10185:3;10126:67;:::i;:::-;10119:74;;10202:93;10291:3;10202:93;:::i;:::-;10320:2;10315:3;10311:12;10304:19;;10109:220;;;:::o;10335:366::-;10477:3;10498:67;10562:2;10557:3;10498:67;:::i;:::-;10491:74;;10574:93;10663:3;10574:93;:::i;:::-;10692:2;10687:3;10683:12;10676:19;;10481:220;;;:::o;10707:366::-;10849:3;10870:67;10934:2;10929:3;10870:67;:::i;:::-;10863:74;;10946:93;11035:3;10946:93;:::i;:::-;11064:2;11059:3;11055:12;11048:19;;10853:220;;;:::o;11079:366::-;11221:3;11242:67;11306:2;11301:3;11242:67;:::i;:::-;11235:74;;11318:93;11407:3;11318:93;:::i;:::-;11436:2;11431:3;11427:12;11420:19;;11225:220;;;:::o;11451:366::-;11593:3;11614:67;11678:2;11673:3;11614:67;:::i;:::-;11607:74;;11690:93;11779:3;11690:93;:::i;:::-;11808:2;11803:3;11799:12;11792:19;;11597:220;;;:::o;11823:366::-;11965:3;11986:67;12050:2;12045:3;11986:67;:::i;:::-;11979:74;;12062:93;12151:3;12062:93;:::i;:::-;12180:2;12175:3;12171:12;12164:19;;11969:220;;;:::o;12195:366::-;12337:3;12358:67;12422:2;12417:3;12358:67;:::i;:::-;12351:74;;12434:93;12523:3;12434:93;:::i;:::-;12552:2;12547:3;12543:12;12536:19;;12341:220;;;:::o;12567:366::-;12709:3;12730:67;12794:2;12789:3;12730:67;:::i;:::-;12723:74;;12806:93;12895:3;12806:93;:::i;:::-;12924:2;12919:3;12915:12;12908:19;;12713:220;;;:::o;12939:366::-;13081:3;13102:67;13166:2;13161:3;13102:67;:::i;:::-;13095:74;;13178:93;13267:3;13178:93;:::i;:::-;13296:2;13291:3;13287:12;13280:19;;13085:220;;;:::o;13311:366::-;13453:3;13474:67;13538:2;13533:3;13474:67;:::i;:::-;13467:74;;13550:93;13639:3;13550:93;:::i;:::-;13668:2;13663:3;13659:12;13652:19;;13457:220;;;:::o;13683:366::-;13825:3;13846:67;13910:2;13905:3;13846:67;:::i;:::-;13839:74;;13922:93;14011:3;13922:93;:::i;:::-;14040:2;14035:3;14031:12;14024:19;;13829:220;;;:::o;14055:366::-;14197:3;14218:67;14282:2;14277:3;14218:67;:::i;:::-;14211:74;;14294:93;14383:3;14294:93;:::i;:::-;14412:2;14407:3;14403:12;14396:19;;14201:220;;;:::o;14427:366::-;14569:3;14590:67;14654:2;14649:3;14590:67;:::i;:::-;14583:74;;14666:93;14755:3;14666:93;:::i;:::-;14784:2;14779:3;14775:12;14768:19;;14573:220;;;:::o;14799:366::-;14941:3;14962:67;15026:2;15021:3;14962:67;:::i;:::-;14955:74;;15038:93;15127:3;15038:93;:::i;:::-;15156:2;15151:3;15147:12;15140:19;;14945:220;;;:::o;15171:366::-;15313:3;15334:67;15398:2;15393:3;15334:67;:::i;:::-;15327:74;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15317:220;;;:::o;15543:366::-;15685:3;15706:67;15770:2;15765:3;15706:67;:::i;:::-;15699:74;;15782:93;15871:3;15782:93;:::i;:::-;15900:2;15895:3;15891:12;15884:19;;15689:220;;;:::o;15915:366::-;16057:3;16078:67;16142:2;16137:3;16078:67;:::i;:::-;16071:74;;16154:93;16243:3;16154:93;:::i;:::-;16272:2;16267:3;16263:12;16256:19;;16061:220;;;:::o;16287:366::-;16429:3;16450:67;16514:2;16509:3;16450:67;:::i;:::-;16443:74;;16526:93;16615:3;16526:93;:::i;:::-;16644:2;16639:3;16635:12;16628:19;;16433:220;;;:::o;16659:118::-;16746:24;16764:5;16746:24;:::i;:::-;16741:3;16734:37;16724:53;;:::o;16783:435::-;16963:3;16985:95;17076:3;17067:6;16985:95;:::i;:::-;16978:102;;17097:95;17188:3;17179:6;17097:95;:::i;:::-;17090:102;;17209:3;17202:10;;16967:251;;;;;:::o;17224:222::-;17317:4;17355:2;17344:9;17340:18;17332:26;;17368:71;17436:1;17425:9;17421:17;17412:6;17368:71;:::i;:::-;17322:124;;;;:::o;17452:332::-;17573:4;17611:2;17600:9;17596:18;17588:26;;17624:71;17692:1;17681:9;17677:17;17668:6;17624:71;:::i;:::-;17705:72;17773:2;17762:9;17758:18;17749:6;17705:72;:::i;:::-;17578:206;;;;;:::o;17790:442::-;17939:4;17977:2;17966:9;17962:18;17954:26;;17990:71;18058:1;18047:9;18043:17;18034:6;17990:71;:::i;:::-;18071:72;18139:2;18128:9;18124:18;18115:6;18071:72;:::i;:::-;18153;18221:2;18210:9;18206:18;18197:6;18153:72;:::i;:::-;17944:288;;;;;;:::o;18238:640::-;18433:4;18471:3;18460:9;18456:19;18448:27;;18485:71;18553:1;18542:9;18538:17;18529:6;18485:71;:::i;:::-;18566:72;18634:2;18623:9;18619:18;18610:6;18566:72;:::i;:::-;18648;18716:2;18705:9;18701:18;18692:6;18648:72;:::i;:::-;18767:9;18761:4;18757:20;18752:2;18741:9;18737:18;18730:48;18795:76;18866:4;18857:6;18795:76;:::i;:::-;18787:84;;18438:440;;;;;;;:::o;18884:332::-;19005:4;19043:2;19032:9;19028:18;19020:26;;19056:71;19124:1;19113:9;19109:17;19100:6;19056:71;:::i;:::-;19137:72;19205:2;19194:9;19190:18;19181:6;19137:72;:::i;:::-;19010:206;;;;;:::o;19222:210::-;19309:4;19347:2;19336:9;19332:18;19324:26;;19360:65;19422:1;19411:9;19407:17;19398:6;19360:65;:::i;:::-;19314:118;;;;:::o;19438:250::-;19545:4;19583:2;19572:9;19568:18;19560:26;;19596:85;19678:1;19667:9;19663:17;19654:6;19596:85;:::i;:::-;19550:138;;;;:::o;19694:313::-;19807:4;19845:2;19834:9;19830:18;19822:26;;19894:9;19888:4;19884:20;19880:1;19869:9;19865:17;19858:47;19922:78;19995:4;19986:6;19922:78;:::i;:::-;19914:86;;19812:195;;;;:::o;20013:419::-;20179:4;20217:2;20206:9;20202:18;20194:26;;20266:9;20260:4;20256:20;20252:1;20241:9;20237:17;20230:47;20294:131;20420:4;20294:131;:::i;:::-;20286:139;;20184:248;;;:::o;20438:419::-;20604:4;20642:2;20631:9;20627:18;20619:26;;20691:9;20685:4;20681:20;20677:1;20666:9;20662:17;20655:47;20719:131;20845:4;20719:131;:::i;:::-;20711:139;;20609:248;;;:::o;20863:419::-;21029:4;21067:2;21056:9;21052:18;21044:26;;21116:9;21110:4;21106:20;21102:1;21091:9;21087:17;21080:47;21144:131;21270:4;21144:131;:::i;:::-;21136:139;;21034:248;;;:::o;21288:419::-;21454:4;21492:2;21481:9;21477:18;21469:26;;21541:9;21535:4;21531:20;21527:1;21516:9;21512:17;21505:47;21569:131;21695:4;21569:131;:::i;:::-;21561:139;;21459:248;;;:::o;21713:419::-;21879:4;21917:2;21906:9;21902:18;21894:26;;21966:9;21960:4;21956:20;21952:1;21941:9;21937:17;21930:47;21994:131;22120:4;21994:131;:::i;:::-;21986:139;;21884:248;;;:::o;22138:419::-;22304:4;22342:2;22331:9;22327:18;22319:26;;22391:9;22385:4;22381:20;22377:1;22366:9;22362:17;22355:47;22419:131;22545:4;22419:131;:::i;:::-;22411:139;;22309:248;;;:::o;22563:419::-;22729:4;22767:2;22756:9;22752:18;22744:26;;22816:9;22810:4;22806:20;22802:1;22791:9;22787:17;22780:47;22844:131;22970:4;22844:131;:::i;:::-;22836:139;;22734:248;;;:::o;22988:419::-;23154:4;23192:2;23181:9;23177:18;23169:26;;23241:9;23235:4;23231:20;23227:1;23216:9;23212:17;23205:47;23269:131;23395:4;23269:131;:::i;:::-;23261:139;;23159:248;;;:::o;23413:419::-;23579:4;23617:2;23606:9;23602:18;23594:26;;23666:9;23660:4;23656:20;23652:1;23641:9;23637:17;23630:47;23694:131;23820:4;23694:131;:::i;:::-;23686:139;;23584:248;;;:::o;23838:419::-;24004:4;24042:2;24031:9;24027:18;24019:26;;24091:9;24085:4;24081:20;24077:1;24066:9;24062:17;24055:47;24119:131;24245:4;24119:131;:::i;:::-;24111:139;;24009:248;;;:::o;24263:419::-;24429:4;24467:2;24456:9;24452:18;24444:26;;24516:9;24510:4;24506:20;24502:1;24491:9;24487:17;24480:47;24544:131;24670:4;24544:131;:::i;:::-;24536:139;;24434:248;;;:::o;24688:419::-;24854:4;24892:2;24881:9;24877:18;24869:26;;24941:9;24935:4;24931:20;24927:1;24916:9;24912:17;24905:47;24969:131;25095:4;24969:131;:::i;:::-;24961:139;;24859:248;;;:::o;25113:419::-;25279:4;25317:2;25306:9;25302:18;25294:26;;25366:9;25360:4;25356:20;25352:1;25341:9;25337:17;25330:47;25394:131;25520:4;25394:131;:::i;:::-;25386:139;;25284:248;;;:::o;25538:419::-;25704:4;25742:2;25731:9;25727:18;25719:26;;25791:9;25785:4;25781:20;25777:1;25766:9;25762:17;25755:47;25819:131;25945:4;25819:131;:::i;:::-;25811:139;;25709:248;;;:::o;25963:419::-;26129:4;26167:2;26156:9;26152:18;26144:26;;26216:9;26210:4;26206:20;26202:1;26191:9;26187:17;26180:47;26244:131;26370:4;26244:131;:::i;:::-;26236:139;;26134:248;;;:::o;26388:419::-;26554:4;26592:2;26581:9;26577:18;26569:26;;26641:9;26635:4;26631:20;26627:1;26616:9;26612:17;26605:47;26669:131;26795:4;26669:131;:::i;:::-;26661:139;;26559:248;;;:::o;26813:419::-;26979:4;27017:2;27006:9;27002:18;26994:26;;27066:9;27060:4;27056:20;27052:1;27041:9;27037:17;27030:47;27094:131;27220:4;27094:131;:::i;:::-;27086:139;;26984:248;;;:::o;27238:419::-;27404:4;27442:2;27431:9;27427:18;27419:26;;27491:9;27485:4;27481:20;27477:1;27466:9;27462:17;27455:47;27519:131;27645:4;27519:131;:::i;:::-;27511:139;;27409:248;;;:::o;27663:419::-;27829:4;27867:2;27856:9;27852:18;27844:26;;27916:9;27910:4;27906:20;27902:1;27891:9;27887:17;27880:47;27944:131;28070:4;27944:131;:::i;:::-;27936:139;;27834:248;;;:::o;28088:419::-;28254:4;28292:2;28281:9;28277:18;28269:26;;28341:9;28335:4;28331:20;28327:1;28316:9;28312:17;28305:47;28369:131;28495:4;28369:131;:::i;:::-;28361:139;;28259:248;;;:::o;28513:419::-;28679:4;28717:2;28706:9;28702:18;28694:26;;28766:9;28760:4;28756:20;28752:1;28741:9;28737:17;28730:47;28794:131;28920:4;28794:131;:::i;:::-;28786:139;;28684:248;;;:::o;28938:419::-;29104:4;29142:2;29131:9;29127:18;29119:26;;29191:9;29185:4;29181:20;29177:1;29166:9;29162:17;29155:47;29219:131;29345:4;29219:131;:::i;:::-;29211:139;;29109:248;;;:::o;29363:222::-;29456:4;29494:2;29483:9;29479:18;29471:26;;29507:71;29575:1;29564:9;29560:17;29551:6;29507:71;:::i;:::-;29461:124;;;;:::o;29591:129::-;29625:6;29652:20;;:::i;:::-;29642:30;;29681:33;29709:4;29701:6;29681:33;:::i;:::-;29632:88;;;:::o;29726:75::-;29759:6;29792:2;29786:9;29776:19;;29766:35;:::o;29807:307::-;29868:4;29958:18;29950:6;29947:30;29944:2;;;29980:18;;:::i;:::-;29944:2;30018:29;30040:6;30018:29;:::i;:::-;30010:37;;30102:4;30096;30092:15;30084:23;;29873:241;;;:::o;30120:308::-;30182:4;30272:18;30264:6;30261:30;30258:2;;;30294:18;;:::i;:::-;30258:2;30332:29;30354:6;30332:29;:::i;:::-;30324:37;;30416:4;30410;30406:15;30398:23;;30187:241;;;:::o;30434:98::-;30485:6;30519:5;30513:12;30503:22;;30492:40;;;:::o;30538:99::-;30590:6;30624:5;30618:12;30608:22;;30597:40;;;:::o;30643:168::-;30726:11;30760:6;30755:3;30748:19;30800:4;30795:3;30791:14;30776:29;;30738:73;;;;:::o;30817:169::-;30901:11;30935:6;30930:3;30923:19;30975:4;30970:3;30966:14;30951:29;;30913:73;;;;:::o;30992:148::-;31094:11;31131:3;31116:18;;31106:34;;;;:::o;31146:305::-;31186:3;31205:20;31223:1;31205:20;:::i;:::-;31200:25;;31239:20;31257:1;31239:20;:::i;:::-;31234:25;;31393:1;31325:66;31321:74;31318:1;31315:81;31312:2;;;31399:18;;:::i;:::-;31312:2;31443:1;31440;31436:9;31429:16;;31190:261;;;;:::o;31457:185::-;31497:1;31514:20;31532:1;31514:20;:::i;:::-;31509:25;;31548:20;31566:1;31548:20;:::i;:::-;31543:25;;31587:1;31577:2;;31592:18;;:::i;:::-;31577:2;31634:1;31631;31627:9;31622:14;;31499:143;;;;:::o;31648:348::-;31688:7;31711:20;31729:1;31711:20;:::i;:::-;31706:25;;31745:20;31763:1;31745:20;:::i;:::-;31740:25;;31933:1;31865:66;31861:74;31858:1;31855:81;31850:1;31843:9;31836:17;31832:105;31829:2;;;31940:18;;:::i;:::-;31829:2;31988:1;31985;31981:9;31970:20;;31696:300;;;;:::o;32002:191::-;32042:4;32062:20;32080:1;32062:20;:::i;:::-;32057:25;;32096:20;32114:1;32096:20;:::i;:::-;32091:25;;32135:1;32132;32129:8;32126:2;;;32140:18;;:::i;:::-;32126:2;32185:1;32182;32178:9;32170:17;;32047:146;;;;:::o;32199:96::-;32236:7;32265:24;32283:5;32265:24;:::i;:::-;32254:35;;32244:51;;;:::o;32301:90::-;32335:7;32378:5;32371:13;32364:21;32353:32;;32343:48;;;:::o;32397:149::-;32433:7;32473:66;32466:5;32462:78;32451:89;;32441:105;;;:::o;32552:89::-;32588:7;32628:6;32621:5;32617:18;32606:29;;32596:45;;;:::o;32647:126::-;32684:7;32724:42;32717:5;32713:54;32702:65;;32692:81;;;:::o;32779:77::-;32816:7;32845:5;32834:16;;32824:32;;;:::o;32862:154::-;32926:9;32959:51;33004:5;32959:51;:::i;:::-;32946:64;;32936:80;;;:::o;33022:127::-;33086:9;33119:24;33137:5;33119:24;:::i;:::-;33106:37;;33096:53;;;:::o;33155:154::-;33239:6;33234:3;33229;33216:30;33301:1;33292:6;33287:3;33283:16;33276:27;33206:103;;;:::o;33315:307::-;33383:1;33393:113;33407:6;33404:1;33401:13;33393:113;;;33492:1;33487:3;33483:11;33477:18;33473:1;33468:3;33464:11;33457:39;33429:2;33426:1;33422:10;33417:15;;33393:113;;;33524:6;33521:1;33518:13;33515:2;;;33604:1;33595:6;33590:3;33586:16;33579:27;33515:2;33364:258;;;;:::o;33628:320::-;33672:6;33709:1;33703:4;33699:12;33689:22;;33756:1;33750:4;33746:12;33777:18;33767:2;;33833:4;33825:6;33821:17;33811:27;;33767:2;33895;33887:6;33884:14;33864:18;33861:38;33858:2;;;33914:18;;:::i;:::-;33858:2;33679:269;;;;:::o;33954:281::-;34037:27;34059:4;34037:27;:::i;:::-;34029:6;34025:40;34167:6;34155:10;34152:22;34131:18;34119:10;34116:34;34113:62;34110:2;;;34178:18;;:::i;:::-;34110:2;34218:10;34214:2;34207:22;33997:238;;;:::o;34241:171::-;34279:3;34302:23;34319:5;34302:23;:::i;:::-;34293:32;;34347:6;34340:5;34337:17;34334:2;;;34357:18;;:::i;:::-;34334:2;34404:1;34397:5;34393:13;34386:20;;34283:129;;;:::o;34418:233::-;34457:3;34480:24;34498:5;34480:24;:::i;:::-;34471:33;;34526:66;34519:5;34516:77;34513:2;;;34596:18;;:::i;:::-;34513:2;34643:1;34636:5;34632:13;34625:20;;34461:190;;;:::o;34657:176::-;34689:1;34706:20;34724:1;34706:20;:::i;:::-;34701:25;;34740:20;34758:1;34740:20;:::i;:::-;34735:25;;34779:1;34769:2;;34784:18;;:::i;:::-;34769:2;34825:1;34822;34818:9;34813:14;;34691:142;;;;:::o;34839:180::-;34887:77;34884:1;34877:88;34984:4;34981:1;34974:15;35008:4;35005:1;34998:15;35025:180;35073:77;35070:1;35063:88;35170:4;35167:1;35160:15;35194:4;35191:1;35184:15;35211:180;35259:77;35256:1;35249:88;35356:4;35353:1;35346:15;35380:4;35377:1;35370:15;35397:180;35445:77;35442:1;35435:88;35542:4;35539:1;35532:15;35566:4;35563:1;35556:15;35583:102;35624:6;35675:2;35671:7;35666:2;35659:5;35655:14;35651:28;35641:38;;35631:54;;;:::o;35691:230::-;35831:34;35827:1;35819:6;35815:14;35808:58;35900:13;35895:2;35887:6;35883:15;35876:38;35797:124;:::o;35927:237::-;36067:34;36063:1;36055:6;36051:14;36044:58;36136:20;36131:2;36123:6;36119:15;36112:45;36033:131;:::o;36170:225::-;36310:34;36306:1;36298:6;36294:14;36287:58;36379:8;36374:2;36366:6;36362:15;36355:33;36276:119;:::o;36401:178::-;36541:30;36537:1;36529:6;36525:14;36518:54;36507:72;:::o;36585:177::-;36725:29;36721:1;36713:6;36709:14;36702:53;36691:71;:::o;36768:223::-;36908:34;36904:1;36896:6;36892:14;36885:58;36977:6;36972:2;36964:6;36960:15;36953:31;36874:117;:::o;36997:175::-;37137:27;37133:1;37125:6;37121:14;37114:51;37103:69;:::o;37178:231::-;37318:34;37314:1;37306:6;37302:14;37295:58;37387:14;37382:2;37374:6;37370:15;37363:39;37284:125;:::o;37415:243::-;37555:34;37551:1;37543:6;37539:14;37532:58;37624:26;37619:2;37611:6;37607:15;37600:51;37521:137;:::o;37664:229::-;37804:34;37800:1;37792:6;37788:14;37781:58;37873:12;37868:2;37860:6;37856:15;37849:37;37770:123;:::o;37899:228::-;38039:34;38035:1;38027:6;38023:14;38016:58;38108:11;38103:2;38095:6;38091:15;38084:36;38005:122;:::o;38133:169::-;38273:21;38269:1;38261:6;38257:14;38250:45;38239:63;:::o;38308:182::-;38448:34;38444:1;38436:6;38432:14;38425:58;38414:76;:::o;38496:231::-;38636:34;38632:1;38624:6;38620:14;38613:58;38705:14;38700:2;38692:6;38688:15;38681:39;38602:125;:::o;38733:182::-;38873:34;38869:1;38861:6;38857:14;38850:58;38839:76;:::o;38921:228::-;39061:34;39057:1;39049:6;39045:14;39038:58;39130:11;39125:2;39117:6;39113:15;39106:36;39027:122;:::o;39155:234::-;39295:34;39291:1;39283:6;39279:14;39272:58;39364:17;39359:2;39351:6;39347:15;39340:42;39261:128;:::o;39395:220::-;39535:34;39531:1;39523:6;39519:14;39512:58;39604:3;39599:2;39591:6;39587:15;39580:28;39501:114;:::o;39621:168::-;39761:20;39757:1;39749:6;39745:14;39738:44;39727:62;:::o;39795:236::-;39935:34;39931:1;39923:6;39919:14;39912:58;40004:19;39999:2;39991:6;39987:15;39980:44;39901:130;:::o;40037:173::-;40177:25;40173:1;40165:6;40161:14;40154:49;40143:67;:::o;40216:231::-;40356:34;40352:1;40344:6;40340:14;40333:58;40425:14;40420:2;40412:6;40408:15;40401:39;40322:125;:::o;40453:122::-;40526:24;40544:5;40526:24;:::i;:::-;40519:5;40516:35;40506:2;;40565:1;40562;40555:12;40506:2;40496:79;:::o;40581:116::-;40651:21;40666:5;40651:21;:::i;:::-;40644:5;40641:32;40631:2;;40687:1;40684;40677:12;40631:2;40621:76;:::o;40703:120::-;40775:23;40792:5;40775:23;:::i;:::-;40768:5;40765:34;40755:2;;40813:1;40810;40803:12;40755:2;40745:78;:::o;40829:122::-;40902:24;40920:5;40902:24;:::i;:::-;40895:5;40892:35;40882:2;;40941:1;40938;40931:12;40882:2;40872:79;:::o

Swarm Source

ipfs://bee4cf6fd2022d4c4e49cc36e412e3b825d065a35b1dd7c0541fe7548b7b3ce3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.