Token StellaSwap

Overview ERC20

Price
$0.02 @ 0.078025 GLMR (+5.84%)
Fully Diluted Market Cap
Total Supply:
26,027,571.510469 STELLA

Holders:
9,017 addresses
Balance
227.165181368426300804 STELLA

Value
$4.54 ( ~17.7137 GLMR) [0.0009%]
0xea91b5e687a490380c52d264d5d36558d79f4188
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

StellaSwap is one of the first automated market-making (AMM), decentralized exchange (DEX) for the Moonbeam parachain network.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
Stellaswap (V3)
0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2-0XACC15DC74880C9944775448304B263D191C6077F$0.02
0.0000008 Btc
$6,519.04
311,804.394 0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2
58.4666%
2
Stellaswap (V3)
0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2-0X931715FEE2D06333043D11F658C8CE934AC61D0C$0.0191
0.0000007 Btc
$3,578.90
174,370.766 0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2
32.6964%
3
StellaSwap
0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2-0XACC15DC74880C9944775448304B263D191C6077F$0.0197
0.0000008 Btc
$760.32
37,339.666 0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2
7.0016%
4
StellaSwap
0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2-0X818EC0A7FE18FF94269904FCED6AE3DAE6D6DC0B$0.0197
0.0000008 Btc
$200.02
9,788.595 0X0E358838CE72D5E61E0018A2FFAC4BEC5F4C88D2
1.8355%
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Stella

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-01-17
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]



pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]



pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/token/Stella.sol


pragma solidity ^0.8.0;




contract Stella is ERC20("StellaSwap", "STELLA"), Ownable, AccessControl {
    using SafeERC20 for IERC20;

    // @notice Total number of tokens
    uint256 public maxSupply = 500_000_000e18; // 500 million STELLAR
    uint256 private _initialSupply = 100_000e18; // 100,000 tokens is the initial supply

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    constructor(){
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(MINTER_ROLE, _msgSender());
        _mint(_msgSender(), _initialSupply);
    }

    // @notice Creates `_amount` token to `_to`. Must only be called by the minter (RewardsDistributor).
    function mint(address _to, uint256 _amount) public onlyRole(MINTER_ROLE) {
        require(
            ( totalSupply() + _amount) <= maxSupply,
            "Stella::mint: cannot exceed max supply"
        );
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    // @notice A record of each accounts delegate
    mapping(address => address) internal _delegates;

    // @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    // @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    // @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    // @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );

    // @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    // @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    // @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    // @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)
        );

        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );

        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "STELLA::delegateBySig: invalid signature"
        );
        require(
            nonce == nonces[signatory]++,
            "STELLA::delegateBySig: invalid nonce"
        );
        require(block.timestamp <= expiry, "STELLA::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        external
        view
        returns (uint256)
    {
        require(
            blockNumber < block.number,
            "STELLA::getPriorVotes: not yet determined"
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying STELLAs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint256 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0
                    ? checkpoints[srcRep][srcRepNum - 1].votes
                    : 0;
                uint256 srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0
                    ? checkpoints[dstRep][dstRepNum - 1].votes
                    : 0;
                uint256 dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    ) internal {
        uint32 blockNumber = safe32(
            block.number,
            "STELLA::_writeCheckpoint: block number exceeds 32 bits"
        );

        if (
            nCheckpoints > 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                blockNumber,
                newVotes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526b019d971e4fe8401e7400000060075569152d02c7e14af68000006008553480156200002f57600080fd5b506040518060400160405280600a81526020017f5374656c6c6153776170000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f5354454c4c4100000000000000000000000000000000000000000000000000008152508160039080519060200190620000b492919062000542565b508060049080519060200190620000cd92919062000542565b505050620000f0620000e46200017e60201b60201c565b6200018660201b60201c565b620001146000801b620001086200017e60201b60201c565b6200024c60201b60201c565b620001557f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620001496200017e60201b60201c565b6200024c60201b60201c565b62000178620001696200017e60201b60201c565b6008546200026260201b60201c565b62000790565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200025e8282620003db60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002cc9062000645565b60405180910390fd5b620002e960008383620004cd60201b60201c565b8060026000828254620002fd919062000695565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000354919062000695565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003bb919062000667565b60405180910390a3620003d760008383620004d260201b60201c565b5050565b620003ed8282620004d760201b60201c565b620004c95760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200046e6200017e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200055090620006fc565b90600052602060002090601f016020900481019282620005745760008555620005c0565b82601f106200058f57805160ff1916838001178555620005c0565b82800160010185558215620005c0579182015b82811115620005bf578251825591602001919060010190620005a2565b5b509050620005cf9190620005d3565b5090565b5b80821115620005ee576000816000905550600101620005d4565b5090565b600062000601601f8362000684565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6200063f81620006f2565b82525050565b600060208201905081810360008301526200066081620005f2565b9050919050565b60006020820190506200067e600083018462000634565b92915050565b600082825260208201905092915050565b6000620006a282620006f2565b9150620006af83620006f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620006e757620006e662000732565b5b828201905092915050565b6000819050919050565b600060028204905060018216806200071557607f821691505b602082108114156200072c576200072b62000761565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61405b80620007a06000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063782d6fe11161011a578063b4b5ea57116100ad578063d5abeb011161007c578063d5abeb011461064d578063dd62ed3e1461066b578063e7a324dc1461069b578063f1127ed8146106b9578063f2fde38b146106ea57610206565b8063b4b5ea57146105c7578063c3cda520146105f7578063d539139314610613578063d547741f1461063157610206565b806395d89b41116100e957806395d89b411461052b578063a217fddf14610549578063a457c2d714610567578063a9059cbb1461059757610206565b8063782d6fe11461047d5780637ecebe00146104ad5780638da5cb5b146104dd57806391d14854146104fb57610206565b8063313ce5671161019d578063587cde1e1161016c578063587cde1e146103c75780635c19a95c146103f75780636fcfff451461041357806370a0823114610443578063715018a61461047357610206565b8063313ce5671461034157806336568abe1461035f578063395093511461037b57806340c10f19146103ab57610206565b806320606b70116101d957806320606b70146102a757806323b872dd146102c5578063248a9ca3146102f55780632f2ff15d1461032557610206565b806301ffc9a71461020b57806306fdde031461023b578063095ea7b31461025957806318160ddd14610289575b600080fd5b61022560048036038101906102209190612f12565b610706565b60405161023291906137b6565b60405180910390f35b610243610780565b60405161025091906138bb565b60405180910390f35b610273600480360381019061026e9190612dac565b610812565b60405161028091906137b6565b60405180910390f35b610291610830565b60405161029e9190613afd565b60405180910390f35b6102af61083a565b6040516102bc91906137d1565b60405180910390f35b6102df60048036038101906102da9190612d5d565b61085e565b6040516102ec91906137b6565b60405180910390f35b61030f600480360381019061030a9190612ead565b610956565b60405161031c91906137d1565b60405180910390f35b61033f600480360381019061033a9190612ed6565b610976565b005b61034961099f565b6040516103569190613b85565b60405180910390f35b61037960048036038101906103749190612ed6565b6109a8565b005b61039560048036038101906103909190612dac565b610a2b565b6040516103a291906137b6565b60405180910390f35b6103c560048036038101906103c09190612dac565b610ad7565b005b6103e160048036038101906103dc9190612cf8565b610bda565b6040516103ee919061379b565b60405180910390f35b610411600480360381019061040c9190612cf8565b610c43565b005b61042d60048036038101906104289190612cf8565b610c50565b60405161043a9190613b41565b60405180910390f35b61045d60048036038101906104589190612cf8565b610c73565b60405161046a9190613afd565b60405180910390f35b61047b610cbb565b005b61049760048036038101906104929190612dac565b610d43565b6040516104a49190613afd565b60405180910390f35b6104c760048036038101906104c29190612cf8565b61111a565b6040516104d49190613afd565b60405180910390f35b6104e5611132565b6040516104f2919061379b565b60405180910390f35b61051560048036038101906105109190612ed6565b61115c565b60405161052291906137b6565b60405180910390f35b6105336111c7565b60405161054091906138bb565b60405180910390f35b610551611259565b60405161055e91906137d1565b60405180910390f35b610581600480360381019061057c9190612dac565b611260565b60405161058e91906137b6565b60405180910390f35b6105b160048036038101906105ac9190612dac565b61134b565b6040516105be91906137b6565b60405180910390f35b6105e160048036038101906105dc9190612cf8565b611369565b6040516105ee9190613afd565b60405180910390f35b610611600480360381019061060c9190612de8565b611448565b005b61061b6116dd565b60405161062891906137d1565b60405180910390f35b61064b60048036038101906106469190612ed6565b611701565b005b61065561172a565b6040516106629190613afd565b60405180910390f35b61068560048036038101906106809190612d21565b611730565b6040516106929190613afd565b60405180910390f35b6106a36117b7565b6040516106b091906137d1565b60405180910390f35b6106d360048036038101906106ce9190612e71565b6117db565b6040516106e1929190613b5c565b60405180910390f35b61070460048036038101906106ff9190612cf8565b61181c565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610779575061077882611914565b5b9050919050565b60606003805461078f90613e42565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90613e42565b80156108085780601f106107dd57610100808354040283529160200191610808565b820191906000526020600020905b8154815290600101906020018083116107eb57829003601f168201915b5050505050905090565b600061082661081f61197e565b8484611986565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061086b848484611b51565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108b661197e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092d906139bd565b60405180910390fd5b61094a8561094261197e565b858403611986565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b61097f82610956565b6109908161098b61197e565b611dd2565b61099a8383611e6f565b505050565b60006012905090565b6109b061197e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490613abd565b60405180910390fd5b610a278282611f50565b5050565b6000610acd610a3861197e565b848460016000610a4661197e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ac89190613bc7565b611986565b6001905092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b0981610b0461197e565b611dd2565b60075482610b15610830565b610b1f9190613bc7565b1115610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790613a1d565b60405180910390fd5b610b6a8383612032565b610bd56000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612192565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c4d3382612433565b50565b600b6020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cc361197e565b73ffffffffffffffffffffffffffffffffffffffff16610ce1611132565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e906139dd565b60405180910390fd5b610d4160006125a4565b565b6000438210610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e90613a5d565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610df4576000915050611114565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610e439190613d16565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610ef057600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610eca9190613d16565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050611114565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610f71576000915050611114565b600080600183610f819190613d16565b90505b8163ffffffff168163ffffffff1611156110ae57600060028383610fa89190613d16565b610fb29190613c57565b82610fbd9190613d16565b90506000600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff16141561107d57806020015195505050505050611114565b86816000015163ffffffff161015611097578193506110a7565b6001826110a49190613d16565b92505b5050610f84565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546111d690613e42565b80601f016020809104026020016040519081016040528092919081815260200182805461120290613e42565b801561124f5780601f106112245761010080835404028352916020019161124f565b820191906000526020600020905b81548152906001019060200180831161123257829003601f168201915b5050505050905090565b6000801b81565b6000806001600061126f61197e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613a9d565b60405180910390fd5b61134061133761197e565b85858403611986565b600191505092915050565b600061135f61135861197e565b8484611b51565b6001905092915050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116113d3576000611440565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836114219190613d16565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611473610780565b8051906020012061148261266a565b306040516020016114969493929190613831565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016114e794939291906137ec565b6040516020818303038152906040528051906020012090506000828260405160200161151492919061372a565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516115519493929190613876565b6020604051602081039080840390855afa158015611573573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e6906139fd565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061163f90613e74565b919050558914611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b9061399d565b60405180910390fd5b874211156116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061395d565b60405180910390fd5b6116d1818b612433565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61170a82610956565b61171b8161171661197e565b611dd2565b6117258383611f50565b505050565b60075481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600a602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61182461197e565b73ffffffffffffffffffffffffffffffffffffffff16611842611132565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906139dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff9061391d565b60405180910390fd5b611911816125a4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90613a7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d9061393d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611b449190613afd565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb890613a3d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c28906138fd565b60405180910390fd5b611c3c838383612677565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061397d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d559190613bc7565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611db99190613afd565b60405180910390a3611dcc84848461267c565b50505050565b611ddc828261115c565b611e6b57611e018173ffffffffffffffffffffffffffffffffffffffff166014612681565b611e0f8360001c6020612681565b604051602001611e20929190613761565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6291906138bb565b60405180910390fd5b5050565b611e79828261115c565b611f4c5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ef161197e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f5a828261115c565b1561202e5760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fd361197e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209990613add565b60405180910390fd5b6120ae60008383612677565b80600260008282546120c09190613bc7565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121159190613bc7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161217a9190613afd565b60405180910390a361218e6000838361267c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121ce5750600081115b1561242e57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612300576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116122715760006122de565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846122bf9190613d16565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600083826122ee9190613ce2565b90506122fc8684848461297b565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461242d576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161239e57600061240b565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846123ec9190613d16565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000838261241b9190613bc7565b90506124298584848461297b565b5050505b5b505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006124a284610c73565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461259e828483612192565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b505050565b505050565b6060600060028360026126949190613c88565b61269e9190613bc7565b67ffffffffffffffff8111156126dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561270f5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061276d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106127f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026128379190613c88565b6128419190613bc7565b90505b600181111561292d577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106128e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061292690613e18565b9050612844565b5060008414612971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612968906138dd565b60405180910390fd5b8091505092915050565b600061299f43604051806060016040528060368152602001613ff060369139612c24565b905060008463ffffffff16118015612a3d57508063ffffffff16600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612a079190613d16565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15612ab75781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187612a919190613d16565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550612bcd565b60405180604001604052808263ffffffff16815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155905050600184612b6f9190613c1d565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612c15929190613b18565b60405180910390a25050505050565b600064010000000083108290612c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6791906138bb565b60405180910390fd5b5082905092915050565b600081359050612c8981613f65565b92915050565b600081359050612c9e81613f7c565b92915050565b600081359050612cb381613f93565b92915050565b600081359050612cc881613faa565b92915050565b600081359050612cdd81613fc1565b92915050565b600081359050612cf281613fd8565b92915050565b600060208284031215612d0a57600080fd5b6000612d1884828501612c7a565b91505092915050565b60008060408385031215612d3457600080fd5b6000612d4285828601612c7a565b9250506020612d5385828601612c7a565b9150509250929050565b600080600060608486031215612d7257600080fd5b6000612d8086828701612c7a565b9350506020612d9186828701612c7a565b9250506040612da286828701612cb9565b9150509250925092565b60008060408385031215612dbf57600080fd5b6000612dcd85828601612c7a565b9250506020612dde85828601612cb9565b9150509250929050565b60008060008060008060c08789031215612e0157600080fd5b6000612e0f89828a01612c7a565b9650506020612e2089828a01612cb9565b9550506040612e3189828a01612cb9565b9450506060612e4289828a01612ce3565b9350506080612e5389828a01612c8f565b92505060a0612e6489828a01612c8f565b9150509295509295509295565b60008060408385031215612e8457600080fd5b6000612e9285828601612c7a565b9250506020612ea385828601612cce565b9150509250929050565b600060208284031215612ebf57600080fd5b6000612ecd84828501612c8f565b91505092915050565b60008060408385031215612ee957600080fd5b6000612ef785828601612c8f565b9250506020612f0885828601612c7a565b9150509250929050565b600060208284031215612f2457600080fd5b6000612f3284828501612ca4565b91505092915050565b612f4481613d4a565b82525050565b612f5381613d5c565b82525050565b612f6281613d68565b82525050565b612f79612f7482613d68565b613ebd565b82525050565b6000612f8a82613ba0565b612f948185613bab565b9350612fa4818560208601613de5565b612fad81613f54565b840191505092915050565b6000612fc382613ba0565b612fcd8185613bbc565b9350612fdd818560208601613de5565b80840191505092915050565b6000612ff6602083613bab565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000613036602383613bab565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061309c602683613bab565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613102602283613bab565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613168602883613bab565b91507f5354454c4c413a3a64656c656761746542795369673a207369676e617475726560008301527f20657870697265640000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131ce600283613bbc565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061320e602683613bab565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613274602483613bab565b91507f5354454c4c413a3a64656c656761746542795369673a20696e76616c6964206e60008301527f6f6e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132da602883613bab565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613340602083613bab565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613380602883613bab565b91507f5354454c4c413a3a64656c656761746542795369673a20696e76616c6964207360008301527f69676e61747572650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133e6602683613bab565b91507f5374656c6c613a3a6d696e743a2063616e6e6f7420657863656564206d61782060008301527f737570706c7900000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061344c602583613bab565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134b2602983613bab565b91507f5354454c4c413a3a6765745072696f72566f7465733a206e6f7420796574206460008301527f657465726d696e656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000613518602483613bab565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061357e601783613bbc565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b60006135be602583613bab565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613624601183613bbc565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b6000613664602f83613bab565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b60006136ca601f83613bab565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b61370681613dbe565b82525050565b61371581613dc8565b82525050565b61372481613dd8565b82525050565b6000613735826131c1565b91506137418285612f68565b6020820191506137518284612f68565b6020820191508190509392505050565b600061376c82613571565b91506137788285612fb8565b915061378382613617565b915061378f8284612fb8565b91508190509392505050565b60006020820190506137b06000830184612f3b565b92915050565b60006020820190506137cb6000830184612f4a565b92915050565b60006020820190506137e66000830184612f59565b92915050565b60006080820190506138016000830187612f59565b61380e6020830186612f3b565b61381b60408301856136fd565b61382860608301846136fd565b95945050505050565b60006080820190506138466000830187612f59565b6138536020830186612f59565b61386060408301856136fd565b61386d6060830184612f3b565b95945050505050565b600060808201905061388b6000830187612f59565b613898602083018661371b565b6138a56040830185612f59565b6138b26060830184612f59565b95945050505050565b600060208201905081810360008301526138d58184612f7f565b905092915050565b600060208201905081810360008301526138f681612fe9565b9050919050565b6000602082019050818103600083015261391681613029565b9050919050565b600060208201905081810360008301526139368161308f565b9050919050565b60006020820190508181036000830152613956816130f5565b9050919050565b600060208201905081810360008301526139768161315b565b9050919050565b6000602082019050818103600083015261399681613201565b9050919050565b600060208201905081810360008301526139b681613267565b9050919050565b600060208201905081810360008301526139d6816132cd565b9050919050565b600060208201905081810360008301526139f681613333565b9050919050565b60006020820190508181036000830152613a1681613373565b9050919050565b60006020820190508181036000830152613a36816133d9565b9050919050565b60006020820190508181036000830152613a568161343f565b9050919050565b60006020820190508181036000830152613a76816134a5565b9050919050565b60006020820190508181036000830152613a968161350b565b9050919050565b60006020820190508181036000830152613ab6816135b1565b9050919050565b60006020820190508181036000830152613ad681613657565b9050919050565b60006020820190508181036000830152613af6816136bd565b9050919050565b6000602082019050613b1260008301846136fd565b92915050565b6000604082019050613b2d60008301856136fd565b613b3a60208301846136fd565b9392505050565b6000602082019050613b56600083018461370c565b92915050565b6000604082019050613b71600083018561370c565b613b7e60208301846136fd565b9392505050565b6000602082019050613b9a600083018461371b565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613bd282613dbe565b9150613bdd83613dbe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c1257613c11613ec7565b5b828201905092915050565b6000613c2882613dc8565b9150613c3383613dc8565b92508263ffffffff03821115613c4c57613c4b613ec7565b5b828201905092915050565b6000613c6282613dc8565b9150613c6d83613dc8565b925082613c7d57613c7c613ef6565b5b828204905092915050565b6000613c9382613dbe565b9150613c9e83613dbe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cd757613cd6613ec7565b5b828202905092915050565b6000613ced82613dbe565b9150613cf883613dbe565b925082821015613d0b57613d0a613ec7565b5b828203905092915050565b6000613d2182613dc8565b9150613d2c83613dc8565b925082821015613d3f57613d3e613ec7565b5b828203905092915050565b6000613d5582613d9e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015613e03578082015181840152602081019050613de8565b83811115613e12576000848401525b50505050565b6000613e2382613dbe565b91506000821415613e3757613e36613ec7565b5b600182039050919050565b60006002820490506001821680613e5a57607f821691505b60208210811415613e6e57613e6d613f25565b5b50919050565b6000613e7f82613dbe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613eb257613eb1613ec7565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b613f6e81613d4a565b8114613f7957600080fd5b50565b613f8581613d68565b8114613f9057600080fd5b50565b613f9c81613d72565b8114613fa757600080fd5b50565b613fb381613dbe565b8114613fbe57600080fd5b50565b613fca81613dc8565b8114613fd557600080fd5b50565b613fe181613dd8565b8114613fec57600080fd5b5056fe5354454c4c413a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212208f6a2984ed73bc91f05cdf12a92202d68e0dc2690058388ddb55da025e13a39964736f6c63430008000033

Deployed ByteCode Sourcemap

44787:9882:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28054:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6398:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8565:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7518:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46778:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9216:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29465:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29850:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7360:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30898:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10117:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45457:312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47873:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48138:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46658:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7689:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18014:94;;;:::i;:::-;;50657:1295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47232:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17363:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28350:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6617:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27441:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10835:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8029:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49990:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48676:1113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45104:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30242:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44941:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8267:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47026:126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46522:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18263:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28054:204;28139:4;28178:32;28163:47;;;:11;:47;;;;:87;;;;28214:36;28238:11;28214:23;:36::i;:::-;28163:87;28156:94;;28054:204;;;:::o;6398:100::-;6452:13;6485:5;6478:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6398:100;:::o;8565:169::-;8648:4;8665:39;8674:12;:10;:12::i;:::-;8688:7;8697:6;8665:8;:39::i;:::-;8722:4;8715:11;;8565:169;;;;:::o;7518:108::-;7579:7;7606:12;;7599:19;;7518:108;:::o;46778:155::-;46829:104;46778:155;:::o;9216:492::-;9356:4;9373:36;9383:6;9391:9;9402:6;9373:9;:36::i;:::-;9422:24;9449:11;:19;9461:6;9449:19;;;;;;;;;;;;;;;:33;9469:12;:10;:12::i;:::-;9449:33;;;;;;;;;;;;;;;;9422:60;;9521:6;9501:16;:26;;9493:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9608:57;9617:6;9625:12;:10;:12::i;:::-;9658:6;9639:16;:25;9608:8;:57::i;:::-;9696:4;9689:11;;;9216:492;;;;;:::o;29465:123::-;29531:7;29558:6;:12;29565:4;29558:12;;;;;;;;;;;:22;;;29551:29;;29465:123;;;:::o;29850:147::-;29933:18;29946:4;29933:12;:18::i;:::-;27932:30;27943:4;27949:12;:10;:12::i;:::-;27932:10;:30::i;:::-;29964:25:::1;29975:4;29981:7;29964:10;:25::i;:::-;29850:147:::0;;;:::o;7360:93::-;7418:5;7443:2;7436:9;;7360:93;:::o;30898:218::-;31005:12;:10;:12::i;:::-;30994:23;;:7;:23;;;30986:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31082:26;31094:4;31100:7;31082:11;:26::i;:::-;30898:218;;:::o;10117:215::-;10205:4;10222:80;10231:12;:10;:12::i;:::-;10245:7;10291:10;10254:11;:25;10266:12;:10;:12::i;:::-;10254:25;;;;;;;;;;;;;;;:34;10280:7;10254:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10222:8;:80::i;:::-;10320:4;10313:11;;10117:215;;;;:::o;45457:312::-;45142:24;27932:30;27943:4;27949:12;:10;:12::i;:::-;27932:10;:30::i;:::-;45593:9:::1;;45581:7;45565:13;:11;:13::i;:::-;:23;;;;:::i;:::-;45563:39;;45541:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;45679:19;45685:3;45690:7;45679:5;:19::i;:::-;45709:52;45732:1;45736:10;:15;45747:3;45736:15;;;;;;;;;;;;;;;;;;;;;;;;;45753:7;45709:14;:52::i;:::-;45457:312:::0;;;:::o;47873:117::-;47934:7;47961:10;:21;47972:9;47961:21;;;;;;;;;;;;;;;;;;;;;;;;;47954:28;;47873:117;;;:::o;48138:104::-;48202:32;48212:10;48224:9;48202;:32::i;:::-;48138:104;:::o;46658:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;7689:127::-;7763:7;7790:9;:18;7800:7;7790:18;;;;;;;;;;;;;;;;7783:25;;7689:127;;;:::o;18014:94::-;17594:12;:10;:12::i;:::-;17583:23;;:7;:5;:7::i;:::-;:23;;;17575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18079:21:::1;18097:1;18079:9;:21::i;:::-;18014:94::o:0;50657:1295::-;50768:7;50829:12;50815:11;:26;50793:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50923:19;50945:14;:23;50960:7;50945:23;;;;;;;;;;;;;;;;;;;;;;;;;50923:45;;50999:1;50983:12;:17;;;50979:58;;;51024:1;51017:8;;;;;50979:58;51149:11;51097;:20;51109:7;51097:20;;;;;;;;;;;;;;;:38;51133:1;51118:12;:16;;;;:::i;:::-;51097:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;51093:147;;51184:11;:20;51196:7;51184:20;;;;;;;;;;;;;;;:38;51220:1;51205:12;:16;;;;:::i;:::-;51184:38;;;;;;;;;;;;;;;:44;;;51177:51;;;;;51093:147;51337:11;51301;:20;51313:7;51301:20;;;;;;;;;;;;;;;:23;51322:1;51301:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;51297:88;;;51372:1;51365:8;;;;;51297:88;51397:12;51424;51454:1;51439:12;:16;;;;:::i;:::-;51424:31;;51466:428;51481:5;51473:13;;:5;:13;;;51466:428;;;51503:13;51545:1;51536:5;51528;:13;;;;:::i;:::-;51527:19;;;;:::i;:::-;51519:5;:27;;;;:::i;:::-;51503:43;;51588:20;51611:11;:20;51623:7;51611:20;;;;;;;;;;;;;;;:28;51632:6;51611:28;;;;;;;;;;;;;;;51588:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51674:11;51658:2;:12;;;:27;;;51654:229;;;51713:2;:8;;;51706:15;;;;;;;;;51654:229;51762:11;51747:2;:12;;;:26;;;51743:140;;;51802:6;51794:14;;51743:140;;;51866:1;51857:6;:10;;;;:::i;:::-;51849:18;;51743:140;51466:428;;;;;51911:11;:20;51923:7;51911:20;;;;;;;;;;;;;;;:27;51932:5;51911:27;;;;;;;;;;;;;;;:33;;;51904:40;;;;;50657:1295;;;;;:::o;47232:41::-;;;;;;;;;;;;;;;;;:::o;17363:87::-;17409:7;17436:6;;;;;;;;;;;17429:13;;17363:87;:::o;28350:139::-;28428:4;28452:6;:12;28459:4;28452:12;;;;;;;;;;;:20;;:29;28473:7;28452:29;;;;;;;;;;;;;;;;;;;;;;;;;28445:36;;28350:139;;;;:::o;6617:104::-;6673:13;6706:7;6699:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6617:104;:::o;27441:49::-;27486:4;27441:49;;;:::o;10835:413::-;10928:4;10945:24;10972:11;:25;10984:12;:10;:12::i;:::-;10972:25;;;;;;;;;;;;;;;:34;10998:7;10972:34;;;;;;;;;;;;;;;;10945:61;;11045:15;11025:16;:35;;11017:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11138:67;11147:12;:10;:12::i;:::-;11161:7;11189:15;11170:16;:34;11138:8;:67::i;:::-;11236:4;11229:11;;;10835:413;;;;:::o;8029:175::-;8115:4;8132:42;8142:12;:10;:12::i;:::-;8156:9;8167:6;8132:9;:42::i;:::-;8192:4;8185:11;;8029:175;;;;:::o;49990:236::-;50055:7;50075:19;50097:14;:23;50112:7;50097:23;;;;;;;;;;;;;;;;;;;;;;;;;50075:45;;50166:1;50151:12;:16;;;:67;;50217:1;50151:67;;;50170:11;:20;50182:7;50170:20;;;;;;;;;;;;;;;:38;50206:1;50191:12;:16;;;;:::i;:::-;50170:38;;;;;;;;;;;;;;;:44;;;50151:67;50131:87;;;49990:236;;;:::o;48676:1113::-;48861:23;46829:104;48990:6;:4;:6::i;:::-;48974:24;;;;;;49017:12;:10;:12::i;:::-;49056:4;48911:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48887:200;;;;;;48861:226;;49100:18;47081:71;49177:9;49188:5;49195:6;49145:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49121:92;;;;;;49100:113;;49226:14;49296:15;49313:10;49267:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49243:92;;;;;;49226:109;;49348:17;49368:26;49378:6;49386:1;49389;49392;49368:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49348:46;;49448:1;49427:23;;:9;:23;;;;49405:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49560:6;:17;49567:9;49560:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;49551:5;:28;49529:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;49681:6;49662:15;:25;;49654:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;49750:31;49760:9;49771;49750;:31::i;:::-;49743:38;;;;48676:1113;;;;;;:::o;45104:62::-;45142:24;45104:62;:::o;30242:149::-;30326:18;30339:4;30326:12;:18::i;:::-;27932:30;27943:4;27949:12;:10;:12::i;:::-;27932:10;:30::i;:::-;30357:26:::1;30369:4;30375:7;30357:11;:26::i;:::-;30242:149:::0;;;:::o;44941:41::-;;;;:::o;8267:151::-;8356:7;8383:11;:18;8395:5;8383:18;;;;;;;;;;;;;;;:27;8402:7;8383:27;;;;;;;;;;;;;;;;8376:34;;8267:151;;;;:::o;47026:126::-;47081:71;47026:126;:::o;46522:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18263:192::-;17594:12;:10;:12::i;:::-;17583:23;;:7;:5;:7::i;:::-;:23;;;17575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18372:1:::1;18352:22;;:8;:22;;;;18344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18428:19;18438:8;18428:9;:19::i;:::-;18263:192:::0;:::o;25369:157::-;25454:4;25493:25;25478:40;;;:11;:40;;;;25471:47;;25369:157;;;:::o;4105:98::-;4158:7;4185:10;4178:17;;4105:98;:::o;14519:380::-;14672:1;14655:19;;:5;:19;;;;14647:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14753:1;14734:21;;:7;:21;;;;14726:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14837:6;14807:11;:18;14819:5;14807:18;;;;;;;;;;;;;;;:27;14826:7;14807:27;;;;;;;;;;;;;;;:36;;;;14875:7;14859:32;;14868:5;14859:32;;;14884:6;14859:32;;;;;;:::i;:::-;;;;;;;;14519:380;;;:::o;11738:733::-;11896:1;11878:20;;:6;:20;;;;11870:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11980:1;11959:23;;:9;:23;;;;11951:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12035:47;12056:6;12064:9;12075:6;12035:20;:47::i;:::-;12095:21;12119:9;:17;12129:6;12119:17;;;;;;;;;;;;;;;;12095:41;;12172:6;12155:13;:23;;12147:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12293:6;12277:13;:22;12257:9;:17;12267:6;12257:17;;;;;;;;;;;;;;;:42;;;;12345:6;12321:9;:20;12331:9;12321:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12386:9;12369:35;;12378:6;12369:35;;;12397:6;12369:35;;;;;;:::i;:::-;;;;;;;;12417:46;12437:6;12445:9;12456:6;12417:19;:46::i;:::-;11738:733;;;;:::o;28779:497::-;28860:22;28868:4;28874:7;28860;:22::i;:::-;28855:414;;29048:41;29076:7;29048:41;;29086:2;29048:19;:41::i;:::-;29162:38;29190:4;29182:13;;29197:2;29162:19;:38::i;:::-;28953:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28899:358;;;;;;;;;;;:::i;:::-;;;;;;;;28855:414;28779:497;;:::o;32202:229::-;32277:22;32285:4;32291:7;32277;:22::i;:::-;32272:152;;32348:4;32316:6;:12;32323:4;32316:12;;;;;;;;;;;:20;;:29;32337:7;32316:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;32399:12;:10;:12::i;:::-;32372:40;;32390:7;32372:40;;32384:4;32372:40;;;;;;;;;;32272:152;32202:229;;:::o;32439:230::-;32514:22;32522:4;32528:7;32514;:22::i;:::-;32510:152;;;32585:5;32553:6;:12;32560:4;32553:12;;;;;;;;;;;:20;;:29;32574:7;32553:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32637:12;:10;:12::i;:::-;32610:40;;32628:7;32610:40;;32622:4;32610:40;;;;;;;;;;32510:152;32439:230;;:::o;12758:399::-;12861:1;12842:21;;:7;:21;;;;12834:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12912:49;12941:1;12945:7;12954:6;12912:20;:49::i;:::-;12990:6;12974:12;;:22;;;;;;;:::i;:::-;;;;;;;;13029:6;13007:9;:18;13017:7;13007:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13072:7;13051:37;;13068:1;13051:37;;;13081:6;13051:37;;;;;;:::i;:::-;;;;;;;;13101:48;13129:1;13133:7;13142:6;13101:19;:48::i;:::-;12758:399;;:::o;52394:1059::-;52534:6;52524:16;;:6;:16;;;;:30;;;;;52553:1;52544:6;:10;52524:30;52520:926;;;52593:1;52575:20;;:6;:20;;;52571:424;;52664:16;52683:14;:22;52698:6;52683:22;;;;;;;;;;;;;;;;;;;;;;;;;52664:41;;52724:17;52756:1;52744:9;:13;;;:102;;52845:1;52744:102;;;52781:11;:19;52793:6;52781:19;;;;;;;;;;;;;;;:34;52813:1;52801:9;:13;;;;:::i;:::-;52781:34;;;;;;;;;;;;;;;:40;;;52744:102;52724:122;;52865:17;52897:6;52885:9;:18;;;;:::i;:::-;52865:38;;52922:57;52939:6;52947:9;52958;52969;52922:16;:57::i;:::-;52571:424;;;;53033:1;53015:20;;:6;:20;;;53011:424;;53104:16;53123:14;:22;53138:6;53123:22;;;;;;;;;;;;;;;;;;;;;;;;;53104:41;;53164:17;53196:1;53184:9;:13;;;:102;;53285:1;53184:102;;;53221:11;:19;53233:6;53221:19;;;;;;;;;;;;;;;:34;53253:1;53241:9;:13;;;;:::i;:::-;53221:34;;;;;;;;;;;;;;;:40;;;53184:102;53164:122;;53305:17;53337:6;53325:9;:18;;;;:::i;:::-;53305:38;;53362:57;53379:6;53387:9;53398;53409;53362:16;:57::i;:::-;53011:424;;;;52520:926;52394:1059;;;:::o;51960:426::-;52037:23;52063:10;:21;52074:9;52063:21;;;;;;;;;;;;;;;;;;;;;;;;;52037:47;;52095:24;52122:20;52132:9;52122;:20::i;:::-;52095:47;;52224:9;52200:10;:21;52211:9;52200:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52295:9;52251:54;;52278:15;52251:54;;52267:9;52251:54;;;;;;;;;;;;52318:60;52333:15;52350:9;52361:16;52318:14;:60::i;:::-;51960:426;;;;:::o;18463:173::-;18519:16;18538:6;;;;;;;;;;;18519:25;;18564:8;18555:6;;:17;;;;;;;;;;;;;;;;;;18619:8;18588:40;;18609:8;18588:40;;;;;;;;;;;;18463:173;;:::o;54488:178::-;54533:7;54553:15;54614:9;54603:20;;54651:7;54644:14;;;54488:178;:::o;15499:125::-;;;;:::o;16228:124::-;;;;:::o;23250:451::-;23325:13;23351:19;23396:1;23387:6;23383:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23373:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23351:47;;23409:15;:6;23416:1;23409:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;23435;:6;23442:1;23435:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;23466:9;23491:1;23482:6;23478:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;23466:26;;23461:135;23498:1;23494;:5;23461:135;;;23533:12;23554:3;23546:5;:11;23533:25;;;;;;;;;;;;;;;;;;23521:6;23528:1;23521:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;23583:1;23573:11;;;;;23501:3;;;;:::i;:::-;;;23461:135;;;;23623:1;23614:5;:10;23606:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23686:6;23672:21;;;23250:451;;;;:::o;53461:815::-;53626:18;53647:115;53668:12;53647:115;;;;;;;;;;;;;;;;;:6;:115::i;:::-;53626:136;;53808:1;53793:12;:16;;;:98;;;;;53880:11;53826:65;;:11;:22;53838:9;53826:22;;;;;;;;;;;;;;;:40;53864:1;53849:12;:16;;;;:::i;:::-;53826:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;53793:98;53775:425;;;53967:8;53918:11;:22;53930:9;53918:22;;;;;;;;;;;;;;;:40;53956:1;53941:12;:16;;;;:::i;:::-;53918:40;;;;;;;;;;;;;;;:46;;:57;;;;53775:425;;;54047:82;;;;;;;;54076:11;54047:82;;;;;;54106:8;54047:82;;;54008:11;:22;54020:9;54008:22;;;;;;;;;;;;;;;:36;54031:12;54008:36;;;;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54187:1;54172:12;:16;;;;:::i;:::-;54144:14;:25;54159:9;54144:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;53775:425;54238:9;54217:51;;;54249:8;54259;54217:51;;;;;;;:::i;:::-;;;;;;;;53461:815;;;;;:::o;54284:196::-;54389:6;54425:5;54421:1;:9;54432:12;54413:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;54470:1;54456:16;;54284:196;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:137::-;;380:6;367:20;358:29;;396:32;422:5;396:32;:::i;:::-;348:86;;;;:::o;440:139::-;;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;492:87;;;;:::o;585:137::-;;668:6;655:20;646:29;;684:32;710:5;684:32;:::i;:::-;636:86;;;;:::o;728:135::-;;810:6;797:20;788:29;;826:31;851:5;826:31;:::i;:::-;778:85;;;;:::o;869:262::-;;977:2;965:9;956:7;952:23;948:32;945:2;;;993:1;990;983:12;945:2;1036:1;1061:53;1106:7;1097:6;1086:9;1082:22;1061:53;:::i;:::-;1051:63;;1007:117;935:196;;;;:::o;1137:407::-;;;1262:2;1250:9;1241:7;1237:23;1233:32;1230:2;;;1278:1;1275;1268:12;1230:2;1321:1;1346:53;1391:7;1382:6;1371:9;1367:22;1346:53;:::i;:::-;1336:63;;1292:117;1448:2;1474:53;1519:7;1510:6;1499:9;1495:22;1474:53;:::i;:::-;1464:63;;1419:118;1220:324;;;;;:::o;1550:552::-;;;;1692:2;1680:9;1671:7;1667:23;1663:32;1660:2;;;1708:1;1705;1698:12;1660:2;1751:1;1776:53;1821:7;1812:6;1801:9;1797:22;1776:53;:::i;:::-;1766:63;;1722:117;1878:2;1904:53;1949:7;1940:6;1929:9;1925:22;1904:53;:::i;:::-;1894:63;;1849:118;2006:2;2032:53;2077:7;2068:6;2057:9;2053:22;2032:53;:::i;:::-;2022:63;;1977:118;1650:452;;;;;:::o;2108:407::-;;;2233:2;2221:9;2212:7;2208:23;2204:32;2201:2;;;2249:1;2246;2239:12;2201:2;2292:1;2317:53;2362:7;2353:6;2342:9;2338:22;2317:53;:::i;:::-;2307:63;;2263:117;2419:2;2445:53;2490:7;2481:6;2470:9;2466:22;2445:53;:::i;:::-;2435:63;;2390:118;2191:324;;;;;:::o;2521:986::-;;;;;;;2712:3;2700:9;2691:7;2687:23;2683:33;2680:2;;;2729:1;2726;2719:12;2680:2;2772:1;2797:53;2842:7;2833:6;2822:9;2818:22;2797:53;:::i;:::-;2787:63;;2743:117;2899:2;2925:53;2970:7;2961:6;2950:9;2946:22;2925:53;:::i;:::-;2915:63;;2870:118;3027:2;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2998:118;3155:2;3181:51;3224:7;3215:6;3204:9;3200:22;3181:51;:::i;:::-;3171:61;;3126:116;3281:3;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3252:119;3410:3;3437:53;3482:7;3473:6;3462:9;3458:22;3437:53;:::i;:::-;3427:63;;3381:119;2670:837;;;;;;;;:::o;3513:405::-;;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3653:1;3650;3643:12;3605:2;3696:1;3721:53;3766:7;3757:6;3746:9;3742:22;3721:53;:::i;:::-;3711:63;;3667:117;3823:2;3849:52;3893:7;3884:6;3873:9;3869:22;3849:52;:::i;:::-;3839:62;;3794:117;3595:323;;;;;:::o;3924:262::-;;4032:2;4020:9;4011:7;4007:23;4003:32;4000:2;;;4048:1;4045;4038:12;4000:2;4091:1;4116:53;4161:7;4152:6;4141:9;4137:22;4116:53;:::i;:::-;4106:63;;4062:117;3990:196;;;;:::o;4192:407::-;;;4317:2;4305:9;4296:7;4292:23;4288:32;4285:2;;;4333:1;4330;4323:12;4285:2;4376:1;4401:53;4446:7;4437:6;4426:9;4422:22;4401:53;:::i;:::-;4391:63;;4347:117;4503:2;4529:53;4574:7;4565:6;4554:9;4550:22;4529:53;:::i;:::-;4519:63;;4474:118;4275:324;;;;;:::o;4605:260::-;;4712:2;4700:9;4691:7;4687:23;4683:32;4680:2;;;4728:1;4725;4718:12;4680:2;4771:1;4796:52;4840:7;4831:6;4820:9;4816:22;4796:52;:::i;:::-;4786:62;;4742:116;4670:195;;;;:::o;4871:118::-;4958:24;4976:5;4958:24;:::i;:::-;4953:3;4946:37;4936:53;;:::o;4995:109::-;5076:21;5091:5;5076:21;:::i;:::-;5071:3;5064:34;5054:50;;:::o;5110:118::-;5197:24;5215:5;5197:24;:::i;:::-;5192:3;5185:37;5175:53;;:::o;5234:157::-;5339:45;5359:24;5377:5;5359:24;:::i;:::-;5339:45;:::i;:::-;5334:3;5327:58;5317:74;;:::o;5397:364::-;;5513:39;5546:5;5513:39;:::i;:::-;5568:71;5632:6;5627:3;5568:71;:::i;:::-;5561:78;;5648:52;5693:6;5688:3;5681:4;5674:5;5670:16;5648:52;:::i;:::-;5725:29;5747:6;5725:29;:::i;:::-;5720:3;5716:39;5709:46;;5489:272;;;;;:::o;5767:377::-;;5901:39;5934:5;5901:39;:::i;:::-;5956:89;6038:6;6033:3;5956:89;:::i;:::-;5949:96;;6054:52;6099:6;6094:3;6087:4;6080:5;6076:16;6054:52;:::i;:::-;6131:6;6126:3;6122:16;6115:23;;5877:267;;;;;:::o;6150:330::-;;6313:67;6377:2;6372:3;6313:67;:::i;:::-;6306:74;;6410:34;6406:1;6401:3;6397:11;6390:55;6471:2;6466:3;6462:12;6455:19;;6296:184;;;:::o;6486:367::-;;6649:67;6713:2;6708:3;6649:67;:::i;:::-;6642:74;;6746:34;6742:1;6737:3;6733:11;6726:55;6812:5;6807:2;6802:3;6798:12;6791:27;6844:2;6839:3;6835:12;6828:19;;6632:221;;;:::o;6859:370::-;;7022:67;7086:2;7081:3;7022:67;:::i;:::-;7015:74;;7119:34;7115:1;7110:3;7106:11;7099:55;7185:8;7180:2;7175:3;7171:12;7164:30;7220:2;7215:3;7211:12;7204:19;;7005:224;;;:::o;7235:366::-;;7398:67;7462:2;7457:3;7398:67;:::i;:::-;7391:74;;7495:34;7491:1;7486:3;7482:11;7475:55;7561:4;7556:2;7551:3;7547:12;7540:26;7592:2;7587:3;7583:12;7576:19;;7381:220;;;:::o;7607:372::-;;7770:67;7834:2;7829:3;7770:67;:::i;:::-;7763:74;;7867:34;7863:1;7858:3;7854:11;7847:55;7933:10;7928:2;7923:3;7919:12;7912:32;7970:2;7965:3;7961:12;7954:19;;7753:226;;;:::o;7985:396::-;;8166:84;8248:1;8243:3;8166:84;:::i;:::-;8159:91;;8280:66;8276:1;8271:3;8267:11;8260:87;8373:1;8368:3;8364:11;8357:18;;8149:232;;;:::o;8387:370::-;;8550:67;8614:2;8609:3;8550:67;:::i;:::-;8543:74;;8647:34;8643:1;8638:3;8634:11;8627:55;8713:8;8708:2;8703:3;8699:12;8692:30;8748:2;8743:3;8739:12;8732:19;;8533:224;;;:::o;8763:368::-;;8926:67;8990:2;8985:3;8926:67;:::i;:::-;8919:74;;9023:34;9019:1;9014:3;9010:11;9003:55;9089:6;9084:2;9079:3;9075:12;9068:28;9122:2;9117:3;9113:12;9106:19;;8909:222;;;:::o;9137:372::-;;9300:67;9364:2;9359:3;9300:67;:::i;:::-;9293:74;;9397:34;9393:1;9388:3;9384:11;9377:55;9463:10;9458:2;9453:3;9449:12;9442:32;9500:2;9495:3;9491:12;9484:19;;9283:226;;;:::o;9515:330::-;;9678:67;9742:2;9737:3;9678:67;:::i;:::-;9671:74;;9775:34;9771:1;9766:3;9762:11;9755:55;9836:2;9831:3;9827:12;9820:19;;9661:184;;;:::o;9851:372::-;;10014:67;10078:2;10073:3;10014:67;:::i;:::-;10007:74;;10111:34;10107:1;10102:3;10098:11;10091:55;10177:10;10172:2;10167:3;10163:12;10156:32;10214:2;10209:3;10205:12;10198:19;;9997:226;;;:::o;10229:370::-;;10392:67;10456:2;10451:3;10392:67;:::i;:::-;10385:74;;10489:34;10485:1;10480:3;10476:11;10469:55;10555:8;10550:2;10545:3;10541:12;10534:30;10590:2;10585:3;10581:12;10574:19;;10375:224;;;:::o;10605:369::-;;10768:67;10832:2;10827:3;10768:67;:::i;:::-;10761:74;;10865:34;10861:1;10856:3;10852:11;10845:55;10931:7;10926:2;10921:3;10917:12;10910:29;10965:2;10960:3;10956:12;10949:19;;10751:223;;;:::o;10980:373::-;;11143:67;11207:2;11202:3;11143:67;:::i;:::-;11136:74;;11240:34;11236:1;11231:3;11227:11;11220:55;11306:11;11301:2;11296:3;11292:12;11285:33;11344:2;11339:3;11335:12;11328:19;;11126:227;;;:::o;11359:368::-;;11522:67;11586:2;11581:3;11522:67;:::i;:::-;11515:74;;11619:34;11615:1;11610:3;11606:11;11599:55;11685:6;11680:2;11675:3;11671:12;11664:28;11718:2;11713:3;11709:12;11702:19;;11505:222;;;:::o;11733:357::-;;11914:85;11996:2;11991:3;11914:85;:::i;:::-;11907:92;;12029:25;12025:1;12020:3;12016:11;12009:46;12081:2;12076:3;12072:12;12065:19;;11897:193;;;:::o;12096:369::-;;12259:67;12323:2;12318:3;12259:67;:::i;:::-;12252:74;;12356:34;12352:1;12347:3;12343:11;12336:55;12422:7;12417:2;12412:3;12408:12;12401:29;12456:2;12451:3;12447:12;12440:19;;12242:223;;;:::o;12471:351::-;;12652:85;12734:2;12729:3;12652:85;:::i;:::-;12645:92;;12767:19;12763:1;12758:3;12754:11;12747:40;12813:2;12808:3;12804:12;12797:19;;12635:187;;;:::o;12828:379::-;;12991:67;13055:2;13050:3;12991:67;:::i;:::-;12984:74;;13088:34;13084:1;13079:3;13075:11;13068:55;13154:17;13149:2;13144:3;13140:12;13133:39;13198:2;13193:3;13189:12;13182:19;;12974:233;;;:::o;13213:329::-;;13376:67;13440:2;13435:3;13376:67;:::i;:::-;13369:74;;13473:33;13469:1;13464:3;13460:11;13453:54;13533:2;13528:3;13524:12;13517:19;;13359:183;;;:::o;13548:118::-;13635:24;13653:5;13635:24;:::i;:::-;13630:3;13623:37;13613:53;;:::o;13672:115::-;13757:23;13774:5;13757:23;:::i;:::-;13752:3;13745:36;13735:52;;:::o;13793:112::-;13876:22;13892:5;13876:22;:::i;:::-;13871:3;13864:35;13854:51;;:::o;13911:663::-;;14174:148;14318:3;14174:148;:::i;:::-;14167:155;;14332:75;14403:3;14394:6;14332:75;:::i;:::-;14432:2;14427:3;14423:12;14416:19;;14445:75;14516:3;14507:6;14445:75;:::i;:::-;14545:2;14540:3;14536:12;14529:19;;14565:3;14558:10;;14156:418;;;;;:::o;14580:967::-;;14984:148;15128:3;14984:148;:::i;:::-;14977:155;;15149:95;15240:3;15231:6;15149:95;:::i;:::-;15142:102;;15261:148;15405:3;15261:148;:::i;:::-;15254:155;;15426:95;15517:3;15508:6;15426:95;:::i;:::-;15419:102;;15538:3;15531:10;;14966:581;;;;;:::o;15553:222::-;;15684:2;15673:9;15669:18;15661:26;;15697:71;15765:1;15754:9;15750:17;15741:6;15697:71;:::i;:::-;15651:124;;;;:::o;15781:210::-;;15906:2;15895:9;15891:18;15883:26;;15919:65;15981:1;15970:9;15966:17;15957:6;15919:65;:::i;:::-;15873:118;;;;:::o;15997:222::-;;16128:2;16117:9;16113:18;16105:26;;16141:71;16209:1;16198:9;16194:17;16185:6;16141:71;:::i;:::-;16095:124;;;;:::o;16225:553::-;;16440:3;16429:9;16425:19;16417:27;;16454:71;16522:1;16511:9;16507:17;16498:6;16454:71;:::i;:::-;16535:72;16603:2;16592:9;16588:18;16579:6;16535:72;:::i;:::-;16617;16685:2;16674:9;16670:18;16661:6;16617:72;:::i;:::-;16699;16767:2;16756:9;16752:18;16743:6;16699:72;:::i;:::-;16407:371;;;;;;;:::o;16784:553::-;;16999:3;16988:9;16984:19;16976:27;;17013:71;17081:1;17070:9;17066:17;17057:6;17013:71;:::i;:::-;17094:72;17162:2;17151:9;17147:18;17138:6;17094:72;:::i;:::-;17176;17244:2;17233:9;17229:18;17220:6;17176:72;:::i;:::-;17258;17326:2;17315:9;17311:18;17302:6;17258:72;:::i;:::-;16966:371;;;;;;;:::o;17343:545::-;;17554:3;17543:9;17539:19;17531:27;;17568:71;17636:1;17625:9;17621:17;17612:6;17568:71;:::i;:::-;17649:68;17713:2;17702:9;17698:18;17689:6;17649:68;:::i;:::-;17727:72;17795:2;17784:9;17780:18;17771:6;17727:72;:::i;:::-;17809;17877:2;17866:9;17862:18;17853:6;17809:72;:::i;:::-;17521:367;;;;;;;:::o;17894:313::-;;18045:2;18034:9;18030:18;18022:26;;18094:9;18088:4;18084:20;18080:1;18069:9;18065:17;18058:47;18122:78;18195:4;18186:6;18122:78;:::i;:::-;18114:86;;18012:195;;;;:::o;18213:419::-;;18417:2;18406:9;18402:18;18394:26;;18466:9;18460:4;18456:20;18452:1;18441:9;18437:17;18430:47;18494:131;18620:4;18494:131;:::i;:::-;18486:139;;18384:248;;;:::o;18638:419::-;;18842:2;18831:9;18827:18;18819:26;;18891:9;18885:4;18881:20;18877:1;18866:9;18862:17;18855:47;18919:131;19045:4;18919:131;:::i;:::-;18911:139;;18809:248;;;:::o;19063:419::-;;19267:2;19256:9;19252:18;19244:26;;19316:9;19310:4;19306:20;19302:1;19291:9;19287:17;19280:47;19344:131;19470:4;19344:131;:::i;:::-;19336:139;;19234:248;;;:::o;19488:419::-;;19692:2;19681:9;19677:18;19669:26;;19741:9;19735:4;19731:20;19727:1;19716:9;19712:17;19705:47;19769:131;19895:4;19769:131;:::i;:::-;19761:139;;19659:248;;;:::o;19913:419::-;;20117:2;20106:9;20102:18;20094:26;;20166:9;20160:4;20156:20;20152:1;20141:9;20137:17;20130:47;20194:131;20320:4;20194:131;:::i;:::-;20186:139;;20084:248;;;:::o;20338:419::-;;20542:2;20531:9;20527:18;20519:26;;20591:9;20585:4;20581:20;20577:1;20566:9;20562:17;20555:47;20619:131;20745:4;20619:131;:::i;:::-;20611:139;;20509:248;;;:::o;20763:419::-;;20967:2;20956:9;20952:18;20944:26;;21016:9;21010:4;21006:20;21002:1;20991:9;20987:17;20980:47;21044:131;21170:4;21044:131;:::i;:::-;21036:139;;20934:248;;;:::o;21188:419::-;;21392:2;21381:9;21377:18;21369:26;;21441:9;21435:4;21431:20;21427:1;21416:9;21412:17;21405:47;21469:131;21595:4;21469:131;:::i;:::-;21461:139;;21359:248;;;:::o;21613:419::-;;21817:2;21806:9;21802:18;21794:26;;21866:9;21860:4;21856:20;21852:1;21841:9;21837:17;21830:47;21894:131;22020:4;21894:131;:::i;:::-;21886:139;;21784:248;;;:::o;22038:419::-;;22242:2;22231:9;22227:18;22219:26;;22291:9;22285:4;22281:20;22277:1;22266:9;22262:17;22255:47;22319:131;22445:4;22319:131;:::i;:::-;22311:139;;22209:248;;;:::o;22463:419::-;;22667:2;22656:9;22652:18;22644:26;;22716:9;22710:4;22706:20;22702:1;22691:9;22687:17;22680:47;22744:131;22870:4;22744:131;:::i;:::-;22736:139;;22634:248;;;:::o;22888:419::-;;23092:2;23081:9;23077:18;23069:26;;23141:9;23135:4;23131:20;23127:1;23116:9;23112:17;23105:47;23169:131;23295:4;23169:131;:::i;:::-;23161:139;;23059:248;;;:::o;23313:419::-;;23517:2;23506:9;23502:18;23494:26;;23566:9;23560:4;23556:20;23552:1;23541:9;23537:17;23530:47;23594:131;23720:4;23594:131;:::i;:::-;23586:139;;23484:248;;;:::o;23738:419::-;;23942:2;23931:9;23927:18;23919:26;;23991:9;23985:4;23981:20;23977:1;23966:9;23962:17;23955:47;24019:131;24145:4;24019:131;:::i;:::-;24011:139;;23909:248;;;:::o;24163:419::-;;24367:2;24356:9;24352:18;24344:26;;24416:9;24410:4;24406:20;24402:1;24391:9;24387:17;24380:47;24444:131;24570:4;24444:131;:::i;:::-;24436:139;;24334:248;;;:::o;24588:419::-;;24792:2;24781:9;24777:18;24769:26;;24841:9;24835:4;24831:20;24827:1;24816:9;24812:17;24805:47;24869:131;24995:4;24869:131;:::i;:::-;24861:139;;24759:248;;;:::o;25013:419::-;;25217:2;25206:9;25202:18;25194:26;;25266:9;25260:4;25256:20;25252:1;25241:9;25237:17;25230:47;25294:131;25420:4;25294:131;:::i;:::-;25286:139;;25184:248;;;:::o;25438:222::-;;25569:2;25558:9;25554:18;25546:26;;25582:71;25650:1;25639:9;25635:17;25626:6;25582:71;:::i;:::-;25536:124;;;;:::o;25666:332::-;;25825:2;25814:9;25810:18;25802:26;;25838:71;25906:1;25895:9;25891:17;25882:6;25838:71;:::i;:::-;25919:72;25987:2;25976:9;25972:18;25963:6;25919:72;:::i;:::-;25792:206;;;;;:::o;26004:218::-;;26133:2;26122:9;26118:18;26110:26;;26146:69;26212:1;26201:9;26197:17;26188:6;26146:69;:::i;:::-;26100:122;;;;:::o;26228:328::-;;26385:2;26374:9;26370:18;26362:26;;26398:69;26464:1;26453:9;26449:17;26440:6;26398:69;:::i;:::-;26477:72;26545:2;26534:9;26530:18;26521:6;26477:72;:::i;:::-;26352:204;;;;;:::o;26562:214::-;;26689:2;26678:9;26674:18;26666:26;;26702:67;26766:1;26755:9;26751:17;26742:6;26702:67;:::i;:::-;26656:120;;;;:::o;26782:99::-;;26868:5;26862:12;26852:22;;26841:40;;;:::o;26887:169::-;;27005:6;27000:3;26993:19;27045:4;27040:3;27036:14;27021:29;;26983:73;;;;:::o;27062:148::-;;27201:3;27186:18;;27176:34;;;;:::o;27216:305::-;;27275:20;27293:1;27275:20;:::i;:::-;27270:25;;27309:20;27327:1;27309:20;:::i;:::-;27304:25;;27463:1;27395:66;27391:74;27388:1;27385:81;27382:2;;;27469:18;;:::i;:::-;27382:2;27513:1;27510;27506:9;27499:16;;27260:261;;;;:::o;27527:246::-;;27585:19;27602:1;27585:19;:::i;:::-;27580:24;;27618:19;27635:1;27618:19;:::i;:::-;27613:24;;27715:1;27703:10;27699:18;27696:1;27693:25;27690:2;;;27721:18;;:::i;:::-;27690:2;27765:1;27762;27758:9;27751:16;;27570:203;;;;:::o;27779:182::-;;27835:19;27852:1;27835:19;:::i;:::-;27830:24;;27868:19;27885:1;27868:19;:::i;:::-;27863:24;;27906:1;27896:2;;27911:18;;:::i;:::-;27896:2;27953:1;27950;27946:9;27941:14;;27820:141;;;;:::o;27967:348::-;;28030:20;28048:1;28030:20;:::i;:::-;28025:25;;28064:20;28082:1;28064:20;:::i;:::-;28059:25;;28252:1;28184:66;28180:74;28177:1;28174:81;28169:1;28162:9;28155:17;28151:105;28148:2;;;28259:18;;:::i;:::-;28148:2;28307:1;28304;28300:9;28289:20;;28015:300;;;;:::o;28321:191::-;;28381:20;28399:1;28381:20;:::i;:::-;28376:25;;28415:20;28433:1;28415:20;:::i;:::-;28410:25;;28454:1;28451;28448:8;28445:2;;;28459:18;;:::i;:::-;28445:2;28504:1;28501;28497:9;28489:17;;28366:146;;;;:::o;28518:188::-;;28577:19;28594:1;28577:19;:::i;:::-;28572:24;;28610:19;28627:1;28610:19;:::i;:::-;28605:24;;28648:1;28645;28642:8;28639:2;;;28653:18;;:::i;:::-;28639:2;28698:1;28695;28691:9;28683:17;;28562:144;;;;:::o;28712:96::-;;28778:24;28796:5;28778:24;:::i;:::-;28767:35;;28757:51;;;:::o;28814:90::-;;28891:5;28884:13;28877:21;28866:32;;28856:48;;;:::o;28910:77::-;;28976:5;28965:16;;28955:32;;;:::o;28993:149::-;;29069:66;29062:5;29058:78;29047:89;;29037:105;;;:::o;29148:126::-;;29225:42;29218:5;29214:54;29203:65;;29193:81;;;:::o;29280:77::-;;29346:5;29335:16;;29325:32;;;:::o;29363:93::-;;29439:10;29432:5;29428:22;29417:33;;29407:49;;;:::o;29462:86::-;;29537:4;29530:5;29526:16;29515:27;;29505:43;;;:::o;29554:307::-;29622:1;29632:113;29646:6;29643:1;29640:13;29632:113;;;29731:1;29726:3;29722:11;29716:18;29712:1;29707:3;29703:11;29696:39;29668:2;29665:1;29661:10;29656:15;;29632:113;;;29763:6;29760:1;29757:13;29754:2;;;29843:1;29834:6;29829:3;29825:16;29818:27;29754:2;29603:258;;;;:::o;29867:171::-;;29929:24;29947:5;29929:24;:::i;:::-;29920:33;;29975:4;29968:5;29965:15;29962:2;;;29983:18;;:::i;:::-;29962:2;30030:1;30023:5;30019:13;30012:20;;29910:128;;;:::o;30044:320::-;;30125:1;30119:4;30115:12;30105:22;;30172:1;30166:4;30162:12;30193:18;30183:2;;30249:4;30241:6;30237:17;30227:27;;30183:2;30311;30303:6;30300:14;30280:18;30277:38;30274:2;;;30330:18;;:::i;:::-;30274:2;30095:269;;;;:::o;30370:233::-;;30432:24;30450:5;30432:24;:::i;:::-;30423:33;;30478:66;30471:5;30468:77;30465:2;;;30548:18;;:::i;:::-;30465:2;30595:1;30588:5;30584:13;30577:20;;30413:190;;;:::o;30609:79::-;;30677:5;30666:16;;30656:32;;;:::o;30694:180::-;30742:77;30739:1;30732:88;30839:4;30836:1;30829:15;30863:4;30860:1;30853:15;30880:180;30928:77;30925:1;30918:88;31025:4;31022:1;31015:15;31049:4;31046:1;31039:15;31066:180;31114:77;31111:1;31104:88;31211:4;31208:1;31201:15;31235:4;31232:1;31225:15;31252:102;;31344:2;31340:7;31335:2;31328:5;31324:14;31320:28;31310:38;;31300:54;;;:::o;31360:122::-;31433:24;31451:5;31433:24;:::i;:::-;31426:5;31423:35;31413:2;;31472:1;31469;31462:12;31413:2;31403:79;:::o;31488:122::-;31561:24;31579:5;31561:24;:::i;:::-;31554:5;31551:35;31541:2;;31600:1;31597;31590:12;31541:2;31531:79;:::o;31616:120::-;31688:23;31705:5;31688:23;:::i;:::-;31681:5;31678:34;31668:2;;31726:1;31723;31716:12;31668:2;31658:78;:::o;31742:122::-;31815:24;31833:5;31815:24;:::i;:::-;31808:5;31805:35;31795:2;;31854:1;31851;31844:12;31795:2;31785:79;:::o;31870:120::-;31942:23;31959:5;31942:23;:::i;:::-;31935:5;31932:34;31922:2;;31980:1;31977;31970:12;31922:2;31912:78;:::o;31996:118::-;32067:22;32083:5;32067:22;:::i;:::-;32060:5;32057:33;32047:2;;32104:1;32101;32094:12;32047:2;32037:77;:::o

Swarm Source

ipfs://8f6a2984ed73bc91f05cdf12a92202d68e0dc2690058388ddb55da025e13a399
Loading