ETH Price: $3,252.94 (+4.15%)
Gas: 2 Gwei

Token

Founders Card (FOUNDERS)
 

Overview

Max Total Supply

1,000 FOUNDERS

Holders

151

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 FOUNDERS
0x190a12bF6af95F814f0A030b3d83a9144Cd20954
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:
FoundersCard

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-20
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

}

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

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

library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

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

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

contract Ownable {

    address private owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

contract FoundersCard is Context, ERC165, IERC721, IERC721Metadata, Ownable {

    using Address for address;
    using SafeMath for uint256;

    // Token name
    string private constant _name = "Founders Card";

    // Token symbol
    string private constant _symbol = "FOUNDERS";

    // total number of NFTs Minted
    uint256 private _totalSupply;

    // max supply cap
    uint256 public constant MAX_SUPPLY = 1_000;

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

    // USDC Mint Token
    IERC20 public immutable USDC;

    // max holdings per wallet post mint
    uint256 private constant MAX_HOLDINGS = 5;

    // cost for minting NFT
    uint256 public cost = 500 * 10**6;

    // base URI
    string private _tokenURI = "Enter_Base_URI_Here.json";

    // Enable Trading
    bool public whitelistEnabled = true;

    // User Structure
    struct User {
        bool isWhitelisted;
        bool isGuaranteedWhitelisted;
        uint256 whitelistSlots;
        uint256 guaranteedSlots;
    }
    mapping ( address => User ) public userInfo;

    constructor (IERC20 usdc_) {
        USDC = usdc_;
    }

    ////////////////////////////////////////////////
    ///////////   RESTRICTED FUNCTIONS   ///////////
    ////////////////////////////////////////////////

    function disableWhitelist() external onlyOwner {
        whitelistEnabled = false;
    }

    function enableWhitelist() external onlyOwner {
        whitelistEnabled = true;
    }

    function withdraw() external onlyOwner {
        (bool s,) = payable(msg.sender).call{value: address(this).balance}("");
        require(s);
    }

    function withdrawToken(address token) external onlyOwner {
        require(token != address(0), 'Zero Address');
        IERC20(token).transfer(msg.sender, IERC20(token).balanceOf(address(this)));
    }

    function withdrawUSDC() external onlyOwner {
        USDC.transfer(msg.sender, USDC.balanceOf(address(this)));
    }

    function setCost(uint256 newCost) external onlyOwner {
        cost = newCost;
    }

    function setTokenURI(string calldata newURI) external onlyOwner {
        _tokenURI = newURI;
    }

    function whitelistUsers(address[] calldata users) external onlyOwner {
        uint len = users.length;
        for (uint i = 0; i < len; i++) {
            userInfo[users[i]].isWhitelisted = true;
        }
    }

    function guaranteeWhitelistUsers(address[] calldata users) external onlyOwner {
        uint len = users.length;
        for (uint i = 0; i < len; i++) {
            userInfo[users[i]].isGuaranteedWhitelisted = true;
        }
    }

    ////////////////////////////////////////////////
    ///////////     PUBLIC FUNCTIONS     ///////////
    ////////////////////////////////////////////////

    /** 
     * Mints `nMints` NFTs To Caller
     */
    function mint(uint256 nMints) external {
        require(
            !whitelistEnabled, 
            'White list is enabled'
        );
        require(
            nMints > 0 && nMints <= 3, 
            'Invalid Input'
        );

        // transfer in USDC
        uint256 received = _transferIn(nMints * cost);
        require(cost * nMints <= received, 'Incorrect Value Sent');

        for (uint i = 0; i < nMints; i++) {
            _safeMint(msg.sender, _totalSupply);
        }

        require(
            _balances[msg.sender] <= MAX_HOLDINGS,
            'Max Holdings Exceeded'
        );
    }

    /** 
     * Mints `nMints` NFTs To Caller
     */
    function mintWhitelist(uint256 nMints) external {
        require(
            whitelistEnabled,
            'White list is not enabled'
        );
        require(
            userInfo[msg.sender].isWhitelisted,
            'Not Whitelisted'
        );
        require(
            nMints > 0,
            'Zero Mints'
        );

        userInfo[msg.sender].whitelistSlots += nMints;
        require(
            userInfo[msg.sender].whitelistSlots <= 3,
            'Too Many Mints'
        );

        // transfer in USDC
        uint256 received = _transferIn(nMints * cost);
        require(cost * nMints <= received, 'Incorrect Value Sent');

        for (uint i = 0; i < nMints; i++) {
            _safeMint(msg.sender, _totalSupply);
        }

        require(
            _balances[msg.sender] <= MAX_HOLDINGS,
            'Max Holdings Exceeded'
        );
    }

    /** 
     * Mints `nMints` NFTs To Caller
     */
    function mintGuaranteed(uint256 nMints) external {
        require(
            whitelistEnabled,
            'White list is not enabled'
        );
        require(
            userInfo[msg.sender].isGuaranteedWhitelisted,
            'Not Guaranteed Whitelisted'
        );
        require(
            nMints > 0,
            'Zero Mints'
        );

        userInfo[msg.sender].guaranteedSlots += nMints;
        require(
            userInfo[msg.sender].guaranteedSlots <= 2,
            'Too Many Mints'
        );

        // transfer in USDC
        uint256 received = _transferIn(nMints * cost);
        require(cost * nMints <= received, 'Incorrect Value Sent');

        for (uint i = 0; i < nMints; i++) {
            _safeMint(msg.sender, _totalSupply);
        }

        require(
            _balances[msg.sender] <= MAX_HOLDINGS,
            'Max Holdings Exceeded'
        );
    }

    receive() external payable {}

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

        require(
            _msgSender() == wpowner || isApprovedForAll(wpowner, _msgSender()),
            "ERC721: not approved or owner"
        );

        _approve(to, tokenId);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved");
        _transfer(from, to, tokenId);
    }

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

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


    ////////////////////////////////////////////////
    ///////////     READ FUNCTIONS       ///////////
    ////////////////////////////////////////////////

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function getIDsByOwner(address owner) external view returns (uint256[] memory) {
        uint256[] memory ids = new uint256[](balanceOf(owner));
        if (balanceOf(owner) == 0) return ids;
        uint256 count = 0;
        for (uint i = 0; i < MAX_SUPPLY; i++) {
            if (ownerOf(i) == owner) {
                ids[count] = i;
                count++;
            }
        }
        return ids;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256) public view override returns (string memory) {
        return _tokenURI;
    }

    /**
        Converts A Uint Into a String
    */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

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

        return _tokenApprovals[tokenId];
    }

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

    /**
     * @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
     */
    function _exists(uint256 tokenId) internal view 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 returns (bool) {
        require(_exists(tokenId), "ERC721: nonexistent token");
        address wpowner = ownerOf(tokenId);
        return (spender == wpowner || getApproved(tokenId) == spender || isApprovedForAll(wpowner, spender));
    }

    ////////////////////////////////////////////////
    ///////////    INTERNAL FUNCTIONS    ///////////
    ////////////////////////////////////////////////


    /**
     * @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
    ) internal {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "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 {
        require(!_exists(tokenId), "ERC721: token already minted");
        require(_totalSupply < MAX_SUPPLY, 'All NFTs Have Been Minted');

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

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

    /**
     * @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 {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: non ERC721Receiver implementer");
    }


    /**
     * @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 {
        require(ownerOf(tokenId) == from, "Incorrect owner");
        require(to != address(0), "zero address");
        require(balanceOf(from) > 0, 'Zero Balance');

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

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

        // emit transfer
        emit Transfer(from, to, tokenId);
    }

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

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

    function onReceivedRetval() public pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    function _transferIn(uint256 amount) internal returns (uint256) {
        uint before = USDC.balanceOf(address(this));
        require(
            USDC.transferFrom(
                msg.sender,
                address(this),
                amount
            ),
            'ERR Transfer From'
        );
        uint After = USDC.balanceOf(address(this));
        require(
            After > before,
            'Zero Received'
        );
        return After - before;
    }

    /**
     * @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: non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"usdc_","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":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWhitelist","outputs":[],"stateMutability":"nonpayable","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"}],"name":"getIDsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"guaranteeWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"mintGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onReceivedRetval","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setTokenURI","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"bool","name":"isWhitelisted","type":"bool"},{"internalType":"bool","name":"isGuaranteedWhitelisted","type":"bool"},{"internalType":"uint256","name":"whitelistSlots","type":"uint256"},{"internalType":"uint256","name":"guaranteedSlots","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052631dcd65006006556040518060400160405280601881526020017f456e7465725f426173655f5552495f486572652e6a736f6e000000000000000081525060079080519060200190620000599291906200019e565b506001600860006101000a81548160ff0219169083151502179055503480156200008257600080fd5b5060405162004e6d38038062004e6d8339818101604052810190620000a89190620002cc565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000362565b828054620001ac906200032d565b90600052602060002090601f016020900481019282620001d057600085556200021c565b82601f10620001eb57805160ff19168380011785556200021c565b828001600101855582156200021c579182015b828111156200021b578251825591602001919060010190620001fe565b5b5090506200022b91906200022f565b5090565b5b808211156200024a57600081600090555060010162000230565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002808262000253565b9050919050565b6000620002948262000273565b9050919050565b620002a68162000287565b8114620002b257600080fd5b50565b600081519050620002c6816200029b565b92915050565b600060208284031215620002e557620002e46200024e565b5b6000620002f584828501620002b5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034657607f821691505b6020821081036200035c576200035b620002fe565b5b50919050565b608051614acc620003a16000396000818161196f01528181611fd60152818161201301528181612897015281816129330152612a140152614acc6000f3fe6080604052600436106102085760003560e01c806370a0823111610118578063ae9843d6116100a0578063d6b0f4841161006f578063d6b0f4841461075f578063d8fc063d14610776578063e0df5b6f1461078d578063e985e9c5146107b6578063edec5f27146107f35761020f565b8063ae9843d6146106b7578063b88d4fde146106e2578063c87b56dd1461070b578063cdfb2b4e146107485761020f565b806389a30271116100e757806389a30271146105e657806395d89b4114610611578063a0712d681461063c578063a22cb46514610665578063a6f9dae11461068e5761020f565b806370a082311461052c57806382729baf14610569578063893d20e81461059257806389476069146105bd5761020f565b806332cb6b0c1161019b57806344eb409c1161016a57806344eb409c146104355780634618163e1461045e57806351fb012d146104875780635bf244be146104b25780636352211e146104ef5761020f565b806332cb6b0c146103a15780633ccfd60b146103cc57806342842e0e146103e357806344a0d68a1461040c5761020f565b806313faede6116101d757806313faede6146102e257806318160ddd1461030d5780631959a0021461033857806323b872dd146103785761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b95761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906131c7565b61081c565b604051610248919061320f565b60405180910390f35b34801561025d57600080fd5b506102666108fe565b60405161027391906132c3565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061331b565b61093b565b6040516102b09190613389565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906133d0565b6109c0565b005b3480156102ee57600080fd5b506102f7610ad7565b604051610304919061341f565b60405180910390f35b34801561031957600080fd5b50610322610add565b60405161032f919061341f565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a919061343a565b610ae7565b60405161036f9493929190613467565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a91906134ac565b610b31565b005b3480156103ad57600080fd5b506103b6610b91565b6040516103c3919061341f565b60405180910390f35b3480156103d857600080fd5b506103e1610b97565b005b3480156103ef57600080fd5b5061040a600480360381019061040591906134ac565b610c9e565b005b34801561041857600080fd5b50610433600480360381019061042e919061331b565b610cbe565b005b34801561044157600080fd5b5061045c60048036038101906104579190613564565b610d56565b005b34801561046a57600080fd5b506104856004803603810190610480919061331b565b610e92565b005b34801561049357600080fd5b5061049c6111ae565b6040516104a9919061320f565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d4919061343a565b6111c1565b6040516104e6919061366f565b60405180910390f35b3480156104fb57600080fd5b506105166004803603810190610511919061331b565b6112c8565b6040516105239190613389565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061343a565b611379565b604051610560919061341f565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061331b565b611430565b005b34801561059e57600080fd5b506105a761174c565b6040516105b49190613389565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df919061343a565b611775565b005b3480156105f257600080fd5b506105fb61196d565b60405161060891906136f0565b60405180910390f35b34801561061d57600080fd5b50610626611991565b60405161063391906132c3565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e919061331b565b6119ce565b005b34801561067157600080fd5b5061068c60048036038101906106879190613737565b611b8a565b005b34801561069a57600080fd5b506106b560048036038101906106b0919061343a565b611ba0565b005b3480156106c357600080fd5b506106cc611ceb565b6040516106d99190613786565b60405180910390f35b3480156106ee57600080fd5b50610709600480360381019061070491906138d1565b611cfa565b005b34801561071757600080fd5b50610732600480360381019061072d919061331b565b611d5c565b60405161073f91906132c3565b60405180910390f35b34801561075457600080fd5b5061075d611df0565b005b34801561076b57600080fd5b50610774611e9b565b005b34801561078257600080fd5b5061078b611f46565b005b34801561079957600080fd5b506107b460048036038101906107af91906139aa565b61210e565b005b3480156107c257600080fd5b506107dd60048036038101906107d891906139f7565b6121b2565b6040516107ea919061320f565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613564565b612246565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f757506108f682612382565b5b9050919050565b60606040518060400160405280600d81526020017f466f756e64657273204361726400000000000000000000000000000000000000815250905090565b6000610946826123ec565b610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613aa9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cb826112c8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613b3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5a612458565b73ffffffffffffffffffffffffffffffffffffffff161480610a895750610a8881610a83612458565b6121b2565b5b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613ba7565b60405180910390fd5b610ad28383612460565b505050565b60065481565b6000600154905090565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154905084565b610b42610b3c612458565b82612519565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890613c13565b60405180910390fd5b610b8c8383836125f7565b505050565b6103e881565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90613c7f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c4b90613cd0565b60006040518083038185875af1925050503d8060008114610c88576040519150601f19603f3d011682016040523d82523d6000602084013e610c8d565b606091505b5050905080610c9b57600080fd5b50565b610cb983838360405180602001604052806000815250611cfa565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613c7f565b60405180910390fd5b8060068190555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613c7f565b60405180910390fd5b600082829050905060005b81811015610e8c57600160096000868685818110610e1057610e0f613ce5565b5b9050602002016020810190610e25919061343a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff0219169083151502179055508080610e8490613d43565b915050610def565b50505050565b600860009054906101000a900460ff16610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613dd7565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790613e43565b60405180910390fd5b60008111610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613eaf565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546110059190613ecf565b925050819055506003600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990613f71565b60405180910390fd5b60006110aa600654836110a59190613f91565b612892565b905080826006546110bb9190613f91565b11156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614037565b60405180910390fd5b60005b828110156111265761111333600154612b05565b808061111e90613d43565b9150506110ff565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a1906140a3565b60405180910390fd5b5050565b600860009054906101000a900460ff1681565b606060006111ce83611379565b67ffffffffffffffff8111156111e7576111e66137a6565b5b6040519080825280602002602001820160405280156112155781602001602082028036833780820191505090505b509050600061122384611379565b0361123157809150506112c3565b6000805b6103e88110156112bc578473ffffffffffffffffffffffffffffffffffffffff1661125f826112c8565b73ffffffffffffffffffffffffffffffffffffffff16036112a9578083838151811061128e5761128d613ce5565b5b60200260200101818152505081806112a590613d43565b9250505b80806112b490613d43565b915050611235565b5081925050505b919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113679061410f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061417b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600860009054906101000a900460ff1661147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690613dd7565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1661150e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611505906141e7565b60405180910390fd5b60008111611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890613eaf565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546115a39190613ecf565b925050819055506002600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541115611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790613f71565b60405180910390fd5b6000611648600654836116439190613f91565b612892565b905080826006546116599190613f91565b111561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614037565b60405180910390fd5b60005b828110156116c4576116b133600154612b05565b80806116bc90613d43565b91505061169d565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f906140a3565b60405180910390fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614253565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118c89190613389565b602060405180830381865afa1580156118e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119099190614288565b6040518363ffffffff1660e01b81526004016119269291906142b5565b6020604051808303816000875af1158015611945573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196991906142f3565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606040518060400160405280600881526020017f464f554e44455253000000000000000000000000000000000000000000000000815250905090565b600860009054906101000a900460ff1615611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a159061436c565b60405180910390fd5b600081118015611a2f575060038111155b611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a65906143d8565b60405180910390fd5b6000611a8660065483611a819190613f91565b612892565b90508082600654611a979190613f91565b1115611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90614037565b60405180910390fd5b60005b82811015611b0257611aef33600154612b05565b8080611afa90613d43565b915050611adb565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906140a3565b60405180910390fd5b5050565b611b9c611b95612458565b8383612b6e565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590613c7f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600063150b7a0260e01b905090565b611d0b611d05612458565b83612519565b611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613c13565b60405180910390fd5b611d5684848484612cda565b50505050565b606060078054611d6b90614427565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9790614427565b8015611de45780601f10611db957610100808354040283529160200191611de4565b820191906000526020600020905b815481529060010190602001808311611dc757829003601f168201915b50505050509050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590613c7f565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090613c7f565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb90613c7f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206a9190613389565b602060405180830381865afa158015612087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ab9190614288565b6040518363ffffffff1660e01b81526004016120c89291906142b5565b6020604051808303816000875af11580156120e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210b91906142f3565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613c7f565b60405180910390fd5b8181600791906121ad9291906130b8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cb90613c7f565b60405180910390fd5b600082829050905060005b8181101561237c57600160096000868685818110612300576122ff613ce5565b5b9050602002016020810190612315919061343a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908315150217905550808061237490613d43565b9150506122df565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d3836112c8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612524826123ec565b612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a906144a4565b60405180910390fd5b600061256e836112c8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125dd57508373ffffffffffffffffffffffffffffffffffffffff166125c58461093b565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ee57506125ed81856121b2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612617826112c8565b73ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490614510565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d39061457c565b60405180910390fd5b60006126e784611379565b11612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906145e8565b60405180910390fd5b612732600082612460565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127829190614608565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d99190613ecf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ee9190613389565b602060405180830381865afa15801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292f9190614288565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161298e9392919061463c565b6020604051808303816000875af11580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d191906142f3565b612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906146bf565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a6b9190613389565b602060405180830381865afa158015612a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aac9190614288565b9050818111612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae79061472b565b60405180910390fd5b8181612afc9190614608565b92505050919050565b612b0f8282612d36565b612b2b6000838360405180602001604052806000815250612ee6565b612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b61906147bd565b60405180910390fd5b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614829565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ccd919061320f565b60405180910390a3505050565b612ce58484846125f7565b612cf184848484612ee6565b612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d27906148bb565b60405180910390fd5b50505050565b612d3f816123ec565b15612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690614927565b60405180910390fd5b6103e860015410612dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbc90614993565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e159190613ecf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000815480929190612e8190613d43565b9190505550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612f078473ffffffffffffffffffffffffffffffffffffffff1661306d565b15613060578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f30612458565b8786866040518563ffffffff1660e01b8152600401612f529493929190614a08565b6020604051808303816000875af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190614a69565b60015b613010573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b506000815103613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff906148bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613065565b600190505b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156130af57506000801b8214155b92505050919050565b8280546130c490614427565b90600052602060002090601f0160209004810192826130e6576000855561312d565b82601f106130ff57803560ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312c578235825591602001919060010190613111565b5b50905061313a919061313e565b5090565b5b8082111561315757600081600090555060010161313f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131a48161316f565b81146131af57600080fd5b50565b6000813590506131c18161319b565b92915050565b6000602082840312156131dd576131dc613165565b5b60006131eb848285016131b2565b91505092915050565b60008115159050919050565b613209816131f4565b82525050565b60006020820190506132246000830184613200565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613264578082015181840152602081019050613249565b83811115613273576000848401525b50505050565b6000601f19601f8301169050919050565b60006132958261322a565b61329f8185613235565b93506132af818560208601613246565b6132b881613279565b840191505092915050565b600060208201905081810360008301526132dd818461328a565b905092915050565b6000819050919050565b6132f8816132e5565b811461330357600080fd5b50565b600081359050613315816132ef565b92915050565b60006020828403121561333157613330613165565b5b600061333f84828501613306565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061337382613348565b9050919050565b61338381613368565b82525050565b600060208201905061339e600083018461337a565b92915050565b6133ad81613368565b81146133b857600080fd5b50565b6000813590506133ca816133a4565b92915050565b600080604083850312156133e7576133e6613165565b5b60006133f5858286016133bb565b925050602061340685828601613306565b9150509250929050565b613419816132e5565b82525050565b60006020820190506134346000830184613410565b92915050565b6000602082840312156134505761344f613165565b5b600061345e848285016133bb565b91505092915050565b600060808201905061347c6000830187613200565b6134896020830186613200565b6134966040830185613410565b6134a36060830184613410565b95945050505050565b6000806000606084860312156134c5576134c4613165565b5b60006134d3868287016133bb565b93505060206134e4868287016133bb565b92505060406134f586828701613306565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112613524576135236134ff565b5b8235905067ffffffffffffffff81111561354157613540613504565b5b60208301915083602082028301111561355d5761355c613509565b5b9250929050565b6000806020838503121561357b5761357a613165565b5b600083013567ffffffffffffffff8111156135995761359861316a565b5b6135a58582860161350e565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135e6816132e5565b82525050565b60006135f883836135dd565b60208301905092915050565b6000602082019050919050565b600061361c826135b1565b61362681856135bc565b9350613631836135cd565b8060005b8381101561366257815161364988826135ec565b975061365483613604565b925050600181019050613635565b5085935050505092915050565b600060208201905081810360008301526136898184613611565b905092915050565b6000819050919050565b60006136b66136b16136ac84613348565b613691565b613348565b9050919050565b60006136c88261369b565b9050919050565b60006136da826136bd565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b613714816131f4565b811461371f57600080fd5b50565b6000813590506137318161370b565b92915050565b6000806040838503121561374e5761374d613165565b5b600061375c858286016133bb565b925050602061376d85828601613722565b9150509250929050565b6137808161316f565b82525050565b600060208201905061379b6000830184613777565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137de82613279565b810181811067ffffffffffffffff821117156137fd576137fc6137a6565b5b80604052505050565b600061381061315b565b905061381c82826137d5565b919050565b600067ffffffffffffffff82111561383c5761383b6137a6565b5b61384582613279565b9050602081019050919050565b82818337600083830152505050565b600061387461386f84613821565b613806565b9050828152602081018484840111156138905761388f6137a1565b5b61389b848285613852565b509392505050565b600082601f8301126138b8576138b76134ff565b5b81356138c8848260208601613861565b91505092915050565b600080600080608085870312156138eb576138ea613165565b5b60006138f9878288016133bb565b945050602061390a878288016133bb565b935050604061391b87828801613306565b925050606085013567ffffffffffffffff81111561393c5761393b61316a565b5b613948878288016138a3565b91505092959194509250565b60008083601f84011261396a576139696134ff565b5b8235905067ffffffffffffffff81111561398757613986613504565b5b6020830191508360018202830111156139a3576139a2613509565b5b9250929050565b600080602083850312156139c1576139c0613165565b5b600083013567ffffffffffffffff8111156139df576139de61316a565b5b6139eb85828601613954565b92509250509250929050565b60008060408385031215613a0e57613a0d613165565b5b6000613a1c858286016133bb565b9250506020613a2d858286016133bb565b9150509250929050565b7f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613a93602383613235565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b25602183613235565b9150613b3082613ac9565b604082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4552433732313a206e6f7420617070726f766564206f72206f776e6572000000600082015250565b6000613b91601d83613235565b9150613b9c82613b5b565b602082019050919050565b60006020820190508181036000830152613bc081613b84565b9050919050565b7f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000600082015250565b6000613bfd601d83613235565b9150613c0882613bc7565b602082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000613c69601383613235565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b600081905092915050565b50565b6000613cba600083613c9f565b9150613cc582613caa565b600082019050919050565b6000613cdb82613cad565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d4e826132e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d8057613d7f613d14565b5b600182019050919050565b7f5768697465206c697374206973206e6f7420656e61626c656400000000000000600082015250565b6000613dc1601983613235565b9150613dcc82613d8b565b602082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b6000613e2d600f83613235565b9150613e3882613df7565b602082019050919050565b60006020820190508181036000830152613e5c81613e20565b9050919050565b7f5a65726f204d696e747300000000000000000000000000000000000000000000600082015250565b6000613e99600a83613235565b9150613ea482613e63565b602082019050919050565b60006020820190508181036000830152613ec881613e8c565b9050919050565b6000613eda826132e5565b9150613ee5836132e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1a57613f19613d14565b5b828201905092915050565b7f546f6f204d616e79204d696e7473000000000000000000000000000000000000600082015250565b6000613f5b600e83613235565b9150613f6682613f25565b602082019050919050565b60006020820190508181036000830152613f8a81613f4e565b9050919050565b6000613f9c826132e5565b9150613fa7836132e5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fe057613fdf613d14565b5b828202905092915050565b7f496e636f72726563742056616c75652053656e74000000000000000000000000600082015250565b6000614021601483613235565b915061402c82613feb565b602082019050919050565b6000602082019050818103600083015261405081614014565b9050919050565b7f4d617820486f6c64696e67732045786365656465640000000000000000000000600082015250565b600061408d601583613235565b915061409882614057565b602082019050919050565b600060208201905081810360008301526140bc81614080565b9050919050565b7f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b60006140f9601b83613235565b9150614104826140c3565b602082019050919050565b60006020820190508181036000830152614128816140ec565b9050919050565b7f717565727920666f7220746865207a65726f2061646472657373000000000000600082015250565b6000614165601a83613235565b91506141708261412f565b602082019050919050565b6000602082019050818103600083015261419481614158565b9050919050565b7f4e6f742047756172616e746565642057686974656c6973746564000000000000600082015250565b60006141d1601a83613235565b91506141dc8261419b565b602082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b600061423d600c83613235565b915061424882614207565b602082019050919050565b6000602082019050818103600083015261426c81614230565b9050919050565b600081519050614282816132ef565b92915050565b60006020828403121561429e5761429d613165565b5b60006142ac84828501614273565b91505092915050565b60006040820190506142ca600083018561337a565b6142d76020830184613410565b9392505050565b6000815190506142ed8161370b565b92915050565b60006020828403121561430957614308613165565b5b6000614317848285016142de565b91505092915050565b7f5768697465206c69737420697320656e61626c65640000000000000000000000600082015250565b6000614356601583613235565b915061436182614320565b602082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f496e76616c696420496e70757400000000000000000000000000000000000000600082015250565b60006143c2600d83613235565b91506143cd8261438c565b602082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061443f57607f821691505b602082108103614452576144516143f8565b5b50919050565b7f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000600082015250565b600061448e601983613235565b915061449982614458565b602082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f496e636f7272656374206f776e65720000000000000000000000000000000000600082015250565b60006144fa600f83613235565b9150614505826144c4565b602082019050919050565b60006020820190508181036000830152614529816144ed565b9050919050565b7f7a65726f20616464726573730000000000000000000000000000000000000000600082015250565b6000614566600c83613235565b915061457182614530565b602082019050919050565b6000602082019050818103600083015261459581614559565b9050919050565b7f5a65726f2042616c616e63650000000000000000000000000000000000000000600082015250565b60006145d2600c83613235565b91506145dd8261459c565b602082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b6000614613826132e5565b915061461e836132e5565b92508282101561463157614630613d14565b5b828203905092915050565b6000606082019050614651600083018661337a565b61465e602083018561337a565b61466b6040830184613410565b949350505050565b7f455252205472616e736665722046726f6d000000000000000000000000000000600082015250565b60006146a9601183613235565b91506146b482614673565b602082019050919050565b600060208201905081810360008301526146d88161469c565b9050919050565b7f5a65726f20526563656976656400000000000000000000000000000000000000600082015250565b6000614715600d83613235565b9150614720826146df565b602082019050919050565b6000602082019050818103600083015261474481614708565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147a7603283613235565b91506147b28261474b565b604082019050919050565b600060208201905081810360008301526147d68161479a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614813601983613235565b915061481e826147dd565b602082019050919050565b6000602082019050818103600083015261484281614806565b9050919050565b7f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560008201527f6d656e7465720000000000000000000000000000000000000000000000000000602082015250565b60006148a5602683613235565b91506148b082614849565b604082019050919050565b600060208201905081810360008301526148d481614898565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614911601c83613235565b915061491c826148db565b602082019050919050565b6000602082019050818103600083015261494081614904565b9050919050565b7f416c6c204e4654732048617665204265656e204d696e74656400000000000000600082015250565b600061497d601983613235565b915061498882614947565b602082019050919050565b600060208201905081810360008301526149ac81614970565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149da826149b3565b6149e481856149be565b93506149f4818560208601613246565b6149fd81613279565b840191505092915050565b6000608082019050614a1d600083018761337a565b614a2a602083018661337a565b614a376040830185613410565b8181036060830152614a4981846149cf565b905095945050505050565b600081519050614a638161319b565b92915050565b600060208284031215614a7f57614a7e613165565b5b6000614a8d84828501614a54565b9150509291505056fea2646970667358221220d63ee3f5b553afbeb02022f159742fcc15a2821d6e023a607f89fb6fe41ded5c64736f6c634300080e0033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Deployed Bytecode

0x6080604052600436106102085760003560e01c806370a0823111610118578063ae9843d6116100a0578063d6b0f4841161006f578063d6b0f4841461075f578063d8fc063d14610776578063e0df5b6f1461078d578063e985e9c5146107b6578063edec5f27146107f35761020f565b8063ae9843d6146106b7578063b88d4fde146106e2578063c87b56dd1461070b578063cdfb2b4e146107485761020f565b806389a30271116100e757806389a30271146105e657806395d89b4114610611578063a0712d681461063c578063a22cb46514610665578063a6f9dae11461068e5761020f565b806370a082311461052c57806382729baf14610569578063893d20e81461059257806389476069146105bd5761020f565b806332cb6b0c1161019b57806344eb409c1161016a57806344eb409c146104355780634618163e1461045e57806351fb012d146104875780635bf244be146104b25780636352211e146104ef5761020f565b806332cb6b0c146103a15780633ccfd60b146103cc57806342842e0e146103e357806344a0d68a1461040c5761020f565b806313faede6116101d757806313faede6146102e257806318160ddd1461030d5780631959a0021461033857806323b872dd146103785761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b95761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906131c7565b61081c565b604051610248919061320f565b60405180910390f35b34801561025d57600080fd5b506102666108fe565b60405161027391906132c3565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e919061331b565b61093b565b6040516102b09190613389565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906133d0565b6109c0565b005b3480156102ee57600080fd5b506102f7610ad7565b604051610304919061341f565b60405180910390f35b34801561031957600080fd5b50610322610add565b60405161032f919061341f565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a919061343a565b610ae7565b60405161036f9493929190613467565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a91906134ac565b610b31565b005b3480156103ad57600080fd5b506103b6610b91565b6040516103c3919061341f565b60405180910390f35b3480156103d857600080fd5b506103e1610b97565b005b3480156103ef57600080fd5b5061040a600480360381019061040591906134ac565b610c9e565b005b34801561041857600080fd5b50610433600480360381019061042e919061331b565b610cbe565b005b34801561044157600080fd5b5061045c60048036038101906104579190613564565b610d56565b005b34801561046a57600080fd5b506104856004803603810190610480919061331b565b610e92565b005b34801561049357600080fd5b5061049c6111ae565b6040516104a9919061320f565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d4919061343a565b6111c1565b6040516104e6919061366f565b60405180910390f35b3480156104fb57600080fd5b506105166004803603810190610511919061331b565b6112c8565b6040516105239190613389565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061343a565b611379565b604051610560919061341f565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061331b565b611430565b005b34801561059e57600080fd5b506105a761174c565b6040516105b49190613389565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df919061343a565b611775565b005b3480156105f257600080fd5b506105fb61196d565b60405161060891906136f0565b60405180910390f35b34801561061d57600080fd5b50610626611991565b60405161063391906132c3565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e919061331b565b6119ce565b005b34801561067157600080fd5b5061068c60048036038101906106879190613737565b611b8a565b005b34801561069a57600080fd5b506106b560048036038101906106b0919061343a565b611ba0565b005b3480156106c357600080fd5b506106cc611ceb565b6040516106d99190613786565b60405180910390f35b3480156106ee57600080fd5b50610709600480360381019061070491906138d1565b611cfa565b005b34801561071757600080fd5b50610732600480360381019061072d919061331b565b611d5c565b60405161073f91906132c3565b60405180910390f35b34801561075457600080fd5b5061075d611df0565b005b34801561076b57600080fd5b50610774611e9b565b005b34801561078257600080fd5b5061078b611f46565b005b34801561079957600080fd5b506107b460048036038101906107af91906139aa565b61210e565b005b3480156107c257600080fd5b506107dd60048036038101906107d891906139f7565b6121b2565b6040516107ea919061320f565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190613564565b612246565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f757506108f682612382565b5b9050919050565b60606040518060400160405280600d81526020017f466f756e64657273204361726400000000000000000000000000000000000000815250905090565b6000610946826123ec565b610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90613aa9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cb826112c8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613b3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5a612458565b73ffffffffffffffffffffffffffffffffffffffff161480610a895750610a8881610a83612458565b6121b2565b5b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90613ba7565b60405180910390fd5b610ad28383612460565b505050565b60065481565b6000600154905090565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154905084565b610b42610b3c612458565b82612519565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890613c13565b60405180910390fd5b610b8c8383836125f7565b505050565b6103e881565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1c90613c7f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610c4b90613cd0565b60006040518083038185875af1925050503d8060008114610c88576040519150601f19603f3d011682016040523d82523d6000602084013e610c8d565b606091505b5050905080610c9b57600080fd5b50565b610cb983838360405180602001604052806000815250611cfa565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613c7f565b60405180910390fd5b8060068190555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613c7f565b60405180910390fd5b600082829050905060005b81811015610e8c57600160096000868685818110610e1057610e0f613ce5565b5b9050602002016020810190610e25919061343a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff0219169083151502179055508080610e8490613d43565b915050610def565b50505050565b600860009054906101000a900460ff16610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613dd7565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790613e43565b60405180910390fd5b60008111610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613eaf565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546110059190613ecf565b925050819055506003600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990613f71565b60405180910390fd5b60006110aa600654836110a59190613f91565b612892565b905080826006546110bb9190613f91565b11156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614037565b60405180910390fd5b60005b828110156111265761111333600154612b05565b808061111e90613d43565b9150506110ff565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a1906140a3565b60405180910390fd5b5050565b600860009054906101000a900460ff1681565b606060006111ce83611379565b67ffffffffffffffff8111156111e7576111e66137a6565b5b6040519080825280602002602001820160405280156112155781602001602082028036833780820191505090505b509050600061122384611379565b0361123157809150506112c3565b6000805b6103e88110156112bc578473ffffffffffffffffffffffffffffffffffffffff1661125f826112c8565b73ffffffffffffffffffffffffffffffffffffffff16036112a9578083838151811061128e5761128d613ce5565b5b60200260200101818152505081806112a590613d43565b9250505b80806112b490613d43565b915050611235565b5081925050505b919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113679061410f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061417b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600860009054906101000a900460ff1661147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147690613dd7565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1661150e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611505906141e7565b60405180910390fd5b60008111611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890613eaf565b60405180910390fd5b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546115a39190613ecf565b925050819055506002600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541115611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790613f71565b60405180910390fd5b6000611648600654836116439190613f91565b612892565b905080826006546116599190613f91565b111561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614037565b60405180910390fd5b60005b828110156116c4576116b133600154612b05565b80806116bc90613d43565b91505061169d565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f906140a3565b60405180910390fd5b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614253565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118c89190613389565b602060405180830381865afa1580156118e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119099190614288565b6040518363ffffffff1660e01b81526004016119269291906142b5565b6020604051808303816000875af1158015611945573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196991906142f3565b5050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b60606040518060400160405280600881526020017f464f554e44455253000000000000000000000000000000000000000000000000815250905090565b600860009054906101000a900460ff1615611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a159061436c565b60405180910390fd5b600081118015611a2f575060038111155b611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a65906143d8565b60405180910390fd5b6000611a8660065483611a819190613f91565b612892565b90508082600654611a979190613f91565b1115611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90614037565b60405180910390fd5b60005b82811015611b0257611aef33600154612b05565b8080611afa90613d43565b915050611adb565b506005600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906140a3565b60405180910390fd5b5050565b611b9c611b95612458565b8383612b6e565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590613c7f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600063150b7a0260e01b905090565b611d0b611d05612458565b83612519565b611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613c13565b60405180910390fd5b611d5684848484612cda565b50505050565b606060078054611d6b90614427565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9790614427565b8015611de45780601f10611db957610100808354040283529160200191611de4565b820191906000526020600020905b815481529060010190602001808311611dc757829003601f168201915b50505050509050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590613c7f565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2090613c7f565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb90613c7f565b60405180910390fd5b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206a9190613389565b602060405180830381865afa158015612087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ab9190614288565b6040518363ffffffff1660e01b81526004016120c89291906142b5565b6020604051808303816000875af11580156120e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210b91906142f3565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613c7f565b60405180910390fd5b8181600791906121ad9291906130b8565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cb90613c7f565b60405180910390fd5b600082829050905060005b8181101561237c57600160096000868685818110612300576122ff613ce5565b5b9050602002016020810190612315919061343a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908315150217905550808061237490613d43565b9150506122df565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124d3836112c8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612524826123ec565b612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a906144a4565b60405180910390fd5b600061256e836112c8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125dd57508373ffffffffffffffffffffffffffffffffffffffff166125c58461093b565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ee57506125ed81856121b2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612617826112c8565b73ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490614510565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d39061457c565b60405180910390fd5b60006126e784611379565b11612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e906145e8565b60405180910390fd5b612732600082612460565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127829190614608565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d99190613ecf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000807f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ee9190613389565b602060405180830381865afa15801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292f9190614288565b90507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161298e9392919061463c565b6020604051808303816000875af11580156129ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d191906142f3565b612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906146bf565b60405180910390fd5b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a6b9190613389565b602060405180830381865afa158015612a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aac9190614288565b9050818111612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae79061472b565b60405180910390fd5b8181612afc9190614608565b92505050919050565b612b0f8282612d36565b612b2b6000838360405180602001604052806000815250612ee6565b612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b61906147bd565b60405180910390fd5b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614829565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ccd919061320f565b60405180910390a3505050565b612ce58484846125f7565b612cf184848484612ee6565b612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d27906148bb565b60405180910390fd5b50505050565b612d3f816123ec565b15612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690614927565b60405180910390fd5b6103e860015410612dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbc90614993565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e159190613ecf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000815480929190612e8190613d43565b9190505550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612f078473ffffffffffffffffffffffffffffffffffffffff1661306d565b15613060578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f30612458565b8786866040518563ffffffff1660e01b8152600401612f529493929190614a08565b6020604051808303816000875af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190614a69565b60015b613010573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b506000815103613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff906148bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613065565b600190505b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156130af57506000801b8214155b92505050919050565b8280546130c490614427565b90600052602060002090601f0160209004810192826130e6576000855561312d565b82601f106130ff57803560ff191683800117855561312d565b8280016001018555821561312d579182015b8281111561312c578235825591602001919060010190613111565b5b50905061313a919061313e565b5090565b5b8082111561315757600081600090555060010161313f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131a48161316f565b81146131af57600080fd5b50565b6000813590506131c18161319b565b92915050565b6000602082840312156131dd576131dc613165565b5b60006131eb848285016131b2565b91505092915050565b60008115159050919050565b613209816131f4565b82525050565b60006020820190506132246000830184613200565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613264578082015181840152602081019050613249565b83811115613273576000848401525b50505050565b6000601f19601f8301169050919050565b60006132958261322a565b61329f8185613235565b93506132af818560208601613246565b6132b881613279565b840191505092915050565b600060208201905081810360008301526132dd818461328a565b905092915050565b6000819050919050565b6132f8816132e5565b811461330357600080fd5b50565b600081359050613315816132ef565b92915050565b60006020828403121561333157613330613165565b5b600061333f84828501613306565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061337382613348565b9050919050565b61338381613368565b82525050565b600060208201905061339e600083018461337a565b92915050565b6133ad81613368565b81146133b857600080fd5b50565b6000813590506133ca816133a4565b92915050565b600080604083850312156133e7576133e6613165565b5b60006133f5858286016133bb565b925050602061340685828601613306565b9150509250929050565b613419816132e5565b82525050565b60006020820190506134346000830184613410565b92915050565b6000602082840312156134505761344f613165565b5b600061345e848285016133bb565b91505092915050565b600060808201905061347c6000830187613200565b6134896020830186613200565b6134966040830185613410565b6134a36060830184613410565b95945050505050565b6000806000606084860312156134c5576134c4613165565b5b60006134d3868287016133bb565b93505060206134e4868287016133bb565b92505060406134f586828701613306565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112613524576135236134ff565b5b8235905067ffffffffffffffff81111561354157613540613504565b5b60208301915083602082028301111561355d5761355c613509565b5b9250929050565b6000806020838503121561357b5761357a613165565b5b600083013567ffffffffffffffff8111156135995761359861316a565b5b6135a58582860161350e565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135e6816132e5565b82525050565b60006135f883836135dd565b60208301905092915050565b6000602082019050919050565b600061361c826135b1565b61362681856135bc565b9350613631836135cd565b8060005b8381101561366257815161364988826135ec565b975061365483613604565b925050600181019050613635565b5085935050505092915050565b600060208201905081810360008301526136898184613611565b905092915050565b6000819050919050565b60006136b66136b16136ac84613348565b613691565b613348565b9050919050565b60006136c88261369b565b9050919050565b60006136da826136bd565b9050919050565b6136ea816136cf565b82525050565b600060208201905061370560008301846136e1565b92915050565b613714816131f4565b811461371f57600080fd5b50565b6000813590506137318161370b565b92915050565b6000806040838503121561374e5761374d613165565b5b600061375c858286016133bb565b925050602061376d85828601613722565b9150509250929050565b6137808161316f565b82525050565b600060208201905061379b6000830184613777565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137de82613279565b810181811067ffffffffffffffff821117156137fd576137fc6137a6565b5b80604052505050565b600061381061315b565b905061381c82826137d5565b919050565b600067ffffffffffffffff82111561383c5761383b6137a6565b5b61384582613279565b9050602081019050919050565b82818337600083830152505050565b600061387461386f84613821565b613806565b9050828152602081018484840111156138905761388f6137a1565b5b61389b848285613852565b509392505050565b600082601f8301126138b8576138b76134ff565b5b81356138c8848260208601613861565b91505092915050565b600080600080608085870312156138eb576138ea613165565b5b60006138f9878288016133bb565b945050602061390a878288016133bb565b935050604061391b87828801613306565b925050606085013567ffffffffffffffff81111561393c5761393b61316a565b5b613948878288016138a3565b91505092959194509250565b60008083601f84011261396a576139696134ff565b5b8235905067ffffffffffffffff81111561398757613986613504565b5b6020830191508360018202830111156139a3576139a2613509565b5b9250929050565b600080602083850312156139c1576139c0613165565b5b600083013567ffffffffffffffff8111156139df576139de61316a565b5b6139eb85828601613954565b92509250509250929050565b60008060408385031215613a0e57613a0d613165565b5b6000613a1c858286016133bb565b9250506020613a2d858286016133bb565b9150509250929050565b7f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60008201527f6b656e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613a93602383613235565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b25602183613235565b9150613b3082613ac9565b604082019050919050565b60006020820190508181036000830152613b5481613b18565b9050919050565b7f4552433732313a206e6f7420617070726f766564206f72206f776e6572000000600082015250565b6000613b91601d83613235565b9150613b9c82613b5b565b602082019050919050565b60006020820190508181036000830152613bc081613b84565b9050919050565b7f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000600082015250565b6000613bfd601d83613235565b9150613c0882613bc7565b602082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000613c69601383613235565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b600081905092915050565b50565b6000613cba600083613c9f565b9150613cc582613caa565b600082019050919050565b6000613cdb82613cad565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d4e826132e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d8057613d7f613d14565b5b600182019050919050565b7f5768697465206c697374206973206e6f7420656e61626c656400000000000000600082015250565b6000613dc1601983613235565b9150613dcc82613d8b565b602082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b6000613e2d600f83613235565b9150613e3882613df7565b602082019050919050565b60006020820190508181036000830152613e5c81613e20565b9050919050565b7f5a65726f204d696e747300000000000000000000000000000000000000000000600082015250565b6000613e99600a83613235565b9150613ea482613e63565b602082019050919050565b60006020820190508181036000830152613ec881613e8c565b9050919050565b6000613eda826132e5565b9150613ee5836132e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f1a57613f19613d14565b5b828201905092915050565b7f546f6f204d616e79204d696e7473000000000000000000000000000000000000600082015250565b6000613f5b600e83613235565b9150613f6682613f25565b602082019050919050565b60006020820190508181036000830152613f8a81613f4e565b9050919050565b6000613f9c826132e5565b9150613fa7836132e5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fe057613fdf613d14565b5b828202905092915050565b7f496e636f72726563742056616c75652053656e74000000000000000000000000600082015250565b6000614021601483613235565b915061402c82613feb565b602082019050919050565b6000602082019050818103600083015261405081614014565b9050919050565b7f4d617820486f6c64696e67732045786365656465640000000000000000000000600082015250565b600061408d601583613235565b915061409882614057565b602082019050919050565b600060208201905081810360008301526140bc81614080565b9050919050565b7f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000600082015250565b60006140f9601b83613235565b9150614104826140c3565b602082019050919050565b60006020820190508181036000830152614128816140ec565b9050919050565b7f717565727920666f7220746865207a65726f2061646472657373000000000000600082015250565b6000614165601a83613235565b91506141708261412f565b602082019050919050565b6000602082019050818103600083015261419481614158565b9050919050565b7f4e6f742047756172616e746565642057686974656c6973746564000000000000600082015250565b60006141d1601a83613235565b91506141dc8261419b565b602082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b600061423d600c83613235565b915061424882614207565b602082019050919050565b6000602082019050818103600083015261426c81614230565b9050919050565b600081519050614282816132ef565b92915050565b60006020828403121561429e5761429d613165565b5b60006142ac84828501614273565b91505092915050565b60006040820190506142ca600083018561337a565b6142d76020830184613410565b9392505050565b6000815190506142ed8161370b565b92915050565b60006020828403121561430957614308613165565b5b6000614317848285016142de565b91505092915050565b7f5768697465206c69737420697320656e61626c65640000000000000000000000600082015250565b6000614356601583613235565b915061436182614320565b602082019050919050565b6000602082019050818103600083015261438581614349565b9050919050565b7f496e76616c696420496e70757400000000000000000000000000000000000000600082015250565b60006143c2600d83613235565b91506143cd8261438c565b602082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061443f57607f821691505b602082108103614452576144516143f8565b5b50919050565b7f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000600082015250565b600061448e601983613235565b915061449982614458565b602082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f496e636f7272656374206f776e65720000000000000000000000000000000000600082015250565b60006144fa600f83613235565b9150614505826144c4565b602082019050919050565b60006020820190508181036000830152614529816144ed565b9050919050565b7f7a65726f20616464726573730000000000000000000000000000000000000000600082015250565b6000614566600c83613235565b915061457182614530565b602082019050919050565b6000602082019050818103600083015261459581614559565b9050919050565b7f5a65726f2042616c616e63650000000000000000000000000000000000000000600082015250565b60006145d2600c83613235565b91506145dd8261459c565b602082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b6000614613826132e5565b915061461e836132e5565b92508282101561463157614630613d14565b5b828203905092915050565b6000606082019050614651600083018661337a565b61465e602083018561337a565b61466b6040830184613410565b949350505050565b7f455252205472616e736665722046726f6d000000000000000000000000000000600082015250565b60006146a9601183613235565b91506146b482614673565b602082019050919050565b600060208201905081810360008301526146d88161469c565b9050919050565b7f5a65726f20526563656976656400000000000000000000000000000000000000600082015250565b6000614715600d83613235565b9150614720826146df565b602082019050919050565b6000602082019050818103600083015261474481614708565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006147a7603283613235565b91506147b28261474b565b604082019050919050565b600060208201905081810360008301526147d68161479a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614813601983613235565b915061481e826147dd565b602082019050919050565b6000602082019050818103600083015261484281614806565b9050919050565b7f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560008201527f6d656e7465720000000000000000000000000000000000000000000000000000602082015250565b60006148a5602683613235565b91506148b082614849565b604082019050919050565b600060208201905081810360008301526148d481614898565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614911601c83613235565b915061491c826148db565b602082019050919050565b6000602082019050818103600083015261494081614904565b9050919050565b7f416c6c204e4654732048617665204265656e204d696e74656400000000000000600082015250565b600061497d601983613235565b915061498882614947565b602082019050919050565b600060208201905081810360008301526149ac81614970565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149da826149b3565b6149e481856149be565b93506149f4818560208601613246565b6149fd81613279565b840191505092915050565b6000608082019050614a1d600083018761337a565b614a2a602083018661337a565b614a376040830185613410565b8181036060830152614a4981846149cf565b905095945050505050565b600081519050614a638161319b565b92915050565b600060208284031215614a7f57614a7e613165565b5b6000614a8d84828501614a54565b9150509291505056fea2646970667358221220d63ee3f5b553afbeb02022f159742fcc15a2821d6e023a607f89fb6fe41ded5c64736f6c634300080e0033

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

000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

-----Decoded View---------------
Arg [0] : usdc_ (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48


Deployed Bytecode Sourcemap

23675:17812:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31990:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32893:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34031:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29680:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24742:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31394:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25114:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;30345:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24072:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25590:149;;;;;;;;;;;;;:::i;:::-;;30672:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26086:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26515:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27678:907;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24886:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31495:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32603:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32351:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28650:931;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23585:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25747:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24584:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33054:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26981:632;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30129:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23359:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39505:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30920:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33221:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25494:88;;;;;;;;;;;;;:::i;:::-;;25396:90;;;;;;;;;;;;;:::i;:::-;;25960:118;;;;;;;;;;;;;:::i;:::-;;26180:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34306:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26289:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31990:297;32084:4;32136:25;32121:40;;;:11;:40;;;;:105;;;;32193:33;32178:48;;;:11;:48;;;;32121:105;:158;;;;32243:36;32267:11;32243:23;:36::i;:::-;32121:158;32101:178;;31990:297;;;:::o;32893:92::-;32939:13;32972:5;;;;;;;;;;;;;;;;;32965:12;;32893:92;:::o;34031:204::-;34099:7;34127:16;34135:7;34127;:16::i;:::-;34119:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34203:15;:24;34219:7;34203:24;;;;;;;;;;;;;;;;;;;;;34196:31;;34031:204;;;:::o;29680:377::-;29753:15;29771:16;29779:7;29771;:16::i;:::-;29753:34;;29812:7;29806:13;;:2;:13;;;29798:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;29908:7;29892:23;;:12;:10;:12::i;:::-;:23;;;:66;;;;29919:39;29936:7;29945:12;:10;:12::i;:::-;29919:16;:39::i;:::-;29892:66;29870:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;30028:21;30037:2;30041:7;30028:8;:21::i;:::-;29742:315;29680:377;;:::o;24742:33::-;;;;:::o;31394:93::-;31440:7;31467:12;;31460:19;;31394:93;:::o;25114:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30345:256::-;30479:41;30498:12;:10;:12::i;:::-;30512:7;30479:18;:41::i;:::-;30471:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30565:28;30575:4;30581:2;30585:7;30565:9;:28::i;:::-;30345:256;;;:::o;24072:42::-;24109:5;24072:42;:::o;25590:149::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;25641:6:::1;25660:10;25652:24;;25684:21;25652:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25640:70;;;25729:1;25721:10;;;::::0;::::1;;25629:110;25590:149::o:0;30672:177::-;30802:39;30819:4;30825:2;30829:7;30802:39;;;;;;;;;;;;:16;:39::i;:::-;30672:177;;;:::o;26086:86::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;26157:7:::1;26150:4;:14;;;;26086:86:::0;:::o;26515:237::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;26604:8:::1;26615:5;;:12;;26604:23;;26643:6;26638:107;26659:3;26655:1;:7;26638:107;;;26729:4;26684:8;:18;26693:5;;26699:1;26693:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;26684:18;;;;;;;;;;;;;;;:42;;;:49;;;;;;;;;;;;;;;;;;26664:3;;;;;:::i;:::-;;;;26638:107;;;;26593:159;26515:237:::0;;:::o;27678:907::-;27759:16;;;;;;;;;;;27737:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;27861:8;:20;27870:10;27861:20;;;;;;;;;;;;;;;:34;;;;;;;;;;;;27839:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;27980:1;27971:6;:10;27949:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;28071:6;28032:8;:20;28041:10;28032:20;;;;;;;;;;;;;;;:35;;;:45;;;;;;;:::i;:::-;;;;;;;;28149:1;28110:8;:20;28119:10;28110:20;;;;;;;;;;;;;;;:35;;;:40;;28088:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;28234:16;28253:26;28274:4;;28265:6;:13;;;;:::i;:::-;28253:11;:26::i;:::-;28234:45;;28315:8;28305:6;28298:4;;:13;;;;:::i;:::-;:25;;28290:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28366:6;28361:96;28382:6;28378:1;:10;28361:96;;;28410:35;28420:10;28432:12;;28410:9;:35::i;:::-;28390:3;;;;;:::i;:::-;;;;28361:96;;;;24703:1;28491:9;:21;28501:10;28491:21;;;;;;;;;;;;;;;;:37;;28469:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;27726:859;27678:907;:::o;24886:35::-;;;;;;;;;;;;;:::o;31495:423::-;31556:16;31585:20;31622:16;31632:5;31622:9;:16::i;:::-;31608:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31585:54;;31674:1;31654:16;31664:5;31654:9;:16::i;:::-;:21;31650:37;;31684:3;31677:10;;;;;31650:37;31698:13;31731:6;31726:164;24109:5;31743:1;:14;31726:164;;;31797:5;31783:19;;:10;31791:1;31783:7;:10::i;:::-;:19;;;31779:100;;31836:1;31823:3;31827:5;31823:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;31856:7;;;;;:::i;:::-;;;;31779:100;31759:3;;;;;:::i;:::-;;;;31726:164;;;;31907:3;31900:10;;;;31495:423;;;;:::o;32603:223::-;32667:7;32687:15;32705:7;:16;32713:7;32705:16;;;;;;;;;;;;;;;;;;;;;32687:34;;32759:1;32740:21;;:7;:21;;;32732:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32811:7;32804:14;;;32603:223;;;:::o;32351:190::-;32417:7;32464:1;32445:21;;:7;:21;;;32437:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;32515:9;:18;32525:7;32515:18;;;;;;;;;;;;;;;;32508:25;;32351:190;;;:::o;28650:931::-;28732:16;;;;;;;;;;;28710:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;28834:8;:20;28843:10;28834:20;;;;;;;;;;;;;;;:44;;;;;;;;;;;;28812:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;28974:1;28965:6;:10;28943:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29066:6;29026:8;:20;29035:10;29026:20;;;;;;;;;;;;;;;:36;;;:46;;;;;;;:::i;:::-;;;;;;;;29145:1;29105:8;:20;29114:10;29105:20;;;;;;;;;;;;;;;:36;;;:41;;29083:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;29230:16;29249:26;29270:4;;29261:6;:13;;;;:::i;:::-;29249:11;:26::i;:::-;29230:45;;29311:8;29301:6;29294:4;;:13;;;;:::i;:::-;:25;;29286:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29362:6;29357:96;29378:6;29374:1;:10;29357:96;;;29406:35;29416:10;29428:12;;29406:9;:35::i;:::-;29386:3;;;;;:::i;:::-;;;;29357:96;;;;24703:1;29487:9;:21;29497:10;29487:21;;;;;;;;;;;;;;;;:37;;29465:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;28699:882;28650:931;:::o;23585:83::-;23628:7;23655:5;;;;;;;;;;;23648:12;;23585:83;:::o;25747:205::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;25840:1:::1;25823:19;;:5;:19;;::::0;25815:44:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25877:5;25870:22;;;25893:10;25912:5;25905:23;;;25937:4;25905:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25870:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25747:205:::0;:::o;24584:28::-;;;:::o;33054:96::-;33102:13;33135:7;;;;;;;;;;;;;;;;;33128:14;;33054:96;:::o;26981:632::-;27054:16;;;;;;;;;;;27053:17;27031:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;27162:1;27153:6;:10;:25;;;;;27177:1;27167:6;:11;;27153:25;27131:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;27262:16;27281:26;27302:4;;27293:6;:13;;;;:::i;:::-;27281:11;:26::i;:::-;27262:45;;27343:8;27333:6;27326:4;;:13;;;;:::i;:::-;:25;;27318:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27394:6;27389:96;27410:6;27406:1;:10;27389:96;;;27438:35;27448:10;27460:12;;27438:9;:35::i;:::-;27418:3;;;;;:::i;:::-;;;;27389:96;;;;24703:1;27519:9;:21;27529:10;27519:21;;;;;;;;;;;;;;;;:37;;27497:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;27020:593;26981:632;:::o;30129:149::-;30217:53;30236:12;:10;:12::i;:::-;30250:9;30261:8;30217:18;:53::i;:::-;30129:149;;:::o;23359:132::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;23447:8:::1;23431:25;;23440:5;::::0;::::1;;;;;;;;23431:25;;;;;;;;;;;;23475:8;23467:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;23359:132:::0;:::o;39505:124::-;39554:6;39580:41;;;39573:48;;39505:124;:::o;30920:300::-;31087:41;31106:12;:10;:12::i;:::-;31120:7;31087:18;:41::i;:::-;31079:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31173:39;31187:4;31193:2;31197:7;31206:5;31173:13;:39::i;:::-;30920:300;;;;:::o;33221:107::-;33278:13;33311:9;33304:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33221:107;;;:::o;25494:88::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;25570:4:::1;25551:16;;:23;;;;;;;;;;;;;;;;;;25494:88::o:0;25396:90::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;25473:5:::1;25454:16;;:24;;;;;;;;;;;;;;;;;;25396:90::o:0;25960:118::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;26014:4:::1;:13;;;26028:10;26040:4;:14;;;26063:4;26040:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26014:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25960:118::o:0;26180:101::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;26267:6:::1;;26255:9;:18;;;;;;;:::i;:::-;;26180:101:::0;;:::o;34306:162::-;34398:4;34422:18;:27;34441:7;34422:27;;;;;;;;;;;;;;;:38;34450:9;34422:38;;;;;;;;;;;;;;;;;;;;;;;;;34415:45;;34306:162;;;;:::o;26289:218::-;22966:5;;;;;;;;;;22952:19;;:10;:19;;;22944:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:8:::1;26380:5;;:12;;26369:23;;26408:6;26403:97;26424:3;26420:1;:7;26403:97;;;26484:4;26449:8;:18;26458:5;;26464:1;26458:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;26449:18;;;;;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;26429:3;;;;;:::i;:::-;;;;26403:97;;;;26358:149;26289:218:::0;;:::o;1507:157::-;1592:4;1631:25;1616:40;;;:11;:40;;;;1609:47;;1507:157;;;:::o;34712:119::-;34769:4;34821:1;34793:30;;:7;:16;34801:7;34793:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34786:37;;34712:119;;;:::o;14496:98::-;14549:7;14576:10;14569:17;;14496:98;:::o;38877:159::-;38971:2;38944:15;:24;38960:7;38944:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39020:7;39016:2;38989:39;;38998:16;39006:7;38998;:16::i;:::-;38989:39;;;;;;;;;;;;38877:159;;:::o;34998:320::-;35083:4;35108:16;35116:7;35108;:16::i;:::-;35100:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;35165:15;35183:16;35191:7;35183;:16::i;:::-;35165:34;;35229:7;35218:18;;:7;:18;;;:53;;;;35264:7;35240:31;;:20;35252:7;35240:11;:20::i;:::-;:31;;;35218:53;:91;;;;35275:34;35292:7;35301;35275:16;:34::i;:::-;35218:91;35210:100;;;34998:320;;;;:::o;38187:572::-;38331:4;38311:24;;:16;38319:7;38311;:16::i;:::-;:24;;;38303:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;38388:1;38374:16;;:2;:16;;;38366:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;38444:1;38426:15;38436:4;38426:9;:15::i;:::-;:19;38418:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;38527:29;38544:1;38548:7;38527:8;:29::i;:::-;38618:1;38599:9;:15;38609:4;38599:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38647:1;38630:9;:13;38640:2;38630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38678:2;38659:7;:16;38667:7;38659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38743:7;38739:2;38724:27;;38733:4;38724:27;;;;;;;;;;;;38187:572;;;:::o;39637:495::-;39692:7;39712:11;39726:4;:14;;;39749:4;39726:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39712:43;;39788:4;:17;;;39824:10;39861:4;39885:6;39788:118;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39766:185;;;;;;;;;;;;:::i;:::-;;;;;;;;;39962:10;39975:4;:14;;;39998:4;39975:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39962:42;;40045:6;40037:5;:14;40015:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40118:6;40110:5;:14;;;;:::i;:::-;40103:21;;;;39637:495;;;:::o;35711:281::-;35804:18;35810:2;35814:7;35804:5;:18::i;:::-;35855:51;35886:1;35890:2;35894:7;35855:51;;;;;;;;;;;;:22;:51::i;:::-;35833:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;35711:281;;:::o;39178:319::-;39330:9;39319:20;;:7;:20;;;39311:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39421:8;39380:18;:27;39399:7;39380:27;;;;;;;;;;;;;;;:38;39408:9;39380:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;39469:9;39445:44;;39460:7;39445:44;;;39480:8;39445:44;;;;;;:::i;:::-;;;;;;;;39178:319;;;:::o;37553:295::-;37702:28;37712:4;37718:2;37722:7;37702:9;:28::i;:::-;37749:48;37772:4;37778:2;37782:7;37791:5;37749:22;:48::i;:::-;37741:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;37553:295;;;;:::o;36328:343::-;36401:16;36409:7;36401;:16::i;:::-;36400:17;36392:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24109:5;36469:12;;:25;36461:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36554:1;36537:9;:13;36547:2;36537:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36585:2;36566:7;:16;36574:7;36566:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36598:12;;:14;;;;;;;;;:::i;:::-;;;;;;36655:7;36651:2;36630:33;;36647:1;36630:33;;;;;;;;;;;;36328:343;;:::o;40697:787::-;40852:4;40873:15;:2;:13;;;:15::i;:::-;40869:608;;;40925:2;40909:36;;;40946:12;:10;:12::i;:::-;40960:4;40966:7;40975:5;40909:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40905:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41168:1;41151:6;:13;:18;41147:260;;41194:48;;;;;;;;;;:::i;:::-;;;;;;;;41147:260;41357:6;41351:13;41342:6;41338:2;41334:15;41327:38;40905:517;41042:41;;;41032:51;;;:6;:51;;;;41025:58;;;;;40869:608;41461:4;41454:11;;40697:787;;;;;;;:::o;8474:619::-;8534:4;8796:16;8823:19;8845:66;8823:88;;;;9014:7;9002:20;8990:32;;9054:11;9042:8;:23;;:42;;;;;9081:3;9069:15;;:8;:15;;9042:42;9034:51;;;;8474:619;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:529::-;5790:4;5828:3;5817:9;5813:19;5805:27;;5842:65;5904:1;5893:9;5889:17;5880:6;5842:65;:::i;:::-;5917:66;5979:2;5968:9;5964:18;5955:6;5917:66;:::i;:::-;5993:72;6061:2;6050:9;6046:18;6037:6;5993:72;:::i;:::-;6075;6143:2;6132:9;6128:18;6119:6;6075:72;:::i;:::-;5625:529;;;;;;;:::o;6160:619::-;6237:6;6245;6253;6302:2;6290:9;6281:7;6277:23;6273:32;6270:119;;;6308:79;;:::i;:::-;6270:119;6428:1;6453:53;6498:7;6489:6;6478:9;6474:22;6453:53;:::i;:::-;6443:63;;6399:117;6555:2;6581:53;6626:7;6617:6;6606:9;6602:22;6581:53;:::i;:::-;6571:63;;6526:118;6683:2;6709:53;6754:7;6745:6;6734:9;6730:22;6709:53;:::i;:::-;6699:63;;6654:118;6160:619;;;;;:::o;6785:117::-;6894:1;6891;6884:12;6908:117;7017:1;7014;7007:12;7031:117;7140:1;7137;7130:12;7171:568;7244:8;7254:6;7304:3;7297:4;7289:6;7285:17;7281:27;7271:122;;7312:79;;:::i;:::-;7271:122;7425:6;7412:20;7402:30;;7455:18;7447:6;7444:30;7441:117;;;7477:79;;:::i;:::-;7441:117;7591:4;7583:6;7579:17;7567:29;;7645:3;7637:4;7629:6;7625:17;7615:8;7611:32;7608:41;7605:128;;;7652:79;;:::i;:::-;7605:128;7171:568;;;;;:::o;7745:559::-;7831:6;7839;7888:2;7876:9;7867:7;7863:23;7859:32;7856:119;;;7894:79;;:::i;:::-;7856:119;8042:1;8031:9;8027:17;8014:31;8072:18;8064:6;8061:30;8058:117;;;8094:79;;:::i;:::-;8058:117;8207:80;8279:7;8270:6;8259:9;8255:22;8207:80;:::i;:::-;8189:98;;;;7985:312;7745:559;;;;;:::o;8310:114::-;8377:6;8411:5;8405:12;8395:22;;8310:114;;;:::o;8430:184::-;8529:11;8563:6;8558:3;8551:19;8603:4;8598:3;8594:14;8579:29;;8430:184;;;;:::o;8620:132::-;8687:4;8710:3;8702:11;;8740:4;8735:3;8731:14;8723:22;;8620:132;;;:::o;8758:108::-;8835:24;8853:5;8835:24;:::i;:::-;8830:3;8823:37;8758:108;;:::o;8872:179::-;8941:10;8962:46;9004:3;8996:6;8962:46;:::i;:::-;9040:4;9035:3;9031:14;9017:28;;8872:179;;;;:::o;9057:113::-;9127:4;9159;9154:3;9150:14;9142:22;;9057:113;;;:::o;9206:732::-;9325:3;9354:54;9402:5;9354:54;:::i;:::-;9424:86;9503:6;9498:3;9424:86;:::i;:::-;9417:93;;9534:56;9584:5;9534:56;:::i;:::-;9613:7;9644:1;9629:284;9654:6;9651:1;9648:13;9629:284;;;9730:6;9724:13;9757:63;9816:3;9801:13;9757:63;:::i;:::-;9750:70;;9843:60;9896:6;9843:60;:::i;:::-;9833:70;;9689:224;9676:1;9673;9669:9;9664:14;;9629:284;;;9633:14;9929:3;9922:10;;9330:608;;;9206:732;;;;:::o;9944:373::-;10087:4;10125:2;10114:9;10110:18;10102:26;;10174:9;10168:4;10164:20;10160:1;10149:9;10145:17;10138:47;10202:108;10305:4;10296:6;10202:108;:::i;:::-;10194:116;;9944:373;;;;:::o;10323:60::-;10351:3;10372:5;10365:12;;10323:60;;;:::o;10389:142::-;10439:9;10472:53;10490:34;10499:24;10517:5;10499:24;:::i;:::-;10490:34;:::i;:::-;10472:53;:::i;:::-;10459:66;;10389:142;;;:::o;10537:126::-;10587:9;10620:37;10651:5;10620:37;:::i;:::-;10607:50;;10537:126;;;:::o;10669:140::-;10733:9;10766:37;10797:5;10766:37;:::i;:::-;10753:50;;10669:140;;;:::o;10815:159::-;10916:51;10961:5;10916:51;:::i;:::-;10911:3;10904:64;10815:159;;:::o;10980:250::-;11087:4;11125:2;11114:9;11110:18;11102:26;;11138:85;11220:1;11209:9;11205:17;11196:6;11138:85;:::i;:::-;10980:250;;;;:::o;11236:116::-;11306:21;11321:5;11306:21;:::i;:::-;11299:5;11296:32;11286:60;;11342:1;11339;11332:12;11286:60;11236:116;:::o;11358:133::-;11401:5;11439:6;11426:20;11417:29;;11455:30;11479:5;11455:30;:::i;:::-;11358:133;;;;:::o;11497:468::-;11562:6;11570;11619:2;11607:9;11598:7;11594:23;11590:32;11587:119;;;11625:79;;:::i;:::-;11587:119;11745:1;11770:53;11815:7;11806:6;11795:9;11791:22;11770:53;:::i;:::-;11760:63;;11716:117;11872:2;11898:50;11940:7;11931:6;11920:9;11916:22;11898:50;:::i;:::-;11888:60;;11843:115;11497:468;;;;;:::o;11971:115::-;12056:23;12073:5;12056:23;:::i;:::-;12051:3;12044:36;11971:115;;:::o;12092:218::-;12183:4;12221:2;12210:9;12206:18;12198:26;;12234:69;12300:1;12289:9;12285:17;12276:6;12234:69;:::i;:::-;12092:218;;;;:::o;12316:117::-;12425:1;12422;12415:12;12439:180;12487:77;12484:1;12477:88;12584:4;12581:1;12574:15;12608:4;12605:1;12598:15;12625:281;12708:27;12730:4;12708:27;:::i;:::-;12700:6;12696:40;12838:6;12826:10;12823:22;12802:18;12790:10;12787:34;12784:62;12781:88;;;12849:18;;:::i;:::-;12781:88;12889:10;12885:2;12878:22;12668:238;12625:281;;:::o;12912:129::-;12946:6;12973:20;;:::i;:::-;12963:30;;13002:33;13030:4;13022:6;13002:33;:::i;:::-;12912:129;;;:::o;13047:307::-;13108:4;13198:18;13190:6;13187:30;13184:56;;;13220:18;;:::i;:::-;13184:56;13258:29;13280:6;13258:29;:::i;:::-;13250:37;;13342:4;13336;13332:15;13324:23;;13047:307;;;:::o;13360:154::-;13444:6;13439:3;13434;13421:30;13506:1;13497:6;13492:3;13488:16;13481:27;13360:154;;;:::o;13520:410::-;13597:5;13622:65;13638:48;13679:6;13638:48;:::i;:::-;13622:65;:::i;:::-;13613:74;;13710:6;13703:5;13696:21;13748:4;13741:5;13737:16;13786:3;13777:6;13772:3;13768:16;13765:25;13762:112;;;13793:79;;:::i;:::-;13762:112;13883:41;13917:6;13912:3;13907;13883:41;:::i;:::-;13603:327;13520:410;;;;;:::o;13949:338::-;14004:5;14053:3;14046:4;14038:6;14034:17;14030:27;14020:122;;14061:79;;:::i;:::-;14020:122;14178:6;14165:20;14203:78;14277:3;14269:6;14262:4;14254:6;14250:17;14203:78;:::i;:::-;14194:87;;14010:277;13949:338;;;;:::o;14293:943::-;14388:6;14396;14404;14412;14461:3;14449:9;14440:7;14436:23;14432:33;14429:120;;;14468:79;;:::i;:::-;14429:120;14588:1;14613:53;14658:7;14649:6;14638:9;14634:22;14613:53;:::i;:::-;14603:63;;14559:117;14715:2;14741:53;14786:7;14777:6;14766:9;14762:22;14741:53;:::i;:::-;14731:63;;14686:118;14843:2;14869:53;14914:7;14905:6;14894:9;14890:22;14869:53;:::i;:::-;14859:63;;14814:118;14999:2;14988:9;14984:18;14971:32;15030:18;15022:6;15019:30;15016:117;;;15052:79;;:::i;:::-;15016:117;15157:62;15211:7;15202:6;15191:9;15187:22;15157:62;:::i;:::-;15147:72;;14942:287;14293:943;;;;;;;:::o;15256:553::-;15314:8;15324:6;15374:3;15367:4;15359:6;15355:17;15351:27;15341:122;;15382:79;;:::i;:::-;15341:122;15495:6;15482:20;15472:30;;15525:18;15517:6;15514:30;15511:117;;;15547:79;;:::i;:::-;15511:117;15661:4;15653:6;15649:17;15637:29;;15715:3;15707:4;15699:6;15695:17;15685:8;15681:32;15678:41;15675:128;;;15722:79;;:::i;:::-;15675:128;15256:553;;;;;:::o;15815:529::-;15886:6;15894;15943:2;15931:9;15922:7;15918:23;15914:32;15911:119;;;15949:79;;:::i;:::-;15911:119;16097:1;16086:9;16082:17;16069:31;16127:18;16119:6;16116:30;16113:117;;;16149:79;;:::i;:::-;16113:117;16262:65;16319:7;16310:6;16299:9;16295:22;16262:65;:::i;:::-;16244:83;;;;16040:297;15815:529;;;;;:::o;16350:474::-;16418:6;16426;16475:2;16463:9;16454:7;16450:23;16446:32;16443:119;;;16481:79;;:::i;:::-;16443:119;16601:1;16626:53;16671:7;16662:6;16651:9;16647:22;16626:53;:::i;:::-;16616:63;;16572:117;16728:2;16754:53;16799:7;16790:6;16779:9;16775:22;16754:53;:::i;:::-;16744:63;;16699:118;16350:474;;;;;:::o;16830:222::-;16970:34;16966:1;16958:6;16954:14;16947:58;17039:5;17034:2;17026:6;17022:15;17015:30;16830:222;:::o;17058:366::-;17200:3;17221:67;17285:2;17280:3;17221:67;:::i;:::-;17214:74;;17297:93;17386:3;17297:93;:::i;:::-;17415:2;17410:3;17406:12;17399:19;;17058:366;;;:::o;17430:419::-;17596:4;17634:2;17623:9;17619:18;17611:26;;17683:9;17677:4;17673:20;17669:1;17658:9;17654:17;17647:47;17711:131;17837:4;17711:131;:::i;:::-;17703:139;;17430:419;;;:::o;17855:220::-;17995:34;17991:1;17983:6;17979:14;17972:58;18064:3;18059:2;18051:6;18047:15;18040:28;17855:220;:::o;18081:366::-;18223:3;18244:67;18308:2;18303:3;18244:67;:::i;:::-;18237:74;;18320:93;18409:3;18320:93;:::i;:::-;18438:2;18433:3;18429:12;18422:19;;18081:366;;;:::o;18453:419::-;18619:4;18657:2;18646:9;18642:18;18634:26;;18706:9;18700:4;18696:20;18692:1;18681:9;18677:17;18670:47;18734:131;18860:4;18734:131;:::i;:::-;18726:139;;18453:419;;;:::o;18878:179::-;19018:31;19014:1;19006:6;19002:14;18995:55;18878:179;:::o;19063:366::-;19205:3;19226:67;19290:2;19285:3;19226:67;:::i;:::-;19219:74;;19302:93;19391:3;19302:93;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19063:366;;;:::o;19435:419::-;19601:4;19639:2;19628:9;19624:18;19616:26;;19688:9;19682:4;19678:20;19674:1;19663:9;19659:17;19652:47;19716:131;19842:4;19716:131;:::i;:::-;19708:139;;19435:419;;;:::o;19860:179::-;20000:31;19996:1;19988:6;19984:14;19977:55;19860:179;:::o;20045:366::-;20187:3;20208:67;20272:2;20267:3;20208:67;:::i;:::-;20201:74;;20284:93;20373:3;20284:93;:::i;:::-;20402:2;20397:3;20393:12;20386:19;;20045:366;;;:::o;20417:419::-;20583:4;20621:2;20610:9;20606:18;20598:26;;20670:9;20664:4;20660:20;20656:1;20645:9;20641:17;20634:47;20698:131;20824:4;20698:131;:::i;:::-;20690:139;;20417:419;;;:::o;20842:169::-;20982:21;20978:1;20970:6;20966:14;20959:45;20842:169;:::o;21017:366::-;21159:3;21180:67;21244:2;21239:3;21180:67;:::i;:::-;21173:74;;21256:93;21345:3;21256:93;:::i;:::-;21374:2;21369:3;21365:12;21358:19;;21017:366;;;:::o;21389:419::-;21555:4;21593:2;21582:9;21578:18;21570:26;;21642:9;21636:4;21632:20;21628:1;21617:9;21613:17;21606:47;21670:131;21796:4;21670:131;:::i;:::-;21662:139;;21389:419;;;:::o;21814:147::-;21915:11;21952:3;21937:18;;21814:147;;;;:::o;21967:114::-;;:::o;22087:398::-;22246:3;22267:83;22348:1;22343:3;22267:83;:::i;:::-;22260:90;;22359:93;22448:3;22359:93;:::i;:::-;22477:1;22472:3;22468:11;22461:18;;22087:398;;;:::o;22491:379::-;22675:3;22697:147;22840:3;22697:147;:::i;:::-;22690:154;;22861:3;22854:10;;22491:379;;;:::o;22876:180::-;22924:77;22921:1;22914:88;23021:4;23018:1;23011:15;23045:4;23042:1;23035:15;23062:180;23110:77;23107:1;23100:88;23207:4;23204:1;23197:15;23231:4;23228:1;23221:15;23248:233;23287:3;23310:24;23328:5;23310:24;:::i;:::-;23301:33;;23356:66;23349:5;23346:77;23343:103;;23426:18;;:::i;:::-;23343:103;23473:1;23466:5;23462:13;23455:20;;23248:233;;;:::o;23487:175::-;23627:27;23623:1;23615:6;23611:14;23604:51;23487:175;:::o;23668:366::-;23810:3;23831:67;23895:2;23890:3;23831:67;:::i;:::-;23824:74;;23907:93;23996:3;23907:93;:::i;:::-;24025:2;24020:3;24016:12;24009:19;;23668:366;;;:::o;24040:419::-;24206:4;24244:2;24233:9;24229:18;24221:26;;24293:9;24287:4;24283:20;24279:1;24268:9;24264:17;24257:47;24321:131;24447:4;24321:131;:::i;:::-;24313:139;;24040:419;;;:::o;24465:165::-;24605:17;24601:1;24593:6;24589:14;24582:41;24465:165;:::o;24636:366::-;24778:3;24799:67;24863:2;24858:3;24799:67;:::i;:::-;24792:74;;24875:93;24964:3;24875:93;:::i;:::-;24993:2;24988:3;24984:12;24977:19;;24636:366;;;:::o;25008:419::-;25174:4;25212:2;25201:9;25197:18;25189:26;;25261:9;25255:4;25251:20;25247:1;25236:9;25232:17;25225:47;25289:131;25415:4;25289:131;:::i;:::-;25281:139;;25008:419;;;:::o;25433:160::-;25573:12;25569:1;25561:6;25557:14;25550:36;25433:160;:::o;25599:366::-;25741:3;25762:67;25826:2;25821:3;25762:67;:::i;:::-;25755:74;;25838:93;25927:3;25838:93;:::i;:::-;25956:2;25951:3;25947:12;25940:19;;25599:366;;;:::o;25971:419::-;26137:4;26175:2;26164:9;26160:18;26152:26;;26224:9;26218:4;26214:20;26210:1;26199:9;26195:17;26188:47;26252:131;26378:4;26252:131;:::i;:::-;26244:139;;25971:419;;;:::o;26396:305::-;26436:3;26455:20;26473:1;26455:20;:::i;:::-;26450:25;;26489:20;26507:1;26489:20;:::i;:::-;26484:25;;26643:1;26575:66;26571:74;26568:1;26565:81;26562:107;;;26649:18;;:::i;:::-;26562:107;26693:1;26690;26686:9;26679:16;;26396:305;;;;:::o;26707:164::-;26847:16;26843:1;26835:6;26831:14;26824:40;26707:164;:::o;26877:366::-;27019:3;27040:67;27104:2;27099:3;27040:67;:::i;:::-;27033:74;;27116:93;27205:3;27116:93;:::i;:::-;27234:2;27229:3;27225:12;27218:19;;26877:366;;;:::o;27249:419::-;27415:4;27453:2;27442:9;27438:18;27430:26;;27502:9;27496:4;27492:20;27488:1;27477:9;27473:17;27466:47;27530:131;27656:4;27530:131;:::i;:::-;27522:139;;27249:419;;;:::o;27674:348::-;27714:7;27737:20;27755:1;27737:20;:::i;:::-;27732:25;;27771:20;27789:1;27771:20;:::i;:::-;27766:25;;27959:1;27891:66;27887:74;27884:1;27881:81;27876:1;27869:9;27862:17;27858:105;27855:131;;;27966:18;;:::i;:::-;27855:131;28014:1;28011;28007:9;27996:20;;27674:348;;;;:::o;28028:170::-;28168:22;28164:1;28156:6;28152:14;28145:46;28028:170;:::o;28204:366::-;28346:3;28367:67;28431:2;28426:3;28367:67;:::i;:::-;28360:74;;28443:93;28532:3;28443:93;:::i;:::-;28561:2;28556:3;28552:12;28545:19;;28204:366;;;:::o;28576:419::-;28742:4;28780:2;28769:9;28765:18;28757:26;;28829:9;28823:4;28819:20;28815:1;28804:9;28800:17;28793:47;28857:131;28983:4;28857:131;:::i;:::-;28849:139;;28576:419;;;:::o;29001:171::-;29141:23;29137:1;29129:6;29125:14;29118:47;29001:171;:::o;29178:366::-;29320:3;29341:67;29405:2;29400:3;29341:67;:::i;:::-;29334:74;;29417:93;29506:3;29417:93;:::i;:::-;29535:2;29530:3;29526:12;29519:19;;29178:366;;;:::o;29550:419::-;29716:4;29754:2;29743:9;29739:18;29731:26;;29803:9;29797:4;29793:20;29789:1;29778:9;29774:17;29767:47;29831:131;29957:4;29831:131;:::i;:::-;29823:139;;29550:419;;;:::o;29975:177::-;30115:29;30111:1;30103:6;30099:14;30092:53;29975:177;:::o;30158:366::-;30300:3;30321:67;30385:2;30380:3;30321:67;:::i;:::-;30314:74;;30397:93;30486:3;30397:93;:::i;:::-;30515:2;30510:3;30506:12;30499:19;;30158:366;;;:::o;30530:419::-;30696:4;30734:2;30723:9;30719:18;30711:26;;30783:9;30777:4;30773:20;30769:1;30758:9;30754:17;30747:47;30811:131;30937:4;30811:131;:::i;:::-;30803:139;;30530:419;;;:::o;30955:176::-;31095:28;31091:1;31083:6;31079:14;31072:52;30955:176;:::o;31137:366::-;31279:3;31300:67;31364:2;31359:3;31300:67;:::i;:::-;31293:74;;31376:93;31465:3;31376:93;:::i;:::-;31494:2;31489:3;31485:12;31478:19;;31137:366;;;:::o;31509:419::-;31675:4;31713:2;31702:9;31698:18;31690:26;;31762:9;31756:4;31752:20;31748:1;31737:9;31733:17;31726:47;31790:131;31916:4;31790:131;:::i;:::-;31782:139;;31509:419;;;:::o;31934:176::-;32074:28;32070:1;32062:6;32058:14;32051:52;31934:176;:::o;32116:366::-;32258:3;32279:67;32343:2;32338:3;32279:67;:::i;:::-;32272:74;;32355:93;32444:3;32355:93;:::i;:::-;32473:2;32468:3;32464:12;32457:19;;32116:366;;;:::o;32488:419::-;32654:4;32692:2;32681:9;32677:18;32669:26;;32741:9;32735:4;32731:20;32727:1;32716:9;32712:17;32705:47;32769:131;32895:4;32769:131;:::i;:::-;32761:139;;32488:419;;;:::o;32913:162::-;33053:14;33049:1;33041:6;33037:14;33030:38;32913:162;:::o;33081:366::-;33223:3;33244:67;33308:2;33303:3;33244:67;:::i;:::-;33237:74;;33320:93;33409:3;33320:93;:::i;:::-;33438:2;33433:3;33429:12;33422:19;;33081:366;;;:::o;33453:419::-;33619:4;33657:2;33646:9;33642:18;33634:26;;33706:9;33700:4;33696:20;33692:1;33681:9;33677:17;33670:47;33734:131;33860:4;33734:131;:::i;:::-;33726:139;;33453:419;;;:::o;33878:143::-;33935:5;33966:6;33960:13;33951:22;;33982:33;34009:5;33982:33;:::i;:::-;33878:143;;;;:::o;34027:351::-;34097:6;34146:2;34134:9;34125:7;34121:23;34117:32;34114:119;;;34152:79;;:::i;:::-;34114:119;34272:1;34297:64;34353:7;34344:6;34333:9;34329:22;34297:64;:::i;:::-;34287:74;;34243:128;34027:351;;;;:::o;34384:332::-;34505:4;34543:2;34532:9;34528:18;34520:26;;34556:71;34624:1;34613:9;34609:17;34600:6;34556:71;:::i;:::-;34637:72;34705:2;34694:9;34690:18;34681:6;34637:72;:::i;:::-;34384:332;;;;;:::o;34722:137::-;34776:5;34807:6;34801:13;34792:22;;34823:30;34847:5;34823:30;:::i;:::-;34722:137;;;;:::o;34865:345::-;34932:6;34981:2;34969:9;34960:7;34956:23;34952:32;34949:119;;;34987:79;;:::i;:::-;34949:119;35107:1;35132:61;35185:7;35176:6;35165:9;35161:22;35132:61;:::i;:::-;35122:71;;35078:125;34865:345;;;;:::o;35216:171::-;35356:23;35352:1;35344:6;35340:14;35333:47;35216:171;:::o;35393:366::-;35535:3;35556:67;35620:2;35615:3;35556:67;:::i;:::-;35549:74;;35632:93;35721:3;35632:93;:::i;:::-;35750:2;35745:3;35741:12;35734:19;;35393:366;;;:::o;35765:419::-;35931:4;35969:2;35958:9;35954:18;35946:26;;36018:9;36012:4;36008:20;36004:1;35993:9;35989:17;35982:47;36046:131;36172:4;36046:131;:::i;:::-;36038:139;;35765:419;;;:::o;36190:163::-;36330:15;36326:1;36318:6;36314:14;36307:39;36190:163;:::o;36359:366::-;36501:3;36522:67;36586:2;36581:3;36522:67;:::i;:::-;36515:74;;36598:93;36687:3;36598:93;:::i;:::-;36716:2;36711:3;36707:12;36700:19;;36359:366;;;:::o;36731:419::-;36897:4;36935:2;36924:9;36920:18;36912:26;;36984:9;36978:4;36974:20;36970:1;36959:9;36955:17;36948:47;37012:131;37138:4;37012:131;:::i;:::-;37004:139;;36731:419;;;:::o;37156:180::-;37204:77;37201:1;37194:88;37301:4;37298:1;37291:15;37325:4;37322:1;37315:15;37342:320;37386:6;37423:1;37417:4;37413:12;37403:22;;37470:1;37464:4;37460:12;37491:18;37481:81;;37547:4;37539:6;37535:17;37525:27;;37481:81;37609:2;37601:6;37598:14;37578:18;37575:38;37572:84;;37628:18;;:::i;:::-;37572:84;37393:269;37342:320;;;:::o;37668:175::-;37808:27;37804:1;37796:6;37792:14;37785:51;37668:175;:::o;37849:366::-;37991:3;38012:67;38076:2;38071:3;38012:67;:::i;:::-;38005:74;;38088:93;38177:3;38088:93;:::i;:::-;38206:2;38201:3;38197:12;38190:19;;37849:366;;;:::o;38221:419::-;38387:4;38425:2;38414:9;38410:18;38402:26;;38474:9;38468:4;38464:20;38460:1;38449:9;38445:17;38438:47;38502:131;38628:4;38502:131;:::i;:::-;38494:139;;38221:419;;;:::o;38646:165::-;38786:17;38782:1;38774:6;38770:14;38763:41;38646:165;:::o;38817:366::-;38959:3;38980:67;39044:2;39039:3;38980:67;:::i;:::-;38973:74;;39056:93;39145:3;39056:93;:::i;:::-;39174:2;39169:3;39165:12;39158:19;;38817:366;;;:::o;39189:419::-;39355:4;39393:2;39382:9;39378:18;39370:26;;39442:9;39436:4;39432:20;39428:1;39417:9;39413:17;39406:47;39470:131;39596:4;39470:131;:::i;:::-;39462:139;;39189:419;;;:::o;39614:162::-;39754:14;39750:1;39742:6;39738:14;39731:38;39614:162;:::o;39782:366::-;39924:3;39945:67;40009:2;40004:3;39945:67;:::i;:::-;39938:74;;40021:93;40110:3;40021:93;:::i;:::-;40139:2;40134:3;40130:12;40123:19;;39782:366;;;:::o;40154:419::-;40320:4;40358:2;40347:9;40343:18;40335:26;;40407:9;40401:4;40397:20;40393:1;40382:9;40378:17;40371:47;40435:131;40561:4;40435:131;:::i;:::-;40427:139;;40154:419;;;:::o;40579:162::-;40719:14;40715:1;40707:6;40703:14;40696:38;40579:162;:::o;40747:366::-;40889:3;40910:67;40974:2;40969:3;40910:67;:::i;:::-;40903:74;;40986:93;41075:3;40986:93;:::i;:::-;41104:2;41099:3;41095:12;41088:19;;40747:366;;;:::o;41119:419::-;41285:4;41323:2;41312:9;41308:18;41300:26;;41372:9;41366:4;41362:20;41358:1;41347:9;41343:17;41336:47;41400:131;41526:4;41400:131;:::i;:::-;41392:139;;41119:419;;;:::o;41544:191::-;41584:4;41604:20;41622:1;41604:20;:::i;:::-;41599:25;;41638:20;41656:1;41638:20;:::i;:::-;41633:25;;41677:1;41674;41671:8;41668:34;;;41682:18;;:::i;:::-;41668:34;41727:1;41724;41720:9;41712:17;;41544:191;;;;:::o;41741:442::-;41890:4;41928:2;41917:9;41913:18;41905:26;;41941:71;42009:1;41998:9;41994:17;41985:6;41941:71;:::i;:::-;42022:72;42090:2;42079:9;42075:18;42066:6;42022:72;:::i;:::-;42104;42172:2;42161:9;42157:18;42148:6;42104:72;:::i;:::-;41741:442;;;;;;:::o;42189:167::-;42329:19;42325:1;42317:6;42313:14;42306:43;42189:167;:::o;42362:366::-;42504:3;42525:67;42589:2;42584:3;42525:67;:::i;:::-;42518:74;;42601:93;42690:3;42601:93;:::i;:::-;42719:2;42714:3;42710:12;42703:19;;42362:366;;;:::o;42734:419::-;42900:4;42938:2;42927:9;42923:18;42915:26;;42987:9;42981:4;42977:20;42973:1;42962:9;42958:17;42951:47;43015:131;43141:4;43015:131;:::i;:::-;43007:139;;42734:419;;;:::o;43159:163::-;43299:15;43295:1;43287:6;43283:14;43276:39;43159:163;:::o;43328:366::-;43470:3;43491:67;43555:2;43550:3;43491:67;:::i;:::-;43484:74;;43567:93;43656:3;43567:93;:::i;:::-;43685:2;43680:3;43676:12;43669:19;;43328:366;;;:::o;43700:419::-;43866:4;43904:2;43893:9;43889:18;43881:26;;43953:9;43947:4;43943:20;43939:1;43928:9;43924:17;43917:47;43981:131;44107:4;43981:131;:::i;:::-;43973:139;;43700:419;;;:::o;44125:237::-;44265:34;44261:1;44253:6;44249:14;44242:58;44334:20;44329:2;44321:6;44317:15;44310:45;44125:237;:::o;44368:366::-;44510:3;44531:67;44595:2;44590:3;44531:67;:::i;:::-;44524:74;;44607:93;44696:3;44607:93;:::i;:::-;44725:2;44720:3;44716:12;44709:19;;44368:366;;;:::o;44740:419::-;44906:4;44944:2;44933:9;44929:18;44921:26;;44993:9;44987:4;44983:20;44979:1;44968:9;44964:17;44957:47;45021:131;45147:4;45021:131;:::i;:::-;45013:139;;44740:419;;;:::o;45165:175::-;45305:27;45301:1;45293:6;45289:14;45282:51;45165:175;:::o;45346:366::-;45488:3;45509:67;45573:2;45568:3;45509:67;:::i;:::-;45502:74;;45585:93;45674:3;45585:93;:::i;:::-;45703:2;45698:3;45694:12;45687:19;;45346:366;;;:::o;45718:419::-;45884:4;45922:2;45911:9;45907:18;45899:26;;45971:9;45965:4;45961:20;45957:1;45946:9;45942:17;45935:47;45999:131;46125:4;45999:131;:::i;:::-;45991:139;;45718:419;;;:::o;46143:225::-;46283:34;46279:1;46271:6;46267:14;46260:58;46352:8;46347:2;46339:6;46335:15;46328:33;46143:225;:::o;46374:366::-;46516:3;46537:67;46601:2;46596:3;46537:67;:::i;:::-;46530:74;;46613:93;46702:3;46613:93;:::i;:::-;46731:2;46726:3;46722:12;46715:19;;46374:366;;;:::o;46746:419::-;46912:4;46950:2;46939:9;46935:18;46927:26;;46999:9;46993:4;46989:20;46985:1;46974:9;46970:17;46963:47;47027:131;47153:4;47027:131;:::i;:::-;47019:139;;46746:419;;;:::o;47171:178::-;47311:30;47307:1;47299:6;47295:14;47288:54;47171:178;:::o;47355:366::-;47497:3;47518:67;47582:2;47577:3;47518:67;:::i;:::-;47511:74;;47594:93;47683:3;47594:93;:::i;:::-;47712:2;47707:3;47703:12;47696:19;;47355:366;;;:::o;47727:419::-;47893:4;47931:2;47920:9;47916:18;47908:26;;47980:9;47974:4;47970:20;47966:1;47955:9;47951:17;47944:47;48008:131;48134:4;48008:131;:::i;:::-;48000:139;;47727:419;;;:::o;48152:175::-;48292:27;48288:1;48280:6;48276:14;48269:51;48152:175;:::o;48333:366::-;48475:3;48496:67;48560:2;48555:3;48496:67;:::i;:::-;48489:74;;48572:93;48661:3;48572:93;:::i;:::-;48690:2;48685:3;48681:12;48674:19;;48333:366;;;:::o;48705:419::-;48871:4;48909:2;48898:9;48894:18;48886:26;;48958:9;48952:4;48948:20;48944:1;48933:9;48929:17;48922:47;48986:131;49112:4;48986:131;:::i;:::-;48978:139;;48705:419;;;:::o;49130:98::-;49181:6;49215:5;49209:12;49199:22;;49130:98;;;:::o;49234:168::-;49317:11;49351:6;49346:3;49339:19;49391:4;49386:3;49382:14;49367:29;;49234:168;;;;:::o;49408:360::-;49494:3;49522:38;49554:5;49522:38;:::i;:::-;49576:70;49639:6;49634:3;49576:70;:::i;:::-;49569:77;;49655:52;49700:6;49695:3;49688:4;49681:5;49677:16;49655:52;:::i;:::-;49732:29;49754:6;49732:29;:::i;:::-;49727:3;49723:39;49716:46;;49498:270;49408:360;;;;:::o;49774:640::-;49969:4;50007:3;49996:9;49992:19;49984:27;;50021:71;50089:1;50078:9;50074:17;50065:6;50021:71;:::i;:::-;50102:72;50170:2;50159:9;50155:18;50146:6;50102:72;:::i;:::-;50184;50252:2;50241:9;50237:18;50228:6;50184:72;:::i;:::-;50303:9;50297:4;50293:20;50288:2;50277:9;50273:18;50266:48;50331:76;50402:4;50393:6;50331:76;:::i;:::-;50323:84;;49774:640;;;;;;;:::o;50420:141::-;50476:5;50507:6;50501:13;50492:22;;50523:32;50549:5;50523:32;:::i;:::-;50420:141;;;;:::o;50567:349::-;50636:6;50685:2;50673:9;50664:7;50660:23;50656:32;50653:119;;;50691:79;;:::i;:::-;50653:119;50811:1;50836:63;50891:7;50882:6;50871:9;50867:22;50836:63;:::i;:::-;50826:73;;50782:127;50567:349;;;;:::o

Swarm Source

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