ETH Price: $3,125.57 (+0.79%)

Token

Stratos Token (STOS)
 

Overview

Max Total Supply

28,245,638.132752486010564157 STOS

Holders

7,529 ( -0.027%)

Market

Price

$0.51 @ 0.000164 ETH (+2.24%)

Onchain Market Cap

$14,460,862.86

Circulating Supply Market Cap

$33,365,628.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
9,663.930698298918468858 STOS

Value
$4,947.62 ( ~1.5830 Eth) [0.0342%]
0x74ababf3bdca63e0e45cFa9Dd1bB2409e2C85eF9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Stratos is a decentralized data architecture that provides scalable, reliable, self-balanced storage, database and computation network and offers a solid foundation for data processing.

Market

Volume (24H):$174,639.00
Market Capitalization:$33,365,628.00
Circulating Supply:65,339,440.00 STOS
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Stratos

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-09
*/

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

// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



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/ERC165.sol



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/AccessControl.sol



pragma solidity ^0.8.0;




/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @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 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 {_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 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]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _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]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    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 {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = 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/token/ERC20/IERC20.sol



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/IERC20Metadata.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of 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 defaut 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");
        _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");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(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:
     *
     * - `to` 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);
    }

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(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 to 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 { }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: contracts/Stratos.sol


pragma solidity ^0.8.0;





contract DSAuth is Ownable, AccessControl {
    bytes32 public constant MINT_BURN_ROLE = keccak256("MINT_BURN_ROLE");

    // setOwner transfers the STOS token contract ownership to another address
    // along with grant new owner MINT_BURN_ROLE role and remove MINT_BURN_ROLE from old owner
    // note: call transferOwnerShip will only change ownership without other roles
    function setOwner(address newOwner) public onlyOwner {
        require(newOwner != owner(), "New owner and current owner need to be different");

        address oldOwner = owner();

        transferOwnership(newOwner);

        _grantAccess(MINT_BURN_ROLE, newOwner);
        _revokeAccess(MINT_BURN_ROLE, oldOwner);

        _setupRole(DEFAULT_ADMIN_ROLE, newOwner);
        _revokeAccess(DEFAULT_ADMIN_ROLE, oldOwner);

        emit OwnershipTransferred(oldOwner, newOwner);
    }

    // setAuthority performs the same action as grantMintBurnRole
    // we need setAuthority() only because the backward compatibility with previous version contract
    function setAuthority(address authorityAddress) public onlyOwner {
        grantMintBurnRole(authorityAddress);
    }

    // grantMintBurnRole grants the MINT_BURN_ROLE role to an address
    function grantMintBurnRole(address account) public onlyOwner {
        _grantAccess(MINT_BURN_ROLE, account);
    }

    // revokeMintBurnRole revokes the MINT_BURN_ROLE role from an address
    function revokeMintBurnRole(address account) public onlyOwner {
        _revokeAccess(MINT_BURN_ROLE, account);
    }

    // internal function _grantAccess grants account with given role
    function _grantAccess(bytes32 role, address account) internal {
        grantRole(role, account);

        emit RoleGranted(role, account, owner());
    }

    // internal function _revokeAccess revokes account with given role
    function _revokeAccess(bytes32 role, address account) internal {
        if (DEFAULT_ADMIN_ROLE == role) {
            require(account != owner(), "owner cant revoke himself from admin role");
        }

        revokeRole(role, account);

        emit RoleRevoked(role, account, owner());
    }
}

contract DSStop is Pausable, Ownable {
    // we need stopped() only because the backward compatibility with previous version contract
    // stopped = paused
    function stopped() public view returns (bool) {
        return paused();
    }

    function stop() public onlyOwner {
        _pause();

        emit Paused(owner());
    }

    function start() public onlyOwner {
        _unpause();

        emit Unpaused(owner());
    }
}

contract Stratos is ERC20("Stratos Token", "STOS"), DSAuth, DSStop {

    event Mint(address indexed guy, uint wad);
    event Burn(address indexed guy, uint wad);

    uint256 MAX_SUPPLY = 1 * 10 ** 8 * 10 ** 18; // 100,000,000 STOS Token Max Supply

    // deployer address is the default admin(owner)
    // deployer address is the first address with MINT_BURN_ROLE role
    constructor () {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantAccess(MINT_BURN_ROLE, msg.sender);
    }

    function approve(address guy, uint wad) public override whenNotPaused returns (bool) {
        return super.approve(guy, wad);
    }

    function transferFrom(address src, address dst, uint wad) public override whenNotPaused returns (bool) {
        return super.transferFrom(src, dst, wad);
    }

    function transfer(address dst, uint wad) public override whenNotPaused returns (bool) {
        return super.transfer(dst, wad);
    }

    function mint(address guy, uint wad) public whenNotPaused {
        require(hasRole(MINT_BURN_ROLE, msg.sender), "Caller is not allowed to mint");
        require(totalSupply() + wad <= MAX_SUPPLY, "Exceeds STOS token max totalSupply");

        _mint(guy, wad);

        emit Mint(guy, wad);
    }

    function burn(address guy, uint wad) public whenNotPaused {
        require(hasRole(MINT_BURN_ROLE, msg.sender), "Caller is not allowed to burn");

        _burn(guy, wad);

        emit Burn(guy, wad);
    }

    function redeem(uint amount) public onlyOwner {
        require(balanceOf(address(this)) >= amount, "redeem can not exceed the balance");

        _transfer(address(this), owner(), amount);
    }
}

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":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Mint","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_BURN_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":"guy","type":"address"},{"internalType":"uint256","name":"wad","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":"guy","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantMintBurnRole","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"guy","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"}],"name":"revokeMintBurnRole","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":"address","name":"authorityAddress","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","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"}]

60806040526a52b7d2dcc80cd2e40000006007553480156200002057600080fd5b506040518060400160405280600d81526020017f53747261746f7320546f6b656e000000000000000000000000000000000000008152506040518060400160405280600481526020017f53544f53000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000a59291906200083b565b508060049080519060200190620000be9291906200083b565b5050506000600560006101000a81548160ff0219169083151502179055506000620000ee620001da60201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001a26000801b33620001e260201b60201c565b620001d47fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a633620001f860201b60201c565b62000cd4565b600033905090565b620001f482826200027860201b60201c565b5050565b6200020a82826200036a60201b60201c565b6200021a620003b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6200028a8282620003dd60201b60201c565b620003665760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200030b620001da60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6200037b826200044860201b60201c565b6200039c8162000390620001da60201b60201c565b6200046860201b60201c565b620003ae83836200027860201b60201c565b505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060066000838152602001908152602001600020600101549050919050565b6200047a8282620003dd60201b60201c565b6200052857620004ad8173ffffffffffffffffffffffffffffffffffffffff1660146200052c60201b620018bc1760201c565b620004c88360001c60206200052c60201b620018bc1760201c565b604051602001620004db929190620009d8565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051f919062000a1a565b60405180910390fd5b5050565b60606000600283600262000541919062000ae4565b6200054d919062000a87565b67ffffffffffffffff8111156200058d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015620005c05781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106200061f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110620006aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620006ec919062000ae4565b620006f8919062000a87565b90505b6001811115620007ea577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062000762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110620007a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080620007e29062000b85565b9050620006fb565b506000841462000831576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008289062000a3e565b60405180910390fd5b8091505092915050565b828054620008499062000bb4565b90600052602060002090601f0160209004810192826200086d5760008555620008b9565b82601f106200088857805160ff1916838001178555620008b9565b82800160010185558215620008b9579182015b82811115620008b85782518255916020019190600101906200089b565b5b509050620008c89190620008cc565b5090565b5b80821115620008e7576000816000905550600101620008cd565b5090565b6000620008f88262000a60565b62000904818562000a6b565b93506200091681856020860162000b4f565b620009218162000c48565b840191505092915050565b6000620009398262000a60565b62000945818562000a7c565b93506200095781856020860162000b4f565b80840191505092915050565b60006200097260208362000a6b565b91506200097f8262000c59565b602082019050919050565b60006200099960178362000a7c565b9150620009a68262000c82565b601782019050919050565b6000620009c060118362000a7c565b9150620009cd8262000cab565b601182019050919050565b6000620009e5826200098a565b9150620009f382856200092c565b915062000a0082620009b1565b915062000a0e82846200092c565b91508190509392505050565b6000602082019050818103600083015262000a368184620008eb565b905092915050565b6000602082019050818103600083015262000a598162000963565b9050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600062000a948262000b45565b915062000aa18362000b45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ad95762000ad862000bea565b5b828201905092915050565b600062000af18262000b45565b915062000afe8362000b45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b3a5762000b3962000bea565b5b828202905092915050565b6000819050919050565b60005b8381101562000b6f57808201518184015260208101905062000b52565b8381111562000b7f576000848401525b50505050565b600062000b928262000b45565b9150600082141562000ba95762000ba862000bea565b5b600182039050919050565b6000600282049050600182168062000bcd57607f821691505b6020821081141562000be45762000be362000c19565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b613cc48062000ce46000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806375f12b211161011a578063a9059cbb116100ad578063d547741f1161007c578063d547741f146105a0578063d9608669146105bc578063db006a75146105d8578063dd62ed3e146105f4578063f2fde38b14610624576101fb565b8063a9059cbb1461052c578063be38c0d51461055c578063be9a655514610578578063d03563ca14610582576101fb565b806395d89b41116100e957806395d89b41146104a45780639dc29fac146104c2578063a217fddf146104de578063a457c2d7146104fc576101fb565b806375f12b211461041c5780637a9e5e4b1461043a5780638da5cb5b1461045657806391d1485414610474576101fb565b80632f2ff15d1161019257806340c10f191161016157806340c10f19146103a85780635c975abb146103c457806370a08231146103e2578063715018a614610412576101fb565b80632f2ff15d14610322578063313ce5671461033e57806336568abe1461035c5780633950935114610378576101fb565b806313af4035116101ce57806313af40351461028857806318160ddd146102a457806323b872dd146102c2578063248a9ca3146102f2576101fb565b806301ffc9a71461020057806306fdde031461023057806307da68f51461024e578063095ea7b314610258575b600080fd5b61021a60048036038101906102159190612b9a565b610640565b604051610227919061303e565b60405180910390f35b6102386106ba565b6040516102459190613074565b60405180910390f35b61025661074c565b005b610272600480360381019061026d9190612af9565b610810565b60405161027f919061303e565b60405180910390f35b6102a2600480360381019061029d9190612a45565b61086c565b005b6102ac610a3f565b6040516102b99190613356565b60405180910390f35b6102dc60048036038101906102d79190612aaa565b610a49565b6040516102e9919061303e565b60405180910390f35b61030c60048036038101906103079190612b35565b610aa7565b6040516103199190613059565b60405180910390f35b61033c60048036038101906103379190612b5e565b610ac7565b005b610346610af0565b6040516103539190613371565b60405180910390f35b61037660048036038101906103719190612b5e565b610af9565b005b610392600480360381019061038d9190612af9565b610b7c565b60405161039f919061303e565b60405180910390f35b6103c260048036038101906103bd9190612af9565b610c28565b005b6103cc610d8c565b6040516103d9919061303e565b60405180910390f35b6103fc60048036038101906103f79190612a45565b610da3565b6040516104099190613356565b60405180910390f35b61041a610deb565b005b610424610f28565b604051610431919061303e565b60405180910390f35b610454600480360381019061044f9190612a45565b610f37565b005b61045e610fbf565b60405161046b9190613023565b60405180910390f35b61048e60048036038101906104899190612b5e565b610fe9565b60405161049b919061303e565b60405180910390f35b6104ac611054565b6040516104b99190613074565b60405180910390f35b6104dc60048036038101906104d79190612af9565b6110e6565b005b6104e66111f3565b6040516104f39190613059565b60405180910390f35b61051660048036038101906105119190612af9565b6111fa565b604051610523919061303e565b60405180910390f35b61054660048036038101906105419190612af9565b6112ee565b604051610553919061303e565b60405180910390f35b61057660048036038101906105719190612a45565b61134a565b005b6105806113f3565b005b61058a6114b7565b6040516105979190613059565b60405180910390f35b6105ba60048036038101906105b59190612b5e565b6114db565b005b6105d660048036038101906105d19190612a45565b611504565b005b6105f260048036038101906105ed9190612bc3565b6115ad565b005b61060e60048036038101906106099190612a6e565b611689565b60405161061b9190613356565b60405180910390f35b61063e60048036038101906106399190612a45565b611710565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b357506106b282611bb6565b5b9050919050565b6060600380546106c99061357f565b80601f01602080910402602001604051908101604052809291908181526020018280546106f59061357f565b80156107425780601f1061071757610100808354040283529160200191610742565b820191906000526020600020905b81548152906001019060200180831161072557829003601f168201915b5050505050905090565b610754611c20565b73ffffffffffffffffffffffffffffffffffffffff16610772610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf906131f6565b60405180910390fd5b6107d0611c28565b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586107f9610fbf565b6040516108069190613023565b60405180910390a1565b600061081a610d8c565b1561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906131b6565b60405180910390fd5b6108648383611ccb565b905092915050565b610874611c20565b73ffffffffffffffffffffffffffffffffffffffff16610892610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df906131f6565b60405180910390fd5b6108f0610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561095e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095590613256565b60405180910390fd5b6000610968610fbf565b905061097382611710565b61099d7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a683611ce9565b6109c77fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611d59565b6109d46000801b83611e4b565b6109e16000801b82611d59565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600254905090565b6000610a53610d8c565b15610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a906131b6565b60405180910390fd5b610a9e848484611e59565b90509392505050565b600060066000838152602001908152602001600020600101549050919050565b610ad082610aa7565b610ae181610adc611c20565b611f5a565b610aeb8383611ff7565b505050565b60006012905090565b610b01611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b65906132f6565b60405180910390fd5b610b7882826120d8565b5050565b6000610c1e610b89611c20565b848460016000610b97611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c1991906133b3565b6121ba565b6001905092915050565b610c30610d8c565b15610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c67906131b6565b60405180910390fd5b610c9a7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a633610fe9565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613136565b60405180910390fd5b60075481610ce5610a3f565b610cef91906133b3565b1115610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790613336565b60405180910390fd5b610d3a8282612385565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610d809190613356565b60405180910390a25050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610df3611c20565b73ffffffffffffffffffffffffffffffffffffffff16610e11610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e906131f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610f32610d8c565b905090565b610f3f611c20565b73ffffffffffffffffffffffffffffffffffffffff16610f5d610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa906131f6565b60405180910390fd5b610fbc8161134a565b50565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546110639061357f565b80601f016020809104026020016040519081016040528092919081815260200182805461108f9061357f565b80156110dc5780601f106110b1576101008083540402835291602001916110dc565b820191906000526020600020905b8154815290600101906020018083116110bf57829003601f168201915b5050505050905090565b6110ee610d8c565b1561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906131b6565b60405180910390fd5b6111587fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a633610fe9565b611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90613296565b60405180910390fd5b6111a182826124d9565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516111e79190613356565b60405180910390a25050565b6000801b81565b60008060016000611209611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd906132d6565b60405180910390fd5b6112e36112d1611c20565b8585846112de9190613463565b6121ba565b600191505092915050565b60006112f8610d8c565b15611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f906131b6565b60405180910390fd5b61134283836126ad565b905092915050565b611352611c20565b73ffffffffffffffffffffffffffffffffffffffff16611370610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd906131f6565b60405180910390fd5b6113f07fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611ce9565b50565b6113fb611c20565b73ffffffffffffffffffffffffffffffffffffffff16611419610fbf565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611466906131f6565b60405180910390fd5b6114776126cb565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114a0610fbf565b6040516114ad9190613023565b60405180910390a1565b7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a681565b6114e482610aa7565b6114f5816114f0611c20565b611f5a565b6114ff83836120d8565b505050565b61150c611c20565b73ffffffffffffffffffffffffffffffffffffffff1661152a610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611577906131f6565b60405180910390fd5b6115aa7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611d59565b50565b6115b5611c20565b73ffffffffffffffffffffffffffffffffffffffff166115d3610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611620906131f6565b60405180910390fd5b8061163330610da3565b1015611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613216565b60405180910390fd5b61168630611680610fbf565b8361276d565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611718611c20565b73ffffffffffffffffffffffffffffffffffffffff16611736610fbf565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906131f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613156565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600060028360026118cf9190613409565b6118d991906133b3565b67ffffffffffffffff811115611918577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561194a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106119a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611a729190613409565b611a7c91906133b3565b90505b6001811115611b68577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611b6190613555565b9050611a7f565b5060008414611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613096565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b611c30610d8c565b15611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906131b6565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cb4611c20565b604051611cc19190613023565b60405180910390a1565b6000611cdf611cd8611c20565b84846121ba565b6001905092915050565b611cf38282610ac7565b611cfb610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b816000801b1415611ddb57611d6c610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613116565b60405180910390fd5b5b611de582826114db565b611ded610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b611e558282611ff7565b5050565b6000611e6684848461276d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611eb1611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906131d6565b60405180910390fd5b611f4e85611f3d611c20565b8584611f499190613463565b6121ba565b60019150509392505050565b611f648282610fe9565b611ff357611f898173ffffffffffffffffffffffffffffffffffffffff1660146118bc565b611f978360001c60206118bc565b604051602001611fa8929190612fe9565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea9190613074565b60405180910390fd5b5050565b6120018282610fe9565b6120d45760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612079611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6120e28282610fe9565b156121b65760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061215b611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906132b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190613176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123789190613356565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90613316565b60405180910390fd5b612401600083836129ec565b806002600082825461241391906133b3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461246891906133b3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124cd9190613356565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090613236565b60405180910390fd5b612555826000836129ec565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906130f6565b60405180910390fd5b81816125e79190613463565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461263b9190613463565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126a09190613356565b60405180910390a3505050565b60006126c16126ba611c20565b848461276d565b6001905092915050565b6126d3610d8c565b612712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612709906130d6565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612756611c20565b6040516127639190613023565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490613276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906130b6565b60405180910390fd5b6128588383836129ec565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590613196565b60405180910390fd5b81816128ea9190613463565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297a91906133b3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129de9190613356565b60405180910390a350505050565b505050565b600081359050612a0081613c32565b92915050565b600081359050612a1581613c49565b92915050565b600081359050612a2a81613c60565b92915050565b600081359050612a3f81613c77565b92915050565b600060208284031215612a5757600080fd5b6000612a65848285016129f1565b91505092915050565b60008060408385031215612a8157600080fd5b6000612a8f858286016129f1565b9250506020612aa0858286016129f1565b9150509250929050565b600080600060608486031215612abf57600080fd5b6000612acd868287016129f1565b9350506020612ade868287016129f1565b9250506040612aef86828701612a30565b9150509250925092565b60008060408385031215612b0c57600080fd5b6000612b1a858286016129f1565b9250506020612b2b85828601612a30565b9150509250929050565b600060208284031215612b4757600080fd5b6000612b5584828501612a06565b91505092915050565b60008060408385031215612b7157600080fd5b6000612b7f85828601612a06565b9250506020612b90858286016129f1565b9150509250929050565b600060208284031215612bac57600080fd5b6000612bba84828501612a1b565b91505092915050565b600060208284031215612bd557600080fd5b6000612be384828501612a30565b91505092915050565b612bf581613497565b82525050565b612c04816134a9565b82525050565b612c13816134b5565b82525050565b6000612c248261338c565b612c2e8185613397565b9350612c3e818560208601613522565b612c478161360f565b840191505092915050565b6000612c5d8261338c565b612c6781856133a8565b9350612c77818560208601613522565b80840191505092915050565b6000612c90602083613397565b9150612c9b82613620565b602082019050919050565b6000612cb3602383613397565b9150612cbe82613649565b604082019050919050565b6000612cd6601483613397565b9150612ce182613698565b602082019050919050565b6000612cf9602283613397565b9150612d04826136c1565b604082019050919050565b6000612d1c602983613397565b9150612d2782613710565b604082019050919050565b6000612d3f601d83613397565b9150612d4a8261375f565b602082019050919050565b6000612d62602683613397565b9150612d6d82613788565b604082019050919050565b6000612d85602283613397565b9150612d90826137d7565b604082019050919050565b6000612da8602683613397565b9150612db382613826565b604082019050919050565b6000612dcb601083613397565b9150612dd682613875565b602082019050919050565b6000612dee602883613397565b9150612df98261389e565b604082019050919050565b6000612e11602083613397565b9150612e1c826138ed565b602082019050919050565b6000612e34602183613397565b9150612e3f82613916565b604082019050919050565b6000612e57602183613397565b9150612e6282613965565b604082019050919050565b6000612e7a603083613397565b9150612e85826139b4565b604082019050919050565b6000612e9d602583613397565b9150612ea882613a03565b604082019050919050565b6000612ec0601d83613397565b9150612ecb82613a52565b602082019050919050565b6000612ee3602483613397565b9150612eee82613a7b565b604082019050919050565b6000612f066017836133a8565b9150612f1182613aca565b601782019050919050565b6000612f29602583613397565b9150612f3482613af3565b604082019050919050565b6000612f4c6011836133a8565b9150612f5782613b42565b601182019050919050565b6000612f6f602f83613397565b9150612f7a82613b6b565b604082019050919050565b6000612f92601f83613397565b9150612f9d82613bba565b602082019050919050565b6000612fb5602283613397565b9150612fc082613be3565b604082019050919050565b612fd48161350b565b82525050565b612fe381613515565b82525050565b6000612ff482612ef9565b91506130008285612c52565b915061300b82612f3f565b91506130178284612c52565b91508190509392505050565b60006020820190506130386000830184612bec565b92915050565b60006020820190506130536000830184612bfb565b92915050565b600060208201905061306e6000830184612c0a565b92915050565b6000602082019050818103600083015261308e8184612c19565b905092915050565b600060208201905081810360008301526130af81612c83565b9050919050565b600060208201905081810360008301526130cf81612ca6565b9050919050565b600060208201905081810360008301526130ef81612cc9565b9050919050565b6000602082019050818103600083015261310f81612cec565b9050919050565b6000602082019050818103600083015261312f81612d0f565b9050919050565b6000602082019050818103600083015261314f81612d32565b9050919050565b6000602082019050818103600083015261316f81612d55565b9050919050565b6000602082019050818103600083015261318f81612d78565b9050919050565b600060208201905081810360008301526131af81612d9b565b9050919050565b600060208201905081810360008301526131cf81612dbe565b9050919050565b600060208201905081810360008301526131ef81612de1565b9050919050565b6000602082019050818103600083015261320f81612e04565b9050919050565b6000602082019050818103600083015261322f81612e27565b9050919050565b6000602082019050818103600083015261324f81612e4a565b9050919050565b6000602082019050818103600083015261326f81612e6d565b9050919050565b6000602082019050818103600083015261328f81612e90565b9050919050565b600060208201905081810360008301526132af81612eb3565b9050919050565b600060208201905081810360008301526132cf81612ed6565b9050919050565b600060208201905081810360008301526132ef81612f1c565b9050919050565b6000602082019050818103600083015261330f81612f62565b9050919050565b6000602082019050818103600083015261332f81612f85565b9050919050565b6000602082019050818103600083015261334f81612fa8565b9050919050565b600060208201905061336b6000830184612fcb565b92915050565b60006020820190506133866000830184612fda565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006133be8261350b565b91506133c98361350b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fe576133fd6135b1565b5b828201905092915050565b60006134148261350b565b915061341f8361350b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613458576134576135b1565b5b828202905092915050565b600061346e8261350b565b91506134798361350b565b92508282101561348c5761348b6135b1565b5b828203905092915050565b60006134a2826134eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613540578082015181840152602081019050613525565b8381111561354f576000848401525b50505050565b60006135608261350b565b91506000821415613574576135736135b1565b5b600182039050919050565b6000600282049050600182168061359757607f821691505b602082108114156135ab576135aa6135e0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e65722063616e74207265766f6b652068696d73656c662066726f6d206160008201527f646d696e20726f6c650000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f72656465656d2063616e206e6f7420657863656564207468652062616c616e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6577206f776e657220616e642063757272656e74206f776e6572206e65656460008201527f20746f20626520646966666572656e7400000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f7420616c6c6f77656420746f206275726e000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f457863656564732053544f5320746f6b656e206d617820746f74616c5375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b613c3b81613497565b8114613c4657600080fd5b50565b613c52816134b5565b8114613c5d57600080fd5b50565b613c69816134bf565b8114613c7457600080fd5b50565b613c808161350b565b8114613c8b57600080fd5b5056fea2646970667358221220dd692d9ec70273c9afd7cab9ca18945e0b8de562a162c18c69f162267a4c834564736f6c63430008030033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806375f12b211161011a578063a9059cbb116100ad578063d547741f1161007c578063d547741f146105a0578063d9608669146105bc578063db006a75146105d8578063dd62ed3e146105f4578063f2fde38b14610624576101fb565b8063a9059cbb1461052c578063be38c0d51461055c578063be9a655514610578578063d03563ca14610582576101fb565b806395d89b41116100e957806395d89b41146104a45780639dc29fac146104c2578063a217fddf146104de578063a457c2d7146104fc576101fb565b806375f12b211461041c5780637a9e5e4b1461043a5780638da5cb5b1461045657806391d1485414610474576101fb565b80632f2ff15d1161019257806340c10f191161016157806340c10f19146103a85780635c975abb146103c457806370a08231146103e2578063715018a614610412576101fb565b80632f2ff15d14610322578063313ce5671461033e57806336568abe1461035c5780633950935114610378576101fb565b806313af4035116101ce57806313af40351461028857806318160ddd146102a457806323b872dd146102c2578063248a9ca3146102f2576101fb565b806301ffc9a71461020057806306fdde031461023057806307da68f51461024e578063095ea7b314610258575b600080fd5b61021a60048036038101906102159190612b9a565b610640565b604051610227919061303e565b60405180910390f35b6102386106ba565b6040516102459190613074565b60405180910390f35b61025661074c565b005b610272600480360381019061026d9190612af9565b610810565b60405161027f919061303e565b60405180910390f35b6102a2600480360381019061029d9190612a45565b61086c565b005b6102ac610a3f565b6040516102b99190613356565b60405180910390f35b6102dc60048036038101906102d79190612aaa565b610a49565b6040516102e9919061303e565b60405180910390f35b61030c60048036038101906103079190612b35565b610aa7565b6040516103199190613059565b60405180910390f35b61033c60048036038101906103379190612b5e565b610ac7565b005b610346610af0565b6040516103539190613371565b60405180910390f35b61037660048036038101906103719190612b5e565b610af9565b005b610392600480360381019061038d9190612af9565b610b7c565b60405161039f919061303e565b60405180910390f35b6103c260048036038101906103bd9190612af9565b610c28565b005b6103cc610d8c565b6040516103d9919061303e565b60405180910390f35b6103fc60048036038101906103f79190612a45565b610da3565b6040516104099190613356565b60405180910390f35b61041a610deb565b005b610424610f28565b604051610431919061303e565b60405180910390f35b610454600480360381019061044f9190612a45565b610f37565b005b61045e610fbf565b60405161046b9190613023565b60405180910390f35b61048e60048036038101906104899190612b5e565b610fe9565b60405161049b919061303e565b60405180910390f35b6104ac611054565b6040516104b99190613074565b60405180910390f35b6104dc60048036038101906104d79190612af9565b6110e6565b005b6104e66111f3565b6040516104f39190613059565b60405180910390f35b61051660048036038101906105119190612af9565b6111fa565b604051610523919061303e565b60405180910390f35b61054660048036038101906105419190612af9565b6112ee565b604051610553919061303e565b60405180910390f35b61057660048036038101906105719190612a45565b61134a565b005b6105806113f3565b005b61058a6114b7565b6040516105979190613059565b60405180910390f35b6105ba60048036038101906105b59190612b5e565b6114db565b005b6105d660048036038101906105d19190612a45565b611504565b005b6105f260048036038101906105ed9190612bc3565b6115ad565b005b61060e60048036038101906106099190612a6e565b611689565b60405161061b9190613356565b60405180910390f35b61063e60048036038101906106399190612a45565b611710565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b357506106b282611bb6565b5b9050919050565b6060600380546106c99061357f565b80601f01602080910402602001604051908101604052809291908181526020018280546106f59061357f565b80156107425780601f1061071757610100808354040283529160200191610742565b820191906000526020600020905b81548152906001019060200180831161072557829003601f168201915b5050505050905090565b610754611c20565b73ffffffffffffffffffffffffffffffffffffffff16610772610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf906131f6565b60405180910390fd5b6107d0611c28565b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586107f9610fbf565b6040516108069190613023565b60405180910390a1565b600061081a610d8c565b1561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906131b6565b60405180910390fd5b6108648383611ccb565b905092915050565b610874611c20565b73ffffffffffffffffffffffffffffffffffffffff16610892610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df906131f6565b60405180910390fd5b6108f0610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561095e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095590613256565b60405180910390fd5b6000610968610fbf565b905061097382611710565b61099d7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a683611ce9565b6109c77fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611d59565b6109d46000801b83611e4b565b6109e16000801b82611d59565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600254905090565b6000610a53610d8c565b15610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a906131b6565b60405180910390fd5b610a9e848484611e59565b90509392505050565b600060066000838152602001908152602001600020600101549050919050565b610ad082610aa7565b610ae181610adc611c20565b611f5a565b610aeb8383611ff7565b505050565b60006012905090565b610b01611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b65906132f6565b60405180910390fd5b610b7882826120d8565b5050565b6000610c1e610b89611c20565b848460016000610b97611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c1991906133b3565b6121ba565b6001905092915050565b610c30610d8c565b15610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c67906131b6565b60405180910390fd5b610c9a7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a633610fe9565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613136565b60405180910390fd5b60075481610ce5610a3f565b610cef91906133b3565b1115610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2790613336565b60405180910390fd5b610d3a8282612385565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610d809190613356565b60405180910390a25050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610df3611c20565b73ffffffffffffffffffffffffffffffffffffffff16610e11610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e906131f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610f32610d8c565b905090565b610f3f611c20565b73ffffffffffffffffffffffffffffffffffffffff16610f5d610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa906131f6565b60405180910390fd5b610fbc8161134a565b50565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546110639061357f565b80601f016020809104026020016040519081016040528092919081815260200182805461108f9061357f565b80156110dc5780601f106110b1576101008083540402835291602001916110dc565b820191906000526020600020905b8154815290600101906020018083116110bf57829003601f168201915b5050505050905090565b6110ee610d8c565b1561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906131b6565b60405180910390fd5b6111587fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a633610fe9565b611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e90613296565b60405180910390fd5b6111a182826124d9565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516111e79190613356565b60405180910390a25050565b6000801b81565b60008060016000611209611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd906132d6565b60405180910390fd5b6112e36112d1611c20565b8585846112de9190613463565b6121ba565b600191505092915050565b60006112f8610d8c565b15611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f906131b6565b60405180910390fd5b61134283836126ad565b905092915050565b611352611c20565b73ffffffffffffffffffffffffffffffffffffffff16611370610fbf565b73ffffffffffffffffffffffffffffffffffffffff16146113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd906131f6565b60405180910390fd5b6113f07fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611ce9565b50565b6113fb611c20565b73ffffffffffffffffffffffffffffffffffffffff16611419610fbf565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611466906131f6565b60405180910390fd5b6114776126cb565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114a0610fbf565b6040516114ad9190613023565b60405180910390a1565b7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a681565b6114e482610aa7565b6114f5816114f0611c20565b611f5a565b6114ff83836120d8565b505050565b61150c611c20565b73ffffffffffffffffffffffffffffffffffffffff1661152a610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611577906131f6565b60405180910390fd5b6115aa7fa60cb0df7bc178038b993aa2e0df2e2cfb6627f4695e4261227d47422ae7e2a682611d59565b50565b6115b5611c20565b73ffffffffffffffffffffffffffffffffffffffff166115d3610fbf565b73ffffffffffffffffffffffffffffffffffffffff1614611629576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611620906131f6565b60405180910390fd5b8061163330610da3565b1015611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90613216565b60405180910390fd5b61168630611680610fbf565b8361276d565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611718611c20565b73ffffffffffffffffffffffffffffffffffffffff16611736610fbf565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611783906131f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613156565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600060028360026118cf9190613409565b6118d991906133b3565b67ffffffffffffffff811115611918577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561194a5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106119a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611a729190613409565b611a7c91906133b3565b90505b6001811115611b68577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611b6190613555565b9050611a7f565b5060008414611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613096565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b611c30610d8c565b15611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906131b6565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cb4611c20565b604051611cc19190613023565b60405180910390a1565b6000611cdf611cd8611c20565b84846121ba565b6001905092915050565b611cf38282610ac7565b611cfb610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b816000801b1415611ddb57611d6c610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613116565b60405180910390fd5b5b611de582826114db565b611ded610fbf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b611e558282611ff7565b5050565b6000611e6684848461276d565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611eb1611c20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906131d6565b60405180910390fd5b611f4e85611f3d611c20565b8584611f499190613463565b6121ba565b60019150509392505050565b611f648282610fe9565b611ff357611f898173ffffffffffffffffffffffffffffffffffffffff1660146118bc565b611f978360001c60206118bc565b604051602001611fa8929190612fe9565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea9190613074565b60405180910390fd5b5050565b6120018282610fe9565b6120d45760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612079611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6120e28282610fe9565b156121b65760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061215b611c20565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906132b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229190613176565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123789190613356565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90613316565b60405180910390fd5b612401600083836129ec565b806002600082825461241391906133b3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461246891906133b3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124cd9190613356565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090613236565b60405180910390fd5b612555826000836129ec565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906130f6565b60405180910390fd5b81816125e79190613463565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461263b9190613463565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126a09190613356565b60405180910390a3505050565b60006126c16126ba611c20565b848461276d565b6001905092915050565b6126d3610d8c565b612712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612709906130d6565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612756611c20565b6040516127639190613023565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490613276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906130b6565b60405180910390fd5b6128588383836129ec565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590613196565b60405180910390fd5b81816128ea9190613463565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297a91906133b3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129de9190613356565b60405180910390a350505050565b505050565b600081359050612a0081613c32565b92915050565b600081359050612a1581613c49565b92915050565b600081359050612a2a81613c60565b92915050565b600081359050612a3f81613c77565b92915050565b600060208284031215612a5757600080fd5b6000612a65848285016129f1565b91505092915050565b60008060408385031215612a8157600080fd5b6000612a8f858286016129f1565b9250506020612aa0858286016129f1565b9150509250929050565b600080600060608486031215612abf57600080fd5b6000612acd868287016129f1565b9350506020612ade868287016129f1565b9250506040612aef86828701612a30565b9150509250925092565b60008060408385031215612b0c57600080fd5b6000612b1a858286016129f1565b9250506020612b2b85828601612a30565b9150509250929050565b600060208284031215612b4757600080fd5b6000612b5584828501612a06565b91505092915050565b60008060408385031215612b7157600080fd5b6000612b7f85828601612a06565b9250506020612b90858286016129f1565b9150509250929050565b600060208284031215612bac57600080fd5b6000612bba84828501612a1b565b91505092915050565b600060208284031215612bd557600080fd5b6000612be384828501612a30565b91505092915050565b612bf581613497565b82525050565b612c04816134a9565b82525050565b612c13816134b5565b82525050565b6000612c248261338c565b612c2e8185613397565b9350612c3e818560208601613522565b612c478161360f565b840191505092915050565b6000612c5d8261338c565b612c6781856133a8565b9350612c77818560208601613522565b80840191505092915050565b6000612c90602083613397565b9150612c9b82613620565b602082019050919050565b6000612cb3602383613397565b9150612cbe82613649565b604082019050919050565b6000612cd6601483613397565b9150612ce182613698565b602082019050919050565b6000612cf9602283613397565b9150612d04826136c1565b604082019050919050565b6000612d1c602983613397565b9150612d2782613710565b604082019050919050565b6000612d3f601d83613397565b9150612d4a8261375f565b602082019050919050565b6000612d62602683613397565b9150612d6d82613788565b604082019050919050565b6000612d85602283613397565b9150612d90826137d7565b604082019050919050565b6000612da8602683613397565b9150612db382613826565b604082019050919050565b6000612dcb601083613397565b9150612dd682613875565b602082019050919050565b6000612dee602883613397565b9150612df98261389e565b604082019050919050565b6000612e11602083613397565b9150612e1c826138ed565b602082019050919050565b6000612e34602183613397565b9150612e3f82613916565b604082019050919050565b6000612e57602183613397565b9150612e6282613965565b604082019050919050565b6000612e7a603083613397565b9150612e85826139b4565b604082019050919050565b6000612e9d602583613397565b9150612ea882613a03565b604082019050919050565b6000612ec0601d83613397565b9150612ecb82613a52565b602082019050919050565b6000612ee3602483613397565b9150612eee82613a7b565b604082019050919050565b6000612f066017836133a8565b9150612f1182613aca565b601782019050919050565b6000612f29602583613397565b9150612f3482613af3565b604082019050919050565b6000612f4c6011836133a8565b9150612f5782613b42565b601182019050919050565b6000612f6f602f83613397565b9150612f7a82613b6b565b604082019050919050565b6000612f92601f83613397565b9150612f9d82613bba565b602082019050919050565b6000612fb5602283613397565b9150612fc082613be3565b604082019050919050565b612fd48161350b565b82525050565b612fe381613515565b82525050565b6000612ff482612ef9565b91506130008285612c52565b915061300b82612f3f565b91506130178284612c52565b91508190509392505050565b60006020820190506130386000830184612bec565b92915050565b60006020820190506130536000830184612bfb565b92915050565b600060208201905061306e6000830184612c0a565b92915050565b6000602082019050818103600083015261308e8184612c19565b905092915050565b600060208201905081810360008301526130af81612c83565b9050919050565b600060208201905081810360008301526130cf81612ca6565b9050919050565b600060208201905081810360008301526130ef81612cc9565b9050919050565b6000602082019050818103600083015261310f81612cec565b9050919050565b6000602082019050818103600083015261312f81612d0f565b9050919050565b6000602082019050818103600083015261314f81612d32565b9050919050565b6000602082019050818103600083015261316f81612d55565b9050919050565b6000602082019050818103600083015261318f81612d78565b9050919050565b600060208201905081810360008301526131af81612d9b565b9050919050565b600060208201905081810360008301526131cf81612dbe565b9050919050565b600060208201905081810360008301526131ef81612de1565b9050919050565b6000602082019050818103600083015261320f81612e04565b9050919050565b6000602082019050818103600083015261322f81612e27565b9050919050565b6000602082019050818103600083015261324f81612e4a565b9050919050565b6000602082019050818103600083015261326f81612e6d565b9050919050565b6000602082019050818103600083015261328f81612e90565b9050919050565b600060208201905081810360008301526132af81612eb3565b9050919050565b600060208201905081810360008301526132cf81612ed6565b9050919050565b600060208201905081810360008301526132ef81612f1c565b9050919050565b6000602082019050818103600083015261330f81612f62565b9050919050565b6000602082019050818103600083015261332f81612f85565b9050919050565b6000602082019050818103600083015261334f81612fa8565b9050919050565b600060208201905061336b6000830184612fcb565b92915050565b60006020820190506133866000830184612fda565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006133be8261350b565b91506133c98361350b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fe576133fd6135b1565b5b828201905092915050565b60006134148261350b565b915061341f8361350b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613458576134576135b1565b5b828202905092915050565b600061346e8261350b565b91506134798361350b565b92508282101561348c5761348b6135b1565b5b828203905092915050565b60006134a2826134eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015613540578082015181840152602081019050613525565b8381111561354f576000848401525b50505050565b60006135608261350b565b91506000821415613574576135736135b1565b5b600182039050919050565b6000600282049050600182168061359757607f821691505b602082108114156135ab576135aa6135e0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f6f776e65722063616e74207265766f6b652068696d73656c662066726f6d206160008201527f646d696e20726f6c650000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f72656465656d2063616e206e6f7420657863656564207468652062616c616e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6577206f776e657220616e642063757272656e74206f776e6572206e65656460008201527f20746f20626520646966666572656e7400000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f7420616c6c6f77656420746f206275726e000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f457863656564732053544f5320746f6b656e206d617820746f74616c5375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b613c3b81613497565b8114613c4657600080fd5b50565b613c52816134b5565b8114613c5d57600080fd5b50565b613c69816134bf565b8114613c7457600080fd5b50565b613c808161350b565b8114613c8b57600080fd5b5056fea2646970667358221220dd692d9ec70273c9afd7cab9ca18945e0b8de562a162c18c69f162267a4c834564736f6c63430008030033

Deployed Bytecode Sourcemap

35044:1715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8988:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18979:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34838:93;;;:::i;:::-;;35566:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32767:497;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20099:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35708:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10299:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10684:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19941:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11732:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22628:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36022:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31124:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20270:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29495:148;;;:::i;:::-;;34750:80;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33441:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28844:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9297:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19198:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36335:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7262:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23346:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35878:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33639:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34939:98;;;:::i;:::-;;32430:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11076:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33839:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36557:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20848:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29798:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8988:217;9073:4;9112:32;9097:47;;;:11;:47;;;;:100;;;;9161:36;9185:11;9161:23;:36::i;:::-;9097:100;9090:107;;8988:217;;;:::o;18979:100::-;19033:13;19066:5;19059:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18979:100;:::o;34838:93::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34882:8:::1;:6;:8::i;:::-;34908:15;34915:7;:5;:7::i;:::-;34908:15;;;;;;:::i;:::-;;;;;;;;34838:93::o:0;35566:134::-;35645:4;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35669:23:::1;35683:3;35688;35669:13;:23::i;:::-;35662:30;;35566:134:::0;;;;:::o;32767:497::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32851:7:::1;:5;:7::i;:::-;32839:19;;:8;:19;;;;32831:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32924:16;32943:7;:5;:7::i;:::-;32924:26;;32963:27;32981:8;32963:17;:27::i;:::-;33003:38;32471:27;33032:8;33003:12;:38::i;:::-;33052:39;32471:27;33082:8;33052:13;:39::i;:::-;33104:40;7307:4;33115:18:::0;::::1;33135:8;33104:10;:40::i;:::-;33155:43;7307:4;33169:18:::0;::::1;33189:8;33155:13;:43::i;:::-;33247:8;33216:40;;33237:8;33216:40;;;;;;;;;;;;29135:1;32767:497:::0;:::o;20099:108::-;20160:7;20187:12;;20180:19;;20099:108;:::o;35708:162::-;35805:4;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35829:33:::1;35848:3;35853;35858;35829:18;:33::i;:::-;35822:40;;35708:162:::0;;;;;:::o;10299:123::-;10365:7;10392:6;:12;10399:4;10392:12;;;;;;;;;;;:22;;;10385:29;;10299:123;;;:::o;10684:147::-;10767:18;10780:4;10767:12;:18::i;:::-;8866:30;8877:4;8883:12;:10;:12::i;:::-;8866:10;:30::i;:::-;10798:25:::1;10809:4;10815:7;10798:10;:25::i;:::-;10684:147:::0;;;:::o;19941:93::-;19999:5;20024:2;20017:9;;19941:93;:::o;11732:218::-;11839:12;:10;:12::i;:::-;11828:23;;:7;:23;;;11820:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;11916:26;11928:4;11934:7;11916:11;:26::i;:::-;11732:218;;:::o;22628:215::-;22716:4;22733:80;22742:12;:10;:12::i;:::-;22756:7;22802:10;22765:11;:25;22777:12;:10;:12::i;:::-;22765:25;;;;;;;;;;;;;;;:34;22791:7;22765:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;22733:8;:80::i;:::-;22831:4;22824:11;;22628:215;;;;:::o;36022:305::-;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36099:35:::1;32471:27;36123:10;36099:7;:35::i;:::-;36091:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36210:10;;36203:3;36187:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;36179:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36272:15;36278:3;36283;36272:5;:15::i;:::-;36310:3;36305:14;;;36315:3;36305:14;;;;;;:::i;:::-;;;;;;;;36022:305:::0;;:::o;31124:86::-;31171:4;31195:7;;;;;;;;;;;31188:14;;31124:86;:::o;20270:127::-;20344:7;20371:9;:18;20381:7;20371:18;;;;;;;;;;;;;;;;20364:25;;20270:127;;;:::o;29495:148::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29602:1:::1;29565:40;;29586:6;;;;;;;;;;;29565:40;;;;;;;;;;;;29633:1;29616:6;;:19;;;;;;;;;;;;;;;;;;29495:148::o:0;34750:80::-;34790:4;34814:8;:6;:8::i;:::-;34807:15;;34750:80;:::o;33441:119::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33517:35:::1;33535:16;33517:17;:35::i;:::-;33441:119:::0;:::o;28844:87::-;28890:7;28917:6;;;;;;;;;;;28910:13;;28844:87;:::o;9297:139::-;9375:4;9399:6;:12;9406:4;9399:12;;;;;;;;;;;:20;;:29;9420:7;9399:29;;;;;;;;;;;;;;;;;;;;;;;;;9392:36;;9297:139;;;;:::o;19198:104::-;19254:13;19287:7;19280:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19198:104;:::o;36335:214::-;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36412:35:::1;32471:27;36436:10;36412:7;:35::i;:::-;36404:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36494:15;36500:3;36505;36494:5;:15::i;:::-;36532:3;36527:14;;;36537:3;36527:14;;;;;;:::i;:::-;;;;;;;;36335:214:::0;;:::o;7262:49::-;7307:4;7262:49;;;:::o;23346:377::-;23439:4;23456:24;23483:11;:25;23495:12;:10;:12::i;:::-;23483:25;;;;;;;;;;;;;;;:34;23509:7;23483:34;;;;;;;;;;;;;;;;23456:61;;23556:15;23536:16;:35;;23528:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23624:67;23633:12;:10;:12::i;:::-;23647:7;23675:15;23656:16;:34;;;;:::i;:::-;23624:8;:67::i;:::-;23711:4;23704:11;;;23346:377;;;;:::o;35878:136::-;35958:4;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35982:24:::1;35997:3;36002;35982:14;:24::i;:::-;35975:31;;35878:136:::0;;;;:::o;33639:117::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33711:37:::1;32471:27;33740:7;33711:12;:37::i;:::-;33639:117:::0;:::o;34939:98::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34984:10:::1;:8;:10::i;:::-;35012:17;35021:7;:5;:7::i;:::-;35012:17;;;;;;:::i;:::-;;;;;;;;34939:98::o:0;32430:68::-;32471:27;32430:68;:::o;11076:149::-;11160:18;11173:4;11160:12;:18::i;:::-;8866:30;8877:4;8883:12;:10;:12::i;:::-;8866:10;:30::i;:::-;11191:26:::1;11203:4;11209:7;11191:11;:26::i;:::-;11076:149:::0;;;:::o;33839:119::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33912:38:::1;32471:27;33942:7;33912:13;:38::i;:::-;33839:119:::0;:::o;36557:199::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36650:6:::1;36622:24;36640:4;36622:9;:24::i;:::-;:34;;36614:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36707:41;36725:4;36732:7;:5;:7::i;:::-;36741:6;36707:9;:41::i;:::-;36557:199:::0;:::o;20848:151::-;20937:7;20964:11;:18;20976:5;20964:18;;;;;;;;;;;;;;;:27;20983:7;20964:27;;;;;;;;;;;;;;;;20957:34;;20848:151;;;;:::o;29798:244::-;29075:12;:10;:12::i;:::-;29064:23;;:7;:5;:7::i;:::-;:23;;;29056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29907:1:::1;29887:22;;:8;:22;;;;29879:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29997:8;29968:38;;29989:6;;;;;;;;;;;29968:38;;;;;;;;;;;;30026:8;30017:6;;:17;;;;;;;;;;;;;;;;;;29798:244:::0;:::o;2611:447::-;2686:13;2712:19;2757:1;2748:6;2744:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2734:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2712:47;;2770:15;:6;2777:1;2770:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;2796;:6;2803:1;2796:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;2827:9;2852:1;2843:6;2839:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;2827:26;;2822:131;2859:1;2855;:5;2822:131;;;2894:8;2911:3;2903:5;:11;2894:21;;;;;;;;;;;;;;;;;;2882:6;2889:1;2882:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;2940:1;2930:11;;;;;2862:3;;;;:::i;:::-;;;2822:131;;;;2980:1;2971:5;:10;2963:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3043:6;3029:21;;;2611:447;;;;:::o;4714:157::-;4799:4;4838:25;4823:40;;;:11;:40;;;;4816:47;;4714:157;;;:::o;655:98::-;708:7;735:10;728:17;;655:98;:::o;31924:118::-;31450:8;:6;:8::i;:::-;31449:9;31441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;31994:4:::1;31984:7;;:14;;;;;;;;;;;;;;;;;;32014:20;32021:12;:10;:12::i;:::-;32014:20;;;;;;:::i;:::-;;;;;;;;31924:118::o:0;21146:169::-;21229:4;21246:39;21255:12;:10;:12::i;:::-;21269:7;21278:6;21246:8;:39::i;:::-;21303:4;21296:11;;21146:169;;;;:::o;34036:158::-;34109:24;34119:4;34125:7;34109:9;:24::i;:::-;34178:7;:5;:7::i;:::-;34151:35;;34169:7;34151:35;;34163:4;34151:35;;;;;;;;;;34036:158;;:::o;34274:303::-;34374:4;7307;34352:18;;:26;34348:131;;;34414:7;:5;:7::i;:::-;34403:18;;:7;:18;;;;34395:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;34348:131;34491:25;34502:4;34508:7;34491:10;:25::i;:::-;34561:7;:5;:7::i;:::-;34534:35;;34552:7;34534:35;;34546:4;34534:35;;;;;;;;;;34274:303;;:::o;12533:112::-;12612:25;12623:4;12629:7;12612:10;:25::i;:::-;12533:112;;:::o;21797:422::-;21903:4;21920:36;21930:6;21938:9;21949:6;21920:9;:36::i;:::-;21969:24;21996:11;:19;22008:6;21996:19;;;;;;;;;;;;;;;:33;22016:12;:10;:12::i;:::-;21996:33;;;;;;;;;;;;;;;;21969:60;;22068:6;22048:16;:26;;22040:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;22130:57;22139:6;22147:12;:10;:12::i;:::-;22180:6;22161:16;:25;;;;:::i;:::-;22130:8;:57::i;:::-;22207:4;22200:11;;;21797:422;;;;;:::o;9726:384::-;9806:22;9814:4;9820:7;9806;:22::i;:::-;9802:301;;9938:41;9966:7;9938:41;;9976:2;9938:19;:41::i;:::-;10036:38;10064:4;10056:13;;10071:2;10036:19;:38::i;:::-;9859:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9845:246;;;;;;;;;;;:::i;:::-;;;;;;;;9802:301;9726:384;;:::o;12980:229::-;13055:22;13063:4;13069:7;13055;:22::i;:::-;13050:152;;13126:4;13094:6;:12;13101:4;13094:12;;;;;;;;;;;:20;;:29;13115:7;13094:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;13177:12;:10;:12::i;:::-;13150:40;;13168:7;13150:40;;13162:4;13150:40;;;;;;;;;;13050:152;12980:229;;:::o;13217:230::-;13292:22;13300:4;13306:7;13292;:22::i;:::-;13288:152;;;13363:5;13331:6;:12;13338:4;13331:12;;;;;;;;;;;:20;;:29;13352:7;13331:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;13415:12;:10;:12::i;:::-;13388:40;;13406:7;13388:40;;13400:4;13388:40;;;;;;;;;;13288:152;13217:230;;:::o;26702:346::-;26821:1;26804:19;;:5;:19;;;;26796:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26902:1;26883:21;;:7;:21;;;;26875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26986:6;26956:11;:18;26968:5;26956:18;;;;;;;;;;;;;;;:27;26975:7;26956:27;;;;;;;;;;;;;;;:36;;;;27024:7;27008:32;;27017:5;27008:32;;;27033:6;27008:32;;;;;;:::i;:::-;;;;;;;;26702:346;;;:::o;25099:338::-;25202:1;25183:21;;:7;:21;;;;25175:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;25253:49;25282:1;25286:7;25295:6;25253:20;:49::i;:::-;25331:6;25315:12;;:22;;;;;;;:::i;:::-;;;;;;;;25370:6;25348:9;:18;25358:7;25348:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;25413:7;25392:37;;25409:1;25392:37;;;25422:6;25392:37;;;;;;:::i;:::-;;;;;;;;25099:338;;:::o;25770:494::-;25873:1;25854:21;;:7;:21;;;;25846:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25926:49;25947:7;25964:1;25968:6;25926:20;:49::i;:::-;25988:22;26013:9;:18;26023:7;26013:18;;;;;;;;;;;;;;;;25988:43;;26068:6;26050:14;:24;;26042:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26162:6;26145:14;:23;;;;:::i;:::-;26124:9;:18;26134:7;26124:18;;;;;;;;;;;;;;;:44;;;;26195:6;26179:12;;:22;;;;;;;:::i;:::-;;;;;;;;26245:1;26219:37;;26228:7;26219:37;;;26249:6;26219:37;;;;;;:::i;:::-;;;;;;;;25770:494;;;:::o;20610:175::-;20696:4;20713:42;20723:12;:10;:12::i;:::-;20737:9;20748:6;20713:9;:42::i;:::-;20773:4;20766:11;;20610:175;;;;:::o;32183:120::-;31727:8;:6;:8::i;:::-;31719:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;32252:5:::1;32242:7;;:15;;;;;;;;;;;;;;;;;;32273:22;32282:12;:10;:12::i;:::-;32273:22;;;;;;:::i;:::-;;;;;;;;32183:120::o:0;24213:604::-;24337:1;24319:20;;:6;:20;;;;24311:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;24421:1;24400:23;;:9;:23;;;;24392:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24476:47;24497:6;24505:9;24516:6;24476:20;:47::i;:::-;24536:21;24560:9;:17;24570:6;24560:17;;;;;;;;;;;;;;;;24536:41;;24613:6;24596:13;:23;;24588:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24709:6;24693:13;:22;;;;:::i;:::-;24673:9;:17;24683:6;24673:17;;;;;;;;;;;;;;;:42;;;;24750:6;24726:9;:20;24736:9;24726:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;24791:9;24774:35;;24783:6;24774:35;;;24802:6;24774:35;;;;;;:::i;:::-;;;;;;;;24213:604;;;;:::o;27651:92::-;;;;:::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:262::-;;693:2;681:9;672:7;668:23;664:32;661:2;;;709:1;706;699:12;661:2;752:1;777:53;822:7;813:6;802:9;798:22;777:53;:::i;:::-;767:63;;723:117;651:196;;;;:::o;853:407::-;;;978:2;966:9;957:7;953:23;949:32;946:2;;;994:1;991;984:12;946:2;1037:1;1062:53;1107:7;1098:6;1087:9;1083:22;1062:53;:::i;:::-;1052:63;;1008:117;1164:2;1190:53;1235:7;1226:6;1215:9;1211:22;1190:53;:::i;:::-;1180:63;;1135:118;936:324;;;;;:::o;1266:552::-;;;;1408:2;1396:9;1387:7;1383:23;1379:32;1376:2;;;1424:1;1421;1414:12;1376:2;1467:1;1492:53;1537:7;1528:6;1517:9;1513:22;1492:53;:::i;:::-;1482:63;;1438:117;1594:2;1620:53;1665:7;1656:6;1645:9;1641:22;1620:53;:::i;:::-;1610:63;;1565:118;1722:2;1748:53;1793:7;1784:6;1773:9;1769:22;1748:53;:::i;:::-;1738:63;;1693:118;1366:452;;;;;:::o;1824:407::-;;;1949:2;1937:9;1928:7;1924:23;1920:32;1917:2;;;1965:1;1962;1955:12;1917:2;2008:1;2033:53;2078:7;2069:6;2058:9;2054:22;2033:53;:::i;:::-;2023:63;;1979:117;2135:2;2161:53;2206:7;2197:6;2186:9;2182:22;2161:53;:::i;:::-;2151:63;;2106:118;1907:324;;;;;:::o;2237:262::-;;2345:2;2333:9;2324:7;2320:23;2316:32;2313:2;;;2361:1;2358;2351:12;2313:2;2404:1;2429:53;2474:7;2465:6;2454:9;2450:22;2429:53;:::i;:::-;2419:63;;2375:117;2303:196;;;;:::o;2505:407::-;;;2630:2;2618:9;2609:7;2605:23;2601:32;2598:2;;;2646:1;2643;2636:12;2598:2;2689:1;2714:53;2759:7;2750:6;2739:9;2735:22;2714:53;:::i;:::-;2704:63;;2660:117;2816:2;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2787:118;2588:324;;;;;:::o;2918:260::-;;3025:2;3013:9;3004:7;3000:23;2996:32;2993:2;;;3041:1;3038;3031:12;2993:2;3084:1;3109:52;3153:7;3144:6;3133:9;3129:22;3109:52;:::i;:::-;3099:62;;3055:116;2983:195;;;;:::o;3184:262::-;;3292:2;3280:9;3271:7;3267:23;3263:32;3260:2;;;3308:1;3305;3298:12;3260:2;3351:1;3376:53;3421:7;3412:6;3401:9;3397:22;3376:53;:::i;:::-;3366:63;;3322:117;3250:196;;;;:::o;3452:118::-;3539:24;3557:5;3539:24;:::i;:::-;3534:3;3527:37;3517:53;;:::o;3576:109::-;3657:21;3672:5;3657:21;:::i;:::-;3652:3;3645:34;3635:50;;:::o;3691:118::-;3778:24;3796:5;3778:24;:::i;:::-;3773:3;3766:37;3756:53;;:::o;3815:364::-;;3931:39;3964:5;3931:39;:::i;:::-;3986:71;4050:6;4045:3;3986:71;:::i;:::-;3979:78;;4066:52;4111:6;4106:3;4099:4;4092:5;4088:16;4066:52;:::i;:::-;4143:29;4165:6;4143:29;:::i;:::-;4138:3;4134:39;4127:46;;3907:272;;;;;:::o;4185:377::-;;4319:39;4352:5;4319:39;:::i;:::-;4374:89;4456:6;4451:3;4374:89;:::i;:::-;4367:96;;4472:52;4517:6;4512:3;4505:4;4498:5;4494:16;4472:52;:::i;:::-;4549:6;4544:3;4540:16;4533:23;;4295:267;;;;;:::o;4568:366::-;;4731:67;4795:2;4790:3;4731:67;:::i;:::-;4724:74;;4807:93;4896:3;4807:93;:::i;:::-;4925:2;4920:3;4916:12;4909:19;;4714:220;;;:::o;4940:366::-;;5103:67;5167:2;5162:3;5103:67;:::i;:::-;5096:74;;5179:93;5268:3;5179:93;:::i;:::-;5297:2;5292:3;5288:12;5281:19;;5086:220;;;:::o;5312:366::-;;5475:67;5539:2;5534:3;5475:67;:::i;:::-;5468:74;;5551:93;5640:3;5551:93;:::i;:::-;5669:2;5664:3;5660:12;5653:19;;5458:220;;;:::o;5684:366::-;;5847:67;5911:2;5906:3;5847:67;:::i;:::-;5840:74;;5923:93;6012:3;5923:93;:::i;:::-;6041:2;6036:3;6032:12;6025:19;;5830:220;;;:::o;6056:366::-;;6219:67;6283:2;6278:3;6219:67;:::i;:::-;6212:74;;6295:93;6384:3;6295:93;:::i;:::-;6413:2;6408:3;6404:12;6397:19;;6202:220;;;:::o;6428:366::-;;6591:67;6655:2;6650:3;6591:67;:::i;:::-;6584:74;;6667:93;6756:3;6667:93;:::i;:::-;6785:2;6780:3;6776:12;6769:19;;6574:220;;;:::o;6800:366::-;;6963:67;7027:2;7022:3;6963:67;:::i;:::-;6956:74;;7039:93;7128:3;7039:93;:::i;:::-;7157:2;7152:3;7148:12;7141:19;;6946:220;;;:::o;7172:366::-;;7335:67;7399:2;7394:3;7335:67;:::i;:::-;7328:74;;7411:93;7500:3;7411:93;:::i;:::-;7529:2;7524:3;7520:12;7513:19;;7318:220;;;:::o;7544:366::-;;7707:67;7771:2;7766:3;7707:67;:::i;:::-;7700:74;;7783:93;7872:3;7783:93;:::i;:::-;7901:2;7896:3;7892:12;7885:19;;7690:220;;;:::o;7916:366::-;;8079:67;8143:2;8138:3;8079:67;:::i;:::-;8072:74;;8155:93;8244:3;8155:93;:::i;:::-;8273:2;8268:3;8264:12;8257:19;;8062:220;;;:::o;8288:366::-;;8451:67;8515:2;8510:3;8451:67;:::i;:::-;8444:74;;8527:93;8616:3;8527:93;:::i;:::-;8645:2;8640:3;8636:12;8629:19;;8434:220;;;:::o;8660:366::-;;8823:67;8887:2;8882:3;8823:67;:::i;:::-;8816:74;;8899:93;8988:3;8899:93;:::i;:::-;9017:2;9012:3;9008:12;9001:19;;8806:220;;;:::o;9032:366::-;;9195:67;9259:2;9254:3;9195:67;:::i;:::-;9188:74;;9271:93;9360:3;9271:93;:::i;:::-;9389:2;9384:3;9380:12;9373:19;;9178:220;;;:::o;9404:366::-;;9567:67;9631:2;9626:3;9567:67;:::i;:::-;9560:74;;9643:93;9732:3;9643:93;:::i;:::-;9761:2;9756:3;9752:12;9745:19;;9550:220;;;:::o;9776:366::-;;9939:67;10003:2;9998:3;9939:67;:::i;:::-;9932:74;;10015:93;10104:3;10015:93;:::i;:::-;10133:2;10128:3;10124:12;10117:19;;9922:220;;;:::o;10148:366::-;;10311:67;10375:2;10370:3;10311:67;:::i;:::-;10304:74;;10387:93;10476:3;10387:93;:::i;:::-;10505:2;10500:3;10496:12;10489:19;;10294:220;;;:::o;10520:366::-;;10683:67;10747:2;10742:3;10683:67;:::i;:::-;10676:74;;10759:93;10848:3;10759:93;:::i;:::-;10877:2;10872:3;10868:12;10861:19;;10666:220;;;:::o;10892:366::-;;11055:67;11119:2;11114:3;11055:67;:::i;:::-;11048:74;;11131:93;11220:3;11131:93;:::i;:::-;11249:2;11244:3;11240:12;11233:19;;11038:220;;;:::o;11264:402::-;;11445:85;11527:2;11522:3;11445:85;:::i;:::-;11438:92;;11539:93;11628:3;11539:93;:::i;:::-;11657:2;11652:3;11648:12;11641:19;;11428:238;;;:::o;11672:366::-;;11835:67;11899:2;11894:3;11835:67;:::i;:::-;11828:74;;11911:93;12000:3;11911:93;:::i;:::-;12029:2;12024:3;12020:12;12013:19;;11818:220;;;:::o;12044:402::-;;12225:85;12307:2;12302:3;12225:85;:::i;:::-;12218:92;;12319:93;12408:3;12319:93;:::i;:::-;12437:2;12432:3;12428:12;12421:19;;12208:238;;;:::o;12452:366::-;;12615:67;12679:2;12674:3;12615:67;:::i;:::-;12608:74;;12691:93;12780:3;12691:93;:::i;:::-;12809:2;12804:3;12800:12;12793:19;;12598:220;;;:::o;12824:366::-;;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12970:220;;;:::o;13196:366::-;;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13342:220;;;:::o;13568:118::-;13655:24;13673:5;13655:24;:::i;:::-;13650:3;13643:37;13633:53;;:::o;13692:112::-;13775:22;13791:5;13775:22;:::i;:::-;13770:3;13763:35;13753:51;;:::o;13810:967::-;;14214:148;14358:3;14214:148;:::i;:::-;14207:155;;14379:95;14470:3;14461:6;14379:95;:::i;:::-;14372:102;;14491:148;14635:3;14491:148;:::i;:::-;14484:155;;14656:95;14747:3;14738:6;14656:95;:::i;:::-;14649:102;;14768:3;14761:10;;14196:581;;;;;:::o;14783:222::-;;14914:2;14903:9;14899:18;14891:26;;14927:71;14995:1;14984:9;14980:17;14971:6;14927:71;:::i;:::-;14881:124;;;;:::o;15011:210::-;;15136:2;15125:9;15121:18;15113:26;;15149:65;15211:1;15200:9;15196:17;15187:6;15149:65;:::i;:::-;15103:118;;;;:::o;15227:222::-;;15358:2;15347:9;15343:18;15335:26;;15371:71;15439:1;15428:9;15424:17;15415:6;15371:71;:::i;:::-;15325:124;;;;:::o;15455:313::-;;15606:2;15595:9;15591:18;15583:26;;15655:9;15649:4;15645:20;15641:1;15630:9;15626:17;15619:47;15683:78;15756:4;15747:6;15683:78;:::i;:::-;15675:86;;15573:195;;;;:::o;15774:419::-;;15978:2;15967:9;15963:18;15955:26;;16027:9;16021:4;16017:20;16013:1;16002:9;15998:17;15991:47;16055:131;16181:4;16055:131;:::i;:::-;16047:139;;15945:248;;;:::o;16199:419::-;;16403:2;16392:9;16388:18;16380:26;;16452:9;16446:4;16442:20;16438:1;16427:9;16423:17;16416:47;16480:131;16606:4;16480:131;:::i;:::-;16472:139;;16370:248;;;:::o;16624:419::-;;16828:2;16817:9;16813:18;16805:26;;16877:9;16871:4;16867:20;16863:1;16852:9;16848:17;16841:47;16905:131;17031:4;16905:131;:::i;:::-;16897:139;;16795:248;;;:::o;17049:419::-;;17253:2;17242:9;17238:18;17230:26;;17302:9;17296:4;17292:20;17288:1;17277:9;17273:17;17266:47;17330:131;17456:4;17330:131;:::i;:::-;17322:139;;17220:248;;;:::o;17474:419::-;;17678:2;17667:9;17663:18;17655:26;;17727:9;17721:4;17717:20;17713:1;17702:9;17698:17;17691:47;17755:131;17881:4;17755:131;:::i;:::-;17747:139;;17645:248;;;:::o;17899:419::-;;18103:2;18092:9;18088:18;18080:26;;18152:9;18146:4;18142:20;18138:1;18127:9;18123:17;18116:47;18180:131;18306:4;18180:131;:::i;:::-;18172:139;;18070:248;;;:::o;18324:419::-;;18528:2;18517:9;18513:18;18505:26;;18577:9;18571:4;18567:20;18563:1;18552:9;18548:17;18541:47;18605:131;18731:4;18605:131;:::i;:::-;18597:139;;18495:248;;;:::o;18749:419::-;;18953:2;18942:9;18938:18;18930:26;;19002:9;18996:4;18992:20;18988:1;18977:9;18973:17;18966:47;19030:131;19156:4;19030:131;:::i;:::-;19022:139;;18920:248;;;:::o;19174:419::-;;19378:2;19367:9;19363:18;19355:26;;19427:9;19421:4;19417:20;19413:1;19402:9;19398:17;19391:47;19455:131;19581:4;19455:131;:::i;:::-;19447:139;;19345:248;;;:::o;19599:419::-;;19803:2;19792:9;19788:18;19780:26;;19852:9;19846:4;19842:20;19838:1;19827:9;19823:17;19816:47;19880:131;20006:4;19880:131;:::i;:::-;19872:139;;19770:248;;;:::o;20024:419::-;;20228:2;20217:9;20213:18;20205:26;;20277:9;20271:4;20267:20;20263:1;20252:9;20248:17;20241:47;20305:131;20431:4;20305:131;:::i;:::-;20297:139;;20195:248;;;:::o;20449:419::-;;20653:2;20642:9;20638:18;20630:26;;20702:9;20696:4;20692:20;20688:1;20677:9;20673:17;20666:47;20730:131;20856:4;20730:131;:::i;:::-;20722:139;;20620:248;;;:::o;20874:419::-;;21078:2;21067:9;21063:18;21055:26;;21127:9;21121:4;21117:20;21113:1;21102:9;21098:17;21091:47;21155:131;21281:4;21155:131;:::i;:::-;21147:139;;21045:248;;;:::o;21299:419::-;;21503:2;21492:9;21488:18;21480:26;;21552:9;21546:4;21542:20;21538:1;21527:9;21523:17;21516:47;21580:131;21706:4;21580:131;:::i;:::-;21572:139;;21470:248;;;:::o;21724:419::-;;21928:2;21917:9;21913:18;21905:26;;21977:9;21971:4;21967:20;21963:1;21952:9;21948:17;21941:47;22005:131;22131:4;22005:131;:::i;:::-;21997:139;;21895:248;;;:::o;22149:419::-;;22353:2;22342:9;22338:18;22330:26;;22402:9;22396:4;22392:20;22388:1;22377:9;22373:17;22366:47;22430:131;22556:4;22430:131;:::i;:::-;22422:139;;22320:248;;;:::o;22574:419::-;;22778:2;22767:9;22763:18;22755:26;;22827:9;22821:4;22817:20;22813:1;22802:9;22798:17;22791:47;22855:131;22981:4;22855:131;:::i;:::-;22847:139;;22745:248;;;:::o;22999:419::-;;23203:2;23192:9;23188:18;23180:26;;23252:9;23246:4;23242:20;23238:1;23227:9;23223:17;23216:47;23280:131;23406:4;23280:131;:::i;:::-;23272:139;;23170:248;;;:::o;23424:419::-;;23628:2;23617:9;23613:18;23605:26;;23677:9;23671:4;23667:20;23663:1;23652:9;23648:17;23641:47;23705:131;23831:4;23705:131;:::i;:::-;23697:139;;23595:248;;;:::o;23849:419::-;;24053:2;24042:9;24038:18;24030:26;;24102:9;24096:4;24092:20;24088:1;24077:9;24073:17;24066:47;24130:131;24256:4;24130:131;:::i;:::-;24122:139;;24020:248;;;:::o;24274:419::-;;24478:2;24467:9;24463:18;24455:26;;24527:9;24521:4;24517:20;24513:1;24502:9;24498:17;24491:47;24555:131;24681:4;24555:131;:::i;:::-;24547:139;;24445:248;;;:::o;24699:419::-;;24903:2;24892:9;24888:18;24880:26;;24952:9;24946:4;24942:20;24938:1;24927:9;24923:17;24916:47;24980:131;25106:4;24980:131;:::i;:::-;24972:139;;24870:248;;;:::o;25124:222::-;;25255:2;25244:9;25240:18;25232:26;;25268:71;25336:1;25325:9;25321:17;25312:6;25268:71;:::i;:::-;25222:124;;;;:::o;25352:214::-;;25479:2;25468:9;25464:18;25456:26;;25492:67;25556:1;25545:9;25541:17;25532:6;25492:67;:::i;:::-;25446:120;;;;:::o;25572:99::-;;25658:5;25652:12;25642:22;;25631:40;;;:::o;25677:169::-;;25795:6;25790:3;25783:19;25835:4;25830:3;25826:14;25811:29;;25773:73;;;;:::o;25852:148::-;;25991:3;25976:18;;25966:34;;;;:::o;26006:305::-;;26065:20;26083:1;26065:20;:::i;:::-;26060:25;;26099:20;26117:1;26099:20;:::i;:::-;26094:25;;26253:1;26185:66;26181:74;26178:1;26175:81;26172:2;;;26259:18;;:::i;:::-;26172:2;26303:1;26300;26296:9;26289:16;;26050:261;;;;:::o;26317:348::-;;26380:20;26398:1;26380:20;:::i;:::-;26375:25;;26414:20;26432:1;26414:20;:::i;:::-;26409:25;;26602:1;26534:66;26530:74;26527:1;26524:81;26519:1;26512:9;26505:17;26501:105;26498:2;;;26609:18;;:::i;:::-;26498:2;26657:1;26654;26650:9;26639:20;;26365:300;;;;:::o;26671:191::-;;26731:20;26749:1;26731:20;:::i;:::-;26726:25;;26765:20;26783:1;26765:20;:::i;:::-;26760:25;;26804:1;26801;26798:8;26795:2;;;26809:18;;:::i;:::-;26795:2;26854:1;26851;26847:9;26839:17;;26716:146;;;;:::o;26868:96::-;;26934:24;26952:5;26934:24;:::i;:::-;26923:35;;26913:51;;;:::o;26970:90::-;;27047:5;27040:13;27033:21;27022:32;;27012:48;;;:::o;27066:77::-;;27132:5;27121:16;;27111:32;;;:::o;27149:149::-;;27225:66;27218:5;27214:78;27203:89;;27193:105;;;:::o;27304:126::-;;27381:42;27374:5;27370:54;27359:65;;27349:81;;;:::o;27436:77::-;;27502:5;27491:16;;27481:32;;;:::o;27519:86::-;;27594:4;27587:5;27583:16;27572:27;;27562:43;;;:::o;27611:307::-;27679:1;27689:113;27703:6;27700:1;27697:13;27689:113;;;27788:1;27783:3;27779:11;27773:18;27769:1;27764:3;27760:11;27753:39;27725:2;27722:1;27718:10;27713:15;;27689:113;;;27820:6;27817:1;27814:13;27811:2;;;27900:1;27891:6;27886:3;27882:16;27875:27;27811:2;27660:258;;;;:::o;27924:171::-;;27986:24;28004:5;27986:24;:::i;:::-;27977:33;;28032:4;28025:5;28022:15;28019:2;;;28040:18;;:::i;:::-;28019:2;28087:1;28080:5;28076:13;28069:20;;27967:128;;;:::o;28101:320::-;;28182:1;28176:4;28172:12;28162:22;;28229:1;28223:4;28219:12;28250:18;28240:2;;28306:4;28298:6;28294:17;28284:27;;28240:2;28368;28360:6;28357:14;28337:18;28334:38;28331:2;;;28387:18;;:::i;:::-;28331:2;28152:269;;;;:::o;28427:180::-;28475:77;28472:1;28465:88;28572:4;28569:1;28562:15;28596:4;28593:1;28586:15;28613:180;28661:77;28658:1;28651:88;28758:4;28755:1;28748:15;28782:4;28779:1;28772:15;28799:102;;28891:2;28887:7;28882:2;28875:5;28871:14;28867:28;28857:38;;28847:54;;;:::o;28907:182::-;29047:34;29043:1;29035:6;29031:14;29024:58;29013:76;:::o;29095:222::-;29235:34;29231:1;29223:6;29219:14;29212:58;29304:5;29299:2;29291:6;29287:15;29280:30;29201:116;:::o;29323:170::-;29463:22;29459:1;29451:6;29447:14;29440:46;29429:64;:::o;29499:221::-;29639:34;29635:1;29627:6;29623:14;29616:58;29708:4;29703:2;29695:6;29691:15;29684:29;29605:115;:::o;29726:228::-;29866:34;29862:1;29854:6;29850:14;29843:58;29935:11;29930:2;29922:6;29918:15;29911:36;29832:122;:::o;29960:179::-;30100:31;30096:1;30088:6;30084:14;30077:55;30066:73;:::o;30145:225::-;30285:34;30281:1;30273:6;30269:14;30262:58;30354:8;30349:2;30341:6;30337:15;30330:33;30251:119;:::o;30376:221::-;30516:34;30512:1;30504:6;30500:14;30493:58;30585:4;30580:2;30572:6;30568:15;30561:29;30482:115;:::o;30603:225::-;30743:34;30739:1;30731:6;30727:14;30720:58;30812:8;30807:2;30799:6;30795:15;30788:33;30709:119;:::o;30834:166::-;30974:18;30970:1;30962:6;30958:14;30951:42;30940:60;:::o;31006:227::-;31146:34;31142:1;31134:6;31130:14;31123:58;31215:10;31210:2;31202:6;31198:15;31191:35;31112:121;:::o;31239:182::-;31379:34;31375:1;31367:6;31363:14;31356:58;31345:76;:::o;31427:220::-;31567:34;31563:1;31555:6;31551:14;31544:58;31636:3;31631:2;31623:6;31619:15;31612:28;31533:114;:::o;31653:220::-;31793:34;31789:1;31781:6;31777:14;31770:58;31862:3;31857:2;31849:6;31845:15;31838:28;31759:114;:::o;31879:235::-;32019:34;32015:1;32007:6;32003:14;31996:58;32088:18;32083:2;32075:6;32071:15;32064:43;31985:129;:::o;32120:224::-;32260:34;32256:1;32248:6;32244:14;32237:58;32329:7;32324:2;32316:6;32312:15;32305:32;32226:118;:::o;32350:179::-;32490:31;32486:1;32478:6;32474:14;32467:55;32456:73;:::o;32535:223::-;32675:34;32671:1;32663:6;32659:14;32652:58;32744:6;32739:2;32731:6;32727:15;32720:31;32641:117;:::o;32764:173::-;32904:25;32900:1;32892:6;32888:14;32881:49;32870:67;:::o;32943:224::-;33083:34;33079:1;33071:6;33067:14;33060:58;33152:7;33147:2;33139:6;33135:15;33128:32;33049:118;:::o;33173:167::-;33313:19;33309:1;33301:6;33297:14;33290:43;33279:61;:::o;33346:234::-;33486:34;33482:1;33474:6;33470:14;33463:58;33555:17;33550:2;33542:6;33538:15;33531:42;33452:128;:::o;33586:181::-;33726:33;33722:1;33714:6;33710:14;33703:57;33692:75;:::o;33773:221::-;33913:34;33909:1;33901:6;33897:14;33890:58;33982:4;33977:2;33969:6;33965:15;33958:29;33879:115;:::o;34000:122::-;34073:24;34091:5;34073:24;:::i;:::-;34066:5;34063:35;34053:2;;34112:1;34109;34102:12;34053:2;34043:79;:::o;34128:122::-;34201:24;34219:5;34201:24;:::i;:::-;34194:5;34191:35;34181:2;;34240:1;34237;34230:12;34181:2;34171:79;:::o;34256:120::-;34328:23;34345:5;34328:23;:::i;:::-;34321:5;34318:34;34308:2;;34366:1;34363;34356:12;34308:2;34298:78;:::o;34382:122::-;34455:24;34473:5;34455:24;:::i;:::-;34448:5;34445:35;34435:2;;34494:1;34491;34484:12;34435:2;34425:79;:::o

Swarm Source

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

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