ETH Price: $2,670.28 (+1.34%)

Token

Donuts (DONUT)
 

Overview

Max Total Supply

1,884,952.006944444444444215 DONUT

Holders

64

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,259.583333333333333333 DONUT

Value
$0.00
0xb0c8a6bacd0ebd96372f2676a09640c24885f5c6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DONUT_TOKEN

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-13
*/

// SPDX-License-Identifier: MIT

/*



*/

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}


// 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/utils/math/SafeMath.sol

// OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction 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/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/token/ERC20/ERC20.sol

// OpenZeppelin Contracts (last updated v4.6.0) (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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 (last updated v4.5.0) (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 {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}


// 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: contracts/donut_token.sol

pragma solidity ^0.8.0;

contract DONUT_TOKEN is ERC20, ERC20Burnable, Ownable {
  using SafeMath for uint256;

  mapping(address => uint256) private _balances;
  mapping(address => bool) controllers;

  uint256 private _totalSupply;
  uint256 constant MAX_SUPPLY = 100000000 * 10 ** 18;
  bool public mintEnabled = true;

  constructor() ERC20( "Donuts", "DONUT" ) {}

  // MINT
  function mint(address to, uint256 amount) external {
    require(mintEnabled, "Mint is paused!");
    require(controllers[msg.sender], "Only controllers can mint");
    require((_totalSupply + amount) <= MAX_SUPPLY, "Max supply has been reached.");

    _totalSupply = _totalSupply.add(amount);
    _balances[to] = _balances[to].add(amount);
    _mint(to, amount);
  }

  // MINT TO ADDRESS
  function mintToAddress(address to, uint256 amount) public onlyOwner {
    require(_totalSupply + amount <= MAX_SUPPLY, "Max supply has been reached.");

    _totalSupply = _totalSupply.add(amount);
    _balances[to] = _balances[to].add(amount);
    _mint(to, amount);
  }
  
  // MASS AIRDROP
  function massAirdrop(uint256 amount, address[] calldata _wallets) external onlyOwner {
    for (uint256 i = 0; i < _wallets.length; ++i) {
      require(_totalSupply + (amount * _wallets.length) <= MAX_SUPPLY, "Max supply exceeded!");
      _mint(_wallets[i], amount);
    }
  }

  // BURN
  function burnFrom(address account, uint256 amount) public override {
      if (controllers[msg.sender]) {
          _burn(account, amount);
      }
      else {
          super.burnFrom(account, amount);
      }
  }

  function addController(address controller) external onlyOwner {
    controllers[controller] = true;
  }

  function removeController(address controller) external onlyOwner {
    controllers[controller] = false;
  }
  
  function toggleMintState() external onlyOwner {
    mintEnabled = !mintEnabled;
  }

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

  function maxSupply() public pure returns (uint256) {
    return MAX_SUPPLY;
  }

}

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":"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":[{"internalType":"address","name":"controller","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","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":"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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"massAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600960006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600681526020017f446f6e75747300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f444f4e55540000000000000000000000000000000000000000000000000000008152508160039081620000aa91906200042d565b508060049081620000bc91906200042d565b505050620000df620000d3620000e560201b60201c565b620000ed60201b60201c565b62000514565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200023557607f821691505b6020821081036200024b576200024a620001ed565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000276565b620002c1868362000276565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200030e620003086200030284620002d9565b620002e3565b620002d9565b9050919050565b6000819050919050565b6200032a83620002ed565b62000342620003398262000315565b84845462000283565b825550505050565b600090565b620003596200034a565b620003668184846200031f565b505050565b5b818110156200038e57620003826000826200034f565b6001810190506200036c565b5050565b601f821115620003dd57620003a78162000251565b620003b28462000266565b81016020851015620003c2578190505b620003da620003d18562000266565b8301826200036b565b50505b505050565b600082821c905092915050565b60006200040260001984600802620003e2565b1980831691505092915050565b60006200041d8383620003ef565b9150826002028217905092915050565b6200043882620001b3565b67ffffffffffffffff811115620004545762000453620001be565b5b6200046082546200021c565b6200046d82828562000392565b600060209050601f831160018114620004a5576000841562000490578287015190505b6200049c85826200040f565b8655506200050c565b601f198416620004b58662000251565b60005b82811015620004df57848901518255600182019150602085019450602081019050620004b8565b86831015620004ff5784890151620004fb601f891682620003ef565b8355505b6001600288020188555050505b505050505050565b61281f80620005246000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806379cc6790116100c3578063a9059cbb1161007c578063a9059cbb1461039f578063d1239730146103cf578063d5abeb01146103ed578063dd62ed3e1461040b578063f2fde38b1461043b578063f6a74ed71461045757610158565b806379cc6790146102df5780638ba216b4146102fb5780638da5cb5b1461031757806395d89b4114610335578063a457c2d714610353578063a7fc7a071461038357610158565b80633950935111610115578063395093511461023357806340c10f191461026357806342966c681461027f578063510db75a1461029b57806370a08231146102a5578063715018a6146102d557610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806321ca4236146101c957806323b872dd146101e5578063313ce56714610215575b600080fd5b610165610473565b6040516101729190611ab0565b60405180910390f35b61019560048036038101906101909190611b70565b610505565b6040516101a29190611bcb565b60405180910390f35b6101b3610528565b6040516101c09190611bf5565b60405180910390f35b6101e360048036038101906101de9190611b70565b610532565b005b6101ff60048036038101906101fa9190611c10565b6106c7565b60405161020c9190611bcb565b60405180910390f35b61021d6106f6565b60405161022a9190611c7f565b60405180910390f35b61024d60048036038101906102489190611b70565b6106ff565b60405161025a9190611bcb565b60405180910390f35b61027d60048036038101906102789190611b70565b610736565b005b61029960048036038101906102949190611c9a565b61092a565b005b6102a361093e565b005b6102bf60048036038101906102ba9190611cc7565b6109e6565b6040516102cc9190611bf5565b60405180910390f35b6102dd610a2e565b005b6102f960048036038101906102f49190611b70565b610ab6565b005b61031560048036038101906103109190611d59565b610b26565b005b61031f610c61565b60405161032c9190611dc8565b60405180910390f35b61033d610c8b565b60405161034a9190611ab0565b60405180910390f35b61036d60048036038101906103689190611b70565b610d1d565b60405161037a9190611bcb565b60405180910390f35b61039d60048036038101906103989190611cc7565b610d94565b005b6103b960048036038101906103b49190611b70565b610e6b565b6040516103c69190611bcb565b60405180910390f35b6103d7610e8e565b6040516103e49190611bcb565b60405180910390f35b6103f5610ea1565b6040516104029190611bf5565b60405180910390f35b61042560048036038101906104209190611de3565b610eb4565b6040516104329190611bf5565b60405180910390f35b61045560048036038101906104509190611cc7565b610f3b565b005b610471600480360381019061046c9190611cc7565b611032565b005b60606003805461048290611e52565b80601f01602080910402602001604051908101604052809291908181526020018280546104ae90611e52565b80156104fb5780601f106104d0576101008083540402835291602001916104fb565b820191906000526020600020905b8154815290600101906020018083116104de57829003601f168201915b5050505050905090565b600080610510611109565b905061051d818585611111565b600191505092915050565b6000600854905090565b61053a611109565b73ffffffffffffffffffffffffffffffffffffffff16610558610c61565b73ffffffffffffffffffffffffffffffffffffffff16146105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a590611ecf565b60405180910390fd5b6a52b7d2dcc80cd2e4000000816008546105c89190611f1e565b1115610609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060090611f9e565b60405180910390fd5b61061e816008546112da90919063ffffffff16565b60088190555061067681600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112da90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506106c382826112f0565b5050565b6000806106d2611109565b90506106df85828561144f565b6106ea8585856114db565b60019150509392505050565b60006012905090565b60008061070a611109565b905061072b81858561071c8589610eb4565b6107269190611f1e565b611111565b600191505092915050565b600960009054906101000a900460ff16610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c9061200a565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612076565b60405180910390fd5b6a52b7d2dcc80cd2e40000008160085461082b9190611f1e565b111561086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086390611f9e565b60405180910390fd5b610881816008546112da90919063ffffffff16565b6008819055506108d981600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112da90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061092682826112f0565b5050565b61093b610935611109565b8261175a565b50565b610946611109565b73ffffffffffffffffffffffffffffffffffffffff16610964610c61565b73ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190611ecf565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a36611109565b73ffffffffffffffffffffffffffffffffffffffff16610a54610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190611ecf565b60405180910390fd5b610ab46000611930565b565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b1757610b12828261175a565b610b22565b610b2182826119f6565b5b5050565b610b2e611109565b73ffffffffffffffffffffffffffffffffffffffff16610b4c610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990611ecf565b60405180910390fd5b60005b82829050811015610c5b576a52b7d2dcc80cd2e40000008383905085610bcb9190612096565b600854610bd89190611f1e565b1115610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090612124565b60405180910390fd5b610c4a838383818110610c2f57610c2e612144565b5b9050602002016020810190610c449190611cc7565b856112f0565b80610c5490612173565b9050610ba5565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610c9a90611e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc690611e52565b8015610d135780601f10610ce857610100808354040283529160200191610d13565b820191906000526020600020905b815481529060010190602001808311610cf657829003601f168201915b5050505050905090565b600080610d28611109565b90506000610d368286610eb4565b905083811015610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061222d565b60405180910390fd5b610d888286868403611111565b60019250505092915050565b610d9c611109565b73ffffffffffffffffffffffffffffffffffffffff16610dba610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790611ecf565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080610e76611109565b9050610e838185856114db565b600191505092915050565b600960009054906101000a900460ff1681565b60006a52b7d2dcc80cd2e4000000905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f43611109565b73ffffffffffffffffffffffffffffffffffffffff16610f61610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90611ecf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906122bf565b60405180910390fd5b61102f81611930565b50565b61103a611109565b73ffffffffffffffffffffffffffffffffffffffff16611058610c61565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590611ecf565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790612351565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e6906123e3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112cd9190611bf5565b60405180910390a3505050565b600081836112e89190611f1e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061244f565b60405180910390fd5b61136b60008383611a16565b806002600082825461137d9190611f1e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113d29190611f1e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114379190611bf5565b60405180910390a361144b60008383611a1b565b5050565b600061145b8484610eb4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114d557818110156114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be906124bb565b60405180910390fd5b6114d48484848403611111565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361154a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115419061254d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b0906125df565b60405180910390fd5b6115c4838383611a16565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612671565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116dd9190611f1e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117419190611bf5565b60405180910390a3611754848484611a1b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090612703565b60405180910390fd5b6117d582600083611a16565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290612795565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118b291906127b5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119179190611bf5565b60405180910390a361192b83600084611a1b565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a0882611a02611109565b8361144f565b611a12828261175a565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a5a578082015181840152602081019050611a3f565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a8282611a20565b611a8c8185611a2b565b9350611a9c818560208601611a3c565b611aa581611a66565b840191505092915050565b60006020820190508181036000830152611aca8184611a77565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b0782611adc565b9050919050565b611b1781611afc565b8114611b2257600080fd5b50565b600081359050611b3481611b0e565b92915050565b6000819050919050565b611b4d81611b3a565b8114611b5857600080fd5b50565b600081359050611b6a81611b44565b92915050565b60008060408385031215611b8757611b86611ad2565b5b6000611b9585828601611b25565b9250506020611ba685828601611b5b565b9150509250929050565b60008115159050919050565b611bc581611bb0565b82525050565b6000602082019050611be06000830184611bbc565b92915050565b611bef81611b3a565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b600080600060608486031215611c2957611c28611ad2565b5b6000611c3786828701611b25565b9350506020611c4886828701611b25565b9250506040611c5986828701611b5b565b9150509250925092565b600060ff82169050919050565b611c7981611c63565b82525050565b6000602082019050611c946000830184611c70565b92915050565b600060208284031215611cb057611caf611ad2565b5b6000611cbe84828501611b5b565b91505092915050565b600060208284031215611cdd57611cdc611ad2565b5b6000611ceb84828501611b25565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611d1957611d18611cf4565b5b8235905067ffffffffffffffff811115611d3657611d35611cf9565b5b602083019150836020820283011115611d5257611d51611cfe565b5b9250929050565b600080600060408486031215611d7257611d71611ad2565b5b6000611d8086828701611b5b565b935050602084013567ffffffffffffffff811115611da157611da0611ad7565b5b611dad86828701611d03565b92509250509250925092565b611dc281611afc565b82525050565b6000602082019050611ddd6000830184611db9565b92915050565b60008060408385031215611dfa57611df9611ad2565b5b6000611e0885828601611b25565b9250506020611e1985828601611b25565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e6a57607f821691505b602082108103611e7d57611e7c611e23565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611eb9602083611a2b565b9150611ec482611e83565b602082019050919050565b60006020820190508181036000830152611ee881611eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f2982611b3a565b9150611f3483611b3a565b9250828201905080821115611f4c57611f4b611eef565b5b92915050565b7f4d617820737570706c7920686173206265656e20726561636865642e00000000600082015250565b6000611f88601c83611a2b565b9150611f9382611f52565b602082019050919050565b60006020820190508181036000830152611fb781611f7b565b9050919050565b7f4d696e7420697320706175736564210000000000000000000000000000000000600082015250565b6000611ff4600f83611a2b565b9150611fff82611fbe565b602082019050919050565b6000602082019050818103600083015261202381611fe7565b9050919050565b7f4f6e6c7920636f6e74726f6c6c6572732063616e206d696e7400000000000000600082015250565b6000612060601983611a2b565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b60006120a182611b3a565b91506120ac83611b3a565b92508282026120ba81611b3a565b915082820484148315176120d1576120d0611eef565b5b5092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061210e601483611a2b565b9150612119826120d8565b602082019050919050565b6000602082019050818103600083015261213d81612101565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061217e82611b3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121b0576121af611eef565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612217602583611a2b565b9150612222826121bb565b604082019050919050565b600060208201905081810360008301526122468161220a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006122a9602683611a2b565b91506122b48261224d565b604082019050919050565b600060208201905081810360008301526122d88161229c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061233b602483611a2b565b9150612346826122df565b604082019050919050565b6000602082019050818103600083015261236a8161232e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123cd602283611a2b565b91506123d882612371565b604082019050919050565b600060208201905081810360008301526123fc816123c0565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612439601f83611a2b565b915061244482612403565b602082019050919050565b600060208201905081810360008301526124688161242c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006124a5601d83611a2b565b91506124b08261246f565b602082019050919050565b600060208201905081810360008301526124d481612498565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612537602583611a2b565b9150612542826124db565b604082019050919050565b600060208201905081810360008301526125668161252a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006125c9602383611a2b565b91506125d48261256d565b604082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061265b602683611a2b565b9150612666826125ff565b604082019050919050565b6000602082019050818103600083015261268a8161264e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006126ed602183611a2b565b91506126f882612691565b604082019050919050565b6000602082019050818103600083015261271c816126e0565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061277f602283611a2b565b915061278a82612723565b604082019050919050565b600060208201905081810360008301526127ae81612772565b9050919050565b60006127c082611b3a565b91506127cb83611b3a565b92508282039050818111156127e3576127e2611eef565b5b9291505056fea2646970667358221220c0c3c59828c8675df7bd9b8855756c2f943e62c195ece542ced6f11defaf01d464736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379cc6790116100c3578063a9059cbb1161007c578063a9059cbb1461039f578063d1239730146103cf578063d5abeb01146103ed578063dd62ed3e1461040b578063f2fde38b1461043b578063f6a74ed71461045757610158565b806379cc6790146102df5780638ba216b4146102fb5780638da5cb5b1461031757806395d89b4114610335578063a457c2d714610353578063a7fc7a071461038357610158565b80633950935111610115578063395093511461023357806340c10f191461026357806342966c681461027f578063510db75a1461029b57806370a08231146102a5578063715018a6146102d557610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806321ca4236146101c957806323b872dd146101e5578063313ce56714610215575b600080fd5b610165610473565b6040516101729190611ab0565b60405180910390f35b61019560048036038101906101909190611b70565b610505565b6040516101a29190611bcb565b60405180910390f35b6101b3610528565b6040516101c09190611bf5565b60405180910390f35b6101e360048036038101906101de9190611b70565b610532565b005b6101ff60048036038101906101fa9190611c10565b6106c7565b60405161020c9190611bcb565b60405180910390f35b61021d6106f6565b60405161022a9190611c7f565b60405180910390f35b61024d60048036038101906102489190611b70565b6106ff565b60405161025a9190611bcb565b60405180910390f35b61027d60048036038101906102789190611b70565b610736565b005b61029960048036038101906102949190611c9a565b61092a565b005b6102a361093e565b005b6102bf60048036038101906102ba9190611cc7565b6109e6565b6040516102cc9190611bf5565b60405180910390f35b6102dd610a2e565b005b6102f960048036038101906102f49190611b70565b610ab6565b005b61031560048036038101906103109190611d59565b610b26565b005b61031f610c61565b60405161032c9190611dc8565b60405180910390f35b61033d610c8b565b60405161034a9190611ab0565b60405180910390f35b61036d60048036038101906103689190611b70565b610d1d565b60405161037a9190611bcb565b60405180910390f35b61039d60048036038101906103989190611cc7565b610d94565b005b6103b960048036038101906103b49190611b70565b610e6b565b6040516103c69190611bcb565b60405180910390f35b6103d7610e8e565b6040516103e49190611bcb565b60405180910390f35b6103f5610ea1565b6040516104029190611bf5565b60405180910390f35b61042560048036038101906104209190611de3565b610eb4565b6040516104329190611bf5565b60405180910390f35b61045560048036038101906104509190611cc7565b610f3b565b005b610471600480360381019061046c9190611cc7565b611032565b005b60606003805461048290611e52565b80601f01602080910402602001604051908101604052809291908181526020018280546104ae90611e52565b80156104fb5780601f106104d0576101008083540402835291602001916104fb565b820191906000526020600020905b8154815290600101906020018083116104de57829003601f168201915b5050505050905090565b600080610510611109565b905061051d818585611111565b600191505092915050565b6000600854905090565b61053a611109565b73ffffffffffffffffffffffffffffffffffffffff16610558610c61565b73ffffffffffffffffffffffffffffffffffffffff16146105ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a590611ecf565b60405180910390fd5b6a52b7d2dcc80cd2e4000000816008546105c89190611f1e565b1115610609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060090611f9e565b60405180910390fd5b61061e816008546112da90919063ffffffff16565b60088190555061067681600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112da90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506106c382826112f0565b5050565b6000806106d2611109565b90506106df85828561144f565b6106ea8585856114db565b60019150509392505050565b60006012905090565b60008061070a611109565b905061072b81858561071c8589610eb4565b6107269190611f1e565b611111565b600191505092915050565b600960009054906101000a900460ff16610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c9061200a565b60405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080890612076565b60405180910390fd5b6a52b7d2dcc80cd2e40000008160085461082b9190611f1e565b111561086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086390611f9e565b60405180910390fd5b610881816008546112da90919063ffffffff16565b6008819055506108d981600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112da90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061092682826112f0565b5050565b61093b610935611109565b8261175a565b50565b610946611109565b73ffffffffffffffffffffffffffffffffffffffff16610964610c61565b73ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190611ecf565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a36611109565b73ffffffffffffffffffffffffffffffffffffffff16610a54610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190611ecf565b60405180910390fd5b610ab46000611930565b565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b1757610b12828261175a565b610b22565b610b2182826119f6565b5b5050565b610b2e611109565b73ffffffffffffffffffffffffffffffffffffffff16610b4c610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990611ecf565b60405180910390fd5b60005b82829050811015610c5b576a52b7d2dcc80cd2e40000008383905085610bcb9190612096565b600854610bd89190611f1e565b1115610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090612124565b60405180910390fd5b610c4a838383818110610c2f57610c2e612144565b5b9050602002016020810190610c449190611cc7565b856112f0565b80610c5490612173565b9050610ba5565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610c9a90611e52565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc690611e52565b8015610d135780601f10610ce857610100808354040283529160200191610d13565b820191906000526020600020905b815481529060010190602001808311610cf657829003601f168201915b5050505050905090565b600080610d28611109565b90506000610d368286610eb4565b905083811015610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061222d565b60405180910390fd5b610d888286868403611111565b60019250505092915050565b610d9c611109565b73ffffffffffffffffffffffffffffffffffffffff16610dba610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790611ecf565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080610e76611109565b9050610e838185856114db565b600191505092915050565b600960009054906101000a900460ff1681565b60006a52b7d2dcc80cd2e4000000905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f43611109565b73ffffffffffffffffffffffffffffffffffffffff16610f61610c61565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90611ecf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906122bf565b60405180910390fd5b61102f81611930565b50565b61103a611109565b73ffffffffffffffffffffffffffffffffffffffff16611058610c61565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590611ecf565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790612351565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e6906123e3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112cd9190611bf5565b60405180910390a3505050565b600081836112e89190611f1e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061244f565b60405180910390fd5b61136b60008383611a16565b806002600082825461137d9190611f1e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113d29190611f1e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114379190611bf5565b60405180910390a361144b60008383611a1b565b5050565b600061145b8484610eb4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114d557818110156114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be906124bb565b60405180910390fd5b6114d48484848403611111565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361154a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115419061254d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b0906125df565b60405180910390fd5b6115c4838383611a16565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190612671565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116dd9190611f1e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117419190611bf5565b60405180910390a3611754848484611a1b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090612703565b60405180910390fd5b6117d582600083611a16565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290612795565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118b291906127b5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119179190611bf5565b60405180910390a361192b83600084611a1b565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a0882611a02611109565b8361144f565b611a12828261175a565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a5a578082015181840152602081019050611a3f565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a8282611a20565b611a8c8185611a2b565b9350611a9c818560208601611a3c565b611aa581611a66565b840191505092915050565b60006020820190508181036000830152611aca8184611a77565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b0782611adc565b9050919050565b611b1781611afc565b8114611b2257600080fd5b50565b600081359050611b3481611b0e565b92915050565b6000819050919050565b611b4d81611b3a565b8114611b5857600080fd5b50565b600081359050611b6a81611b44565b92915050565b60008060408385031215611b8757611b86611ad2565b5b6000611b9585828601611b25565b9250506020611ba685828601611b5b565b9150509250929050565b60008115159050919050565b611bc581611bb0565b82525050565b6000602082019050611be06000830184611bbc565b92915050565b611bef81611b3a565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b600080600060608486031215611c2957611c28611ad2565b5b6000611c3786828701611b25565b9350506020611c4886828701611b25565b9250506040611c5986828701611b5b565b9150509250925092565b600060ff82169050919050565b611c7981611c63565b82525050565b6000602082019050611c946000830184611c70565b92915050565b600060208284031215611cb057611caf611ad2565b5b6000611cbe84828501611b5b565b91505092915050565b600060208284031215611cdd57611cdc611ad2565b5b6000611ceb84828501611b25565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611d1957611d18611cf4565b5b8235905067ffffffffffffffff811115611d3657611d35611cf9565b5b602083019150836020820283011115611d5257611d51611cfe565b5b9250929050565b600080600060408486031215611d7257611d71611ad2565b5b6000611d8086828701611b5b565b935050602084013567ffffffffffffffff811115611da157611da0611ad7565b5b611dad86828701611d03565b92509250509250925092565b611dc281611afc565b82525050565b6000602082019050611ddd6000830184611db9565b92915050565b60008060408385031215611dfa57611df9611ad2565b5b6000611e0885828601611b25565b9250506020611e1985828601611b25565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e6a57607f821691505b602082108103611e7d57611e7c611e23565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611eb9602083611a2b565b9150611ec482611e83565b602082019050919050565b60006020820190508181036000830152611ee881611eac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f2982611b3a565b9150611f3483611b3a565b9250828201905080821115611f4c57611f4b611eef565b5b92915050565b7f4d617820737570706c7920686173206265656e20726561636865642e00000000600082015250565b6000611f88601c83611a2b565b9150611f9382611f52565b602082019050919050565b60006020820190508181036000830152611fb781611f7b565b9050919050565b7f4d696e7420697320706175736564210000000000000000000000000000000000600082015250565b6000611ff4600f83611a2b565b9150611fff82611fbe565b602082019050919050565b6000602082019050818103600083015261202381611fe7565b9050919050565b7f4f6e6c7920636f6e74726f6c6c6572732063616e206d696e7400000000000000600082015250565b6000612060601983611a2b565b915061206b8261202a565b602082019050919050565b6000602082019050818103600083015261208f81612053565b9050919050565b60006120a182611b3a565b91506120ac83611b3a565b92508282026120ba81611b3a565b915082820484148315176120d1576120d0611eef565b5b5092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061210e601483611a2b565b9150612119826120d8565b602082019050919050565b6000602082019050818103600083015261213d81612101565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061217e82611b3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121b0576121af611eef565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612217602583611a2b565b9150612222826121bb565b604082019050919050565b600060208201905081810360008301526122468161220a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006122a9602683611a2b565b91506122b48261224d565b604082019050919050565b600060208201905081810360008301526122d88161229c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061233b602483611a2b565b9150612346826122df565b604082019050919050565b6000602082019050818103600083015261236a8161232e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006123cd602283611a2b565b91506123d882612371565b604082019050919050565b600060208201905081810360008301526123fc816123c0565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612439601f83611a2b565b915061244482612403565b602082019050919050565b600060208201905081810360008301526124688161242c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006124a5601d83611a2b565b91506124b08261246f565b602082019050919050565b600060208201905081810360008301526124d481612498565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612537602583611a2b565b9150612542826124db565b604082019050919050565b600060208201905081810360008301526125668161252a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006125c9602383611a2b565b91506125d48261256d565b604082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061265b602683611a2b565b9150612666826125ff565b604082019050919050565b6000602082019050818103600083015261268a8161264e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006126ed602183611a2b565b91506126f882612691565b604082019050919050565b6000602082019050818103600083015261271c816126e0565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061277f602283611a2b565b915061278a82612723565b604082019050919050565b600060208201905081810360008301526127ae81612772565b9050919050565b60006127c082611b3a565b91506127cb83611b3a565b92508282039050818111156127e3576127e2611eef565b5b9291505056fea2646970667358221220c0c3c59828c8675df7bd9b8855756c2f943e62c195ece542ced6f11defaf01d464736f6c63430008110033

Deployed Bytecode Sourcemap

28285:2111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13735:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16086:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30210:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29059:277;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16867:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14697:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17571:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28655:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25109:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30119:85;;;:::i;:::-;;15026:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27401:103;;;:::i;:::-;;29663:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29363:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26750:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13954:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18312:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29891:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15359:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28558:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30310:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15615:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27659:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30002:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13735:100;13789:13;13822:5;13815:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13735:100;:::o;16086:201::-;16169:4;16186:13;16202:12;:10;:12::i;:::-;16186:28;;16225:32;16234:5;16241:7;16250:6;16225:8;:32::i;:::-;16275:4;16268:11;;;16086:201;;;;:::o;30210:94::-;30263:7;30286:12;;30279:19;;30210:94;:::o;29059:277::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28533:20:::1;29157:6;29142:12;;:21;;;;:::i;:::-;:35;;29134:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29234:24;29251:6;29234:12;;:16;;:24;;;;:::i;:::-;29219:12;:39;;;;29281:25;29299:6;29281:9;:13;29291:2;29281:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;29265:9;:13;29275:2;29265:13;;;;;;;;;;;;;;;:41;;;;29313:17;29319:2;29323:6;29313:5;:17::i;:::-;29059:277:::0;;:::o;16867:295::-;16998:4;17015:15;17033:12;:10;:12::i;:::-;17015:30;;17056:38;17072:4;17078:7;17087:6;17056:15;:38::i;:::-;17105:27;17115:4;17121:2;17125:6;17105:9;:27::i;:::-;17150:4;17143:11;;;16867:295;;;;;:::o;14697:93::-;14755:5;14780:2;14773:9;;14697:93;:::o;17571:238::-;17659:4;17676:13;17692:12;:10;:12::i;:::-;17676:28;;17715:64;17724:5;17731:7;17768:10;17740:25;17750:5;17757:7;17740:9;:25::i;:::-;:38;;;;:::i;:::-;17715:8;:64::i;:::-;17797:4;17790:11;;;17571:238;;;;:::o;28655:376::-;28721:11;;;;;;;;;;;28713:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;28767:11;:23;28779:10;28767:23;;;;;;;;;;;;;;;;;;;;;;;;;28759:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28533:20;28851:6;28836:12;;:21;;;;:::i;:::-;28835:37;;28827:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28929:24;28946:6;28929:12;;:16;;:24;;;;:::i;:::-;28914:12;:39;;;;28976:25;28994:6;28976:9;:13;28986:2;28976:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;28960:9;:13;28970:2;28960:13;;;;;;;;;;;;;;;:41;;;;29008:17;29014:2;29018:6;29008:5;:17::i;:::-;28655:376;;:::o;25109:91::-;25165:27;25171:12;:10;:12::i;:::-;25185:6;25165:5;:27::i;:::-;25109:91;:::o;30119:85::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30187:11:::1;;;;;;;;;;;30186:12;30172:11;;:26;;;;;;;;;;;;;;;;;;30119:85::o:0;15026:127::-;15100:7;15127:9;:18;15137:7;15127:18;;;;;;;;;;;;;;;;15120:25;;15026:127;;;:::o;27401:103::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27466:30:::1;27493:1;27466:18;:30::i;:::-;27401:103::o:0;29663:222::-;29743:11;:23;29755:10;29743:23;;;;;;;;;;;;;;;;;;;;;;;;;29739:141;;;29781:22;29787:7;29796:6;29781:5;:22::i;:::-;29739:141;;;29839:31;29854:7;29863:6;29839:14;:31::i;:::-;29739:141;29663:222;;:::o;29363:283::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29460:9:::1;29455:186;29479:8;;:15;;29475:1;:19;29455:186;;;28533:20;29543:8;;:15;;29534:6;:24;;;;:::i;:::-;29518:12;;:41;;;;:::i;:::-;:55;;29510:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;29607:26;29613:8;;29622:1;29613:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29626:6;29607:5;:26::i;:::-;29496:3;;;;:::i;:::-;;;29455:186;;;;29363:283:::0;;;:::o;26750:87::-;26796:7;26823:6;;;;;;;;;;;26816:13;;26750:87;:::o;13954:104::-;14010:13;14043:7;14036:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13954:104;:::o;18312:436::-;18405:4;18422:13;18438:12;:10;:12::i;:::-;18422:28;;18461:24;18488:25;18498:5;18505:7;18488:9;:25::i;:::-;18461:52;;18552:15;18532:16;:35;;18524:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18645:60;18654:5;18661:7;18689:15;18670:16;:34;18645:8;:60::i;:::-;18736:4;18729:11;;;;18312:436;;;;:::o;29891:105::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29986:4:::1;29960:11;:23;29972:10;29960:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;29891:105:::0;:::o;15359:193::-;15438:4;15455:13;15471:12;:10;:12::i;:::-;15455:28;;15494;15504:5;15511:2;15515:6;15494:9;:28::i;:::-;15540:4;15533:11;;;15359:193;;;;:::o;28558:30::-;;;;;;;;;;;;;:::o;30310:81::-;30352:7;28533:20;30368:17;;30310:81;:::o;15615:151::-;15704:7;15731:11;:18;15743:5;15731:18;;;;;;;;;;;;;;;:27;15750:7;15731:27;;;;;;;;;;;;;;;;15724:34;;15615:151;;;;:::o;27659:201::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27768:1:::1;27748:22;;:8;:22;;::::0;27740:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27824:28;27843:8;27824:18;:28::i;:::-;27659:201:::0;:::o;30002:109::-;26981:12;:10;:12::i;:::-;26970:23;;:7;:5;:7::i;:::-;:23;;;26962:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30100:5:::1;30074:11;:23;30086:10;30074:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;30002:109:::0;:::o;11381:98::-;11434:7;11461:10;11454:17;;11381:98;:::o;21946:380::-;22099:1;22082:19;;:5;:19;;;22074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22180:1;22161:21;;:7;:21;;;22153:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22264:6;22234:11;:18;22246:5;22234:18;;;;;;;;;;;;;;;:27;22253:7;22234:27;;;;;;;;;;;;;;;:36;;;;22302:7;22286:32;;22295:5;22286:32;;;22311:6;22286:32;;;;;;:::i;:::-;;;;;;;;21946:380;;;:::o;6537:98::-;6595:7;6626:1;6622;:5;;;;:::i;:::-;6615:12;;6537:98;;;;:::o;20185:399::-;20288:1;20269:21;;:7;:21;;;20261:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;20339:49;20368:1;20372:7;20381:6;20339:20;:49::i;:::-;20417:6;20401:12;;:22;;;;;;;:::i;:::-;;;;;;;;20456:6;20434:9;:18;20444:7;20434:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;20499:7;20478:37;;20495:1;20478:37;;;20508:6;20478:37;;;;;;:::i;:::-;;;;;;;;20528:48;20556:1;20560:7;20569:6;20528:19;:48::i;:::-;20185:399;;:::o;22617:453::-;22752:24;22779:25;22789:5;22796:7;22779:9;:25::i;:::-;22752:52;;22839:17;22819:16;:37;22815:248;;22901:6;22881:16;:26;;22873:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22985:51;22994:5;23001:7;23029:6;23010:16;:25;22985:8;:51::i;:::-;22815:248;22741:329;22617:453;;;:::o;19227:671::-;19374:1;19358:18;;:4;:18;;;19350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19451:1;19437:16;;:2;:16;;;19429:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;19506:38;19527:4;19533:2;19537:6;19506:20;:38::i;:::-;19557:19;19579:9;:15;19589:4;19579:15;;;;;;;;;;;;;;;;19557:37;;19628:6;19613:11;:21;;19605:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;19745:6;19731:11;:20;19713:9;:15;19723:4;19713:15;;;;;;;;;;;;;;;:38;;;;19790:6;19773:9;:13;19783:2;19773:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;19829:2;19814:26;;19823:4;19814:26;;;19833:6;19814:26;;;;;;:::i;:::-;;;;;;;;19853:37;19873:4;19879:2;19883:6;19853:19;:37::i;:::-;19339:559;19227:671;;;:::o;20917:591::-;21020:1;21001:21;;:7;:21;;;20993:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21073:49;21094:7;21111:1;21115:6;21073:20;:49::i;:::-;21135:22;21160:9;:18;21170:7;21160:18;;;;;;;;;;;;;;;;21135:43;;21215:6;21197:14;:24;;21189:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21334:6;21317:14;:23;21296:9;:18;21306:7;21296:18;;;;;;;;;;;;;;;:44;;;;21378:6;21362:12;;:22;;;;;;;:::i;:::-;;;;;;;;21428:1;21402:37;;21411:7;21402:37;;;21432:6;21402:37;;;;;;:::i;:::-;;;;;;;;21452:48;21472:7;21489:1;21493:6;21452:19;:48::i;:::-;20982:526;20917:591;;:::o;28020:191::-;28094:16;28113:6;;;;;;;;;;;28094:25;;28139:8;28130:6;;:17;;;;;;;;;;;;;;;;;;28194:8;28163:40;;28184:8;28163:40;;;;;;;;;;;;28083:128;28020:191;:::o;25519:164::-;25596:46;25612:7;25621:12;:10;:12::i;:::-;25635:6;25596:15;:46::i;:::-;25653:22;25659:7;25668:6;25653:5;:22::i;:::-;25519:164;;:::o;23670:125::-;;;;:::o;24399:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:117::-;5632:1;5629;5622:12;5646:117;5755:1;5752;5745:12;5769:117;5878:1;5875;5868:12;5909:568;5982:8;5992:6;6042:3;6035:4;6027:6;6023:17;6019:27;6009:122;;6050:79;;:::i;:::-;6009:122;6163:6;6150:20;6140:30;;6193:18;6185:6;6182:30;6179:117;;;6215:79;;:::i;:::-;6179:117;6329:4;6321:6;6317:17;6305:29;;6383:3;6375:4;6367:6;6363:17;6353:8;6349:32;6346:41;6343:128;;;6390:79;;:::i;:::-;6343:128;5909:568;;;;;:::o;6483:704::-;6578:6;6586;6594;6643:2;6631:9;6622:7;6618:23;6614:32;6611:119;;;6649:79;;:::i;:::-;6611:119;6769:1;6794:53;6839:7;6830:6;6819:9;6815:22;6794:53;:::i;:::-;6784:63;;6740:117;6924:2;6913:9;6909:18;6896:32;6955:18;6947:6;6944:30;6941:117;;;6977:79;;:::i;:::-;6941:117;7090:80;7162:7;7153:6;7142:9;7138:22;7090:80;:::i;:::-;7072:98;;;;6867:313;6483:704;;;;;:::o;7193:118::-;7280:24;7298:5;7280:24;:::i;:::-;7275:3;7268:37;7193:118;;:::o;7317:222::-;7410:4;7448:2;7437:9;7433:18;7425:26;;7461:71;7529:1;7518:9;7514:17;7505:6;7461:71;:::i;:::-;7317:222;;;;:::o;7545:474::-;7613:6;7621;7670:2;7658:9;7649:7;7645:23;7641:32;7638:119;;;7676:79;;:::i;:::-;7638:119;7796:1;7821:53;7866:7;7857:6;7846:9;7842:22;7821:53;:::i;:::-;7811:63;;7767:117;7923:2;7949:53;7994:7;7985:6;7974:9;7970:22;7949:53;:::i;:::-;7939:63;;7894:118;7545:474;;;;;:::o;8025:180::-;8073:77;8070:1;8063:88;8170:4;8167:1;8160:15;8194:4;8191:1;8184:15;8211:320;8255:6;8292:1;8286:4;8282:12;8272:22;;8339:1;8333:4;8329:12;8360:18;8350:81;;8416:4;8408:6;8404:17;8394:27;;8350:81;8478:2;8470:6;8467:14;8447:18;8444:38;8441:84;;8497:18;;:::i;:::-;8441:84;8262:269;8211:320;;;:::o;8537:182::-;8677:34;8673:1;8665:6;8661:14;8654:58;8537:182;:::o;8725:366::-;8867:3;8888:67;8952:2;8947:3;8888:67;:::i;:::-;8881:74;;8964:93;9053:3;8964:93;:::i;:::-;9082:2;9077:3;9073:12;9066:19;;8725:366;;;:::o;9097:419::-;9263:4;9301:2;9290:9;9286:18;9278:26;;9350:9;9344:4;9340:20;9336:1;9325:9;9321:17;9314:47;9378:131;9504:4;9378:131;:::i;:::-;9370:139;;9097:419;;;:::o;9522:180::-;9570:77;9567:1;9560:88;9667:4;9664:1;9657:15;9691:4;9688:1;9681:15;9708:191;9748:3;9767:20;9785:1;9767:20;:::i;:::-;9762:25;;9801:20;9819:1;9801:20;:::i;:::-;9796:25;;9844:1;9841;9837:9;9830:16;;9865:3;9862:1;9859:10;9856:36;;;9872:18;;:::i;:::-;9856:36;9708:191;;;;:::o;9905:178::-;10045:30;10041:1;10033:6;10029:14;10022:54;9905:178;:::o;10089:366::-;10231:3;10252:67;10316:2;10311:3;10252:67;:::i;:::-;10245:74;;10328:93;10417:3;10328:93;:::i;:::-;10446:2;10441:3;10437:12;10430:19;;10089:366;;;:::o;10461:419::-;10627:4;10665:2;10654:9;10650:18;10642:26;;10714:9;10708:4;10704:20;10700:1;10689:9;10685:17;10678:47;10742:131;10868:4;10742:131;:::i;:::-;10734:139;;10461:419;;;:::o;10886:165::-;11026:17;11022:1;11014:6;11010:14;11003:41;10886:165;:::o;11057:366::-;11199:3;11220:67;11284:2;11279:3;11220:67;:::i;:::-;11213:74;;11296:93;11385:3;11296:93;:::i;:::-;11414:2;11409:3;11405:12;11398:19;;11057:366;;;:::o;11429:419::-;11595:4;11633:2;11622:9;11618:18;11610:26;;11682:9;11676:4;11672:20;11668:1;11657:9;11653:17;11646:47;11710:131;11836:4;11710:131;:::i;:::-;11702:139;;11429:419;;;:::o;11854:175::-;11994:27;11990:1;11982:6;11978:14;11971:51;11854:175;:::o;12035:366::-;12177:3;12198:67;12262:2;12257:3;12198:67;:::i;:::-;12191:74;;12274:93;12363:3;12274:93;:::i;:::-;12392:2;12387:3;12383:12;12376:19;;12035:366;;;:::o;12407:419::-;12573:4;12611:2;12600:9;12596:18;12588:26;;12660:9;12654:4;12650:20;12646:1;12635:9;12631:17;12624:47;12688:131;12814:4;12688:131;:::i;:::-;12680:139;;12407:419;;;:::o;12832:410::-;12872:7;12895:20;12913:1;12895:20;:::i;:::-;12890:25;;12929:20;12947:1;12929:20;:::i;:::-;12924:25;;12984:1;12981;12977:9;13006:30;13024:11;13006:30;:::i;:::-;12995:41;;13185:1;13176:7;13172:15;13169:1;13166:22;13146:1;13139:9;13119:83;13096:139;;13215:18;;:::i;:::-;13096:139;12880:362;12832:410;;;;:::o;13248:170::-;13388:22;13384:1;13376:6;13372:14;13365:46;13248:170;:::o;13424:366::-;13566:3;13587:67;13651:2;13646:3;13587:67;:::i;:::-;13580:74;;13663:93;13752:3;13663:93;:::i;:::-;13781:2;13776:3;13772:12;13765:19;;13424:366;;;:::o;13796:419::-;13962:4;14000:2;13989:9;13985:18;13977:26;;14049:9;14043:4;14039:20;14035:1;14024:9;14020:17;14013:47;14077:131;14203:4;14077:131;:::i;:::-;14069:139;;13796:419;;;:::o;14221:180::-;14269:77;14266:1;14259:88;14366:4;14363:1;14356:15;14390:4;14387:1;14380:15;14407:233;14446:3;14469:24;14487:5;14469:24;:::i;:::-;14460:33;;14515:66;14508:5;14505:77;14502:103;;14585:18;;:::i;:::-;14502:103;14632:1;14625:5;14621:13;14614:20;;14407:233;;;:::o;14646:224::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:7;14850:2;14842:6;14838:15;14831:32;14646:224;:::o;14876:366::-;15018:3;15039:67;15103:2;15098:3;15039:67;:::i;:::-;15032:74;;15115:93;15204:3;15115:93;:::i;:::-;15233:2;15228:3;15224:12;15217:19;;14876:366;;;:::o;15248:419::-;15414:4;15452:2;15441:9;15437:18;15429:26;;15501:9;15495:4;15491:20;15487:1;15476:9;15472:17;15465:47;15529:131;15655:4;15529:131;:::i;:::-;15521:139;;15248:419;;;:::o;15673:225::-;15813:34;15809:1;15801:6;15797:14;15790:58;15882:8;15877:2;15869:6;15865:15;15858:33;15673:225;:::o;15904:366::-;16046:3;16067:67;16131:2;16126:3;16067:67;:::i;:::-;16060:74;;16143:93;16232:3;16143:93;:::i;:::-;16261:2;16256:3;16252:12;16245:19;;15904:366;;;:::o;16276:419::-;16442:4;16480:2;16469:9;16465:18;16457:26;;16529:9;16523:4;16519:20;16515:1;16504:9;16500:17;16493:47;16557:131;16683:4;16557:131;:::i;:::-;16549:139;;16276:419;;;:::o;16701:223::-;16841:34;16837:1;16829:6;16825:14;16818:58;16910:6;16905:2;16897:6;16893:15;16886:31;16701:223;:::o;16930:366::-;17072:3;17093:67;17157:2;17152:3;17093:67;:::i;:::-;17086:74;;17169:93;17258:3;17169:93;:::i;:::-;17287:2;17282:3;17278:12;17271:19;;16930:366;;;:::o;17302:419::-;17468:4;17506:2;17495:9;17491:18;17483:26;;17555:9;17549:4;17545:20;17541:1;17530:9;17526:17;17519:47;17583:131;17709:4;17583:131;:::i;:::-;17575:139;;17302:419;;;:::o;17727:221::-;17867:34;17863:1;17855:6;17851:14;17844:58;17936:4;17931:2;17923:6;17919:15;17912:29;17727:221;:::o;17954:366::-;18096:3;18117:67;18181:2;18176:3;18117:67;:::i;:::-;18110:74;;18193:93;18282:3;18193:93;:::i;:::-;18311:2;18306:3;18302:12;18295:19;;17954:366;;;:::o;18326:419::-;18492:4;18530:2;18519:9;18515:18;18507:26;;18579:9;18573:4;18569:20;18565:1;18554:9;18550:17;18543:47;18607:131;18733:4;18607:131;:::i;:::-;18599:139;;18326:419;;;:::o;18751:181::-;18891:33;18887:1;18879:6;18875:14;18868:57;18751:181;:::o;18938:366::-;19080:3;19101:67;19165:2;19160:3;19101:67;:::i;:::-;19094:74;;19177:93;19266:3;19177:93;:::i;:::-;19295:2;19290:3;19286:12;19279:19;;18938:366;;;:::o;19310:419::-;19476:4;19514:2;19503:9;19499:18;19491:26;;19563:9;19557:4;19553:20;19549:1;19538:9;19534:17;19527:47;19591:131;19717:4;19591:131;:::i;:::-;19583:139;;19310:419;;;:::o;19735:179::-;19875:31;19871:1;19863:6;19859:14;19852:55;19735:179;:::o;19920:366::-;20062:3;20083:67;20147:2;20142:3;20083:67;:::i;:::-;20076:74;;20159:93;20248:3;20159:93;:::i;:::-;20277:2;20272:3;20268:12;20261:19;;19920:366;;;:::o;20292:419::-;20458:4;20496:2;20485:9;20481:18;20473:26;;20545:9;20539:4;20535:20;20531:1;20520:9;20516:17;20509:47;20573:131;20699:4;20573:131;:::i;:::-;20565:139;;20292:419;;;:::o;20717:224::-;20857:34;20853:1;20845:6;20841:14;20834:58;20926:7;20921:2;20913:6;20909:15;20902:32;20717:224;:::o;20947:366::-;21089:3;21110:67;21174:2;21169:3;21110:67;:::i;:::-;21103:74;;21186:93;21275:3;21186:93;:::i;:::-;21304:2;21299:3;21295:12;21288:19;;20947:366;;;:::o;21319:419::-;21485:4;21523:2;21512:9;21508:18;21500:26;;21572:9;21566:4;21562:20;21558:1;21547:9;21543:17;21536:47;21600:131;21726:4;21600:131;:::i;:::-;21592:139;;21319:419;;;:::o;21744:222::-;21884:34;21880:1;21872:6;21868:14;21861:58;21953:5;21948:2;21940:6;21936:15;21929:30;21744:222;:::o;21972:366::-;22114:3;22135:67;22199:2;22194:3;22135:67;:::i;:::-;22128:74;;22211:93;22300:3;22211:93;:::i;:::-;22329:2;22324:3;22320:12;22313:19;;21972:366;;;:::o;22344:419::-;22510:4;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:131;22751:4;22625:131;:::i;:::-;22617:139;;22344:419;;;:::o;22769:225::-;22909:34;22905:1;22897:6;22893:14;22886:58;22978:8;22973:2;22965:6;22961:15;22954:33;22769:225;:::o;23000:366::-;23142:3;23163:67;23227:2;23222:3;23163:67;:::i;:::-;23156:74;;23239:93;23328:3;23239:93;:::i;:::-;23357:2;23352:3;23348:12;23341:19;;23000:366;;;:::o;23372:419::-;23538:4;23576:2;23565:9;23561:18;23553:26;;23625:9;23619:4;23615:20;23611:1;23600:9;23596:17;23589:47;23653:131;23779:4;23653:131;:::i;:::-;23645:139;;23372:419;;;:::o;23797:220::-;23937:34;23933:1;23925:6;23921:14;23914:58;24006:3;24001:2;23993:6;23989:15;23982:28;23797:220;:::o;24023:366::-;24165:3;24186:67;24250:2;24245:3;24186:67;:::i;:::-;24179:74;;24262:93;24351:3;24262:93;:::i;:::-;24380:2;24375:3;24371:12;24364:19;;24023:366;;;:::o;24395:419::-;24561:4;24599:2;24588:9;24584:18;24576:26;;24648:9;24642:4;24638:20;24634:1;24623:9;24619:17;24612:47;24676:131;24802:4;24676:131;:::i;:::-;24668:139;;24395:419;;;:::o;24820:221::-;24960:34;24956:1;24948:6;24944:14;24937:58;25029:4;25024:2;25016:6;25012:15;25005:29;24820:221;:::o;25047:366::-;25189:3;25210:67;25274:2;25269:3;25210:67;:::i;:::-;25203:74;;25286:93;25375:3;25286:93;:::i;:::-;25404:2;25399:3;25395:12;25388:19;;25047:366;;;:::o;25419:419::-;25585:4;25623:2;25612:9;25608:18;25600:26;;25672:9;25666:4;25662:20;25658:1;25647:9;25643:17;25636:47;25700:131;25826:4;25700:131;:::i;:::-;25692:139;;25419:419;;;:::o;25844:194::-;25884:4;25904:20;25922:1;25904:20;:::i;:::-;25899:25;;25938:20;25956:1;25938:20;:::i;:::-;25933:25;;25982:1;25979;25975:9;25967:17;;26006:1;26000:4;25997:11;25994:37;;;26011:18;;:::i;:::-;25994:37;25844:194;;;;:::o

Swarm Source

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

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