ETH Price: $3,066.59 (-1.56%)
 

Overview

Max Total Supply

1,001,322,800 SGi

Holders

573 (0.00%)

Transfers

-
4 ( 33.33%)

Market

Price

$0.91 @ 0.000295 ETH

Onchain Market Cap

$906,763,882.70

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

SGi is a Swing-to-Earn (S2E) token that rewards users based on real golf swing data. Unlike typical Move-to-Earn models, SMARTGOLF AIX captures swing accuracy and form using AI-powered IoT devices. Verified data is then tokenized into SGi, enabling players to earn while they improve.

Market

Volume (24H):$49,656.00
Market Capitalization:$0.00
Circulating Supply:0.00 SGi
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SGiToken

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
No with 200 runs

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

// 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.3.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
     *
     * Both 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: SGi_token.sol


pragma solidity ^0.8.30;



interface INSgi {
    function burnFrom(address account, uint256 amount) external;
}

contract SGiToken is ERC20, Ownable {
    struct LockInfo {
        uint256 amount;
        uint256 startTime;
        uint256 cliff;
        uint256 duration;
        string lockType;
    }

    mapping(address => LockInfo[]) public lockedTokens;
    address public daoController;
    address public nSgiContract;

    event Locked(address indexed to, uint256 amount, uint256 startTime, uint256 cliff, uint256 duration, string lockType);
    event Reclaimed(address indexed from, address indexed to, uint256 amount);
    event MintedFromNFT(address indexed to, uint256 amount);

    constructor(address _daoController) ERC20("SmartGolfToken", "SGi") Ownable(msg.sender) {
        _mint(msg.sender, 1_000_000_000 * 10 ** decimals());
        daoController = _daoController;
    }

    modifier onlyDAO() {
        require(msg.sender == owner() || msg.sender == daoController, "Not authorized");
        _;
    }

    function setDAOController(address _dao) external onlyOwner {
        daoController = _dao;
    }

    function setNSgiContract(address _nSgi) external onlyOwner {
        nSgiContract = _nSgi;
    }

    function transfer(address to, uint256 amount) public override returns (bool) {
        require(_availableBalance(msg.sender) >= amount, "SGi: trying to transfer locked tokens");
        return super.transfer(to, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
        require(_availableBalance(from) >= amount, "SGi: trying to transfer locked tokens");
        return super.transferFrom(from, to, amount);
    }

    function _availableBalance(address account) public view returns (uint256) {
        uint256 locked = 0;
        LockInfo[] storage locks = lockedTokens[account];
        for (uint256 i = 0; i < locks.length; i++) {
            LockInfo storage lock = locks[i];
            if (block.timestamp < lock.startTime + lock.cliff) {
                locked += lock.amount;
            } else if (block.timestamp < lock.startTime + lock.cliff + lock.duration) {
                uint256 elapsed = block.timestamp - (lock.startTime + lock.cliff);
                uint256 vested = (lock.amount * elapsed) / lock.duration;
                locked += (lock.amount - vested);
            }
        }
        return balanceOf(account) - locked;
    }

    function getLockedBalance(address account) external view returns (uint256 totalLocked) {
        LockInfo[] storage locks = lockedTokens[account];
        for (uint256 i = 0; i < locks.length; i++) {
            LockInfo storage lock = locks[i];
            if (block.timestamp < lock.startTime + lock.cliff) {
                totalLocked += lock.amount;
            } else if (block.timestamp < lock.startTime + lock.cliff + lock.duration) {
                uint256 elapsed = block.timestamp - (lock.startTime + lock.cliff);
                uint256 vested = (lock.amount * elapsed) / lock.duration;
                totalLocked += (lock.amount - vested);
            }
        }
    }

    function lockTokens(
        address recipient,
        uint256 amount,
        uint256 startTime,
        uint256 cliff,
        uint256 duration,
        string memory lockType
    ) external onlyDAO {
        require(balanceOf(msg.sender) >= amount, "SGi: insufficient balance for locking");
        _transfer(msg.sender, recipient, amount);
        lockedTokens[recipient].push(LockInfo(amount, startTime, cliff, duration, lockType));
        emit Locked(recipient, startTime, cliff, duration, amount, lockType);
    }

    function mintLocked(
        address recipient,
        uint256 amount,
        uint256 startTime,
        uint256 cliff,
        uint256 duration,
        string memory lockType
    ) external onlyDAO {
        _mint(recipient, amount);
        lockedTokens[recipient].push(LockInfo(amount, startTime, cliff, duration, lockType));
        emit Locked(recipient, startTime, cliff, duration, amount, lockType);
    }

    function reclaimLockedTokens(address from, uint index) external onlyDAO {
        require(index < lockedTokens[from].length, "Invalid index");
        LockInfo memory lock = lockedTokens[from][index];
        _transfer(from, msg.sender, lock.amount);

        for (uint i = index; i < lockedTokens[from].length - 1; i++) {
            lockedTokens[from][i] = lockedTokens[from][i + 1];
        }
        lockedTokens[from].pop();

        emit Reclaimed(from, msg.sender, lock.amount);
    }

    function mintFromNFT(address to, uint256 amount) external {
        require(msg.sender == nSgiContract, "Only nSGi contract can call this");
        _mint(to, amount);
        emit MintedFromNFT(to, amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_daoController","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"string","name":"lockType","type":"string"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintedFromNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_availableBalance","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":[],"name":"daoController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLockedBalance","outputs":[{"internalType":"uint256","name":"totalLocked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"string","name":"lockType","type":"string"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedTokens","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"string","name":"lockType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"string","name":"lockType","type":"string"}],"name":"mintLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nSgiContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"reclaimLockedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dao","type":"address"}],"name":"setDAOController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nSgi","type":"address"}],"name":"setNSgiContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f5ffd5b506040516136f03803806136f083398181016040528101906100319190610585565b336040518060400160405280600e81526020017f536d617274476f6c66546f6b656e0000000000000000000000000000000000008152506040518060400160405280600381526020017f534769000000000000000000000000000000000000000000000000000000000081525081600390816100ad91906107ed565b5080600490816100bd91906107ed565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610130575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161012791906108cb565b60405180910390fd5b61013f816101be60201b60201c565b506101783361015261028160201b60201c565b600a61015e9190610a4c565b633b9aca0061016d9190610a96565b61028960201b60201c565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610b67565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102f9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102f091906108cb565b60405180910390fd5b61030a5f838361030e60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361035e578060025f8282546103529190610ad7565b9250508190555061042c565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103e7578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016103de93929190610b19565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610473578060025f82825403925050819055506104bd565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161051a9190610b4e565b60405180910390a3505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105548261052b565b9050919050565b6105648161054a565b811461056e575f5ffd5b50565b5f8151905061057f8161055b565b92915050565b5f6020828403121561059a57610599610527565b5b5f6105a784828501610571565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061062b57607f821691505b60208210810361063e5761063d6105e7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610665565b6106aa8683610665565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106ee6106e96106e4846106c2565b6106cb565b6106c2565b9050919050565b5f819050919050565b610707836106d4565b61071b610713826106f5565b848454610671565b825550505050565b5f5f905090565b610732610723565b61073d8184846106fe565b505050565b5b81811015610760576107555f8261072a565b600181019050610743565b5050565b601f8211156107a55761077681610644565b61077f84610656565b8101602085101561078e578190505b6107a261079a85610656565b830182610742565b50505b505050565b5f82821c905092915050565b5f6107c55f19846008026107aa565b1980831691505092915050565b5f6107dd83836107b6565b9150826002028217905092915050565b6107f6826105b0565b67ffffffffffffffff81111561080f5761080e6105ba565b5b6108198254610614565b610824828285610764565b5f60209050601f831160018114610855575f8415610843578287015190505b61084d85826107d2565b8655506108b4565b601f19841661086386610644565b5f5b8281101561088a57848901518255600182019150602085019450602081019050610865565b868310156108a757848901516108a3601f8916826107b6565b8355505b6001600288020188555050505b505050505050565b6108c58161054a565b82525050565b5f6020820190506108de5f8301846108bc565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b600185111561096657808604811115610942576109416108e4565b5b60018516156109515780820291505b808102905061095f85610911565b9450610926565b94509492505050565b5f8261097e5760019050610a39565b8161098b575f9050610a39565b81600181146109a157600281146109ab576109da565b6001915050610a39565b60ff8411156109bd576109bc6108e4565b5b8360020a9150848211156109d4576109d36108e4565b5b50610a39565b5060208310610133831016604e8410600b8410161715610a0f5782820a905083811115610a0a57610a096108e4565b5b610a39565b610a1c848484600161091d565b92509050818404811115610a3357610a326108e4565b5b81810290505b9392505050565b5f60ff82169050919050565b5f610a56826106c2565b9150610a6183610a40565b9250610a8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461096f565b905092915050565b5f610aa0826106c2565b9150610aab836106c2565b9250828202610ab9816106c2565b91508282048414831517610ad057610acf6108e4565b5b5092915050565b5f610ae1826106c2565b9150610aec836106c2565b9250828201905080821115610b0457610b036108e4565b5b92915050565b610b13816106c2565b82525050565b5f606082019050610b2c5f8301866108bc565b610b396020830185610b0a565b610b466040830184610b0a565b949350505050565b5f602082019050610b615f830184610b0a565b92915050565b612b7c80610b745f395ff3fe608060405234801561000f575f5ffd5b506004361061014b575f3560e01c806370a08231116100c1578063a9059cbb1161007a578063a9059cbb1461038d578063ba408cdc146103bd578063c4086893146103d9578063d48de62214610409578063dd62ed3e14610427578063f2fde38b146104575761014b565b806370a08231146102cb578063715018a6146102fb57806374e68a1814610305578063815ed26c146103215780638da5cb5b1461035157806395d89b411461036f5761014b565b8063266449b111610113578063266449b114610207578063313ce567146102235780633886b5de1461024157806347fa58e21461025d57806353719b6e1461027b5780636a358abd146102af5761014b565b806306fdde031461014f578063095ea7b31461016d57806318160ddd1461019d5780631a7480c8146101bb57806323b872dd146101d7575b5f5ffd5b610157610473565b6040516101649190611ed7565b60405180910390f35b61018760048036038101906101829190611f95565b610503565b6040516101949190611fed565b60405180910390f35b6101a5610525565b6040516101b29190612015565b60405180910390f35b6101d560048036038101906101d0919061215a565b61052e565b005b6101f160048036038101906101ec91906121ff565b610776565b6040516101fe9190611fed565b60405180910390f35b610221600480360381019061021c919061215a565b6107d6565b005b61022b6109d2565b604051610238919061226a565b60405180910390f35b61025b60048036038101906102569190611f95565b6109da565b005b610265610ac5565b6040516102729190612292565b60405180910390f35b61029560048036038101906102909190611f95565b610aea565b6040516102a69594939291906122ab565b60405180910390f35b6102c960048036038101906102c49190612303565b610bbc565b005b6102e560048036038101906102e09190612303565b610c07565b6040516102f29190612015565b60405180910390f35b610303610c4c565b005b61031f600480360381019061031a9190612303565b610c5f565b005b61033b60048036038101906103369190612303565b610caa565b6040516103489190612015565b60405180910390f35b610359610e0c565b6040516103669190612292565b60405180910390f35b610377610e34565b6040516103849190611ed7565b60405180910390f35b6103a760048036038101906103a29190611f95565b610ec4565b6040516103b49190611fed565b60405180910390f35b6103d760048036038101906103d29190611f95565b610f22565b005b6103f360048036038101906103ee9190612303565b611400565b6040516104009190612015565b60405180910390f35b610411611547565b60405161041e9190612292565b60405180910390f35b610441600480360381019061043c919061232e565b61156c565b60405161044e9190612015565b60405180910390f35b610471600480360381019061046c9190612303565b6115ee565b005b60606003805461048290612399565b80601f01602080910402602001604051908101604052809291908181526020018280546104ae90612399565b80156104f95780601f106104d0576101008083540402835291602001916104f9565b820191905f5260205f20905b8154815290600101906020018083116104dc57829003601f168201915b5050505050905090565b5f5f61050d611672565b905061051a818585611679565b600191505092915050565b5f600254905090565b610536610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105bb575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190612413565b60405180910390fd5b8461060433610c07565b1015610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c906124a1565b60405180910390fd5b61065033878761168b565b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060a0016040528087815260200186815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004019081610715919061265f565b5050508573ffffffffffffffffffffffffffffffffffffffff167f2896057126e5c49f9752223150606922c5e0e9e6193830ea6f559a0234a1ca5885858589866040516107669594939291906122ab565b60405180910390a2505050505050565b5f8161078185610caa565b10156107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b99061279e565b60405180910390fd5b6107cd84848461177b565b90509392505050565b6107de610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610863575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612413565b60405180910390fd5b6108ac86866117a9565b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060a0016040528087815260200186815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004019081610971919061265f565b5050508573ffffffffffffffffffffffffffffffffffffffff167f2896057126e5c49f9752223150606922c5e0e9e6193830ea6f559a0234a1ca5885858589866040516109c29594939291906122ab565b60405180910390a2505050505050565b5f6012905090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090612806565b60405180910390fd5b610a7382826117a9565b8173ffffffffffffffffffffffffffffffffffffffff167f776ae8ee7b414e3f15261edda8f8ee4929fa75e900dee24f09ae378354521b3982604051610ab99190612015565b60405180910390a25050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6006602052815f5260405f208181548110610b03575f80fd5b905f5260205f2090600502015f9150915050805f015490806001015490806002015490806003015490806004018054610b3b90612399565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790612399565b8015610bb25780601f10610b8957610100808354040283529160200191610bb2565b820191905f5260205f20905b815481529060010190602001808311610b9557829003601f168201915b5050505050905085565b610bc4611828565b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c54611828565b610c5d5f6118af565b565b610c67611828565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f5f90505f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f90505b8180549050811015610dee575f828281548110610d1457610d13612824565b5b905f5260205f209060050201905080600201548160010154610d36919061287e565b421015610d5357805f015484610d4c919061287e565b9350610de0565b806003015481600201548260010154610d6c919061287e565b610d76919061287e565b421015610ddf575f81600201548260010154610d92919061287e565b42610d9d91906128b1565b90505f826003015482845f0154610db491906128e4565b610dbe9190612952565b905080835f0154610dcf91906128b1565b86610dda919061287e565b955050505b5b508080600101915050610cf4565b5081610df985610c07565b610e0391906128b1565b92505050919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e4390612399565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f90612399565b8015610eba5780601f10610e9157610100808354040283529160200191610eba565b820191905f5260205f20905b815481529060010190602001808311610e9d57829003601f168201915b5050505050905090565b5f81610ecf33610caa565b1015610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f079061279e565b60405180910390fd5b610f1a8383611972565b905092915050565b610f2a610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610faf575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590612413565b60405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508110611070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611067906129cc565b60405180910390fd5b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106110c0576110bf612824565b5b905f5260205f2090600502016040518060a00160405290815f820154815260200160018201548152602001600282015481526020016003820154815260200160048201805461110e90612399565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90612399565b80156111855780601f1061115c57610100808354040283529160200191611185565b820191905f5260205f20905b81548152906001019060200180831161116857829003601f168201915b505050505081525050905061119e8333835f015161168b565b5f8290505b600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506111f091906128b1565b8110156113045760065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182611241919061287e565b8154811061125257611251612824565b5b905f5260205f20906005020160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106112ad576112ac612824565b5b905f5260205f2090600502015f820154815f0155600182015481600101556002820154816002015560038201548160030155600482018160040190816112f391906129ff565b5090505080806001019150506111a3565b5060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061135257611351612ae4565b5b600190038181905f5260205f2090600502015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f61138f9190611e0f565b505090553373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc4cc5c1b6cf3b5cafd06bc7fa8b6320dbeea074c4f18c4c036e52a3a773aac54835f01516040516113f39190612015565b60405180910390a3505050565b5f5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f90505b8180549050811015611540575f82828154811061146657611465612824565b5b905f5260205f209060050201905080600201548160010154611488919061287e565b4210156114a557805f01548461149e919061287e565b9350611532565b8060030154816002015482600101546114be919061287e565b6114c8919061287e565b421015611531575f816002015482600101546114e4919061287e565b426114ef91906128b1565b90505f826003015482845f015461150691906128e4565b6115109190612952565b905080835f015461152191906128b1565b8661152c919061287e565b955050505b5b508080600101915050611446565b5050919050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6115f6611828565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611666575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161165d9190612292565b60405180910390fd5b61166f816118af565b50565b5f33905090565b6116868383836001611994565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116fb575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116f29190612292565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361176b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117629190612292565b60405180910390fd5b611776838383611b63565b505050565b5f5f611785611672565b9050611792858285611d7c565b61179d85858561168b565b60019150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611819575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118109190612292565b60405180910390fd5b6118245f8383611b63565b5050565b611830611672565b73ffffffffffffffffffffffffffffffffffffffff1661184e610e0c565b73ffffffffffffffffffffffffffffffffffffffff16146118ad57611871611672565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118a49190612292565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5f61197c611672565b905061198981858561168b565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a04575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119fb9190612292565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a74575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a6b9190612292565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b5d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b549190612015565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bb3578060025f828254611ba7919061287e565b92505081905550611c81565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611c3c578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611c3393929190612b11565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc8578060025f8282540392505081905550611d12565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d6f9190612015565b60405180910390a3505050565b5f611d87848461156c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611e095781811015611dfa578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611df193929190612b11565b60405180910390fd5b611e0884848484035f611994565b5b50505050565b508054611e1b90612399565b5f825580601f10611e2c5750611e49565b601f0160209004905f5260205f2090810190611e489190611e4c565b5b50565b5b80821115611e63575f815f905550600101611e4d565b5090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611ea982611e67565b611eb38185611e71565b9350611ec3818560208601611e81565b611ecc81611e8f565b840191505092915050565b5f6020820190508181035f830152611eef8184611e9f565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f3182611f08565b9050919050565b611f4181611f27565b8114611f4b575f5ffd5b50565b5f81359050611f5c81611f38565b92915050565b5f819050919050565b611f7481611f62565b8114611f7e575f5ffd5b50565b5f81359050611f8f81611f6b565b92915050565b5f5f60408385031215611fab57611faa611f00565b5b5f611fb885828601611f4e565b9250506020611fc985828601611f81565b9150509250929050565b5f8115159050919050565b611fe781611fd3565b82525050565b5f6020820190506120005f830184611fde565b92915050565b61200f81611f62565b82525050565b5f6020820190506120285f830184612006565b92915050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61206c82611e8f565b810181811067ffffffffffffffff8211171561208b5761208a612036565b5b80604052505050565b5f61209d611ef7565b90506120a98282612063565b919050565b5f67ffffffffffffffff8211156120c8576120c7612036565b5b6120d182611e8f565b9050602081019050919050565b828183375f83830152505050565b5f6120fe6120f9846120ae565b612094565b90508281526020810184848401111561211a57612119612032565b5b6121258482856120de565b509392505050565b5f82601f8301126121415761214061202e565b5b81356121518482602086016120ec565b91505092915050565b5f5f5f5f5f5f60c0878903121561217457612173611f00565b5b5f61218189828a01611f4e565b965050602061219289828a01611f81565b95505060406121a389828a01611f81565b94505060606121b489828a01611f81565b93505060806121c589828a01611f81565b92505060a087013567ffffffffffffffff8111156121e6576121e5611f04565b5b6121f289828a0161212d565b9150509295509295509295565b5f5f5f6060848603121561221657612215611f00565b5b5f61222386828701611f4e565b935050602061223486828701611f4e565b925050604061224586828701611f81565b9150509250925092565b5f60ff82169050919050565b6122648161224f565b82525050565b5f60208201905061227d5f83018461225b565b92915050565b61228c81611f27565b82525050565b5f6020820190506122a55f830184612283565b92915050565b5f60a0820190506122be5f830188612006565b6122cb6020830187612006565b6122d86040830186612006565b6122e56060830185612006565b81810360808301526122f78184611e9f565b90509695505050505050565b5f6020828403121561231857612317611f00565b5b5f61232584828501611f4e565b91505092915050565b5f5f6040838503121561234457612343611f00565b5b5f61235185828601611f4e565b925050602061236285828601611f4e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806123b057607f821691505b6020821081036123c3576123c261236c565b5b50919050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f6123fd600e83611e71565b9150612408826123c9565b602082019050919050565b5f6020820190508181035f83015261242a816123f1565b9050919050565b7f5347693a20696e73756666696369656e742062616c616e636520666f72206c6f5f8201527f636b696e67000000000000000000000000000000000000000000000000000000602082015250565b5f61248b602583611e71565b915061249682612431565b604082019050919050565b5f6020820190508181035f8301526124b88161247f565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261251b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826124e0565b61252586836124e0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61256061255b61255684611f62565b61253d565b611f62565b9050919050565b5f819050919050565b61257983612546565b61258d61258582612567565b8484546124ec565b825550505050565b5f5f905090565b6125a4612595565b6125af818484612570565b505050565b5b818110156125d2576125c75f8261259c565b6001810190506125b5565b5050565b601f821115612617576125e8816124bf565b6125f1846124d1565b81016020851015612600578190505b61261461260c856124d1565b8301826125b4565b50505b505050565b5f82821c905092915050565b5f6126375f198460080261261c565b1980831691505092915050565b5f61264f8383612628565b9150826002028217905092915050565b61266882611e67565b67ffffffffffffffff81111561268157612680612036565b5b61268b8254612399565b6126968282856125d6565b5f60209050601f8311600181146126c7575f84156126b5578287015190505b6126bf8582612644565b865550612726565b601f1984166126d5866124bf565b5f5b828110156126fc578489015182556001820191506020850194506020810190506126d7565b868310156127195784890151612715601f891682612628565b8355505b6001600288020188555050505b505050505050565b7f5347693a20747279696e6720746f207472616e73666572206c6f636b656420745f8201527f6f6b656e73000000000000000000000000000000000000000000000000000000602082015250565b5f612788602583611e71565b91506127938261272e565b604082019050919050565b5f6020820190508181035f8301526127b58161277c565b9050919050565b7f4f6e6c79206e53476920636f6e74726163742063616e2063616c6c20746869735f82015250565b5f6127f0602083611e71565b91506127fb826127bc565b602082019050919050565b5f6020820190508181035f83015261281d816127e4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61288882611f62565b915061289383611f62565b92508282019050808211156128ab576128aa612851565b5b92915050565b5f6128bb82611f62565b91506128c683611f62565b92508282039050818111156128de576128dd612851565b5b92915050565b5f6128ee82611f62565b91506128f983611f62565b925082820261290781611f62565b9150828204841483151761291e5761291d612851565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61295c82611f62565b915061296783611f62565b92508261297757612976612925565b5b828204905092915050565b7f496e76616c696420696e646578000000000000000000000000000000000000005f82015250565b5f6129b6600d83611e71565b91506129c182612982565b602082019050919050565b5f6020820190508181035f8301526129e3816129aa565b9050919050565b5f815490506129f881612399565b9050919050565b818103612a0d575050612ae2565b612a16826129ea565b67ffffffffffffffff811115612a2f57612a2e612036565b5b612a398254612399565b612a448282856125d6565b5f601f831160018114612a71575f8415612a5f578287015490505b612a698582612644565b865550612adb565b601f198416612a7f876124bf565b9650612a8a866124bf565b5f5b82811015612ab157848901548255600182019150600185019450602081019050612a8c565b86831015612ace5784890154612aca601f891682612628565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f606082019050612b245f830186612283565b612b316020830185612006565b612b3e6040830184612006565b94935050505056fea2646970667358221220d4c093e7914c3127f5f4f05517c73549854300261ab2bd7e7fba88f8f099026964736f6c634300081e0033000000000000000000000000be64547924b2bf16782c903f0400308b50e3c4d4

Deployed Bytecode

0x608060405234801561000f575f5ffd5b506004361061014b575f3560e01c806370a08231116100c1578063a9059cbb1161007a578063a9059cbb1461038d578063ba408cdc146103bd578063c4086893146103d9578063d48de62214610409578063dd62ed3e14610427578063f2fde38b146104575761014b565b806370a08231146102cb578063715018a6146102fb57806374e68a1814610305578063815ed26c146103215780638da5cb5b1461035157806395d89b411461036f5761014b565b8063266449b111610113578063266449b114610207578063313ce567146102235780633886b5de1461024157806347fa58e21461025d57806353719b6e1461027b5780636a358abd146102af5761014b565b806306fdde031461014f578063095ea7b31461016d57806318160ddd1461019d5780631a7480c8146101bb57806323b872dd146101d7575b5f5ffd5b610157610473565b6040516101649190611ed7565b60405180910390f35b61018760048036038101906101829190611f95565b610503565b6040516101949190611fed565b60405180910390f35b6101a5610525565b6040516101b29190612015565b60405180910390f35b6101d560048036038101906101d0919061215a565b61052e565b005b6101f160048036038101906101ec91906121ff565b610776565b6040516101fe9190611fed565b60405180910390f35b610221600480360381019061021c919061215a565b6107d6565b005b61022b6109d2565b604051610238919061226a565b60405180910390f35b61025b60048036038101906102569190611f95565b6109da565b005b610265610ac5565b6040516102729190612292565b60405180910390f35b61029560048036038101906102909190611f95565b610aea565b6040516102a69594939291906122ab565b60405180910390f35b6102c960048036038101906102c49190612303565b610bbc565b005b6102e560048036038101906102e09190612303565b610c07565b6040516102f29190612015565b60405180910390f35b610303610c4c565b005b61031f600480360381019061031a9190612303565b610c5f565b005b61033b60048036038101906103369190612303565b610caa565b6040516103489190612015565b60405180910390f35b610359610e0c565b6040516103669190612292565b60405180910390f35b610377610e34565b6040516103849190611ed7565b60405180910390f35b6103a760048036038101906103a29190611f95565b610ec4565b6040516103b49190611fed565b60405180910390f35b6103d760048036038101906103d29190611f95565b610f22565b005b6103f360048036038101906103ee9190612303565b611400565b6040516104009190612015565b60405180910390f35b610411611547565b60405161041e9190612292565b60405180910390f35b610441600480360381019061043c919061232e565b61156c565b60405161044e9190612015565b60405180910390f35b610471600480360381019061046c9190612303565b6115ee565b005b60606003805461048290612399565b80601f01602080910402602001604051908101604052809291908181526020018280546104ae90612399565b80156104f95780601f106104d0576101008083540402835291602001916104f9565b820191905f5260205f20905b8154815290600101906020018083116104dc57829003601f168201915b5050505050905090565b5f5f61050d611672565b905061051a818585611679565b600191505092915050565b5f600254905090565b610536610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105bb575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6105fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f190612413565b60405180910390fd5b8461060433610c07565b1015610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c906124a1565b60405180910390fd5b61065033878761168b565b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060a0016040528087815260200186815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004019081610715919061265f565b5050508573ffffffffffffffffffffffffffffffffffffffff167f2896057126e5c49f9752223150606922c5e0e9e6193830ea6f559a0234a1ca5885858589866040516107669594939291906122ab565b60405180910390a2505050505050565b5f8161078185610caa565b10156107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b99061279e565b60405180910390fd5b6107cd84848461177b565b90509392505050565b6107de610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610863575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612413565b60405180910390fd5b6108ac86866117a9565b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060a0016040528087815260200186815260200185815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004019081610971919061265f565b5050508573ffffffffffffffffffffffffffffffffffffffff167f2896057126e5c49f9752223150606922c5e0e9e6193830ea6f559a0234a1ca5885858589866040516109c29594939291906122ab565b60405180910390a2505050505050565b5f6012905090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090612806565b60405180910390fd5b610a7382826117a9565b8173ffffffffffffffffffffffffffffffffffffffff167f776ae8ee7b414e3f15261edda8f8ee4929fa75e900dee24f09ae378354521b3982604051610ab99190612015565b60405180910390a25050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6006602052815f5260405f208181548110610b03575f80fd5b905f5260205f2090600502015f9150915050805f015490806001015490806002015490806003015490806004018054610b3b90612399565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790612399565b8015610bb25780601f10610b8957610100808354040283529160200191610bb2565b820191905f5260205f20905b815481529060010190602001808311610b9557829003601f168201915b5050505050905085565b610bc4611828565b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c54611828565b610c5d5f6118af565b565b610c67611828565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f5f90505f60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f90505b8180549050811015610dee575f828281548110610d1457610d13612824565b5b905f5260205f209060050201905080600201548160010154610d36919061287e565b421015610d5357805f015484610d4c919061287e565b9350610de0565b806003015481600201548260010154610d6c919061287e565b610d76919061287e565b421015610ddf575f81600201548260010154610d92919061287e565b42610d9d91906128b1565b90505f826003015482845f0154610db491906128e4565b610dbe9190612952565b905080835f0154610dcf91906128b1565b86610dda919061287e565b955050505b5b508080600101915050610cf4565b5081610df985610c07565b610e0391906128b1565b92505050919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e4390612399565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f90612399565b8015610eba5780601f10610e9157610100808354040283529160200191610eba565b820191905f5260205f20905b815481529060010190602001808311610e9d57829003601f168201915b5050505050905090565b5f81610ecf33610caa565b1015610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f079061279e565b60405180910390fd5b610f1a8383611972565b905092915050565b610f2a610e0c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610faf575060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590612413565b60405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508110611070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611067906129cc565b60405180910390fd5b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106110c0576110bf612824565b5b905f5260205f2090600502016040518060a00160405290815f820154815260200160018201548152602001600282015481526020016003820154815260200160048201805461110e90612399565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90612399565b80156111855780601f1061115c57610100808354040283529160200191611185565b820191905f5260205f20905b81548152906001019060200180831161116857829003601f168201915b505050505081525050905061119e8333835f015161168b565b5f8290505b600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506111f091906128b1565b8110156113045760065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600182611241919061287e565b8154811061125257611251612824565b5b905f5260205f20906005020160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082815481106112ad576112ac612824565b5b905f5260205f2090600502015f820154815f0155600182015481600101556002820154816002015560038201548160030155600482018160040190816112f391906129ff565b5090505080806001019150506111a3565b5060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080548061135257611351612ae4565b5b600190038181905f5260205f2090600502015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f61138f9190611e0f565b505090553373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc4cc5c1b6cf3b5cafd06bc7fa8b6320dbeea074c4f18c4c036e52a3a773aac54835f01516040516113f39190612015565b60405180910390a3505050565b5f5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f5f90505b8180549050811015611540575f82828154811061146657611465612824565b5b905f5260205f209060050201905080600201548160010154611488919061287e565b4210156114a557805f01548461149e919061287e565b9350611532565b8060030154816002015482600101546114be919061287e565b6114c8919061287e565b421015611531575f816002015482600101546114e4919061287e565b426114ef91906128b1565b90505f826003015482845f015461150691906128e4565b6115109190612952565b905080835f015461152191906128b1565b8661152c919061287e565b955050505b5b508080600101915050611446565b5050919050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6115f6611828565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611666575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161165d9190612292565b60405180910390fd5b61166f816118af565b50565b5f33905090565b6116868383836001611994565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116fb575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116f29190612292565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361176b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117629190612292565b60405180910390fd5b611776838383611b63565b505050565b5f5f611785611672565b9050611792858285611d7c565b61179d85858561168b565b60019150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611819575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118109190612292565b60405180910390fd5b6118245f8383611b63565b5050565b611830611672565b73ffffffffffffffffffffffffffffffffffffffff1661184e610e0c565b73ffffffffffffffffffffffffffffffffffffffff16146118ad57611871611672565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118a49190612292565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5f61197c611672565b905061198981858561168b565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a04575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119fb9190612292565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a74575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a6b9190612292565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b5d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b549190612015565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bb3578060025f828254611ba7919061287e565b92505081905550611c81565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611c3c578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611c3393929190612b11565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cc8578060025f8282540392505081905550611d12565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d6f9190612015565b60405180910390a3505050565b5f611d87848461156c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611e095781811015611dfa578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611df193929190612b11565b60405180910390fd5b611e0884848484035f611994565b5b50505050565b508054611e1b90612399565b5f825580601f10611e2c5750611e49565b601f0160209004905f5260205f2090810190611e489190611e4c565b5b50565b5b80821115611e63575f815f905550600101611e4d565b5090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611ea982611e67565b611eb38185611e71565b9350611ec3818560208601611e81565b611ecc81611e8f565b840191505092915050565b5f6020820190508181035f830152611eef8184611e9f565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f3182611f08565b9050919050565b611f4181611f27565b8114611f4b575f5ffd5b50565b5f81359050611f5c81611f38565b92915050565b5f819050919050565b611f7481611f62565b8114611f7e575f5ffd5b50565b5f81359050611f8f81611f6b565b92915050565b5f5f60408385031215611fab57611faa611f00565b5b5f611fb885828601611f4e565b9250506020611fc985828601611f81565b9150509250929050565b5f8115159050919050565b611fe781611fd3565b82525050565b5f6020820190506120005f830184611fde565b92915050565b61200f81611f62565b82525050565b5f6020820190506120285f830184612006565b92915050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61206c82611e8f565b810181811067ffffffffffffffff8211171561208b5761208a612036565b5b80604052505050565b5f61209d611ef7565b90506120a98282612063565b919050565b5f67ffffffffffffffff8211156120c8576120c7612036565b5b6120d182611e8f565b9050602081019050919050565b828183375f83830152505050565b5f6120fe6120f9846120ae565b612094565b90508281526020810184848401111561211a57612119612032565b5b6121258482856120de565b509392505050565b5f82601f8301126121415761214061202e565b5b81356121518482602086016120ec565b91505092915050565b5f5f5f5f5f5f60c0878903121561217457612173611f00565b5b5f61218189828a01611f4e565b965050602061219289828a01611f81565b95505060406121a389828a01611f81565b94505060606121b489828a01611f81565b93505060806121c589828a01611f81565b92505060a087013567ffffffffffffffff8111156121e6576121e5611f04565b5b6121f289828a0161212d565b9150509295509295509295565b5f5f5f6060848603121561221657612215611f00565b5b5f61222386828701611f4e565b935050602061223486828701611f4e565b925050604061224586828701611f81565b9150509250925092565b5f60ff82169050919050565b6122648161224f565b82525050565b5f60208201905061227d5f83018461225b565b92915050565b61228c81611f27565b82525050565b5f6020820190506122a55f830184612283565b92915050565b5f60a0820190506122be5f830188612006565b6122cb6020830187612006565b6122d86040830186612006565b6122e56060830185612006565b81810360808301526122f78184611e9f565b90509695505050505050565b5f6020828403121561231857612317611f00565b5b5f61232584828501611f4e565b91505092915050565b5f5f6040838503121561234457612343611f00565b5b5f61235185828601611f4e565b925050602061236285828601611f4e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806123b057607f821691505b6020821081036123c3576123c261236c565b5b50919050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f6123fd600e83611e71565b9150612408826123c9565b602082019050919050565b5f6020820190508181035f83015261242a816123f1565b9050919050565b7f5347693a20696e73756666696369656e742062616c616e636520666f72206c6f5f8201527f636b696e67000000000000000000000000000000000000000000000000000000602082015250565b5f61248b602583611e71565b915061249682612431565b604082019050919050565b5f6020820190508181035f8301526124b88161247f565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261251b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826124e0565b61252586836124e0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61256061255b61255684611f62565b61253d565b611f62565b9050919050565b5f819050919050565b61257983612546565b61258d61258582612567565b8484546124ec565b825550505050565b5f5f905090565b6125a4612595565b6125af818484612570565b505050565b5b818110156125d2576125c75f8261259c565b6001810190506125b5565b5050565b601f821115612617576125e8816124bf565b6125f1846124d1565b81016020851015612600578190505b61261461260c856124d1565b8301826125b4565b50505b505050565b5f82821c905092915050565b5f6126375f198460080261261c565b1980831691505092915050565b5f61264f8383612628565b9150826002028217905092915050565b61266882611e67565b67ffffffffffffffff81111561268157612680612036565b5b61268b8254612399565b6126968282856125d6565b5f60209050601f8311600181146126c7575f84156126b5578287015190505b6126bf8582612644565b865550612726565b601f1984166126d5866124bf565b5f5b828110156126fc578489015182556001820191506020850194506020810190506126d7565b868310156127195784890151612715601f891682612628565b8355505b6001600288020188555050505b505050505050565b7f5347693a20747279696e6720746f207472616e73666572206c6f636b656420745f8201527f6f6b656e73000000000000000000000000000000000000000000000000000000602082015250565b5f612788602583611e71565b91506127938261272e565b604082019050919050565b5f6020820190508181035f8301526127b58161277c565b9050919050565b7f4f6e6c79206e53476920636f6e74726163742063616e2063616c6c20746869735f82015250565b5f6127f0602083611e71565b91506127fb826127bc565b602082019050919050565b5f6020820190508181035f83015261281d816127e4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61288882611f62565b915061289383611f62565b92508282019050808211156128ab576128aa612851565b5b92915050565b5f6128bb82611f62565b91506128c683611f62565b92508282039050818111156128de576128dd612851565b5b92915050565b5f6128ee82611f62565b91506128f983611f62565b925082820261290781611f62565b9150828204841483151761291e5761291d612851565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61295c82611f62565b915061296783611f62565b92508261297757612976612925565b5b828204905092915050565b7f496e76616c696420696e646578000000000000000000000000000000000000005f82015250565b5f6129b6600d83611e71565b91506129c182612982565b602082019050919050565b5f6020820190508181035f8301526129e3816129aa565b9050919050565b5f815490506129f881612399565b9050919050565b818103612a0d575050612ae2565b612a16826129ea565b67ffffffffffffffff811115612a2f57612a2e612036565b5b612a398254612399565b612a448282856125d6565b5f601f831160018114612a71575f8415612a5f578287015490505b612a698582612644565b865550612adb565b601f198416612a7f876124bf565b9650612a8a866124bf565b5f5b82811015612ab157848901548255600182019150600185019450602081019050612a8c565b86831015612ace5784890154612aca601f891682612628565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f606082019050612b245f830186612283565b612b316020830185612006565b612b3e6040830184612006565b94935050505056fea2646970667358221220d4c093e7914c3127f5f4f05517c73549854300261ab2bd7e7fba88f8f099026964736f6c634300081e0033

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

000000000000000000000000be64547924b2bf16782c903f0400308b50e3c4d4

-----Decoded View---------------
Arg [0] : _daoController (address): 0xBe64547924b2Bf16782c903F0400308b50e3c4d4

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


Deployed Bytecode Sourcemap

25693:4817:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12985:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15278:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14087:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28804:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27086:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29346:426;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13938:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30290:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25990:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25898:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;26743:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14249:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24707:103;;;:::i;:::-;;26637:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27345:747;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24032:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13195:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26849:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29780:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28100:696;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25955:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14817:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24965:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12985:91;13030:13;13063:5;13056:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12985:91;:::o;15278:190::-;15351:4;15368:13;15384:12;:10;:12::i;:::-;15368:28;;15407:31;15416:5;15423:7;15432:5;15407:8;:31::i;:::-;15456:4;15449:11;;;15278:190;;;;:::o;14087:99::-;14139:7;14166:12;;14159:19;;14087:99;:::o;28804:534::-;26552:7;:5;:7::i;:::-;26538:21;;:10;:21;;;:52;;;;26577:13;;;;;;;;;;;26563:27;;:10;:27;;;26538:52;26530:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;29057:6:::1;29032:21;29042:10;29032:9;:21::i;:::-;:31;;29024:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29116:40;29126:10;29138:9;29149:6;29116:9;:40::i;:::-;29167:12;:23;29180:9;29167:23;;;;;;;;;;;;;;;29196:54;;;;;;;;29205:6;29196:54;;;;29213:9;29196:54;;;;29224:5;29196:54;;;;29231:8;29196:54;;;;29241:8;29196:54;;::::0;29167:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29274:9;29267:63;;;29285:9;29296:5;29303:8;29313:6;29321:8;29267:63;;;;;;;;;;:::i;:::-;;;;;;;;28804:534:::0;;;;;;:::o;27086:251::-;27175:4;27227:6;27200:23;27218:4;27200:17;:23::i;:::-;:33;;27192:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27293:36;27312:4;27318:2;27322:6;27293:18;:36::i;:::-;27286:43;;27086:251;;;;;:::o;29346:426::-;26552:7;:5;:7::i;:::-;26538:21;;:10;:21;;;:52;;;;26577:13;;;;;;;;;;;26563:27;;:10;:27;;;26538:52;26530:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;29566:24:::1;29572:9;29583:6;29566:5;:24::i;:::-;29601:12;:23;29614:9;29601:23;;;;;;;;;;;;;;;29630:54;;;;;;;;29639:6;29630:54;;;;29647:9;29630:54;;;;29658:5;29630:54;;;;29665:8;29630:54;;;;29675:8;29630:54;;::::0;29601:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29708:9;29701:63;;;29719:9;29730:5;29737:8;29747:6;29755:8;29701:63;;;;;;;;;;:::i;:::-;;;;;;;;29346:426:::0;;;;;;:::o;13938:84::-;13987:5;14012:2;14005:9;;13938:84;:::o;30290:217::-;30381:12;;;;;;;;;;;30367:26;;:10;:26;;;30359:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30441:17;30447:2;30451:6;30441:5;:17::i;:::-;30488:2;30474:25;;;30492:6;30474:25;;;;;;:::i;:::-;;;;;;;;30290:217;;:::o;25990:27::-;;;;;;;;;;;;;:::o;25898:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26743:98::-;23918:13;:11;:13::i;:::-;26828:5:::1;26813:12;;:20;;;;;;;;;;;;;;;;;;26743:98:::0;:::o;14249:118::-;14314:7;14341:9;:18;14351:7;14341:18;;;;;;;;;;;;;;;;14334:25;;14249:118;;;:::o;24707:103::-;23918:13;:11;:13::i;:::-;24772:30:::1;24799:1;24772:18;:30::i;:::-;24707:103::o:0;26637:98::-;23918:13;:11;:13::i;:::-;26723:4:::1;26707:13;;:20;;;;;;;;;;;;;;;;;;26637:98:::0;:::o;27345:747::-;27410:7;27430:14;27447:1;27430:18;;27459:24;27486:12;:21;27499:7;27486:21;;;;;;;;;;;;;;;27459:48;;27523:9;27535:1;27523:13;;27518:522;27542:5;:12;;;;27538:1;:16;27518:522;;;27576:21;27600:5;27606:1;27600:8;;;;;;;;:::i;:::-;;;;;;;;;;;;27576:32;;27662:4;:10;;;27645:4;:14;;;:27;;;;:::i;:::-;27627:15;:45;27623:406;;;27703:4;:11;;;27693:21;;;;;:::i;:::-;;;27623:406;;;27788:4;:13;;;27775:4;:10;;;27758:4;:14;;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;27740:15;:61;27736:293;;;27822:15;27876:4;:10;;;27859:4;:14;;;:27;;;;:::i;:::-;27840:15;:47;;;;:::i;:::-;27822:65;;27906:14;27949:4;:13;;;27938:7;27924:4;:11;;;:21;;;;:::i;:::-;27923:39;;;;:::i;:::-;27906:56;;28006:6;27992:4;:11;;;:20;;;;:::i;:::-;27981:32;;;;;:::i;:::-;;;27803:226;;27736:293;27623:406;27561:479;27556:3;;;;;;;27518:522;;;;28078:6;28057:18;28067:7;28057:9;:18::i;:::-;:27;;;;:::i;:::-;28050:34;;;;27345:747;;;:::o;24032:87::-;24078:7;24105:6;;;;;;;;;;;24098:13;;24032:87;:::o;13195:95::-;13242:13;13275:7;13268:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13195:95;:::o;26849:229::-;26920:4;26978:6;26945:29;26963:10;26945:17;:29::i;:::-;:39;;26937:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;27044:26;27059:2;27063:6;27044:14;:26::i;:::-;27037:33;;26849:229;;;;:::o;29780:502::-;26552:7;:5;:7::i;:::-;26538:21;;:10;:21;;;:52;;;;26577:13;;;;;;;;;;;26563:27;;:10;:27;;;26538:52;26530:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;29879:12:::1;:18;29892:4;29879:18;;;;;;;;;;;;;;;:25;;;;29871:5;:33;29863:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;29933:20;29956:12;:18;29969:4;29956:18;;;;;;;;;;;;;;;29975:5;29956:25;;;;;;;;:::i;:::-;;;;;;;;;;;;29933:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;29992:40;30002:4;30008:10;30020:4;:11;;;29992:9;:40::i;:::-;30050:6;30059:5;30050:14;;30045:137;30098:1;30070:12;:18;30083:4;30070:18;;;;;;;;;;;;;;;:25;;;;:29;;;;:::i;:::-;30066:1;:33;30045:137;;;30145:12;:18;30158:4;30145:18;;;;;;;;;;;;;;;30168:1;30164;:5;;;;:::i;:::-;30145:25;;;;;;;;:::i;:::-;;;;;;;;;;;;30121:12;:18;30134:4;30121:18;;;;;;;;;;;;;;;30140:1;30121:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;30101:3;;;;;;;30045:137;;;;30192:12;:18;30205:4;30192:18;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;30250:10;30234:40;;30244:4;30234:40;;;30262:4;:11;;;30234:40;;;;;;:::i;:::-;;;;;;;;29852:430;29780:502:::0;;:::o;28100:696::-;28166:19;28198:24;28225:12;:21;28238:7;28225:21;;;;;;;;;;;;;;;28198:48;;28262:9;28274:1;28262:13;;28257:532;28281:5;:12;;;;28277:1;:16;28257:532;;;28315:21;28339:5;28345:1;28339:8;;;;;;;;:::i;:::-;;;;;;;;;;;;28315:32;;28401:4;:10;;;28384:4;:14;;;:27;;;;:::i;:::-;28366:15;:45;28362:416;;;28447:4;:11;;;28432:26;;;;;:::i;:::-;;;28362:416;;;28532:4;:13;;;28519:4;:10;;;28502:4;:14;;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;28484:15;:61;28480:298;;;28566:15;28620:4;:10;;;28603:4;:14;;;:27;;;;:::i;:::-;28584:15;:47;;;;:::i;:::-;28566:65;;28650:14;28693:4;:13;;;28682:7;28668:4;:11;;;:21;;;;:::i;:::-;28667:39;;;;:::i;:::-;28650:56;;28755:6;28741:4;:11;;;:20;;;;:::i;:::-;28725:37;;;;;:::i;:::-;;;28547:231;;28480:298;28362:416;28300:489;28295:3;;;;;;;28257:532;;;;28187:609;28100:696;;;:::o;25955:28::-;;;;;;;;;;;;;:::o;14817:142::-;14897:7;14924:11;:18;14936:5;14924:18;;;;;;;;;;;;;;;:27;14943:7;14924:27;;;;;;;;;;;;;;;;14917:34;;14817:142;;;;:::o;24965:220::-;23918:13;:11;:13::i;:::-;25070:1:::1;25050:22;;:8;:22;;::::0;25046:93:::1;;25124:1;25096:31;;;;;;;;;;;:::i;:::-;;;;;;;;25046:93;25149:28;25168:8;25149:18;:28::i;:::-;24965:220:::0;:::o;4304:98::-;4357:7;4384:10;4377:17;;4304:98;:::o;20137:130::-;20222:37;20231:5;20238:7;20247:5;20254:4;20222:8;:37::i;:::-;20137:130;;;:::o;16712:308::-;16812:1;16796:18;;:4;:18;;;16792:88;;16865:1;16838:30;;;;;;;;;;;:::i;:::-;;;;;;;;16792:88;16908:1;16894:16;;:2;:16;;;16890:88;;16963:1;16934:32;;;;;;;;;;;:::i;:::-;;;;;;;;16890:88;16988:24;16996:4;17002:2;17006:5;16988:7;:24::i;:::-;16712:308;;;:::o;16078:249::-;16165:4;16182:15;16200:12;:10;:12::i;:::-;16182:30;;16223:37;16239:4;16245:7;16254:5;16223:15;:37::i;:::-;16271:26;16281:4;16287:2;16291:5;16271:9;:26::i;:::-;16315:4;16308:11;;;16078:249;;;;;:::o;18832:213::-;18922:1;18903:21;;:7;:21;;;18899:93;;18977:1;18948:32;;;;;;;;;;;:::i;:::-;;;;;;;;18899:93;19002:35;19018:1;19022:7;19031:5;19002:7;:35::i;:::-;18832:213;;:::o;24197:166::-;24268:12;:10;:12::i;:::-;24257:23;;:7;:5;:7::i;:::-;:23;;;24253:103;;24331:12;:10;:12::i;:::-;24304:40;;;;;;;;;;;:::i;:::-;;;;;;;;24253:103;24197:166::o;25345:191::-;25419:16;25438:6;;;;;;;;;;;25419:25;;25464:8;25455:6;;:17;;;;;;;;;;;;;;;;;;25519:8;25488:40;;25509:8;25488:40;;;;;;;;;;;;25408:128;25345:191;:::o;14572:182::-;14641:4;14658:13;14674:12;:10;:12::i;:::-;14658:28;;14697:27;14707:5;14714:2;14718:5;14697:9;:27::i;:::-;14742:4;14735:11;;;14572:182;;;;:::o;21134:443::-;21264:1;21247:19;;:5;:19;;;21243:91;;21319:1;21290:32;;;;;;;;;;;:::i;:::-;;;;;;;;21243:91;21367:1;21348:21;;:7;:21;;;21344:92;;21421:1;21393:31;;;;;;;;;;;:::i;:::-;;;;;;;;21344:92;21476:5;21446:11;:18;21458:5;21446:18;;;;;;;;;;;;;;;:27;21465:7;21446:27;;;;;;;;;;;;;;;:35;;;;21496:9;21492:78;;;21543:7;21527:31;;21536:5;21527:31;;;21552:5;21527:31;;;;;;:::i;:::-;;;;;;;;21492:78;21134:443;;;;:::o;17344:1135::-;17450:1;17434:18;;:4;:18;;;17430:552;;17588:5;17572:12;;:21;;;;;;;:::i;:::-;;;;;;;;17430:552;;;17626:19;17648:9;:15;17658:4;17648:15;;;;;;;;;;;;;;;;17626:37;;17696:5;17682:11;:19;17678:117;;;17754:4;17760:11;17773:5;17729:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17678:117;17950:5;17936:11;:19;17918:9;:15;17928:4;17918:15;;;;;;;;;;;;;;;:37;;;;17611:371;17430:552;18012:1;17998:16;;:2;:16;;;17994:435;;18180:5;18164:12;;:21;;;;;;;;;;;17994:435;;;18397:5;18380:9;:13;18390:2;18380:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;17994:435;18461:2;18446:25;;18455:4;18446:25;;;18465:5;18446:25;;;;;;:::i;:::-;;;;;;;;17344:1135;;;:::o;21869:486::-;21969:24;21996:25;22006:5;22013:7;21996:9;:25::i;:::-;21969:52;;22055:17;22036:16;:36;22032:316;;;22112:5;22093:16;:24;22089:132;;;22172:7;22181:16;22199:5;22145:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22089:132;22264:57;22273:5;22280:7;22308:5;22289:16;:24;22315:5;22264:8;:57::i;:::-;22032:316;21958:397;21869:486;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1242:75::-;1275:6;1308:2;1302:9;1292:19;;1242:75;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:118::-;3426:24;3444:5;3426:24;:::i;:::-;3421:3;3414:37;3339:118;;:::o;3463:222::-;3556:4;3594:2;3583:9;3579:18;3571:26;;3607:71;3675:1;3664:9;3660:17;3651:6;3607:71;:::i;:::-;3463:222;;;;:::o;3691:117::-;3800:1;3797;3790:12;3814:117;3923:1;3920;3913:12;3937:180;3985:77;3982:1;3975:88;4082:4;4079:1;4072:15;4106:4;4103:1;4096:15;4123:281;4206:27;4228:4;4206:27;:::i;:::-;4198:6;4194:40;4336:6;4324:10;4321:22;4300:18;4288:10;4285:34;4282:62;4279:88;;;4347:18;;:::i;:::-;4279:88;4387:10;4383:2;4376:22;4166:238;4123:281;;:::o;4410:129::-;4444:6;4471:20;;:::i;:::-;4461:30;;4500:33;4528:4;4520:6;4500:33;:::i;:::-;4410:129;;;:::o;4545:308::-;4607:4;4697:18;4689:6;4686:30;4683:56;;;4719:18;;:::i;:::-;4683:56;4757:29;4779:6;4757:29;:::i;:::-;4749:37;;4841:4;4835;4831:15;4823:23;;4545:308;;;:::o;4859:148::-;4957:6;4952:3;4947;4934:30;4998:1;4989:6;4984:3;4980:16;4973:27;4859:148;;;:::o;5013:425::-;5091:5;5116:66;5132:49;5174:6;5132:49;:::i;:::-;5116:66;:::i;:::-;5107:75;;5205:6;5198:5;5191:21;5243:4;5236:5;5232:16;5281:3;5272:6;5267:3;5263:16;5260:25;5257:112;;;5288:79;;:::i;:::-;5257:112;5378:54;5425:6;5420:3;5415;5378:54;:::i;:::-;5097:341;5013:425;;;;;:::o;5458:340::-;5514:5;5563:3;5556:4;5548:6;5544:17;5540:27;5530:122;;5571:79;;:::i;:::-;5530:122;5688:6;5675:20;5713:79;5788:3;5780:6;5773:4;5765:6;5761:17;5713:79;:::i;:::-;5704:88;;5520:278;5458:340;;;;:::o;5804:1237::-;5918:6;5926;5934;5942;5950;5958;6007:3;5995:9;5986:7;5982:23;5978:33;5975:120;;;6014:79;;:::i;:::-;5975:120;6134:1;6159:53;6204:7;6195:6;6184:9;6180:22;6159:53;:::i;:::-;6149:63;;6105:117;6261:2;6287:53;6332:7;6323:6;6312:9;6308:22;6287:53;:::i;:::-;6277:63;;6232:118;6389:2;6415:53;6460:7;6451:6;6440:9;6436:22;6415:53;:::i;:::-;6405:63;;6360:118;6517:2;6543:53;6588:7;6579:6;6568:9;6564:22;6543:53;:::i;:::-;6533:63;;6488:118;6645:3;6672:53;6717:7;6708:6;6697:9;6693:22;6672:53;:::i;:::-;6662:63;;6616:119;6802:3;6791:9;6787:19;6774:33;6834:18;6826:6;6823:30;6820:117;;;6856:79;;:::i;:::-;6820:117;6961:63;7016:7;7007:6;6996:9;6992:22;6961:63;:::i;:::-;6951:73;;6745:289;5804:1237;;;;;;;;:::o;7047:619::-;7124:6;7132;7140;7189:2;7177:9;7168:7;7164:23;7160:32;7157:119;;;7195:79;;:::i;:::-;7157:119;7315:1;7340:53;7385:7;7376:6;7365:9;7361:22;7340:53;:::i;:::-;7330:63;;7286:117;7442:2;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7413:118;7570:2;7596:53;7641:7;7632:6;7621:9;7617:22;7596:53;:::i;:::-;7586:63;;7541:118;7047:619;;;;;:::o;7672:86::-;7707:7;7747:4;7740:5;7736:16;7725:27;;7672:86;;;:::o;7764:112::-;7847:22;7863:5;7847:22;:::i;:::-;7842:3;7835:35;7764:112;;:::o;7882:214::-;7971:4;8009:2;7998:9;7994:18;7986:26;;8022:67;8086:1;8075:9;8071:17;8062:6;8022:67;:::i;:::-;7882:214;;;;:::o;8102:118::-;8189:24;8207:5;8189:24;:::i;:::-;8184:3;8177:37;8102:118;;:::o;8226:222::-;8319:4;8357:2;8346:9;8342:18;8334:26;;8370:71;8438:1;8427:9;8423:17;8414:6;8370:71;:::i;:::-;8226:222;;;;:::o;8454:755::-;8679:4;8717:3;8706:9;8702:19;8694:27;;8731:71;8799:1;8788:9;8784:17;8775:6;8731:71;:::i;:::-;8812:72;8880:2;8869:9;8865:18;8856:6;8812:72;:::i;:::-;8894;8962:2;8951:9;8947:18;8938:6;8894:72;:::i;:::-;8976;9044:2;9033:9;9029:18;9020:6;8976:72;:::i;:::-;9096:9;9090:4;9086:20;9080:3;9069:9;9065:19;9058:49;9124:78;9197:4;9188:6;9124:78;:::i;:::-;9116:86;;8454:755;;;;;;;;:::o;9215:329::-;9274:6;9323:2;9311:9;9302:7;9298:23;9294:32;9291:119;;;9329:79;;:::i;:::-;9291:119;9449:1;9474:53;9519:7;9510:6;9499:9;9495:22;9474:53;:::i;:::-;9464:63;;9420:117;9215:329;;;;:::o;9550:474::-;9618:6;9626;9675:2;9663:9;9654:7;9650:23;9646:32;9643:119;;;9681:79;;:::i;:::-;9643:119;9801:1;9826:53;9871:7;9862:6;9851:9;9847:22;9826:53;:::i;:::-;9816:63;;9772:117;9928:2;9954:53;9999:7;9990:6;9979:9;9975:22;9954:53;:::i;:::-;9944:63;;9899:118;9550:474;;;;;:::o;10030:180::-;10078:77;10075:1;10068:88;10175:4;10172:1;10165:15;10199:4;10196:1;10189:15;10216:320;10260:6;10297:1;10291:4;10287:12;10277:22;;10344:1;10338:4;10334:12;10365:18;10355:81;;10421:4;10413:6;10409:17;10399:27;;10355:81;10483:2;10475:6;10472:14;10452:18;10449:38;10446:84;;10502:18;;:::i;:::-;10446:84;10267:269;10216:320;;;:::o;10542:164::-;10682:16;10678:1;10670:6;10666:14;10659:40;10542:164;:::o;10712:366::-;10854:3;10875:67;10939:2;10934:3;10875:67;:::i;:::-;10868:74;;10951:93;11040:3;10951:93;:::i;:::-;11069:2;11064:3;11060:12;11053:19;;10712:366;;;:::o;11084:419::-;11250:4;11288:2;11277:9;11273:18;11265:26;;11337:9;11331:4;11327:20;11323:1;11312:9;11308:17;11301:47;11365:131;11491:4;11365:131;:::i;:::-;11357:139;;11084:419;;;:::o;11509:224::-;11649:34;11645:1;11637:6;11633:14;11626:58;11718:7;11713:2;11705:6;11701:15;11694:32;11509:224;:::o;11739:366::-;11881:3;11902:67;11966:2;11961:3;11902:67;:::i;:::-;11895:74;;11978:93;12067:3;11978:93;:::i;:::-;12096:2;12091:3;12087:12;12080:19;;11739:366;;;:::o;12111:419::-;12277:4;12315:2;12304:9;12300:18;12292:26;;12364:9;12358:4;12354:20;12350:1;12339:9;12335:17;12328:47;12392:131;12518:4;12392:131;:::i;:::-;12384:139;;12111:419;;;:::o;12536:141::-;12585:4;12608:3;12600:11;;12631:3;12628:1;12621:14;12665:4;12662:1;12652:18;12644:26;;12536:141;;;:::o;12683:93::-;12720:6;12767:2;12762;12755:5;12751:14;12747:23;12737:33;;12683:93;;;:::o;12782:107::-;12826:8;12876:5;12870:4;12866:16;12845:37;;12782:107;;;;:::o;12895:393::-;12964:6;13014:1;13002:10;12998:18;13037:97;13067:66;13056:9;13037:97;:::i;:::-;13155:39;13185:8;13174:9;13155:39;:::i;:::-;13143:51;;13227:4;13223:9;13216:5;13212:21;13203:30;;13276:4;13266:8;13262:19;13255:5;13252:30;13242:40;;12971:317;;12895:393;;;;;:::o;13294:60::-;13322:3;13343:5;13336:12;;13294:60;;;:::o;13360:142::-;13410:9;13443:53;13461:34;13470:24;13488:5;13470:24;:::i;:::-;13461:34;:::i;:::-;13443:53;:::i;:::-;13430:66;;13360:142;;;:::o;13508:75::-;13551:3;13572:5;13565:12;;13508:75;;;:::o;13589:269::-;13699:39;13730:7;13699:39;:::i;:::-;13760:91;13809:41;13833:16;13809:41;:::i;:::-;13801:6;13794:4;13788:11;13760:91;:::i;:::-;13754:4;13747:105;13665:193;13589:269;;;:::o;13864:73::-;13909:3;13930:1;13923:8;;13864:73;:::o;13943:189::-;14020:32;;:::i;:::-;14061:65;14119:6;14111;14105:4;14061:65;:::i;:::-;13996:136;13943:189;;:::o;14138:186::-;14198:120;14215:3;14208:5;14205:14;14198:120;;;14269:39;14306:1;14299:5;14269:39;:::i;:::-;14242:1;14235:5;14231:13;14222:22;;14198:120;;;14138:186;;:::o;14330:543::-;14431:2;14426:3;14423:11;14420:446;;;14465:38;14497:5;14465:38;:::i;:::-;14549:29;14567:10;14549:29;:::i;:::-;14539:8;14535:44;14732:2;14720:10;14717:18;14714:49;;;14753:8;14738:23;;14714:49;14776:80;14832:22;14850:3;14832:22;:::i;:::-;14822:8;14818:37;14805:11;14776:80;:::i;:::-;14435:431;;14420:446;14330:543;;;:::o;14879:117::-;14933:8;14983:5;14977:4;14973:16;14952:37;;14879:117;;;;:::o;15002:169::-;15046:6;15079:51;15127:1;15123:6;15115:5;15112:1;15108:13;15079:51;:::i;:::-;15075:56;15160:4;15154;15150:15;15140:25;;15053:118;15002:169;;;;:::o;15176:295::-;15252:4;15398:29;15423:3;15417:4;15398:29;:::i;:::-;15390:37;;15460:3;15457:1;15453:11;15447:4;15444:21;15436:29;;15176:295;;;;:::o;15476:1395::-;15593:37;15626:3;15593:37;:::i;:::-;15695:18;15687:6;15684:30;15681:56;;;15717:18;;:::i;:::-;15681:56;15761:38;15793:4;15787:11;15761:38;:::i;:::-;15846:67;15906:6;15898;15892:4;15846:67;:::i;:::-;15940:1;15964:4;15951:17;;15996:2;15988:6;15985:14;16013:1;16008:618;;;;16670:1;16687:6;16684:77;;;16736:9;16731:3;16727:19;16721:26;16712:35;;16684:77;16787:67;16847:6;16840:5;16787:67;:::i;:::-;16781:4;16774:81;16643:222;15978:887;;16008:618;16060:4;16056:9;16048:6;16044:22;16094:37;16126:4;16094:37;:::i;:::-;16153:1;16167:208;16181:7;16178:1;16175:14;16167:208;;;16260:9;16255:3;16251:19;16245:26;16237:6;16230:42;16311:1;16303:6;16299:14;16289:24;;16358:2;16347:9;16343:18;16330:31;;16204:4;16201:1;16197:12;16192:17;;16167:208;;;16403:6;16394:7;16391:19;16388:179;;;16461:9;16456:3;16452:19;16446:26;16504:48;16546:4;16538:6;16534:17;16523:9;16504:48;:::i;:::-;16496:6;16489:64;16411:156;16388:179;16613:1;16609;16601:6;16597:14;16593:22;16587:4;16580:36;16015:611;;;15978:887;;15568:1303;;;15476:1395;;:::o;16877:224::-;17017:34;17013:1;17005:6;17001:14;16994:58;17086:7;17081:2;17073:6;17069:15;17062:32;16877:224;:::o;17107:366::-;17249:3;17270:67;17334:2;17329:3;17270:67;:::i;:::-;17263:74;;17346:93;17435:3;17346:93;:::i;:::-;17464:2;17459:3;17455:12;17448:19;;17107:366;;;:::o;17479:419::-;17645:4;17683:2;17672:9;17668:18;17660:26;;17732:9;17726:4;17722:20;17718:1;17707:9;17703:17;17696:47;17760:131;17886:4;17760:131;:::i;:::-;17752:139;;17479:419;;;:::o;17904:182::-;18044:34;18040:1;18032:6;18028:14;18021:58;17904:182;:::o;18092:366::-;18234:3;18255:67;18319:2;18314:3;18255:67;:::i;:::-;18248:74;;18331:93;18420:3;18331:93;:::i;:::-;18449:2;18444:3;18440:12;18433:19;;18092:366;;;:::o;18464:419::-;18630:4;18668:2;18657:9;18653:18;18645:26;;18717:9;18711:4;18707:20;18703:1;18692:9;18688:17;18681:47;18745:131;18871:4;18745:131;:::i;:::-;18737:139;;18464:419;;;:::o;18889:180::-;18937:77;18934:1;18927:88;19034:4;19031:1;19024:15;19058:4;19055:1;19048:15;19075:180;19123:77;19120:1;19113:88;19220:4;19217:1;19210:15;19244:4;19241:1;19234:15;19261:191;19301:3;19320:20;19338:1;19320:20;:::i;:::-;19315:25;;19354:20;19372:1;19354:20;:::i;:::-;19349:25;;19397:1;19394;19390:9;19383:16;;19418:3;19415:1;19412:10;19409:36;;;19425:18;;:::i;:::-;19409:36;19261:191;;;;:::o;19458:194::-;19498:4;19518:20;19536:1;19518:20;:::i;:::-;19513:25;;19552:20;19570:1;19552:20;:::i;:::-;19547:25;;19596:1;19593;19589:9;19581:17;;19620:1;19614:4;19611:11;19608:37;;;19625:18;;:::i;:::-;19608:37;19458:194;;;;:::o;19658:410::-;19698:7;19721:20;19739:1;19721:20;:::i;:::-;19716:25;;19755:20;19773:1;19755:20;:::i;:::-;19750:25;;19810:1;19807;19803:9;19832:30;19850:11;19832:30;:::i;:::-;19821:41;;20011:1;20002:7;19998:15;19995:1;19992:22;19972:1;19965:9;19945:83;19922:139;;20041:18;;:::i;:::-;19922:139;19706:362;19658:410;;;;:::o;20074:180::-;20122:77;20119:1;20112:88;20219:4;20216:1;20209:15;20243:4;20240:1;20233:15;20260:185;20300:1;20317:20;20335:1;20317:20;:::i;:::-;20312:25;;20351:20;20369:1;20351:20;:::i;:::-;20346:25;;20390:1;20380:35;;20395:18;;:::i;:::-;20380:35;20437:1;20434;20430:9;20425:14;;20260:185;;;;:::o;20451:163::-;20591:15;20587:1;20579:6;20575:14;20568:39;20451:163;:::o;20620:366::-;20762:3;20783:67;20847:2;20842:3;20783:67;:::i;:::-;20776:74;;20859:93;20948:3;20859:93;:::i;:::-;20977:2;20972:3;20968:12;20961:19;;20620:366;;;:::o;20992:419::-;21158:4;21196:2;21185:9;21181:18;21173:26;;21245:9;21239:4;21235:20;21231:1;21220:9;21216:17;21209:47;21273:131;21399:4;21273:131;:::i;:::-;21265:139;;20992:419;;;:::o;21417:149::-;21466:6;21500:5;21494:12;21484:22;;21526:33;21552:6;21526:33;:::i;:::-;21516:43;;21417:149;;;:::o;21572:1451::-;21683:3;21677:4;21674:13;21671:26;;21690:5;;;;21671:26;21721:34;21751:3;21721:34;:::i;:::-;21820:18;21812:6;21809:30;21806:56;;;21842:18;;:::i;:::-;21806:56;21886:38;21918:4;21912:11;21886:38;:::i;:::-;21971:67;22031:6;22023;22017:4;21971:67;:::i;:::-;22065:1;22094:2;22086:6;22083:14;22111:1;22106:672;;;;22822:1;22839:6;22836:77;;;22888:9;22883:3;22879:19;22873:26;22864:35;;22836:77;22939:67;22999:6;22992:5;22939:67;:::i;:::-;22933:4;22926:81;22795:222;22076:941;;22106:672;22158:4;22154:9;22146:6;22142:22;22184:36;22216:3;22184:36;:::i;:::-;22177:43;;22247:37;22279:4;22247:37;:::i;:::-;22306:1;22320:207;22334:7;22331:1;22328:14;22320:207;;;22413:9;22408:3;22404:19;22398:26;22390:6;22383:42;22464:1;22456:6;22452:14;22442:24;;22511:1;22500:9;22496:17;22483:30;;22357:4;22354:1;22350:12;22345:17;;22320:207;;;22555:6;22546:7;22543:19;22540:179;;;22613:9;22608:3;22604:19;22598:26;22656:48;22698:4;22690:6;22686:17;22675:9;22656:48;:::i;:::-;22648:6;22641:64;22563:156;22540:179;22765:1;22761;22753:6;22749:14;22745:22;22739:4;22732:36;22113:665;;;22076:941;;21661:1362;;;21572:1451;;;:::o;23029:180::-;23077:77;23074:1;23067:88;23174:4;23171:1;23164:15;23198:4;23195:1;23188:15;23215:442;23364:4;23402:2;23391:9;23387:18;23379:26;;23415:71;23483:1;23472:9;23468:17;23459:6;23415:71;:::i;:::-;23496:72;23564:2;23553:9;23549:18;23540:6;23496:72;:::i;:::-;23578;23646:2;23635:9;23631:18;23622:6;23578:72;:::i;:::-;23215:442;;;;;;:::o

Swarm Source

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