ETH Price: $1,893.84 (-11.67%)
 

Overview

Max Total Supply

140,000,000 GOV

Holders

486

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Governance

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-04-08
*/

//SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.4;





/**
 * @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}.
 *
 * 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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: contracts/contracts/contracts/interfaces/IStabilityModule.sol

pragma solidity 0.8.20;

interface IStabilityModule {
    struct Stake {
        uint256 amount;
        uint256 startTime;
        uint256 endTime;
        uint256 withdrawAmount;
        uint256 lastGovContractCall;
    }

    function addTokens(
        address _collateralType,
        uint256 _amount
    ) external payable;

    function stake(uint256 _amount) external;

    function getGovernanceStake(
        address _staker
    ) external view returns (Stake memory);

    function getTotalPoolAmount() external view returns (uint256);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    function updateLastGovContractCall(address _voter) external;
}

// File: contracts/contracts/contracts/libraries/Math.sol


// Copied from https://github.com/dapphub/ds-math
// Added the div function from openzepeling safeMath

pragma solidity 0.8.20;

library DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    // slither-disable-next-line incorrect-equality
    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }

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

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

        return c;
    }

    uint256 public constant WAD = 10 ** 18;
    uint256 public constant RAY = 10 ** 28;

    //rounds to zero if x*y < WAD / 2
    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    //rounds to zero if x*y < WAD / 2
    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    //rounds to zero if x*y < WAD / 2
    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    //rounds to zero if x*y < RAY / 2
    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = mul((x / mul(y, RAY)), WAD);
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    // Not sure if this is a false positive - https://github.com/dapphub/ds-math/issues/18
    // slither-disable-next-line weak-prng
    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
}

// File: contracts/contracts/contracts/Governance.sol

pragma solidity 0.8.20;




contract Governance is ERC20 {
    using DSMath for uint;

    bool initialized;

    IStabilityModule stabilityModule;
    address public rewardDistributor;
    address public immutable team;
    address public vestingContract;

    uint256 public lastMintTimestamp = 0;
    uint256 public totalDailyMinted;
    uint256 public constant DAILY_MINT_CAP = 72e24;
    uint256 public voteCount;

    struct Vote {
        uint256 startTime;
        uint256 tallyTime;
        uint256 amountSupporting;
        uint256 amountAgainst;
        uint256 amountAbstained;
        bool executed;
        bool result;
        bytes4 voteFunction;
        address voteAddress;
        address initiator;
        bytes data;
        mapping(address => bool) voted;
    }

    struct VestingSchedule {
        uint256 totalAmount;
        uint256 cliffEnd;
        uint256 vestingEnd;
        uint256 lastClaimTime;
        uint256 monthlyAmount;
        uint256 amountClaimed;
        uint8 schedule;
    }

    mapping(uint256 => Vote) public voteInfo;
    mapping(address => uint256) public lastVoteTimestamp;
    mapping(address => mapping(uint8 => VestingSchedule))
        public vestingSchedules;
    mapping(address => uint8[]) public userSchedules;

    event VoteProposed(
        address indexed user,
        uint256 voteId,
        uint256 timestamp,
        address indexed voteAddress
    );
    event Voted(address indexed user, uint256 voteCount);
    event VoteExecuted(address executor, bool result);

    /// @notice Thrown when address zero is provided
    error ZeroAddress();

    modifier onlyVoter() {
        require(
            (stabilityModule.getGovernanceStake(msg.sender).startTime >
                block.timestamp - 90 days) ||
                (stabilityModule
                    .getGovernanceStake(msg.sender)
                    .lastGovContractCall > block.timestamp - 90 days) ||
                (lastVoteTimestamp[msg.sender] > block.timestamp - 90 days),
            "stake is inactive, hasn't been used in 3 months"
        );

        require(
            stabilityModule.getGovernanceStake(msg.sender).startTime <
                block.timestamp - 30 days,
            "stake must be at least 30 days old!"
        );
        _;
    }

    modifier mustInit() {
        require(initialized, "contract is not initialized");
        _;
    }

    modifier onlyTeam() {
        require(msg.sender == team, "can only be call by team");
        _;
    }

    modifier voteExists(uint256 numberOfVote) {
        require(numberOfVote <= voteCount, "Vote does not exist");
        _;
    }

    constructor(address _team) ERC20("GOV", "GOV") {
        require(_team != address(0), "invalid address");
        _mint(_team, 14e25);

        team = _team;
    }

    function calculateAvailableTokens(
        address account,
        uint8 _schedule
    ) public view returns (uint256) {
        VestingSchedule storage schedule = vestingSchedules[account][_schedule];

        if (block.timestamp < schedule.cliffEnd) return 0;
        if (block.timestamp >= schedule.vestingEnd) return schedule.totalAmount;

        uint256 monthsSinceLastClaim = (block.timestamp -
            schedule.lastClaimTime) / 30 days;
        uint256 newVestedAmount = monthsSinceLastClaim * schedule.monthlyAmount;
        uint256 totalVested = schedule.amountClaimed + newVestedAmount;

        return
            totalVested > schedule.totalAmount
                ? schedule.totalAmount
                : totalVested;
    }

    function init(
        address rewardDistributorAddress,
        address stabilityModuleAddress,
        address vestingAddress
    ) external onlyTeam {
        require(!initialized, "contract is initialized");
        if (rewardDistributorAddress == address(0)) revert ZeroAddress();
        if (stabilityModuleAddress == address(0)) revert ZeroAddress();
        if (vestingAddress == address(0)) revert ZeroAddress();

        rewardDistributor = rewardDistributorAddress;
        stabilityModule = IStabilityModule(stabilityModuleAddress);
        vestingContract = vestingAddress;
        initialized = true;

        stabilityModule.updateLastGovContractCall(msg.sender);
    }
    //slither-disable-next-line divide-before-multiply
    function mintDaily() external mustInit onlyTeam {
        uint256 dailyMintAmount = 1e23;
        uint256 numDays = lastMintTimestamp == 0
            ? 1
            : (block.timestamp - lastMintTimestamp) / 1 days;

        require(numDays != 0, "number of days cannot be 0");

        uint256 totalMintAmount = dailyMintAmount * numDays;
        require(
            totalDailyMinted + totalMintAmount <= DAILY_MINT_CAP,
            "Daily mint cap of 72M reached"
        );

        //90,000 minted to reward distributor to handle incentives distribution
        _mint(rewardDistributor, 9e22 * numDays);

        //10,000 minted to a reserve
        _mint(address(team), 1e22 * numDays);

        totalDailyMinted += totalMintAmount;
        lastMintTimestamp = block.timestamp;

        stabilityModule.updateLastGovContractCall(msg.sender);
    }
    //slither-disable-next-line uninitialized-state
    function proposeVote(
        address voteAddress,
        bytes4 voteFunction,
        bytes memory voteData
    ) external onlyVoter mustInit {
        require(
            stabilityModule.getGovernanceStake(msg.sender).amount >
                stabilityModule.getTotalPoolAmount() / 10,
            "user needs to stake more tokens in pool to start vote!"
        );

        voteCount++;
        uint256 voteId = voteCount;
        Vote storage _thisVote = voteInfo[voteId];
        _thisVote.initiator = msg.sender;
        _thisVote.startTime = block.timestamp;
        _thisVote.tallyTime = 0;
        _thisVote.voteAddress = voteAddress;
        _thisVote.voteFunction = voteFunction;
        _thisVote.data = voteData;

        stabilityModule.updateLastGovContractCall(msg.sender);

        emit VoteProposed(
            msg.sender,
            voteId,
            _thisVote.startTime,
            _thisVote.voteAddress
        );
    }

    function executeVote(
        uint256 numberOfVote
    ) external onlyVoter mustInit voteExists(numberOfVote) {
        //75 percent of pool needs to vote

        Vote storage v = voteInfo[numberOfVote];

        require(
            v.amountSupporting + v.amountAgainst + v.amountAbstained >
                (stabilityModule.getTotalPoolAmount() * 3) / 4,
            "75% of pool has not voted yet!"
        );
        require(v.tallyTime == 0, "Vote has already been tallied");
        uint256 _duration = 2 days;
        require(
            block.timestamp - v.startTime > _duration,
            "Time for voting has not elapsed"
        );

        if (
            v.amountSupporting >
            (stabilityModule.getTotalPoolAmount() * 51) / 100
        ) {
            v.result = true;
            address _destination = v.voteAddress;
            bool _succ;
            bytes memory _res;
            (_succ, _res) = _destination.call(
                abi.encodePacked(v.voteFunction, v.data)
            );
            //When testing _destination.call can require higher gas than the standard. Be sure to increase the gas if it fails.
            require(_succ, "error running _destination.call");
        } else {
            v.result = false;
        }

        v.executed = true;
        v.tallyTime = block.timestamp;
        stabilityModule.updateLastGovContractCall(msg.sender);

        emit VoteExecuted(msg.sender, v.result);
    }

    function vote(
        uint256 numberOfVote,
        bool isSupports,
        bool isAbstains
    ) external onlyVoter mustInit voteExists(numberOfVote) {
        Vote storage v = voteInfo[numberOfVote];
        require(v.tallyTime == 0, "Vote has already been tallied");
        require(!v.voted[msg.sender], "Sender has already voted");

        v.voted[msg.sender] = true;
        if (isAbstains) {
            v.amountAbstained += balanceOf(msg.sender);
        } else if (isSupports) {
            v.amountSupporting += balanceOf(msg.sender);
        } else {
            v.amountAgainst += balanceOf(msg.sender);
        }

        stabilityModule.updateLastGovContractCall(msg.sender);
        lastVoteTimestamp[msg.sender] = block.timestamp;

        emit Voted(msg.sender, numberOfVote);
    }

    function setVestingSchedule(
        address investor,
        uint256 amount,
        uint8 schedule,
        uint256 vestingDuration,
        uint256 cliffDuration
    ) external {
        require(msg.sender == vestingContract, "Only vesting contract");
        require(investor != address(0), "Invalid investor address");

        uint256 monthlyAmount = (amount * 30 days) / vestingDuration;

        vestingSchedules[investor][schedule] = VestingSchedule({
            totalAmount: amount,
            cliffEnd: block.timestamp + cliffDuration,
            vestingEnd: block.timestamp + cliffDuration + vestingDuration,
            lastClaimTime: block.timestamp + cliffDuration,
            monthlyAmount: monthlyAmount,
            amountClaimed: 0,
            schedule: schedule
        });

        userSchedules[investor].push(schedule);
    }

    function getUserVestingSchedules(
        address user
    ) external view returns (uint8[] memory) {
        return userSchedules[user];
    }

    function _update(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        if (from != address(0) && from != vestingContract) {
            uint256 totalVested = 0;
            uint256 vestedBalance = 0;

            uint8[] storage schedules = userSchedules[from];
            if (schedules.length > 0) {
                for (uint i = 0; i < schedules.length; i++) {
                    VestingSchedule storage schedule = vestingSchedules[from][
                        schedules[i]
                    ];
                    if (block.timestamp >= schedule.cliffEnd) {
                        totalVested += calculateAvailableTokens(
                            from,
                            schedules[i]
                        );
                    }
                    vestedBalance += schedule.totalAmount;
                }

                uint256 freeBalance = balanceOf(from) > vestedBalance
                    ? balanceOf(from) - vestedBalance
                    : 0;
                require(
                    value <= freeBalance + totalVested,
                    "Amount exceeds available tokens"
                );
            }
        }
        super._update(from, to, value);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_team","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"VoteExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"voteId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":true,"internalType":"address","name":"voteAddress","type":"address"}],"name":"VoteProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"voteCount","type":"uint256"}],"name":"Voted","type":"event"},{"inputs":[],"name":"DAILY_MINT_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"_schedule","type":"uint8"}],"name":"calculateAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfVote","type":"uint256"}],"name":"executeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserVestingSchedules","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardDistributorAddress","type":"address"},{"internalType":"address","name":"stabilityModuleAddress","type":"address"},{"internalType":"address","name":"vestingAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastMintTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastVoteTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintDaily","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voteAddress","type":"address"},{"internalType":"bytes4","name":"voteFunction","type":"bytes4"},{"internalType":"bytes","name":"voteData","type":"bytes"}],"name":"proposeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"schedule","type":"uint8"},{"internalType":"uint256","name":"vestingDuration","type":"uint256"},{"internalType":"uint256","name":"cliffDuration","type":"uint256"}],"name":"setVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDailyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userSchedules","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"vestingSchedules","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"cliffEnd","type":"uint256"},{"internalType":"uint256","name":"vestingEnd","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"monthlyAmount","type":"uint256"},{"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"internalType":"uint8","name":"schedule","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfVote","type":"uint256"},{"internalType":"bool","name":"isSupports","type":"bool"},{"internalType":"bool","name":"isAbstains","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voteInfo","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tallyTime","type":"uint256"},{"internalType":"uint256","name":"amountSupporting","type":"uint256"},{"internalType":"uint256","name":"amountAgainst","type":"uint256"},{"internalType":"uint256","name":"amountAbstained","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"result","type":"bool"},{"internalType":"bytes4","name":"voteFunction","type":"bytes4"},{"internalType":"address","name":"voteAddress","type":"address"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"}]

60a06040525f60085534801562000014575f80fd5b506040516200323a3803806200323a833981016040819052620000379162000529565b60408051808201825260038082526223a7ab60e91b60208084018290528451808601909552828552840152909190620000718382620005f7565b506004620000808282620005f7565b5050506001600160a01b038116620000d15760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b620000e8816a73ce27351811f40c000000620000fa565b6001600160a01b031660805262000768565b6001600160a01b038216620001255760405163ec442f0560e01b81525f6004820152602401620000c8565b620001325f838362000136565b5050565b6001600160a01b038316158015906200015d57506007546001600160a01b03848116911614155b1562000327576001600160a01b0383165f908152600e6020526040812080548291901562000323575f5b81548110156200026f576001600160a01b0387165f908152600d6020526040812083548290859085908110620001c157620001c1620006bf565b5f91825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190206001810154909150421062000248576200023988848481548110620002145762000214620006bf565b5f9182526020918290209181049091015460ff601f9092166101000a90041662000339565b620002459086620006e7565b94505b8054620002569085620006e7565b93505080806200026690620006fd565b91505062000187565b506001600160a01b0386165f90815260208190526040812054831062000296575f620002c2565b82620002b6886001600160a01b03165f9081526020819052604090205490565b620002c2919062000718565b9050620002d08482620006e7565b851115620003215760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320617661696c61626c6520746f6b656e73006044820152606401620000c8565b505b5050505b62000334838383620003fa565b505050565b6001600160a01b0382165f908152600d6020908152604080832060ff851684529091528120600181015442101562000375575f915050620003f4565b806002015442106200038a57549050620003f4565b5f62278d00826003015442620003a1919062000718565b620003ad91906200072e565b90505f826004015482620003c291906200074e565b90505f818460050154620003d79190620006e7565b84549091508111620003ea5780620003ed565b83545b9450505050505b92915050565b6001600160a01b03831662000428578060025f8282546200041c9190620006e7565b909155506200049a9050565b6001600160a01b0383165f90815260208190526040902054818110156200047c5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000c8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620004b857600280548290039055620004d6565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200051c91815260200190565b60405180910390a3505050565b5f602082840312156200053a575f80fd5b81516001600160a01b038116811462000551575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200058157607f821691505b602082108103620005a057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000334575f81815260208120601f850160051c81016020861015620005ce5750805b601f850160051c820191505b81811015620005ef57828155600101620005da565b505050505050565b81516001600160401b0381111562000613576200061362000558565b6200062b816200062484546200056c565b84620005a6565b602080601f83116001811462000661575f8415620006495750858301515b5f19600386901b1c1916600185901b178555620005ef565b5f85815260208120601f198616915b82811015620006915788860151825594840194600190910190840162000670565b5085821015620006af57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115620003f457620003f4620006d3565b5f60018201620007115762000711620006d3565b5060010190565b81810381811115620003f457620003f4620006d3565b5f826200074957634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417620003f457620003f4620006d3565b608051612aa4620007965f395f81816103b40152818161058301528181610ee301526110790152612aa45ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80638494ff35116100f3578063c638407111610093578063df133bca1161006e578063df133bca14610480578063e1c95ce214610493578063e57b283b146104b3578063f98a4eca146104bc575f80fd5b8063c638407114610420578063dd62ed3e14610429578063de1cf4ad14610461575f80fd5b806395d89b41116100ce57806395d89b41146103df5780639e3f8e90146103e7578063a9059cbb146103fa578063acc2166a1461040d575f80fd5b80638494ff351461038557806385f2aef2146103af5780638e80ff5d146103d6575f80fd5b806323b872dd1161015e57806370a082311161013957806370a0823114610330578063754cd90414610358578063785946f41461036b578063848465e314610373575f80fd5b806323b872dd146102dd578063313ce567146102f05780635e6f604514610305575f80fd5b8063184b955911610199578063184b9559146102125780631a8b1250146102275780631bcf8d631461023a5780631d7ce898146102ca575f80fd5b806306fdde03146101bf578063095ea7b3146101dd57806318160ddd14610200575b5f80fd5b6101c76104cf565b6040516101d491906122dc565b60405180910390f35b6101f06101eb366004612310565b61055f565b60405190151581526020016101d4565b6002545b6040519081526020016101d4565b610225610220366004612338565b610578565b005b610204610235366004612388565b610764565b610292610248366004612388565b600d60209081525f92835260408084209091529082529020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919060ff1687565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260ff1660c082015260e0016101d4565b6102256102d83660046123fe565b610815565b6101f06102eb3660046124bb565b610cbb565b60125b60405160ff90911681526020016101d4565b600754610318906001600160a01b031681565b6040516001600160a01b0390911681526020016101d4565b61020461033e3660046124f4565b6001600160a01b03165f9081526020819052604090205490565b61022561036636600461250d565b610cde565b610225610eb6565b6102046a3b8e97d229a2d54800000081565b610398610393366004612557565b6110fa565b6040516101d49b9a9998979695949392919061256e565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b61020460085481565b6101c76111f1565b6102f36103f5366004612310565b611200565b6101f0610408366004612310565b61123e565b600654610318906001600160a01b031681565b610204600a5481565b6102046104373660046125f1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61020461046f3660046124f4565b600c6020525f908152604090205481565b61022561048e366004612628565b61124b565b6104a66104a13660046124f4565b6116a4565b6040516101d49190612658565b61020460095481565b6102256104ca366004612557565b61172a565b6060600380546104de9061269e565b80601f016020809104026020016040519081016040528092919081815260200182805461050a9061269e565b80156105555780601f1061052c57610100808354040283529160200191610555565b820191905f5260205f20905b81548152906001019060200180831161053857829003601f168201915b5050505050905090565b5f3361056c818585611d9b565b60019150505b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105f05760405162461bcd60e51b815260206004820152601860248201527763616e206f6e6c792062652063616c6c206279207465616d60401b60448201526064015b60405180910390fd5b60055460ff16156106435760405162461bcd60e51b815260206004820152601760248201527f636f6e747261637420697320696e697469616c697a656400000000000000000060448201526064016105e7565b6001600160a01b03831661066a5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166106915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166106b85760405163d92e233d60e01b815260040160405180910390fd5b600680546001600160a01b03199081166001600160a01b03868116919091179092556005805460078054909316858516179092556001600160a81b0319909116610100858416810260ff1916919091176001179182905560405163055f3aef60e41b81523360048201529104909116906355f3aef0906024015b5f604051808303815f87803b158015610749575f80fd5b505af115801561075b573d5f803e3d5ffd5b50505050505050565b6001600160a01b0382165f908152600d6020908152604080832060ff851684529091528120600181015442101561079e575f915050610572565b806002015442106107b157549050610572565b5f62278d008260030154426107c691906126ea565b6107d091906126fd565b90505f8260040154826107e3919061271c565b90505f8184600501546107f69190612733565b84549091508111610807578061080a565b83545b979650505050505050565b6108226276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190612746565b60200151118061091c57506108a86276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156108f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109169190612746565b60800151115b80610940575061092f6276a700426126ea565b335f908152600c6020526040902054115b61095c5760405162461bcd60e51b81526004016105e7906127b4565b61096962278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156109b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d79190612746565b60200151106109f85760405162461bcd60e51b81526004016105e790612803565b60055460ff16610a1a5760405162461bcd60e51b81526004016105e790612846565b600a600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a91919061287d565b610a9b91906126fd565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015610ae5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b099190612746565b5111610b765760405162461bcd60e51b815260206004820152603660248201527f75736572206e6565647320746f207374616b65206d6f726520746f6b656e7320604482015275696e20706f6f6c20746f20737461727420766f74652160501b60648201526084016105e7565b600a8054905f610b8583612894565b9091555050600a545f818152600b60205260408120600681018054336001600160a01b0319909116179055428155600181019190915560058101805462010000600160d01b031916600160301b6001600160a01b0388160265ffffffff00001916176201000060e087901c0217905560078101610c0284826128f9565b5060055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b158015610c49575f80fd5b505af1158015610c5b573d5f803e3d5ffd5b5050505060058101548154604080518581526020810192909252600160301b9092046001600160a01b03169133917f051ad8ea8e4ecc8df043e36af935557864d2a8fd8f3c527a89c2ee91aa0a0b99910160405180910390a35050505050565b5f33610cc8858285611dad565b610cd3858585611e29565b506001949350505050565b6007546001600160a01b03163314610d305760405162461bcd60e51b815260206004820152601560248201527413db9b1e481d995cdd1a5b99c818dbdb9d1c9858dd605a1b60448201526064016105e7565b6001600160a01b038516610d865760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e766573746f722061646472657373000000000000000060448201526064016105e7565b5f82610d958662278d0061271c565b610d9f91906126fd565b90506040518060e001604052808681526020018342610dbe9190612733565b815260200184610dce8542612733565b610dd89190612733565b8152602001610de78442612733565b81526020808201939093525f604080830182905260ff97881660609384018190526001600160a01b03909a16808352600d86528183208b8452865281832085518155858701516001808301919091558684015160028301559486015160038201556080860151600482015560a0860151600582015560c09095015160069095018054958a1660ff1990961695909517909455928152600e8452918220805491820181558252908290209181049091018054601f9092166101000a96870296909402191694909417909155505050565b60055460ff16610ed85760405162461bcd60e51b81526004016105e790612846565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f4b5760405162461bcd60e51b815260206004820152601860248201527763616e206f6e6c792062652063616c6c206279207465616d60401b60448201526064016105e7565b60085469152d02c7e14af6800000905f9015610f82576201518060085442610f7391906126ea565b610f7d91906126fd565b610f85565b60015b9050805f03610fd65760405162461bcd60e51b815260206004820152601a60248201527f6e756d626572206f6620646179732063616e6e6f74206265203000000000000060448201526064016105e7565b5f610fe1828461271c565b90506a3b8e97d229a2d54800000081600954610ffd9190612733565b111561104b5760405162461bcd60e51b815260206004820152601d60248201527f4461696c79206d696e7420636170206f662037324d207265616368656400000060448201526064016105e7565b600654611074906001600160a01b031661106f8469130ee8e717904440000061271c565b611e86565b6110ac7f000000000000000000000000000000000000000000000000000000000000000061106f8469021e19e0c9bab240000061271c565b8060095f8282546110bd9190612733565b90915550504260085560055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef090602401610732565b600b6020525f9081526040902080546001820154600283015460038401546004850154600586015460068701546007880180549798969795969495939460ff8085169561010086049091169462010000810460e01b946001600160a01b03600160301b909204821694911692916111709061269e565b80601f016020809104026020016040519081016040528092919081815260200182805461119c9061269e565b80156111e75780601f106111be576101008083540402835291602001916111e7565b820191905f5260205f20905b8154815290600101906020018083116111ca57829003601f168201915b505050505090508b565b6060600480546104de9061269e565b600e602052815f5260405f208181548110611219575f80fd5b905f5260205f209060209182820401919006915091509054906101000a900460ff1681565b5f3361056c818585611e29565b6112586276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156112a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c69190612746565b60200151118061135257506112de6276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611328573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134c9190612746565b60800151115b8061137657506113656276a700426126ea565b335f908152600c6020526040902054115b6113925760405162461bcd60e51b81526004016105e7906127b4565b61139f62278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156113e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140d9190612746565b602001511061142e5760405162461bcd60e51b81526004016105e790612803565b60055460ff166114505760405162461bcd60e51b81526004016105e790612846565b82600a548111156114995760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016105e7565b5f848152600b602052604090206001810154156114f85760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c69656400000060448201526064016105e7565b335f90815260088201602052604090205460ff16156115595760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f746564000000000000000060448201526064016105e7565b335f9081526008820160205260409020805460ff1916600117905582156115a657335f90815260208190526040902054816004015f82825461159b9190612733565b909155506115f49050565b83156115cd57335f90815260208190526040902054816002015f82825461159b9190612733565b335f90815260208190526040902054816003015f8282546115ee9190612733565b90915550505b60055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b15801561163a575f80fd5b505af115801561164c573d5f803e3d5ffd5b5050335f818152600c602052604090819020429055519092507f4d99b957a2bc29a30ebd96a7be8e68fe50a3c701db28a91436490b7d53870ca491506116959088815260200190565b60405180910390a25050505050565b6001600160a01b0381165f908152600e602090815260409182902080548351818402810184019094528084526060939283018282801561171e57602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116116ef5790505b50505050509050919050565b6117376276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a59190612746565b60200151118061183157506117bd6276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b9190612746565b60800151115b8061185557506118446276a700426126ea565b335f908152600c6020526040902054115b6118715760405162461bcd60e51b81526004016105e7906127b4565b61187e62278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156118c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ec9190612746565b602001511061190d5760405162461bcd60e51b81526004016105e790612803565b60055460ff1661192f5760405162461bcd60e51b81526004016105e790612846565b80600a548111156119785760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016105e7565b5f600b5f8481526020019081526020015f2090506004600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a03919061287d565b611a0e90600361271c565b611a1891906126fd565b816004015482600301548360020154611a319190612733565b611a3b9190612733565b11611a885760405162461bcd60e51b815260206004820152601e60248201527f373525206f6620706f6f6c20686173206e6f7420766f7465642079657421000060448201526064016105e7565b600181015415611ada5760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c69656400000060448201526064016105e7565b80546202a300908190611aed90426126ea565b11611b3a5760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c61707365640060448201526064016105e7565b6064600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb1919061287d565b611bbc90603361271c565b611bc691906126fd565b82600201541115611ccd5760058201805461ff00191661010017908190556040516001600160a01b03600160301b830416915f916060918491611c1a9162010000900460e01b9060078901906020016129b5565b60408051601f1981840301815290829052611c3491612a3f565b5f604051808303815f865af19150503d805f8114611c6d576040519150601f19603f3d011682016040523d82523d5f602084013e611c72565b606091505b50909250905081611cc55760405162461bcd60e51b815260206004820152601f60248201527f6572726f722072756e6e696e67205f64657374696e6174696f6e2e63616c6c0060448201526064016105e7565b505050611cdb565b60058201805461ff00191690555b60058281018054600160ff19909116811790915542908401555460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b158015611d38575f80fd5b505af1158015611d4a573d5f803e3d5ffd5b5050505060058201546040805133815261010090920460ff16151560208301527fcf14d83e651a18657ecc54742c6e7324301a9896f75e7b952281867cad5947b2910160405180910390a150505050565b611da88383836001611ebe565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015611e235781811015611e1557604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105e7565b611e2384848484035f611ebe565b50505050565b6001600160a01b038316611e5257604051634b637e8f60e11b81525f60048201526024016105e7565b6001600160a01b038216611e7b5760405163ec442f0560e01b81525f60048201526024016105e7565b611da8838383611f90565b6001600160a01b038216611eaf5760405163ec442f0560e01b81525f60048201526024016105e7565b611eba5f8383611f90565b5050565b6001600160a01b038416611ee75760405163e602df0560e01b81525f60048201526024016105e7565b6001600160a01b038316611f1057604051634a1406b160e11b81525f60048201526024016105e7565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611e2357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f8291815260200190565b60405180910390a350505050565b6001600160a01b03831615801590611fb657506007546001600160a01b03848116911614155b15612163576001600160a01b0383165f908152600e6020526040812080548291901561215f575f5b81548110156120b4576001600160a01b0387165f908152600d602052604081208354829085908590811061201457612014612a5a565b5f91825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060018101549091504210612092576120858884848154811061206257612062612a5a565b905f5260205f2090602091828204019190069054906101000a900460ff16610764565b61208f9086612733565b94505b805461209e9085612733565b93505080806120ac90612894565b915050611fde565b506001600160a01b0386165f9081526020819052604081205483106120d9575f612102565b826120f8886001600160a01b03165f9081526020819052604090205490565b61210291906126ea565b905061210e8482612733565b85111561215d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320617661696c61626c6520746f6b656e730060448201526064016105e7565b505b5050505b611da88383836001600160a01b038316612193578060025f8282546121889190612733565b909155506122039050565b6001600160a01b0383165f90815260208190526040902054818110156121e55760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105e7565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661221f5760028054829003905561223d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161228291815260200190565b60405180910390a3505050565b5f5b838110156122a9578181015183820152602001612291565b50505f910152565b5f81518084526122c881602086016020860161228f565b601f01601f19169290920160200192915050565b602081525f6122ee60208301846122b1565b9392505050565b80356001600160a01b038116811461230b575f80fd5b919050565b5f8060408385031215612321575f80fd5b61232a836122f5565b946020939093013593505050565b5f805f6060848603121561234a575f80fd5b612353846122f5565b9250612361602085016122f5565b915061236f604085016122f5565b90509250925092565b803560ff8116811461230b575f80fd5b5f8060408385031215612399575f80fd5b6123a2836122f5565b91506123b060208401612378565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123f6576123f66123b9565b604052919050565b5f805f60608486031215612410575f80fd5b612419846122f5565b92506020848101356001600160e01b031981168114612436575f80fd5b9250604085013567ffffffffffffffff80821115612452575f80fd5b818701915087601f830112612465575f80fd5b813581811115612477576124776123b9565b612489601f8201601f191685016123cd565b9150808252888482850101111561249e575f80fd5b80848401858401375f848284010152508093505050509250925092565b5f805f606084860312156124cd575f80fd5b6124d6846122f5565b92506124e4602085016122f5565b9150604084013590509250925092565b5f60208284031215612504575f80fd5b6122ee826122f5565b5f805f805f60a08688031215612521575f80fd5b61252a866122f5565b94506020860135935061253f60408701612378565b94979396509394606081013594506080013592915050565b5f60208284031215612567575f80fd5b5035919050565b8b8152602081018b9052604081018a9052606081018990526080810188905286151560a082015285151560c08201526001600160e01b0319851660e08201526001600160a01b03848116610100830152831661012082015261016061014082018190525f906125df838201856122b1565b9e9d5050505050505050505050505050565b5f8060408385031215612602575f80fd5b61260b836122f5565b91506123b0602084016122f5565b8035801515811461230b575f80fd5b5f805f6060848603121561263a575f80fd5b8335925061264a60208501612619565b915061236f60408501612619565b602080825282518282018190525f9190848201906040850190845b8181101561269257835160ff1683529284019291840191600101612673565b50909695505050505050565b600181811c908216806126b257607f821691505b6020821081036126d057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610572576105726126d6565b5f8261271757634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610572576105726126d6565b80820180821115610572576105726126d6565b5f60a08284031215612756575f80fd5b60405160a0810181811067ffffffffffffffff82111715612779576127796123b9565b806040525082518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6020808252602f908201527f7374616b6520697320696e6163746976652c206861736e2774206265656e207560408201526e73656420696e2033206d6f6e74687360881b606082015260800190565b60208082526023908201527f7374616b65206d757374206265206174206c656173742033302064617973206f6040820152626c642160e81b606082015260800190565b6020808252601b908201527f636f6e7472616374206973206e6f7420696e697469616c697a65640000000000604082015260600190565b5f6020828403121561288d575f80fd5b5051919050565b5f600182016128a5576128a56126d6565b5060010190565b601f821115611da8575f81815260208120601f850160051c810160208610156128d25750805b601f850160051c820191505b818110156128f1578281556001016128de565b505050505050565b815167ffffffffffffffff811115612913576129136123b9565b61292781612921845461269e565b846128ac565b602080601f83116001811461295a575f84156129435750858301515b5f19600386901b1c1916600185901b1785556128f1565b5f85815260208120601f198616915b8281101561298857888601518255948401946001909101908401612969565b50858210156129a557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b63ffffffff60e01b831681525f60045f84546129d08161269e565b600182811680156129e85760018114612a0157612a31565b60ff198416888701528215158302880186019450612a31565b885f526020805f205f5b85811015612a265781548b82018a0152908401908201612a0b565b505050858389010194505b509298975050505050505050565b5f8251612a5081846020870161228f565b9190910192915050565b634e487b7160e01b5f52603260045260245ffdfea26469706673582212202580937392a59bc8ec84304a81f772f4e9b590e849da544b9e703352c16e776864736f6c63430008140033000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c183

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101bb575f3560e01c80638494ff35116100f3578063c638407111610093578063df133bca1161006e578063df133bca14610480578063e1c95ce214610493578063e57b283b146104b3578063f98a4eca146104bc575f80fd5b8063c638407114610420578063dd62ed3e14610429578063de1cf4ad14610461575f80fd5b806395d89b41116100ce57806395d89b41146103df5780639e3f8e90146103e7578063a9059cbb146103fa578063acc2166a1461040d575f80fd5b80638494ff351461038557806385f2aef2146103af5780638e80ff5d146103d6575f80fd5b806323b872dd1161015e57806370a082311161013957806370a0823114610330578063754cd90414610358578063785946f41461036b578063848465e314610373575f80fd5b806323b872dd146102dd578063313ce567146102f05780635e6f604514610305575f80fd5b8063184b955911610199578063184b9559146102125780631a8b1250146102275780631bcf8d631461023a5780631d7ce898146102ca575f80fd5b806306fdde03146101bf578063095ea7b3146101dd57806318160ddd14610200575b5f80fd5b6101c76104cf565b6040516101d491906122dc565b60405180910390f35b6101f06101eb366004612310565b61055f565b60405190151581526020016101d4565b6002545b6040519081526020016101d4565b610225610220366004612338565b610578565b005b610204610235366004612388565b610764565b610292610248366004612388565b600d60209081525f92835260408084209091529082529020805460018201546002830154600384015460048501546005860154600690960154949593949293919290919060ff1687565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260ff1660c082015260e0016101d4565b6102256102d83660046123fe565b610815565b6101f06102eb3660046124bb565b610cbb565b60125b60405160ff90911681526020016101d4565b600754610318906001600160a01b031681565b6040516001600160a01b0390911681526020016101d4565b61020461033e3660046124f4565b6001600160a01b03165f9081526020819052604090205490565b61022561036636600461250d565b610cde565b610225610eb6565b6102046a3b8e97d229a2d54800000081565b610398610393366004612557565b6110fa565b6040516101d49b9a9998979695949392919061256e565b6103187f000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c18381565b61020460085481565b6101c76111f1565b6102f36103f5366004612310565b611200565b6101f0610408366004612310565b61123e565b600654610318906001600160a01b031681565b610204600a5481565b6102046104373660046125f1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61020461046f3660046124f4565b600c6020525f908152604090205481565b61022561048e366004612628565b61124b565b6104a66104a13660046124f4565b6116a4565b6040516101d49190612658565b61020460095481565b6102256104ca366004612557565b61172a565b6060600380546104de9061269e565b80601f016020809104026020016040519081016040528092919081815260200182805461050a9061269e565b80156105555780601f1061052c57610100808354040283529160200191610555565b820191905f5260205f20905b81548152906001019060200180831161053857829003601f168201915b5050505050905090565b5f3361056c818585611d9b565b60019150505b92915050565b336001600160a01b037f000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c18316146105f05760405162461bcd60e51b815260206004820152601860248201527763616e206f6e6c792062652063616c6c206279207465616d60401b60448201526064015b60405180910390fd5b60055460ff16156106435760405162461bcd60e51b815260206004820152601760248201527f636f6e747261637420697320696e697469616c697a656400000000000000000060448201526064016105e7565b6001600160a01b03831661066a5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166106915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166106b85760405163d92e233d60e01b815260040160405180910390fd5b600680546001600160a01b03199081166001600160a01b03868116919091179092556005805460078054909316858516179092556001600160a81b0319909116610100858416810260ff1916919091176001179182905560405163055f3aef60e41b81523360048201529104909116906355f3aef0906024015b5f604051808303815f87803b158015610749575f80fd5b505af115801561075b573d5f803e3d5ffd5b50505050505050565b6001600160a01b0382165f908152600d6020908152604080832060ff851684529091528120600181015442101561079e575f915050610572565b806002015442106107b157549050610572565b5f62278d008260030154426107c691906126ea565b6107d091906126fd565b90505f8260040154826107e3919061271c565b90505f8184600501546107f69190612733565b84549091508111610807578061080a565b83545b979650505050505050565b6108226276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190612746565b60200151118061091c57506108a86276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156108f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109169190612746565b60800151115b80610940575061092f6276a700426126ea565b335f908152600c6020526040902054115b61095c5760405162461bcd60e51b81526004016105e7906127b4565b61096962278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156109b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d79190612746565b60200151106109f85760405162461bcd60e51b81526004016105e790612803565b60055460ff16610a1a5760405162461bcd60e51b81526004016105e790612846565b600a600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a91919061287d565b610a9b91906126fd565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015610ae5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b099190612746565b5111610b765760405162461bcd60e51b815260206004820152603660248201527f75736572206e6565647320746f207374616b65206d6f726520746f6b656e7320604482015275696e20706f6f6c20746f20737461727420766f74652160501b60648201526084016105e7565b600a8054905f610b8583612894565b9091555050600a545f818152600b60205260408120600681018054336001600160a01b0319909116179055428155600181019190915560058101805462010000600160d01b031916600160301b6001600160a01b0388160265ffffffff00001916176201000060e087901c0217905560078101610c0284826128f9565b5060055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b158015610c49575f80fd5b505af1158015610c5b573d5f803e3d5ffd5b5050505060058101548154604080518581526020810192909252600160301b9092046001600160a01b03169133917f051ad8ea8e4ecc8df043e36af935557864d2a8fd8f3c527a89c2ee91aa0a0b99910160405180910390a35050505050565b5f33610cc8858285611dad565b610cd3858585611e29565b506001949350505050565b6007546001600160a01b03163314610d305760405162461bcd60e51b815260206004820152601560248201527413db9b1e481d995cdd1a5b99c818dbdb9d1c9858dd605a1b60448201526064016105e7565b6001600160a01b038516610d865760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e766573746f722061646472657373000000000000000060448201526064016105e7565b5f82610d958662278d0061271c565b610d9f91906126fd565b90506040518060e001604052808681526020018342610dbe9190612733565b815260200184610dce8542612733565b610dd89190612733565b8152602001610de78442612733565b81526020808201939093525f604080830182905260ff97881660609384018190526001600160a01b03909a16808352600d86528183208b8452865281832085518155858701516001808301919091558684015160028301559486015160038201556080860151600482015560a0860151600582015560c09095015160069095018054958a1660ff1990961695909517909455928152600e8452918220805491820181558252908290209181049091018054601f9092166101000a96870296909402191694909417909155505050565b60055460ff16610ed85760405162461bcd60e51b81526004016105e790612846565b336001600160a01b037f000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c1831614610f4b5760405162461bcd60e51b815260206004820152601860248201527763616e206f6e6c792062652063616c6c206279207465616d60401b60448201526064016105e7565b60085469152d02c7e14af6800000905f9015610f82576201518060085442610f7391906126ea565b610f7d91906126fd565b610f85565b60015b9050805f03610fd65760405162461bcd60e51b815260206004820152601a60248201527f6e756d626572206f6620646179732063616e6e6f74206265203000000000000060448201526064016105e7565b5f610fe1828461271c565b90506a3b8e97d229a2d54800000081600954610ffd9190612733565b111561104b5760405162461bcd60e51b815260206004820152601d60248201527f4461696c79206d696e7420636170206f662037324d207265616368656400000060448201526064016105e7565b600654611074906001600160a01b031661106f8469130ee8e717904440000061271c565b611e86565b6110ac7f000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c18361106f8469021e19e0c9bab240000061271c565b8060095f8282546110bd9190612733565b90915550504260085560055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef090602401610732565b600b6020525f9081526040902080546001820154600283015460038401546004850154600586015460068701546007880180549798969795969495939460ff8085169561010086049091169462010000810460e01b946001600160a01b03600160301b909204821694911692916111709061269e565b80601f016020809104026020016040519081016040528092919081815260200182805461119c9061269e565b80156111e75780601f106111be576101008083540402835291602001916111e7565b820191905f5260205f20905b8154815290600101906020018083116111ca57829003601f168201915b505050505090508b565b6060600480546104de9061269e565b600e602052815f5260405f208181548110611219575f80fd5b905f5260205f209060209182820401919006915091509054906101000a900460ff1681565b5f3361056c818585611e29565b6112586276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156112a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c69190612746565b60200151118061135257506112de6276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611328573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134c9190612746565b60800151115b8061137657506113656276a700426126ea565b335f908152600c6020526040902054115b6113925760405162461bcd60e51b81526004016105e7906127b4565b61139f62278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156113e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140d9190612746565b602001511061142e5760405162461bcd60e51b81526004016105e790612803565b60055460ff166114505760405162461bcd60e51b81526004016105e790612846565b82600a548111156114995760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016105e7565b5f848152600b602052604090206001810154156114f85760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c69656400000060448201526064016105e7565b335f90815260088201602052604090205460ff16156115595760405162461bcd60e51b815260206004820152601860248201527f53656e6465722068617320616c726561647920766f746564000000000000000060448201526064016105e7565b335f9081526008820160205260409020805460ff1916600117905582156115a657335f90815260208190526040902054816004015f82825461159b9190612733565b909155506115f49050565b83156115cd57335f90815260208190526040902054816002015f82825461159b9190612733565b335f90815260208190526040902054816003015f8282546115ee9190612733565b90915550505b60055460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b15801561163a575f80fd5b505af115801561164c573d5f803e3d5ffd5b5050335f818152600c602052604090819020429055519092507f4d99b957a2bc29a30ebd96a7be8e68fe50a3c701db28a91436490b7d53870ca491506116959088815260200190565b60405180910390a25050505050565b6001600160a01b0381165f908152600e602090815260409182902080548351818402810184019094528084526060939283018282801561171e57602002820191905f5260205f20905f905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116116ef5790505b50505050509050919050565b6117376276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a59190612746565b60200151118061183157506117bd6276a700426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b9190612746565b60800151115b8061185557506118446276a700426126ea565b335f908152600c6020526040902054115b6118715760405162461bcd60e51b81526004016105e7906127b4565b61187e62278d00426126ea565b6005546040516304152a0960e21b81523360048201526101009091046001600160a01b031690631054a8249060240160a060405180830381865afa1580156118c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ec9190612746565b602001511061190d5760405162461bcd60e51b81526004016105e790612803565b60055460ff1661192f5760405162461bcd60e51b81526004016105e790612846565b80600a548111156119785760405162461bcd60e51b8152602060048201526013602482015272159bdd1948191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016105e7565b5f600b5f8481526020019081526020015f2090506004600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a03919061287d565b611a0e90600361271c565b611a1891906126fd565b816004015482600301548360020154611a319190612733565b611a3b9190612733565b11611a885760405162461bcd60e51b815260206004820152601e60248201527f373525206f6620706f6f6c20686173206e6f7420766f7465642079657421000060448201526064016105e7565b600181015415611ada5760405162461bcd60e51b815260206004820152601d60248201527f566f74652068617320616c7265616479206265656e2074616c6c69656400000060448201526064016105e7565b80546202a300908190611aed90426126ea565b11611b3a5760405162461bcd60e51b815260206004820152601f60248201527f54696d6520666f7220766f74696e6720686173206e6f7420656c61707365640060448201526064016105e7565b6064600560019054906101000a90046001600160a01b03166001600160a01b0316638bf7dd306040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb1919061287d565b611bbc90603361271c565b611bc691906126fd565b82600201541115611ccd5760058201805461ff00191661010017908190556040516001600160a01b03600160301b830416915f916060918491611c1a9162010000900460e01b9060078901906020016129b5565b60408051601f1981840301815290829052611c3491612a3f565b5f604051808303815f865af19150503d805f8114611c6d576040519150601f19603f3d011682016040523d82523d5f602084013e611c72565b606091505b50909250905081611cc55760405162461bcd60e51b815260206004820152601f60248201527f6572726f722072756e6e696e67205f64657374696e6174696f6e2e63616c6c0060448201526064016105e7565b505050611cdb565b60058201805461ff00191690555b60058281018054600160ff19909116811790915542908401555460405163055f3aef60e41b81523360048201526101009091046001600160a01b0316906355f3aef0906024015f604051808303815f87803b158015611d38575f80fd5b505af1158015611d4a573d5f803e3d5ffd5b5050505060058201546040805133815261010090920460ff16151560208301527fcf14d83e651a18657ecc54742c6e7324301a9896f75e7b952281867cad5947b2910160405180910390a150505050565b611da88383836001611ebe565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015611e235781811015611e1557604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105e7565b611e2384848484035f611ebe565b50505050565b6001600160a01b038316611e5257604051634b637e8f60e11b81525f60048201526024016105e7565b6001600160a01b038216611e7b5760405163ec442f0560e01b81525f60048201526024016105e7565b611da8838383611f90565b6001600160a01b038216611eaf5760405163ec442f0560e01b81525f60048201526024016105e7565b611eba5f8383611f90565b5050565b6001600160a01b038416611ee75760405163e602df0560e01b81525f60048201526024016105e7565b6001600160a01b038316611f1057604051634a1406b160e11b81525f60048201526024016105e7565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611e2357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f8291815260200190565b60405180910390a350505050565b6001600160a01b03831615801590611fb657506007546001600160a01b03848116911614155b15612163576001600160a01b0383165f908152600e6020526040812080548291901561215f575f5b81548110156120b4576001600160a01b0387165f908152600d602052604081208354829085908590811061201457612014612a5a565b5f91825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060018101549091504210612092576120858884848154811061206257612062612a5a565b905f5260205f2090602091828204019190069054906101000a900460ff16610764565b61208f9086612733565b94505b805461209e9085612733565b93505080806120ac90612894565b915050611fde565b506001600160a01b0386165f9081526020819052604081205483106120d9575f612102565b826120f8886001600160a01b03165f9081526020819052604090205490565b61210291906126ea565b905061210e8482612733565b85111561215d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206578636565647320617661696c61626c6520746f6b656e730060448201526064016105e7565b505b5050505b611da88383836001600160a01b038316612193578060025f8282546121889190612733565b909155506122039050565b6001600160a01b0383165f90815260208190526040902054818110156121e55760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105e7565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661221f5760028054829003905561223d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161228291815260200190565b60405180910390a3505050565b5f5b838110156122a9578181015183820152602001612291565b50505f910152565b5f81518084526122c881602086016020860161228f565b601f01601f19169290920160200192915050565b602081525f6122ee60208301846122b1565b9392505050565b80356001600160a01b038116811461230b575f80fd5b919050565b5f8060408385031215612321575f80fd5b61232a836122f5565b946020939093013593505050565b5f805f6060848603121561234a575f80fd5b612353846122f5565b9250612361602085016122f5565b915061236f604085016122f5565b90509250925092565b803560ff8116811461230b575f80fd5b5f8060408385031215612399575f80fd5b6123a2836122f5565b91506123b060208401612378565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123f6576123f66123b9565b604052919050565b5f805f60608486031215612410575f80fd5b612419846122f5565b92506020848101356001600160e01b031981168114612436575f80fd5b9250604085013567ffffffffffffffff80821115612452575f80fd5b818701915087601f830112612465575f80fd5b813581811115612477576124776123b9565b612489601f8201601f191685016123cd565b9150808252888482850101111561249e575f80fd5b80848401858401375f848284010152508093505050509250925092565b5f805f606084860312156124cd575f80fd5b6124d6846122f5565b92506124e4602085016122f5565b9150604084013590509250925092565b5f60208284031215612504575f80fd5b6122ee826122f5565b5f805f805f60a08688031215612521575f80fd5b61252a866122f5565b94506020860135935061253f60408701612378565b94979396509394606081013594506080013592915050565b5f60208284031215612567575f80fd5b5035919050565b8b8152602081018b9052604081018a9052606081018990526080810188905286151560a082015285151560c08201526001600160e01b0319851660e08201526001600160a01b03848116610100830152831661012082015261016061014082018190525f906125df838201856122b1565b9e9d5050505050505050505050505050565b5f8060408385031215612602575f80fd5b61260b836122f5565b91506123b0602084016122f5565b8035801515811461230b575f80fd5b5f805f6060848603121561263a575f80fd5b8335925061264a60208501612619565b915061236f60408501612619565b602080825282518282018190525f9190848201906040850190845b8181101561269257835160ff1683529284019291840191600101612673565b50909695505050505050565b600181811c908216806126b257607f821691505b6020821081036126d057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610572576105726126d6565b5f8261271757634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610572576105726126d6565b80820180821115610572576105726126d6565b5f60a08284031215612756575f80fd5b60405160a0810181811067ffffffffffffffff82111715612779576127796123b9565b806040525082518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6020808252602f908201527f7374616b6520697320696e6163746976652c206861736e2774206265656e207560408201526e73656420696e2033206d6f6e74687360881b606082015260800190565b60208082526023908201527f7374616b65206d757374206265206174206c656173742033302064617973206f6040820152626c642160e81b606082015260800190565b6020808252601b908201527f636f6e7472616374206973206e6f7420696e697469616c697a65640000000000604082015260600190565b5f6020828403121561288d575f80fd5b5051919050565b5f600182016128a5576128a56126d6565b5060010190565b601f821115611da8575f81815260208120601f850160051c810160208610156128d25750805b601f850160051c820191505b818110156128f1578281556001016128de565b505050505050565b815167ffffffffffffffff811115612913576129136123b9565b61292781612921845461269e565b846128ac565b602080601f83116001811461295a575f84156129435750858301515b5f19600386901b1c1916600185901b1785556128f1565b5f85815260208120601f198616915b8281101561298857888601518255948401946001909101908401612969565b50858210156129a557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b63ffffffff60e01b831681525f60045f84546129d08161269e565b600182811680156129e85760018114612a0157612a31565b60ff198416888701528215158302880186019450612a31565b885f526020805f205f5b85811015612a265781548b82018a0152908401908201612a0b565b505050858389010194505b509298975050505050505050565b5f8251612a5081846020870161228f565b9190910192915050565b634e487b7160e01b5f52603260045260245ffdfea26469706673582212202580937392a59bc8ec84304a81f772f4e9b590e849da544b9e703352c16e776864736f6c63430008140033

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

000000000000000000000000eaf6d204ef480fee9d1f5c62d15becf6a2c3c183

-----Decoded View---------------
Arg [0] : _team (address): 0xeAf6D204EF480fEE9D1f5C62d15BEcF6A2C3c183

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


Deployed Bytecode Sourcemap

27772:11006:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13036:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15329:190;;;;;;:::i;:::-;;:::i;:::-;;;1372:14:1;;1365:22;1347:41;;1335:2;1320:18;15329:190:0;1207:187:1;14138:99:0;14217:12;;14138:99;;;1545:25:1;;;1533:2;1518:18;14138:99:0;1399:177:1;31424:700:0;;;;;;:::i;:::-;;:::i;:::-;;30657:759;;;;;;:::i;:::-;;:::i;28916:86::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2653:25:1;;;2709:2;2694:18;;2687:34;;;;2737:18;;;2730:34;;;;2795:2;2780:18;;2773:34;;;;2838:3;2823:19;;2816:35;2882:3;2867:19;;2860:35;2944:4;2932:17;2926:3;2911:19;;2904:46;2640:3;2625:19;28916:86:0;2342:614:1;33123:976:0;;;;;;:::i;:::-;;:::i;16129:249::-;;;;;;:::i;:::-;;:::i;13989:84::-;14063:2;13989:84;;;4894:4:1;4882:17;;;4864:36;;4852:2;4837:18;13989:84:0;4722:184:1;27977:30:0;;;;;-1:-1:-1;;;;;27977:30:0;;;;;;-1:-1:-1;;;;;5075:32:1;;;5057:51;;5045:2;5030:18;27977:30:0;4911:203:1;14300:118:0;;;;;;:::i;:::-;-1:-1:-1;;;;;14392:18:0;14365:7;14392:18;;;;;;;;;;;;14300:118;36442:877;;;;;;:::i;:::-;;:::i;32186:878::-;;;:::i;28097:46::-;;28138:5;28097:46;;28810:40;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;27941:29::-;;;;;28016:36;;;;;;13246:95;;;:::i;29009:48::-;;;;;;:::i;:::-;;:::i;14623:182::-;;;;;;:::i;:::-;;:::i;27902:32::-;;;;;-1:-1:-1;;;;;27902:32:0;;;28150:24;;;;;;14868:142;;;;;;:::i;:::-;-1:-1:-1;;;;;14975:18:0;;;14948:7;14975:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14868:142;28857:52;;;;;;:::i;:::-;;;;;;;;;;;;;;35610:824;;;;;;:::i;:::-;;:::i;37327:147::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28059:31::-;;;;;;34107:1495;;;;;;:::i;:::-;;:::i;13036:91::-;13081:13;13114:5;13107:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13036:91;:::o;15329:190::-;15402:4;4416:10;15458:31;4416:10;15474:7;15483:5;15458:8;:31::i;:::-;15507:4;15500:11;;;15329:190;;;;;:::o;31424:700::-;30268:10;-1:-1:-1;;;;;30282:4:0;30268:18;;30260:55;;;;-1:-1:-1;;;30260:55:0;;9009:2:1;30260:55:0;;;8991:21:1;9048:2;9028:18;;;9021:30;-1:-1:-1;;;9067:18:1;;;9060:54;9131:18;;30260:55:0;;;;;;;;;31600:11:::1;::::0;::::1;;31599:12;31591:48;;;::::0;-1:-1:-1;;;31591:48:0;;9362:2:1;31591:48:0::1;::::0;::::1;9344:21:1::0;9401:2;9381:18;;;9374:30;9440:25;9420:18;;;9413:53;9483:18;;31591:48:0::1;9160:347:1::0;31591:48:0::1;-1:-1:-1::0;;;;;31654:38:0;::::1;31650:64;;31701:13;;-1:-1:-1::0;;;31701:13:0::1;;;;;;;;;;;31650:64;-1:-1:-1::0;;;;;31729:36:0;::::1;31725:62;;31774:13;;-1:-1:-1::0;;;31774:13:0::1;;;;;;;;;;;31725:62;-1:-1:-1::0;;;;;31802:28:0;::::1;31798:54;;31839:13;;-1:-1:-1::0;;;31839:13:0::1;;;;;;;;;;;31798:54;31865:17;:44:::0;;-1:-1:-1;;;;;;31865:44:0;;::::1;-1:-1:-1::0;;;;;31865:44:0;;::::1;::::0;;;::::1;::::0;;;31920:15:::1;:58:::0;;31989:15:::1;:32:::0;;;;::::1;::::0;;::::1;;::::0;;;-1:-1:-1;;;;;;32032:18:0;;;31865:44:::1;31920:58:::0;;::::1;::::0;::::1;-1:-1:-1::0;;32032:18:0;;;;;-1:-1:-1;32032:18:0::1;::::0;;;;32063:53:::1;::::0;-1:-1:-1;;;32063:53:0;;32105:10:::1;32063:53;::::0;::::1;5057:51:1::0;32063:15:0;::::1;::::0;;::::1;::::0;:41:::1;::::0;5030:18:1;;32063:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31424:700:::0;;;:::o;30657:759::-;-1:-1:-1;;;;;30826:25:0;;30771:7;30826:25;;;:16;:25;;;;;;;;:36;;;;;;;;;;30897:17;;;;30879:15;:35;30875:49;;;30923:1;30916:8;;;;;30875:49;30958:8;:19;;;30939:15;:38;30935:71;;30986:20;;-1:-1:-1;30979:27:0;;30935:71;31019:28;31108:7;31082:8;:22;;;31051:15;:53;;;;:::i;:::-;31050:65;;;;:::i;:::-;31019:96;;31126:23;31175:8;:22;;;31152:20;:45;;;;:::i;:::-;31126:71;;31208:19;31255:15;31230:8;:22;;;:40;;;;:::i;:::-;31317:20;;31208:62;;-1:-1:-1;31303:34:0;;:105;;31397:11;31303:105;;;31357:20;;31303:105;31283:125;30657:759;-1:-1:-1;;;;;;;30657:759:0:o;33123:976::-;29550:25;29568:7;29550:15;:25;:::i;:::-;29474:15;;:46;;-1:-1:-1;;;29474:46:0;;29509:10;29474:46;;;5057:51:1;29474:15:0;;;;-1:-1:-1;;;;;29474:15:0;;:34;;5030:18:1;;29474:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29473:264;;;-1:-1:-1;29711:25:0;29729:7;29711:15;:25;:::i;:::-;29598:15;;:68;;-1:-1:-1;;;29598:68:0;;29655:10;29598:68;;;5057:51:1;29598:15:0;;;;-1:-1:-1;;;;;29598:15:0;;:56;;5030:18:1;;29598:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:110;;;:138;29473:264;:344;;;-1:-1:-1;29791:25:0;29809:7;29791:15;:25;:::i;:::-;29777:10;29759:29;;;;:17;:29;;;;;;:57;29473:344;29451:441;;;;-1:-1:-1;;;29451:441:0;;;;;;;:::i;:::-;30003:25;30021:7;30003:15;:25;:::i;:::-;29927:15;;:46;;-1:-1:-1;;;29927:46:0;;29962:10;29927:46;;;5057:51:1;29927:15:0;;;;-1:-1:-1;;;;;29927:15:0;;:34;;5030:18:1;;29927:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29905:186;;;;-1:-1:-1;;;29905:186:0;;;;;;;:::i;:::-;30158:11:::1;::::0;::::1;;30150:51;;;;-1:-1:-1::0;;;30150:51:0::1;;;;;;;:::i;:::-;33416:2:::2;33377:15;;;;;;;;;-1:-1:-1::0;;;;;33377:15:0::2;-1:-1:-1::0;;;;;33377:34:0::2;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;33304:15;::::0;:46:::2;::::0;-1:-1:-1;;;33304:46:0;;33339:10:::2;33304:46;::::0;::::2;5057:51:1::0;33304:15:0::2;::::0;;::::2;-1:-1:-1::0;;;;;33304:15:0::2;::::0;:34:::2;::::0;5030:18:1;;33304:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53:::0;:114:::2;33282:218;;;::::0;-1:-1:-1;;;33282:218:0;;12553:2:1;33282:218:0::2;::::0;::::2;12535:21:1::0;12592:2;12572:18;;;12565:30;12631:34;12611:18;;;12604:62;-1:-1:-1;;;12682:18:1;;;12675:52;12744:19;;33282:218:0::2;12351:418:1::0;33282:218:0::2;33513:9;:11:::0;;;:9:::2;:11;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;33552:9:0::2;::::0;33535:14:::2;33597:16:::0;;;:8:::2;:16;::::0;;;;33624:19:::2;::::0;::::2;:32:::0;;33646:10:::2;-1:-1:-1::0;;;;;;33624:32:0;;::::2;;::::0;;33689:15:::2;33667:37:::0;;-1:-1:-1;33715:19:0;::::2;:23:::0;;;;-1:-1:-1;33749:21:0;::::2;:35:::0;;-1:-1:-1;;;;;;33795:37:0;-1:-1:-1;;;;;;;;33749:35:0;::::2;;-1:-1:-1::0;;33795:37:0;;;::::2;::::0;;::::2;;;::::0;;33843:14:::2;::::0;::::2;:25;33860:8:::0;33843:14;:25:::2;:::i;:::-;-1:-1:-1::0;33881:15:0::2;::::0;:53:::2;::::0;-1:-1:-1;;;33881:53:0;;33923:10:::2;33881:53;::::0;::::2;5057:51:1::0;33881:15:0::2;::::0;;::::2;-1:-1:-1::0;;;;;33881:15:0::2;::::0;:41:::2;::::0;5030:18:1;;33881:53:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;34059:21:0::2;::::0;::::2;::::0;34025:19;;33952:139:::2;::::0;;15286:25:1;;;15342:2;15327:18;;15320:34;;;;-1:-1:-1;;;34059:21:0;;::::2;-1:-1:-1::0;;;;;34059:21:0::2;::::0;33979:10:::2;::::0;33952:139:::2;::::0;15259:18:1;33952:139:0::2;;;;;;;33271:828;;33123:976:::0;;;:::o;16129:249::-;16216:4;4416:10;16274:37;16290:4;4416:10;16305:5;16274:15;:37::i;:::-;16322:26;16332:4;16338:2;16342:5;16322:9;:26::i;:::-;-1:-1:-1;16366:4:0;;16129:249;-1:-1:-1;;;;16129:249:0:o;36442:877::-;36662:15;;-1:-1:-1;;;;;36662:15:0;36648:10;:29;36640:63;;;;-1:-1:-1;;;36640:63:0;;15567:2:1;36640:63:0;;;15549:21:1;15606:2;15586:18;;;15579:30;-1:-1:-1;;;15625:18:1;;;15618:51;15686:18;;36640:63:0;15365:345:1;36640:63:0;-1:-1:-1;;;;;36722:22:0;;36714:59;;;;-1:-1:-1;;;36714:59:0;;15917:2:1;36714:59:0;;;15899:21:1;15956:2;15936:18;;;15929:30;15995:26;15975:18;;;15968:54;16039:18;;36714:59:0;15715:348:1;36714:59:0;36786:21;36831:15;36811:16;:6;36820:7;36811:16;:::i;:::-;36810:36;;;;:::i;:::-;36786:60;;36898:362;;;;;;;;36942:6;36898:362;;;;36991:13;36973:15;:31;;;;:::i;:::-;36898:362;;;;37065:15;37031:31;37049:13;37031:15;:31;:::i;:::-;:49;;;;:::i;:::-;36898:362;;;;37110:31;37128:13;37110:15;:31;:::i;:::-;36898:362;;;;;;;;;;-1:-1:-1;36898:362:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36859:26:0;;;;;;:16;:26;;;;;:36;;;;;;;;:401;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36859:401:0;;;;;;;;;;37273:23;;;:13;:23;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;36859:401;37273:38;;;;;;;;;;;;;;;;;-1:-1:-1;;;36442:877:0:o;32186:878::-;30158:11;;;;30150:51;;;;-1:-1:-1;;;30150:51:0;;;;;;;:::i;:::-;30268:10:::1;-1:-1:-1::0;;;;;30282:4:0::1;30268:18;;30260:55;;;::::0;-1:-1:-1;;;30260:55:0;;9009:2:1;30260:55:0::1;::::0;::::1;8991:21:1::0;9048:2;9028:18;;;9021:30;-1:-1:-1;;;9067:18:1;;;9060:54;9131:18;;30260:55:0::1;8807:348:1::0;30260:55:0::1;32304:17:::2;::::0;32271:4:::2;::::0;32245:23:::2;::::0;32304:22;:101:::2;;32399:6;32378:17;;32360:15;:35;;;;:::i;:::-;32359:46;;;;:::i;:::-;32304:101;;;32342:1;32304:101;32286:119;;32426:7;32437:1;32426:12:::0;32418:51:::2;;;::::0;-1:-1:-1;;;32418:51:0;;16270:2:1;32418:51:0::2;::::0;::::2;16252:21:1::0;16309:2;16289:18;;;16282:30;16348:28;16328:18;;;16321:56;16394:18;;32418:51:0::2;16068:350:1::0;32418:51:0::2;32482:23;32508:25;32526:7:::0;32508:15;:25:::2;:::i;:::-;32482:51;;28138:5;32585:15;32566:16;;:34;;;;:::i;:::-;:52;;32544:131;;;::::0;-1:-1:-1;;;32544:131:0;;16625:2:1;32544:131:0::2;::::0;::::2;16607:21:1::0;16664:2;16644:18;;;16637:30;16703:31;16683:18;;;16676:59;16752:18;;32544:131:0::2;16423:353:1::0;32544:131:0::2;32775:17;::::0;32769:40:::2;::::0;-1:-1:-1;;;;;32775:17:0::2;32794:14;32801:7:::0;32794:4:::2;:14;:::i;:::-;32769:5;:40::i;:::-;32860:36;32874:4;32881:14;32888:7:::0;32881:4:::2;:14;:::i;32860:36::-;32929:15;32909:16;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32975:15:0::2;32955:17;:35:::0;33003:15:::2;::::0;:53:::2;::::0;-1:-1:-1;;;33003:53:0;;33045:10:::2;33003:53;::::0;::::2;5057:51:1::0;33003:15:0::2;::::0;;::::2;-1:-1:-1::0;;;;;33003:15:0::2;::::0;:41:::2;::::0;5030:18:1;;33003:53:0::2;4911:203:1::0;28810:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;28810:40:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13246:95::-;13293:13;13326:7;13319:14;;;;;:::i;29009:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14623:182::-;14692:4;4416:10;14748:27;4416:10;14765:2;14769:5;14748:9;:27::i;35610:824::-;29550:25;29568:7;29550:15;:25;:::i;:::-;29474:15;;:46;;-1:-1:-1;;;29474:46:0;;29509:10;29474:46;;;5057:51:1;29474:15:0;;;;-1:-1:-1;;;;;29474:15:0;;:34;;5030:18:1;;29474:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29473:264;;;-1:-1:-1;29711:25:0;29729:7;29711:15;:25;:::i;:::-;29598:15;;:68;;-1:-1:-1;;;29598:68:0;;29655:10;29598:68;;;5057:51:1;29598:15:0;;;;-1:-1:-1;;;;;29598:15:0;;:56;;5030:18:1;;29598:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:110;;;:138;29473:264;:344;;;-1:-1:-1;29791:25:0;29809:7;29791:15;:25;:::i;:::-;29777:10;29759:29;;;;:17;:29;;;;;;:57;29473:344;29451:441;;;;-1:-1:-1;;;29451:441:0;;;;;;;:::i;:::-;30003:25;30021:7;30003:15;:25;:::i;:::-;29927:15;;:46;;-1:-1:-1;;;29927:46:0;;29962:10;29927:46;;;5057:51:1;29927:15:0;;;;-1:-1:-1;;;;;29927:15:0;;:34;;5030:18:1;;29927:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29905:186;;;;-1:-1:-1;;;29905:186:0;;;;;;;:::i;:::-;30158:11:::1;::::0;::::1;;30150:51;;;;-1:-1:-1::0;;;30150:51:0::1;;;;;;;:::i;:::-;35753:12:::2;30420:9;;30404:12;:25;;30396:57;;;::::0;-1:-1:-1;;;30396:57:0;;16983:2:1;30396:57:0::2;::::0;::::2;16965:21:1::0;17022:2;17002:18;;;16995:30;-1:-1:-1;;;17041:18:1;;;17034:49;17100:18;;30396:57:0::2;16781:343:1::0;30396:57:0::2;35778:14:::3;35795:22:::0;;;:8:::3;:22;::::0;;;;35836:11:::3;::::0;::::3;::::0;:16;35828:58:::3;;;::::0;-1:-1:-1;;;35828:58:0;;17331:2:1;35828:58:0::3;::::0;::::3;17313:21:1::0;17370:2;17350:18;;;17343:30;17409:31;17389:18;;;17382:59;17458:18;;35828:58:0::3;17129:353:1::0;35828:58:0::3;35914:10;35906:19;::::0;;;:7:::3;::::0;::::3;:19;::::0;;;;;::::3;;35905:20;35897:57;;;::::0;-1:-1:-1;;;35897:57:0;;17689:2:1;35897:57:0::3;::::0;::::3;17671:21:1::0;17728:2;17708:18;;;17701:30;17767:26;17747:18;;;17740:54;17811:18;;35897:57:0::3;17487:348:1::0;35897:57:0::3;35975:10;35967:19;::::0;;;:7:::3;::::0;::::3;:19;::::0;;;;:26;;-1:-1:-1;;35967:26:0::3;35989:4;35967:26;::::0;;36004:250;::::3;;;36066:10;14365:7:::0;14392:18;;;;;;;;;;;36035:1:::3;:17;;;:42;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36004:250:0::3;::::0;-1:-1:-1;36004:250:0::3;;36099:10;36095:159;;;36158:10;14365:7:::0;14392:18;;;;;;;;;;;36126:1:::3;:18;;;:43;;;;;;;:::i;36095:159::-;36231:10;14365:7:::0;14392:18;;;;;;;;;;;36202:1:::3;:15;;;:40;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36095:159:0::3;36266:15;::::0;:53:::3;::::0;-1:-1:-1;;;36266:53:0;;36308:10:::3;36266:53;::::0;::::3;5057:51:1::0;36266:15:0::3;::::0;;::::3;-1:-1:-1::0;;;;;36266:15:0::3;::::0;:41:::3;::::0;5030:18:1;;36266:53:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;36348:10:0::3;36330:29;::::0;;;:17:::3;:29;::::0;;;;;;36362:15:::3;36330:47:::0;;36395:31;36348:10;;-1:-1:-1;36395:31:0::3;::::0;-1:-1:-1;36395:31:0::3;::::0;36413:12;1545:25:1;;1533:2;1518:18;;1399:177;36395:31:0::3;;;;;;;;35767:667;30212:1:::2;35610:824:::0;;;:::o;37327:147::-;-1:-1:-1;;;;;37447:19:0;;;;;;:13;:19;;;;;;;;;37440:26;;;;;;;;;;;;;;;;;37413:14;;37440:26;;;37447:19;37440:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37327:147;;;:::o;34107:1495::-;29550:25;29568:7;29550:15;:25;:::i;:::-;29474:15;;:46;;-1:-1:-1;;;29474:46:0;;29509:10;29474:46;;;5057:51:1;29474:15:0;;;;-1:-1:-1;;;;;29474:15:0;;:34;;5030:18:1;;29474:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29473:264;;;-1:-1:-1;29711:25:0;29729:7;29711:15;:25;:::i;:::-;29598:15;;:68;;-1:-1:-1;;;29598:68:0;;29655:10;29598:68;;;5057:51:1;29598:15:0;;;;-1:-1:-1;;;;;29598:15:0;;:56;;5030:18:1;;29598:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:110;;;:138;29473:264;:344;;;-1:-1:-1;29791:25:0;29809:7;29791:15;:25;:::i;:::-;29777:10;29759:29;;;;:17;:29;;;;;;:57;29473:344;29451:441;;;;-1:-1:-1;;;29451:441:0;;;;;;;:::i;:::-;30003:25;30021:7;30003:15;:25;:::i;:::-;29927:15;;:46;;-1:-1:-1;;;29927:46:0;;29962:10;29927:46;;;5057:51:1;29927:15:0;;;;-1:-1:-1;;;;;29927:15:0;;:34;;5030:18:1;;29927:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;:101;29905:186;;;;-1:-1:-1;;;29905:186:0;;;;;;;:::i;:::-;30158:11:::1;::::0;::::1;;30150:51;;;;-1:-1:-1::0;;;30150:51:0::1;;;;;;;:::i;:::-;34205:12:::2;30420:9;;30404:12;:25;;30396:57;;;::::0;-1:-1:-1;;;30396:57:0;;16983:2:1;30396:57:0::2;::::0;::::2;16965:21:1::0;17022:2;17002:18;;;16995:30;-1:-1:-1;;;17041:18:1;;;17034:49;17100:18;;30396:57:0::2;16781:343:1::0;30396:57:0::2;34276:14:::3;34293:8;:22;34302:12;34293:22;;;;;;;;;;;34276:39;;34471:1;34427:15;;;;;;;;;-1:-1:-1::0;;;;;34427:15:0::3;-1:-1:-1::0;;;;;34427:34:0::3;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;::::0;34466:1:::3;34427:40;:::i;:::-;34426:46;;;;:::i;:::-;34389:1;:17;;;34371:1;:15;;;34350:1;:18;;;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:122;34328:202;;;::::0;-1:-1:-1;;;34328:202:0;;18042:2:1;34328:202:0::3;::::0;::::3;18024:21:1::0;18081:2;18061:18;;;18054:30;18120:32;18100:18;;;18093:60;18170:18;;34328:202:0::3;17840:354:1::0;34328:202:0::3;34549:11;::::0;::::3;::::0;:16;34541:58:::3;;;::::0;-1:-1:-1;;;34541:58:0;;17331:2:1;34541:58:0::3;::::0;::::3;17313:21:1::0;17370:2;17350:18;;;17343:30;17409:31;17389:18;;;17382:59;17458:18;;34541:58:0::3;17129:353:1::0;34541:58:0::3;34687:11:::0;;34630:6:::3;::::0;;;34669:29:::3;::::0;:15:::3;:29;:::i;:::-;:41;34647:122;;;::::0;-1:-1:-1;;;34647:122:0;;18401:2:1;34647:122:0::3;::::0;::::3;18383:21:1::0;18440:2;18420:18;;;18413:30;18479:33;18459:18;;;18452:61;18530:18;;34647:122:0::3;18199:355:1::0;34647:122:0::3;34880:3;34835:15;;;;;;;;;-1:-1:-1::0;;;;;34835:15:0::3;-1:-1:-1::0;;;;;34835:34:0::3;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;::::0;34874:2:::3;34835:41;:::i;:::-;34834:49;;;;:::i;:::-;34800:1;:18;;;:83;34782:627;;;34910:8;::::0;::::3;:15:::0;;-1:-1:-1;;34910:15:0::3;;;::::0;;;;35100:40:::3;::::0;-1:-1:-1;;;;;;;;34963:13:0;::::3;;::::0;34910:15;;35016:17:::3;::::0;34963:13;;35100:40:::3;::::0;35117:14;;::::3;;;::::0;35133:6:::3;::::0;::::3;::::0;35100:40:::3;;;:::i;:::-;;::::0;;-1:-1:-1;;35100:40:0;;::::3;::::0;;;;;;;35064:91:::3;::::0;::::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;35048:107:0;;-1:-1:-1;35048:107:0;-1:-1:-1;35048:107:0;35299:49:::3;;;::::0;-1:-1:-1;;;35299:49:0;;20035:2:1;35299:49:0::3;::::0;::::3;20017:21:1::0;20074:2;20054:18;;;20047:30;20113:33;20093:18;;;20086:61;20164:18;;35299:49:0::3;19833:355:1::0;35299:49:0::3;34895:465;;;34782:627;;;35381:8;::::0;::::3;:16:::0;;-1:-1:-1;;35381:16:0::3;::::0;;34782:627:::3;35421:10;::::0;;::::3;:17:::0;;35434:4:::3;-1:-1:-1::0;;35421:17:0;;::::3;::::0;::::3;::::0;;;35463:15:::3;35449:11:::0;;::::3;:29:::0;35489:15;:53:::3;::::0;-1:-1:-1;;;35489:53:0;;35531:10:::3;-1:-1:-1::0;35489:53:0;::::3;5057:51:1::0;35421:17:0::3;35489:15:::0;;::::3;-1:-1:-1::0;;;;;35489:15:0::3;::::0;:41:::3;::::0;5030:18:1;;35489:53:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;;35585:8:0::3;::::0;::::3;::::0;35560:34:::3;::::0;;35573:10:::3;20361:51:1::0;;35585:8:0::3;::::0;;::::3;;;20455:14:1::0;20448:22;20443:2;20428:18;;20421:50;35560:34:0::3;::::0;20334:18:1;35560:34:0::3;;;;;;;34219:1383;;30212:1:::2;34107:1495:::0;:::o;20188:130::-;20273:37;20282:5;20289:7;20298:5;20305:4;20273:8;:37::i;:::-;20188:130;;;:::o;21920:486::-;-1:-1:-1;;;;;14975:18:0;;;22020:24;14975:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;22087:36:0;;22083:316;;;22163:5;22144:16;:24;22140:132;;;22196:60;;-1:-1:-1;;;22196:60:0;;-1:-1:-1;;;;;20702:32:1;;22196:60:0;;;20684:51:1;20751:18;;;20744:34;;;20794:18;;;20787:34;;;20657:18;;22196:60:0;20482:345:1;22140:132:0;22315:57;22324:5;22331:7;22359:5;22340:16;:24;22366:5;22315:8;:57::i;:::-;22009:397;21920:486;;;:::o;16763:308::-;-1:-1:-1;;;;;16847:18:0;;16843:88;;16889:30;;-1:-1:-1;;;16889:30:0;;16916:1;16889:30;;;5057:51:1;5030:18;;16889:30:0;4911:203:1;16843:88:0;-1:-1:-1;;;;;16945:16:0;;16941:88;;16985:32;;-1:-1:-1;;;16985:32:0;;17014:1;16985:32;;;5057:51:1;5030:18;;16985:32:0;4911:203:1;16941:88:0;17039:24;17047:4;17053:2;17057:5;17039:7;:24::i;18883:213::-;-1:-1:-1;;;;;18954:21:0;;18950:93;;18999:32;;-1:-1:-1;;;18999:32:0;;19028:1;18999:32;;;5057:51:1;5030:18;;18999:32:0;4911:203:1;18950:93:0;19053:35;19069:1;19073:7;19082:5;19053:7;:35::i;:::-;18883:213;;:::o;21185:443::-;-1:-1:-1;;;;;21298:19:0;;21294:91;;21341:32;;-1:-1:-1;;;21341:32:0;;21370:1;21341:32;;;5057:51:1;5030:18;;21341:32:0;4911:203:1;21294:91:0;-1:-1:-1;;;;;21399:21:0;;21395:92;;21444:31;;-1:-1:-1;;;21444:31:0;;21472:1;21444:31;;;5057:51:1;5030:18;;21444:31:0;4911:203:1;21395:92:0;-1:-1:-1;;;;;21497:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;21543:78;;;;21594:7;-1:-1:-1;;;;;21578:31:0;21587:5;-1:-1:-1;;;;;21578:31:0;;21603:5;21578:31;;;;1545:25:1;;1533:2;1518:18;;1399:177;21578:31:0;;;;;;;;21185:443;;;;:::o;37482:1293::-;-1:-1:-1;;;;;37615:18:0;;;;;;:45;;-1:-1:-1;37645:15:0;;-1:-1:-1;;;;;37637:23:0;;;37645:15;;37637:23;;37615:45;37611:1116;;;-1:-1:-1;;;;;37785:19:0;;37677;37785;;;:13;:19;;;;;37823:16;;37677:19;;37785;37823:20;37819:897;;37869:6;37864:525;37885:16;;37881:20;;37864:525;;;-1:-1:-1;;;;;37966:22:0;;37931:32;37966:22;;;:16;:22;;;;;38015:12;;37931:32;;38015:9;;38025:1;;38015:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;37966:84;;;;;;;;;;;;38096:17;;;;37966:84;;-1:-1:-1;38077:15:0;:36;38073:237;;38157:129;38212:4;38247:9;38257:1;38247:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;38157:24;:129::i;:::-;38142:144;;;;:::i;:::-;;;38073:237;38349:20;;38332:37;;;;:::i;:::-;;;37908:481;37903:3;;;;;:::i;:::-;;;;37864:525;;;-1:-1:-1;;;;;;14392:18:0;;38409:19;14392:18;;;;;;;;;;;38449:13;-1:-1:-1;38431:111:0;;38541:1;38431:111;;;38504:13;38486:15;38496:4;-1:-1:-1;;;;;14392:18:0;14365:7;14392:18;;;;;;;;;;;;14300:118;38486:15;:31;;;;:::i;:::-;38409:133;-1:-1:-1;38600:25:0;38614:11;38409:133;38600:25;:::i;:::-;38591:5;:34;;38561:139;;;;-1:-1:-1;;;38561:139:0;;21166:2:1;38561:139:0;;;21148:21:1;21205:2;21185:18;;;21178:30;21244:33;21224:18;;;21217:61;21295:18;;38561:139:0;20964:355:1;38561:139:0;37845:871;37819:897;37662:1065;;;37611:1116;38737:30;38751:4;38757:2;38761:5;-1:-1:-1;;;;;17485:18:0;;17481:552;;17639:5;17623:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;17481:552:0;;-1:-1:-1;17481:552:0;;-1:-1:-1;;;;;17699:15:0;;17677:19;17699:15;;;;;;;;;;;17733:19;;;17729:117;;;17780:50;;-1:-1:-1;;;17780:50:0;;-1:-1:-1;;;;;20702:32:1;;17780:50:0;;;20684:51:1;20751:18;;;20744:34;;;20794:18;;;20787:34;;;20657:18;;17780:50:0;20482:345:1;17729:117:0;-1:-1:-1;;;;;17969:15:0;;:9;:15;;;;;;;;;;17987:19;;;;17969:37;;17481:552;-1:-1:-1;;;;;18049:16:0;;18045:435;;18215:12;:21;;;;;;;18045:435;;;-1:-1:-1;;;;;18431:13:0;;:9;:13;;;;;;;;;;:22;;;;;;18045:435;18512:2;-1:-1:-1;;;;;18497:25:0;18506:4;-1:-1:-1;;;;;18497:25:0;;18516:5;18497:25;;;;1545::1;;1533:2;1518:18;;1399:177;18497:25:0;;;;;;;;17395:1135;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:1;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:1:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;:::-;706:53;545:220;-1:-1:-1;;;545:220:1:o;770:173::-;838:20;;-1:-1:-1;;;;;887:31:1;;877:42;;867:70;;933:1;930;923:12;867:70;770:173;;;:::o;948:254::-;1016:6;1024;1077:2;1065:9;1056:7;1052:23;1048:32;1045:52;;;1093:1;1090;1083:12;1045:52;1116:29;1135:9;1116:29;:::i;:::-;1106:39;1192:2;1177:18;;;;1164:32;;-1:-1:-1;;;948:254:1:o;1581:334::-;1658:6;1666;1674;1727:2;1715:9;1706:7;1702:23;1698:32;1695:52;;;1743:1;1740;1733:12;1695:52;1766:29;1785:9;1766:29;:::i;:::-;1756:39;;1814:38;1848:2;1837:9;1833:18;1814:38;:::i;:::-;1804:48;;1871:38;1905:2;1894:9;1890:18;1871:38;:::i;:::-;1861:48;;1581:334;;;;;:::o;1920:156::-;1986:20;;2046:4;2035:16;;2025:27;;2015:55;;2066:1;2063;2056:12;2081:256;2147:6;2155;2208:2;2196:9;2187:7;2183:23;2179:32;2176:52;;;2224:1;2221;2214:12;2176:52;2247:29;2266:9;2247:29;:::i;:::-;2237:39;;2295:36;2327:2;2316:9;2312:18;2295:36;:::i;:::-;2285:46;;2081:256;;;;;:::o;2961:127::-;3022:10;3017:3;3013:20;3010:1;3003:31;3053:4;3050:1;3043:15;3077:4;3074:1;3067:15;3093:275;3164:2;3158:9;3229:2;3210:13;;-1:-1:-1;;3206:27:1;3194:40;;3264:18;3249:34;;3285:22;;;3246:62;3243:88;;;3311:18;;:::i;:::-;3347:2;3340:22;3093:275;;-1:-1:-1;3093:275:1:o;3373:1011::-;3458:6;3466;3474;3527:2;3515:9;3506:7;3502:23;3498:32;3495:52;;;3543:1;3540;3533:12;3495:52;3566:29;3585:9;3566:29;:::i;:::-;3556:39;-1:-1:-1;3614:2:1;3651:18;;;3638:32;-1:-1:-1;;;;;;3699:32:1;;3689:43;;3679:71;;3746:1;3743;3736:12;3679:71;3769:5;-1:-1:-1;3825:2:1;3810:18;;3797:32;3848:18;3878:14;;;3875:34;;;3905:1;3902;3895:12;3875:34;3943:6;3932:9;3928:22;3918:32;;3988:7;3981:4;3977:2;3973:13;3969:27;3959:55;;4010:1;4007;4000:12;3959:55;4046:2;4033:16;4068:2;4064;4061:10;4058:36;;;4074:18;;:::i;:::-;4116:53;4159:2;4140:13;;-1:-1:-1;;4136:27:1;4132:36;;4116:53;:::i;:::-;4103:66;;4192:2;4185:5;4178:17;4232:7;4227:2;4222;4218;4214:11;4210:20;4207:33;4204:53;;;4253:1;4250;4243:12;4204:53;4308:2;4303;4299;4295:11;4290:2;4283:5;4279:14;4266:45;4352:1;4347:2;4342;4335:5;4331:14;4327:23;4320:34;;4373:5;4363:15;;;;;3373:1011;;;;;:::o;4389:328::-;4466:6;4474;4482;4535:2;4523:9;4514:7;4510:23;4506:32;4503:52;;;4551:1;4548;4541:12;4503:52;4574:29;4593:9;4574:29;:::i;:::-;4564:39;;4622:38;4656:2;4645:9;4641:18;4622:38;:::i;:::-;4612:48;;4707:2;4696:9;4692:18;4679:32;4669:42;;4389:328;;;;;:::o;5119:186::-;5178:6;5231:2;5219:9;5210:7;5206:23;5202:32;5199:52;;;5247:1;5244;5237:12;5199:52;5270:29;5289:9;5270:29;:::i;5310:462::-;5403:6;5411;5419;5427;5435;5488:3;5476:9;5467:7;5463:23;5459:33;5456:53;;;5505:1;5502;5495:12;5456:53;5528:29;5547:9;5528:29;:::i;:::-;5518:39;;5604:2;5593:9;5589:18;5576:32;5566:42;;5627:36;5659:2;5648:9;5644:18;5627:36;:::i;:::-;5310:462;;;;-1:-1:-1;5617:46:1;;5710:2;5695:18;;5682:32;;-1:-1:-1;5761:3:1;5746:19;5733:33;;5310:462;-1:-1:-1;;5310:462:1:o;5777:180::-;5836:6;5889:2;5877:9;5868:7;5864:23;5860:32;5857:52;;;5905:1;5902;5895:12;5857:52;-1:-1:-1;5928:23:1;;5777:180;-1:-1:-1;5777:180:1:o;5962:1060::-;6380:25;;;6436:2;6421:18;;6414:34;;;6479:2;6464:18;;6457:34;;;6522:2;6507:18;;6500:34;;;6565:3;6550:19;;6543:35;;;6622:14;;6615:22;6609:3;6594:19;;6587:51;6682:14;;6675:22;6669:3;6654:19;;6647:51;-1:-1:-1;;;;;;6735:33:1;;6751:3;6714:19;;6707:62;-1:-1:-1;;;;;6844:15:1;;;6838:3;6823:19;;6816:44;6897:15;;6891:3;6876:19;;6869:44;6368:3;6944;6929:19;;6922:31;;;6339:4;;6970:46;6997:18;;;6988:7;6970:46;:::i;:::-;6962:54;5962:1060;-1:-1:-1;;;;;;;;;;;;;;5962:1060:1:o;7027:260::-;7095:6;7103;7156:2;7144:9;7135:7;7131:23;7127:32;7124:52;;;7172:1;7169;7162:12;7124:52;7195:29;7214:9;7195:29;:::i;:::-;7185:39;;7243:38;7277:2;7266:9;7262:18;7243:38;:::i;7292:160::-;7357:20;;7413:13;;7406:21;7396:32;;7386:60;;7442:1;7439;7432:12;7457:316;7528:6;7536;7544;7597:2;7585:9;7576:7;7572:23;7568:32;7565:52;;;7613:1;7610;7603:12;7565:52;7649:9;7636:23;7626:33;;7678:35;7709:2;7698:9;7694:18;7678:35;:::i;:::-;7668:45;;7732:35;7763:2;7752:9;7748:18;7732:35;:::i;7778:639::-;7945:2;7997:21;;;8067:13;;7970:18;;;8089:22;;;7916:4;;7945:2;8168:15;;;;8142:2;8127:18;;;7916:4;8211:180;8225:6;8222:1;8219:13;8211:180;;;8290:13;;8305:4;8286:24;8274:37;;8366:15;;;;8331:12;;;;8247:1;8240:9;8211:180;;;-1:-1:-1;8408:3:1;;7778:639;-1:-1:-1;;;;;;7778:639:1:o;8422:380::-;8501:1;8497:12;;;;8544;;;8565:61;;8619:4;8611:6;8607:17;8597:27;;8565:61;8672:2;8664:6;8661:14;8641:18;8638:38;8635:161;;8718:10;8713:3;8709:20;8706:1;8699:31;8753:4;8750:1;8743:15;8781:4;8778:1;8771:15;8635:161;;8422:380;;;:::o;9512:127::-;9573:10;9568:3;9564:20;9561:1;9554:31;9604:4;9601:1;9594:15;9628:4;9625:1;9618:15;9644:128;9711:9;;;9732:11;;;9729:37;;;9746:18;;:::i;9777:217::-;9817:1;9843;9833:132;;9887:10;9882:3;9878:20;9875:1;9868:31;9922:4;9919:1;9912:15;9950:4;9947:1;9940:15;9833:132;-1:-1:-1;9979:9:1;;9777:217::o;9999:168::-;10072:9;;;10103;;10120:15;;;10114:22;;10100:37;10090:71;;10141:18;;:::i;10172:125::-;10237:9;;;10258:10;;;10255:36;;;10271:18;;:::i;10302:679::-;10394:6;10447:3;10435:9;10426:7;10422:23;10418:33;10415:53;;;10464:1;10461;10454:12;10415:53;10497:2;10491:9;10539:3;10531:6;10527:16;10609:6;10597:10;10594:22;10573:18;10561:10;10558:34;10555:62;10552:88;;;10620:18;;:::i;:::-;10660:10;10656:2;10649:22;;10701:9;10695:16;10687:6;10680:32;10766:2;10755:9;10751:18;10745:25;10740:2;10732:6;10728:15;10721:50;10825:2;10814:9;10810:18;10804:25;10799:2;10791:6;10787:15;10780:50;10884:2;10873:9;10869:18;10863:25;10858:2;10850:6;10846:15;10839:50;10944:3;10933:9;10929:19;10923:26;10917:3;10909:6;10905:16;10898:52;10969:6;10959:16;;;10302:679;;;;:::o;10986:411::-;11188:2;11170:21;;;11227:2;11207:18;;;11200:30;11266:34;11261:2;11246:18;;11239:62;-1:-1:-1;;;11332:2:1;11317:18;;11310:45;11387:3;11372:19;;10986:411::o;11402:399::-;11604:2;11586:21;;;11643:2;11623:18;;;11616:30;11682:34;11677:2;11662:18;;11655:62;-1:-1:-1;;;11748:2:1;11733:18;;11726:33;11791:3;11776:19;;11402:399::o;11806:351::-;12008:2;11990:21;;;12047:2;12027:18;;;12020:30;12086:29;12081:2;12066:18;;12059:57;12148:2;12133:18;;11806:351::o;12162:184::-;12232:6;12285:2;12273:9;12264:7;12260:23;12256:32;12253:52;;;12301:1;12298;12291:12;12253:52;-1:-1:-1;12324:16:1;;12162:184;-1:-1:-1;12162:184:1:o;12774:135::-;12813:3;12834:17;;;12831:43;;12854:18;;:::i;:::-;-1:-1:-1;12901:1:1;12890:13;;12774:135::o;13039:544::-;13140:2;13135:3;13132:11;13129:448;;;13176:1;13201:5;13197:2;13190:17;13246:4;13242:2;13232:19;13316:2;13304:10;13300:19;13297:1;13293:27;13287:4;13283:38;13352:4;13340:10;13337:20;13334:47;;;-1:-1:-1;13375:4:1;13334:47;13430:2;13425:3;13421:12;13418:1;13414:20;13408:4;13404:31;13394:41;;13485:82;13503:2;13496:5;13493:13;13485:82;;;13548:17;;;13529:1;13518:13;13485:82;;;13489:3;;;13039:544;;;:::o;13759:1348::-;13883:3;13877:10;13910:18;13902:6;13899:30;13896:56;;;13932:18;;:::i;:::-;13961:96;14050:6;14010:38;14042:4;14036:11;14010:38;:::i;:::-;14004:4;13961:96;:::i;:::-;14112:4;;14176:2;14165:14;;14193:1;14188:662;;;;14894:1;14911:6;14908:89;;;-1:-1:-1;14963:19:1;;;14957:26;14908:89;-1:-1:-1;;13716:1:1;13712:11;;;13708:24;13704:29;13694:40;13740:1;13736:11;;;13691:57;15010:81;;14158:943;;14188:662;12986:1;12979:14;;;13023:4;13010:18;;-1:-1:-1;;14224:20:1;;;14341:236;14355:7;14352:1;14349:14;14341:236;;;14444:19;;;14438:26;14423:42;;14536:27;;;;14504:1;14492:14;;;;14371:19;;14341:236;;;14345:3;14605:6;14596:7;14593:19;14590:201;;;14666:19;;;14660:26;-1:-1:-1;;14749:1:1;14745:14;;;14761:3;14741:24;14737:37;14733:42;14718:58;14703:74;;14590:201;-1:-1:-1;;;;;14837:1:1;14821:14;;;14817:22;14804:36;;-1:-1:-1;13759:1348:1:o;18559:977::-;18762:10;18757:3;18753:20;18745:6;18741:33;18736:3;18729:46;18711:3;18794:1;18815;18848:6;18842:13;18878:36;18904:9;18878:36;:::i;:::-;18933:1;18950:18;;;18977:151;;;;19142:1;19137:374;;;;18943:568;;18977:151;-1:-1:-1;;19019:24:1;;19005:12;;;18998:46;19096:14;;19089:22;19077:35;;19068:45;;19064:54;;;-1:-1:-1;18977:151:1;;19137:374;19168:6;19165:1;19158:17;19198:4;19243:2;19240:1;19230:16;19268:1;19282:174;19296:6;19293:1;19290:13;19282:174;;;19383:14;;19365:11;;;19361:20;;19354:44;19426:16;;;;19311:10;;19282:174;;;19286:3;;;19498:2;19489:6;19484:3;19480:16;19476:25;19469:32;;18943:568;-1:-1:-1;19527:3:1;;18559:977;-1:-1:-1;;;;;;;;18559:977:1:o;19541:287::-;19670:3;19708:6;19702:13;19724:66;19783:6;19778:3;19771:4;19763:6;19759:17;19724:66;:::i;:::-;19806:16;;;;;19541:287;-1:-1:-1;;19541:287:1:o;20832:127::-;20893:10;20888:3;20884:20;20881:1;20874:31;20924:4;20921:1;20914:15;20948:4;20945:1;20938:15

Swarm Source

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