Token IceCream Finance

DeFi  

Overview ERC20

Price
$0.20 @ 0.009911 AVAX (+6.25%)
Fully Diluted Market Cap
Total Supply:
14,870.477823 CREAM

Holders:
508 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Algo stablecoin on Avalanche C Chain, pegged to the price of 1 AVAX via seigniorage.

Market

Volume (24H):$2.31
Market Capitalization:$0.00
Circulating Supply:0.00 CREAM
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf8371171396b06971d736673d257efa9f5066d44

Contract Name:
Cream

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

// File: interfaces/IOracle.sol



pragma solidity 0.8.0;

interface IOracle {
    function update() external;

    function consult(address _token, uint256 _amountIn)
        external
        view
        returns (uint144 amountOut);

    function twap(address _token, uint256 _amountIn)
        external
        view
        returns (uint144 _amountOut);
}

// File: lib/SafeMath8.sol



pragma solidity 0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath8 {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint8 a, uint8 b) internal pure returns (uint8) {
        uint8 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(uint8 a, uint8 b) internal pure returns (uint8) {
        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(
        uint8 a,
        uint8 b,
        string memory errorMessage
    ) internal pure returns (uint8) {
        require(b <= a, errorMessage);
        uint8 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(uint8 a, uint8 b) internal pure returns (uint8) {
        // 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;
        }

        uint8 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(uint8 a, uint8 b) internal pure returns (uint8) {
        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(
        uint8 a,
        uint8 b,
        string memory errorMessage
    ) internal pure returns (uint8) {
        require(b > 0, errorMessage);
        uint8 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(uint8 a, uint8 b) internal pure returns (uint8) {
        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(
        uint8 a,
        uint8 b,
        string memory errorMessage
    ) internal pure returns (uint8) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: owner/Operator.sol



pragma solidity 0.8.0;



contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(
        address indexed previousOperator,
        address indexed newOperator
    );

    constructor() {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(
            _operator == msg.sender,
            "operator: caller is not the operator"
        );
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(
            newOperator_ != address(0),
            "operator: zero address given for new operator"
        );
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

// File: CREAM.sol



pragma solidity 0.8.0;







/*

█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
█░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░░░███░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░██████████░░░░░░█
█░░▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░░░░░░░░░░░░░▄▀░░█
█░░░░▄▀░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░▄▀░░███░░▄▀░░░░░░░░░░█░░▄▀░░░░░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀░░█
███░░▄▀░░███░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░████░░▄▀░░███░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░░░░░▄▀░░█
███░░▄▀░░███░░▄▀░░█████████░░▄▀░░░░░░░░░░█░░▄▀░░█████████░░▄▀░░░░░░░░▄▀░░███░░▄▀░░░░░░░░░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░██░░▄▀░░█
███░░▄▀░░███░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░██░░▄▀░░█
███░░▄▀░░███░░▄▀░░█████████░░▄▀░░░░░░░░░░█░░▄▀░░█████████░░▄▀░░░░░░▄▀░░░░███░░▄▀░░░░░░░░░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░░░░░██░░▄▀░░█
███░░▄▀░░███░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░██░░▄▀░░█████░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░██████████░░▄▀░░█
█░░░░▄▀░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░██░░▄▀░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██████████░░▄▀░░█
█░░▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██████████░░▄▀░░█
█░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░██░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░██░░░░░░█░░░░░░██████████░░░░░░█
█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
█░░░░░░░░░░░░░░█░░░░░░░░░░█░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█
█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀░░█░░▄▀░░░░░░░░░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░░░░░░░░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█
█░░▄▀░░░░░░░░░░█░░░░▄▀░░░░█░░▄▀▄▀▄▀▄▀▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░██░░▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█
█░░▄▀░░███████████░░▄▀░░███░░▄▀░░░░░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░██░░▄▀░░█░░▄▀░░█████████░░▄▀░░█████████
█░░▄▀░░░░░░░░░░███░░▄▀░░███░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░█████████░░▄▀░░░░░░░░░░█
█░░▄▀▄▀▄▀▄▀▄▀░░███░░▄▀░░███░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█
█░░▄▀░░░░░░░░░░███░░▄▀░░███░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░█████████░░▄▀░░░░░░░░░░█
█░░▄▀░░███████████░░▄▀░░███░░▄▀░░██░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░░░░░▄▀░░█░░▄▀░░█████████░░▄▀░░█████████
█░░▄▀░░█████████░░░░▄▀░░░░█░░▄▀░░██░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█
█░░▄▀░░█████████░░▄▀▄▀▄▀░░█░░▄▀░░██░░░░░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀░░██░░░░░░░░░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█
█░░░░░░█████████░░░░░░░░░░█░░░░░░██████████░░░░░░█░░░░░░██░░░░░░█░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█
██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████       
*/

contract Cream is ERC20Burnable, Operator {
    using SafeMath8 for uint8;
    using SafeMath for uint256;

    // Initial distribution for the first 24h genesis pools
    uint256 public constant INITIAL_GENESIS_POOL_DISTRIBUTION = 10000 ether;
    // Initial distribution for the day 2-5 CREAM-WETH LP -> CREAM pool
    uint256 public constant INITIAL_CREAM_POOL_DISTRIBUTION = 0 ether;
    // Distribution for airdrops wallet
    uint256 public constant INITIAL_AIRDROP_WALLET_DISTRIBUTION = 1000 ether;

    // Have the rewards been distributed to the pools
    bool public rewardPoolDistributed = false;

    address public creamOracle;

    /**
     * @notice Constructs the CREAM ERC-20 contract.
     */
    constructor() public ERC20("IceCream Finance", "CREAM") {
        // Mints 1 CREAM to contract creator for initial pool setup
        _mint(msg.sender, 1 ether);
    }

    function _getCreamPrice() internal view returns (uint256 _creamPrice) {
        try IOracle(creamOracle).consult(address(this), 1e18) returns (
            uint144 _price
        ) {
            return uint256(_price);
        } catch {
            revert("Cream: failed to fetch CREAM price from Oracle");
        }
    }

    function setCreamOracle(address _creamOracle) public onlyOperator {
        require(
            _creamOracle != address(0),
            "oracle address cannot be 0 address"
        );
        creamOracle = _creamOracle;
    }

    /**
     * @notice Operator mints CREAM to a recipient
     * @param recipient_ The address of recipient
     * @param amount_ The amount of CREAM to mint to
     * @return whether the process has been done
     */
    function mint(address recipient_, uint256 amount_)
        public
        onlyOperator
        returns (bool)
    {
        uint256 balanceBefore = balanceOf(recipient_);
        _mint(recipient_, amount_);
        uint256 balanceAfter = balanceOf(recipient_);

        return balanceAfter > balanceBefore;
    }

    function burn(uint256 amount) public override {
        super.burn(amount);
    }

    function burnFrom(address account, uint256 amount)
        public
        override
        onlyOperator
    {
        super.burnFrom(account, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            allowance(sender, _msgSender()).sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @notice distribute to reward pool (only once)
     */
    function distributeReward(
        address _genesisPool,
        address _creamPool,
        address _airdropWallet
    ) external onlyOperator {
        require(!rewardPoolDistributed, "only can distribute once");
        require(_genesisPool != address(0), "!_genesisPool");
        require(_creamPool != address(0), "!_creamPool");
        require(_airdropWallet != address(0), "!_airdropWallet");
        rewardPoolDistributed = true;
        _mint(_genesisPool, INITIAL_GENESIS_POOL_DISTRIBUTION);
        _mint(_creamPool, INITIAL_CREAM_POOL_DISTRIBUTION);
        _mint(_airdropWallet, INITIAL_AIRDROP_WALLET_DISTRIBUTION);
    }

    function governanceRecoverUnsupported(
        IERC20 _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        _token.transfer(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"INITIAL_AIRDROP_WALLET_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_CREAM_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_GENESIS_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creamOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_genesisPool","type":"address"},{"internalType":"address","name":"_creamPool","type":"address"},{"internalType":"address","name":"_airdropWallet","type":"address"}],"name":"distributeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPoolDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creamOracle","type":"address"}],"name":"setCreamOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601081526020017f496365437265616d2046696e616e6365000000000000000000000000000000008152506040518060400160405280600581526020017f435245414d0000000000000000000000000000000000000000000000000000008152508160039080519060200190620000b19291906200042b565b508060049080519060200190620000ca9291906200042b565b505050620000ed620000e1620001da60201b60201c565b620001e260201b60201c565b620000fd620001da60201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a3620001d433670de0b6b3a7640000620002a860201b60201c565b62000679565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200031b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000312906200052e565b60405180910390fd5b6200032f600083836200042160201b60201c565b80600260008282546200034391906200057e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200039a91906200057e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000401919062000550565b60405180910390a36200041d600083836200042660201b60201c565b5050565b505050565b505050565b8280546200043990620005e5565b90600052602060002090601f0160209004810192826200045d5760008555620004a9565b82601f106200047857805160ff1916838001178555620004a9565b82800160010185558215620004a9579182015b82811115620004a85782518255916020019190600101906200048b565b5b509050620004b89190620004bc565b5090565b5b80821115620004d7576000816000905550600101620004bd565b5090565b6000620004ea601f836200056d565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6200052881620005db565b82525050565b600060208201905081810360008301526200054981620004db565b9050919050565b60006020820190506200056760008301846200051d565b92915050565b600082825260208201905092915050565b60006200058b82620005db565b91506200059883620005db565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620005d057620005cf6200061b565b5b828201905092915050565b6000819050919050565b60006002820490506001821680620005fe57607f821691505b602082108114156200061557620006146200064a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612c7f80620006896000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d9374a6111610071578063d9374a61146104f7578063dd62ed3e14610515578063f2fde38b14610545578063ffa8226e14610561576101c4565b8063a457c2d71461047b578063a892c827146104ab578063a9059cbb146104c7576101c4565b80638da5cb5b116100d35780638da5cb5b1461040357806395d89b41146104215780639662676c1461043f5780639cf78a141461045d576101c4565b806370a08231146103ad578063715018a6146103dd57806379cc6790146103e7576101c4565b806340c10f19116101665780634e20a02c116101405780634e20a02c14610339578063521181d51461035757806354575af414610373578063570ca7351461038f576101c4565b806340c10f19146102cf57806342966c68146102ff5780634456eda21461031b576101c4565b806323b872dd116101a257806323b872dd1461023557806329605e7714610265578063313ce56714610281578063395093511461029f576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d161057f565b6040516101de919061272c565b60405180910390f35b61020160048036038101906101fc9190611ecd565b610611565b60405161020e9190612711565b60405180910390f35b61021f61062f565b60405161022c91906129ae565b60405180910390f35b61024f600480360381019061024a9190611e7e565b610639565b60405161025c9190612711565b60405180910390f35b61027f600480360381019061027a9190611dca565b61069f565b005b610289610727565b60405161029691906129c9565b60405180910390f35b6102b960048036038101906102b49190611ecd565b610730565b6040516102c69190612711565b60405180910390f35b6102e960048036038101906102e49190611ecd565b6107dc565b6040516102f69190612711565b60405180910390f35b61031960048036038101906103149190611f81565b61089f565b005b6103236108ab565b6040516103309190612711565b60405180910390f35b61034161090a565b60405161034e91906129ae565b60405180910390f35b610371600480360381019061036c9190611e2f565b610918565b005b61038d60048036038101906103889190611f32565b610b9a565b005b610397610cbd565b6040516103a491906126cd565b60405180910390f35b6103c760048036038101906103c29190611dca565b610ce7565b6040516103d491906129ae565b60405180910390f35b6103e5610d2f565b005b61040160048036038101906103fc9190611ecd565b610db7565b005b61040b610e55565b60405161041891906126cd565b60405180910390f35b610429610e7f565b604051610436919061272c565b60405180910390f35b610447610f11565b6040516104549190612711565b60405180910390f35b610465610f24565b60405161047291906129ae565b60405180910390f35b61049560048036038101906104909190611ecd565b610f29565b6040516104a29190612711565b60405180910390f35b6104c560048036038101906104c09190611dca565b611014565b005b6104e160048036038101906104dc9190611ecd565b611158565b6040516104ee9190612711565b60405180910390f35b6104ff611176565b60405161050c91906126cd565b60405180910390f35b61052f600480360381019061052a9190611df3565b61119c565b60405161053c91906129ae565b60405180910390f35b61055f600480360381019061055a9190611dca565b611223565b005b61056961131b565b60405161057691906129ae565b60405180910390f35b60606003805461058e90612b24565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba90612b24565b80156106075780601f106105dc57610100808354040283529160200191610607565b820191906000526020600020905b8154815290600101906020018083116105ea57829003601f168201915b5050505050905090565b600061062561061e611328565b8484611330565b6001905092915050565b6000600254905090565b60006106468484846114fb565b61069484610652611328565b61068f85604051806060016040528060288152602001612c22602891396106808a61067b611328565b61119c565b61177c9092919063ffffffff16565b611330565b600190509392505050565b6106a7611328565b73ffffffffffffffffffffffffffffffffffffffff166106c5610e55565b73ffffffffffffffffffffffffffffffffffffffff161461071b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107129061282e565b60405180910390fd5b610724816117d1565b50565b60006012905090565b60006107d261073d611328565b84846001600061074b611328565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107cd9190612a00565b611330565b6001905092915050565b60003373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461086e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108659061286e565b60405180910390fd5b600061087984610ce7565b905061088584846118e0565b600061089085610ce7565b90508181119250505092915050565b6108a881611a40565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108ee611328565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b69021e19e0c9bab240000081565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061286e565b60405180910390fd5b600660149054906101000a900460ff16156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef9061276e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f9061294e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf9061292e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f9061288e565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550610b778369021e19e0c9bab24000006118e0565b610b828260006118e0565b610b9581683635c9adc5dea000006118e0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c219061286e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401610c659291906126e8565b602060405180830381600087803b158015610c7f57600080fd5b505af1158015610c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb79190611f09565b50505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d37611328565b73ffffffffffffffffffffffffffffffffffffffff16610d55610e55565b73ffffffffffffffffffffffffffffffffffffffff1614610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da29061282e565b60405180910390fd5b610db56000611a54565b565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3e9061286e565b60405180910390fd5b610e518282611b1a565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e8e90612b24565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90612b24565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b600660149054906101000a900460ff1681565b600081565b60008060016000610f38611328565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec9061296e565b60405180910390fd5b611009611000611328565b85858403611330565b600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b9061286e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906128ce565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061116c611165611328565b84846114fb565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61122b611328565b73ffffffffffffffffffffffffffffffffffffffff16611249610e55565b73ffffffffffffffffffffffffffffffffffffffff161461129f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112969061282e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611306906127ae565b60405180910390fd5b61131881611a54565b50565b683635c9adc5dea0000081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113979061290e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611410576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611407906127ce565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114ee91906129ae565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561156b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611562906128ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d29061274e565b60405180910390fd5b6115e6838383611b95565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611663906127ee565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116ff9190612a00565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161176391906129ae565b60405180910390a3611776848484611b9a565b50505050565b60008383111582906117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb919061272c565b60405180910390fd5b5082840390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611841576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118389061280e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119479061298e565b60405180910390fd5b61195c60008383611b95565b806002600082825461196e9190612a00565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c39190612a00565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a2891906129ae565b60405180910390a3611a3c60008383611b9a565b5050565b611a51611a4b611328565b82611b9f565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611b2d83611b28611328565b61119c565b905081811015611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b699061284e565b60405180910390fd5b611b8683611b7e611328565b848403611330565b611b908383611b9f565b505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c06906128ae565b60405180910390fd5b611c1b82600083611b95565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c989061278e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611cf89190612a56565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d5d91906129ae565b60405180910390a3611d7183600084611b9a565b505050565b600081359050611d8581612bc5565b92915050565b600081519050611d9a81612bdc565b92915050565b600081359050611daf81612bf3565b92915050565b600081359050611dc481612c0a565b92915050565b600060208284031215611ddc57600080fd5b6000611dea84828501611d76565b91505092915050565b60008060408385031215611e0657600080fd5b6000611e1485828601611d76565b9250506020611e2585828601611d76565b9150509250929050565b600080600060608486031215611e4457600080fd5b6000611e5286828701611d76565b9350506020611e6386828701611d76565b9250506040611e7486828701611d76565b9150509250925092565b600080600060608486031215611e9357600080fd5b6000611ea186828701611d76565b9350506020611eb286828701611d76565b9250506040611ec386828701611db5565b9150509250925092565b60008060408385031215611ee057600080fd5b6000611eee85828601611d76565b9250506020611eff85828601611db5565b9150509250929050565b600060208284031215611f1b57600080fd5b6000611f2984828501611d8b565b91505092915050565b600080600060608486031215611f4757600080fd5b6000611f5586828701611da0565b9350506020611f6686828701611db5565b9250506040611f7786828701611d76565b9150509250925092565b600060208284031215611f9357600080fd5b6000611fa184828501611db5565b91505092915050565b611fb381612a8a565b82525050565b611fc281612a9c565b82525050565b6000611fd3826129e4565b611fdd81856129ef565b9350611fed818560208601612af1565b611ff681612bb4565b840191505092915050565b600061200e6023836129ef565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006120746018836129ef565b91507f6f6e6c792063616e2064697374726962757465206f6e636500000000000000006000830152602082019050919050565b60006120b46022836129ef565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061211a6026836129ef565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121806022836129ef565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121e66026836129ef565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061224c602d836129ef565b91507f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260008301527f206e6577206f70657261746f72000000000000000000000000000000000000006020830152604082019050919050565b60006122b26020836129ef565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006122f26024836129ef565b91507f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123586024836129ef565b91507f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260008301527f61746f72000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123be600f836129ef565b91507f215f61697264726f7057616c6c657400000000000000000000000000000000006000830152602082019050919050565b60006123fe6021836129ef565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124646022836129ef565b91507f6f7261636c6520616464726573732063616e6e6f74206265203020616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124ca6025836129ef565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006125306024836129ef565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612596600b836129ef565b91507f215f637265616d506f6f6c0000000000000000000000000000000000000000006000830152602082019050919050565b60006125d6600d836129ef565b91507f215f67656e65736973506f6f6c000000000000000000000000000000000000006000830152602082019050919050565b60006126166025836129ef565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061267c601f836129ef565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6126b881612ada565b82525050565b6126c781612ae4565b82525050565b60006020820190506126e26000830184611faa565b92915050565b60006040820190506126fd6000830185611faa565b61270a60208301846126af565b9392505050565b60006020820190506127266000830184611fb9565b92915050565b600060208201905081810360008301526127468184611fc8565b905092915050565b6000602082019050818103600083015261276781612001565b9050919050565b6000602082019050818103600083015261278781612067565b9050919050565b600060208201905081810360008301526127a7816120a7565b9050919050565b600060208201905081810360008301526127c78161210d565b9050919050565b600060208201905081810360008301526127e781612173565b9050919050565b60006020820190508181036000830152612807816121d9565b9050919050565b600060208201905081810360008301526128278161223f565b9050919050565b60006020820190508181036000830152612847816122a5565b9050919050565b60006020820190508181036000830152612867816122e5565b9050919050565b600060208201905081810360008301526128878161234b565b9050919050565b600060208201905081810360008301526128a7816123b1565b9050919050565b600060208201905081810360008301526128c7816123f1565b9050919050565b600060208201905081810360008301526128e781612457565b9050919050565b60006020820190508181036000830152612907816124bd565b9050919050565b6000602082019050818103600083015261292781612523565b9050919050565b6000602082019050818103600083015261294781612589565b9050919050565b60006020820190508181036000830152612967816125c9565b9050919050565b6000602082019050818103600083015261298781612609565b9050919050565b600060208201905081810360008301526129a78161266f565b9050919050565b60006020820190506129c360008301846126af565b92915050565b60006020820190506129de60008301846126be565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612a0b82612ada565b9150612a1683612ada565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a4b57612a4a612b56565b5b828201905092915050565b6000612a6182612ada565b9150612a6c83612ada565b925082821015612a7f57612a7e612b56565b5b828203905092915050565b6000612a9582612aba565b9050919050565b60008115159050919050565b6000612ab382612a8a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612b0f578082015181840152602081019050612af4565b83811115612b1e576000848401525b50505050565b60006002820490506001821680612b3c57607f821691505b60208210811415612b5057612b4f612b85565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612bce81612a8a565b8114612bd957600080fd5b50565b612be581612a9c565b8114612bf057600080fd5b50565b612bfc81612aa8565b8114612c0757600080fd5b50565b612c1381612ada565b8114612c1e57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212204eca9bd44414f4a50ef7153626241001a3f1b1d549a1d126a00010fb1434d69b64736f6c63430008000033

Deployed ByteCode Sourcemap

45549:3677:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24467:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26634:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25587:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47855:444;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18281:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25429:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28186:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47264:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47594:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18173:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45726:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48379:649;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49036:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17908:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25758:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16702:103;;;:::i;:::-;;47685:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16051:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24686:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46126:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45877:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28904:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46799:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26098:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46176:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26336:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16960:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45990:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24467:100;24521:13;24554:5;24547:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24467:100;:::o;26634:169::-;26717:4;26734:39;26743:12;:10;:12::i;:::-;26757:7;26766:6;26734:8;:39::i;:::-;26791:4;26784:11;;26634:169;;;;:::o;25587:108::-;25648:7;25675:12;;25668:19;;25587:108;:::o;47855:444::-;47987:4;48004:36;48014:6;48022:9;48033:6;48004:9;:36::i;:::-;48051:218;48074:6;48095:12;:10;:12::i;:::-;48122:136;48176:6;48122:136;;;;;;;;;;;;;;;;;:31;48132:6;48140:12;:10;:12::i;:::-;48122:9;:31::i;:::-;:35;;:136;;;;;:::i;:::-;48051:8;:218::i;:::-;48287:4;48280:11;;47855:444;;;;;:::o;18281:115::-;16282:12;:10;:12::i;:::-;16271:23;;:7;:5;:7::i;:::-;:23;;;16263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18357:31:::1;18375:12;18357:17;:31::i;:::-;18281:115:::0;:::o;25429:93::-;25487:5;25512:2;25505:9;;25429:93;:::o;28186:215::-;28274:4;28291:80;28300:12;:10;:12::i;:::-;28314:7;28360:10;28323:11;:25;28335:12;:10;:12::i;:::-;28323:25;;;;;;;;;;;;;;;:34;28349:7;28323:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;28291:8;:80::i;:::-;28389:4;28382:11;;28186:215;;;;:::o;47264:322::-;47371:4;18071:10;18058:23;;:9;;;;;;;;;;;:23;;;18036:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;47393:21:::1;47417;47427:10;47417:9;:21::i;:::-;47393:45;;47449:26;47455:10;47467:7;47449:5;:26::i;:::-;47486:20;47509:21;47519:10;47509:9;:21::i;:::-;47486:44;;47565:13;47550:12;:28;47543:35;;;;47264:322:::0;;;;:::o;47594:83::-;47651:18;47662:6;47651:10;:18::i;:::-;47594:83;:::o;18173:100::-;18216:4;18256:9;;;;;;;;;;;18240:25;;:12;:10;:12::i;:::-;:25;;;18233:32;;18173:100;:::o;45726:71::-;45786:11;45726:71;:::o;48379:649::-;18071:10;18058:23;;:9;;;;;;;;;;;:23;;;18036:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;48547:21:::1;;;;;;;;;;;48546:22;48538:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;48640:1;48616:26;;:12;:26;;;;48608:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48701:1;48679:24;;:10;:24;;;;48671:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48764:1;48738:28;;:14;:28;;;;48730:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48821:4;48797:21;;:28;;;;;;;;;;;;;;;;;;48836:54;48842:12;45786:11;48836:5;:54::i;:::-;48901:50;48907:10;45935:7;48901:5;:50::i;:::-;48962:58;48968:14;46052:10;48962:5;:58::i;:::-;48379:649:::0;;;:::o;49036:187::-;18071:10;18058:23;;:9;;;;;;;;;;;:23;;;18036:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49186:6:::1;:15;;;49202:3;49207:7;49186:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49036:187:::0;;;:::o;17908:85::-;17949:7;17976:9;;;;;;;;;;;17969:16;;17908:85;:::o;25758:127::-;25832:7;25859:9;:18;25869:7;25859:18;;;;;;;;;;;;;;;;25852:25;;25758:127;;;:::o;16702:103::-;16282:12;:10;:12::i;:::-;16271:23;;:7;:5;:7::i;:::-;:23;;;16263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16767:30:::1;16794:1;16767:18;:30::i;:::-;16702:103::o:0;47685:162::-;18071:10;18058:23;;:9;;;;;;;;;;;:23;;;18036:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;47808:31:::1;47823:7;47832:6;47808:14;:31::i;:::-;47685:162:::0;;:::o;16051:87::-;16097:7;16124:6;;;;;;;;;;;16117:13;;16051:87;:::o;24686:104::-;24742:13;24775:7;24768:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24686:104;:::o;46126:41::-;;;;;;;;;;;;;:::o;45877:65::-;45935:7;45877:65;:::o;28904:413::-;28997:4;29014:24;29041:11;:25;29053:12;:10;:12::i;:::-;29041:25;;;;;;;;;;;;;;;:34;29067:7;29041:34;;;;;;;;;;;;;;;;29014:61;;29114:15;29094:16;:35;;29086:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29207:67;29216:12;:10;:12::i;:::-;29230:7;29258:15;29239:16;:34;29207:8;:67::i;:::-;29305:4;29298:11;;;28904:413;;;;:::o;46799:232::-;18071:10;18058:23;;:9;;;;;;;;;;;:23;;;18036:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;46922:1:::1;46898:26;;:12;:26;;;;46876:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47011:12;46997:11;;:26;;;;;;;;;;;;;;;;;;46799:232:::0;:::o;26098:175::-;26184:4;26201:42;26211:12;:10;:12::i;:::-;26225:9;26236:6;26201:9;:42::i;:::-;26261:4;26254:11;;26098:175;;;;:::o;46176:26::-;;;;;;;;;;;;;:::o;26336:151::-;26425:7;26452:11;:18;26464:5;26452:18;;;;;;;;;;;;;;;:27;26471:7;26452:27;;;;;;;;;;;;;;;;26445:34;;26336:151;;;;:::o;16960:201::-;16282:12;:10;:12::i;:::-;16271:23;;:7;:5;:7::i;:::-;:23;;;16263:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17069:1:::1;17049:22;;:8;:22;;;;17041:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17125:28;17144:8;17125:18;:28::i;:::-;16960:201:::0;:::o;45990:72::-;46052:10;45990:72;:::o;14775:98::-;14828:7;14855:10;14848:17;;14775:98;:::o;32588:380::-;32741:1;32724:19;;:5;:19;;;;32716:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32822:1;32803:21;;:7;:21;;;;32795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32906:6;32876:11;:18;32888:5;32876:18;;;;;;;;;;;;;;;:27;32895:7;32876:27;;;;;;;;;;;;;;;:36;;;;32944:7;32928:32;;32937:5;32928:32;;;32953:6;32928:32;;;;;;:::i;:::-;;;;;;;;32588:380;;;:::o;29807:733::-;29965:1;29947:20;;:6;:20;;;;29939:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30049:1;30028:23;;:9;:23;;;;30020:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30104:47;30125:6;30133:9;30144:6;30104:20;:47::i;:::-;30164:21;30188:9;:17;30198:6;30188:17;;;;;;;;;;;;;;;;30164:41;;30241:6;30224:13;:23;;30216:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30362:6;30346:13;:22;30326:9;:17;30336:6;30326:17;;;;;;;;;;;;;;;:42;;;;30414:6;30390:9;:20;30400:9;30390:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;30455:9;30438:35;;30447:6;30438:35;;;30466:6;30438:35;;;;;;:::i;:::-;;;;;;;;30486:46;30506:6;30514:9;30525:6;30486:19;:46::i;:::-;29807:733;;;;:::o;10928:240::-;11048:7;11106:1;11101;:6;;11109:12;11093:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11148:1;11144;:5;11137:12;;10928:240;;;;;:::o;18404:294::-;18519:1;18495:26;;:12;:26;;;;18473:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;18642:12;18610:45;;18638:1;18610:45;;;;;;;;;;;;18678:12;18666:9;;:24;;;;;;;;;;;;;;;;;;18404:294;:::o;30827:399::-;30930:1;30911:21;;:7;:21;;;;30903:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30981:49;31010:1;31014:7;31023:6;30981:20;:49::i;:::-;31059:6;31043:12;;:22;;;;;;;:::i;:::-;;;;;;;;31098:6;31076:9;:18;31086:7;31076:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;31141:7;31120:37;;31137:1;31120:37;;;31150:6;31120:37;;;;;;:::i;:::-;;;;;;;;31170:48;31198:1;31202:7;31211:6;31170:19;:48::i;:::-;30827:399;;:::o;34996:91::-;35052:27;35058:12;:10;:12::i;:::-;35072:6;35052:5;:27::i;:::-;34996:91;:::o;17321:191::-;17395:16;17414:6;;;;;;;;;;;17395:25;;17440:8;17431:6;;:17;;;;;;;;;;;;;;;;;;17495:8;17464:40;;17485:8;17464:40;;;;;;;;;;;;17321:191;;:::o;35406:368::-;35483:24;35510:32;35520:7;35529:12;:10;:12::i;:::-;35510:9;:32::i;:::-;35483:59;;35581:6;35561:16;:26;;35553:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35664:58;35673:7;35682:12;:10;:12::i;:::-;35715:6;35696:16;:25;35664:8;:58::i;:::-;35744:22;35750:7;35759:6;35744:5;:22::i;:::-;35406:368;;;:::o;33568:125::-;;;;:::o;34297:124::-;;;;:::o;31559:591::-;31662:1;31643:21;;:7;:21;;;;31635:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31715:49;31736:7;31753:1;31757:6;31715:20;:49::i;:::-;31777:22;31802:9;:18;31812:7;31802:18;;;;;;;;;;;;;;;;31777:43;;31857:6;31839:14;:24;;31831:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31976:6;31959:14;:23;31938:9;:18;31948:7;31938:18;;;;;;;;;;;;;;;:44;;;;32020:6;32004:12;;:22;;;;;;;:::i;:::-;;;;;;;;32070:1;32044:37;;32053:7;32044:37;;;32074:6;32044:37;;;;;;:::i;:::-;;;;;;;;32094:48;32114:7;32131:1;32135:6;32094:19;:48::i;:::-;31559:591;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:167::-;;393:6;380:20;371:29;;409:47;450:5;409:47;:::i;:::-;361:101;;;;:::o;468:139::-;;552:6;539:20;530:29;;568:33;595:5;568:33;:::i;:::-;520:87;;;;:::o;613:262::-;;721:2;709:9;700:7;696:23;692:32;689:2;;;737:1;734;727:12;689:2;780:1;805:53;850:7;841:6;830:9;826:22;805:53;:::i;:::-;795:63;;751:117;679:196;;;;:::o;881:407::-;;;1006:2;994:9;985:7;981:23;977:32;974:2;;;1022:1;1019;1012:12;974:2;1065:1;1090:53;1135:7;1126:6;1115:9;1111:22;1090:53;:::i;:::-;1080:63;;1036:117;1192:2;1218:53;1263:7;1254:6;1243:9;1239:22;1218:53;:::i;:::-;1208:63;;1163:118;964:324;;;;;:::o;1294:552::-;;;;1436:2;1424:9;1415:7;1411:23;1407:32;1404:2;;;1452:1;1449;1442:12;1404:2;1495:1;1520:53;1565:7;1556:6;1545:9;1541:22;1520:53;:::i;:::-;1510:63;;1466:117;1622:2;1648:53;1693:7;1684:6;1673:9;1669:22;1648:53;:::i;:::-;1638:63;;1593:118;1750:2;1776:53;1821:7;1812:6;1801:9;1797:22;1776:53;:::i;:::-;1766:63;;1721:118;1394:452;;;;;:::o;1852:552::-;;;;1994:2;1982:9;1973:7;1969:23;1965:32;1962:2;;;2010:1;2007;2000:12;1962:2;2053:1;2078:53;2123:7;2114:6;2103:9;2099:22;2078:53;:::i;:::-;2068:63;;2024:117;2180:2;2206:53;2251:7;2242:6;2231:9;2227:22;2206:53;:::i;:::-;2196:63;;2151:118;2308:2;2334:53;2379:7;2370:6;2359:9;2355:22;2334:53;:::i;:::-;2324:63;;2279:118;1952:452;;;;;:::o;2410:407::-;;;2535:2;2523:9;2514:7;2510:23;2506:32;2503:2;;;2551:1;2548;2541:12;2503:2;2594:1;2619:53;2664:7;2655:6;2644:9;2640:22;2619:53;:::i;:::-;2609:63;;2565:117;2721:2;2747:53;2792:7;2783:6;2772:9;2768:22;2747:53;:::i;:::-;2737:63;;2692:118;2493:324;;;;;:::o;2823:278::-;;2939:2;2927:9;2918:7;2914:23;2910:32;2907:2;;;2955:1;2952;2945:12;2907:2;2998:1;3023:61;3076:7;3067:6;3056:9;3052:22;3023:61;:::i;:::-;3013:71;;2969:125;2897:204;;;;:::o;3107:580::-;;;;3263:2;3251:9;3242:7;3238:23;3234:32;3231:2;;;3279:1;3276;3269:12;3231:2;3322:1;3347:67;3406:7;3397:6;3386:9;3382:22;3347:67;:::i;:::-;3337:77;;3293:131;3463:2;3489:53;3534:7;3525:6;3514:9;3510:22;3489:53;:::i;:::-;3479:63;;3434:118;3591:2;3617:53;3662:7;3653:6;3642:9;3638:22;3617:53;:::i;:::-;3607:63;;3562:118;3221:466;;;;;:::o;3693:262::-;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3759:196;;;;:::o;3961:118::-;4048:24;4066:5;4048:24;:::i;:::-;4043:3;4036:37;4026:53;;:::o;4085:109::-;4166:21;4181:5;4166:21;:::i;:::-;4161:3;4154:34;4144:50;;:::o;4200:364::-;;4316:39;4349:5;4316:39;:::i;:::-;4371:71;4435:6;4430:3;4371:71;:::i;:::-;4364:78;;4451:52;4496:6;4491:3;4484:4;4477:5;4473:16;4451:52;:::i;:::-;4528:29;4550:6;4528:29;:::i;:::-;4523:3;4519:39;4512:46;;4292:272;;;;;:::o;4570:367::-;;4733:67;4797:2;4792:3;4733:67;:::i;:::-;4726:74;;4830:34;4826:1;4821:3;4817:11;4810:55;4896:5;4891:2;4886:3;4882:12;4875:27;4928:2;4923:3;4919:12;4912:19;;4716:221;;;:::o;4943:322::-;;5106:67;5170:2;5165:3;5106:67;:::i;:::-;5099:74;;5203:26;5199:1;5194:3;5190:11;5183:47;5256:2;5251:3;5247:12;5240:19;;5089:176;;;:::o;5271:366::-;;5434:67;5498:2;5493:3;5434:67;:::i;:::-;5427:74;;5531:34;5527:1;5522:3;5518:11;5511:55;5597:4;5592:2;5587:3;5583:12;5576:26;5628:2;5623:3;5619:12;5612:19;;5417:220;;;:::o;5643:370::-;;5806:67;5870:2;5865:3;5806:67;:::i;:::-;5799:74;;5903:34;5899:1;5894:3;5890:11;5883:55;5969:8;5964:2;5959:3;5955:12;5948:30;6004:2;5999:3;5995:12;5988:19;;5789:224;;;:::o;6019:366::-;;6182:67;6246:2;6241:3;6182:67;:::i;:::-;6175:74;;6279:34;6275:1;6270:3;6266:11;6259:55;6345:4;6340:2;6335:3;6331:12;6324:26;6376:2;6371:3;6367:12;6360:19;;6165:220;;;:::o;6391:370::-;;6554:67;6618:2;6613:3;6554:67;:::i;:::-;6547:74;;6651:34;6647:1;6642:3;6638:11;6631:55;6717:8;6712:2;6707:3;6703:12;6696:30;6752:2;6747:3;6743:12;6736:19;;6537:224;;;:::o;6767:377::-;;6930:67;6994:2;6989:3;6930:67;:::i;:::-;6923:74;;7027:34;7023:1;7018:3;7014:11;7007:55;7093:15;7088:2;7083:3;7079:12;7072:37;7135:2;7130:3;7126:12;7119:19;;6913:231;;;:::o;7150:330::-;;7313:67;7377:2;7372:3;7313:67;:::i;:::-;7306:74;;7410:34;7406:1;7401:3;7397:11;7390:55;7471:2;7466:3;7462:12;7455:19;;7296:184;;;:::o;7486:368::-;;7649:67;7713:2;7708:3;7649:67;:::i;:::-;7642:74;;7746:34;7742:1;7737:3;7733:11;7726:55;7812:6;7807:2;7802:3;7798:12;7791:28;7845:2;7840:3;7836:12;7829:19;;7632:222;;;:::o;7860:368::-;;8023:67;8087:2;8082:3;8023:67;:::i;:::-;8016:74;;8120:34;8116:1;8111:3;8107:11;8100:55;8186:6;8181:2;8176:3;8172:12;8165:28;8219:2;8214:3;8210:12;8203:19;;8006:222;;;:::o;8234:313::-;;8397:67;8461:2;8456:3;8397:67;:::i;:::-;8390:74;;8494:17;8490:1;8485:3;8481:11;8474:38;8538:2;8533:3;8529:12;8522:19;;8380:167;;;:::o;8553:365::-;;8716:67;8780:2;8775:3;8716:67;:::i;:::-;8709:74;;8813:34;8809:1;8804:3;8800:11;8793:55;8879:3;8874:2;8869:3;8865:12;8858:25;8909:2;8904:3;8900:12;8893:19;;8699:219;;;:::o;8924:366::-;;9087:67;9151:2;9146:3;9087:67;:::i;:::-;9080:74;;9184:34;9180:1;9175:3;9171:11;9164:55;9250:4;9245:2;9240:3;9236:12;9229:26;9281:2;9276:3;9272:12;9265:19;;9070:220;;;:::o;9296:369::-;;9459:67;9523:2;9518:3;9459:67;:::i;:::-;9452:74;;9556:34;9552:1;9547:3;9543:11;9536:55;9622:7;9617:2;9612:3;9608:12;9601:29;9656:2;9651:3;9647:12;9640:19;;9442:223;;;:::o;9671:368::-;;9834:67;9898:2;9893:3;9834:67;:::i;:::-;9827:74;;9931:34;9927:1;9922:3;9918:11;9911:55;9997:6;9992:2;9987:3;9983:12;9976:28;10030:2;10025:3;10021:12;10014:19;;9817:222;;;:::o;10045:309::-;;10208:67;10272:2;10267:3;10208:67;:::i;:::-;10201:74;;10305:13;10301:1;10296:3;10292:11;10285:34;10345:2;10340:3;10336:12;10329:19;;10191:163;;;:::o;10360:311::-;;10523:67;10587:2;10582:3;10523:67;:::i;:::-;10516:74;;10620:15;10616:1;10611:3;10607:11;10600:36;10662:2;10657:3;10653:12;10646:19;;10506:165;;;:::o;10677:369::-;;10840:67;10904:2;10899:3;10840:67;:::i;:::-;10833:74;;10937:34;10933:1;10928:3;10924:11;10917:55;11003:7;10998:2;10993:3;10989:12;10982:29;11037:2;11032:3;11028:12;11021:19;;10823:223;;;:::o;11052:329::-;;11215:67;11279:2;11274:3;11215:67;:::i;:::-;11208:74;;11312:33;11308:1;11303:3;11299:11;11292:54;11372:2;11367:3;11363:12;11356:19;;11198:183;;;:::o;11387:118::-;11474:24;11492:5;11474:24;:::i;:::-;11469:3;11462:37;11452:53;;:::o;11511:112::-;11594:22;11610:5;11594:22;:::i;:::-;11589:3;11582:35;11572:51;;:::o;11629:222::-;;11760:2;11749:9;11745:18;11737:26;;11773:71;11841:1;11830:9;11826:17;11817:6;11773:71;:::i;:::-;11727:124;;;;:::o;11857:332::-;;12016:2;12005:9;12001:18;11993:26;;12029:71;12097:1;12086:9;12082:17;12073:6;12029:71;:::i;:::-;12110:72;12178:2;12167:9;12163:18;12154:6;12110:72;:::i;:::-;11983:206;;;;;:::o;12195:210::-;;12320:2;12309:9;12305:18;12297:26;;12333:65;12395:1;12384:9;12380:17;12371:6;12333:65;:::i;:::-;12287:118;;;;:::o;12411:313::-;;12562:2;12551:9;12547:18;12539:26;;12611:9;12605:4;12601:20;12597:1;12586:9;12582:17;12575:47;12639:78;12712:4;12703:6;12639:78;:::i;:::-;12631:86;;12529:195;;;;:::o;12730:419::-;;12934:2;12923:9;12919:18;12911:26;;12983:9;12977:4;12973:20;12969:1;12958:9;12954:17;12947:47;13011:131;13137:4;13011:131;:::i;:::-;13003:139;;12901:248;;;:::o;13155:419::-;;13359:2;13348:9;13344:18;13336:26;;13408:9;13402:4;13398:20;13394:1;13383:9;13379:17;13372:47;13436:131;13562:4;13436:131;:::i;:::-;13428:139;;13326:248;;;:::o;13580:419::-;;13784:2;13773:9;13769:18;13761:26;;13833:9;13827:4;13823:20;13819:1;13808:9;13804:17;13797:47;13861:131;13987:4;13861:131;:::i;:::-;13853:139;;13751:248;;;:::o;14005:419::-;;14209:2;14198:9;14194:18;14186:26;;14258:9;14252:4;14248:20;14244:1;14233:9;14229:17;14222:47;14286:131;14412:4;14286:131;:::i;:::-;14278:139;;14176:248;;;:::o;14430:419::-;;14634:2;14623:9;14619:18;14611:26;;14683:9;14677:4;14673:20;14669:1;14658:9;14654:17;14647:47;14711:131;14837:4;14711:131;:::i;:::-;14703:139;;14601:248;;;:::o;14855:419::-;;15059:2;15048:9;15044:18;15036:26;;15108:9;15102:4;15098:20;15094:1;15083:9;15079:17;15072:47;15136:131;15262:4;15136:131;:::i;:::-;15128:139;;15026:248;;;:::o;15280:419::-;;15484:2;15473:9;15469:18;15461:26;;15533:9;15527:4;15523:20;15519:1;15508:9;15504:17;15497:47;15561:131;15687:4;15561:131;:::i;:::-;15553:139;;15451:248;;;:::o;15705:419::-;;15909:2;15898:9;15894:18;15886:26;;15958:9;15952:4;15948:20;15944:1;15933:9;15929:17;15922:47;15986:131;16112:4;15986:131;:::i;:::-;15978:139;;15876:248;;;:::o;16130:419::-;;16334:2;16323:9;16319:18;16311:26;;16383:9;16377:4;16373:20;16369:1;16358:9;16354:17;16347:47;16411:131;16537:4;16411:131;:::i;:::-;16403:139;;16301:248;;;:::o;16555:419::-;;16759:2;16748:9;16744:18;16736:26;;16808:9;16802:4;16798:20;16794:1;16783:9;16779:17;16772:47;16836:131;16962:4;16836:131;:::i;:::-;16828:139;;16726:248;;;:::o;16980:419::-;;17184:2;17173:9;17169:18;17161:26;;17233:9;17227:4;17223:20;17219:1;17208:9;17204:17;17197:47;17261:131;17387:4;17261:131;:::i;:::-;17253:139;;17151:248;;;:::o;17405:419::-;;17609:2;17598:9;17594:18;17586:26;;17658:9;17652:4;17648:20;17644:1;17633:9;17629:17;17622:47;17686:131;17812:4;17686:131;:::i;:::-;17678:139;;17576:248;;;:::o;17830:419::-;;18034:2;18023:9;18019:18;18011:26;;18083:9;18077:4;18073:20;18069:1;18058:9;18054:17;18047:47;18111:131;18237:4;18111:131;:::i;:::-;18103:139;;18001:248;;;:::o;18255:419::-;;18459:2;18448:9;18444:18;18436:26;;18508:9;18502:4;18498:20;18494:1;18483:9;18479:17;18472:47;18536:131;18662:4;18536:131;:::i;:::-;18528:139;;18426:248;;;:::o;18680:419::-;;18884:2;18873:9;18869:18;18861:26;;18933:9;18927:4;18923:20;18919:1;18908:9;18904:17;18897:47;18961:131;19087:4;18961:131;:::i;:::-;18953:139;;18851:248;;;:::o;19105:419::-;;19309:2;19298:9;19294:18;19286:26;;19358:9;19352:4;19348:20;19344:1;19333:9;19329:17;19322:47;19386:131;19512:4;19386:131;:::i;:::-;19378:139;;19276:248;;;:::o;19530:419::-;;19734:2;19723:9;19719:18;19711:26;;19783:9;19777:4;19773:20;19769:1;19758:9;19754:17;19747:47;19811:131;19937:4;19811:131;:::i;:::-;19803:139;;19701:248;;;:::o;19955:419::-;;20159:2;20148:9;20144:18;20136:26;;20208:9;20202:4;20198:20;20194:1;20183:9;20179:17;20172:47;20236:131;20362:4;20236:131;:::i;:::-;20228:139;;20126:248;;;:::o;20380:419::-;;20584:2;20573:9;20569:18;20561:26;;20633:9;20627:4;20623:20;20619:1;20608:9;20604:17;20597:47;20661:131;20787:4;20661:131;:::i;:::-;20653:139;;20551:248;;;:::o;20805:222::-;;20936:2;20925:9;20921:18;20913:26;;20949:71;21017:1;21006:9;21002:17;20993:6;20949:71;:::i;:::-;20903:124;;;;:::o;21033:214::-;;21160:2;21149:9;21145:18;21137:26;;21173:67;21237:1;21226:9;21222:17;21213:6;21173:67;:::i;:::-;21127:120;;;;:::o;21253:99::-;;21339:5;21333:12;21323:22;;21312:40;;;:::o;21358:169::-;;21476:6;21471:3;21464:19;21516:4;21511:3;21507:14;21492:29;;21454:73;;;;:::o;21533:305::-;;21592:20;21610:1;21592:20;:::i;:::-;21587:25;;21626:20;21644:1;21626:20;:::i;:::-;21621:25;;21780:1;21712:66;21708:74;21705:1;21702:81;21699:2;;;21786:18;;:::i;:::-;21699:2;21830:1;21827;21823:9;21816:16;;21577:261;;;;:::o;21844:191::-;;21904:20;21922:1;21904:20;:::i;:::-;21899:25;;21938:20;21956:1;21938:20;:::i;:::-;21933:25;;21977:1;21974;21971:8;21968:2;;;21982:18;;:::i;:::-;21968:2;22027:1;22024;22020:9;22012:17;;21889:146;;;;:::o;22041:96::-;;22107:24;22125:5;22107:24;:::i;:::-;22096:35;;22086:51;;;:::o;22143:90::-;;22220:5;22213:13;22206:21;22195:32;;22185:48;;;:::o;22239:110::-;;22319:24;22337:5;22319:24;:::i;:::-;22308:35;;22298:51;;;:::o;22355:126::-;;22432:42;22425:5;22421:54;22410:65;;22400:81;;;:::o;22487:77::-;;22553:5;22542:16;;22532:32;;;:::o;22570:86::-;;22645:4;22638:5;22634:16;22623:27;;22613:43;;;:::o;22662:307::-;22730:1;22740:113;22754:6;22751:1;22748:13;22740:113;;;22839:1;22834:3;22830:11;22824:18;22820:1;22815:3;22811:11;22804:39;22776:2;22773:1;22769:10;22764:15;;22740:113;;;22871:6;22868:1;22865:13;22862:2;;;22951:1;22942:6;22937:3;22933:16;22926:27;22862:2;22711:258;;;;:::o;22975:320::-;;23056:1;23050:4;23046:12;23036:22;;23103:1;23097:4;23093:12;23124:18;23114:2;;23180:4;23172:6;23168:17;23158:27;;23114:2;23242;23234:6;23231:14;23211:18;23208:38;23205:2;;;23261:18;;:::i;:::-;23205:2;23026:269;;;;:::o;23301:180::-;23349:77;23346:1;23339:88;23446:4;23443:1;23436:15;23470:4;23467:1;23460:15;23487:180;23535:77;23532:1;23525:88;23632:4;23629:1;23622:15;23656:4;23653:1;23646:15;23673:102;;23765:2;23761:7;23756:2;23749:5;23745:14;23741:28;23731:38;;23721:54;;;:::o;23781:122::-;23854:24;23872:5;23854:24;:::i;:::-;23847:5;23844:35;23834:2;;23893:1;23890;23883:12;23834:2;23824:79;:::o;23909:116::-;23979:21;23994:5;23979:21;:::i;:::-;23972:5;23969:32;23959:2;;24015:1;24012;24005:12;23959:2;23949:76;:::o;24031:150::-;24118:38;24150:5;24118:38;:::i;:::-;24111:5;24108:49;24098:2;;24171:1;24168;24161:12;24098:2;24088:93;:::o;24187:122::-;24260:24;24278:5;24260:24;:::i;:::-;24253:5;24250:35;24240:2;;24299:1;24296;24289:12;24240:2;24230:79;:::o

Swarm Source

ipfs://4eca9bd44414f4a50ef7153626241001a3f1b1d549a1d126a00010fb1434d69b
Loading