ETH Price: $3,498.50 (-0.14%)
Gas: 3 Gwei

Token

FAMCO (FAMCO)
 

Overview

Max Total Supply

622 FAMCO

Holders

278

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FAMCO
0x1a55744f1851fbafadc1f64aff59825bec68f015
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:
FAMCO

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-03
*/

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

}


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

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

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor () {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

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

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 FAMCO is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard, Ownable {
    using Address for address;
    using SafeMath for uint256;

    // Token name
    string private constant _name = "FAMCO";

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

    // total number of NFTs Minted
    uint256 private _totalSupply;

    // current tokenID to mint at
    uint256 public currentSupplyIndex;

    // Total Number Of Reward Shares (accounts for differing rarities)
    uint256 public totalShares;

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

    // Mapping from address to permission to deposit rewards
    mapping ( address => bool ) public canGiveRewards;

    // Maps a TokenID to a rarity
    mapping ( uint256 => uint8 ) public tokenIDToRarity;

    // owner rewards structure
    struct OwnerRewards {
        uint256 share; // accounts for rarity of different NFTs
        uint256 totalExcluded; // aka reward debt
    }

    // Mapping from owner to excluded rewards
    mapping(address => OwnerRewards) public ownerRewards;

    // total dividends for tracking
    uint256 private dividendsPerShare;

    // total rewards received
    uint256 public totalRewards;

    // precision factor
    uint256 private PRECISION = 10**9;

    // base URI
    string private baseURI = "";
    string private ending = ".json";

    // Token Rarity Structure
    struct TokenRarity {
        uint256 cost;
        uint8 multiplier;
    }

    // cost for minting NFT
    mapping ( uint8 => TokenRarity ) public tokenRarity;

    // Enable Trading
    bool public tradingEnabled = false;

    // Toggle URI based on rarity vs tokenID
    bool public UriByRarity = true;

    // Mint Token
    address public mintToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
    address public rewardToken = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599;
    address public mintRecipient;

    ////////////////////////////////////////////////
    ///////////     OWNER FUNCTIONS      ///////////
    ////////////////////////////////////////////////

    function __init__(address mintRecipient_) external onlyOwner {
        require(
            mintRecipient_ != address(0),
            'Zero Addr'
        );
        tokenRarity[0].cost = 500 * 10**6;
        tokenRarity[1].cost = 1000 * 10**6;
        tokenRarity[2].cost = 2000 * 10**6;
        tokenRarity[3].cost = 5000 * 10**6;
        tokenRarity[0].multiplier = 1;
        tokenRarity[1].multiplier = 2;
        tokenRarity[2].multiplier = 4;
        tokenRarity[3].multiplier = 10;
        mintRecipient = mintRecipient_;
        canGiveRewards[mintRecipient_] = true;
    }

    function resumeTrading() external onlyOwner {
        tradingEnabled = true;
    }

    function pauseTrading() external onlyOwner {
        tradingEnabled = false;
    }

    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 setBaseURI(string calldata newURI) external onlyOwner {
        baseURI = newURI;
    }

    function setURIExtention(string calldata newExtention) external onlyOwner {
        ending = newExtention;
    }

    function setMintToken(address newMintToken) external onlyOwner {
        mintToken = newMintToken;
    }

    function setMintRecipient(address mintRecipient_) external onlyOwner {
        mintRecipient = mintRecipient_;
    }

    function setRewardToken(address rewardToken_) external onlyOwner {
        rewardToken = rewardToken_;
    }

    function setRarityCost(uint8 rarity, uint256 cost) external onlyOwner {
        require(tokenRarity[rarity].multiplier > 0, 'Multiplier Not Set');
        tokenRarity[rarity].cost = cost;
    }

    function setRarityMultiplier(uint8 rarity, uint8 multiplier) external onlyOwner {
        require(tokenRarity[rarity].multiplier == 0, 'Multiplier Already Set');
        tokenRarity[rarity].multiplier = multiplier;
    }

    function setCanGiveRewards(address account, bool canGive) external onlyOwner {
        canGiveRewards[account] = canGive;
    }

    function setURIByRarity(bool isUriBasedOnRarity) external onlyOwner {
        UriByRarity = isUriBasedOnRarity;
    }

    /**
        Example:
        [ 0x123...abc, 0x456...def ]
        [ 5, 10 ]
        [ 3, 0 ]
        
        Gives the result:
        0x123...abc gets 5 Platinum NFTs
        0x456...def gets 10 Bronze NFTs

     */
    function ownerMint(address[] calldata tos, uint256[] calldata nums, uint8[] calldata raritys) external onlyOwner {
        
        uint addrLen = tos.length;
        require(addrLen == nums.length && nums.length == raritys.length, 'Invalid Lengths');
        
        for (uint i = 0; i < addrLen;) {
            for (uint j = 0; j < nums[i];) {
                _safeMint(tos[i], currentSupplyIndex, raritys[i]);
                unchecked { ++j; }
            }
            unchecked { ++i; }
        }
    }


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


    /** 
     * Mints `numberOfMints` NFTs To Caller
     */
    function mint(address to, uint256 num, uint8 rarity) external {
        require(
            tradingEnabled,
            'Trading Not Enabled'
        );
        require(
            num > 0, 
            'Invalid Number'
        );
        require(
            tokenRarity[rarity].cost > 0 && tokenRarity[rarity].multiplier > 0,
            'Invalid Rarity'
        );
        
        // determine cost in USDC
        uint256 cost = tokenRarity[rarity].cost * num;

        // ensure user has balance and approval of this amount
        require(
            IERC20(mintToken).balanceOf(msg.sender) >= cost,
            'Insufficient USDC Balance'
        );
        require(
            IERC20(mintToken).allowance(msg.sender, address(this)) >= cost,
            'Insufficient Allowance'
        );
        require(
            IERC20(mintToken).transferFrom(msg.sender, mintRecipient, cost),
            'Error Transfer From'
        );

        for (uint i = 0; i < num;) {
            _safeMint(to, currentSupplyIndex, rarity);
            unchecked { ++i; }
        }
    }

    function claimRewards() external nonReentrant {
        require(
            _balances[msg.sender] > 0,
            'Zero Balance'
        );
        _claimRewards(msg.sender);
    }


    function burn(uint256 tokenID) external nonReentrant {
        require(_isApprovedOrOwner(_msgSender(), tokenID), "caller not owner nor approved");
        _claimRewards(_owners[tokenID]);
        _burn(tokenID);
    }

    function giveRewards(uint256 amount) external nonReentrant {
        require(
            IERC20(rewardToken).balanceOf(msg.sender) >= amount,
            'Insufficient Balance'
        );
        require(
            IERC20(rewardToken).allowance(msg.sender, address(this)) >= amount,
            'Insufficient BTC Allowance'
        );
        require(
            IERC20(rewardToken).transferFrom(msg.sender, address(this), amount),
            'Failure Transfer From'
        );

        // give rewards
        unchecked {
            dividendsPerShare += ( amount * PRECISION ) / totalShares;
            totalRewards += amount;
        }        
    }

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



    ////////////////////////////////////////////////
    ///////////    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,
        uint8 rarity
    ) internal {
        _mint(to, tokenId, rarity);
        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, uint8 rarity) internal {
        require(!_exists(tokenId), "ERC721: token already minted");

        _owners[tokenId] = to;
        tokenIDToRarity[tokenId] = rarity;
        unchecked {
            currentSupplyIndex++;
            _totalSupply++;
            _balances[to]++;
            totalShares += tokenRarity[rarity].multiplier;
            ownerRewards[to].share += tokenRarity[rarity].multiplier;
        }

        ownerRewards[to].totalExcluded = getCumulativeDividends(ownerRewards[to].share);

        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 nonReentrant {
        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);

        // claim rewards for from
        _claimRewards(from);

        // if to has balance claim rewards for to
        if (_balances[to] > 0) {
            _claimRewards(to);
        }

        // Allocate balances
        _balances[from] = _balances[from].sub(1);
        _balances[to] += 1;
        _owners[tokenId] = to;

        // fetch multiplier based on rarity
        uint8 multiplier = tokenRarity[tokenIDToRarity[tokenId]].multiplier;

        // Allocate reward shares based on rarity
        ownerRewards[from].share -= multiplier;
        ownerRewards[to].share += multiplier;

        // reset reward allocations
        ownerRewards[from].totalExcluded = getCumulativeDividends(ownerRewards[from].share);
        ownerRewards[to].totalExcluded = getCumulativeDividends(ownerRewards[to].share);

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

    /**
        Claims BNB Reward For User
     */
    function _claimRewards(address user) internal {

        // return if zero balance
        if (_balances[user] == 0) {
            return;
        }

        // fetch pending rewards
        uint pending = pendingRewards(user);
        uint rewardBalance = IERC20(rewardToken).balanceOf(address(this));
        if (pending > rewardBalance) {
            pending = rewardBalance;
        }

        // return if no rewards
        if (pending == 0) {
            return;
        }
        
        // reset total rewards
        ownerRewards[user].totalExcluded = getCumulativeDividends(ownerRewards[user].share);

        // transfer reward to user
        IERC20(rewardToken).transfer(user, pending);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal {
        require(_exists(tokenId), 'Token Does Not Exist');

        // owner of token
        address owner_ = ownerOf(tokenId);

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

        // decrement balance
        _balances[owner_] -= 1;
        delete _owners[tokenId];

        // decrement total supply
        _totalSupply -= 1;

        // decrement multiplier from total shares
        uint256 multiplier = tokenRarity[tokenIDToRarity[tokenId]].multiplier;
        totalShares -= multiplier;
        ownerRewards[owner_].share -= multiplier;
        ownerRewards[owner_].totalExcluded = getCumulativeDividends(ownerRewards[owner_].share);

        // emit transfer
        emit Transfer(owner_, address(0), 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);
    }



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

    function checkClaimEligibility(address _to, uint256 _quantity) external view returns (string memory) {
        if (tradingEnabled && _to != address(0) && _quantity > 0) {
            return "";
        }
        return "Sale is not live";
    }

    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 < currentSupplyIndex;) {
            if (_owners[i] == owner_) {
                ids[count] = i;
                unchecked { count++; }
            }
            unchecked { ++i; }
        }
        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 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "nonexistent token");

        string memory idstr = UriByRarity ? uint2str(uint256(tokenIDToRarity[tokenId])) : uint2str(tokenId);
        string memory fHalf = string.concat(baseURI, idstr);
        return string.concat(fHalf, ending);
    }

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

    function owner() external view returns (address) {
        return this.getOwner();
    }

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

    /**
        Pending BNB Rewards For `account`
     */
    function pendingRewards(address account) public view returns (uint256) {
        if(_balances[account] == 0){ return 0; }

        uint256 accountTotalDividends = getCumulativeDividends(ownerRewards[account].share);
        uint256 accountTotalExcluded = ownerRewards[account].totalExcluded;

        if(accountTotalDividends <= accountTotalExcluded){ return 0; }

        return accountTotalDividends - accountTotalExcluded;
    }

    /**
        Cumulative Dividends For A Number Of Tokens
     */
    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(PRECISION);
    }

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

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

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

[{"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":"UriByRarity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mintRecipient_","type":"address"}],"name":"__init__","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canGiveRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"checkClaimEligibility","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"giveRewards","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint8","name":"rarity","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"nums","type":"uint256[]"},{"internalType":"uint8[]","name":"raritys","type":"uint8[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"ownerRewards","outputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resumeTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","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":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"canGive","type":"bool"}],"name":"setCanGiveRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintRecipient_","type":"address"}],"name":"setMintRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMintToken","type":"address"}],"name":"setMintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setRarityCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint8","name":"multiplier","type":"uint8"}],"name":"setRarityMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken_","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isUriBasedOnRarity","type":"bool"}],"name":"setURIByRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtention","type":"string"}],"name":"setURIExtention","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":"tokenIDToRarity","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenRarity","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint8","name":"multiplier","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

633b9aca00600e5560a06040819052600060808190526200002391600f91620000f9565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005291601091620000f9565b506012805475a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4801006001600160b01b0319909116179055601380546001600160a01b031916732260fac5e5542a773aa44fbcfedf7c193bc2c599179055348015620000b057600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a3620001db565b82805462000107906200019f565b90600052602060002090601f0160209004810192826200012b576000855562000176565b82601f106200014657805160ff191683800117855562000176565b8280016001018555821562000176579182015b828111156200017657825182559160200191906001019062000159565b506200018492915062000188565b5090565b5b8082111562000184576000815560010162000189565b600181811c90821680620001b457607f821691505b602082108103620001d557634e487b7160e01b600052602260045260246000fd5b50919050565b61388180620001eb6000396000f3fe6080604052600436106103035760003560e01c80636ad5cf6f11610190578063a22cb465116100dc578063cc71928111610095578063e8a7bc571161006f578063e8a7bc5714610978578063e946b7ed14610998578063e985e9c5146109b8578063f7c618c114610a0157600080fd5b8063cc719281146108ea578063cea7f50d1461090a578063dead1ecc1461095857600080fd5b8063a22cb46514610828578063a6f9dae114610848578063ae9843d614610868578063b88d4fde1461088a578063b97d1a4b146108aa578063c87b56dd146108ca57600080fd5b80638aee8127116101495780639762c373116101235780639762c37314610780578063983667361461079f5780639954d45d146107e85780639b366de21461080857600080fd5b80638aee81271461074b5780638da5cb5b1461076b57806395d89b411461035b57600080fd5b80636ad5cf6f1461067d57806370a082311461069d578063721f68be146106bd57806387c6973a146106ed578063893d20e81461070d578063894760691461072b57600080fd5b8063372500ab1161024f5780634a13e91d1161020857806358d81647116101e257806358d81647146105f05780635bf244be146106105780636112e8ac1461063d5780636352211e1461065d57600080fd5b80634a13e91d146105965780634ada218b146105b657806355f804b3146105d057600080fd5b8063372500ab146104f65780633a98ef391461050b5780633ccfd60b1461052157806342842e0e1461053657806342966c68146105565780634408a0461461057657600080fd5b80631031e36e116102bc5780631e263990116102965780631e2639901461047a5780632004ffd91461049057806323b872dd146104b657806331d7a262146104d657600080fd5b80631031e36e1461040e57806318160ddd146104235780631c6cf2501461043857600080fd5b806301ffc9a71461030f5780630694db1e1461034457806306fdde031461035b578063081812fc14610392578063095ea7b3146103ca5780630e15561a146103ea57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004612f95565b610a21565b60405190151581526020015b60405180910390f35b34801561035057600080fd5b50610359610a73565b005b34801561036757600080fd5b5060408051808201909152600581526446414d434f60d81b60208201525b60405161033b919061300a565b34801561039e57600080fd5b506103b26103ad36600461301d565b610ab5565b6040516001600160a01b03909116815260200161033b565b3480156103d657600080fd5b506103596103e536600461304b565b610b41565b3480156103f657600080fd5b50610400600d5481565b60405190815260200161033b565b34801561041a57600080fd5b50610359610c30565b34801561042f57600080fd5b50600254610400565b34801561044457600080fd5b5061046861045336600461301d565b600a6020526000908152604090205460ff1681565b60405160ff909116815260200161033b565b34801561048657600080fd5b5061040060035481565b34801561049c57600080fd5b506012546103b2906201000090046001600160a01b031681565b3480156104c257600080fd5b506103596104d1366004613077565b610c66565b3480156104e257600080fd5b506104006104f13660046130b8565b610c98565b34801561050257600080fd5b50610359610d23565b34801561051757600080fd5b5061040060045481565b34801561052d57600080fd5b50610359610da4565b34801561054257600080fd5b50610359610551366004613077565b610e26565b34801561056257600080fd5b5061035961057136600461301d565b610e41565b34801561058257600080fd5b506103596105913660046130d5565b610ebf565b3480156105a257600080fd5b506103596105b13660046130b8565b610ef5565b3480156105c257600080fd5b5060125461032f9060ff1681565b3480156105dc57600080fd5b506103596105eb3660046130d5565b610f49565b3480156105fc57600080fd5b5061035961060b36600461315d565b610f7f565b34801561061c57600080fd5b5061063061062b3660046130b8565b611018565b60405161033b9190613179565b34801561064957600080fd5b506103596106583660046131bd565b6110e4565b34801561066957600080fd5b506103b261067836600461301d565b611470565b34801561068957600080fd5b506103596106983660046131fb565b6114d5565b3480156106a957600080fd5b506104006106b83660046130b8565b611582565b3480156106c957600080fd5b5061032f6106d83660046130b8565b60096020526000908152604090205460ff1681565b3480156106f957600080fd5b5061035961070836600461301d565b6115f6565b34801561071957600080fd5b506001546001600160a01b03166103b2565b34801561073757600080fd5b506103596107463660046130b8565b611880565b34801561075757600080fd5b506103596107663660046130b8565b6119d4565b34801561077757600080fd5b506103b2611a20565b34801561078c57600080fd5b5060125461032f90610100900460ff1681565b3480156107ab57600080fd5b506107d36107ba3660046130b8565b600b602052600090815260409020805460019091015482565b6040805192835260208301919091520161033b565b3480156107f457600080fd5b5061035961080336600461323c565b611a89565b34801561081457600080fd5b506103596108233660046132a5565b611acd565b34801561083457600080fd5b5061035961084336600461333f565b611be6565b34801561085457600080fd5b506103596108633660046130b8565b611bf1565b34801561087457600080fd5b50604051630a85bd0160e11b815260200161033b565b34801561089657600080fd5b506103596108a536600461338e565b611c77565b3480156108b657600080fd5b506103596108c53660046130b8565b611caf565b3480156108d657600080fd5b506103856108e536600461301d565b611e9f565b3480156108f657600080fd5b5061038561090536600461304b565b611f8a565b34801561091657600080fd5b5061094161092536600461346e565b6011602052600090815260409020805460019091015460ff1682565b6040805192835260ff90911660208301520161033b565b34801561096457600080fd5b5061035961097336600461333f565b611ffb565b34801561098457600080fd5b506014546103b2906001600160a01b031681565b3480156109a457600080fd5b506103596109b33660046130b8565b612050565b3480156109c457600080fd5b5061032f6109d3366004613489565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610a0d57600080fd5b506013546103b2906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610a5257506001600160e01b03198216635b5e139f60e01b145b80610a6d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001546001600160a01b03163314610aa65760405162461bcd60e51b8152600401610a9d906134b7565b60405180910390fd5b6012805460ff19166001179055565b6000818152600560205260408120546001600160a01b0316610b255760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a9d565b506000908152600760205260409020546001600160a01b031690565b6000610b4c82611470565b9050806001600160a01b0316836001600160a01b031603610bb95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a9d565b336001600160a01b0382161480610bd55750610bd581336109d3565b610c215760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610a9d565b610c2b838361209c565b505050565b6001546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610a9d906134b7565b6012805460ff19169055565b610c71335b8261210a565b610c8d5760405162461bcd60e51b8152600401610a9d906134e4565b610c2b8383836121e8565b6001600160a01b0381166000908152600660205260408120548103610cbf57506000919050565b6001600160a01b0382166000908152600b6020526040812054610ce1906124dc565b6001600160a01b0384166000908152600b6020526040902060010154909150808211610d11575060009392505050565b610d1b8183613531565b949350505050565b600260005403610d455760405162461bcd60e51b8152600401610a9d90613548565b6002600090815533815260066020526040902054610d945760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610a9d565b610d9d336124ff565b6001600055565b6001546001600160a01b03163314610dce5760405162461bcd60e51b8152600401610a9d906134b7565b604051600090339047908381818185875af1925050503d8060008114610e10576040519150601f19603f3d011682016040523d82523d6000602084013e610e15565b606091505b5050905080610e2357600080fd5b50565b610c2b83838360405180602001604052806000815250611c77565b600260005403610e635760405162461bcd60e51b8152600401610a9d90613548565b6002600055610e7133610c6b565b610e8d5760405162461bcd60e51b8152600401610a9d906134e4565b600081815260056020526040902054610eae906001600160a01b03166124ff565b610eb78161266a565b506001600055565b6001546001600160a01b03163314610ee95760405162461bcd60e51b8152600401610a9d906134b7565b610c2b60108383612ee6565b6001546001600160a01b03163314610f1f5760405162461bcd60e51b8152600401610a9d906134b7565b601280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6001546001600160a01b03163314610f735760405162461bcd60e51b8152600401610a9d906134b7565b610c2b600f8383612ee6565b6001546001600160a01b03163314610fa95760405162461bcd60e51b8152600401610a9d906134b7565b60ff808316600090815260116020526040902060010154166110025760405162461bcd60e51b8152602060048201526012602482015271135d5b1d1a5c1b1a595c88139bdd0814d95d60721b6044820152606401610a9d565b60ff909116600090815260116020526040902055565b6060600061102583611582565b67ffffffffffffffff81111561103d5761103d613378565b604051908082528060200260200182016040528015611066578160200160208202803683370190505b50905061107283611582565b60000361107f5792915050565b6000805b6003548110156110db576000818152600560205260409020546001600160a01b038087169116036110d357808383815181106110c1576110c161357f565b60209081029190910101526001909101905b600101611083565b50909392505050565b60125460ff1661112c5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610a9d565b6000821161116d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210273ab6b132b960911b6044820152606401610a9d565b60ff8116600090815260116020526040902054158015906111a4575060ff8082166000908152601160205260409020600101541615155b6111e15760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642052617269747960901b6044820152606401610a9d565b60ff81166000908152601160205260408120546111ff908490613595565b6012546040516370a0823160e01b81523360048201529192508291620100009091046001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127591906135b4565b10156112c35760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420555344432042616c616e6365000000000000006044820152606401610a9d565b601254604051636eb1769f60e11b815233600482015230602482015282916201000090046001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b91906135b4565b10156113825760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b6044820152606401610a9d565b6012546014546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018490526201000090920416906323b872dd906064016020604051808303816000875af11580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140791906135cd565b6114495760405162461bcd60e51b81526020600482015260136024820152724572726f72205472616e736665722046726f6d60681b6044820152606401610a9d565b60005b8381101561146957611461856003548561281e565b60010161144c565b5050505050565b6000818152600560205260408120546001600160a01b031680610a6d5760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610a9d565b6001546001600160a01b031633146114ff5760405162461bcd60e51b8152600401610a9d906134b7565b60ff808316600090815260116020526040902060010154161561155d5760405162461bcd60e51b8152602060048201526016602482015275135d5b1d1a5c1b1a595c88105b1c9958591e4814d95d60521b6044820152606401610a9d565b60ff9182166000908152601160205260409020600101805460ff191691909216179055565b60006001600160a01b0382166115da5760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610a9d565b506001600160a01b031660009081526006602052604090205490565b6002600054036116185760405162461bcd60e51b8152600401610a9d90613548565b60026000556013546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168991906135b4565b10156116ce5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610a9d565b601354604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561171c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174091906135b4565b101561178e5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742042544320416c6c6f77616e63650000000000006044820152606401610a9d565b6013546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180991906135cd565b61184d5760405162461bcd60e51b81526020600482015260156024820152744661696c757265205472616e736665722046726f6d60581b6044820152606401610a9d565b600454600e54820281611862576118626135ea565b600c805492909104919091019055600d805490910190556001600055565b6001546001600160a01b031633146118aa5760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b0381166118ef5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a9d565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561193d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196191906135b4565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156119ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d091906135cd565b5050565b6001546001600160a01b031633146119fe5760405162461bcd60e51b8152600401610a9d906134b7565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a849190613600565b905090565b6001546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610a9d906134b7565b601280549115156101000261ff0019909216919091179055565b6001546001600160a01b03163314611af75760405162461bcd60e51b8152600401610a9d906134b7565b848381148015611b0657508382145b611b445760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204c656e6774687360881b6044820152606401610a9d565b60005b81811015611bdc5760005b868683818110611b6457611b6461357f565b90506020020135811015611bd357611bcb898984818110611b8757611b8761357f565b9050602002016020810190611b9c91906130b8565b600354878786818110611bb157611bb161357f565b9050602002016020810190611bc6919061346e565b61281e565b600101611b52565b50600101611b47565b5050505050505050565b6119d03383836128ac565b6001546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610a9d906134b7565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b611c81338361210a565b611c9d5760405162461bcd60e51b8152600401610a9d906134e4565b611ca98484848461297a565b50505050565b6001546001600160a01b03163314611cd95760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b038116611d1b5760405162461bcd60e51b81526020600482015260096024820152682d32b9379020b2323960b91b6044820152606401610a9d565b631dcd65007f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b755633b9aca007f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5525563773594007f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c6285564012a05f2007f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff557f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b8805460ff1990811660019081179092557f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5538054821660021790557f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c6298054821660041790557f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c880080548216600a179055601480546001600160a01b039094166001600160a01b0319909416841790556000928352600960205260409092208054909216179055565b6000818152600560205260409020546060906001600160a01b0316611efa5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a9d565b601254600090610100900460ff16611f1a57611f15836129ad565b611f35565b6000838152600a6020526040902054611f359060ff166129ad565b90506000600f82604051602001611f4d9291906136f0565b6040516020818303038152906040529050806010604051602001611f72929190613715565b60405160208183030381529060405292505050919050565b60125460609060ff168015611fa757506001600160a01b03831615155b8015611fb35750600082115b15611fcd5750604080516020810190915260008152610a6d565b5060408051808201909152601081526f53616c65206973206e6f74206c69766560801b602082015292915050565b6001546001600160a01b031633146120255760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331461207a5760405162461bcd60e51b8152600401610a9d906134b7565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120d182611470565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b031661216e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a9d565b600061217983611470565b9050806001600160a01b0316846001600160a01b031614806121b45750836001600160a01b03166121a984610ab5565b6001600160a01b0316145b80610d1b57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff16610d1b565b60026000540361220a5760405162461bcd60e51b8152600401610a9d90613548565b60026000556001600160a01b03831661222282611470565b6001600160a01b03161461226a5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610a9d565b6001600160a01b0382166122af5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610a9d565b60006122ba84611582565b116122f65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610a9d565b61230160008261209c565b61230a836124ff565b6001600160a01b0382166000908152600660205260409020541561233157612331826124ff565b6001600160a01b038316600090815260066020526040902054612355906001612ad9565b6001600160a01b0380851660009081526006602052604080822093909355908416815290812080546001929061238c908490613733565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b0387811691909117909155600a83528184205460ff908116855260118452828520600101549188168552600b909352908320805491909216928392916123fc908490613531565b90915550506001600160a01b0383166000908152600b60205260408120805460ff8416929061242c908490613733565b90915550506001600160a01b0384166000908152600b6020526040902054612453906124dc565b6001600160a01b038086166000908152600b60205260408082206001019390935590851681522054612484906124dc565b6001600160a01b038085166000818152600b6020526040808220600101949094559251859391928816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505060016000555050565b6000610a6d600e546124f9600c5485612b2290919063ffffffff16565b90612ba4565b6001600160a01b03811660009081526006602052604081205490036125215750565b600061252c82610c98565b6013546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561257a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259e91906135b4565b9050808211156125ac578091505b816000036125b957505050565b6001600160a01b0383166000908152600b60205260409020546125db906124dc565b6001600160a01b038481166000818152600b60205260409081902060010193909355601354925163a9059cbb60e01b815260048101919091526024810185905291169063a9059cbb906044016020604051808303816000875af1158015612646573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906135cd565b6000818152600560205260409020546001600160a01b03166126c55760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610a9d565b60006126d082611470565b90506126dd60008361209c565b6001600160a01b0381166000908152600660205260408120805460019290612706908490613531565b9091555050600082815260056020526040812080546001600160a01b0319169055600280546001929061273a908490613531565b90915550506000828152600a602090815260408083205460ff9081168452601190925282206001015460048054919092169283929161277a908490613531565b90915550506001600160a01b0382166000908152600b6020526040812080548392906127a7908490613531565b90915550506001600160a01b0382166000908152600b60205260409020546127ce906124dc565b6001600160a01b0383166000818152600b6020526040808220600101939093559151859291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b612829838383612be6565b6128456000848460405180602001604052806000815250612d3d565b610c2b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a9d565b816001600160a01b0316836001600160a01b03160361290d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9d565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129858484846121e8565b61299184848484612d3d565b611ca95760405162461bcd60e51b8152600401610a9d9061374b565b6060816000036129d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129fe57806129e881613791565b91506129f79050600a836137aa565b91506129d8565b60008167ffffffffffffffff811115612a1957612a19613378565b6040519080825280601f01601f191660200182016040528015612a43576020820181803683370190505b509050815b8515612ad057612a59600182613531565b90506000612a68600a886137aa565b612a7390600a613595565b612a7d9088613531565b612a889060306137cc565b905060008160f81b905080848481518110612aa557612aa561357f565b60200101906001600160f81b031916908160001a905350612ac7600a896137aa565b97505050612a48565b50949350505050565b6000612b1b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e45565b9392505050565b600082600003612b3457506000610a6d565b6000612b408385613595565b905082612b4d85836137aa565b14612b1b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a9d565b6000612b1b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e7f565b6000828152600560205260409020546001600160a01b031615612c4b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9d565b600082815260056020908152604080832080546001600160a01b0319166001600160a01b038816908117909155600a8352818420805460ff191660ff8781169182179092556003805460019081019091556002805482019055838752600686528487208054820190559086526011855283862001805460048054918416909101905554918552600b909352922080549290911690910190819055612cee906124dc565b6001600160a01b0384166000818152600b60205260408082206001019390935591518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b6000612d51846001600160a01b0316612ead565b15612e3a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d889033908990889088906004016137f1565b6020604051808303816000875af1925050508015612dc3575060408051601f3d908101601f19168201909252612dc09181019061382e565b60015b612e20573d808015612df1576040519150601f19603f3d011682016040523d82523d6000602084013e612df6565b606091505b508051600003612e185760405162461bcd60e51b8152600401610a9d9061374b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d1b565b506001949350505050565b60008184841115612e695760405162461bcd60e51b8152600401610a9d919061300a565b506000612e768486613531565b95945050505050565b60008183612ea05760405162461bcd60e51b8152600401610a9d919061300a565b506000612e7684866137aa565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d1b575050151592915050565b828054612ef29061361d565b90600052602060002090601f016020900481019282612f145760008555612f5a565b82601f10612f2d5782800160ff19823516178555612f5a565b82800160010185558215612f5a579182015b82811115612f5a578235825591602001919060010190612f3f565b50612f66929150612f6a565b5090565b5b80821115612f665760008155600101612f6b565b6001600160e01b031981168114610e2357600080fd5b600060208284031215612fa757600080fd5b8135612b1b81612f7f565b60005b83811015612fcd578181015183820152602001612fb5565b83811115611ca95750506000910152565b60008151808452612ff6816020860160208601612fb2565b601f01601f19169290920160200192915050565b602081526000612b1b6020830184612fde565b60006020828403121561302f57600080fd5b5035919050565b6001600160a01b0381168114610e2357600080fd5b6000806040838503121561305e57600080fd5b823561306981613036565b946020939093013593505050565b60008060006060848603121561308c57600080fd5b833561309781613036565b925060208401356130a781613036565b929592945050506040919091013590565b6000602082840312156130ca57600080fd5b8135612b1b81613036565b600080602083850312156130e857600080fd5b823567ffffffffffffffff8082111561310057600080fd5b818501915085601f83011261311457600080fd5b81358181111561312357600080fd5b86602082850101111561313557600080fd5b60209290920196919550909350505050565b803560ff8116811461315857600080fd5b919050565b6000806040838503121561317057600080fd5b61306983613147565b6020808252825182820181905260009190848201906040850190845b818110156131b157835183529284019291840191600101613195565b50909695505050505050565b6000806000606084860312156131d257600080fd5b83356131dd81613036565b9250602084013591506131f260408501613147565b90509250925092565b6000806040838503121561320e57600080fd5b61321783613147565b915061322560208401613147565b90509250929050565b8015158114610e2357600080fd5b60006020828403121561324e57600080fd5b8135612b1b8161322e565b60008083601f84011261326b57600080fd5b50813567ffffffffffffffff81111561328357600080fd5b6020830191508360208260051b850101111561329e57600080fd5b9250929050565b600080600080600080606087890312156132be57600080fd5b863567ffffffffffffffff808211156132d657600080fd5b6132e28a838b01613259565b909850965060208901359150808211156132fb57600080fd5b6133078a838b01613259565b9096509450604089013591508082111561332057600080fd5b5061332d89828a01613259565b979a9699509497509295939492505050565b6000806040838503121561335257600080fd5b823561335d81613036565b9150602083013561336d8161322e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133a457600080fd5b84356133af81613036565b935060208501356133bf81613036565b925060408501359150606085013567ffffffffffffffff808211156133e357600080fd5b818701915087601f8301126133f757600080fd5b81358181111561340957613409613378565b604051601f8201601f19908116603f0116810190838211818310171561343157613431613378565b816040528281528a602084870101111561344a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60006020828403121561348057600080fd5b612b1b82613147565b6000806040838503121561349c57600080fd5b82356134a781613036565b9150602083013561336d81613036565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156135435761354361351b565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156135af576135af61351b565b500290565b6000602082840312156135c657600080fd5b5051919050565b6000602082840312156135df57600080fd5b8151612b1b8161322e565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561361257600080fd5b8151612b1b81613036565b600181811c9082168061363157607f821691505b60208210810361365157634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061367157607f831692505b6020808410820361369257634e487b7160e01b600052602260045260246000fd5b8180156136a657600181146136b7576136e4565b60ff198616895284890196506136e4565b60008881526020902060005b868110156136dc5781548b8201529085019083016136c3565b505084890196505b50505050505092915050565b60006136fc8285613657565b835161370c818360208801612fb2565b01949350505050565b60008351613727818460208801612fb2565b612e7681840185613657565b600082198211156137465761374661351b565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b6000600182016137a3576137a361351b565b5060010190565b6000826137c757634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff038211156137e9576137e961351b565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061382490830184612fde565b9695505050505050565b60006020828403121561384057600080fd5b8151612b1b81612f7f56fea2646970667358221220d6b9836646a97a51d7c63f92a76fb69f6c2f461eb9f1a66cb1bdb7c76304483464736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106103035760003560e01c80636ad5cf6f11610190578063a22cb465116100dc578063cc71928111610095578063e8a7bc571161006f578063e8a7bc5714610978578063e946b7ed14610998578063e985e9c5146109b8578063f7c618c114610a0157600080fd5b8063cc719281146108ea578063cea7f50d1461090a578063dead1ecc1461095857600080fd5b8063a22cb46514610828578063a6f9dae114610848578063ae9843d614610868578063b88d4fde1461088a578063b97d1a4b146108aa578063c87b56dd146108ca57600080fd5b80638aee8127116101495780639762c373116101235780639762c37314610780578063983667361461079f5780639954d45d146107e85780639b366de21461080857600080fd5b80638aee81271461074b5780638da5cb5b1461076b57806395d89b411461035b57600080fd5b80636ad5cf6f1461067d57806370a082311461069d578063721f68be146106bd57806387c6973a146106ed578063893d20e81461070d578063894760691461072b57600080fd5b8063372500ab1161024f5780634a13e91d1161020857806358d81647116101e257806358d81647146105f05780635bf244be146106105780636112e8ac1461063d5780636352211e1461065d57600080fd5b80634a13e91d146105965780634ada218b146105b657806355f804b3146105d057600080fd5b8063372500ab146104f65780633a98ef391461050b5780633ccfd60b1461052157806342842e0e1461053657806342966c68146105565780634408a0461461057657600080fd5b80631031e36e116102bc5780631e263990116102965780631e2639901461047a5780632004ffd91461049057806323b872dd146104b657806331d7a262146104d657600080fd5b80631031e36e1461040e57806318160ddd146104235780631c6cf2501461043857600080fd5b806301ffc9a71461030f5780630694db1e1461034457806306fdde031461035b578063081812fc14610392578063095ea7b3146103ca5780630e15561a146103ea57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004612f95565b610a21565b60405190151581526020015b60405180910390f35b34801561035057600080fd5b50610359610a73565b005b34801561036757600080fd5b5060408051808201909152600581526446414d434f60d81b60208201525b60405161033b919061300a565b34801561039e57600080fd5b506103b26103ad36600461301d565b610ab5565b6040516001600160a01b03909116815260200161033b565b3480156103d657600080fd5b506103596103e536600461304b565b610b41565b3480156103f657600080fd5b50610400600d5481565b60405190815260200161033b565b34801561041a57600080fd5b50610359610c30565b34801561042f57600080fd5b50600254610400565b34801561044457600080fd5b5061046861045336600461301d565b600a6020526000908152604090205460ff1681565b60405160ff909116815260200161033b565b34801561048657600080fd5b5061040060035481565b34801561049c57600080fd5b506012546103b2906201000090046001600160a01b031681565b3480156104c257600080fd5b506103596104d1366004613077565b610c66565b3480156104e257600080fd5b506104006104f13660046130b8565b610c98565b34801561050257600080fd5b50610359610d23565b34801561051757600080fd5b5061040060045481565b34801561052d57600080fd5b50610359610da4565b34801561054257600080fd5b50610359610551366004613077565b610e26565b34801561056257600080fd5b5061035961057136600461301d565b610e41565b34801561058257600080fd5b506103596105913660046130d5565b610ebf565b3480156105a257600080fd5b506103596105b13660046130b8565b610ef5565b3480156105c257600080fd5b5060125461032f9060ff1681565b3480156105dc57600080fd5b506103596105eb3660046130d5565b610f49565b3480156105fc57600080fd5b5061035961060b36600461315d565b610f7f565b34801561061c57600080fd5b5061063061062b3660046130b8565b611018565b60405161033b9190613179565b34801561064957600080fd5b506103596106583660046131bd565b6110e4565b34801561066957600080fd5b506103b261067836600461301d565b611470565b34801561068957600080fd5b506103596106983660046131fb565b6114d5565b3480156106a957600080fd5b506104006106b83660046130b8565b611582565b3480156106c957600080fd5b5061032f6106d83660046130b8565b60096020526000908152604090205460ff1681565b3480156106f957600080fd5b5061035961070836600461301d565b6115f6565b34801561071957600080fd5b506001546001600160a01b03166103b2565b34801561073757600080fd5b506103596107463660046130b8565b611880565b34801561075757600080fd5b506103596107663660046130b8565b6119d4565b34801561077757600080fd5b506103b2611a20565b34801561078c57600080fd5b5060125461032f90610100900460ff1681565b3480156107ab57600080fd5b506107d36107ba3660046130b8565b600b602052600090815260409020805460019091015482565b6040805192835260208301919091520161033b565b3480156107f457600080fd5b5061035961080336600461323c565b611a89565b34801561081457600080fd5b506103596108233660046132a5565b611acd565b34801561083457600080fd5b5061035961084336600461333f565b611be6565b34801561085457600080fd5b506103596108633660046130b8565b611bf1565b34801561087457600080fd5b50604051630a85bd0160e11b815260200161033b565b34801561089657600080fd5b506103596108a536600461338e565b611c77565b3480156108b657600080fd5b506103596108c53660046130b8565b611caf565b3480156108d657600080fd5b506103856108e536600461301d565b611e9f565b3480156108f657600080fd5b5061038561090536600461304b565b611f8a565b34801561091657600080fd5b5061094161092536600461346e565b6011602052600090815260409020805460019091015460ff1682565b6040805192835260ff90911660208301520161033b565b34801561096457600080fd5b5061035961097336600461333f565b611ffb565b34801561098457600080fd5b506014546103b2906001600160a01b031681565b3480156109a457600080fd5b506103596109b33660046130b8565b612050565b3480156109c457600080fd5b5061032f6109d3366004613489565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610a0d57600080fd5b506013546103b2906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610a5257506001600160e01b03198216635b5e139f60e01b145b80610a6d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001546001600160a01b03163314610aa65760405162461bcd60e51b8152600401610a9d906134b7565b60405180910390fd5b6012805460ff19166001179055565b6000818152600560205260408120546001600160a01b0316610b255760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a9d565b506000908152600760205260409020546001600160a01b031690565b6000610b4c82611470565b9050806001600160a01b0316836001600160a01b031603610bb95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a9d565b336001600160a01b0382161480610bd55750610bd581336109d3565b610c215760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610a9d565b610c2b838361209c565b505050565b6001546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610a9d906134b7565b6012805460ff19169055565b610c71335b8261210a565b610c8d5760405162461bcd60e51b8152600401610a9d906134e4565b610c2b8383836121e8565b6001600160a01b0381166000908152600660205260408120548103610cbf57506000919050565b6001600160a01b0382166000908152600b6020526040812054610ce1906124dc565b6001600160a01b0384166000908152600b6020526040902060010154909150808211610d11575060009392505050565b610d1b8183613531565b949350505050565b600260005403610d455760405162461bcd60e51b8152600401610a9d90613548565b6002600090815533815260066020526040902054610d945760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610a9d565b610d9d336124ff565b6001600055565b6001546001600160a01b03163314610dce5760405162461bcd60e51b8152600401610a9d906134b7565b604051600090339047908381818185875af1925050503d8060008114610e10576040519150601f19603f3d011682016040523d82523d6000602084013e610e15565b606091505b5050905080610e2357600080fd5b50565b610c2b83838360405180602001604052806000815250611c77565b600260005403610e635760405162461bcd60e51b8152600401610a9d90613548565b6002600055610e7133610c6b565b610e8d5760405162461bcd60e51b8152600401610a9d906134e4565b600081815260056020526040902054610eae906001600160a01b03166124ff565b610eb78161266a565b506001600055565b6001546001600160a01b03163314610ee95760405162461bcd60e51b8152600401610a9d906134b7565b610c2b60108383612ee6565b6001546001600160a01b03163314610f1f5760405162461bcd60e51b8152600401610a9d906134b7565b601280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6001546001600160a01b03163314610f735760405162461bcd60e51b8152600401610a9d906134b7565b610c2b600f8383612ee6565b6001546001600160a01b03163314610fa95760405162461bcd60e51b8152600401610a9d906134b7565b60ff808316600090815260116020526040902060010154166110025760405162461bcd60e51b8152602060048201526012602482015271135d5b1d1a5c1b1a595c88139bdd0814d95d60721b6044820152606401610a9d565b60ff909116600090815260116020526040902055565b6060600061102583611582565b67ffffffffffffffff81111561103d5761103d613378565b604051908082528060200260200182016040528015611066578160200160208202803683370190505b50905061107283611582565b60000361107f5792915050565b6000805b6003548110156110db576000818152600560205260409020546001600160a01b038087169116036110d357808383815181106110c1576110c161357f565b60209081029190910101526001909101905b600101611083565b50909392505050565b60125460ff1661112c5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c8139bdd08115b98589b1959606a1b6044820152606401610a9d565b6000821161116d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210273ab6b132b960911b6044820152606401610a9d565b60ff8116600090815260116020526040902054158015906111a4575060ff8082166000908152601160205260409020600101541615155b6111e15760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642052617269747960901b6044820152606401610a9d565b60ff81166000908152601160205260408120546111ff908490613595565b6012546040516370a0823160e01b81523360048201529192508291620100009091046001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127591906135b4565b10156112c35760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420555344432042616c616e6365000000000000006044820152606401610a9d565b601254604051636eb1769f60e11b815233600482015230602482015282916201000090046001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b91906135b4565b10156113825760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b6044820152606401610a9d565b6012546014546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018490526201000090920416906323b872dd906064016020604051808303816000875af11580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140791906135cd565b6114495760405162461bcd60e51b81526020600482015260136024820152724572726f72205472616e736665722046726f6d60681b6044820152606401610a9d565b60005b8381101561146957611461856003548561281e565b60010161144c565b5050505050565b6000818152600560205260408120546001600160a01b031680610a6d5760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610a9d565b6001546001600160a01b031633146114ff5760405162461bcd60e51b8152600401610a9d906134b7565b60ff808316600090815260116020526040902060010154161561155d5760405162461bcd60e51b8152602060048201526016602482015275135d5b1d1a5c1b1a595c88105b1c9958591e4814d95d60521b6044820152606401610a9d565b60ff9182166000908152601160205260409020600101805460ff191691909216179055565b60006001600160a01b0382166115da5760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610a9d565b506001600160a01b031660009081526006602052604090205490565b6002600054036116185760405162461bcd60e51b8152600401610a9d90613548565b60026000556013546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168991906135b4565b10156116ce5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610a9d565b601354604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e90604401602060405180830381865afa15801561171c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174091906135b4565b101561178e5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742042544320416c6c6f77616e63650000000000006044820152606401610a9d565b6013546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180991906135cd565b61184d5760405162461bcd60e51b81526020600482015260156024820152744661696c757265205472616e736665722046726f6d60581b6044820152606401610a9d565b600454600e54820281611862576118626135ea565b600c805492909104919091019055600d805490910190556001600055565b6001546001600160a01b031633146118aa5760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b0381166118ef5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610a9d565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561193d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196191906135b4565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156119ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d091906135cd565b5050565b6001546001600160a01b031633146119fe5760405162461bcd60e51b8152600401610a9d906134b7565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a849190613600565b905090565b6001546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610a9d906134b7565b601280549115156101000261ff0019909216919091179055565b6001546001600160a01b03163314611af75760405162461bcd60e51b8152600401610a9d906134b7565b848381148015611b0657508382145b611b445760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204c656e6774687360881b6044820152606401610a9d565b60005b81811015611bdc5760005b868683818110611b6457611b6461357f565b90506020020135811015611bd357611bcb898984818110611b8757611b8761357f565b9050602002016020810190611b9c91906130b8565b600354878786818110611bb157611bb161357f565b9050602002016020810190611bc6919061346e565b61281e565b600101611b52565b50600101611b47565b5050505050505050565b6119d03383836128ac565b6001546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401610a9d906134b7565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b611c81338361210a565b611c9d5760405162461bcd60e51b8152600401610a9d906134e4565b611ca98484848461297a565b50505050565b6001546001600160a01b03163314611cd95760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b038116611d1b5760405162461bcd60e51b81526020600482015260096024820152682d32b9379020b2323960b91b6044820152606401610a9d565b631dcd65007f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b755633b9aca007f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5525563773594007f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c6285564012a05f2007f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff557f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b8805460ff1990811660019081179092557f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5538054821660021790557f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c6298054821660041790557f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c880080548216600a179055601480546001600160a01b039094166001600160a01b0319909416841790556000928352600960205260409092208054909216179055565b6000818152600560205260409020546060906001600160a01b0316611efa5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610a9d565b601254600090610100900460ff16611f1a57611f15836129ad565b611f35565b6000838152600a6020526040902054611f359060ff166129ad565b90506000600f82604051602001611f4d9291906136f0565b6040516020818303038152906040529050806010604051602001611f72929190613715565b60405160208183030381529060405292505050919050565b60125460609060ff168015611fa757506001600160a01b03831615155b8015611fb35750600082115b15611fcd5750604080516020810190915260008152610a6d565b5060408051808201909152601081526f53616c65206973206e6f74206c69766560801b602082015292915050565b6001546001600160a01b031633146120255760405162461bcd60e51b8152600401610a9d906134b7565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331461207a5760405162461bcd60e51b8152600401610a9d906134b7565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120d182611470565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b031661216e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a9d565b600061217983611470565b9050806001600160a01b0316846001600160a01b031614806121b45750836001600160a01b03166121a984610ab5565b6001600160a01b0316145b80610d1b57506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff16610d1b565b60026000540361220a5760405162461bcd60e51b8152600401610a9d90613548565b60026000556001600160a01b03831661222282611470565b6001600160a01b03161461226a5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610a9d565b6001600160a01b0382166122af5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610a9d565b60006122ba84611582565b116122f65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610a9d565b61230160008261209c565b61230a836124ff565b6001600160a01b0382166000908152600660205260409020541561233157612331826124ff565b6001600160a01b038316600090815260066020526040902054612355906001612ad9565b6001600160a01b0380851660009081526006602052604080822093909355908416815290812080546001929061238c908490613733565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b0387811691909117909155600a83528184205460ff908116855260118452828520600101549188168552600b909352908320805491909216928392916123fc908490613531565b90915550506001600160a01b0383166000908152600b60205260408120805460ff8416929061242c908490613733565b90915550506001600160a01b0384166000908152600b6020526040902054612453906124dc565b6001600160a01b038086166000908152600b60205260408082206001019390935590851681522054612484906124dc565b6001600160a01b038085166000818152600b6020526040808220600101949094559251859391928816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505060016000555050565b6000610a6d600e546124f9600c5485612b2290919063ffffffff16565b90612ba4565b6001600160a01b03811660009081526006602052604081205490036125215750565b600061252c82610c98565b6013546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561257a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259e91906135b4565b9050808211156125ac578091505b816000036125b957505050565b6001600160a01b0383166000908152600b60205260409020546125db906124dc565b6001600160a01b038481166000818152600b60205260409081902060010193909355601354925163a9059cbb60e01b815260048101919091526024810185905291169063a9059cbb906044016020604051808303816000875af1158015612646573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca991906135cd565b6000818152600560205260409020546001600160a01b03166126c55760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610a9d565b60006126d082611470565b90506126dd60008361209c565b6001600160a01b0381166000908152600660205260408120805460019290612706908490613531565b9091555050600082815260056020526040812080546001600160a01b0319169055600280546001929061273a908490613531565b90915550506000828152600a602090815260408083205460ff9081168452601190925282206001015460048054919092169283929161277a908490613531565b90915550506001600160a01b0382166000908152600b6020526040812080548392906127a7908490613531565b90915550506001600160a01b0382166000908152600b60205260409020546127ce906124dc565b6001600160a01b0383166000818152600b6020526040808220600101939093559151859291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b612829838383612be6565b6128456000848460405180602001604052806000815250612d3d565b610c2b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610a9d565b816001600160a01b0316836001600160a01b03160361290d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9d565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129858484846121e8565b61299184848484612d3d565b611ca95760405162461bcd60e51b8152600401610a9d9061374b565b6060816000036129d45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129fe57806129e881613791565b91506129f79050600a836137aa565b91506129d8565b60008167ffffffffffffffff811115612a1957612a19613378565b6040519080825280601f01601f191660200182016040528015612a43576020820181803683370190505b509050815b8515612ad057612a59600182613531565b90506000612a68600a886137aa565b612a7390600a613595565b612a7d9088613531565b612a889060306137cc565b905060008160f81b905080848481518110612aa557612aa561357f565b60200101906001600160f81b031916908160001a905350612ac7600a896137aa565b97505050612a48565b50949350505050565b6000612b1b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e45565b9392505050565b600082600003612b3457506000610a6d565b6000612b408385613595565b905082612b4d85836137aa565b14612b1b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a9d565b6000612b1b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e7f565b6000828152600560205260409020546001600160a01b031615612c4b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9d565b600082815260056020908152604080832080546001600160a01b0319166001600160a01b038816908117909155600a8352818420805460ff191660ff8781169182179092556003805460019081019091556002805482019055838752600686528487208054820190559086526011855283862001805460048054918416909101905554918552600b909352922080549290911690910190819055612cee906124dc565b6001600160a01b0384166000818152600b60205260408082206001019390935591518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b6000612d51846001600160a01b0316612ead565b15612e3a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d889033908990889088906004016137f1565b6020604051808303816000875af1925050508015612dc3575060408051601f3d908101601f19168201909252612dc09181019061382e565b60015b612e20573d808015612df1576040519150601f19603f3d011682016040523d82523d6000602084013e612df6565b606091505b508051600003612e185760405162461bcd60e51b8152600401610a9d9061374b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d1b565b506001949350505050565b60008184841115612e695760405162461bcd60e51b8152600401610a9d919061300a565b506000612e768486613531565b95945050505050565b60008183612ea05760405162461bcd60e51b8152600401610a9d919061300a565b506000612e7684866137aa565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d1b575050151592915050565b828054612ef29061361d565b90600052602060002090601f016020900481019282612f145760008555612f5a565b82601f10612f2d5782800160ff19823516178555612f5a565b82800160010185558215612f5a579182015b82811115612f5a578235825591602001919060010190612f3f565b50612f66929150612f6a565b5090565b5b80821115612f665760008155600101612f6b565b6001600160e01b031981168114610e2357600080fd5b600060208284031215612fa757600080fd5b8135612b1b81612f7f565b60005b83811015612fcd578181015183820152602001612fb5565b83811115611ca95750506000910152565b60008151808452612ff6816020860160208601612fb2565b601f01601f19169290920160200192915050565b602081526000612b1b6020830184612fde565b60006020828403121561302f57600080fd5b5035919050565b6001600160a01b0381168114610e2357600080fd5b6000806040838503121561305e57600080fd5b823561306981613036565b946020939093013593505050565b60008060006060848603121561308c57600080fd5b833561309781613036565b925060208401356130a781613036565b929592945050506040919091013590565b6000602082840312156130ca57600080fd5b8135612b1b81613036565b600080602083850312156130e857600080fd5b823567ffffffffffffffff8082111561310057600080fd5b818501915085601f83011261311457600080fd5b81358181111561312357600080fd5b86602082850101111561313557600080fd5b60209290920196919550909350505050565b803560ff8116811461315857600080fd5b919050565b6000806040838503121561317057600080fd5b61306983613147565b6020808252825182820181905260009190848201906040850190845b818110156131b157835183529284019291840191600101613195565b50909695505050505050565b6000806000606084860312156131d257600080fd5b83356131dd81613036565b9250602084013591506131f260408501613147565b90509250925092565b6000806040838503121561320e57600080fd5b61321783613147565b915061322560208401613147565b90509250929050565b8015158114610e2357600080fd5b60006020828403121561324e57600080fd5b8135612b1b8161322e565b60008083601f84011261326b57600080fd5b50813567ffffffffffffffff81111561328357600080fd5b6020830191508360208260051b850101111561329e57600080fd5b9250929050565b600080600080600080606087890312156132be57600080fd5b863567ffffffffffffffff808211156132d657600080fd5b6132e28a838b01613259565b909850965060208901359150808211156132fb57600080fd5b6133078a838b01613259565b9096509450604089013591508082111561332057600080fd5b5061332d89828a01613259565b979a9699509497509295939492505050565b6000806040838503121561335257600080fd5b823561335d81613036565b9150602083013561336d8161322e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156133a457600080fd5b84356133af81613036565b935060208501356133bf81613036565b925060408501359150606085013567ffffffffffffffff808211156133e357600080fd5b818701915087601f8301126133f757600080fd5b81358181111561340957613409613378565b604051601f8201601f19908116603f0116810190838211818310171561343157613431613378565b816040528281528a602084870101111561344a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60006020828403121561348057600080fd5b612b1b82613147565b6000806040838503121561349c57600080fd5b82356134a781613036565b9150602083013561336d81613036565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156135435761354361351b565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156135af576135af61351b565b500290565b6000602082840312156135c657600080fd5b5051919050565b6000602082840312156135df57600080fd5b8151612b1b8161322e565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561361257600080fd5b8151612b1b81613036565b600181811c9082168061363157607f821691505b60208210810361365157634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061367157607f831692505b6020808410820361369257634e487b7160e01b600052602260045260246000fd5b8180156136a657600181146136b7576136e4565b60ff198616895284890196506136e4565b60008881526020902060005b868110156136dc5781548b8201529085019083016136c3565b505084890196505b50505050505092915050565b60006136fc8285613657565b835161370c818360208801612fb2565b01949350505050565b60008351613727818460208801612fb2565b612e7681840185613657565b600082198211156137465761374661351b565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b6000600182016137a3576137a361351b565b5060010190565b6000826137c757634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff038211156137e9576137e961351b565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061382490830184612fde565b9695505050505050565b60006020828403121561384057600080fd5b8151612b1b81612f7f56fea2646970667358221220d6b9836646a97a51d7c63f92a76fb69f6c2f461eb9f1a66cb1bdb7c76304483464736f6c634300080e0033

Deployed Bytecode Sourcemap

24091:23886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42070:297;;;;;;;;;;-1:-1:-1;42070:297:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;42070:297:0;;;;;;;;27228:84;;;;;;;;;;;;;:::i;:::-;;42973:92;;;;;;;;;;-1:-1:-1;43052:5:0;;;;;;;;;;;;-1:-1:-1;;;43052:5:0;;;;42973:92;;;;;;;:::i;44467:204::-;;;;;;;;;;-1:-1:-1;44467:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;44467:204:0;1528:203:1;32392:377:0;;;;;;;;;;-1:-1:-1;32392:377:0;;;;;:::i;:::-;;:::i;25700:27::-;;;;;;;;;;;;;;;;;;;2338:25:1;;;2326:2;2311:18;25700:27:0;2192:177:1;27320:84:0;;;;;;;;;;;;;:::i;41420:93::-;;;;;;;;;;-1:-1:-1;41493:12:0;;41420:93;;25238:51;;;;;;;;;;-1:-1:-1;25238:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2546:4:1;2534:17;;;2516:36;;2504:2;2489:18;25238:51:0;2374:184:1;24497:33:0;;;;;;;;;;;;;;;;26269:69;;;;;;;;;;-1:-1:-1;26269:69:0;;;;;;;-1:-1:-1;;;;;26269:69:0;;;33057:256;;;;;;;;;;-1:-1:-1;33057:256:0;;;;;:::i;:::-;;:::i;44973:440::-;;;;;;;;;;-1:-1:-1;44973:440:0;;;;;:::i;:::-;;:::i;31188:188::-;;;;;;;;;;;;;:::i;24611:26::-;;;;;;;;;;;;;;;;27412:149;;;;;;;;;;;;;:::i;33384:177::-;;;;;;;;;;-1:-1:-1;33384:177:0;;;;;:::i;:::-;;:::i;31386:222::-;;;;;;;;;;-1:-1:-1;31386:222:0;;;;;:::i;:::-;;:::i;27892:114::-;;;;;;;;;;-1:-1:-1;27892:114:0;;;;;:::i;:::-;;:::i;28014:106::-;;;;;;;;;;-1:-1:-1;28014:106:0;;;;;:::i;:::-;;:::i;26122:34::-;;;;;;;;;;-1:-1:-1;26122:34:0;;;;;;;;27786:98;;;;;;;;;;-1:-1:-1;27786:98:0;;;;;:::i;:::-;;:::i;28372:196::-;;;;;;;;;;-1:-1:-1;28372:196:0;;;;;:::i;:::-;;:::i;41521:477::-;;;;;;;;;;-1:-1:-1;41521:477:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30065:1115::-;;;;;;;;;;-1:-1:-1;30065:1115:0;;;;;:::i;:::-;;:::i;42683:223::-;;;;;;;;;;-1:-1:-1;42683:223:0;;;;;:::i;:::-;;:::i;28576:::-;;;;;;;;;;-1:-1:-1;28576:223:0;;;;;:::i;:::-;;:::i;42431:190::-;;;;;;;;;;-1:-1:-1;42431:190:0;;;;;:::i;:::-;;:::i;25145:49::-;;;;;;;;;;-1:-1:-1;25145:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31616:677;;;;;;;;;;-1:-1:-1;31616:677:0;;;;;:::i;:::-;;:::i;24001:83::-;;;;;;;;;;-1:-1:-1;24071:5:0;;-1:-1:-1;;;;;24071:5:0;24001:83;;27569:209;;;;;;;;;;-1:-1:-1;27569:209:0;;;;;:::i;:::-;;:::i;28254:110::-;;;;;;;;;;-1:-1:-1;28254:110:0;;;;;:::i;:::-;;:::i;44311:90::-;;;;;;;;;;;;;:::i;26211:30::-;;;;;;;;;;-1:-1:-1;26211:30:0;;;;;;;;;;;25529:52;;;;;;;;;;-1:-1:-1;25529:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;5747:25:1;;;5803:2;5788:18;;5781:34;;;;5720:18;25529:52:0;5573:248:1;28944:119:0;;;;;;;;;;-1:-1:-1;28944:119:0;;;;;:::i;:::-;;:::i;29304:521::-;;;;;;;;;;-1:-1:-1;29304:521:0;;;;;:::i;:::-;;:::i;32841:149::-;;;;;;;;;;-1:-1:-1;32841:149:0;;;;;:::i;:::-;;:::i;23775:132::-;;;;;;;;;;-1:-1:-1;23775:132:0;;;;;:::i;:::-;;:::i;46498:124::-;;;;;;;;;;-1:-1:-1;46498:124:0;;-1:-1:-1;;;8189:52:1;;8177:2;8162:18;46498:124:0;8045:202:1;33632:300:0;;;;;;;;;;-1:-1:-1;33632:300:0;;;;;:::i;:::-;;:::i;26624:596::-;;;;;;;;;;-1:-1:-1;26624:596:0;;;;;:::i;:::-;;:::i;43301:365::-;;;;;;;;;;-1:-1:-1;43301:365:0;;;;;:::i;:::-;;:::i;41163:249::-;;;;;;;;;;-1:-1:-1;41163:249:0;;;;;:::i;:::-;;:::i;26039:51::-;;;;;;;;;;-1:-1:-1;26039:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;10012:25:1;;;10085:4;10073:17;;;10068:2;10053:18;;10046:45;9985:18;26039:51:0;9842:255:1;28807:129:0;;;;;;;;;;-1:-1:-1;28807:129:0;;;;;:::i;:::-;;:::i;26423:28::-;;;;;;;;;;-1:-1:-1;26423:28:0;;;;-1:-1:-1;;;;;26423:28:0;;;28128:118;;;;;;;;;;-1:-1:-1;28128:118:0;;;;;:::i;:::-;;:::i;44742:162::-;;;;;;;;;;-1:-1:-1;44742:162:0;;;;;:::i;:::-;-1:-1:-1;;;;;44858:27:0;;;44834:4;44858:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;44742:162;26345:71;;;;;;;;;;-1:-1:-1;26345:71:0;;;;-1:-1:-1;;;;;26345:71:0;;;42070:297;42164:4;-1:-1:-1;;;;;;42201:40:0;;-1:-1:-1;;;42201:40:0;;:105;;-1:-1:-1;;;;;;;42258:48:0;;-1:-1:-1;;;42258:48:0;42201:105;:158;;;-1:-1:-1;;;;;;;;;;1616:40:0;;;42323:36;42181:178;42070:297;-1:-1:-1;;42070:297:0:o;27228:84::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;;;;;;;;;27283:14:::1;:21:::0;;-1:-1:-1;;27283:21:0::1;27300:4;27283:21;::::0;;27228:84::o;44467:204::-;44535:7;45965:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45965:16:0;44555:64;;;;-1:-1:-1;;;44555:64:0;;11045:2:1;44555:64:0;;;11027:21:1;11084:2;11064:18;;;11057:30;11123:34;11103:18;;;11096:62;-1:-1:-1;;;11174:18:1;;;11167:33;11217:19;;44555:64:0;10843:399:1;44555:64:0;-1:-1:-1;44639:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44639:24:0;;44467:204::o;32392:377::-;32465:15;32483:16;32491:7;32483;:16::i;:::-;32465:34;;32524:7;-1:-1:-1;;;;;32518:13:0;:2;-1:-1:-1;;;;;32518:13:0;;32510:59;;;;-1:-1:-1;;;32510:59:0;;11449:2:1;32510:59:0;;;11431:21:1;11488:2;11468:18;;;11461:30;11527:34;11507:18;;;11500:62;-1:-1:-1;;;11578:18:1;;;11571:31;11619:19;;32510:59:0;11247:397:1;32510:59:0;17407:10;-1:-1:-1;;;;;32604:23:0;;;;:66;;-1:-1:-1;32631:39:0;32648:7;17407:10;44742:162;:::i;32631:39::-;32582:145;;;;-1:-1:-1;;;32582:145:0;;11851:2:1;32582:145:0;;;11833:21:1;11890:2;11870:18;;;11863:30;11929:31;11909:18;;;11902:59;11978:18;;32582:145:0;11649:353:1;32582:145:0;32740:21;32749:2;32753:7;32740:8;:21::i;:::-;32454:315;32392:377;;:::o;27320:84::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;27374:14:::1;:22:::0;;-1:-1:-1;;27374:22:0::1;::::0;;27320:84::o;33057:256::-;33191:41;17407:10;33210:12;33224:7;33191:18;:41::i;:::-;33183:83;;;;-1:-1:-1;;;33183:83:0;;;;;;;:::i;:::-;33277:28;33287:4;33293:2;33297:7;33277:9;:28::i;44973:440::-;-1:-1:-1;;;;;45058:18:0;;45035:7;45058:18;;;:9;:18;;;;;;:23;;45055:40;;-1:-1:-1;45091:1:0;;44973:440;-1:-1:-1;44973:440:0:o;45055:40::-;-1:-1:-1;;;;;45162:21:0;;45107:29;45162:21;;;:12;:21;;;;;:27;45139:51;;:22;:51::i;:::-;-1:-1:-1;;;;;45232:21:0;;45201:28;45232:21;;;:12;:21;;;;;:35;;;45107:83;;-1:-1:-1;45283:45:0;;;45280:62;;-1:-1:-1;45338:1:0;;44973:440;-1:-1:-1;;;44973:440:0:o;45280:62::-;45361:44;45385:20;45361:21;:44;:::i;:::-;45354:51;44973:440;-1:-1:-1;;;;44973:440:0:o;31188:188::-;17666:1;17811:7;;:19;17803:63;;;;-1:-1:-1;;;17803:63:0;;;;;;;:::i;:::-;17666:1;17877:7;:18;;;31277:10:::1;31267:21:::0;;:9:::1;:21;::::0;;;;;31245:87:::1;;;::::0;-1:-1:-1;;;31245:87:0;;13189:2:1;31245:87:0::1;::::0;::::1;13171:21:1::0;13228:2;13208:18;;;13201:30;-1:-1:-1;;;13247:18:1;;;13240:42;13299:18;;31245:87:0::1;12987:336:1::0;31245:87:0::1;31343:25;31357:10;31343:13;:25::i;:::-;17622:1:::0;17918:7;:22;31188:188::o;27412:149::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;27474:58:::1;::::0;27463:6:::1;::::0;27482:10:::1;::::0;27506:21:::1;::::0;27463:6;27474:58;27463:6;27474:58;27506:21;27482:10;27474:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27462:70;;;27551:1;27543:10;;;::::0;::::1;;27451:110;27412:149::o:0;33384:177::-;33514:39;33531:4;33537:2;33541:7;33514:39;;;;;;;;;;;;:16;:39::i;31386:222::-;17666:1;17811:7;;:19;17803:63;;;;-1:-1:-1;;;17803:63:0;;;;;;;:::i;:::-;17666:1;17877:7;:18;31458:41:::1;17407:10:::0;31477:12:::1;17327:98:::0;31458:41:::1;31450:83;;;;-1:-1:-1::0;;;31450:83:0::1;;;;;;;:::i;:::-;31558:16;::::0;;;:7:::1;:16;::::0;;;;;31544:31:::1;::::0;-1:-1:-1;;;;;31558:16:0::1;31544:13;:31::i;:::-;31586:14;31592:7;31586:5;:14::i;:::-;-1:-1:-1::0;17622:1:0;17918:7;:22;31386:222::o;27892:114::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;27977:21:::1;:6;27986:12:::0;;27977:21:::1;:::i;28014:106::-:0;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;28088:9:::1;:24:::0;;-1:-1:-1;;;;;28088:24:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;28088:24:0;;::::1;::::0;;;::::1;::::0;;28014:106::o;27786:98::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;27860:16:::1;:7;27870:6:::0;;27860:16:::1;:::i;28372:196::-:0;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;28461:19:::1;::::0;;::::1;28494:1;28461:19:::0;;;:11:::1;:19;::::0;;;;:30:::1;;::::0;::::1;28453:65;;;::::0;-1:-1:-1;;;28453:65:0;;13740:2:1;28453:65:0::1;::::0;::::1;13722:21:1::0;13779:2;13759:18;;;13752:30;-1:-1:-1;;;13798:18:1;;;13791:48;13856:18;;28453:65:0::1;13538:342:1::0;28453:65:0::1;28529:19;::::0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:31;28372:196::o;41521:477::-;41583:16;41612:20;41649:17;41659:6;41649:9;:17::i;:::-;41635:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41635:32:0;;41612:55;;41682:17;41692:6;41682:9;:17::i;:::-;41703:1;41682:22;41678:38;;41713:3;41521:477;-1:-1:-1;;41521:477:0:o;41678:38::-;41727:13;41760:6;41755:215;41776:18;;41772:1;:22;41755:215;;;41816:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;41816:20:0;;;:10;;:20;41812:115;;41870:1;41857:3;41861:5;41857:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;41902:7;;;;;41812:115;41953:3;;41755:215;;;-1:-1:-1;41987:3:0;;41521:477;-1:-1:-1;;;41521:477:0:o;30065:1115::-;30160:14;;;;30138:83;;;;-1:-1:-1;;;30138:83:0;;14219:2:1;30138:83:0;;;14201:21:1;14258:2;14238:18;;;14231:30;-1:-1:-1;;;14277:18:1;;;14270:49;14336:18;;30138:83:0;14017:343:1;30138:83:0;30260:1;30254:3;:7;30232:72;;;;-1:-1:-1;;;30232:72:0;;14567:2:1;30232:72:0;;;14549:21:1;14606:2;14586:18;;;14579:30;-1:-1:-1;;;14625:18:1;;;14618:44;14679:18;;30232:72:0;14365:338:1;30232:72:0;30337:19;;;30364:1;30337:19;;;:11;:19;;;;;:24;:28;;;;:66;;-1:-1:-1;30369:19:0;;;;30402:1;30369:19;;;:11;:19;;;;;:30;;;;:34;;30337:66;30315:130;;;;-1:-1:-1;;;30315:130:0;;14910:2:1;30315:130:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:44;15022:18;;30315:130:0;14708:338:1;30315:130:0;30516:19;;;30501:12;30516:19;;;:11;:19;;;;;:24;:30;;30543:3;;30516:30;:::i;:::-;30652:9;;30645:39;;-1:-1:-1;;;30645:39:0;;30673:10;30645:39;;;1674:51:1;30501:45:0;;-1:-1:-1;30501:45:0;;30652:9;;;;-1:-1:-1;;;;;30652:9:0;;30645:27;;1647:18:1;;30645:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;30623:122;;;;-1:-1:-1;;;30623:122:0;;15615:2:1;30623:122:0;;;15597:21:1;15654:2;15634:18;;;15627:30;15693:27;15673:18;;;15666:55;15738:18;;30623:122:0;15413:349:1;30623:122:0;30785:9;;30778:54;;-1:-1:-1;;;30778:54:0;;30806:10;30778:54;;;15979:34:1;30826:4:0;16029:18:1;;;16022:43;30836:4:0;;30785:9;;;-1:-1:-1;;;;;30785:9:0;;30778:27;;15914:18:1;;30778:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;30756:134;;;;-1:-1:-1;;;30756:134:0;;16278:2:1;30756:134:0;;;16260:21:1;16317:2;16297:18;;;16290:30;-1:-1:-1;;;16336:18:1;;;16329:52;16398:18;;30756:134:0;16076:346:1;30756:134:0;30930:9;;30966:13;;30923:63;;-1:-1:-1;;;30923:63:0;;30954:10;30923:63;;;16667:34:1;-1:-1:-1;;;;;30966:13:0;;;16717:18:1;;;16710:43;16769:18;;;16762:34;;;30930:9:0;;;;;;30923:30;;16602:18:1;;30923:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30901:132;;;;-1:-1:-1;;;30901:132:0;;17259:2:1;30901:132:0;;;17241:21:1;17298:2;17278:18;;;17271:30;-1:-1:-1;;;17317:18:1;;;17310:49;17376:18;;30901:132:0;17057:343:1;30901:132:0;31051:6;31046:127;31067:3;31063:1;:7;31046:127;;;31088:41;31098:2;31102:18;;31122:6;31088:9;:41::i;:::-;31156:3;;31046:127;;;;30127:1053;30065:1115;;;:::o;42683:223::-;42747:7;42785:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42785:16:0;;42812:61;;;;-1:-1:-1;;;42812:61:0;;17607:2:1;42812:61:0;;;17589:21:1;17646:2;17626:18;;;17619:30;17685:29;17665:18;;;17658:57;17732:18;;42812:61:0;17405:351:1;28576:223:0;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;28675:19:::1;::::0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:30:::1;;::::0;::::1;:35:::0;28667:70:::1;;;::::0;-1:-1:-1;;;28667:70:0;;17963:2:1;28667:70:0::1;::::0;::::1;17945:21:1::0;18002:2;17982:18;;;17975:30;-1:-1:-1;;;18021:18:1;;;18014:52;18083:18;;28667:70:0::1;17761:346:1::0;28667:70:0::1;28748:19;::::0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:30:::1;;:43:::0;;-1:-1:-1;;28748:43:0::1;::::0;;;::::1;;::::0;;28576:223::o;42431:190::-;42497:7;-1:-1:-1;;;;;42525:21:0;;42517:60;;;;-1:-1:-1;;;42517:60:0;;18314:2:1;42517:60:0;;;18296:21:1;18353:2;18333:18;;;18326:30;18392:28;18372:18;;;18365:56;18438:18;;42517:60:0;18112:350:1;42517:60:0;-1:-1:-1;;;;;;42595:18:0;;;;;:9;:18;;;;;;;42431:190::o;31616:677::-;17666:1;17811:7;;:19;17803:63;;;;-1:-1:-1;;;17803:63:0;;;;;;;:::i;:::-;17666:1;17877:7;:18;31715:11:::1;::::0;31708:41:::1;::::0;-1:-1:-1;;;31708:41:0;;31738:10:::1;31708:41;::::0;::::1;1674:51:1::0;31753:6:0;;-1:-1:-1;;;;;31715:11:0::1;::::0;31708:29:::1;::::0;1647:18:1;;31708:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;31686:121;;;::::0;-1:-1:-1;;;31686:121:0;;18669:2:1;31686:121:0::1;::::0;::::1;18651:21:1::0;18708:2;18688:18;;;18681:30;-1:-1:-1;;;18727:18:1;;;18720:50;18787:18;;31686:121:0::1;18467:344:1::0;31686:121:0::1;31847:11;::::0;31840:56:::1;::::0;-1:-1:-1;;;31840:56:0;;31870:10:::1;31840:56;::::0;::::1;15979:34:1::0;31890:4:0::1;16029:18:1::0;;;16022:43;31900:6:0;;-1:-1:-1;;;;;31847:11:0::1;::::0;31840:29:::1;::::0;15914:18:1;;31840:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;31818:142;;;::::0;-1:-1:-1;;;31818:142:0;;19018:2:1;31818:142:0::1;::::0;::::1;19000:21:1::0;19057:2;19037:18;;;19030:30;19096:28;19076:18;;;19069:56;19142:18;;31818:142:0::1;18816:350:1::0;31818:142:0::1;32000:11;::::0;31993:67:::1;::::0;-1:-1:-1;;;31993:67:0;;32026:10:::1;31993:67;::::0;::::1;16667:34:1::0;32046:4:0::1;16717:18:1::0;;;16710:43;16769:18;;;16762:34;;;-1:-1:-1;;;;;32000:11:0;;::::1;::::0;31993:32:::1;::::0;16602:18:1;;31993:67:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31971:138;;;::::0;-1:-1:-1;;;31971:138:0;;19373:2:1;31971:138:0::1;::::0;::::1;19355:21:1::0;19412:2;19392:18;;;19385:30;-1:-1:-1;;;19431:18:1;;;19424:51;19492:18;;31971:138:0::1;19171:345:1::0;31971:138:0::1;32218:11;;32204:9;;32195:6;:18;32193:36;;;;;:::i;:::-;32172:17;:57:::0;;32193:36;;;::::1;32172:57:::0;;;::::1;::::0;;32244:12:::1;:22:::0;;;;::::1;::::0;;-1:-1:-1;32172:17:0::1;17918:22:::0;31616:677::o;27569:209::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27646:20:0;::::1;27638:45;;;::::0;-1:-1:-1;;;27638:45:0;;19855:2:1;27638:45:0::1;::::0;::::1;19837:21:1::0;19894:2;19874:18;;;19867:30;-1:-1:-1;;;19913:18:1;;;19906:42;19965:18;;27638:45:0::1;19653:336:1::0;27638:45:0::1;27730:39;::::0;-1:-1:-1;;;27730:39:0;;27763:4:::1;27730:39;::::0;::::1;1674:51:1::0;-1:-1:-1;;;;;27694:23:0;::::1;::::0;::::1;::::0;27718:10:::1;::::0;27694:23;;27730:24:::1;::::0;1647:18:1;;27730:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27694:76;::::0;-1:-1:-1;;;;;;27694:76:0::1;::::0;;;;;;-1:-1:-1;;;;;20186:32:1;;;27694:76:0::1;::::0;::::1;20168:51:1::0;20235:18;;;20228:34;20141:18;;27694:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27569:209:::0;:::o;28254:110::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;28330:11:::1;:26:::0;;-1:-1:-1;;;;;;28330:26:0::1;-1:-1:-1::0;;;;;28330:26:0;;;::::1;::::0;;;::::1;::::0;;28254:110::o;44311:90::-;44351:7;44378:4;-1:-1:-1;;;;;44378:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44371:22;;44311:90;:::o;28944:119::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;29023:11:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;29023:32:0;;::::1;::::0;;;::::1;::::0;;28944:119::o;29304:521::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;29453:3;29482:22;;::::1;:55:::0;::::1;;;-1:-1:-1::0;29508:29:0;;::::1;29482:55;29474:83;;;::::0;-1:-1:-1;;;29474:83:0;;20731:2:1;29474:83:0::1;::::0;::::1;20713:21:1::0;20770:2;20750:18;;;20743:30;-1:-1:-1;;;20789:18:1;;;20782:45;20844:18;;29474:83:0::1;20529:339:1::0;29474:83:0::1;29583:6;29578:240;29599:7;29595:1;:11;29578:240;;;29629:6;29624:151;29645:4;;29650:1;29645:7;;;;;;;:::i;:::-;;;;;;;29641:1;:11;29624:151;;;29674:49;29684:3;;29688:1;29684:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;29692:18;;29712:7;;29720:1;29712:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;29674:9;:49::i;:::-;29754:3;;29624:151;;;-1:-1:-1::0;29801:3:0::1;;29578:240;;;;29417:408;29304:521:::0;;;;;;:::o;32841:149::-;32929:53;17407:10;32962:9;32973:8;32929:18;:53::i;23775:132::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;23856:5:::1;::::0;23847:25:::1;::::0;-1:-1:-1;;;;;23847:25:0;;::::1;::::0;23856:5:::1;::::0;23847:25:::1;::::0;23856:5:::1;::::0;23847:25:::1;23883:5;:16:::0;;-1:-1:-1;;;;;;23883:16:0::1;-1:-1:-1::0;;;;;23883:16:0;;;::::1;::::0;;;::::1;::::0;;23775:132::o;33632:300::-;33799:41;17407:10;33832:7;33799:18;:41::i;:::-;33791:83;;;;-1:-1:-1;;;33791:83:0;;;;;;;:::i;:::-;33885:39;33899:4;33905:2;33909:7;33918:5;33885:13;:39::i;:::-;33632:300;;;;:::o;26624:596::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26718:28:0;::::1;26696:87;;;::::0;-1:-1:-1;;;26696:87:0;;21075:2:1;26696:87:0::1;::::0;::::1;21057:21:1::0;21114:1;21094:18;;;21087:29;-1:-1:-1;;;21132:18:1;;;21125:39;21181:18;;26696:87:0::1;20873:332:1::0;26696:87:0::1;26816:11;26794:14:::0;:33;26860:12:::1;26838:14:::0;:34;26905:12:::1;26883:14:::0;:34;26950:12:::1;26928:14:::0;:34;26973:25;:29;;-1:-1:-1;;26973:29:0;;::::1;26850:1;26973:29:::0;;::::1;::::0;;;27013:25;:29;;;::::1;26895:1;27013:29;::::0;;27053:25;:29;;;::::1;27081:1;27053:29;::::0;;27093:25;:30;;;::::1;27121:2;27093:30;::::0;;27134:13:::1;:30:::0;;-1:-1:-1;;;;;27134:30:0;;::::1;-1:-1:-1::0;;;;;;27134:30:0;;::::1;::::0;::::1;::::0;;26794:14:::1;27175:30:::0;;;:14:::1;26794;27175:30:::0;26794:14;27175:30;;;:37;;;;::::1;;::::0;;26624:596::o;43301:365::-;45941:4;45965:16;;;:7;:16;;;;;;43366:13;;-1:-1:-1;;;;;45965:16:0;43392:46;;;;-1:-1:-1;;;43392:46:0;;21412:2:1;43392:46:0;;;21394:21:1;21451:2;21431:18;;;21424:30;-1:-1:-1;;;21470:18:1;;;21463:47;21527:18;;43392:46:0;21210:341:1;43392:46:0;43473:11;;43451:19;;43473:11;;;;;:77;;43533:17;43542:7;43533:8;:17::i;:::-;43473:77;;;43504:24;;;;:15;:24;;;;;;43487:43;;43504:24;;43487:8;:43::i;:::-;43451:99;;43561:19;43597:7;43606:5;43583:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43561:51;;43644:5;43651:6;43630:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43623:35;;;;43301:365;;;:::o;41163:249::-;41279:14;;41249:13;;41279:14;;:35;;;;-1:-1:-1;;;;;;41297:17:0;;;;41279:35;:52;;;;;41330:1;41318:9;:13;41279:52;41275:94;;;-1:-1:-1;41348:9:0;;;;;;;;;-1:-1:-1;41348:9:0;;;;41275:94;-1:-1:-1;41379:25:0;;;;;;;;;;;;-1:-1:-1;;;41379:25:0;;;;41163:249;;;;:::o;28807:129::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28895:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:33;;-1:-1:-1;;28895:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28807:129::o;28128:118::-;23382:5;;-1:-1:-1;;;;;23382:5:0;23368:10;:19;23360:51;;;;-1:-1:-1;;;23360:51:0;;;;;;;:::i;:::-;28208:13:::1;:30:::0;;-1:-1:-1;;;;;;28208:30:0::1;-1:-1:-1::0;;;;;28208:30:0;;;::::1;::::0;;;::::1;::::0;;28128:118::o;40367:159::-;40434:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40434:29:0;-1:-1:-1;;;;;40434:29:0;;;;;;;;:24;;40488:16;40434:24;40488:7;:16::i;:::-;-1:-1:-1;;;;;40479:39:0;;;;;;;;;;;40367:159;;:::o;46170:320::-;46255:4;45965:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45965:16:0;46272:54;;;;-1:-1:-1;;;46272:54:0;;23989:2:1;46272:54:0;;;23971:21:1;24028:2;24008:18;;;24001:30;24067:27;24047:18;;;24040:55;24112:18;;46272:54:0;23787:349:1;46272:54:0;46337:15;46355:16;46363:7;46355;:16::i;:::-;46337:34;;46401:7;-1:-1:-1;;;;;46390:18:0;:7;-1:-1:-1;;;;;46390:18:0;;:53;;;;46436:7;-1:-1:-1;;;;;46412:31:0;:20;46424:7;46412:11;:20::i;:::-;-1:-1:-1;;;;;46412:31:0;;46390:53;:91;;;-1:-1:-1;;;;;;44858:27:0;;;44834:4;44858:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;46447:34;44742:162;37113:1299;17666:1;17811:7;;:19;17803:63;;;;-1:-1:-1;;;17803:63:0;;;;;;;:::i;:::-;17666:1;17877:7;:18;-1:-1:-1;;;;;37250:24:0;::::1;:16;37258:7:::0;37250::::1;:16::i;:::-;-1:-1:-1::0;;;;;37250:24:0::1;;37242:52;;;::::0;-1:-1:-1;;;37242:52:0;;24343:2:1;37242:52:0::1;::::0;::::1;24325:21:1::0;24382:2;24362:18;;;24355:30;-1:-1:-1;;;24401:18:1;;;24394:45;24456:18;;37242:52:0::1;24141:339:1::0;37242:52:0::1;-1:-1:-1::0;;;;;37313:16:0;::::1;37305:41;;;::::0;-1:-1:-1;;;37305:41:0;;24687:2:1;37305:41:0::1;::::0;::::1;24669:21:1::0;24726:2;24706:18;;;24699:30;-1:-1:-1;;;24745:18:1;;;24738:42;24797:18;;37305:41:0::1;24485:336:1::0;37305:41:0::1;37383:1;37365:15;37375:4;37365:9;:15::i;:::-;:19;37357:44;;;::::0;-1:-1:-1;;;37357:44:0;;13189:2:1;37357:44:0::1;::::0;::::1;13171:21:1::0;13228:2;13208:18;;;13201:30;-1:-1:-1;;;13247:18:1;;;13240:42;13299:18;;37357:44:0::1;12987:336:1::0;37357:44:0::1;37466:29;37483:1;37487:7;37466:8;:29::i;:::-;37543:19;37557:4;37543:13;:19::i;:::-;-1:-1:-1::0;;;;;37630:13:0;::::1;37646:1;37630:13:::0;;;:9:::1;:13;::::0;;;;;:17;37626:67:::1;;37664:17;37678:2;37664:13;:17::i;:::-;-1:-1:-1::0;;;;;37753:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:22:::1;::::0;37773:1:::1;37753:19;:22::i;:::-;-1:-1:-1::0;;;;;37735:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:40;;;;37786:13;;::::1;::::0;;;;;:18;;37803:1:::1;::::0;37735:15;37786:18:::1;::::0;37803:1;;37786:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;37815:16:0::1;::::0;;;:7:::1;:16;::::0;;;;;;;:21;;-1:-1:-1;;;;;;37815:21:0::1;-1:-1:-1::0;;;;;37815:21:0;;::::1;::::0;;;::::1;::::0;;;37925:15:::1;:24:::0;;;;;;::::1;::::0;;::::1;37913:37:::0;;:11:::1;:37:::0;;;;;-1:-1:-1;37913:48:0::1;::::0;38025:18;;::::1;::::0;;:12:::1;:18:::0;;;;;;:38;;37913:48;;;::::1;::::0;;;38025:18;:38:::1;::::0;37913:48;;38025:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;38074:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;:36;;::::1;::::0;::::1;::::0;:16;:36:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;38218:18:0;::::1;;::::0;;;:12:::1;:18;::::0;;;;:24;38195:48:::1;::::0;:22:::1;:48::i;:::-;-1:-1:-1::0;;;;;38160:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;:32:::1;;:83:::0;;;;38310:16;;::::1;::::0;;;:22;38287:46:::1;::::0;:22:::1;:46::i;:::-;-1:-1:-1::0;;;;;38254:16:0;;::::1;;::::0;;;:12:::1;:16;::::0;;;;;:30:::1;;:79:::0;;;;38377:27;;38396:7;;38254:16;;38377:27;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;17622:1:0;17918:7;:22;-1:-1:-1;;37113:1299:0:o;45492:148::-;45562:7;45589:43;45622:9;;45589:28;45599:17;;45589:5;:9;;:28;;;;:::i;:::-;:32;;:43::i;38474:731::-;-1:-1:-1;;;;;38572:15:0;;;;;;:9;:15;;;;;;:20;;38568:59;;38474:731;:::o;38568:59::-;38673:12;38688:20;38703:4;38688:14;:20::i;:::-;38747:11;;38740:44;;-1:-1:-1;;;38740:44:0;;38778:4;38740:44;;;1674:51:1;38673:35:0;;-1:-1:-1;38719:18:0;;-1:-1:-1;;;;;38747:11:0;;;;38740:29;;1647:18:1;;38740:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38719:65;;38809:13;38799:7;:23;38795:79;;;38849:13;38839:23;;38795:79;38923:7;38934:1;38923:12;38919:51;;38952:7;;38474:731;:::o;38919:51::-;-1:-1:-1;;;;;39080:18:0;;;;;;:12;:18;;;;;:24;39057:48;;:22;:48::i;:::-;-1:-1:-1;;;;;39022:18:0;;;;;;;:12;:18;;;;;;;:32;;:83;;;;39161:11;;39154:43;;-1:-1:-1;;;39154:43:0;;;;;20168:51:1;;;;20235:18;;;20228:34;;;39161:11:0;;;39154:28;;20141:18:1;;39154:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39434:815::-;45941:4;45965:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45965:16:0;39486:49;;;;-1:-1:-1;;;39486:49:0;;25161:2:1;39486:49:0;;;25143:21:1;25200:2;25180:18;;;25173:30;-1:-1:-1;;;25219:18:1;;;25212:50;25279:18;;39486:49:0;24959:344:1;39486:49:0;39575:14;39592:16;39600:7;39592;:16::i;:::-;39575:33;;39649:29;39666:1;39670:7;39649:8;:29::i;:::-;-1:-1:-1;;;;;39721:17:0;;;;;;:9;:17;;;;;:22;;39742:1;;39721:17;:22;;39742:1;;39721:22;:::i;:::-;;;;-1:-1:-1;;39761:16:0;;;;:7;:16;;;;;39754:23;;-1:-1:-1;;;;;;39754:23:0;;;39825:12;:17;;39754:23;;39761:16;39825:17;;39754:23;;39825:17;:::i;:::-;;;;-1:-1:-1;;39906:18:0;39939:24;;;:15;:24;;;;;;;;;;;;;39927:37;;:11;:37;;;;;39939:24;39927:48;;39986:11;:25;;39927:48;;;;;;;39986:11;:25;;39927:48;;39986:25;:::i;:::-;;;;-1:-1:-1;;;;;;;40022:20:0;;;;;;:12;:20;;;;;:40;;40052:10;;40022:20;:40;;40052:10;;40022:40;:::i;:::-;;;;-1:-1:-1;;;;;;;40133:20:0;;;;;;:12;:20;;;;;:26;40110:50;;:22;:50::i;:::-;-1:-1:-1;;;;;40073:20:0;;;;;;:12;:20;;;;;;:34;;:87;;;;40204:37;;40233:7;;40073:20;;40204:37;;40073:20;;40204:37;39475:774;;39434:815;:::o;34329:312::-;34445:26;34451:2;34455:7;34464:6;34445:5;:26::i;:::-;34504:51;34535:1;34539:2;34543:7;34504:51;;;;;;;;;;;;:22;:51::i;:::-;34482:151;;;;-1:-1:-1;;;34482:151:0;;25510:2:1;34482:151:0;;;25492:21:1;25549:2;25529:18;;;25522:30;25588:34;25568:18;;;25561:62;-1:-1:-1;;;25639:18:1;;;25632:48;25697:19;;34482:151:0;25308:414:1;40668:319:0;40820:9;-1:-1:-1;;;;;40809:20:0;:7;-1:-1:-1;;;;;40809:20:0;;40801:58;;;;-1:-1:-1;;;40801:58:0;;25929:2:1;40801:58:0;;;25911:21:1;25968:2;25948:18;;;25941:30;26007:27;25987:18;;;25980:55;26052:18;;40801:58:0;25727:349:1;40801:58:0;-1:-1:-1;;;;;40870:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;40870:49:0;;;;;;;;;;40935:44;;540:41:1;;;40935:44:0;;513:18:1;40935:44:0;;;;;;;40668:319;;;:::o;36481:295::-;36630:28;36640:4;36646:2;36650:7;36630:9;:28::i;:::-;36677:48;36700:4;36706:2;36710:7;36719:5;36677:22;:48::i;:::-;36669:99;;;;-1:-1:-1;;;36669:99:0;;;;;;;:::i;43730:573::-;43780:27;43824:2;43830:1;43824:7;43820:50;;-1:-1:-1;;43848:10:0;;;;;;;;;;;;-1:-1:-1;;;43848:10:0;;;;;43730:573::o;43820:50::-;43889:2;43880:6;43921:69;43928:6;;43921:69;;43951:5;;;;:::i;:::-;;-1:-1:-1;43971:7:0;;-1:-1:-1;43976:2:0;43971:7;;:::i;:::-;;;43921:69;;;44000:17;44030:3;44020:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44020:14:0;-1:-1:-1;44000:34:0;-1:-1:-1;44054:3:0;44068:198;44075:7;;44068:198;;44103:3;44105:1;44103;:3;:::i;:::-;44099:7;-1:-1:-1;44121:10:0;44151:7;44156:2;44151;:7;:::i;:::-;:12;;44161:2;44151:12;:::i;:::-;44146:17;;:2;:17;:::i;:::-;44135:29;;:2;:29;:::i;:::-;44121:44;;44180:9;44199:4;44192:12;;44180:24;;44229:2;44219:4;44224:1;44219:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;44219:12:0;;;;;;;;-1:-1:-1;44246:8:0;44252:2;44246:8;;:::i;:::-;;;44084:182;;44068:198;;;-1:-1:-1;44290:4:0;43730:573;-1:-1:-1;;;;43730:573:0:o;18682:136::-;18740:7;18767:43;18771:1;18774;18767:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;18760:50;18682:136;-1:-1:-1;;;18682:136:0:o;19572:471::-;19630:7;19875:1;19880;19875:6;19871:47;;-1:-1:-1;19905:1:0;19898:8;;19871:47;19930:9;19942:5;19946:1;19942;:5;:::i;:::-;19930:17;-1:-1:-1;19975:1:0;19966:5;19970:1;19930:17;19966:5;:::i;:::-;:10;19958:56;;;;-1:-1:-1;;;19958:56:0;;27261:2:1;19958:56:0;;;27243:21:1;27300:2;27280:18;;;27273:30;27339:34;27319:18;;;27312:62;-1:-1:-1;;;27390:18:1;;;27383:31;27431:19;;19958:56:0;27059:397:1;20519:132:0;20577:7;20604:39;20608:1;20611;20604:39;;;;;;;;;;;;;;;;;:3;:39::i;34977:622::-;45941:4;45965:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45965:16:0;:30;35055:58;;;;-1:-1:-1;;;35055:58:0;;27663:2:1;35055:58:0;;;27645:21:1;27702:2;27682:18;;;27675:30;27741;27721:18;;;27714:58;27789:18;;35055:58:0;27461:352:1;35055:58:0;35126:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;35126:21:0;-1:-1:-1;;;;;35126:21:0;;;;;;;;35158:15;:24;;;;;:33;;-1:-1:-1;;35158:33:0;;;;;;;;;;;35227:18;:20;;-1:-1:-1;35227:20:0;;;;;;35262:12;:14;;;;;;35291:13;;;:9;:13;;;;;:15;;;;;;35336:19;;;:11;:19;;;;;:30;;;35321:11;:45;;35336:30;;;35321:45;;;;;35407:30;35381:16;;;:12;:16;;;;;:56;;35407:30;;;;35381:56;;;;;;;35494:46;;:22;:46::i;:::-;-1:-1:-1;;;;;35461:16:0;;;;;;:12;:16;;;;;;:30;;:79;;;;35558:33;;35583:7;;35461:16;35558:33;;35461:16;;35558:33;34977:622;;;:::o;47187:787::-;47342:4;47363:15;:2;-1:-1:-1;;;;;47363:13:0;;:15::i;:::-;47359:608;;;47399:72;;-1:-1:-1;;;47399:72:0;;-1:-1:-1;;;;;47399:36:0;;;;;:72;;17407:10;;47450:4;;47456:7;;47465:5;;47399:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47399:72:0;;;;;;;;-1:-1:-1;;47399:72:0;;;;;;;;;;;;:::i;:::-;;;47395:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47641:6;:13;47658:1;47641:18;47637:260;;47684:48;;-1:-1:-1;;;47684:48:0;;;;;;;:::i;47637:260::-;47847:6;47841:13;47832:6;47828:2;47824:15;47817:38;47395:517;-1:-1:-1;;;;;;47522:51:0;-1:-1:-1;;;47522:51:0;;-1:-1:-1;47515:58:0;;47359:608;-1:-1:-1;47951:4:0;47187:787;;;;;;:::o;19121:192::-;19207:7;19243:12;19235:6;;;;19227:29;;;;-1:-1:-1;;;19227:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19267:9:0;19279:5;19283:1;19279;:5;:::i;:::-;19267:17;19121:192;-1:-1:-1;;;;;19121:192:0:o;21147:278::-;21233:7;21268:12;21261:5;21253:28;;;;-1:-1:-1;;;21253:28:0;;;;;;;;:::i;:::-;-1:-1:-1;21292:9:0;21304:5;21308:1;21304;:5;:::i;8474:619::-;8534:4;9002:20;;8845:66;9042:23;;;;;;:42;;-1:-1:-1;;9069:15:0;;;9034:51;-1:-1:-1;;8474:619:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2563:456::-;2640:6;2648;2656;2709:2;2697:9;2688:7;2684:23;2680:32;2677:52;;;2725:1;2722;2715:12;2677:52;2764:9;2751:23;2783:31;2808:5;2783:31;:::i;:::-;2833:5;-1:-1:-1;2890:2:1;2875:18;;2862:32;2903:33;2862:32;2903:33;:::i;:::-;2563:456;;2955:7;;-1:-1:-1;;;3009:2:1;2994:18;;;;2981:32;;2563:456::o;3024:247::-;3083:6;3136:2;3124:9;3115:7;3111:23;3107:32;3104:52;;;3152:1;3149;3142:12;3104:52;3191:9;3178:23;3210:31;3235:5;3210:31;:::i;3276:592::-;3347:6;3355;3408:2;3396:9;3387:7;3383:23;3379:32;3376:52;;;3424:1;3421;3414:12;3376:52;3464:9;3451:23;3493:18;3534:2;3526:6;3523:14;3520:34;;;3550:1;3547;3540:12;3520:34;3588:6;3577:9;3573:22;3563:32;;3633:7;3626:4;3622:2;3618:13;3614:27;3604:55;;3655:1;3652;3645:12;3604:55;3695:2;3682:16;3721:2;3713:6;3710:14;3707:34;;;3737:1;3734;3727:12;3707:34;3782:7;3777:2;3768:6;3764:2;3760:15;3756:24;3753:37;3750:57;;;3803:1;3800;3793:12;3750:57;3834:2;3826:11;;;;;3856:6;;-1:-1:-1;3276:592:1;;-1:-1:-1;;;;3276:592:1:o;3873:156::-;3939:20;;3999:4;3988:16;;3978:27;;3968:55;;4019:1;4016;4009:12;3968:55;3873:156;;;:::o;4034:250::-;4100:6;4108;4161:2;4149:9;4140:7;4136:23;4132:32;4129:52;;;4177:1;4174;4167:12;4129:52;4200:27;4217:9;4200:27;:::i;4289:632::-;4460:2;4512:21;;;4582:13;;4485:18;;;4604:22;;;4431:4;;4460:2;4683:15;;;;4657:2;4642:18;;;4431:4;4726:169;4740:6;4737:1;4734:13;4726:169;;;4801:13;;4789:26;;4870:15;;;;4835:12;;;;4762:1;4755:9;4726:169;;;-1:-1:-1;4912:3:1;;4289:632;-1:-1:-1;;;;;;4289:632:1:o;4926:385::-;5001:6;5009;5017;5070:2;5058:9;5049:7;5045:23;5041:32;5038:52;;;5086:1;5083;5076:12;5038:52;5125:9;5112:23;5144:31;5169:5;5144:31;:::i;:::-;5194:5;-1:-1:-1;5246:2:1;5231:18;;5218:32;;-1:-1:-1;5269:36:1;5301:2;5286:18;;5269:36;:::i;:::-;5259:46;;4926:385;;;;;:::o;5316:252::-;5380:6;5388;5441:2;5429:9;5420:7;5416:23;5412:32;5409:52;;;5457:1;5454;5447:12;5409:52;5480:27;5497:9;5480:27;:::i;:::-;5470:37;;5526:36;5558:2;5547:9;5543:18;5526:36;:::i;:::-;5516:46;;5316:252;;;;;:::o;5826:118::-;5912:5;5905:13;5898:21;5891:5;5888:32;5878:60;;5934:1;5931;5924:12;5949:241;6005:6;6058:2;6046:9;6037:7;6033:23;6029:32;6026:52;;;6074:1;6071;6064:12;6026:52;6113:9;6100:23;6132:28;6154:5;6132:28;:::i;6195:367::-;6258:8;6268:6;6322:3;6315:4;6307:6;6303:17;6299:27;6289:55;;6340:1;6337;6330:12;6289:55;-1:-1:-1;6363:20:1;;6406:18;6395:30;;6392:50;;;6438:1;6435;6428:12;6392:50;6475:4;6467:6;6463:17;6451:29;;6535:3;6528:4;6518:6;6515:1;6511:14;6503:6;6499:27;6495:38;6492:47;6489:67;;;6552:1;6549;6542:12;6489:67;6195:367;;;;;:::o;6567:1086::-;6723:6;6731;6739;6747;6755;6763;6816:2;6804:9;6795:7;6791:23;6787:32;6784:52;;;6832:1;6829;6822:12;6784:52;6872:9;6859:23;6901:18;6942:2;6934:6;6931:14;6928:34;;;6958:1;6955;6948:12;6928:34;6997:70;7059:7;7050:6;7039:9;7035:22;6997:70;:::i;:::-;7086:8;;-1:-1:-1;6971:96:1;-1:-1:-1;7174:2:1;7159:18;;7146:32;;-1:-1:-1;7190:16:1;;;7187:36;;;7219:1;7216;7209:12;7187:36;7258:72;7322:7;7311:8;7300:9;7296:24;7258:72;:::i;:::-;7349:8;;-1:-1:-1;7232:98:1;-1:-1:-1;7437:2:1;7422:18;;7409:32;;-1:-1:-1;7453:16:1;;;7450:36;;;7482:1;7479;7472:12;7450:36;;7521:72;7585:7;7574:8;7563:9;7559:24;7521:72;:::i;:::-;6567:1086;;;;-1:-1:-1;6567:1086:1;;-1:-1:-1;6567:1086:1;;7612:8;;6567:1086;-1:-1:-1;;;6567:1086:1:o;7658:382::-;7723:6;7731;7784:2;7772:9;7763:7;7759:23;7755:32;7752:52;;;7800:1;7797;7790:12;7752:52;7839:9;7826:23;7858:31;7883:5;7858:31;:::i;:::-;7908:5;-1:-1:-1;7965:2:1;7950:18;;7937:32;7978:30;7937:32;7978:30;:::i;:::-;8027:7;8017:17;;;7658:382;;;;;:::o;8252:127::-;8313:10;8308:3;8304:20;8301:1;8294:31;8344:4;8341:1;8334:15;8368:4;8365:1;8358:15;8384:1266;8479:6;8487;8495;8503;8556:3;8544:9;8535:7;8531:23;8527:33;8524:53;;;8573:1;8570;8563:12;8524:53;8612:9;8599:23;8631:31;8656:5;8631:31;:::i;:::-;8681:5;-1:-1:-1;8738:2:1;8723:18;;8710:32;8751:33;8710:32;8751:33;:::i;:::-;8803:7;-1:-1:-1;8857:2:1;8842:18;;8829:32;;-1:-1:-1;8912:2:1;8897:18;;8884:32;8935:18;8965:14;;;8962:34;;;8992:1;8989;8982:12;8962:34;9030:6;9019:9;9015:22;9005:32;;9075:7;9068:4;9064:2;9060:13;9056:27;9046:55;;9097:1;9094;9087:12;9046:55;9133:2;9120:16;9155:2;9151;9148:10;9145:36;;;9161:18;;:::i;:::-;9236:2;9230:9;9204:2;9290:13;;-1:-1:-1;;9286:22:1;;;9310:2;9282:31;9278:40;9266:53;;;9334:18;;;9354:22;;;9331:46;9328:72;;;9380:18;;:::i;:::-;9420:10;9416:2;9409:22;9455:2;9447:6;9440:18;9495:7;9490:2;9485;9481;9477:11;9473:20;9470:33;9467:53;;;9516:1;9513;9506:12;9467:53;9572:2;9567;9563;9559:11;9554:2;9546:6;9542:15;9529:46;9617:1;9612:2;9607;9599:6;9595:15;9591:24;9584:35;9638:6;9628:16;;;;;;;8384:1266;;;;;;;:::o;9655:182::-;9712:6;9765:2;9753:9;9744:7;9740:23;9736:32;9733:52;;;9781:1;9778;9771:12;9733:52;9804:27;9821:9;9804:27;:::i;10102:388::-;10170:6;10178;10231:2;10219:9;10210:7;10206:23;10202:32;10199:52;;;10247:1;10244;10237:12;10199:52;10286:9;10273:23;10305:31;10330:5;10305:31;:::i;:::-;10355:5;-1:-1:-1;10412:2:1;10397:18;;10384:32;10425:33;10384:32;10425:33;:::i;10495:343::-;10697:2;10679:21;;;10736:2;10716:18;;;10709:30;-1:-1:-1;;;10770:2:1;10755:18;;10748:49;10829:2;10814:18;;10495:343::o;12007:353::-;12209:2;12191:21;;;12248:2;12228:18;;;12221:30;12287:31;12282:2;12267:18;;12260:59;12351:2;12336:18;;12007:353::o;12365:127::-;12426:10;12421:3;12417:20;12414:1;12407:31;12457:4;12454:1;12447:15;12481:4;12478:1;12471:15;12497:125;12537:4;12565:1;12562;12559:8;12556:34;;;12570:18;;:::i;:::-;-1:-1:-1;12607:9:1;;12497:125::o;12627:355::-;12829:2;12811:21;;;12868:2;12848:18;;;12841:30;12907:33;12902:2;12887:18;;12880:61;12973:2;12958:18;;12627:355::o;13885:127::-;13946:10;13941:3;13937:20;13934:1;13927:31;13977:4;13974:1;13967:15;14001:4;13998:1;13991:15;15051:168;15091:7;15157:1;15153;15149:6;15145:14;15142:1;15139:21;15134:1;15127:9;15120:17;15116:45;15113:71;;;15164:18;;:::i;:::-;-1:-1:-1;15204:9:1;;15051:168::o;15224:184::-;15294:6;15347:2;15335:9;15326:7;15322:23;15318:32;15315:52;;;15363:1;15360;15353:12;15315:52;-1:-1:-1;15386:16:1;;15224:184;-1:-1:-1;15224:184:1:o;16807:245::-;16874:6;16927:2;16915:9;16906:7;16902:23;16898:32;16895:52;;;16943:1;16940;16933:12;16895:52;16975:9;16969:16;16994:28;17016:5;16994:28;:::i;19521:127::-;19582:10;19577:3;19573:20;19570:1;19563:31;19613:4;19610:1;19603:15;19637:4;19634:1;19627:15;20273:251;20343:6;20396:2;20384:9;20375:7;20371:23;20367:32;20364:52;;;20412:1;20409;20402:12;20364:52;20444:9;20438:16;20463:31;20488:5;20463:31;:::i;21556:380::-;21635:1;21631:12;;;;21678;;;21699:61;;21753:4;21745:6;21741:17;21731:27;;21699:61;21806:2;21798:6;21795:14;21775:18;21772:38;21769:161;;21852:10;21847:3;21843:20;21840:1;21833:31;21887:4;21884:1;21877:15;21915:4;21912:1;21905:15;21769:161;;21556:380;;;:::o;22067:973::-;22152:12;;22117:3;;22207:1;22227:18;;;;22280;;;;22307:61;;22361:4;22353:6;22349:17;22339:27;;22307:61;22387:2;22435;22427:6;22424:14;22404:18;22401:38;22398:161;;22481:10;22476:3;22472:20;22469:1;22462:31;22516:4;22513:1;22506:15;22544:4;22541:1;22534:15;22398:161;22575:18;22602:104;;;;22720:1;22715:319;;;;22568:466;;22602:104;-1:-1:-1;;22635:24:1;;22623:37;;22680:16;;;;-1:-1:-1;22602:104:1;;22715:319;22014:1;22007:14;;;22051:4;22038:18;;22809:1;22823:165;22837:6;22834:1;22831:13;22823:165;;;22915:14;;22902:11;;;22895:35;22958:16;;;;22852:10;;22823:165;;;22827:3;;23017:6;23012:3;23008:16;23001:23;;22568:466;;;;;;;22067:973;;;;:::o;23045:376::-;23221:3;23249:38;23283:3;23275:6;23249:38;:::i;:::-;23316:6;23310:13;23332:52;23377:6;23373:2;23366:4;23358:6;23354:17;23332:52;:::i;:::-;23400:15;;23045:376;-1:-1:-1;;;;23045:376:1:o;23426:356::-;23602:3;23640:6;23634:13;23656:53;23702:6;23697:3;23690:4;23682:6;23678:17;23656:53;:::i;:::-;23725:51;23768:6;23763:3;23759:16;23751:6;23725:51;:::i;24826:128::-;24866:3;24897:1;24893:6;24890:1;24887:13;24884:39;;;24903:18;;:::i;:::-;-1:-1:-1;24939:9:1;;24826:128::o;26081:402::-;26283:2;26265:21;;;26322:2;26302:18;;;26295:30;26361:34;26356:2;26341:18;;26334:62;-1:-1:-1;;;26427:2:1;26412:18;;26405:36;26473:3;26458:19;;26081:402::o;26488:135::-;26527:3;26548:17;;;26545:43;;26568:18;;:::i;:::-;-1:-1:-1;26615:1:1;26604:13;;26488:135::o;26628:217::-;26668:1;26694;26684:132;;26738:10;26733:3;26729:20;26726:1;26719:31;26773:4;26770:1;26763:15;26801:4;26798:1;26791:15;26684:132;-1:-1:-1;26830:9:1;;26628:217::o;26850:204::-;26888:3;26924:4;26921:1;26917:12;26956:4;26953:1;26949:12;26991:3;26985:4;26981:14;26976:3;26973:23;26970:49;;;26999:18;;:::i;:::-;27035:13;;26850:204;-1:-1:-1;;;26850:204:1:o;27818:489::-;-1:-1:-1;;;;;28087:15:1;;;28069:34;;28139:15;;28134:2;28119:18;;28112:43;28186:2;28171:18;;28164:34;;;28234:3;28229:2;28214:18;;28207:31;;;28012:4;;28255:46;;28281:19;;28273:6;28255:46;:::i;:::-;28247:54;27818:489;-1:-1:-1;;;;;;27818:489:1:o;28312:249::-;28381:6;28434:2;28422:9;28413:7;28409:23;28405:32;28402:52;;;28450:1;28447;28440:12;28402:52;28482:9;28476:16;28501:30;28525:5;28501:30;:::i

Swarm Source

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