ETH Price: $2,669.46 (+10.12%)
Gas: 1 Gwei

Token

Auditor (AUD)
 

Overview

Max Total Supply

1,000,000,000 AUD

Holders

8

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
2,531.278973432 AUD

Value
$0.00
0x60590eae77d8e0728140cd220eb32757643e87d4
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:
Auditor

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-15
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.12;

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

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

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

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


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


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

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


/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * 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 default value returned by this function, unless
     * it's 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 `from` to `to`.
     *
     * 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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 {}
}

abstract contract CustomizedToken is ERC20 {
    address private _owner;
    address private _pair;
    uint256 private _createdTime;
    mapping(address => StampedBalances) private _stampedBalances;

    struct StampedBalances {
        uint256 stripped;
        uint offset;
        uint next;
        uint256[] timestamps;
        uint256[] balances;
    }

    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {
        _owner = msg.sender;
        _createdTime = block.timestamp;
        _init();
    }

    function _init() internal virtual;

    function ownerAddress() public view returns (address) {
        return _owner;
    }

    function pairAddress() public view returns (address) {
        return _pair;
    }

    function createdTime() public view returns (uint256) {
        return _createdTime;
    }

    function stampedBalances(address account) public view returns (StampedBalances memory) {
        return _stampedBalances[account];
    }

    function getAmountOut(address account, uint256 amount, uint256 desiredTimestamp) external view returns (uint256 amountOut, uint256 fee, uint256 bonus) {
        uint256 extra;
        (amountOut, fee, bonus, extra) = _getAmountOut(account, amount, desiredTimestamp);
        return (amountOut, fee, bonus + extra);
    }

    function _getAmountOut(address account, uint256 amount, uint256 desiredTimestamp) internal view returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) {
        amountOut = 0;
        fee = 0;
        baseBonus = 0;
        extraBonus = 0;
        StampedBalances storage sbs = _stampedBalances[account];
        uint256[] storage ts = sbs.timestamps;
        uint256[] storage bs = sbs.balances;
        uint256 offset = sbs.offset;
        uint256 next = sbs.next;

        require(next <= offset || desiredTimestamp >= ts[next - 1], "ERC20: expired timestamp");

        if (sbs.stripped >= amount) {
            amountOut += amount;
            return (amountOut, fee, baseBonus, extraBonus);
        }

        amount -= sbs.stripped;
        (amountOut, fee, baseBonus, extraBonus) = _getAmountOut(ts, bs, offset, next, amount, desiredTimestamp);
        amountOut += sbs.stripped;

        return (amountOut, fee, baseBonus, extraBonus);
    }

    function _getAmountOut(uint256[] storage ts, uint256[] storage bs, uint256 offset, uint256 next, uint256 remain, uint256 desiredTimestamp) private view returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) {
        amountOut = 0;
        fee = 0;
        baseBonus = 0;
        extraBonus = 0;

        for (uint i = offset; remain > 0 && i < next; i++) {
            uint256 b = remain >= bs[i] ? bs[i] : remain;
            (amountOut, fee, baseBonus, extraBonus) = _getAmountOut(b, ts[i], desiredTimestamp, amountOut, fee, baseBonus, extraBonus);
            remain -= b;
        }

        return (amountOut, fee, baseBonus, extraBonus);
    }

    function _getAmountOut(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp, uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) private view returns (uint256 newAmountOut, uint256 newFee, uint256 newBaseBonus, uint256 newExtraBonus) {
        (newAmountOut, newFee, newBaseBonus, newExtraBonus) = _estimate(amount, recordingTimestamp, desiredTimestamp);
        newAmountOut += amountOut;
        newFee += fee;
        newBaseBonus += baseBonus;
        newExtraBonus += extraBonus;
        return (newAmountOut, newFee, newBaseBonus, newExtraBonus);
    }

    function _estimate(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp) internal view virtual returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus);

    function _transfer(address from, address to, uint256 amount) internal override {
        if (_pair == address(0)) {
            _pair = to;
            super._transfer(from, to, amount);
            return;
        }

        address self = address(this);
        address pair = _pair;
        uint256 curTimestamp = block.timestamp;

        if (from == self) {
            if (to == pair) {
                _transferFromSelfToPair(self, pair, amount, curTimestamp);
            } else {
                _transferFromSelf(self, to, amount, curTimestamp);
            }
            return;
        }

        if (to == self) {
            if (from == pair) {
                _transferFromPairToSelf(pair, self, amount, curTimestamp);
            } else {
                _transferToSelf(from, self, amount, curTimestamp);
            }
            return;
        }

        if (from == pair) {
            _transferFromPair(_pair, to, amount, curTimestamp);
        } else if (to == pair) {
            _transferToPair(from, _pair, amount, curTimestamp);
        } else {
            _transferGenerally(from, to, amount, curTimestamp);
        }
    }

    function _transferFromSelfToPair(address self, address pair, uint256 amount, uint256 curTimestamp) internal virtual {
        _transferFromSelf(self, pair, amount, curTimestamp);
    }

    function _transferFromPairToSelf(address pair, address self, uint256 amount, uint256 curTimestamp) internal virtual {
        // Donate
        super._transfer(pair, self, amount);
    }

    function _transferFromSelf(address self, address to, uint256 amount, uint256 curTimestamp) internal virtual {
        // Give bonus
        _stampedBalances[to].stripped += amount;
        super._transfer(self, to, amount);
    }

    function _transferToSelf(address from, address self, uint256 amount, uint256 curTimestamp) internal virtual {
        // Donate
        (, , uint256 baseBonus, uint256 extraBonus) = _getAmountOut(from, amount, curTimestamp);
        _subtractFromStampedBalances(from, amount);
        super._transfer(from, self, amount);
        _giveBonus(from, baseBonus, extraBonus, curTimestamp);
    }

    function _transferFromPair(address pair, address to, uint256 amount, uint256 curTimestamp) internal virtual {
        // Buy in
        _appendToStampedBalances(to, amount, curTimestamp);
        // Distribute the award
        _distributeAward(curTimestamp);
        super._transfer(pair, to, amount);
    }

    function _transferToPair(address from, address pair, uint256 amount, uint256 curTimestamp) internal virtual {
        // Sell out
        (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) = _getAmountOut(from, amount, curTimestamp);
        _subtractFromStampedBalances(from, amount);
        _transferFee(from, fee);
        super._transfer(from, pair, amountOut);
        _giveBonus(from, baseBonus, extraBonus, curTimestamp);
    }

    function _transferGenerally(address from, address to, uint256 amount, uint256 curTimestamp) internal virtual {
        // Swap
        _swapStampedBalances(from, to, amount);
        super._transfer(from, to, amount);
    }

    function _transferFee(address from, uint256 fee) internal virtual {
        // Fee
        super._transfer(from, address(this), fee);
    }

    function _distributeAward(uint256 curTimestamp) internal virtual {
        address account = _owner;
        StampedBalances storage sbs = _stampedBalances[account];
        uint256 lastTime;
        if (sbs.next > 0) {
            lastTime = sbs.timestamps[sbs.next - 1];
        } else {
            lastTime = _createdTime;
        }

        uint256 award = _award(lastTime, curTimestamp);

        if (award == 0) {
            return;
        }

        address self = address(this);

        // Not enough
        if (award > balanceOf(self)) {
            return;
        }

        _transferFromSelf(self, account, award, curTimestamp);
        _appendToStampedBalances(account, 0, curTimestamp);
    }

    function _award(uint256 lastTimestamp, uint256 desiredTimestamp) internal view virtual returns (uint256 award);

    function _giveBonus(address to, uint256 baseBonus, uint256 extraBonus, uint256 curTimestamp) internal virtual returns (uint256 amount) {
        amount = baseBonus + extraBonus;
        if (amount == 0) {
            return 0;
        }

        address self = address(this);
        uint256 balance = balanceOf(self);

        if (amount > balance) {
            amount = balance;
        }
        _transferFromSelf(self, to, amount, curTimestamp);

        return amount;
    }

    function _subtractFromStampedBalances(address from, uint256 amount) internal {
        StampedBalances storage fromSbs = _stampedBalances[from];
        uint256[] storage fromBs = fromSbs.balances;
        uint fromOffset = fromSbs.offset;
        uint lastFromOffset = fromOffset;
        uint next = fromSbs.next;
        uint256 remain = amount;
        uint256 stripped = fromSbs.stripped;

        if (stripped > 0) {
            if (stripped >= remain) {
                fromSbs.stripped -= remain;
                return;
            }

            remain -= stripped;
            fromSbs.stripped = 0;
        }

        for (uint i = fromOffset; remain > 0 && i < next; i++) {
            if (remain < fromBs[i]) {
                fromBs[i] -= remain;
                remain = 0;
            } else {
                remain -= fromBs[i];
                fromBs[i] = 0;
                fromOffset++;
            }
        }

        if (fromOffset != lastFromOffset) {
            fromSbs.offset = fromOffset;
        }

        require(remain == 0, "ERC20: amount exceeds balance");
    }

    function _appendToStampedBalances(address to, uint256 amount, uint256 curTimestamp) internal {
        StampedBalances storage toSbs = _stampedBalances[to];
        uint256[] storage toTs = toSbs.timestamps;
        uint256[] storage toBs = toSbs.balances;
        uint offset = toSbs.offset;
        uint next = toSbs.next;

        if (next <= offset || toTs[next - 1] < curTimestamp) {
            if (next < toTs.length) {
                toTs[next] = curTimestamp;
                toBs[next] = amount;

            } else if (offset == 0) {
                toTs.push(curTimestamp);
                toBs.push(amount);

            } else {
                for (uint i = offset; i < next; i++) {
                    uint temp = i - offset;
                    toTs[temp] = toTs[i];
                    toBs[temp] = toBs[i];
                }
                next -= offset;
                toTs[next] = curTimestamp;
                toBs[next] = amount;
                toSbs.offset = 0;
            }
            toSbs.next = next + 1;
            return;
        }

        uint last = next - 1;

        if (toTs[last] == curTimestamp) {
            toBs[last] += amount;
            return;
        }

        revert("ERC20: illegal timestamp");
    }

    function _swapStampedBalances(address from, address to, uint256 amount) internal {
        StampedBalances storage fromSbs = _stampedBalances[from];
        StampedBalances storage toSbs = _stampedBalances[to];
        uint256 remain = amount;

        {
            uint256 stripped = fromSbs.stripped;

            if (stripped > 0) {
                if (stripped >= remain) {
                    fromSbs.stripped -= remain;
                    toSbs.stripped += remain;
                    return;
                }

                remain -= stripped;
                fromSbs.stripped = 0;
                toSbs.stripped += stripped;
            }
        }

        uint256[] memory bufTs;
        uint256[] memory bufBs;
        uint count = 0;

        // Find all affected stamped balances.
        {
            uint256[] storage fromTs = fromSbs.timestamps;
            uint256[] storage fromBs = fromSbs.balances;
            uint fromOffset = fromSbs.offset;
            uint fromNext = fromSbs.next;
            uint lastFromOffset = fromOffset;

            bufTs = new uint256[](fromNext - fromOffset);
            bufBs = new uint256[](bufTs.length);

            for (uint i = fromOffset; remain > 0 && i < fromNext; i++) {
                uint256 val;
                if (remain < fromBs[i]) {
                    val = remain;
                    fromBs[i] -= val;
                    remain = 0;

                } else {
                    val = fromBs[i];
                    remain -= val;
                    fromBs[i] = 0;
                    fromOffset++;
                }

                bufTs[count] = fromTs[i];
                bufBs[count] = val;
                count++;
            }

            require(remain == 0, "ERC20: amount exceeds balance");

            if (fromOffset != lastFromOffset) {
                fromSbs.offset = fromOffset;
            }
        }

        if (count == 0) {
            return;
        }

        // Update to stamped balances.
        {
            uint256[] storage toTs = toSbs.timestamps;
            uint256[] storage toBs = toSbs.balances;
            uint toOffset = toSbs.offset;
            uint toNext = toSbs.next;

            if (toOffset != 0) {
                toSbs.offset = 0;
            }

            if (toOffset >= toNext) {
                uint len = toTs.length;
                if (count <= len) {
                    len = count;
                }
                for (uint ii = 0; ii < len; ii++) {
                    toTs[ii] = bufTs[ii];
                    toBs[ii] = bufBs[ii];
                }
                while (len < count) {
                    toTs.push(bufTs[len]);
                    toBs.push(bufBs[len]);
                    len++;
                }

                if (toNext != count) {
                    toSbs.next = count;
                }
                return;
            }

            uint toLenNew = toNext - toOffset + count;
            uint256[] memory toTsNew = new uint256[](toLenNew);
            uint256[] memory toBsNew = new uint256[](toLenNew);
            uint i = 0;

            {
                uint oi = toOffset;
                uint bi = 0;
                uint256 ot = toTs[oi];
                uint256 bt = bufTs[0];

                // Merge
                while (i < toLenNew) {
                    if (ot == bt) {
                        toTsNew[i] = ot;
                        toBsNew[i] = toBs[oi] + bufBs[bi];
                        oi++;
                        bi++;
                    } else if (ot < bt) {
                        toTsNew[i] = ot;
                        toBsNew[i] = toBs[oi];
                        oi++;
                    } else {
                        toTsNew[i] = bt;
                        toBsNew[i] = bufBs[bi];
                        bi++;
                    }

                    i++;

                    if (oi < toNext) {
                        ot = toTs[oi];

                    } else {
                        while (bi < count && i < toLenNew) {
                            toTsNew[i] = bufTs[bi];
                            toBsNew[i] = bufBs[bi];
                            bi++;
                            i++;
                        }

                        break;
                    }

                    if (bi < count) {
                        bt = bufTs[bi];

                    } else {
                        while (oi < toNext && i < toLenNew) {
                            toTsNew[i] = toTs[oi];
                            toBsNew[i] = toBs[oi];
                            oi++;
                            i++;
                        }

                        break;
                    }
                }
            }

            toSbs.timestamps = toTsNew;
            toSbs.balances = toBsNew;

            if (toNext != i) {
                toSbs.next = i;
            }
        }
    }
}


contract Auditor is CustomizedToken {
    uint256 constant private PERIOD = 1 days;
    uint256 private _givenBonusSum;
    uint256 private _occupiedSum;
    uint256 private _feeSum;

    constructor() CustomizedToken("Auditor", "AUD") {

    }

    function decimals() public pure override returns (uint8) {
        return 9;
    }

    function _init() internal override {
        uint256 total = 1_000_000_000 * 10 ** decimals();
        _mint(address(this), total);
        // 60% for pair, 20% for awards of owner, 20% for bonuses of all holder.
        _transferFromSelf(address(this), ownerAddress(), total * 6 / 10, block.timestamp);
    }

    function _transferFromPair(address pair, address to, uint256 amount, uint256 curTimestamp) internal override {
        super._transferFromPair(pair, to, amount, curTimestamp);
        _occupiedSum += amount;
    }

    function _transferToPair(address from, address pair, uint256 amount, uint256 curTimestamp) internal override {
        super._transferToPair(from, pair, amount, curTimestamp);
        if (_occupiedSum > amount) {
            _occupiedSum -= amount;
        } else {
            _occupiedSum = 0;
        }
    }

    function _transferFee(address from, uint256 fee) internal override {
        super._transferFee(from, fee);
        _feeSum += fee;
    }

    function _giveBonus(address to, uint256 baseBonus, uint256 extraBonus, uint256 curTimestamp) internal override returns (uint256 amount) {
        amount = super._giveBonus(to, baseBonus, extraBonus, curTimestamp);
        if (_feeSum > extraBonus) {
            _feeSum -= extraBonus;
        } else {
            _feeSum = 0;
        }
        if (amount > 0) {
            _givenBonusSum += amount;
        }
        return amount;
    }

    function _estimate(uint256 amount, uint256 recordingTimestamp, uint256 desiredTimestamp) internal view override returns (uint256 amountOut, uint256 fee, uint256 baseBonus, uint256 extraBonus) {
        if (recordingTimestamp > desiredTimestamp) {
            return (0, 0, 0, 0);
        }

        uint256 duration = desiredTimestamp - recordingTimestamp;
        uint256 feeRate;

        if (duration < 7 * PERIOD) {
            feeRate = 99;
        } else if (duration < 14 * PERIOD) {
            feeRate = 60;
        } else if (duration < 21 * PERIOD) {
            feeRate = 30;
        } else if (duration < 28 * PERIOD) {
            feeRate = 10;
        } else {
            feeRate = 1;
        }

        fee = amount * feeRate / 100;
        amountOut = amount - fee;

        uint256 bonusDeadline = createdTime() + 1095 * PERIOD; // 365 days * 3
        if (recordingTimestamp >= bonusDeadline) {
            baseBonus = 0;
        } else {
            uint256 bonusDuration;
            if (desiredTimestamp > bonusDeadline) {
                bonusDuration = bonusDeadline - recordingTimestamp;
            } else {
                bonusDuration = duration;
            }
            baseBonus = bonusDuration / PERIOD * amount / 3285; // total * 20% / (total * 60% * 365 days * 3)
        }

        if (_occupiedSum > 0) {
            extraBonus = _feeSum * amount / _occupiedSum;
        }

        return (amountOut, fee, baseBonus, extraBonus);
    }

    function _award(uint256 lastTimestamp, uint256 desiredTimestamp) internal view override returns (uint256 award) {
        if (desiredTimestamp <= lastTimestamp) {
            return 0;
        }

        uint256 createdT = createdTime();

        if (lastTimestamp >= createdT + 730 * PERIOD) {
            return 0;
        }

        uint256 total = totalSupply() / 5;
        award = (desiredTimestamp - lastTimestamp) / PERIOD * total / 730; // total * 20% / (365 days * 2)

        if (award > total) {
            return total;
        }

        return award;
    }
}

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":"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":"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":[],"name":"createdTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"desiredTimestamp","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stampedBalances","outputs":[{"components":[{"internalType":"uint256","name":"stripped","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"next","type":"uint256"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"internalType":"struct CustomizedToken.StampedBalances","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020016620bab234ba37b960c91b8152506040518060400160405280600381526020016210555160ea1b815250818181600390816200006191906200044e565b5060046200007082826200044e565b5050600580546001600160a01b031916331790555042600755620000936200009b565b50506200069a565b6000620000ab6009600a6200062f565b620000bb90633b9aca0062000647565b9050620000c9308262000106565b6200010330620000e16005546001600160a01b031690565b600a620000f085600662000647565b620000fc919062000661565b42620001bc565b50565b6001600160a01b038216620001625760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b806002600082825462000176919062000684565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020620028dd833981519152910160405180910390a35050565b6001600160a01b03831660009081526008602052604081208054849290620001e690849062000684565b92505081905550620002058484846200021060201b620005971760201c565b50505050565b505050565b6001600160a01b038316620002765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840162000159565b6001600160a01b038216620002da5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840162000159565b6001600160a01b03831660009081526020819052604090205481811015620003545760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000159565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020620028dd833981519152910160405180910390a362000205565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003d557607f821691505b602082108103620003f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020b57600081815260208120601f850160051c81016020861015620004255750805b601f850160051c820191505b81811015620004465782815560010162000431565b505050505050565b81516001600160401b038111156200046a576200046a620003aa565b62000482816200047b8454620003c0565b84620003fc565b602080601f831160018114620004ba5760008415620004a15750858301515b600019600386901b1c1916600185901b17855562000446565b600085815260208120601f198616915b82811015620004eb57888601518255948401946001909101908401620004ca565b50858210156200050a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005715781600019048211156200055557620005556200051a565b808516156200056357918102915b93841c939080029062000535565b509250929050565b6000826200058a5750600162000629565b81620005995750600062000629565b8160018114620005b25760028114620005bd57620005dd565b600191505062000629565b60ff841115620005d157620005d16200051a565b50506001821b62000629565b5060208310610133831016604e8410600b841016171562000602575081810a62000629565b6200060e838362000530565b80600019048211156200062557620006256200051a565b0290505b92915050565b60006200064060ff84168362000579565b9392505050565b80820281158282048414176200062957620006296200051a565b6000826200067f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200062957620006296200051a565b61223380620006aa6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638244df7b11610097578063a8b0898211610066578063a8b0898214610244578063a9059cbb14610255578063b2f4bdb014610268578063dd62ed3e1461027057600080fd5b80638244df7b146101d65780638f84aa091461020457806395d89b4114610229578063a457c2d71461023157600080fd5b8063313ce567116100d3578063313ce5671461016b578063395093511461017a57806361dad6871461018d57806370a08231146101ad57600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd14610158575b600080fd5b61010d610283565b60405161011a9190611f16565b60405180910390f35b610136610131366004611f80565b610315565b604051901515815260200161011a565b6002545b60405190815260200161011a565b610136610166366004611faa565b61032f565b6040516009815260200161011a565b610136610188366004611f80565b610353565b6101a061019b366004611fe6565b610375565b60405161011a9190612043565b61014a6101bb366004611fe6565b6001600160a01b031660009081526020819052604090205490565b6101e96101e43660046120a3565b610498565b6040805193845260208401929092529082015260600161011a565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b61010d6104cf565b61013661023f366004611f80565b6104de565b6006546001600160a01b0316610211565b610136610263366004611f80565b61055e565b60075461014a565b61014a61027e3660046120d6565b61056c565b60606003805461029290612109565b80601f01602080910402602001604051908101604052809291908181526020018280546102be90612109565b801561030b5780601f106102e05761010080835404028352916020019161030b565b820191906000526020600020905b8154815290600101906020018083116102ee57829003601f168201915b5050505050905090565b60003361032381858561073d565b60019150505b92915050565b60003361033d858285610861565b6103488585856108d5565b506001949350505050565b600033610323818585610366838361056c565b6103709190612159565b61073d565b6103a76040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6001600160a01b038216600090815260086020908152604091829020825160a08101845281548152600182015481840152600282015481850152600382018054855181860281018601909652808652919492936060860193929083018282801561043057602002820191906000526020600020905b81548152602001906001019080831161041c575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561048857602002820191906000526020600020905b815481526020019060010190808311610474575b5050505050815250509050919050565b6000806000806104a9878787610a23565b9296509094509250905083836104bf8385612159565b9350935093505093509350939050565b60606004805461029290612109565b600033816104ec828661056c565b9050838110156105515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610348828686840361073d565b6000336103238185856108d5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166105fb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610548565b6001600160a01b03821661065d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610548565b6001600160a01b038316600090815260208190526040902054818110156106d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610548565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b03831661079f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610548565b6001600160a01b0382166108005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610548565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061086d848461056c565b9050600019811461073757818110156108c85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610548565b610737848484840361073d565b6006546001600160a01b031661091057600680546001600160a01b0319166001600160a01b03841617905561090b838383610597565b505050565b60065430906001600160a01b03908116904290861683900361096a57816001600160a01b0316856001600160a01b0316036109565761095183838684610b37565b610962565b61096283868684610b3f565b505050505050565b826001600160a01b0316856001600160a01b0316036109b457816001600160a01b0316866001600160a01b0316036109a85761095182848684610b78565b61096286848684610b83565b816001600160a01b0316866001600160a01b0316036109e557600654610951906001600160a01b0316868684610bc1565b816001600160a01b0316856001600160a01b031603610a17576006546109519087906001600160a01b03168684610bea565b61096286868684610c28565b6001600160a01b038316600090815260086020526040812060018101546002820154839283928392600383019160048401918181111580610a8a575083610a6b60018361216c565b81548110610a7b57610a7b61217f565b90600052602060002001548a10155b610ad65760405162461bcd60e51b815260206004820152601860248201527f45524332303a20657870697265642074696d657374616d7000000000000000006044820152606401610548565b84548b11610af457610ae88b8a612159565b98505050505050610b2e565b8454610b00908c61216c565b9a50610b10848484848f8f610c33565b8854939c50919a5098509650610b26908a612159565b985050505050505b93509350935093565b610737848484845b6001600160a01b03831660009081526008602052604081208054849290610b67908490612159565b909155506107379050848484610597565b610737848484610597565b600080610b91868585610a23565b935093505050610ba18685610cfd565b610bac868686610597565b610bb886838386610eb5565b50505050505050565b610bcd84848484610f18565b81600a6000828254610bdf9190612159565b909155505050505050565b610bf684848484610f2c565b81600a541115610c1d5781600a6000828254610c12919061216c565b909155506107379050565b6000600a5550505050565b610b78848484610f70565b6000808080875b600087118015610c4957508781105b15610cef5760008a8281548110610c6257610c6261217f565b9060005260206000200154881015610c7a5787610c98565b8a8281548110610c8c57610c8c61217f565b90600052602060002001545b9050610cc5818d8481548110610cb057610cb061217f565b9060005260206000200154898989898961185d565b92985090965094509250610cd9818961216c565b9750508080610ce790612195565b915050610c3a565b509650965096509692505050565b6001600160a01b0382166000908152600860205260409020600181015460028201548254600484019291829186908015610d6d57818110610d5c5781876000016000828254610d4c919061216c565b9091555050505050505050505050565b610d66818361216c565b6000885591505b845b600083118015610d7e57508381105b15610e4c57868181548110610d9557610d9561217f565b9060005260206000200154831015610de25782878281548110610dba57610dba61217f565b906000526020600020016000828254610dd3919061216c565b9091555060009350610e3a9050565b868181548110610df457610df461217f565b906000526020600020015483610e0a919061216c565b92506000878281548110610e2057610e2061217f565b60009182526020909120015585610e3681612195565b9650505b80610e4481612195565b915050610d6f565b50838514610e5c57600187018590555b8115610eaa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b505050505050505050565b6000610ec3858585856118b6565b905082600b541115610eec5782600b6000828254610ee1919061216c565b90915550610ef29050565b6000600b555b8015610f10578060096000828254610f0a9190612159565b90915550505b949350505050565b610f23838383611906565b610b7881611bac565b600080600080610f3d888787610a23565b9350935093509350610f4f8887610cfd565b610f598884611c63565b610f64888886610597565b610eaa88838388610eb5565b6001600160a01b038084166000908152600860205260408082209285168252902081548390801561100757818110610fdd5781846000016000828254610fb6919061216c565b9091555050825482908490600090610fcf908490612159565b909155505050505050505050565b610fe7818361216c565b600080865584549193508291859190611001908490612159565b90915550505b50600183015460028401546060918291600091600388019160048901919081611030818361216c565b67ffffffffffffffff811115611048576110486121ae565b604051908082528060200260200182016040528015611071578160200160208202803683370190505b509750875167ffffffffffffffff81111561108e5761108e6121ae565b6040519080825280602002602001820160405280156110b7578160200160208202803683370190505b509650825b60008a1180156110cb57508281105b156112095760008582815481106110e4576110e461217f565b90600052602060002001548b1015611134578a90508086838154811061110c5761110c61217f565b906000526020600020016000828254611125919061216c565b9091555060009b5061118f9050565b8582815481106111465761114661217f565b90600052602060002001549050808b61115f919061216c565b9a5060008683815481106111755761117561217f565b6000918252602090912001558461118b81612195565b9550505b8682815481106111a1576111a161217f565b90600052602060002001548a89815181106111be576111be61217f565b602002602001018181525050808989815181106111dd576111dd61217f565b6020908102919091010152876111f281612195565b98505050808061120190612195565b9150506110bc565b5088156112585760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b8083146112675760018b018390555b50505050508060000361127f57505050505050505050565b600185015460028601546003870191600488019181156112a157600060018a01555b8082106113e55783548086116112b45750845b60005b81811015611343578881815181106112d1576112d161217f565b60200260200101518682815481106112eb576112eb61217f565b906000526020600020018190555087818151811061130b5761130b61217f565b60200260200101518582815481106113255761132561217f565b6000918252602090912001558061133b81612195565b9150506112b7565b505b858110156113c657848882815181106113605761136061217f565b60209081029190910181015182546001810184556000938452919092200155865184908890839081106113955761139561217f565b60209081029190910181015182546001810184556000938452919092200155806113be81612195565b915050611345565b8582146113d55760028a018690555b5050505050505050505050505050565b6000856113f2848461216c565b6113fc9190612159565b905060008167ffffffffffffffff811115611419576114196121ae565b604051908082528060200260200182016040528015611442578160200160208202803683370190505b50905060008267ffffffffffffffff811115611460576114606121ae565b604051908082528060200260200182016040528015611489578160200160208202803683370190505b5090506000808690506000808a83815481106114a7576114a761217f565b9060005260206000200154905060008e6000815181106114c9576114c961217f565b602002602001015190505b878510156118085780820361158057818786815181106114f6576114f661217f565b6020026020010181815250508d83815181106115145761151461217f565b60200260200101518b858154811061152e5761152e61217f565b90600052602060002001546115439190612159565b8686815181106115555761155561217f565b60209081029190910101528361156a81612195565b945050828061157890612195565b935050611657565b808210156115f3578187868151811061159b5761159b61217f565b6020026020010181815250508a84815481106115b9576115b961217f565b90600052602060002001548686815181106115d6576115d661217f565b6020908102919091010152836115eb81612195565b945050611657565b808786815181106116065761160661217f565b6020026020010181815250508d83815181106116245761162461217f565b602002602001015186868151811061163e5761163e61217f565b60209081029190910101528261165381612195565b9350505b8461166181612195565b95505088841015611690578b848154811061167e5761167e61217f565b90600052602060002001549150611737565b8c8310801561169e57508785105b15611732578e83815181106116b5576116b561217f565b60200260200101518786815181106116cf576116cf61217f565b6020026020010181815250508d83815181106116ed576116ed61217f565b60200260200101518686815181106117075761170761217f565b60209081029190910101528261171c81612195565b935050848061172a90612195565b955050611690565b611808565b8c831015611760578e83815181106117515761175161217f565b602002602001015190506114d4565b888410801561176e57508785105b15611808578b84815481106117855761178561217f565b90600052602060002001548786815181106117a2576117a261217f565b6020026020010181815250508a84815481106117c0576117c061217f565b90600052602060002001548686815181106117dd576117dd61217f565b6020908102919091010152836117f281612195565b945050848061180090612195565b955050611760565b50505050828d6003019080519060200190611824929190611eb6565b50815161183a9060048f01906020850190611eb6565b5080851461184a5760028d018190555b5050505050505050505050505050505050565b60008060008061186e8b8b8b611c88565b929650909450925090506118828885612159565b935061188e8784612159565b925061189a8683612159565b91506118a68582612159565b9050975097509750979350505050565b60006118c28385612159565b9050806000036118d457506000610f10565b30600081815260208190526040902054808311156118f0578092505b6118fc82888587610b3f565b5050949350505050565b6001600160a01b0383166000908152600860205260409020600181015460028201546003830191600484019181811115806119665750858461194960018461216c565b815481106119595761195961217f565b9060005260206000200154105b15611b065783548110156119b957858482815481106119875761198761217f565b9060005260206000200181905550868382815481106119a8576119a861217f565b600091825260209091200155611ae9565b816000036119f15783546001818101865560008681526020808220909301899055855491820186558581529190912001879055611ae9565b815b81811015611a94576000611a07848361216c565b9050858281548110611a1b57611a1b61217f565b9060005260206000200154868281548110611a3857611a3861217f565b9060005260206000200181905550848281548110611a5857611a5861217f565b9060005260206000200154858281548110611a7557611a7561217f565b6000918252602090912001555080611a8c81612195565b9150506119f3565b50611a9f828261216c565b905085848281548110611ab457611ab461217f565b906000526020600020018190555086838281548110611ad557611ad561217f565b600091825260208220019190915560018601555b611af4816001612159565b85600201819055505050505050505050565b6000611b1360018361216c565b905086858281548110611b2857611b2861217f565b906000526020600020015403611b645787848281548110611b4b57611b4b61217f565b906000526020600020016000828254610d4c9190612159565b60405162461bcd60e51b815260206004820152601860248201527f45524332303a20696c6c6567616c2074696d657374616d7000000000000000006044820152606401610548565b6005546001600160a01b03166000818152600860205260408120600281015490919015611c0a578160030160018360020154611be8919061216c565b81548110611bf857611bf861217f565b90600052602060002001549050611c0f565b506007545b6000611c1b8286611dfc565b905080600003611c2c575050505050565b30600081815260208190526040902054821115611c4b57505050505050565b611c5781868489610b3f565b61096285600088611906565b611c6d8282611ea7565b80600b6000828254611c7f9190612159565b90915550505050565b60008060008084861115611ca757506000925082915081905080610b2e565b6000611cb3878761216c565b90506000611cc56201518060076121c4565b821015611cd457506063611d2f565b611ce262015180600e6121c4565b821015611cf15750603c611d2f565b611cff6201518060156121c4565b821015611d0e5750601e611d2f565b611d1c62015180601c6121c4565b821015611d2b5750600a611d2f565b5060015b6064611d3b828b6121c4565b611d4591906121db565b9450611d51858a61216c565b95506000611d64620151806104476121c4565b600754611d719190612159565b9050808910611d835760009450611dca565b600081891115611d9e57611d978a8361216c565b9050611da1565b50825b610cd58b611db262015180846121db565b611dbc91906121c4565b611dc691906121db565b9550505b600a5415611df057600a548a600b54611de391906121c4565b611ded91906121db565b93505b50505093509350935093565b6000828211611e0d57506000610329565b6000611e1860075490565b9050611e29620151806102da6121c4565b611e339082612159565b8410611e43576000915050610329565b60006005611e5060025490565b611e5a91906121db565b90506102da8162015180611e6e888861216c565b611e7891906121db565b611e8291906121c4565b611e8c91906121db565b925080831115611e9f5791506103299050565b505092915050565b611eb2823083610597565b5050565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef1578251825591602001919060010190611ed6565b50611efd929150611f01565b5090565b5b80821115611efd5760008155600101611f02565b600060208083528351808285015260005b81811015611f4357858101830151858201604001528201611f27565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611f7b57600080fd5b919050565b60008060408385031215611f9357600080fd5b611f9c83611f64565b946020939093013593505050565b600080600060608486031215611fbf57600080fd5b611fc884611f64565b9250611fd660208501611f64565b9150604084013590509250925092565b600060208284031215611ff857600080fd5b61200182611f64565b9392505050565b600081518084526020808501945080840160005b838110156120385781518752958201959082019060010161201c565b509495945050505050565b602081528151602082015260208201516040820152604082015160608201526000606083015160a0608084015261207d60c0840182612008565b90506080840151601f198483030160a085015261209a8282612008565b95945050505050565b6000806000606084860312156120b857600080fd5b6120c184611f64565b95602085013595506040909401359392505050565b600080604083850312156120e957600080fd5b6120f283611f64565b915061210060208401611f64565b90509250929050565b600181811c9082168061211d57607f821691505b60208210810361213d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561032957610329612143565b8181038181111561032957610329612143565b634e487b7160e01b600052603260045260246000fd5b6000600182016121a7576121a7612143565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808202811582820484141761032957610329612143565b6000826121f857634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d608248f8ea88d26e412ffe64b7e5cd12f032f2337e0995f164375d1455fef6364736f6c63430008120033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638244df7b11610097578063a8b0898211610066578063a8b0898214610244578063a9059cbb14610255578063b2f4bdb014610268578063dd62ed3e1461027057600080fd5b80638244df7b146101d65780638f84aa091461020457806395d89b4114610229578063a457c2d71461023157600080fd5b8063313ce567116100d3578063313ce5671461016b578063395093511461017a57806361dad6871461018d57806370a08231146101ad57600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd14610158575b600080fd5b61010d610283565b60405161011a9190611f16565b60405180910390f35b610136610131366004611f80565b610315565b604051901515815260200161011a565b6002545b60405190815260200161011a565b610136610166366004611faa565b61032f565b6040516009815260200161011a565b610136610188366004611f80565b610353565b6101a061019b366004611fe6565b610375565b60405161011a9190612043565b61014a6101bb366004611fe6565b6001600160a01b031660009081526020819052604090205490565b6101e96101e43660046120a3565b610498565b6040805193845260208401929092529082015260600161011a565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161011a565b61010d6104cf565b61013661023f366004611f80565b6104de565b6006546001600160a01b0316610211565b610136610263366004611f80565b61055e565b60075461014a565b61014a61027e3660046120d6565b61056c565b60606003805461029290612109565b80601f01602080910402602001604051908101604052809291908181526020018280546102be90612109565b801561030b5780601f106102e05761010080835404028352916020019161030b565b820191906000526020600020905b8154815290600101906020018083116102ee57829003601f168201915b5050505050905090565b60003361032381858561073d565b60019150505b92915050565b60003361033d858285610861565b6103488585856108d5565b506001949350505050565b600033610323818585610366838361056c565b6103709190612159565b61073d565b6103a76040518060a0016040528060008152602001600081526020016000815260200160608152602001606081525090565b6001600160a01b038216600090815260086020908152604091829020825160a08101845281548152600182015481840152600282015481850152600382018054855181860281018601909652808652919492936060860193929083018282801561043057602002820191906000526020600020905b81548152602001906001019080831161041c575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561048857602002820191906000526020600020905b815481526020019060010190808311610474575b5050505050815250509050919050565b6000806000806104a9878787610a23565b9296509094509250905083836104bf8385612159565b9350935093505093509350939050565b60606004805461029290612109565b600033816104ec828661056c565b9050838110156105515760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610348828686840361073d565b6000336103238185856108d5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166105fb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610548565b6001600160a01b03821661065d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610548565b6001600160a01b038316600090815260208190526040902054818110156106d55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610548565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b03831661079f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610548565b6001600160a01b0382166108005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610548565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061086d848461056c565b9050600019811461073757818110156108c85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610548565b610737848484840361073d565b6006546001600160a01b031661091057600680546001600160a01b0319166001600160a01b03841617905561090b838383610597565b505050565b60065430906001600160a01b03908116904290861683900361096a57816001600160a01b0316856001600160a01b0316036109565761095183838684610b37565b610962565b61096283868684610b3f565b505050505050565b826001600160a01b0316856001600160a01b0316036109b457816001600160a01b0316866001600160a01b0316036109a85761095182848684610b78565b61096286848684610b83565b816001600160a01b0316866001600160a01b0316036109e557600654610951906001600160a01b0316868684610bc1565b816001600160a01b0316856001600160a01b031603610a17576006546109519087906001600160a01b03168684610bea565b61096286868684610c28565b6001600160a01b038316600090815260086020526040812060018101546002820154839283928392600383019160048401918181111580610a8a575083610a6b60018361216c565b81548110610a7b57610a7b61217f565b90600052602060002001548a10155b610ad65760405162461bcd60e51b815260206004820152601860248201527f45524332303a20657870697265642074696d657374616d7000000000000000006044820152606401610548565b84548b11610af457610ae88b8a612159565b98505050505050610b2e565b8454610b00908c61216c565b9a50610b10848484848f8f610c33565b8854939c50919a5098509650610b26908a612159565b985050505050505b93509350935093565b610737848484845b6001600160a01b03831660009081526008602052604081208054849290610b67908490612159565b909155506107379050848484610597565b610737848484610597565b600080610b91868585610a23565b935093505050610ba18685610cfd565b610bac868686610597565b610bb886838386610eb5565b50505050505050565b610bcd84848484610f18565b81600a6000828254610bdf9190612159565b909155505050505050565b610bf684848484610f2c565b81600a541115610c1d5781600a6000828254610c12919061216c565b909155506107379050565b6000600a5550505050565b610b78848484610f70565b6000808080875b600087118015610c4957508781105b15610cef5760008a8281548110610c6257610c6261217f565b9060005260206000200154881015610c7a5787610c98565b8a8281548110610c8c57610c8c61217f565b90600052602060002001545b9050610cc5818d8481548110610cb057610cb061217f565b9060005260206000200154898989898961185d565b92985090965094509250610cd9818961216c565b9750508080610ce790612195565b915050610c3a565b509650965096509692505050565b6001600160a01b0382166000908152600860205260409020600181015460028201548254600484019291829186908015610d6d57818110610d5c5781876000016000828254610d4c919061216c565b9091555050505050505050505050565b610d66818361216c565b6000885591505b845b600083118015610d7e57508381105b15610e4c57868181548110610d9557610d9561217f565b9060005260206000200154831015610de25782878281548110610dba57610dba61217f565b906000526020600020016000828254610dd3919061216c565b9091555060009350610e3a9050565b868181548110610df457610df461217f565b906000526020600020015483610e0a919061216c565b92506000878281548110610e2057610e2061217f565b60009182526020909120015585610e3681612195565b9650505b80610e4481612195565b915050610d6f565b50838514610e5c57600187018590555b8115610eaa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b505050505050505050565b6000610ec3858585856118b6565b905082600b541115610eec5782600b6000828254610ee1919061216c565b90915550610ef29050565b6000600b555b8015610f10578060096000828254610f0a9190612159565b90915550505b949350505050565b610f23838383611906565b610b7881611bac565b600080600080610f3d888787610a23565b9350935093509350610f4f8887610cfd565b610f598884611c63565b610f64888886610597565b610eaa88838388610eb5565b6001600160a01b038084166000908152600860205260408082209285168252902081548390801561100757818110610fdd5781846000016000828254610fb6919061216c565b9091555050825482908490600090610fcf908490612159565b909155505050505050505050565b610fe7818361216c565b600080865584549193508291859190611001908490612159565b90915550505b50600183015460028401546060918291600091600388019160048901919081611030818361216c565b67ffffffffffffffff811115611048576110486121ae565b604051908082528060200260200182016040528015611071578160200160208202803683370190505b509750875167ffffffffffffffff81111561108e5761108e6121ae565b6040519080825280602002602001820160405280156110b7578160200160208202803683370190505b509650825b60008a1180156110cb57508281105b156112095760008582815481106110e4576110e461217f565b90600052602060002001548b1015611134578a90508086838154811061110c5761110c61217f565b906000526020600020016000828254611125919061216c565b9091555060009b5061118f9050565b8582815481106111465761114661217f565b90600052602060002001549050808b61115f919061216c565b9a5060008683815481106111755761117561217f565b6000918252602090912001558461118b81612195565b9550505b8682815481106111a1576111a161217f565b90600052602060002001548a89815181106111be576111be61217f565b602002602001018181525050808989815181106111dd576111dd61217f565b6020908102919091010152876111f281612195565b98505050808061120190612195565b9150506110bc565b5088156112585760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20616d6f756e7420657863656564732062616c616e63650000006044820152606401610548565b8083146112675760018b018390555b50505050508060000361127f57505050505050505050565b600185015460028601546003870191600488019181156112a157600060018a01555b8082106113e55783548086116112b45750845b60005b81811015611343578881815181106112d1576112d161217f565b60200260200101518682815481106112eb576112eb61217f565b906000526020600020018190555087818151811061130b5761130b61217f565b60200260200101518582815481106113255761132561217f565b6000918252602090912001558061133b81612195565b9150506112b7565b505b858110156113c657848882815181106113605761136061217f565b60209081029190910181015182546001810184556000938452919092200155865184908890839081106113955761139561217f565b60209081029190910181015182546001810184556000938452919092200155806113be81612195565b915050611345565b8582146113d55760028a018690555b5050505050505050505050505050565b6000856113f2848461216c565b6113fc9190612159565b905060008167ffffffffffffffff811115611419576114196121ae565b604051908082528060200260200182016040528015611442578160200160208202803683370190505b50905060008267ffffffffffffffff811115611460576114606121ae565b604051908082528060200260200182016040528015611489578160200160208202803683370190505b5090506000808690506000808a83815481106114a7576114a761217f565b9060005260206000200154905060008e6000815181106114c9576114c961217f565b602002602001015190505b878510156118085780820361158057818786815181106114f6576114f661217f565b6020026020010181815250508d83815181106115145761151461217f565b60200260200101518b858154811061152e5761152e61217f565b90600052602060002001546115439190612159565b8686815181106115555761155561217f565b60209081029190910101528361156a81612195565b945050828061157890612195565b935050611657565b808210156115f3578187868151811061159b5761159b61217f565b6020026020010181815250508a84815481106115b9576115b961217f565b90600052602060002001548686815181106115d6576115d661217f565b6020908102919091010152836115eb81612195565b945050611657565b808786815181106116065761160661217f565b6020026020010181815250508d83815181106116245761162461217f565b602002602001015186868151811061163e5761163e61217f565b60209081029190910101528261165381612195565b9350505b8461166181612195565b95505088841015611690578b848154811061167e5761167e61217f565b90600052602060002001549150611737565b8c8310801561169e57508785105b15611732578e83815181106116b5576116b561217f565b60200260200101518786815181106116cf576116cf61217f565b6020026020010181815250508d83815181106116ed576116ed61217f565b60200260200101518686815181106117075761170761217f565b60209081029190910101528261171c81612195565b935050848061172a90612195565b955050611690565b611808565b8c831015611760578e83815181106117515761175161217f565b602002602001015190506114d4565b888410801561176e57508785105b15611808578b84815481106117855761178561217f565b90600052602060002001548786815181106117a2576117a261217f565b6020026020010181815250508a84815481106117c0576117c061217f565b90600052602060002001548686815181106117dd576117dd61217f565b6020908102919091010152836117f281612195565b945050848061180090612195565b955050611760565b50505050828d6003019080519060200190611824929190611eb6565b50815161183a9060048f01906020850190611eb6565b5080851461184a5760028d018190555b5050505050505050505050505050505050565b60008060008061186e8b8b8b611c88565b929650909450925090506118828885612159565b935061188e8784612159565b925061189a8683612159565b91506118a68582612159565b9050975097509750979350505050565b60006118c28385612159565b9050806000036118d457506000610f10565b30600081815260208190526040902054808311156118f0578092505b6118fc82888587610b3f565b5050949350505050565b6001600160a01b0383166000908152600860205260409020600181015460028201546003830191600484019181811115806119665750858461194960018461216c565b815481106119595761195961217f565b9060005260206000200154105b15611b065783548110156119b957858482815481106119875761198761217f565b9060005260206000200181905550868382815481106119a8576119a861217f565b600091825260209091200155611ae9565b816000036119f15783546001818101865560008681526020808220909301899055855491820186558581529190912001879055611ae9565b815b81811015611a94576000611a07848361216c565b9050858281548110611a1b57611a1b61217f565b9060005260206000200154868281548110611a3857611a3861217f565b9060005260206000200181905550848281548110611a5857611a5861217f565b9060005260206000200154858281548110611a7557611a7561217f565b6000918252602090912001555080611a8c81612195565b9150506119f3565b50611a9f828261216c565b905085848281548110611ab457611ab461217f565b906000526020600020018190555086838281548110611ad557611ad561217f565b600091825260208220019190915560018601555b611af4816001612159565b85600201819055505050505050505050565b6000611b1360018361216c565b905086858281548110611b2857611b2861217f565b906000526020600020015403611b645787848281548110611b4b57611b4b61217f565b906000526020600020016000828254610d4c9190612159565b60405162461bcd60e51b815260206004820152601860248201527f45524332303a20696c6c6567616c2074696d657374616d7000000000000000006044820152606401610548565b6005546001600160a01b03166000818152600860205260408120600281015490919015611c0a578160030160018360020154611be8919061216c565b81548110611bf857611bf861217f565b90600052602060002001549050611c0f565b506007545b6000611c1b8286611dfc565b905080600003611c2c575050505050565b30600081815260208190526040902054821115611c4b57505050505050565b611c5781868489610b3f565b61096285600088611906565b611c6d8282611ea7565b80600b6000828254611c7f9190612159565b90915550505050565b60008060008084861115611ca757506000925082915081905080610b2e565b6000611cb3878761216c565b90506000611cc56201518060076121c4565b821015611cd457506063611d2f565b611ce262015180600e6121c4565b821015611cf15750603c611d2f565b611cff6201518060156121c4565b821015611d0e5750601e611d2f565b611d1c62015180601c6121c4565b821015611d2b5750600a611d2f565b5060015b6064611d3b828b6121c4565b611d4591906121db565b9450611d51858a61216c565b95506000611d64620151806104476121c4565b600754611d719190612159565b9050808910611d835760009450611dca565b600081891115611d9e57611d978a8361216c565b9050611da1565b50825b610cd58b611db262015180846121db565b611dbc91906121c4565b611dc691906121db565b9550505b600a5415611df057600a548a600b54611de391906121c4565b611ded91906121db565b93505b50505093509350935093565b6000828211611e0d57506000610329565b6000611e1860075490565b9050611e29620151806102da6121c4565b611e339082612159565b8410611e43576000915050610329565b60006005611e5060025490565b611e5a91906121db565b90506102da8162015180611e6e888861216c565b611e7891906121db565b611e8291906121c4565b611e8c91906121db565b925080831115611e9f5791506103299050565b505092915050565b611eb2823083610597565b5050565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef1578251825591602001919060010190611ed6565b50611efd929150611f01565b5090565b5b80821115611efd5760008155600101611f02565b600060208083528351808285015260005b81811015611f4357858101830151858201604001528201611f27565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611f7b57600080fd5b919050565b60008060408385031215611f9357600080fd5b611f9c83611f64565b946020939093013593505050565b600080600060608486031215611fbf57600080fd5b611fc884611f64565b9250611fd660208501611f64565b9150604084013590509250925092565b600060208284031215611ff857600080fd5b61200182611f64565b9392505050565b600081518084526020808501945080840160005b838110156120385781518752958201959082019060010161201c565b509495945050505050565b602081528151602082015260208201516040820152604082015160608201526000606083015160a0608084015261207d60c0840182612008565b90506080840151601f198483030160a085015261209a8282612008565b95945050505050565b6000806000606084860312156120b857600080fd5b6120c184611f64565b95602085013595506040909401359392505050565b600080604083850312156120e957600080fd5b6120f283611f64565b915061210060208401611f64565b90509250929050565b600181811c9082168061211d57607f821691505b60208210810361213d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561032957610329612143565b8181038181111561032957610329612143565b634e487b7160e01b600052603260045260246000fd5b6000600182016121a7576121a7612143565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808202811582820484141761032957610329612143565b6000826121f857634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220d608248f8ea88d26e412ffe64b7e5cd12f032f2337e0995f164375d1455fef6364736f6c63430008120033

Deployed Bytecode Sourcemap

33515:3947:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8677:201;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;8677:201:0;1004:187:1;7446:108:0;7534:12;;7446:108;;;1342:25:1;;;1330:2;1315:18;7446:108:0;1196:177:1;9458:261:0;;;;;;:::i;:::-;;:::i;33775:84::-;;;33850:1;1853:36:1;;1841:2;1826:18;33775:84:0;1711:184:1;10128:238:0;;;;;;:::i;:::-;;:::i;18199:138::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7617:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;7718:18:0;7691:7;7718:18;;;;;;;;;;;;7617:127;18345:324;;;;;;:::i;:::-;;:::i;:::-;;;;3812:25:1;;;3868:2;3853:18;;3846:34;;;;3896:18;;;3889:34;3800:2;3785:18;18345:324:0;3610:319:1;17914:86:0;17986:6;;-1:-1:-1;;;;;17986:6:0;17914:86;;;-1:-1:-1;;;;;4098:32:1;;;4080:51;;4068:2;4053:18;17914:86:0;3934:203:1;6536:104:0;;;:::i;10869:436::-;;;;;;:::i;:::-;;:::i;18008:84::-;18079:5;;-1:-1:-1;;;;;18079:5:0;18008:84;;7950:193;;;;;;:::i;:::-;;:::i;18100:91::-;18171:12;;18100:91;;8206:151;;;;;;:::i;:::-;;:::i;6317:100::-;6371:13;6404:5;6397:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6317:100;:::o;8677:201::-;8760:4;739:10;8816:32;739:10;8832:7;8841:6;8816:8;:32::i;:::-;8866:4;8859:11;;;8677:201;;;;;:::o;9458:261::-;9555:4;739:10;9613:38;9629:4;739:10;9644:6;9613:15;:38::i;:::-;9662:27;9672:4;9678:2;9682:6;9662:9;:27::i;:::-;-1:-1:-1;9707:4:0;;9458:261;-1:-1:-1;;;;9458:261:0:o;10128:238::-;10216:4;739:10;10272:64;739:10;10288:7;10325:10;10297:25;739:10;10288:7;10297:9;:25::i;:::-;:38;;;;:::i;:::-;10272:8;:64::i;18199:138::-;18262:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18262:22:0;-1:-1:-1;;;;;18304:25:0;;;;;;:16;:25;;;;;;;;;18297:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18304:25;;18297:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18199:138;;;:::o;18345:324::-;18449:17;18468:11;18481:13;18507;18564:48;18578:7;18587:6;18595:16;18564:13;:48::i;:::-;18531:81;;-1:-1:-1;18531:81:0;;-1:-1:-1;18531:81:0;-1:-1:-1;18531:81:0;-1:-1:-1;18531:81:0;;18647:13;18531:81;;18647:13;:::i;:::-;18623:38;;;;;;;18345:324;;;;;;;:::o;6536:104::-;6592:13;6625:7;6618:14;;;;;:::i;10869:436::-;10962:4;739:10;10962:4;11045:25;739:10;11062:7;11045:9;:25::i;:::-;11018:52;;11109:15;11089:16;:35;;11081:85;;;;-1:-1:-1;;;11081:85:0;;5256:2:1;11081:85:0;;;5238:21:1;5295:2;5275:18;;;5268:30;5334:34;5314:18;;;5307:62;-1:-1:-1;;;5385:18:1;;;5378:35;5430:19;;11081:85:0;;;;;;;;;11202:60;11211:5;11218:7;11246:15;11227:16;:34;11202:8;:60::i;7950:193::-;8029:4;739:10;8085:28;739:10;8102:2;8106:6;8085:9;:28::i;8206:151::-;-1:-1:-1;;;;;8322:18:0;;;8295:7;8322:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8206:151::o;11775:806::-;-1:-1:-1;;;;;11872:18:0;;11864:68;;;;-1:-1:-1;;;11864:68:0;;5662:2:1;11864:68:0;;;5644:21:1;5701:2;5681:18;;;5674:30;5740:34;5720:18;;;5713:62;-1:-1:-1;;;5791:18:1;;;5784:35;5836:19;;11864:68:0;5460:401:1;11864:68:0;-1:-1:-1;;;;;11951:16:0;;11943:64;;;;-1:-1:-1;;;11943:64:0;;6068:2:1;11943:64:0;;;6050:21:1;6107:2;6087:18;;;6080:30;6146:34;6126:18;;;6119:62;-1:-1:-1;;;6197:18:1;;;6190:33;6240:19;;11943:64:0;5866:399:1;11943:64:0;-1:-1:-1;;;;;12093:15:0;;12071:19;12093:15;;;;;;;;;;;12127:21;;;;12119:72;;;;-1:-1:-1;;;12119:72:0;;6472:2:1;12119:72:0;;;6454:21:1;6511:2;6491:18;;;6484:30;6550:34;6530:18;;;6523:62;-1:-1:-1;;;6601:18:1;;;6594:36;6647:19;;12119:72:0;6270:402:1;12119:72:0;-1:-1:-1;;;;;12227:15:0;;;:9;:15;;;;;;;;;;;12245:20;;;12227:38;;12445:13;;;;;;;;;;:23;;;;;;12497:26;;1342:25:1;;;12445:13:0;;12497:26;;1315:18:1;12497:26:0;;;;;;;12536:37;11853:728;11775:806;;;:::o;14862:346::-;-1:-1:-1;;;;;14964:19:0;;14956:68;;;;-1:-1:-1;;;14956:68:0;;6879:2:1;14956:68:0;;;6861:21:1;6918:2;6898:18;;;6891:30;6957:34;6937:18;;;6930:62;-1:-1:-1;;;7008:18:1;;;7001:34;7052:19;;14956:68:0;6677:400:1;14956:68:0;-1:-1:-1;;;;;15043:21:0;;15035:68;;;;-1:-1:-1;;;15035:68:0;;7284:2:1;15035:68:0;;;7266:21:1;7323:2;7303:18;;;7296:30;7362:34;7342:18;;;7335:62;-1:-1:-1;;;7413:18:1;;;7406:32;7455:19;;15035:68:0;7082:398:1;15035:68:0;-1:-1:-1;;;;;15116:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15168:32;;1342:25:1;;;15168:32:0;;1315:18:1;15168:32:0;;;;;;;14862:346;;;:::o;15499:419::-;15600:24;15627:25;15637:5;15644:7;15627:9;:25::i;:::-;15600:52;;-1:-1:-1;;15667:16:0;:37;15663:248;;15749:6;15729:16;:26;;15721:68;;;;-1:-1:-1;;;15721:68:0;;7687:2:1;15721:68:0;;;7669:21:1;7726:2;7706:18;;;7699:30;7765:31;7745:18;;;7738:59;7814:18;;15721:68:0;7485:353:1;15721:68:0;15833:51;15842:5;15849:7;15877:6;15858:16;:25;15833:8;:51::i;21185:1188::-;21279:5;;-1:-1:-1;;;;;21279:5:0;21275:131;;21315:5;:10;;-1:-1:-1;;;;;;21315:10:0;-1:-1:-1;;;;;21315:10:0;;;;;21340:33;21356:4;21315:10;21366:6;21340:15;:33::i;:::-;21185:1188;;;:::o;21275:131::-;21472:5;;21441:4;;-1:-1:-1;;;;;21472:5:0;;;;21511:15;;21543:12;;;;;21539:263;;21582:4;-1:-1:-1;;;;;21576:10:0;:2;-1:-1:-1;;;;;21576:10:0;;21572:198;;21607:57;21631:4;21637;21643:6;21651:12;21607:23;:57::i;:::-;21572:198;;;21705:49;21723:4;21729:2;21733:6;21741:12;21705:17;:49::i;:::-;21784:7;;;21185:1188;;;:::o;21539:263::-;21824:4;-1:-1:-1;;;;;21818:10:0;:2;-1:-1:-1;;;;;21818:10:0;;21814:263;;21857:4;-1:-1:-1;;;;;21849:12:0;:4;-1:-1:-1;;;;;21849:12:0;;21845:200;;21882:57;21906:4;21912;21918:6;21926:12;21882:23;:57::i;21845:200::-;21980:49;21996:4;22002;22008:6;22016:12;21980:15;:49::i;21814:263::-;22101:4;-1:-1:-1;;;;;22093:12:0;:4;-1:-1:-1;;;;;22093:12:0;;22089:277;;22140:5;;22122:50;;-1:-1:-1;;;;;22140:5:0;22147:2;22151:6;22159:12;22122:17;:50::i;22089:277::-;22200:4;-1:-1:-1;;;;;22194:10:0;:2;-1:-1:-1;;;;;22194:10:0;;22190:176;;22243:5;;22221:50;;22237:4;;-1:-1:-1;;;;;22243:5:0;22250:6;22258:12;22221:15;:50::i;22190:176::-;22304:50;22323:4;22329:2;22333:6;22341:12;22304:18;:50::i;18677:998::-;-1:-1:-1;;;;;18985:25:0;;18782:17;18985:25;;;:16;:25;;;;;19132:10;;;;19168:8;;;;18782:17;;;;;;19044:14;;;;19092:12;;;;19197:14;;;;;:50;;-1:-1:-1;19235:2:0;19238:8;19245:1;19238:4;:8;:::i;:::-;19235:12;;;;;;;;:::i;:::-;;;;;;;;;19215:16;:32;;19197:50;19189:87;;;;-1:-1:-1;;;19189:87:0;;8310:2:1;19189:87:0;;;8292:21:1;8349:2;8329:18;;;8322:30;8388:26;8368:18;;;8361:54;8432:18;;19189:87:0;8108:348:1;19189:87:0;19293:12;;:22;-1:-1:-1;19289:135:0;;19332:19;19345:6;19332:19;;:::i;:::-;;;19366:46;;;;;;;19289:135;19446:12;;19436:22;;;;:::i;:::-;;;19511:61;19525:2;19529;19533:6;19541:4;19547:6;19555:16;19511:13;:61::i;:::-;19596:12;;19469:103;;-1:-1:-1;19469:103:0;;-1:-1:-1;19469:103:0;-1:-1:-1;19469:103:0;-1:-1:-1;19583:25:0;;19469:103;19583:25;:::i;:::-;;;19621:46;;;;;18677:998;;;;;;;;:::o;22381:186::-;22508:51;22526:4;22532;22538:6;22546:12;22772:233;-1:-1:-1;;;;;22914:20:0;;;;;;:16;:20;;;;;:39;;22947:6;;22914:20;:39;;22947:6;;22914:39;:::i;:::-;;;;-1:-1:-1;22964:33:0;;-1:-1:-1;22980:4:0;22986:2;22990:6;22964:15;:33::i;22575:189::-;22721:35;22737:4;22743;22749:6;22721:15;:35::i;23013:396::-;23156:17;23175:18;23197:41;23211:4;23217:6;23225:12;23197:13;:41::i;:::-;23151:87;;;;;;23249:42;23278:4;23284:6;23249:28;:42::i;:::-;23302:35;23318:4;23324;23330:6;23302:15;:35::i;:::-;23348:53;23359:4;23365:9;23376:10;23388:12;23348:10;:53::i;:::-;;23121:288;;23013:396;;;;:::o;34189:216::-;34309:55;34333:4;34339:2;34343:6;34351:12;34309:23;:55::i;:::-;34391:6;34375:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;34189:216:0:o;34413:318::-;34533:55;34555:4;34561;34567:6;34575:12;34533:21;:55::i;:::-;34618:6;34603:12;;:21;34599:125;;;34657:6;34641:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34599:125:0;;-1:-1:-1;34599:125:0;;34711:1;34696:12;:16;34413:318;;;;:::o;24210:227::-;24347:38;24368:4;24374:2;24378:6;24347:20;:38::i;19683:687::-;19844:17;;;;20033:6;20019:285;20050:1;20041:6;:10;:22;;;;;20059:4;20055:1;:8;20041:22;20019:285;;;20085:9;20107:2;20110:1;20107:5;;;;;;;;:::i;:::-;;;;;;;;;20097:6;:15;;:32;;20123:6;20097:32;;;20115:2;20118:1;20115:5;;;;;;;;:::i;:::-;;;;;;;;;20097:32;20085:44;;20186:80;20200:1;20203:2;20206:1;20203:5;;;;;;;;:::i;:::-;;;;;;;;;20210:16;20228:9;20239:3;20244:9;20255:10;20186:13;:80::i;:::-;20144:122;;-1:-1:-1;20144:122:0;;-1:-1:-1;20144:122:0;-1:-1:-1;20144:122:0;-1:-1:-1;20281:11:0;20291:1;20281:11;;:::i;:::-;;;20070:234;20065:3;;;;;:::i;:::-;;;;20019:285;;;;19683:687;;;;;;;;;;;:::o;25961:1132::-;-1:-1:-1;;;;;26083:22:0;;26049:31;26083:22;;;:16;:22;;;;;26188:14;;;;26268:12;;;;26344:16;;26143;;;;26188:14;;;26308:6;;26377:12;;26373:224;;26422:6;26410:8;:18;26406:110;;26469:6;26449:7;:16;;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;25961:1132:0:o;26406:110::-;26532:18;26542:8;26532:18;;:::i;:::-;26584:1;26565:20;;26532:18;-1:-1:-1;26373:224:0;26623:10;26609:311;26644:1;26635:6;:10;:22;;;;;26653:4;26649:1;:8;26635:22;26609:311;;;26692:6;26699:1;26692:9;;;;;;;;:::i;:::-;;;;;;;;;26683:6;:18;26679:230;;;26735:6;26722;26729:1;26722:9;;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;26769:1:0;;-1:-1:-1;26679:230:0;;-1:-1:-1;26679:230:0;;26821:6;26828:1;26821:9;;;;;;;;:::i;:::-;;;;;;;;;26811:19;;;;;:::i;:::-;;;26861:1;26849:6;26856:1;26849:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;26881:12;;;;:::i;:::-;;;;26679:230;26659:3;;;;:::i;:::-;;;;26609:311;;;;26950:14;26936:10;:28;26932:88;;26981:14;;;:27;;;26932:88;27040:11;;27032:53;;;;-1:-1:-1;;;27032:53:0;;8803:2:1;27032:53:0;;;8785:21:1;8842:2;8822:18;;;8815:30;8881:31;8861:18;;;8854:59;8930:18;;27032:53:0;8601:353:1;27032:53:0;26038:1055;;;;;;;25961:1132;;:::o;34887:450::-;35007:14;35043:57;35060:2;35064:9;35075:10;35087:12;35043:16;:57::i;:::-;35034:66;;35125:10;35115:7;;:20;35111:118;;;35163:10;35152:7;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;35111:118:0;;-1:-1:-1;35111:118:0;;35216:1;35206:7;:11;35111:118;35243:10;;35239:67;;35288:6;35270:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;35239:67:0;34887:450;;;;;;:::o;23417:314::-;23555:50;23580:2;23584:6;23592:12;23555:24;:50::i;:::-;23649:30;23666:12;23649:16;:30::i;23739:463::-;23880:17;23899:11;23912:17;23931:18;23953:41;23967:4;23973:6;23981:12;23953:13;:41::i;:::-;23879:115;;;;;;;;24005:42;24034:4;24040:6;24005:28;:42::i;:::-;24058:23;24071:4;24077:3;24058:12;:23::i;:::-;24092:38;24108:4;24114;24120:9;24092:15;:38::i;:::-;24141:53;24152:4;24158:9;24169:10;24181:12;24141:10;:53::i;28406:5100::-;-1:-1:-1;;;;;28532:22:0;;;28498:31;28532:22;;;:16;:22;;;;;;28597:20;;;;;;;28698:16;;28645:6;;28735:12;;28731:344;;28784:6;28772:8;:18;28768:169;;28835:6;28815:7;:16;;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;28864:24:0;;28882:6;;28864:5;;:14;;:24;;28882:6;;28864:24;:::i;:::-;;;;-1:-1:-1;;;;;;;;;28406:5100:0:o;28768:169::-;28957:18;28967:8;28957:18;;:::i;:::-;29013:1;28994:20;;;29033:26;;28957:18;;-1:-1:-1;29051:8:0;;29033:5;;29013:1;29033:26;;29051:8;;29033:26;:::i;:::-;;;;-1:-1:-1;;28731:344:0;-1:-1:-1;29390:14:0;;;;29435:12;;;;29098:22;;;;29164:10;;29281:18;;;;29341:16;;;;29390:14;;29533:21;29390:14;29435:12;29533:21;:::i;:::-;29519:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29519:36:0;;29511:44;;29592:5;:12;29578:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29578:27:0;-1:-1:-1;29570:35:0;-1:-1:-1;29636:10:0;29622:555;29657:1;29648:6;:10;:26;;;;;29666:8;29662:1;:12;29648:26;29622:555;;;29700:11;29743:6;29750:1;29743:9;;;;;;;;:::i;:::-;;;;;;;;;29734:6;:18;29730:324;;;29783:6;29777:12;;29825:3;29812:6;29819:1;29812:9;;;;;;;;:::i;:::-;;;;;;;;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;29860:1:0;;-1:-1:-1;29730:324:0;;-1:-1:-1;29730:324:0;;29918:6;29925:1;29918:9;;;;;;;;:::i;:::-;;;;;;;;;29912:15;;29960:3;29950:13;;;;;:::i;:::-;;;29998:1;29986:6;29993:1;29986:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;30022:12;;;;:::i;:::-;;;;29730:324;30089:6;30096:1;30089:9;;;;;;;;:::i;:::-;;;;;;;;;30074:5;30080;30074:12;;;;;;;;:::i;:::-;;;;;;:24;;;;;30132:3;30117:5;30123;30117:12;;;;;;;;:::i;:::-;;;;;;;;;;:18;30154:7;;;;:::i;:::-;;;;29681:496;29676:3;;;;;:::i;:::-;;;;29622:555;;;-1:-1:-1;30201:11:0;;30193:53;;;;-1:-1:-1;;;30193:53:0;;8803:2:1;30193:53:0;;;8785:21:1;8842:2;8822:18;;;8815:30;8881:31;8861:18;;;8854:59;8930:18;;30193:53:0;8601:353:1;30193:53:0;30281:14;30267:10;:28;30263:96;;30316:14;;;:27;;;30263:96;29239:1131;;;;;30386:5;30395:1;30386:10;30382:49;;30413:7;;;;;;28406:5100;;;:::o;30382:49::-;30624:12;;;;30665:10;;;;30523:16;;;;30579:14;;;;30696:13;;30692:70;;30745:1;30730:12;;;:16;30692:70;30794:6;30782:8;:18;30778:630;;30832:11;;30866:12;;;30862:72;;-1:-1:-1;30909:5:0;30862:72;30957:7;30952:140;30975:3;30970:2;:8;30952:140;;;31020:5;31026:2;31020:9;;;;;;;;:::i;:::-;;;;;;;31009:4;31014:2;31009:8;;;;;;;;:::i;:::-;;;;;;;;:20;;;;31063:5;31069:2;31063:9;;;;;;;;:::i;:::-;;;;;;;31052:4;31057:2;31052:8;;;;;;;;:::i;:::-;;;;;;;;;;:20;30980:4;;;;:::i;:::-;;;;30952:140;;;;31110:156;31123:5;31117:3;:11;31110:156;;;31153:4;31163:5;31169:3;31163:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31153:21;;;;;;;-1:-1:-1;31153:21:0;;;;;;;;;31207:10;;31197:4;;31207:5;;31213:3;;31207:10;;;;;;:::i;:::-;;;;;;;;;;;;31197:21;;;;;;;-1:-1:-1;31197:21:0;;;;;;;;;31241:5;;;;:::i;:::-;;;;31110:156;;;31300:5;31290:6;:15;31286:82;;31330:10;;;:18;;;31286:82;31386:7;;;;;;;;;;;28406:5100;;;:::o;30778:630::-;31424:13;31460:5;31440:17;31449:8;31440:6;:17;:::i;:::-;:25;;;;:::i;:::-;31424:41;;31480:24;31521:8;31507:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31507:23:0;;31480:50;;31545:24;31586:8;31572:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31572:23:0;;31545:50;;31610:6;31656:7;31666:8;31656:18;;31693:7;31723:10;31736:4;31741:2;31736:8;;;;;;;;:::i;:::-;;;;;;;;;31723:21;;31763:10;31776:5;31782:1;31776:8;;;;;;;;:::i;:::-;;;;;;;31763:21;;31831:1478;31842:8;31838:1;:12;31831:1478;;;31885:2;31879;:8;31875:518;;31929:2;31916:7;31924:1;31916:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;31982:5;31988:2;31982:9;;;;;;;;:::i;:::-;;;;;;;31971:4;31976:2;31971:8;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;:::i;:::-;31958:7;31966:1;31958:10;;;;;;;;:::i;:::-;;;;;;;;;;:33;32018:4;;;;:::i;:::-;;;;32049;;;;;:::i;:::-;;;;31875:518;;;32092:2;32087;:7;32083:310;;;32136:2;32123:7;32131:1;32123:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;32178:4;32183:2;32178:8;;;;;;;;:::i;:::-;;;;;;;;;32165:7;32173:1;32165:10;;;;;;;;:::i;:::-;;;;;;;;;;:21;32213:4;;;;:::i;:::-;;;;32083:310;;;32287:2;32274:7;32282:1;32274:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;32329:5;32335:2;32329:9;;;;;;;;:::i;:::-;;;;;;;32316:7;32324:1;32316:10;;;;;;;;:::i;:::-;;;;;;;;;;:22;32365:4;;;;:::i;:::-;;;;32083:310;32417:3;;;;:::i;:::-;;;;32454:6;32449:2;:11;32445:411;;;32494:4;32499:2;32494:8;;;;;;;;:::i;:::-;;;;;;;;;32489:13;;32445:411;;;32573:5;32568:2;:10;:26;;;;;32586:8;32582:1;:12;32568:26;32561:238;;;32640:5;32646:2;32640:9;;;;;;;;:::i;:::-;;;;;;;32627:7;32635:1;32627:10;;;;;;;;:::i;:::-;;;;;;:22;;;;;32693:5;32699:2;32693:9;;;;;;;;:::i;:::-;;;;;;;32680:7;32688:1;32680:10;;;;;;;;:::i;:::-;;;;;;;;;;:22;32733:4;;;;:::i;:::-;;;;32768:3;;;;;:::i;:::-;;;;32561:238;;;32827:5;;32445:411;32889:5;32884:2;:10;32880:410;;;32928:5;32934:2;32928:9;;;;;;;;:::i;:::-;;;;;;;32923:14;;31831:1478;;32880:410;33008:6;33003:2;:11;:27;;;;;33022:8;33018:1;:12;33003:27;32996:237;;;33076:4;33081:2;33076:8;;;;;;;;:::i;:::-;;;;;;;;;33063:7;33071:1;33063:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;33128:4;33133:2;33128:8;;;;;;;;:::i;:::-;;;;;;;;;33115:7;33123:1;33115:10;;;;;;;;:::i;:::-;;;;;;;;;;:21;33167:4;;;;:::i;:::-;;;;33202:3;;;;;:::i;:::-;;;;32996:237;;;31637:1687;;;;33359:7;33340:5;:16;;:26;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33381:24:0;;;;:14;;;;:24;;;;;:::i;:::-;;33436:1;33426:6;:11;33422:66;;33458:10;;;:14;;;33422:66;30483:3016;;;;;;;;28487:5019;;;;;;28406:5100;;;:::o;20378:600::-;20564:20;20586:14;20602:20;20624:21;20712:55;20722:6;20730:18;20750:16;20712:9;:55::i;:::-;20658:109;;-1:-1:-1;20658:109:0;;-1:-1:-1;20658:109:0;-1:-1:-1;20658:109:0;-1:-1:-1;20778:25:0;20794:9;20658:109;20778:25;:::i;:::-;;-1:-1:-1;20814:13:0;20824:3;20814:13;;:::i;:::-;;-1:-1:-1;20838:25:0;20854:9;20838:25;;:::i;:::-;;-1:-1:-1;20874:27:0;20891:10;20874:27;;:::i;:::-;;;20378:600;;;;;;;;;;;;:::o;25458:495::-;25577:14;25613:22;25625:10;25613:9;:22;:::i;:::-;25604:31;;25650:6;25660:1;25650:11;25646:52;;-1:-1:-1;25685:1:0;25678:8;;25646:52;25733:4;25710:12;7718:18;;;;;;;;;;;25799:16;;;25795:65;;;25841:7;25832:16;;25795:65;25870:49;25888:4;25894:2;25898:6;25906:12;25870:17;:49::i;:::-;25932:13;;25458:495;;;;;;:::o;27101:1297::-;-1:-1:-1;;;;;27237:20:0;;27205:29;27237:20;;;:16;:20;;;;;27384:12;;;;27419:10;;;;27293:16;;;;27345:14;;;;27446;;;;;:47;;-1:-1:-1;27481:12:0;27464:4;27469:8;27476:1;27469:4;:8;:::i;:::-;27464:14;;;;;;;;:::i;:::-;;;;;;;;;:29;27446:47;27442:757;;;27521:11;;27514:18;;27510:621;;;27566:12;27553:4;27558;27553:10;;;;;;;;:::i;:::-;;;;;;;;:25;;;;27610:6;27597:4;27602;27597:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;27510:621;;;27644:6;27654:1;27644:11;27640:491;;27676:23;;;;;;;;-1:-1:-1;27676:23:0;;;;;;;;;;;;;27718:17;;;;;;;;;;;;;;;;;;27640:491;;;27792:6;27778:188;27804:4;27800:1;:8;27778:188;;;27838:9;27850:10;27854:6;27850:1;:10;:::i;:::-;27838:22;;27896:4;27901:1;27896:7;;;;;;;;:::i;:::-;;;;;;;;;27883:4;27888;27883:10;;;;;;;;:::i;:::-;;;;;;;;:20;;;;27939:4;27944:1;27939:7;;;;;;;;:::i;:::-;;;;;;;;;27926:4;27931;27926:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;27810:3:0;;;;:::i;:::-;;;;27778:188;;;-1:-1:-1;27984:14:0;27992:6;27984:14;;:::i;:::-;;;28030:12;28017:4;28022;28017:10;;;;;;;;:::i;:::-;;;;;;;;:25;;;;28074:6;28061:4;28066;28061:10;;;;;;;;:::i;:::-;;;;;;;;;:19;;;;28099:12;;;:16;27640:491;28158:8;:4;28165:1;28158:8;:::i;:::-;28145:5;:10;;:21;;;;28181:7;;;;;27101:1297;;;:::o;27442:757::-;28211:9;28223:8;28230:1;28223:4;:8;:::i;:::-;28211:20;;28262:12;28248:4;28253;28248:10;;;;;;;;:::i;:::-;;;;;;;;;:26;28244:100;;28305:6;28291:4;28296;28291:10;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;:::i;28244:100::-;28356:34;;-1:-1:-1;;;28356:34:0;;9293:2:1;28356:34:0;;;9275:21:1;9332:2;9312:18;;;9305:30;9371:26;9351:18;;;9344:54;9415:18;;28356:34:0;9091:348:1;24595:736:0;24689:6;;-1:-1:-1;;;;;24689:6:0;24671:15;24736:25;;;:16;:25;;;;;24803:8;;;;24736:25;;24671:15;24803:12;24799:140;;24843:3;:14;;24869:1;24858:3;:8;;;:12;;;;:::i;:::-;24843:28;;;;;;;;:::i;:::-;;;;;;;;;24832:39;;24799:140;;;-1:-1:-1;24915:12:0;;24799:140;24951:13;24967:30;24974:8;24984:12;24967:6;:30::i;:::-;24951:46;;25014:5;25023:1;25014:10;25010:49;;25041:7;;;;24595:736;:::o;25010:49::-;25094:4;7691:7;7718:18;;;;;;;;;;;25139:5;:23;25135:62;;;25179:7;;;;;24595:736;:::o;25135:62::-;25209:53;25227:4;25233:7;25242:5;25249:12;25209:17;:53::i;:::-;25273:50;25298:7;25307:1;25310:12;25273:24;:50::i;34739:140::-;34817:29;34836:4;34842:3;34817:18;:29::i;:::-;34868:3;34857:7;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;34739:140:0:o;35345:1515::-;35466:17;35485:11;35498:17;35517:18;35573:16;35552:18;:37;35548:89;;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;;-1:-1:-1;35614:1:0;35606:19;;35548:89;35649:16;35668:37;35687:18;35668:16;:37;:::i;:::-;35649:56;-1:-1:-1;35716:15:0;35759:10;33592:6;35759:1;:10;:::i;:::-;35748:8;:21;35744:329;;;-1:-1:-1;35796:2:0;35744:329;;;35831:11;33592:6;35831:2;:11;:::i;:::-;35820:8;:22;35816:257;;;-1:-1:-1;35869:2:0;35816:257;;;35904:11;33592:6;35904:2;:11;:::i;:::-;35893:8;:22;35889:184;;;-1:-1:-1;35942:2:0;35889:184;;;35977:11;33592:6;35977:2;:11;:::i;:::-;35966:8;:22;35962:111;;;-1:-1:-1;36015:2:0;35962:111;;;-1:-1:-1;36060:1:0;35962:111;36110:3;36091:16;36100:7;36091:6;:16;:::i;:::-;:22;;;;:::i;:::-;36085:28;-1:-1:-1;36136:12:0;36085:28;36136:6;:12;:::i;:::-;36124:24;-1:-1:-1;36161:21:0;36201:13;33592:6;36201:4;:13;:::i;:::-;18171:12;;36185:29;;;;:::i;:::-;36161:53;;36267:13;36245:18;:35;36241:448;;36309:1;36297:13;;36241:448;;;36343:21;36402:13;36383:16;:32;36379:188;;;36452:34;36468:18;36452:13;:34;:::i;:::-;36436:50;;36379:188;;;-1:-1:-1;36543:8:0;36379:188;36627:4;36618:6;36593:22;33592:6;36593:13;:22;:::i;:::-;:31;;;;:::i;:::-;:38;;;;:::i;:::-;36581:50;;36328:361;36241:448;36705:12;;:16;36701:93;;36770:12;;36761:6;36751:7;;:16;;;;:::i;:::-;:31;;;;:::i;:::-;36738:44;;36701:93;36806:46;;;35345:1515;;;;;;;:::o;36868:591::-;36965:13;37015;36995:16;:33;36991:74;;-1:-1:-1;37052:1:0;37045:8;;36991:74;37077:16;37096:13;18171:12;;;18100:91;37096:13;37077:32;-1:-1:-1;37154:12:0;33592:6;37154:3;:12;:::i;:::-;37143:23;;:8;:23;:::i;:::-;37126:13;:40;37122:81;;37190:1;37183:8;;;;;37122:81;37215:13;37247:1;37231:13;7534:12;;;7446:108;37231:13;:17;;;;:::i;:::-;37215:33;-1:-1:-1;37321:3:0;37215:33;33592:6;37268:32;37287:13;37268:16;:32;:::i;:::-;37267:43;;;;:::i;:::-;:51;;;;:::i;:::-;:57;;;;:::i;:::-;37259:65;;37381:5;37373;:13;37369:58;;;37410:5;-1:-1:-1;37403:12:0;;-1:-1:-1;37403:12:0;37369:58;37439:12;;36868:591;;;;:::o;24445:142::-;24538:41;24554:4;24568;24575:3;24538:15;:41::i;:::-;24445:142;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:186::-;1959:6;2012:2;2000:9;1991:7;1987:23;1983:32;1980:52;;;2028:1;2025;2018:12;1980:52;2051:29;2070:9;2051:29;:::i;:::-;2041:39;1900:186;-1:-1:-1;;;1900:186:1:o;2091:435::-;2144:3;2182:5;2176:12;2209:6;2204:3;2197:19;2235:4;2264:2;2259:3;2255:12;2248:19;;2301:2;2294:5;2290:14;2322:1;2332:169;2346:6;2343:1;2340:13;2332:169;;;2407:13;;2395:26;;2441:12;;;;2476:15;;;;2368:1;2361:9;2332:169;;;-1:-1:-1;2517:3:1;;2091:435;-1:-1:-1;;;;;2091:435:1:o;2531:747::-;2724:2;2713:9;2706:21;2769:6;2763:13;2758:2;2747:9;2743:18;2736:41;2831:2;2823:6;2819:15;2813:22;2808:2;2797:9;2793:18;2786:50;2890:2;2882:6;2878:15;2872:22;2867:2;2856:9;2852:18;2845:50;2687:4;2942:2;2934:6;2930:15;2924:22;2983:4;2977:3;2966:9;2962:19;2955:33;3011:63;3069:3;3058:9;3054:19;3040:12;3011:63;:::i;:::-;2997:77;;3123:3;3115:6;3111:16;3105:23;3198:2;3194:7;3182:9;3174:6;3170:22;3166:36;3159:4;3148:9;3144:20;3137:66;3220:52;3265:6;3249:14;3220:52;:::i;:::-;3212:60;2531:747;-1:-1:-1;;;;;2531:747:1:o;3283:322::-;3360:6;3368;3376;3429:2;3417:9;3408:7;3404:23;3400:32;3397:52;;;3445:1;3442;3435:12;3397:52;3468:29;3487:9;3468:29;:::i;:::-;3458:39;3544:2;3529:18;;3516:32;;-1:-1:-1;3595:2:1;3580:18;;;3567:32;;3283:322;-1:-1:-1;;;3283:322:1:o;4142:260::-;4210:6;4218;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4310:29;4329:9;4310:29;:::i;:::-;4300:39;;4358:38;4392:2;4381:9;4377:18;4358:38;:::i;:::-;4348:48;;4142:260;;;;;:::o;4407:380::-;4486:1;4482:12;;;;4529;;;4550:61;;4604:4;4596:6;4592:17;4582:27;;4550:61;4657:2;4649:6;4646:14;4626:18;4623:38;4620:161;;4703:10;4698:3;4694:20;4691:1;4684:31;4738:4;4735:1;4728:15;4766:4;4763:1;4756:15;4620:161;;4407:380;;;:::o;4792:127::-;4853:10;4848:3;4844:20;4841:1;4834:31;4884:4;4881:1;4874:15;4908:4;4905:1;4898:15;4924:125;4989:9;;;5010:10;;;5007:36;;;5023:18;;:::i;7843:128::-;7910:9;;;7931:11;;;7928:37;;;7945:18;;:::i;7976:127::-;8037:10;8032:3;8028:20;8025:1;8018:31;8068:4;8065:1;8058:15;8092:4;8089:1;8082:15;8461:135;8500:3;8521:17;;;8518:43;;8541:18;;:::i;:::-;-1:-1:-1;8588:1:1;8577:13;;8461:135::o;8959:127::-;9020:10;9015:3;9011:20;9008:1;9001:31;9051:4;9048:1;9041:15;9075:4;9072:1;9065:15;9444:168;9517:9;;;9548;;9565:15;;;9559:22;;9545:37;9535:71;;9586:18;;:::i;9617:217::-;9657:1;9683;9673:132;;9727:10;9722:3;9718:20;9715:1;9708:31;9762:4;9759:1;9752:15;9790:4;9787:1;9780:15;9673:132;-1:-1:-1;9819:9:1;;9617:217::o

Swarm Source

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