ETH Price: $2,651.10 (-0.61%)

Token

Passive Token (PASV)
 

Overview

Max Total Supply

1,000,000,000,000,000 PASV

Holders

128

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

Filtered by Token Holder
thisisbananas.eth
Balance
0 PASV

Value
$0.00
0xcb40ed766ada305f0d0ae96540570fac4e7ac03e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PasvToken

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/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/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

// File: @openzeppelin/contracts/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 Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/PasvStandalone.sol




//██████╗░░█████╗░░██████╗░██████╗██╗██╗░░░██╗███████╗  ████████╗░█████╗░██╗░░██╗███████╗███╗░░██╗
//██╔══██╗██╔══██╗██╔════╝██╔════╝██║██║░░░██║██╔════╝  ╚══██╔══╝██╔══██╗██║░██╔╝██╔════╝████╗░██║
//██████╔╝███████║╚█████╗░╚█████╗░██║╚██╗░██╔╝█████╗░░  ░░░██║░░░██║░░██║█████═╝░█████╗░░██╔██╗██║
//██╔═══╝░██╔══██║░╚═══██╗░╚═══██╗██║░╚████╔╝░██╔══╝░░  ░░░██║░░░██║░░██║██╔═██╗░██╔══╝░░██║╚████║
//██║░░░░░██║░░██║██████╔╝██████╔╝██║░░╚██╔╝░░███████╗  ░░░██║░░░╚█████╔╝██║░╚██╗███████╗██║░╚███║
//╚═╝░░░░░╚═╝░░╚═╝╚═════╝░╚═════╝░╚═╝░░░╚═╝░░░╚══════╝  ░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚══╝


pragma solidity 0.8.5;








abstract contract Tokenomics {
    using SafeMath for uint256;

    // --------------------- Token Settings ------------------- //

    string internal constant NAME = "Passive Token";
    string internal constant SYMBOL = "PASV";

    uint16 internal constant FEES_DIVISOR = 10**3;
    uint8 internal constant DECIMALS = 6;
    uint256 internal constant ZEROES = 10**DECIMALS;

    uint256 private constant MAX = ~uint256(0);
    uint256 internal constant TOTAL_SUPPLY = 1000000000 * 10**6 * ZEROES;
    uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));

    uint256 internal constant maxTransactionAmount = TOTAL_SUPPLY / 100; // 1% of the total supply

    uint256 internal constant numberOfTokensToSwapToLiquidity =
    TOTAL_SUPPLY / 1000; // 0.1% of the total supply

    // --------------------- Fees Settings ------------------- //

    address internal constant burnAddress =
    0x0000000000000000000000000000000299792458;
    address internal constant marketingAddress =
    0x229854977D36232a60b5Fa81171b6d717a5a12f3;
    address internal constant presaleContract =
    0x4af763daefCAB77Ec7Fb55c9C2209a619355377a;
    address internal constant reserveWallet =
    0x43f713202A844996fbC594623f5141B142aF9684;
    address internal constant pasvTimelock =
    0x7A6c357946569b26F663983c18d5Dedf78Afd5E1;
    address internal constant multisigWallet =
    0xcbc5A7f6A16F7fa4aFd3872960EB94626FF5cfC9;

    enum FeeType {
        Burn,
        Liquidity,
        Rfi,
        External,
        ExternalToETH
    }
    struct Fee {
        FeeType name;
        uint256 value;
        address recipient;
        uint256 total;
    }

    Fee[] internal fees;
    uint256 internal sumOfFees;

    constructor() {
        _addFees();
    }

    function _addFee(
        FeeType name,
        uint256 value,
        address recipient
    ) private {
        fees.push(Fee(name, value, recipient, 0));
        sumOfFees += value;
    }

    function _addFees() private {
        // Marketing Fee
        _addFee(FeeType.External, 10, marketingAddress);
        // Reflection Fee
        _addFee(FeeType.Rfi, 40, address(this));
        // Liquidity Fee
        _addFee(FeeType.Liquidity, 20, address(this));
    }

    function _getFeesCount() internal view returns (uint256) {
        return fees.length;
    }

    function _getFeeStruct(uint256 index) private view returns (Fee storage) {
        require(
            index >= 0 && index < fees.length,
            "FeesSettings._getFeeStruct: Fee index out of bounds"
        );
        return fees[index];
    }

    function _getFee(uint256 index)
    internal
    view
    returns (
        FeeType,
        uint256,
        address,
        uint256
    )
    {
        Fee memory fee = _getFeeStruct(index);
        return (fee.name, fee.value, fee.recipient, fee.total);
    }

    function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
        Fee storage fee = _getFeeStruct(index);
        fee.total = fee.total.add(amount);
    }
}

abstract contract BaseRfiToken is IERC20, IERC20Metadata, Ownable, AccessControl, Tokenomics {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) internal _reflectedBalances;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;

    mapping(address => bool) internal _isExcludedFromFee;
    mapping(address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;

    mapping(address => bool) internal _unlimitedSender;
    mapping(address => bool) internal _unlimitedRecipient;

    bytes32 public constant MULTISIG = keccak256("MULTISIG");

    constructor() {
        _reflectedBalances[owner()] = _reflectedSupply;

        // Exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        // Exclude the owner and this contract from rewards
        _exclude(owner());
        _exclude(address(this));

        // Set Owner to unlimited sender and recipient
        _unlimitedSender[owner()] = true;
        _unlimitedRecipient[owner()] = true;

        // Exclude marketing from fee and rewards
        _isExcludedFromFee[marketingAddress] = true;
        _exclude(address(marketingAddress));
        _unlimitedSender[marketingAddress] = true;
        _unlimitedRecipient[marketingAddress] = true;

        // Exclude presale from fee and rewards
        _isExcludedFromFee[presaleContract] = true;
        _exclude(address(presaleContract));
        _unlimitedSender[presaleContract] = true;
        _unlimitedRecipient[presaleContract] = true;

        // Exclude reserve wallet from fee and rewards
        _isExcludedFromFee[reserveWallet] = true;
        _exclude(address(reserveWallet));
        _unlimitedSender[reserveWallet] = true;
        _unlimitedRecipient[reserveWallet] = true;

        // Exclude pasvTimelock from fee and rewards
        _isExcludedFromFee[pasvTimelock] = true;
        _exclude(address(pasvTimelock));
        _unlimitedSender[pasvTimelock] = true;
        _unlimitedRecipient[pasvTimelock] = true;

        // Exclude Uniswap Router from fee and rewards
        _isExcludedFromFee[
        address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)
        ] = true; // Uniswap router
        _exclude(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D));

        // Setup multisig roles and ownership
        _setupRole(MULTISIG, multisigWallet);
        transferOwnership(multisigWallet);

        // Mint tokens
        emit Transfer(address(0), owner(), TOTAL_SUPPLY);
    }

    /** Functions required by IERC20Metadata **/
    function name() external pure override returns (string memory) {
        return NAME;
    }

    function symbol() external pure override returns (string memory) {
        return SYMBOL;
    }

    function decimals() external pure override returns (uint8) {
        return DECIMALS;
    }

    /** Functions required by IERC20 **/
    function totalSupply() external pure override returns (uint256) {
        return TOTAL_SUPPLY;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromRewards[account]) return _balances[account];
        return tokenFromReflection(_reflectedBalances[account]);
    }

    function transfer(address recipient, uint256 amount)
    external
    override
    returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
    external
    view
    override
    returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
    external
    override
    returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /** Functions required by IERC20 - END **/

    function burn(uint256 amount) external {
        address sender = _msgSender();
        require(
            sender != address(0),
            "BaseRfiToken: burn from the zero address"
        );
        require(
            sender != address(burnAddress),
            "BaseRfiToken: burn from the burn address"
        );

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "BaseRfiToken: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        _reflectedBalances[sender] = _reflectedBalances[sender].sub(
            reflectedAmount
        );
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens(sender, amount, reflectedAmount);
    }

    function _burnTokens(
        address sender,
        uint256 tBurn,
        uint256 rBurn
    ) internal {
        _reflectedBalances[burnAddress] = _reflectedBalances[burnAddress].add(
            rBurn
        );
        if (_isExcludedFromRewards[burnAddress])
            _balances[burnAddress] = _balances[burnAddress].add(tBurn);

        emit Transfer(sender, burnAddress, tBurn);
    }

    function increaseAllowance(address spender, uint256 addedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function isExcludedFromReward(address account)
    external
    view
    returns (bool)
    {
        return _isExcludedFromRewards[account];
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
    external
    view
    returns (uint256)
    {
        require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , ) = _getValues(tAmount, 0);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , ) = _getValues(
                tAmount,
                _getSumOfFees(_msgSender(), tAmount)
            );
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
    internal
    view
    returns (uint256)
    {
        require(
            rAmount <= _reflectedSupply,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external {
        require(hasRole(MULTISIG, msg.sender));
        require(!_isExcludedFromRewards[account], "Account is not included");
        _exclude(account);
    }

    function _exclude(address account) internal {
        if (_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(
                _reflectedBalances[account]
            );
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external {
        require(hasRole(MULTISIG, msg.sender));
        require(_isExcludedFromRewards[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _balances[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function setExcludedFromFee(address account, bool value)
    external
    {
        require(hasRole(MULTISIG, msg.sender));
        _isExcludedFromFee[account] = value;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function setUnlimitedSender(address account, bool value)
    external
    {
        require(hasRole(MULTISIG, msg.sender));
        _unlimitedSender[account] = value;
    }

    function setUnlimitedRecipient(address account, bool value)
    external
    {
        require(hasRole(MULTISIG, msg.sender));
        _unlimitedRecipient[account] = value;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        require(
            owner != address(0),
            "BaseRfiToken: approve from the zero address"
        );
        require(
            spender != address(0),
            "BaseRfiToken: approve to the zero address"
        );

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

    function _isUnlimitedSender(address account) internal view returns (bool) {
        return (_unlimitedSender[account] || account == owner());
    }

    function _isUnlimitedRecipient(address account)
    internal
    view
    returns (bool)
    {
        return (account == owner() ||
        account == burnAddress ||
        _unlimitedRecipient[account]);
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(
            sender != address(0),
            "BaseRfiToken: transfer from the zero address"
        );
        require(
            recipient != address(0),
            "BaseRfiToken: transfer to the zero address"
        );
        require(
            sender != address(burnAddress),
            "BaseRfiToken: transfer from the burn address"
        );
        require(amount > 0, "Transfer amount must be greater than zero");

        bool takeFee = true;

        /**
         * Check the amount is within the max allowed limit as long as a
         * unlimited sender/recepient is not involved in the transaction
         */
        if (
            amount > maxTransactionAmount &&
            !_isUnlimitedSender(sender) &&
            !_isUnlimitedRecipient(recipient)
        ) {
            revert("Transfer amount exceeds the maxTxAmount.");
        }

        if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) {
            takeFee = false;
        }

        _beforeTokenTransfer(sender, recipient, amount, takeFee);
        _transferTokens(sender, recipient, amount, takeFee);
    }

    function _transferTokens(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        uint256 sumOfFees = _getSumOfFees(sender, amount);
        if (!takeFee) {
            sumOfFees = 0;
        }

        (
        uint256 rAmount,
        uint256 rTransferAmount,
        uint256 tAmount,
        uint256 tTransferAmount,
        uint256 currentRate
        ) = _getValues(amount, sumOfFees);

        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(
            rTransferAmount
        );

        if (_isExcludedFromRewards[sender]) {
            _balances[sender] = _balances[sender].sub(tAmount);
        }
        if (_isExcludedFromRewards[recipient]) {
            _balances[recipient] = _balances[recipient].add(tTransferAmount);
        }

        _takeFees(amount, currentRate, sumOfFees);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeFees(
        uint256 amount,
        uint256 currentRate,
        uint256 sumOfFees
    ) private {
        if (sumOfFees > 0) {
            _takeTransactionFees(amount, currentRate);
        }
    }

    function _getValues(uint256 tAmount, uint256 feesSum)
    internal
    view
    returns (
        uint256,
        uint256,
        uint256,
        uint256,
        uint256
    )
    {
        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);

        return (
        rAmount,
        rTransferAmount,
        tAmount,
        tTransferAmount,
        currentRate
        );
    }

    function _getCurrentRate() internal view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() internal view returns (uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = TOTAL_SUPPLY;

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _reflectedBalances[_excluded[i]] > rSupply ||
                _balances[_excluded[i]] > tSupply
            ) return (_reflectedSupply, TOTAL_SUPPLY);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }
        if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY))
            return (_reflectedSupply, TOTAL_SUPPLY);
        return (rSupply, tSupply);
    }

    function _beforeTokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) internal virtual;

    function _getSumOfFees(address sender, uint256 amount)
    internal
    view
    virtual
    returns (uint256);

    function _isV2Pair(address account) internal view virtual returns (bool);

    function _redistribute(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        uint256 index
    ) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        _addFeeCollectedAmount(index, tFee);
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate)
    internal
    virtual;
}

abstract contract Liquifier is Ownable {
    using SafeMath for uint256;

    uint256 private withdrawableBalance;

    address internal constant multiSigWallet =
    0xcbc5A7f6A16F7fa4aFd3872960EB94626FF5cfC9;

    // Uniswap V2
    IUniswapV2Router02 internal _router =
    IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    address internal _pair;

    bool private inSwapAndLiquify;
    bool private swapAndLiquifyEnabled = true;

    uint256 private maxTransactionAmount;
    uint256 private numberOfTokensToSwapToLiquidity;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    event RouterSet(address indexed router);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event LiquidityAdded(
        uint256 tokenAmountSent,
        uint256 ethAmountSent,
        uint256 liquidity
    );

    receive() external payable {}

    function initializeLiquiditySwapper(uint256 maxTx, uint256 liquifyAmount)
    internal
    {
        _setPairAddress();
        maxTransactionAmount = maxTx;
        numberOfTokensToSwapToLiquidity = liquifyAmount;
    }

    function liquify(uint256 contractTokenBalance, address sender) internal {
        if (contractTokenBalance >= maxTransactionAmount)
            contractTokenBalance = maxTransactionAmount;

        bool isOverRequiredTokenBalance = (contractTokenBalance >=
        numberOfTokensToSwapToLiquidity);

        if (
            isOverRequiredTokenBalance &&
            swapAndLiquifyEnabled &&
            !inSwapAndLiquify &&
            (sender != _pair)
        ) {
            _swapAndLiquify(contractTokenBalance);
        }
    }

    function _setPairAddress() private {
        _pair = IUniswapV2Factory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );
    }

    function _swapAndLiquify(uint256 amount) private lockTheSwap {
        uint256 half = amount.div(2);
        uint256 otherHalf = amount.sub(half);

        uint256 initialBalance = address(this).balance;

        _swapTokensForEth(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function _swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _router.WETH();

        _approveDelegate(address(this), address(_router), tokenAmount);

        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approveDelegate(address(this), address(_router), tokenAmount);
        (
        uint256 tokenAmountSent,
        uint256 ethAmountSent,
        uint256 liquidity
        ) = _router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );

        withdrawableBalance = address(this).balance;
        emit LiquidityAdded(tokenAmountSent, ethAmountSent, liquidity);
    }

    function setPairAddress() external {
        require(msg.sender == multiSigWallet);
        _setPairAddress();
    }

    function setSwapAndLiquifyEnabled(bool enabled) external {
        require(msg.sender == multiSigWallet);
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled);
    }

    function withdrawLockedEth(address payable recipient) external {
        require(msg.sender == multiSigWallet);
        require(
            recipient != address(0),
            "Cannot withdraw the ETH balance to the zero address"
        );
        require(
            withdrawableBalance > 0,
            "The ETH balance must be greater than 0"
        );

        uint256 amount = withdrawableBalance;
        withdrawableBalance = 0;
        recipient.transfer(amount);
    }

    function _approveDelegate(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual;
}

//////////////////////////////////////////////////////////////////////////

abstract contract SafeToken is BaseRfiToken, Liquifier {
    using SafeMath for uint256;

    constructor() {
        initializeLiquiditySwapper(
            maxTransactionAmount,
            numberOfTokensToSwapToLiquidity
        );
        _exclude(_pair);
        _exclude(burnAddress);
    }

    function _isV2Pair(address account) internal view override returns (bool) {
        return (account == _pair);
    }

    function _getSumOfFees(address sender, uint256 amount)
    internal
    view
    override
    returns (uint256)
    {
        return sumOfFees;
    }

    function _beforeTokenTransfer(
        address sender,
        address,
        uint256,
        bool
    ) internal override {
        uint256 contractTokenBalance = balanceOf(address(this));
        liquify(contractTokenBalance, sender);
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate)
    internal
    override
    {
        uint256 feesCount = _getFeesCount();
        for (uint256 index = 0; index < feesCount; index++) {
            (FeeType name, uint256 value, address recipient, ) = _getFee(index);
            if (value == 0) continue;

            if (name == FeeType.Rfi) {
                _redistribute(amount, currentRate, value, index);
            } else if (name == FeeType.Burn) {
                _burn(amount, currentRate, value, index);
            } else if (name == FeeType.ExternalToETH) {
                _takeFeeToETH(amount, currentRate, value, recipient, index);
            } else {
                _takeFee(amount, currentRate, value, recipient, index);
            }
        }
    }

    function _burn(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        uint256 index
    ) private {
        uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rBurn = tBurn.mul(currentRate);

        _burnTokens(address(this), tBurn, rBurn);
        _addFeeCollectedAmount(index, tBurn);
    }

    function _takeFee(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        address recipient,
        uint256 index
    ) private {
        uint256 tAmount = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rAmount = tAmount.mul(currentRate);

        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(
            rAmount
        );
        if (_isExcludedFromRewards[recipient])
            _balances[recipient] = _balances[recipient].add(tAmount);

        _addFeeCollectedAmount(index, tAmount);
    }

    function _takeFeeToETH(
        uint256 amount,
        uint256 currentRate,
        uint256 fee,
        address recipient,
        uint256 index
    ) private {
        _takeFee(amount, currentRate, fee, recipient, index);
    }

    function _approveDelegate(
        address owner,
        address spender,
        uint256 amount
    ) internal override {
        _approve(owner, spender, amount);
    }
}

contract PasvToken is SafeToken {
    constructor() SafeToken() {}

    function getPasvAddress() external view returns (address) {
        return address(this);
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
    external
    view
    returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
    external
    returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
    external
    view
    returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
    external
    view
    returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
    external
    returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
    external
    returns (
        uint256 amountA,
        uint256 amountB,
        uint256 liquidity
    );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
    external
    payable
    returns (
        uint256 amountToken,
        uint256 amountETH,
        uint256 liquidity
    );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
    external
    view
    returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
    external
    view
    returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

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":false,"internalType":"uint256","name":"tokenAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountSent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"RouterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTISIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPasvAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setUnlimitedRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setUnlimitedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawLockedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126006600a62000fb9565b620000259066038d7ea4c6800062001078565b6200003390600019620010d2565b62000041906000196200109a565b600255600e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055600f805460ff60a81b1916600160a81b1790553480156200008a57600080fd5b50620000963362000646565b620000a062000696565b60025460056000620000ba6000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160086000620000f4620006d960201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526008909252902080549091166001179055620001516200014b6000546001600160a01b031690565b620006e8565b6200015c30620006e8565b6001600b6000620001756000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600190600c90620001b96000546001600160a01b031690565b6001600160a01b031681526020808201929092526040016000908120805493151560ff1994851617905573229854977d36232a60b5fa81171b6d717a5a12f39081905260089091527f023f8a861ac2bdad72ede7cf1d9ab45d0abfe269d4afb8a86a6468c8025270a680549092166001179091556200023890620006e8565b7fda835502108580b1df69e5bafce02e1e17855696085a1bf2200a83c840185aff8054600160ff1991821681179092557f13d7734a30ce3ca2670599d38ef5389eccce53d8c0d2591401430d23751f14b38054821683179055734af763daefcab77ec7fb55c9c2209a619355377a600081905260086020527f03320a43bebbf863d665ddeeb0fdcdf96f7bb23f4a9f994f938eec22f71f9b2380549092169092179055620002e690620006e8565b7f0269cf492853a7fdf9709d2cb93b7311c18b47980a58d9f1c687fa84ba4d2a888054600160ff1991821681179092557fcac09861b3211553ef015a436f4e9ec2149320cdd7b66bd34ddf7d36c57985f780548216831790557343f713202a844996fbc594623f5141b142af9684600081905260086020527ffccc43ecb6c274fd5c69f8d8a55f088d02076b72b2ceca6eb8afe4423293540c805490921690921790556200039490620006e8565b7faf61c396d38ec8cd3379c099b7be69615eaf14b7076b7f012a73a10976954b0f8054600160ff1991821681179092557fd713d99479ddf48352b4fd03b4e4b04382d7ab074abc5cc7376b6f007fb907c58054821683179055737a6c357946569b26f663983c18d5dedf78afd5e1600081905260086020527f99351aaed78cb27d9f1355473cd110a017f3ae17f4b2692d2680fc29427eee05805490921690921790556200044290620006e8565b7f9f3795f5af4067fc0169e670bd2938242bb1557866166c99add709772fd55cf18054600160ff1991821681179092557f61d40d4f954483e50260f9e00fc2f3164547beb4cd0c944c716ea67dea342de88054821683179055737a250d5630b4cf539739df2c5dacb4c659f2488d600081905260086020527f226e7c4e32ba0cd918c39b21526eb23f3f5958fcfd83d5cf69b9510bf01e2e1780549092169092179055620004f090620006e8565b620005307fb24447317fff7289af61dbac275a58b472b8c486d0363b1d4da4f7b7ddbffd6e73cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc9620007ab565b6200054f73cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc9620007bb565b600080546001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200058c6006600a62000fb9565b6200059f9066038d7ea4c6800062001078565b60405190815260200160405180910390a3620006196064620005c46006600a62000fb9565b620005d79066038d7ea4c6800062001078565b620005e3919062000f59565b6103e8620005f46006600a62000fb9565b620006079066038d7ea4c6800062001078565b62000613919062000f59565b62000890565b600f5462000630906001600160a01b0316620006e8565b62000640640299792458620006e8565b62001141565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620006b96003600a73229854977d36232a60b5fa81171b6d717a5a12f3620008a5565b620006c86002602830620008a5565b620006d76001601430620008a5565b565b6000546001600160a01b031690565b6001600160a01b0381166000908152600560205260409020541562000745576001600160a01b0381166000908152600560205260409020546200072b906200098c565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b620007b7828262000a24565b5050565b6000546001600160a01b031633146200081b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620008825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000812565b6200088d8162000646565b50565b6200089a62000aac565b601091909155601155565b60036040518060800160405280856004811115620008c757620008c762001115565b815260208082018690526001600160a01b0385166040830152600060609092018290528354600181810186559483529120825160049283029091018054939490939192849260ff19169190849081111562000926576200092662001115565b02179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301555050816004600082825462000982919062000f3e565b9091555050505050565b6000600254821115620009f55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000812565b600062000a0162000c75565b905062000a1d818462000ca860201b6200129c1790919060201c565b9392505050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620007b75760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b600e60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801562000afb57600080fd5b505afa15801562000b10573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b36919062000f13565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801562000b9457600080fd5b505afa15801562000ba9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bcf919062000f13565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801562000c1857600080fd5b505af115801562000c2d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c53919062000f13565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000808062000c8362000cbf565b9150915062000ca1818362000ca860201b6200129c1790919060201c565b9250505090565b600062000cb6828462000f59565b90505b92915050565b60025460009081908162000cd66006600a62000fb9565b62000ce99066038d7ea4c6800062001078565b905060005b600a5481101562000e7f578260056000600a848154811062000d145762000d146200112b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000d8357508160066000600a848154811062000d5c5762000d5c6200112b565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000db85760025462000d9a6006600a62000fb9565b62000dad9066038d7ea4c6800062001078565b945094505050509091565b62000e0f60056000600a848154811062000dd65762000dd66200112b565b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548591620012af62000f05821b17901c565b925062000e6860066000600a848154811062000e2f5762000e2f6200112b565b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548491620012af62000f05821b17901c565b91508062000e7681620010b4565b91505062000cee565b5080158062000ec8575062000ec562000e9b6006600a62000fb9565b62000eae9066038d7ea4c6800062001078565b60025462000ca860201b6200129c1790919060201c565b82105b1562000efc5760025462000edf6006600a62000fb9565b62000ef29066038d7ea4c6800062001078565b9350935050509091565b90939092509050565b600062000cb682846200109a565b60006020828403121562000f2657600080fd5b81516001600160a01b038116811462000a1d57600080fd5b6000821982111562000f545762000f54620010e9565b500190565b60008262000f6b5762000f6b620010ff565b500490565b600181815b8085111562000fb157816000190482111562000f955762000f95620010e9565b8085161562000fa357918102915b93841c939080029062000f75565b509250929050565b600062000cb660ff84168360008262000fd55750600162000cb9565b8162000fe45750600062000cb9565b816001811462000ffd5760028114620010085762001028565b600191505062000cb9565b60ff8411156200101c576200101c620010e9565b50506001821b62000cb9565b5060208310610133831016604e8410600b84101617156200104d575081810a62000cb9565b62001059838362000f70565b8060001904821115620010705762001070620010e9565b029392505050565b6000816000190483118215151615620010955762001095620010e9565b500290565b600082821015620010af57620010af620010e9565b500390565b6000600019821415620010cb57620010cb620010e9565b5060010190565b600082620010e457620010e4620010ff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b61306d80620011516000396000f3fe6080604052600436106102085760003560e01c80636612e66f1161011857806395d89b41116100a0578063b7671a0d1161006f578063b7671a0d1461063f578063c49b9a801461065f578063d547741f1461067f578063dd62ed3e1461069f578063f2fde38b146106e557600080fd5b806395d89b41146105bd578063a217fddf146105ea578063a457c2d7146105ff578063a9059cbb1461061f57600080fd5b806374c82338116100e757806374c82338146104ff5780638519ea701461052657806388f82020146105465780638da5cb5b1461057f57806391d148541461059d57600080fd5b80636612e66f1461048a5780636e593327146104aa57806370a08231146104ca578063715018a6146104ea57600080fd5b80632f2ff15d1161019b578063395093511161016a57806339509351146103d157806342966c68146103f15780634549b0391461041157806352390c02146104315780635342acb41461045157600080fd5b80632f2ff15d14610355578063313ce5671461037557806336568abe146103915780633685d419146103b157600080fd5b806323b872dd116101d757806323b872dd146102cb578063248a9ca3146102eb5780632530b1451461031c57806328101f501461033e57600080fd5b806301ffc9a71461021457806306fdde0314610249578063095ea7b31461028857806318160ddd146102a857600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061023461022f366004612bf7565b610705565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5060408051808201909152600d81526c2830b9b9b4bb32902a37b5b2b760991b60208201525b6040516102409190612ce7565b34801561029457600080fd5b506102346102a3366004612b72565b61073c565b3480156102b457600080fd5b506102bd610752565b604051908152602001610240565b3480156102d757600080fd5b506102346102e6366004612afc565b610776565b3480156102f757600080fd5b506102bd610306366004612bb9565b6000908152600160208190526040909120015490565b34801561032857600080fd5b506102bd600080516020612fcb83398151915281565b34801561034a57600080fd5b506103536107df565b005b34801561036157600080fd5b50610353610370366004612bd2565b610809565b34801561038157600080fd5b5060405160068152602001610240565b34801561039d57600080fd5b506103536103ac366004612bd2565b610835565b3480156103bd57600080fd5b506103536103cc366004612a89565b6108b8565b3480156103dd57600080fd5b506102346103ec366004612b72565b610a62565b3480156103fd57600080fd5b5061035361040c366004612bb9565b610a98565b34801561041d57600080fd5b506102bd61042c366004612c21565b610c8a565b34801561043d57600080fd5b5061035361044c366004612a89565b610d3a565b34801561045d57600080fd5b5061023461046c366004612a89565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561049657600080fd5b506103536104a5366004612b3d565b610dd0565b3480156104b657600080fd5b506103536104c5366004612b3d565b610e1c565b3480156104d657600080fd5b506102bd6104e5366004612a89565b610e68565b3480156104f657600080fd5b50610353610ec7565b34801561050b57600080fd5b50305b6040516001600160a01b039091168152602001610240565b34801561053257600080fd5b50610353610541366004612b3d565b610f2b565b34801561055257600080fd5b50610234610561366004612a89565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561058b57600080fd5b506000546001600160a01b031661050e565b3480156105a957600080fd5b506102346105b8366004612bd2565b610f77565b3480156105c957600080fd5b506040805180820190915260048152632820a9ab60e11b602082015261027b565b3480156105f657600080fd5b506102bd600081565b34801561060b57600080fd5b5061023461061a366004612b72565b610fa2565b34801561062b57600080fd5b5061023461063a366004612b72565b610ff1565b34801561064b57600080fd5b5061035361065a366004612a89565b610ffe565b34801561066b57600080fd5b5061035361067a366004612b9e565b611132565b34801561068b57600080fd5b5061035361069a366004612bd2565b6111ad565b3480156106ab57600080fd5b506102bd6106ba366004612ac3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156106f157600080fd5b50610353610700366004612a89565b6111d4565b60006001600160e01b03198216637965db0b60e01b148061073657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006107493384846112bb565b50600192915050565b60006107606006600a612e08565b6107719066038d7ea4c68000612eb3565b905090565b60006107838484846113ef565b6107d584336107d085604051806060016040528060288152602001612feb602891396001600160a01b038a16600090815260076020908152604080832033845290915290205491906116a7565b6112bb565b5060019392505050565b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc9146107ff57600080fd5b6108076116d3565b565b600082815260016020819052604090912001546108268133611890565b61083083836118f4565b505050565b6001600160a01b03811633146108aa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108b4828261195f565b5050565b6108d0600080516020612fcb83398151915233610f77565b6108d957600080fd5b6001600160a01b03811660009081526009602052604090205460ff166109415760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016108a1565b60005b600a548110156108b457816001600160a01b0316600a828154811061096b5761096b612f89565b6000918252602090912001546001600160a01b03161415610a5057600a805461099690600190612ed2565b815481106109a6576109a6612f89565b600091825260209091200154600a80546001600160a01b0390921691839081106109d2576109d2612f89565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a805480610a2a57610a2a612f73565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610a5a81612f2c565b915050610944565b3360008181526007602090815260408083206001600160a01b038716845290915281205490916107499185906107d090866119c6565b3380610af75760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016108a1565b6001600160a01b0381166402997924581415610b665760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b60648201526084016108a1565b6000610b7182610e68565b905082811015610bd55760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b60648201526084016108a1565b6000610be9610be26119d2565b85906119f5565b6001600160a01b038416600090815260056020526040902054909150610c0f90826112af565b6001600160a01b03841660009081526005602090815260408083209390935560099052205460ff1615610c79576001600160a01b038316600090815260066020526040902054610c5f90856112af565b6001600160a01b0384166000908152600660205260409020555b610c84838583611a01565b50505050565b6000610c986006600a612e08565b610ca99066038d7ea4c68000612eb3565b831115610cf85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a1565b81610d18576000610d0a846000611b42565b509294506107369350505050565b6000610d2c84610d2760045490565b611b42565b509194506107369350505050565b610d52600080516020612fcb83398151915233610f77565b610d5b57600080fd5b6001600160a01b03811660009081526009602052604090205460ff1615610dc45760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c7564656400000000000000000060448201526064016108a1565b610dcd81611bb8565b50565b610de8600080516020612fcb83398151915233610f77565b610df157600080fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610e34600080516020612fcb83398151915233610f77565b610e3d57600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526009602052604081205460ff1615610ea557506001600160a01b031660009081526006602052604090205490565b6001600160a01b03821660009081526005602052604090205461073690611c78565b6000546001600160a01b03163314610f215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a1565b6108076000611cf5565b610f43600080516020612fcb83398151915233610f77565b610f4c57600080fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061074933846107d085604051806060016040528060258152602001613013602591393360009081526007602090815260408083206001600160a01b038d16845290915290205491906116a7565b60006107493384846113ef565b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc91461101e57600080fd5b6001600160a01b0381166110905760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b60648201526084016108a1565b6000600d54116110f15760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016108a1565b600d805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f19350505050158015610830573d6000803e3d6000fd5b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc91461115257600080fd5b600f805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b600082815260016020819052604090912001546111ca8133611890565b610830838361195f565b6000546001600160a01b0316331461122e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a1565b6001600160a01b0381166112935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a1565b610dcd81611cf5565b60006112a88284612da3565b9392505050565b60006112a88284612ed2565b6001600160a01b0383166113255760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084016108a1565b6001600160a01b03821661138d5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b60648201526084016108a1565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661145a5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b60648201526084016108a1565b6001600160a01b0382166114c35760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b60648201526084016108a1565b6001600160a01b03831664029979245814156115365760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b60648201526084016108a1565b600081116115985760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108a1565b600160646115a86006600a612e08565b6115b99066038d7ea4c68000612eb3565b6115c39190612da3565b821180156115d757506115d584611d45565b155b80156115e957506115e783611d7c565b155b156116475760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016108a1565b6001600160a01b03841660009081526008602052604090205460ff168061168657506001600160a01b03831660009081526008602052604090205460ff165b1561168f575060005b61169b84848484611dcb565b610c8484848484611de9565b600081848411156116cb5760405162461bcd60e51b81526004016108a19190612ce7565b505050900390565b600e60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561172157600080fd5b505afa158015611735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117599190612aa6565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190612aa6565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e9190612aa6565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61189a8282610f77565b6108b4576118b2816001600160a01b03166014611fa3565b6118bd836020611fa3565b6040516020016118ce929190612c72565b60408051601f198184030181529082905262461bcd60e51b82526108a191600401612ce7565b6118fe8282610f77565b6108b45760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119698282610f77565b156108b45760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006112a88284612d8b565b60008060006119df61213f565b90925090506119ee828261129c565b9250505090565b60006112a88284612eb3565b64029979245860005260056020527f529fa41d429f9132928f80d268370bb7ae223d032f5f28769a1d48279bee2aed54611a3b90826119c6565b6402997924586000527f529fa41d429f9132928f80d268370bb7ae223d032f5f28769a1d48279bee2aed5560096020527f8ff31947d87c170966837867b2ae4d720b3e83e587bbddb82f5bc1cf5cfeaf8c5460ff1615611b005764029979245860005260066020527ff4e67a18c795c67da6958326863da394e7866b80eb5ad1ab8de76d2e1a32819854611acf90836119c6565b64029979245860005260066020527ff4e67a18c795c67da6958326863da394e7866b80eb5ad1ab8de76d2e1a328198555b604051828152640299792458906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016113e2565b60008080808080611b5f6103e8611b598a8a6119f5565b9061129c565b90506000611b6d89836112af565b90506000611b796119d2565b90506000611b878b836119f5565b90506000611b9585846119f5565b90506000611ba383836112af565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526005602052604090205415611c12576001600160a01b038116600090815260056020526040902054611bf890611c78565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000600254821115611cdf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a1565b6000611ce96119d2565b90506112a8838261129c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600b602052604081205460ff16806107365750506000546001600160a01b0391821691161490565b600080546001600160a01b0383811691161480611da657506001600160a01b038216640299792458145b806107365750506001600160a01b03166000908152600c602052604090205460ff1690565b6000611dd630610e68565b9050611de28186612336565b5050505050565b6000611df460045490565b905081611dff575060005b6000806000806000611e118887611b42565b6001600160a01b038f1660009081526005602052604090205494995092975090955093509150611e4190866112af565b6001600160a01b03808c1660009081526005602052604080822093909355908b1681522054611e7090856119c6565b6001600160a01b03808b16600090815260056020908152604080832094909455918d1681526009909152205460ff1615611ee1576001600160a01b038a16600090815260066020526040902054611ec790846112af565b6001600160a01b038b166000908152600660205260409020555b6001600160a01b03891660009081526009602052604090205460ff1615611f3f576001600160a01b038916600090815260066020526040902054611f2590836119c6565b6001600160a01b038a166000908152600660205260409020555b611f4a8882886123a0565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f8f91815260200190565b60405180910390a350505050505050505050565b60606000611fb2836002612eb3565b611fbd906002612d8b565b67ffffffffffffffff811115611fd557611fd5612f9f565b6040519080825280601f01601f191660200182016040528015611fff576020820181803683370190505b509050600360fc1b8160008151811061201a5761201a612f89565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061204957612049612f89565b60200101906001600160f81b031916908160001a905350600061206d846002612eb3565b612078906001612d8b565b90505b60018111156120f0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106120ac576120ac612f89565b1a60f81b8282815181106120c2576120c2612f89565b60200101906001600160f81b031916908160001a90535060049490941c936120e981612f15565b905061207b565b5083156112a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108a1565b6002546000908190816121546006600a612e08565b6121659066038d7ea4c68000612eb3565b905060005b600a548110156122c9578260056000600a848154811061218c5761218c612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121f757508160066000600a84815481106121d0576121d0612f89565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156122275760025461220b6006600a612e08565b61221c9066038d7ea4c68000612eb3565b945094505050509091565b61226d60056000600a848154811061224157612241612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906112af565b92506122b560066000600a848154811061228957612289612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906112af565b9150806122c181612f2c565b91505061216a565b508015806122fe57506122fb6122e16006600a612e08565b6122f29066038d7ea4c68000612eb3565b6002549061129c565b82105b1561232d576002546123126006600a612e08565b6123239066038d7ea4c68000612eb3565b9350935050509091565b90939092509050565b60105482106123455760105491505b601154821080159081906123625750600f54600160a81b900460ff165b80156123785750600f54600160a01b900460ff16155b80156123925750600f546001600160a01b03838116911614155b1561083057610830836123b0565b8015610830576108308383612457565b600f805460ff60a01b1916600160a01b17905560006123d082600261129c565b905060006123de83836112af565b9050476123ea83612530565b60006123f647836112af565b90506124028382612699565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600f805460ff60a01b19169055505050565b600061246260035490565b905060005b81811015610c8457600080600061247d846127d0565b5092509250925081600014156124955750505061251e565b60028360048111156124a9576124a9612f5d565b14156124c0576124bb8787848761286b565b61251a565b60008360048111156124d4576124d4612f5d565b14156124e6576124bb878784876128a8565b60048360048111156124fa576124fa612f5d565b141561250d576124bb87878484886128df565b61251a87878484886128e8565b5050505b8061252881612f2c565b915050612467565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256557612565612f89565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156125b957600080fd5b505afa1580156125cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f19190612aa6565b8160018151811061260457612604612f89565b6001600160a01b039283166020918202929092010152600e5461262a91309116846129ab565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612663908590600090869030904290600401612d1a565b600060405180830381600087803b15801561267d57600080fd5b505af1158015612691573d6000803e3d6000fd5b505050505050565b600e546126b19030906001600160a01b0316846129ab565b600e54600090819081906001600160a01b031663f305d71985308885806126e06000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561274357600080fd5b505af1158015612757573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061277c9190612c44565b47600d55604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b60008060008060006127e1866129b6565b60408051608081019091528154909190829060ff16600481111561280757612807612f5d565b600481111561281857612818612f5d565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b600061287d6103e8611b5987866119f5565b9050600061288b82866119f5565b60025490915061289b90826112af565b6002556126918383612a4d565b60006128ba6103e8611b5987866119f5565b905060006128c882866119f5565b90506128d5308383611a01565b6126918383612a4d565b611de285858585855b60006128fa6103e8611b5988876119f5565b9050600061290882876119f5565b6001600160a01b03851660009081526005602052604090205490915061292e90826119c6565b6001600160a01b03851660009081526005602090815260408083209390935560099052205460ff1615612998576001600160a01b03841660009081526006602052604090205461297e90836119c6565b6001600160a01b0385166000908152600660205260409020555b6129a28383612a4d565b50505050505050565b6108308383836112bb565b60006003548210612a255760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016108a1565b60038281548110612a3857612a38612f89565b90600052602060002090600402019050919050565b6000612a58836129b6565b6003810154909150612a6a90836119c6565b6003909101555050565b80358015158114612a8457600080fd5b919050565b600060208284031215612a9b57600080fd5b81356112a881612fb5565b600060208284031215612ab857600080fd5b81516112a881612fb5565b60008060408385031215612ad657600080fd5b8235612ae181612fb5565b91506020830135612af181612fb5565b809150509250929050565b600080600060608486031215612b1157600080fd5b8335612b1c81612fb5565b92506020840135612b2c81612fb5565b929592945050506040919091013590565b60008060408385031215612b5057600080fd5b8235612b5b81612fb5565b9150612b6960208401612a74565b90509250929050565b60008060408385031215612b8557600080fd5b8235612b9081612fb5565b946020939093013593505050565b600060208284031215612bb057600080fd5b6112a882612a74565b600060208284031215612bcb57600080fd5b5035919050565b60008060408385031215612be557600080fd5b823591506020830135612af181612fb5565b600060208284031215612c0957600080fd5b81356001600160e01b0319811681146112a857600080fd5b60008060408385031215612c3457600080fd5b82359150612b6960208401612a74565b600080600060608486031215612c5957600080fd5b8351925060208401519150604084015190509250925092565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612caa816017850160208801612ee9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612cdb816028840160208801612ee9565b01602801949350505050565b6020815260008251806020840152612d06816040850160208701612ee9565b601f01601f19169190910160400192915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d6a5784516001600160a01b031683529383019391830191600101612d45565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d9e57612d9e612f47565b500190565b600082612dc057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e00578160001904821115612de657612de6612f47565b80851615612df357918102915b93841c9390800290612dca565b509250929050565b60006112a860ff841683600082612e2157506001610736565b81612e2e57506000610736565b8160018114612e445760028114612e4e57612e6a565b6001915050610736565b60ff841115612e5f57612e5f612f47565b50506001821b610736565b5060208310610133831016604e8410600b8410161715612e8d575081810a610736565b612e978383612dc5565b8060001904821115612eab57612eab612f47565b029392505050565b6000816000190483118215151615612ecd57612ecd612f47565b500290565b600082821015612ee457612ee4612f47565b500390565b60005b83811015612f04578181015183820152602001612eec565b83811115610c845750506000910152565b600081612f2457612f24612f47565b506000190190565b6000600019821415612f4057612f40612f47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610dcd57600080fdfeb24447317fff7289af61dbac275a58b472b8c486d0363b1d4da4f7b7ddbffd6e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac3c9908a47dc906ee8e537c8b50f98d023308972acea5664b244a7e42ca75e064736f6c63430008050033

Deployed Bytecode

0x6080604052600436106102085760003560e01c80636612e66f1161011857806395d89b41116100a0578063b7671a0d1161006f578063b7671a0d1461063f578063c49b9a801461065f578063d547741f1461067f578063dd62ed3e1461069f578063f2fde38b146106e557600080fd5b806395d89b41146105bd578063a217fddf146105ea578063a457c2d7146105ff578063a9059cbb1461061f57600080fd5b806374c82338116100e757806374c82338146104ff5780638519ea701461052657806388f82020146105465780638da5cb5b1461057f57806391d148541461059d57600080fd5b80636612e66f1461048a5780636e593327146104aa57806370a08231146104ca578063715018a6146104ea57600080fd5b80632f2ff15d1161019b578063395093511161016a57806339509351146103d157806342966c68146103f15780634549b0391461041157806352390c02146104315780635342acb41461045157600080fd5b80632f2ff15d14610355578063313ce5671461037557806336568abe146103915780633685d419146103b157600080fd5b806323b872dd116101d757806323b872dd146102cb578063248a9ca3146102eb5780632530b1451461031c57806328101f501461033e57600080fd5b806301ffc9a71461021457806306fdde0314610249578063095ea7b31461028857806318160ddd146102a857600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061023461022f366004612bf7565b610705565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5060408051808201909152600d81526c2830b9b9b4bb32902a37b5b2b760991b60208201525b6040516102409190612ce7565b34801561029457600080fd5b506102346102a3366004612b72565b61073c565b3480156102b457600080fd5b506102bd610752565b604051908152602001610240565b3480156102d757600080fd5b506102346102e6366004612afc565b610776565b3480156102f757600080fd5b506102bd610306366004612bb9565b6000908152600160208190526040909120015490565b34801561032857600080fd5b506102bd600080516020612fcb83398151915281565b34801561034a57600080fd5b506103536107df565b005b34801561036157600080fd5b50610353610370366004612bd2565b610809565b34801561038157600080fd5b5060405160068152602001610240565b34801561039d57600080fd5b506103536103ac366004612bd2565b610835565b3480156103bd57600080fd5b506103536103cc366004612a89565b6108b8565b3480156103dd57600080fd5b506102346103ec366004612b72565b610a62565b3480156103fd57600080fd5b5061035361040c366004612bb9565b610a98565b34801561041d57600080fd5b506102bd61042c366004612c21565b610c8a565b34801561043d57600080fd5b5061035361044c366004612a89565b610d3a565b34801561045d57600080fd5b5061023461046c366004612a89565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561049657600080fd5b506103536104a5366004612b3d565b610dd0565b3480156104b657600080fd5b506103536104c5366004612b3d565b610e1c565b3480156104d657600080fd5b506102bd6104e5366004612a89565b610e68565b3480156104f657600080fd5b50610353610ec7565b34801561050b57600080fd5b50305b6040516001600160a01b039091168152602001610240565b34801561053257600080fd5b50610353610541366004612b3d565b610f2b565b34801561055257600080fd5b50610234610561366004612a89565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561058b57600080fd5b506000546001600160a01b031661050e565b3480156105a957600080fd5b506102346105b8366004612bd2565b610f77565b3480156105c957600080fd5b506040805180820190915260048152632820a9ab60e11b602082015261027b565b3480156105f657600080fd5b506102bd600081565b34801561060b57600080fd5b5061023461061a366004612b72565b610fa2565b34801561062b57600080fd5b5061023461063a366004612b72565b610ff1565b34801561064b57600080fd5b5061035361065a366004612a89565b610ffe565b34801561066b57600080fd5b5061035361067a366004612b9e565b611132565b34801561068b57600080fd5b5061035361069a366004612bd2565b6111ad565b3480156106ab57600080fd5b506102bd6106ba366004612ac3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156106f157600080fd5b50610353610700366004612a89565b6111d4565b60006001600160e01b03198216637965db0b60e01b148061073657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006107493384846112bb565b50600192915050565b60006107606006600a612e08565b6107719066038d7ea4c68000612eb3565b905090565b60006107838484846113ef565b6107d584336107d085604051806060016040528060288152602001612feb602891396001600160a01b038a16600090815260076020908152604080832033845290915290205491906116a7565b6112bb565b5060019392505050565b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc9146107ff57600080fd5b6108076116d3565b565b600082815260016020819052604090912001546108268133611890565b61083083836118f4565b505050565b6001600160a01b03811633146108aa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108b4828261195f565b5050565b6108d0600080516020612fcb83398151915233610f77565b6108d957600080fd5b6001600160a01b03811660009081526009602052604090205460ff166109415760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016108a1565b60005b600a548110156108b457816001600160a01b0316600a828154811061096b5761096b612f89565b6000918252602090912001546001600160a01b03161415610a5057600a805461099690600190612ed2565b815481106109a6576109a6612f89565b600091825260209091200154600a80546001600160a01b0390921691839081106109d2576109d2612f89565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a805480610a2a57610a2a612f73565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610a5a81612f2c565b915050610944565b3360008181526007602090815260408083206001600160a01b038716845290915281205490916107499185906107d090866119c6565b3380610af75760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016108a1565b6001600160a01b0381166402997924581415610b665760405162461bcd60e51b815260206004820152602860248201527f42617365526669546f6b656e3a206275726e2066726f6d20746865206275726e604482015267206164647265737360c01b60648201526084016108a1565b6000610b7182610e68565b905082811015610bd55760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a206275726e20616d6f756e7420657863656564604482015268732062616c616e636560b81b60648201526084016108a1565b6000610be9610be26119d2565b85906119f5565b6001600160a01b038416600090815260056020526040902054909150610c0f90826112af565b6001600160a01b03841660009081526005602090815260408083209390935560099052205460ff1615610c79576001600160a01b038316600090815260066020526040902054610c5f90856112af565b6001600160a01b0384166000908152600660205260409020555b610c84838583611a01565b50505050565b6000610c986006600a612e08565b610ca99066038d7ea4c68000612eb3565b831115610cf85760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a1565b81610d18576000610d0a846000611b42565b509294506107369350505050565b6000610d2c84610d2760045490565b611b42565b509194506107369350505050565b610d52600080516020612fcb83398151915233610f77565b610d5b57600080fd5b6001600160a01b03811660009081526009602052604090205460ff1615610dc45760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f7420696e636c7564656400000000000000000060448201526064016108a1565b610dcd81611bb8565b50565b610de8600080516020612fcb83398151915233610f77565b610df157600080fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610e34600080516020612fcb83398151915233610f77565b610e3d57600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526009602052604081205460ff1615610ea557506001600160a01b031660009081526006602052604090205490565b6001600160a01b03821660009081526005602052604090205461073690611c78565b6000546001600160a01b03163314610f215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a1565b6108076000611cf5565b610f43600080516020612fcb83398151915233610f77565b610f4c57600080fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061074933846107d085604051806060016040528060258152602001613013602591393360009081526007602090815260408083206001600160a01b038d16845290915290205491906116a7565b60006107493384846113ef565b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc91461101e57600080fd5b6001600160a01b0381166110905760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420776974686472617720746865204554482062616c616e636520604482015272746f20746865207a65726f206164647265737360681b60648201526084016108a1565b6000600d54116110f15760405162461bcd60e51b815260206004820152602660248201527f546865204554482062616c616e6365206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016108a1565b600d805460009182905560405190916001600160a01b0384169183156108fc0291849190818181858888f19350505050158015610830573d6000803e3d6000fd5b3373cbc5a7f6a16f7fa4afd3872960eb94626ff5cfc91461115257600080fd5b600f805460ff60a81b1916600160a81b8315158102919091179182905560405160ff9190920416151581527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599060200160405180910390a150565b600082815260016020819052604090912001546111ca8133611890565b610830838361195f565b6000546001600160a01b0316331461122e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a1565b6001600160a01b0381166112935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a1565b610dcd81611cf5565b60006112a88284612da3565b9392505050565b60006112a88284612ed2565b6001600160a01b0383166113255760405162461bcd60e51b815260206004820152602b60248201527f42617365526669546f6b656e3a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b60648201526084016108a1565b6001600160a01b03821661138d5760405162461bcd60e51b815260206004820152602960248201527f42617365526669546f6b656e3a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b60648201526084016108a1565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661145a5760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b60648201526084016108a1565b6001600160a01b0382166114c35760405162461bcd60e51b815260206004820152602a60248201527f42617365526669546f6b656e3a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b60648201526084016108a1565b6001600160a01b03831664029979245814156115365760405162461bcd60e51b815260206004820152602c60248201527f42617365526669546f6b656e3a207472616e736665722066726f6d207468652060448201526b6275726e206164647265737360a01b60648201526084016108a1565b600081116115985760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108a1565b600160646115a86006600a612e08565b6115b99066038d7ea4c68000612eb3565b6115c39190612da3565b821180156115d757506115d584611d45565b155b80156115e957506115e783611d7c565b155b156116475760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016108a1565b6001600160a01b03841660009081526008602052604090205460ff168061168657506001600160a01b03831660009081526008602052604090205460ff165b1561168f575060005b61169b84848484611dcb565b610c8484848484611de9565b600081848411156116cb5760405162461bcd60e51b81526004016108a19190612ce7565b505050900390565b600e60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561172157600080fd5b505afa158015611735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117599190612aa6565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee9190612aa6565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e9190612aa6565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61189a8282610f77565b6108b4576118b2816001600160a01b03166014611fa3565b6118bd836020611fa3565b6040516020016118ce929190612c72565b60408051601f198184030181529082905262461bcd60e51b82526108a191600401612ce7565b6118fe8282610f77565b6108b45760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6119698282610f77565b156108b45760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006112a88284612d8b565b60008060006119df61213f565b90925090506119ee828261129c565b9250505090565b60006112a88284612eb3565b64029979245860005260056020527f529fa41d429f9132928f80d268370bb7ae223d032f5f28769a1d48279bee2aed54611a3b90826119c6565b6402997924586000527f529fa41d429f9132928f80d268370bb7ae223d032f5f28769a1d48279bee2aed5560096020527f8ff31947d87c170966837867b2ae4d720b3e83e587bbddb82f5bc1cf5cfeaf8c5460ff1615611b005764029979245860005260066020527ff4e67a18c795c67da6958326863da394e7866b80eb5ad1ab8de76d2e1a32819854611acf90836119c6565b64029979245860005260066020527ff4e67a18c795c67da6958326863da394e7866b80eb5ad1ab8de76d2e1a328198555b604051828152640299792458906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016113e2565b60008080808080611b5f6103e8611b598a8a6119f5565b9061129c565b90506000611b6d89836112af565b90506000611b796119d2565b90506000611b878b836119f5565b90506000611b9585846119f5565b90506000611ba383836112af565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526005602052604090205415611c12576001600160a01b038116600090815260056020526040902054611bf890611c78565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6000600254821115611cdf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a1565b6000611ce96119d2565b90506112a8838261129c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600b602052604081205460ff16806107365750506000546001600160a01b0391821691161490565b600080546001600160a01b0383811691161480611da657506001600160a01b038216640299792458145b806107365750506001600160a01b03166000908152600c602052604090205460ff1690565b6000611dd630610e68565b9050611de28186612336565b5050505050565b6000611df460045490565b905081611dff575060005b6000806000806000611e118887611b42565b6001600160a01b038f1660009081526005602052604090205494995092975090955093509150611e4190866112af565b6001600160a01b03808c1660009081526005602052604080822093909355908b1681522054611e7090856119c6565b6001600160a01b03808b16600090815260056020908152604080832094909455918d1681526009909152205460ff1615611ee1576001600160a01b038a16600090815260066020526040902054611ec790846112af565b6001600160a01b038b166000908152600660205260409020555b6001600160a01b03891660009081526009602052604090205460ff1615611f3f576001600160a01b038916600090815260066020526040902054611f2590836119c6565b6001600160a01b038a166000908152600660205260409020555b611f4a8882886123a0565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f8f91815260200190565b60405180910390a350505050505050505050565b60606000611fb2836002612eb3565b611fbd906002612d8b565b67ffffffffffffffff811115611fd557611fd5612f9f565b6040519080825280601f01601f191660200182016040528015611fff576020820181803683370190505b509050600360fc1b8160008151811061201a5761201a612f89565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061204957612049612f89565b60200101906001600160f81b031916908160001a905350600061206d846002612eb3565b612078906001612d8b565b90505b60018111156120f0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106120ac576120ac612f89565b1a60f81b8282815181106120c2576120c2612f89565b60200101906001600160f81b031916908160001a90535060049490941c936120e981612f15565b905061207b565b5083156112a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108a1565b6002546000908190816121546006600a612e08565b6121659066038d7ea4c68000612eb3565b905060005b600a548110156122c9578260056000600a848154811061218c5761218c612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121f757508160066000600a84815481106121d0576121d0612f89565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156122275760025461220b6006600a612e08565b61221c9066038d7ea4c68000612eb3565b945094505050509091565b61226d60056000600a848154811061224157612241612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906112af565b92506122b560066000600a848154811061228957612289612f89565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906112af565b9150806122c181612f2c565b91505061216a565b508015806122fe57506122fb6122e16006600a612e08565b6122f29066038d7ea4c68000612eb3565b6002549061129c565b82105b1561232d576002546123126006600a612e08565b6123239066038d7ea4c68000612eb3565b9350935050509091565b90939092509050565b60105482106123455760105491505b601154821080159081906123625750600f54600160a81b900460ff165b80156123785750600f54600160a01b900460ff16155b80156123925750600f546001600160a01b03838116911614155b1561083057610830836123b0565b8015610830576108308383612457565b600f805460ff60a01b1916600160a01b17905560006123d082600261129c565b905060006123de83836112af565b9050476123ea83612530565b60006123f647836112af565b90506124028382612699565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600f805460ff60a01b19169055505050565b600061246260035490565b905060005b81811015610c8457600080600061247d846127d0565b5092509250925081600014156124955750505061251e565b60028360048111156124a9576124a9612f5d565b14156124c0576124bb8787848761286b565b61251a565b60008360048111156124d4576124d4612f5d565b14156124e6576124bb878784876128a8565b60048360048111156124fa576124fa612f5d565b141561250d576124bb87878484886128df565b61251a87878484886128e8565b5050505b8061252881612f2c565b915050612467565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256557612565612f89565b6001600160a01b03928316602091820292909201810191909152600e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156125b957600080fd5b505afa1580156125cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f19190612aa6565b8160018151811061260457612604612f89565b6001600160a01b039283166020918202929092010152600e5461262a91309116846129ab565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612663908590600090869030904290600401612d1a565b600060405180830381600087803b15801561267d57600080fd5b505af1158015612691573d6000803e3d6000fd5b505050505050565b600e546126b19030906001600160a01b0316846129ab565b600e54600090819081906001600160a01b031663f305d71985308885806126e06000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561274357600080fd5b505af1158015612757573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061277c9190612c44565b47600d55604080518481526020810184905290810182905292955090935091507fd7f28048575eead8851d024ead087913957dfb4fd1a02b4d1573f5352a5a2be39060600160405180910390a15050505050565b60008060008060006127e1866129b6565b60408051608081019091528154909190829060ff16600481111561280757612807612f5d565b600481111561281857612818612f5d565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b600061287d6103e8611b5987866119f5565b9050600061288b82866119f5565b60025490915061289b90826112af565b6002556126918383612a4d565b60006128ba6103e8611b5987866119f5565b905060006128c882866119f5565b90506128d5308383611a01565b6126918383612a4d565b611de285858585855b60006128fa6103e8611b5988876119f5565b9050600061290882876119f5565b6001600160a01b03851660009081526005602052604090205490915061292e90826119c6565b6001600160a01b03851660009081526005602090815260408083209390935560099052205460ff1615612998576001600160a01b03841660009081526006602052604090205461297e90836119c6565b6001600160a01b0385166000908152600660205260409020555b6129a28383612a4d565b50505050505050565b6108308383836112bb565b60006003548210612a255760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016108a1565b60038281548110612a3857612a38612f89565b90600052602060002090600402019050919050565b6000612a58836129b6565b6003810154909150612a6a90836119c6565b6003909101555050565b80358015158114612a8457600080fd5b919050565b600060208284031215612a9b57600080fd5b81356112a881612fb5565b600060208284031215612ab857600080fd5b81516112a881612fb5565b60008060408385031215612ad657600080fd5b8235612ae181612fb5565b91506020830135612af181612fb5565b809150509250929050565b600080600060608486031215612b1157600080fd5b8335612b1c81612fb5565b92506020840135612b2c81612fb5565b929592945050506040919091013590565b60008060408385031215612b5057600080fd5b8235612b5b81612fb5565b9150612b6960208401612a74565b90509250929050565b60008060408385031215612b8557600080fd5b8235612b9081612fb5565b946020939093013593505050565b600060208284031215612bb057600080fd5b6112a882612a74565b600060208284031215612bcb57600080fd5b5035919050565b60008060408385031215612be557600080fd5b823591506020830135612af181612fb5565b600060208284031215612c0957600080fd5b81356001600160e01b0319811681146112a857600080fd5b60008060408385031215612c3457600080fd5b82359150612b6960208401612a74565b600080600060608486031215612c5957600080fd5b8351925060208401519150604084015190509250925092565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612caa816017850160208801612ee9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612cdb816028840160208801612ee9565b01602801949350505050565b6020815260008251806020840152612d06816040850160208701612ee9565b601f01601f19169190910160400192915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d6a5784516001600160a01b031683529383019391830191600101612d45565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115612d9e57612d9e612f47565b500190565b600082612dc057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612e00578160001904821115612de657612de6612f47565b80851615612df357918102915b93841c9390800290612dca565b509250929050565b60006112a860ff841683600082612e2157506001610736565b81612e2e57506000610736565b8160018114612e445760028114612e4e57612e6a565b6001915050610736565b60ff841115612e5f57612e5f612f47565b50506001821b610736565b5060208310610133831016604e8410600b8410161715612e8d575081810a610736565b612e978383612dc5565b8060001904821115612eab57612eab612f47565b029392505050565b6000816000190483118215151615612ecd57612ecd612f47565b500290565b600082821015612ee457612ee4612f47565b500390565b60005b83811015612f04578181015183820152602001612eec565b83811115610c845750506000910152565b600081612f2457612f24612f47565b506000190190565b6000600019821415612f4057612f40612f47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610dcd57600080fdfeb24447317fff7289af61dbac275a58b472b8c486d0363b1d4da4f7b7ddbffd6e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac3c9908a47dc906ee8e537c8b50f98d023308972acea5664b244a7e42ca75e064736f6c63430008050033

Deployed Bytecode Sourcemap

75577:175:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10247:204;;;;;;;;;;-1:-1:-1;10247:204:0;;;;;:::i;:::-;;:::i;:::-;;;6256:14:1;;6249:22;6231:41;;6219:2;6204:18;10247:204:0;;;;;;;;55469:93;;;;;;;;;;-1:-1:-1;55550:4:0;;;;;;;;;;;;-1:-1:-1;;;55550:4:0;;;;55469:93;;;;;;;:::i;56533:183::-;;;;;;;;;;-1:-1:-1;56533:183:0;;;;;:::i;:::-;;:::i;55818:102::-;;;;;;;;;;;;;:::i;:::-;;;6429:25:1;;;6417:2;6402:18;55818:102:0;6384:76:1;56724:448:0;;;;;;;;;;-1:-1:-1;56724:448:0;;;;;:::i;:::-;;:::i;11658:123::-;;;;;;;;;;-1:-1:-1;11658:123:0;;;;;:::i;:::-;11724:7;11751:12;;;:6;:12;;;;;;;;:22;;;11658:123;53348:56;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;53348:56:0;;71463:119;;;;;;;;;;;;;:::i;:::-;;12043:147;;;;;;;;;;-1:-1:-1;12043:147:0;;;;;:::i;:::-;;:::i;55675:93::-;;;;;;;;;;-1:-1:-1;55675:93:0;;49903:1;16859:36:1;;16847:2;16832:18;55675:93:0;16814:87:1;13091:218:0;;;;;;;;;;-1:-1:-1;13091:218:0;;;;;:::i;:::-;;:::i;60768:536::-;;;;;;;;;;-1:-1:-1;60768:536:0;;;;;:::i;:::-;;:::i;58468:288::-;;;;;;;;;;-1:-1:-1;58468:288:0;;;;;:::i;:::-;;:::i;57230:816::-;;;;;;;;;;-1:-1:-1;57230:816:0;;;;;:::i;:::-;;:::i;59321:560::-;;;;;;;;;;-1:-1:-1;59321:560:0;;;;;:::i;:::-;;:::i;60225:217::-;;;;;;;;;;-1:-1:-1;60225:217:0;;;;;:::i;:::-;;:::i;61499:124::-;;;;;;;;;;-1:-1:-1;61499:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;61588:27:0;61564:4;61588:27;;;:18;:27;;;;;;;;;61499:124;61312:179;;;;;;;;;;-1:-1:-1;61312:179:0;;;;;:::i;:::-;;:::i;61816:183::-;;;;;;;;;;-1:-1:-1;61816:183:0;;;;;:::i;:::-;;:::i;55928:222::-;;;;;;;;;;-1:-1:-1;55928:222:0;;;;;:::i;:::-;;:::i;31572:94::-;;;;;;;;;;;;;:::i;75652:97::-;;;;;;;;;;-1:-1:-1;75736:4:0;75652:97;;;-1:-1:-1;;;;;5126:32:1;;;5108:51;;5096:2;5081:18;75652:97:0;5063:102:1;61631:177:0;;;;;;;;;;-1:-1:-1;61631:177:0;;;;;:::i;:::-;;:::i;59160:153::-;;;;;;;;;;-1:-1:-1;59160:153:0;;;;;:::i;:::-;-1:-1:-1;;;;;59274:31:0;59245:4;59274:31;;;:22;:31;;;;;;;;;59160:153;30921:87;;;;;;;;;;-1:-1:-1;30967:7:0;30994:6;-1:-1:-1;;;;;30994:6:0;30921:87;;10543:139;;;;;;;;;;-1:-1:-1;10543:139:0;;;;;:::i;:::-;;:::i;55570:97::-;;;;;;;;;;-1:-1:-1;55653:6:0;;;;;;;;;;;;-1:-1:-1;;;55653:6:0;;;;55570:97;;9634:49;;;;;;;;;;-1:-1:-1;9634:49:0;9679:4;9634:49;;58764:388;;;;;;;;;;-1:-1:-1;58764:388:0;;;;;:::i;:::-;;:::i;56158:189::-;;;;;;;;;;-1:-1:-1;56158:189:0;;;;;:::i;:::-;;:::i;71820:496::-;;;;;;;;;;-1:-1:-1;71820:496:0;;;;;:::i;:::-;;:::i;71590:222::-;;;;;;;;;;-1:-1:-1;71590:222:0;;;;;:::i;:::-;;:::i;12435:149::-;;;;;;;;;;-1:-1:-1;12435:149:0;;;;;:::i;:::-;;:::i;56355:170::-;;;;;;;;;;-1:-1:-1;56355:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;56490:18:0;;;56458:7;56490:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;56355:170;31821:192;;;;;;;;;;-1:-1:-1;31821:192:0;;;;;:::i;:::-;;:::i;10247:204::-;10332:4;-1:-1:-1;;;;;;10356:47:0;;-1:-1:-1;;;10356:47:0;;:87;;-1:-1:-1;;;;;;;;;;2628:40:0;;;10407:36;10349:94;10247:204;-1:-1:-1;;10247:204:0:o;56533:183::-;56625:4;56647:39;738:10;56670:7;56679:6;56647:8;:39::i;:::-;-1:-1:-1;56704:4:0;56533:183;;;;:::o;55818:102::-;55873:7;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;55893:19;;55818:102;:::o;56724:448::-;56858:4;56875:36;56885:6;56893:9;56904:6;56875:9;:36::i;:::-;56922:220;56945:6;738:10;56993:138;57049:6;56993:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56993:19:0;;;;;;:11;:19;;;;;;;;738:10;56993:33;;;;;;;;;;:37;:138::i;:::-;56922:8;:220::i;:::-;-1:-1:-1;57160:4:0;56724:448;;;;;:::o;71463:119::-;71517:10;68057:42;71517:28;71509:37;;;;;;71557:17;:15;:17::i;:::-;71463:119::o;12043:147::-;11724:7;11751:12;;;:6;:12;;;;;;;;:22;;10125:30;10136:4;738:10;10125;:30::i;:::-;12157:25:::1;12168:4;12174:7;12157:10;:25::i;:::-;12043:147:::0;;;:::o;13091:218::-;-1:-1:-1;;;;;13187:23:0;;738:10;13187:23;13179:83;;;;-1:-1:-1;;;13179:83:0;;15012:2:1;13179:83:0;;;14994:21:1;15051:2;15031:18;;;15024:30;15090:34;15070:18;;;15063:62;-1:-1:-1;;;15141:18:1;;;15134:45;15196:19;;13179:83:0;;;;;;;;;13275:26;13287:4;13293:7;13275:11;:26::i;:::-;13091:218;;:::o;60768:536::-;60838:29;-1:-1:-1;;;;;;;;;;;60856:10:0;60838:7;:29::i;:::-;60830:38;;;;;;-1:-1:-1;;;;;60887:31:0;;;;;;:22;:31;;;;;;;;60879:67;;;;-1:-1:-1;;;60879:67:0;;9407:2:1;60879:67:0;;;9389:21:1;9446:2;9426:18;;;9419:30;9485:25;9465:18;;;9458:53;9528:18;;60879:67:0;9379:173:1;60879:67:0;60962:9;60957:340;60981:9;:16;60977:20;;60957:340;;;61039:7;-1:-1:-1;;;;;61023:23:0;:9;61033:1;61023:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;61023:12:0;:23;61019:267;;;61082:9;61092:16;;:20;;61111:1;;61092:20;:::i;:::-;61082:31;;;;;;;;:::i;:::-;;;;;;;;;;;61067:9;:12;;-1:-1:-1;;;;;61082:31:0;;;;61077:1;;61067:12;;;;;;:::i;:::-;;;;;;;;;;;;;:46;;-1:-1:-1;;;;;;61067:46:0;-1:-1:-1;;;;;61067:46:0;;;;;;61132:18;;;;;:9;:18;;;;;;:22;;;61173;:31;;;;:39;;-1:-1:-1;;61173:39:0;;;61231:9;:15;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;61231:15:0;;;;;-1:-1:-1;;;;;;61231:15:0;;;;;;13091:218;;:::o;61019:267::-;60999:3;;;;:::i;:::-;;;;60957:340;;58468:288;738:10;58571:4;58665:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;58665:34:0;;;;;;;;;;58571:4;;58593:133;;58643:7;;58665:50;;58704:10;58665:38;:50::i;57230:816::-;738:10;;57320:110;;;;-1:-1:-1;;;57320:110:0;;14603:2:1;57320:110:0;;;14585:21:1;14642:2;14622:18;;;14615:30;14681:34;14661:18;;;14654:62;-1:-1:-1;;;14732:18:1;;;14725:38;14780:19;;57320:110:0;14575:230:1;57320:110:0;-1:-1:-1;;;;;57463:30:0;;50501:42;57463:30;;57441:120;;;;-1:-1:-1;;;57441:120:0;;8998:2:1;57441:120:0;;;8980:21:1;9037:2;9017:18;;;9010:30;9076:34;9056:18;;;9049:62;-1:-1:-1;;;9127:18:1;;;9120:38;9175:19;;57441:120:0;8970:230:1;57441:120:0;57574:15;57592:17;57602:6;57592:9;:17::i;:::-;57574:35;;57639:6;57628:7;:17;;57620:71;;;;-1:-1:-1;;;57620:71:0;;11354:2:1;57620:71:0;;;11336:21:1;11393:2;11373:18;;;11366:30;11432:34;11412:18;;;11405:62;-1:-1:-1;;;11483:18:1;;;11476:39;11532:19;;57620:71:0;11326:231:1;57620:71:0;57704:23;57730:29;57741:17;:15;:17::i;:::-;57730:6;;:10;:29::i;:::-;-1:-1:-1;;;;;57801:26:0;;;;;;:18;:26;;;;;;57704:55;;-1:-1:-1;57801:71:0;;57704:55;57801:30;:71::i;:::-;-1:-1:-1;;;;;57772:26:0;;;;;;:18;:26;;;;;;;;:100;;;;57887:22;:30;;;;;;57883:98;;;-1:-1:-1;;;;;57952:17:0;;;;;;:9;:17;;;;;;:29;;57974:6;57952:21;:29::i;:::-;-1:-1:-1;;;;;57932:17:0;;;;;;:9;:17;;;;;:49;57883:98;57994:44;58006:6;58014;58022:15;57994:11;:44::i;:::-;57269:777;;;57230:816;:::o;59321:560::-;59429:7;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;59462:7;:23;;59454:67;;;;-1:-1:-1;;;59454:67:0;;10585:2:1;59454:67:0;;;10567:21:1;10624:2;10604:18;;;10597:30;10663:33;10643:18;;;10636:61;10714:18;;59454:67:0;10557:181:1;59454:67:0;59537:17;59532:342;;59572:15;59599:22;59610:7;59619:1;59599:10;:22::i;:::-;-1:-1:-1;59571:50:0;;-1:-1:-1;59636:14:0;;-1:-1:-1;;;;59636:14:0;59532:342;59686:23;59719:106;59748:7;59774:36;73113:9;;;72974:156;59774:36;59719:10;:106::i;:::-;-1:-1:-1;59683:142:0;;-1:-1:-1;59840:22:0;;-1:-1:-1;;;;59840:22:0;60225:217;60297:29;-1:-1:-1;;;;;;;;;;;60315:10:0;60297:7;:29::i;:::-;60289:38;;;;;;-1:-1:-1;;;;;60347:31:0;;;;;;:22;:31;;;;;;;;60346:32;60338:68;;;;-1:-1:-1;;;60338:68:0;;8646:2:1;60338:68:0;;;8628:21:1;8685:2;8665:18;;;8658:30;8724:25;8704:18;;;8697:53;8767:18;;60338:68:0;8618:173:1;60338:68:0;60417:17;60426:7;60417:8;:17::i;:::-;60225:217;:::o;61312:179::-;61407:29;-1:-1:-1;;;;;;;;;;;61425:10:0;61407:7;:29::i;:::-;61399:38;;;;;;-1:-1:-1;;;;;61448:27:0;;;;;;;;:18;:27;;;;;:35;;-1:-1:-1;;61448:35:0;;;;;;;;;;61312:179::o;61816:183::-;61914:29;-1:-1:-1;;;;;;;;;;;61932:10:0;61914:7;:29::i;:::-;61906:38;;;;;;-1:-1:-1;;;;;61955:28:0;;;;;;;;:19;:28;;;;;:36;;-1:-1:-1;;61955:36:0;;;;;;;;;;61816:183::o;55928:222::-;-1:-1:-1;;;;;56018:31:0;;55994:7;56018:31;;;:22;:31;;;;;;;;56014:62;;;-1:-1:-1;;;;;;56058:18:0;;;;;:9;:18;;;;;;;55928:222::o;56014:62::-;-1:-1:-1;;;;;56114:27:0;;;;;;:18;:27;;;;;;56094:48;;:19;:48::i;31572:94::-;30967:7;30994:6;-1:-1:-1;;;;;30994:6:0;738:10;31141:23;31133:68;;;;-1:-1:-1;;;31133:68:0;;12595:2:1;31133:68:0;;;12577:21:1;;;12614:18;;;12607:30;12673:34;12653:18;;;12646:62;12725:18;;31133:68:0;12567:182:1;31133:68:0;31637:21:::1;31655:1;31637:9;:21::i;61631:177::-:0;61726:29;-1:-1:-1;;;;;;;;;;;61744:10:0;61726:7;:29::i;:::-;61718:38;;;;;;-1:-1:-1;;;;;61767:25:0;;;;;;;;:16;:25;;;;;:33;;-1:-1:-1;;61767:33:0;;;;;;;;;;61631:177::o;10543:139::-;10621:4;10645:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;10645:29:0;;;;;;;;;;;;;;;10543:139::o;58764:388::-;58872:4;58894:228;738:10;58944:7;58966:145;59023:15;58966:145;;;;;;;;;;;;;;;;;738:10;58966:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;58966:34:0;;;;;;;;;;;;:38;:145::i;56158:189::-;56253:4;56275:42;738:10;56299:9;56310:6;56275:9;:42::i;71820:496::-;71902:10;68057:42;71902:28;71894:37;;;;;;-1:-1:-1;;;;;71964:23:0;;71942:124;;;;-1:-1:-1;;;71942:124:0;;12175:2:1;71942:124:0;;;12157:21:1;12214:2;12194:18;;;12187:30;12253:34;12233:18;;;12226:62;-1:-1:-1;;;12304:18:1;;;12297:49;12363:19;;71942:124:0;12147:241:1;71942:124:0;72121:1;72099:19;;:23;72077:111;;;;-1:-1:-1;;;72077:111:0;;13366:2:1;72077:111:0;;;13348:21:1;13405:2;13385:18;;;13378:30;13444:34;13424:18;;;13417:62;-1:-1:-1;;;13495:18:1;;;13488:36;13541:19;;72077:111:0;13338:228:1;72077:111:0;72218:19;;;72201:14;72248:23;;;;72282:26;;72218:19;;-1:-1:-1;;;;;72282:18:0;;;:26;;;;;72218:19;;72282:26;;72201:14;72282:26;72218:19;72282:18;:26;;;;;;;;;;;;;;;;;;;71590:222;71666:10;68057:42;71666:28;71658:37;;;;;;71706:21;:31;;-1:-1:-1;;;;71706:31:0;-1:-1:-1;;;71706:31:0;;;;;;;;;;;;;71753:51;;71706:31;71782:21;;;;;6256:14:1;6249:22;6231:41;;71753:51:0;;6219:2:1;6204:18;71753:51:0;;;;;;;71590:222;:::o;12435:149::-;11724:7;11751:12;;;:6;:12;;;;;;;;:22;;10125:30;10136:4;738:10;10125;:30::i;:::-;12550:26:::1;12562:4;12568:7;12550:11;:26::i;31821:192::-:0;30967:7;30994:6;-1:-1:-1;;;;;30994:6:0;738:10;31141:23;31133:68;;;;-1:-1:-1;;;31133:68:0;;12595:2:1;31133:68:0;;;12577:21:1;;;12614:18;;;12607:30;12673:34;12653:18;;;12646:62;12725:18;;31133:68:0;12567:182:1;31133:68:0;-1:-1:-1;;;;;31910:22:0;::::1;31902:73;;;::::0;-1:-1:-1;;;31902:73:0;;8239:2:1;31902:73:0::1;::::0;::::1;8221:21:1::0;8278:2;8258:18;;;8251:30;8317:34;8297:18;;;8290:62;-1:-1:-1;;;8368:18:1;;;8361:36;8414:19;;31902:73:0::1;8211:228:1::0;31902:73:0::1;31986:19;31996:8;31986:9;:19::i;18798:98::-:0;18856:7;18883:5;18887:1;18883;:5;:::i;:::-;18876:12;18798:98;-1:-1:-1;;;18798:98:0:o;18042:::-;18100:7;18127:5;18131:1;18127;:5;:::i;62007:460::-;-1:-1:-1;;;;;62149:19:0;;62127:112;;;;-1:-1:-1;;;62127:112:0;;7416:2:1;62127:112:0;;;7398:21:1;7455:2;7435:18;;;7428:30;7494:34;7474:18;;;7467:62;-1:-1:-1;;;7545:18:1;;;7538:41;7596:19;;62127:112:0;7388:233:1;62127:112:0;-1:-1:-1;;;;;62272:21:0;;62250:112;;;;-1:-1:-1;;;62250:112:0;;14193:2:1;62250:112:0;;;14175:21:1;14232:2;14212:18;;;14205:30;14271:34;14251:18;;;14244:62;-1:-1:-1;;;14322:18:1;;;14315:39;14371:19;;62250:112:0;14165:231:1;62250:112:0;-1:-1:-1;;;;;62375:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;62427:32;;6429:25:1;;;62427:32:0;;6402:18:1;62427:32:0;;;;;;;;62007:460;;;:::o;62859:1279::-;-1:-1:-1;;;;;63004:20:0;;62982:114;;;;-1:-1:-1;;;62982:114:0;;9759:2:1;62982:114:0;;;9741:21:1;9798:2;9778:18;;;9771:30;9837:34;9817:18;;;9810:62;-1:-1:-1;;;9888:18:1;;;9881:42;9940:19;;62982:114:0;9731:234:1;62982:114:0;-1:-1:-1;;;;;63129:23:0;;63107:115;;;;-1:-1:-1;;;63107:115:0;;11764:2:1;63107:115:0;;;11746:21:1;11803:2;11783:18;;;11776:30;11842:34;11822:18;;;11815:62;-1:-1:-1;;;11893:18:1;;;11886:40;11943:19;;63107:115:0;11736:232:1;63107:115:0;-1:-1:-1;;;;;63255:30:0;;50501:42;63255:30;;63233:124;;;;-1:-1:-1;;;63233:124:0;;10172:2:1;63233:124:0;;;10154:21:1;10211:2;10191:18;;;10184:30;10250:34;10230:18;;;10223:62;-1:-1:-1;;;10301:18:1;;;10294:42;10353:19;;63233:124:0;10144:234:1;63233:124:0;63385:1;63376:6;:10;63368:64;;;;-1:-1:-1;;;63368:64:0;;12956:2:1;63368:64:0;;;12938:21:1;12995:2;12975:18;;;12968:30;13034:34;13014:18;;;13007:62;-1:-1:-1;;;13085:18:1;;;13078:39;13134:19;;63368:64:0;12928:231:1;63368:64:0;63460:4;50228:3;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;50213:18;;;;:::i;:::-;63669:6;:29;:73;;;;;63716:26;63735:6;63716:18;:26::i;:::-;63715:27;63669:73;:123;;;;;63760:32;63782:9;63760:21;:32::i;:::-;63759:33;63669:123;63651:230;;;63819:50;;-1:-1:-1;;;63819:50:0;;10945:2:1;63819:50:0;;;10927:21:1;10984:2;10964:18;;;10957:30;11023:34;11003:18;;;10996:62;-1:-1:-1;;;11074:18:1;;;11067:38;11122:19;;63819:50:0;10917:230:1;63651::0;-1:-1:-1;;;;;63897:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;63927:29:0;;;;;;:18;:29;;;;;;;;63897:59;63893:107;;;-1:-1:-1;63983:5:0;63893:107;64012:56;64033:6;64041:9;64052:6;64060:7;64012:20;:56::i;:::-;64079:51;64095:6;64103:9;64114:6;64122:7;64079:15;:51::i;19940:240::-;20060:7;20121:12;20113:6;;;;20105:29;;;;-1:-1:-1;;;20105:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20156:5:0;;;19940:240::o;69769:177::-;69841:7;;;;;;;;;-1:-1:-1;;;;;69841:7:0;-1:-1:-1;;;;;69841:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;69823:47:0;;69893:4;69913:7;;;;;;;;;-1:-1:-1;;;;;69913:7:0;-1:-1:-1;;;;;69913:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69823:115;;-1:-1:-1;;;;;;69823:115:0;;;;;;;-1:-1:-1;;;;;5400:15:1;;;69823:115:0;;;5382:34:1;5452:15;;5432:18;;;5425:43;5317:18;;69823:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69815:5;:123;;-1:-1:-1;;;;;;69815:123:0;-1:-1:-1;;;;;69815:123:0;;;;;;;;;;69769:177::o;10972:497::-;11053:22;11061:4;11067:7;11053;:22::i;:::-;11048:414;;11241:41;11269:7;-1:-1:-1;;;;;11241:41:0;11279:2;11241:19;:41::i;:::-;11355:38;11383:4;11390:2;11355:19;:38::i;:::-;11146:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11146:270:0;;;;;;;;;;-1:-1:-1;;;11092:358:0;;;;;;;:::i;14395:229::-;14470:22;14478:4;14484:7;14470;:22::i;:::-;14465:152;;14509:12;;;;14541:4;14509:12;;;;;;;;-1:-1:-1;;;;;14509:29:0;;;;;;;;;;:36;;-1:-1:-1;;14509:36:0;;;;;;;14565:40;;738:10;;14509:12;;14565:40;;14509:12;14565:40;14395:229;;:::o;14632:230::-;14707:22;14715:4;14721:7;14707;:22::i;:::-;14703:152;;;14778:5;14746:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14746:29:0;;;;;;;;;;:37;;-1:-1:-1;;14746:37:0;;;14803:40;738:10;;14746:12;;14803:40;;14778:5;14803:40;14632:230;;:::o;17661:98::-;17719:7;17746:5;17750:1;17746;:5;:::i;66143:172::-;66193:7;66214:15;66231;66250:19;:17;:19::i;:::-;66213:56;;-1:-1:-1;66213:56:0;-1:-1:-1;66287:20:0;66213:56;;66287:11;:20::i;:::-;66280:27;;;;66143:172;:::o;18399:98::-;18457:7;18484:5;18488:1;18484;:5;:::i;58054:406::-;50501:42;58209:31;;:18;:31;;;;:66;;58259:5;58209:35;:66::i;:::-;50501:42;58175:31;;;:100;58290:22;58175:31;58290:35;;;;;58286:112;;;50501:42;58365:22;;:9;:22;;;;:33;;58392:5;58365:26;:33::i;:::-;50501:42;58340:22;;:9;:22;;;:58;58286:112;58416:36;;6429:25:1;;;50501:42:0;;-1:-1:-1;;;;;58416:36:0;;;;;6417:2:1;6402:18;58416:36:0;6384:76:1;65440:695:0;65542:7;;;;;;65666:38;49856:5;65666:20;:7;65678;65666:11;:20::i;:::-;:24;;:38::i;:::-;65645:59;-1:-1:-1;65715:23:0;65741;:7;65645:59;65741:11;:23::i;:::-;65715:49;;65775:19;65797:17;:15;:17::i;:::-;65775:39;-1:-1:-1;65825:15:0;65843:24;:7;65775:39;65843:11;:24::i;:::-;65825:42;-1:-1:-1;65878:18:0;65899:27;:10;65914:11;65899:14;:27::i;:::-;65878:48;-1:-1:-1;65937:23:0;65963;:7;65878:48;65963:11;:23::i;:::-;66017:7;;;;66061;-1:-1:-1;66079:15:0;;-1:-1:-1;66105:11:0;;-1:-1:-1;65440:695:0;-1:-1:-1;;;;;;65440:695:0:o;60450:310::-;-1:-1:-1;;;;;60509:27:0;;60539:1;60509:27;;;:18;:27;;;;;;:31;60505:165;;-1:-1:-1;;;;;60616:27:0;;;;;;:18;:27;;;;;;60578:80;;:19;:80::i;:::-;-1:-1:-1;;;;;60557:18:0;;;;;;:9;:18;;;;;:101;60505:165;-1:-1:-1;;;;;60680:31:0;;;;;:22;:31;;;;;:38;;-1:-1:-1;;60680:38:0;60714:4;60680:38;;;;;;60729:9;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;;60729:23:0;;;;;;60450:310::o;59889:328::-;59973:7;60031:16;;60020:7;:27;;59998:119;;;;-1:-1:-1;;;59998:119:0;;7828:2:1;59998:119:0;;;7810:21:1;7867:2;7847:18;;;7840:30;7906:34;7886:18;;;7879:62;-1:-1:-1;;;7957:18:1;;;7950:40;8007:19;;59998:119:0;7800:232:1;59998:119:0;60128:19;60150:17;:15;:17::i;:::-;60128:39;-1:-1:-1;60185:24:0;:7;60128:39;60185:11;:24::i;32021:173::-;32077:16;32096:6;;-1:-1:-1;;;;;32113:17:0;;;-1:-1:-1;;;;;;32113:17:0;;;;;;32146:40;;32096:6;;;;;;;32146:40;;32077:16;32146:40;32066:128;32021:173;:::o;62475:149::-;-1:-1:-1;;;;;62568:25:0;;62543:4;62568:25;;;:16;:25;;;;;;;;;:47;;-1:-1:-1;;30967:7:0;30994:6;-1:-1:-1;;;;;62597:18:0;;;30994:6;;62597:18;;62475:149::o;62632:219::-;62718:4;30994:6;;-1:-1:-1;;;;;62748:18:0;;;30994:6;;62748:18;;:53;;-1:-1:-1;;;;;;62779:22:0;;50501:42;62779:22;62748:53;:94;;;-1:-1:-1;;;;;;;62814:28:0;;;;;:19;:28;;;;;;;;;62632:219::o;73138:253::-;73280:28;73311:24;73329:4;73311:9;:24::i;:::-;73280:55;;73346:37;73354:20;73376:6;73346:7;:37::i;:::-;73269:122;73138:253;;;;:::o;64146:1056::-;64298:17;64318:29;73113:9;;;72974:156;64318:29;64298:49;;64363:7;64358:54;;-1:-1:-1;64399:1:0;64358:54;64435:15;64461:23;64495:15;64521:23;64555:19;64588:29;64599:6;64607:9;64588:10;:29::i;:::-;-1:-1:-1;;;;;64659:26:0;;;;;;:18;:26;;;;;;64424:193;;-1:-1:-1;64424:193:0;;-1:-1:-1;64424:193:0;;-1:-1:-1;64424:193:0;-1:-1:-1;64424:193:0;-1:-1:-1;64659:39:0;;64424:193;64659:30;:39::i;:::-;-1:-1:-1;;;;;64630:26:0;;;;;;;:18;:26;;;;;;:68;;;;64741:29;;;;;;;:74;;64789:15;64741:33;:74::i;:::-;-1:-1:-1;;;;;64709:29:0;;;;;;;:18;:29;;;;;;;;:106;;;;64832:30;;;;;:22;:30;;;;;;;64828:113;;;-1:-1:-1;;;;;64899:17:0;;;;;;:9;:17;;;;;;:30;;64921:7;64899:21;:30::i;:::-;-1:-1:-1;;;;;64879:17:0;;;;;;:9;:17;;;;;:50;64828:113;-1:-1:-1;;;;;64955:33:0;;;;;;:22;:33;;;;;;;;64951:130;;;-1:-1:-1;;;;;65028:20:0;;;;;;:9;:20;;;;;;:41;;65053:15;65028:24;:41::i;:::-;-1:-1:-1;;;;;65005:20:0;;;;;;:9;:20;;;;;:64;64951:130;65093:41;65103:6;65111:11;65124:9;65093;:41::i;:::-;65167:9;-1:-1:-1;;;;;65150:44:0;65159:6;-1:-1:-1;;;;;65150:44:0;;65178:15;65150:44;;;;6429:25:1;;6417:2;6402:18;;6384:76;65150:44:0;;;;;;;;64287:915;;;;;;64146:1056;;;;:::o;4295:451::-;4370:13;4396:19;4428:10;4432:6;4428:1;:10;:::i;:::-;:14;;4441:1;4428:14;:::i;:::-;4418:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4418:25:0;;4396:47;;-1:-1:-1;;;4454:6:0;4461:1;4454:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4454:15:0;;;;;;;;;-1:-1:-1;;;4480:6:0;4487:1;4480:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4480:15:0;;;;;;;;-1:-1:-1;4511:9:0;4523:10;4527:6;4523:1;:10;:::i;:::-;:14;;4536:1;4523:14;:::i;:::-;4511:26;;4506:135;4543:1;4539;:5;4506:135;;;-1:-1:-1;;;4591:5:0;4599:3;4591:11;4578:25;;;;;;;:::i;:::-;;;;4566:6;4573:1;4566:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4566:37:0;;;;;;;;-1:-1:-1;4628:1:0;4618:11;;;;;4546:3;;;:::i;:::-;;;4506:135;;;-1:-1:-1;4659:10:0;;4651:55;;;;-1:-1:-1;;;4651:55:0;;7055:2:1;4651:55:0;;;7037:21:1;;;7074:18;;;7067:30;7133:34;7113:18;;;7106:62;7185:18;;4651:55:0;7027:182:1;66323:719:0;66422:16;;66375:7;;;;;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;66449:30;;66497:9;66492:378;66516:9;:16;66512:20;;66492:378;;;66611:7;66576:18;:32;66595:9;66605:1;66595:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66595:12:0;66576:32;;;;;;;;;;;;;:42;;:96;;;66665:7;66639:9;:23;66649:9;66659:1;66649:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66649:12:0;66639:23;;;;;;;;;;;;;:33;66576:96;66554:173;;;66696:16;;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;66688:39;;;;;;;66323:719;;:::o;66554:173::-;66752:45;66764:18;:32;66783:9;66793:1;66783:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66783:12:0;66764:32;;;;;;;;;;;;;66752:7;;:11;:45::i;:::-;66742:55;;66822:36;66834:9;:23;66844:9;66854:1;66844:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66844:12:0;66834:23;;;;;;;;;;;;;66822:7;;:11;:36::i;:::-;66812:46;-1:-1:-1;66534:3:0;;;;:::i;:::-;;;;66492:378;;;-1:-1:-1;66884:12:0;;;:60;;-1:-1:-1;66910:34:0;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;66910:16;;;:20;:34::i;:::-;66900:7;:44;66884:60;66880:118;;;66967:16;;49946:12;49903:1;49946:2;:12;:::i;:::-;50057:27;;:18;:27;:::i;:::-;66959:39;;;;;;66323:719;;:::o;66880:118::-;67017:7;;67026;;-1:-1:-1;66323:719:0;-1:-1:-1;66323:719:0:o;69213:548::-;69324:20;;69300;:44;69296:106;;69382:20;;69359:43;;69296:106;69483:31;;69450:64;;;;;;;69546;;-1:-1:-1;69589:21:0;;-1:-1:-1;;;69589:21:0;;;;69546:64;:98;;;;-1:-1:-1;69628:16:0;;-1:-1:-1;;;69628:16:0;;;;69627:17;69546:98;:132;;;;-1:-1:-1;69672:5:0;;-1:-1:-1;;;;;69662:15:0;;;69672:5;;69662:15;;69546:132;69528:226;;;69705:37;69721:20;69705:15;:37::i;65210:222::-;65342:13;;65338:87;;65372:41;65393:6;65401:11;65372:20;:41::i;69954:435::-;68491:16;:23;;-1:-1:-1;;;;68491:23:0;-1:-1:-1;;;68491:23:0;;;;70041:13:::1;:6:::0;70052:1:::1;70041:10;:13::i;:::-;70026:28:::0;-1:-1:-1;70065:17:0::1;70085:16;:6:::0;70026:28;70085:10:::1;:16::i;:::-;70065:36:::0;-1:-1:-1;70139:21:0::1;70173:23;70191:4:::0;70173:17:::1;:23::i;:::-;70209:18;70230:41;:21;70256:14:::0;70230:25:::1;:41::i;:::-;70209:62;;70284:36;70298:9;70309:10;70284:13;:36::i;:::-;70338:43;::::0;;16595:25:1;;;16651:2;16636:18;;16629:34;;;16679:18;;;16672:34;;;70338:43:0::1;::::0;16583:2:1;16568:18;70338:43:0::1;;;;;;;-1:-1:-1::0;;68537:16:0;:24;;-1:-1:-1;;;;68537:24:0;;;-1:-1:-1;;;69954:435:0:o;73399:810::-;73510:17;73530:15;51959:4;:11;;51884:94;73530:15;73510:35;;73561:13;73556:646;73588:9;73580:5;:17;73556:646;;;73624:12;73638:13;73653:17;73676:14;73684:5;73676:7;:14::i;:::-;73623:67;;;;;;;73709:5;73718:1;73709:10;73705:24;;;73721:8;;;;;73705:24;73758:11;73750:4;:19;;;;;;;;:::i;:::-;;73746:445;;;73790:48;73804:6;73812:11;73825:5;73832;73790:13;:48::i;:::-;73746:445;;;73872:12;73864:4;:20;;;;;;;;:::i;:::-;;73860:331;;;73905:40;73911:6;73919:11;73932:5;73939;73905;:40::i;73860:331::-;73979:21;73971:4;:29;;;;;;;;:::i;:::-;;73967:224;;;74021:59;74035:6;74043:11;74056:5;74063:9;74074:5;74021:13;:59::i;73967:224::-;74121:54;74130:6;74138:11;74151:5;74158:9;74169:5;74121:8;:54::i;:::-;73608:594;;;73556:646;73599:7;;;;:::i;:::-;;;;73556:646;;70397:460;70488:16;;;70502:1;70488:16;;;;;;;;70464:21;;70488:16;;;;;;;;;;-1:-1:-1;70488:16:0;70464:40;;70533:4;70515;70520:1;70515:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;70515:23:0;;;:7;;;;;;;;;;:23;;;;70559:7;;:14;;;-1:-1:-1;;;70559:14:0;;;;:7;;;;;:12;;:14;;;;;70515:7;;70559:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70549:4;70554:1;70549:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;70549:24:0;;;:7;;;;;;;;;:24;70626:7;;70586:62;;70611:4;;70626:7;70636:11;70586:16;:62::i;:::-;70661:7;;:188;;-1:-1:-1;;;70661:188:0;;-1:-1:-1;;;;;70661:7:0;;;;:58;;:188;;70734:11;;70661:7;;70776:4;;70803;;70823:15;;70661:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70453:404;70397:460;:::o;70865:590::-;70987:7;;70947:62;;70972:4;;-1:-1:-1;;;;;70987:7:0;70997:11;70947:16;:62::i;:::-;71128:7;;71031:23;;;;;;-1:-1:-1;;;;;71128:7:0;:23;71159:9;71192:4;71212:11;71031:23;;71270:7;30967;30994:6;-1:-1:-1;;;;;30994:6:0;;30921:87;71270:7;71128:190;;;;;;-1:-1:-1;;;;;;71128:190:0;;;-1:-1:-1;;;;;5838:15:1;;;71128:190:0;;;5820:34:1;5870:18;;;5863:34;;;;5913:18;;;5906:34;;;;5956:18;;;5949:34;6020:15;;;5999:19;;;5992:44;71292:15:0;6052:19:1;;;6045:35;5754:19;;71128:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71353:21;71331:19;:43;71390:57;;;16595:25:1;;;16651:2;16636:18;;16629:34;;;16679:18;;;16672:34;;;71020:298:0;;-1:-1:-1;71020:298:0;;-1:-1:-1;71020:298:0;-1:-1:-1;71390:57:0;;16583:2:1;16568:18;71390:57:0;;;;;;;70936:519;;;70865:590;;:::o;52249:275::-;52329:7;52347;52365;52383;52414:14;52431:20;52445:5;52431:13;:20::i;:::-;52414:37;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52414:37:0;;;;;;;;;;;;;;;;;;;52470:8;;52480:9;;;;52491:13;;;;52506:9;;;;;52470:8;;52480:9;;-1:-1:-1;52491:13:0;;-1:-1:-1;52506:9:0;;-1:-1:-1;52249:275:0;-1:-1:-1;;;52249:275:0:o;67417:358::-;67568:12;67583:33;49856:5;67583:15;:6;67594:3;67583:10;:15::i;:33::-;67568:48;-1:-1:-1;67627:12:0;67642:21;67568:48;67651:11;67642:8;:21::i;:::-;67695:16;;67627:36;;-1:-1:-1;67695:26:0;;67627:36;67695:20;:26::i;:::-;67676:16;:45;67732:35;67755:5;67762:4;67732:22;:35::i;74217:348::-;74359:13;74375:33;49856:5;74375:15;:6;74386:3;74375:10;:15::i;:33::-;74359:49;-1:-1:-1;74419:13:0;74435:22;74359:49;74445:11;74435:9;:22::i;:::-;74419:38;;74470:40;74490:4;74497:5;74504;74470:11;:40::i;:::-;74521:36;74544:5;74551;74521:22;:36::i;75147:238::-;75325:52;75334:6;75342:11;75355:3;75360:9;75371:5;74573:566;74746:15;74764:33;49856:5;74764:15;:6;74775:3;74764:10;:15::i;:33::-;74746:51;-1:-1:-1;74808:15:0;74826:24;74746:51;74838:11;74826;:24::i;:::-;-1:-1:-1;;;;;74895:29:0;;;;;;:18;:29;;;;;;74808:42;;-1:-1:-1;74895:66:0;;74808:42;74895:33;:66::i;:::-;-1:-1:-1;;;;;74863:29:0;;;;;;:18;:29;;;;;;;;:98;;;;74976:22;:33;;;;;;74972:108;;;-1:-1:-1;;;;;75047:20:0;;;;;;:9;:20;;;;;;:33;;75072:7;75047:24;:33::i;:::-;-1:-1:-1;;;;;75024:20:0;;;;;;:9;:20;;;;;:56;74972:108;75093:38;75116:5;75123:7;75093:22;:38::i;:::-;74735:404;;74573:566;;;;;:::o;75393:177::-;75530:32;75539:5;75546:7;75555:6;75530:8;:32::i;51986:255::-;52046:11;52114:4;:11;52106:19;;52070:134;;;;-1:-1:-1;;;52070:134:0;;13773:2:1;52070:134:0;;;13755:21:1;13812:2;13792:18;;;13785:30;13851:34;13831:18;;;13824:62;-1:-1:-1;;;13902:18:1;;;13895:49;13961:19;;52070:134:0;13745:241:1;52070:134:0;52222:4;52227:5;52222:11;;;;;;;;:::i;:::-;;;;;;;;;;;52215:18;;51986:255;;;:::o;52532:173::-;52615:15;52633:20;52647:5;52633:13;:20::i;:::-;52676:9;;;;52615:38;;-1:-1:-1;52676:21:0;;52690:6;52676:13;:21::i;:::-;52664:9;;;;:33;-1:-1:-1;;52532:173:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;307:1;304;297:12;259:2;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:2;;;570:1;567;560:12;522:2;602:9;596:16;621:31;646:5;621:31;:::i;947:388::-;1015:6;1023;1076:2;1064:9;1055:7;1051:23;1047:32;1044:2;;;1092:1;1089;1082:12;1044:2;1131:9;1118:23;1150:31;1175:5;1150:31;:::i;:::-;1200:5;-1:-1:-1;1257:2:1;1242:18;;1229:32;1270:33;1229:32;1270:33;:::i;:::-;1322:7;1312:17;;;1034:301;;;;;:::o;1340:456::-;1417:6;1425;1433;1486:2;1474:9;1465:7;1461:23;1457:32;1454:2;;;1502:1;1499;1492:12;1454:2;1541:9;1528:23;1560:31;1585:5;1560:31;:::i;:::-;1610:5;-1:-1:-1;1667:2:1;1652:18;;1639:32;1680:33;1639:32;1680:33;:::i;:::-;1444:352;;1732:7;;-1:-1:-1;;;1786:2:1;1771:18;;;;1758:32;;1444:352::o;1801:315::-;1866:6;1874;1927:2;1915:9;1906:7;1902:23;1898:32;1895:2;;;1943:1;1940;1933:12;1895:2;1982:9;1969:23;2001:31;2026:5;2001:31;:::i;:::-;2051:5;-1:-1:-1;2075:35:1;2106:2;2091:18;;2075:35;:::i;:::-;2065:45;;1885:231;;;;;:::o;2121:315::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:2;;;2266:1;2263;2256:12;2218:2;2305:9;2292:23;2324:31;2349:5;2324:31;:::i;:::-;2374:5;2426:2;2411:18;;;;2398:32;;-1:-1:-1;;;2208:228:1:o;2441:180::-;2497:6;2550:2;2538:9;2529:7;2525:23;2521:32;2518:2;;;2566:1;2563;2556:12;2518:2;2589:26;2605:9;2589:26;:::i;2626:180::-;2685:6;2738:2;2726:9;2717:7;2713:23;2709:32;2706:2;;;2754:1;2751;2744:12;2706:2;-1:-1:-1;2777:23:1;;2696:110;-1:-1:-1;2696:110:1:o;2811:315::-;2879:6;2887;2940:2;2928:9;2919:7;2915:23;2911:32;2908:2;;;2956:1;2953;2946:12;2908:2;2992:9;2979:23;2969:33;;3052:2;3041:9;3037:18;3024:32;3065:31;3090:5;3065:31;:::i;3131:286::-;3189:6;3242:2;3230:9;3221:7;3217:23;3213:32;3210:2;;;3258:1;3255;3248:12;3210:2;3284:23;;-1:-1:-1;;;;;;3336:32:1;;3326:43;;3316:2;;3383:1;3380;3373:12;3607:248;3672:6;3680;3733:2;3721:9;3712:7;3708:23;3704:32;3701:2;;;3749:1;3746;3739:12;3701:2;3785:9;3772:23;3762:33;;3814:35;3845:2;3834:9;3830:18;3814:35;:::i;3860:306::-;3948:6;3956;3964;4017:2;4005:9;3996:7;3992:23;3988:32;3985:2;;;4033:1;4030;4023:12;3985:2;4062:9;4056:16;4046:26;;4112:2;4101:9;4097:18;4091:25;4081:35;;4156:2;4145:9;4141:18;4135:25;4125:35;;3975:191;;;;;:::o;4171:786::-;4582:25;4577:3;4570:38;4552:3;4637:6;4631:13;4653:62;4708:6;4703:2;4698:3;4694:12;4687:4;4679:6;4675:17;4653:62;:::i;:::-;-1:-1:-1;;;4774:2:1;4734:16;;;4766:11;;;4759:40;4824:13;;4846:63;4824:13;4895:2;4887:11;;4880:4;4868:17;;4846:63;:::i;:::-;4929:17;4948:2;4925:26;;4560:397;-1:-1:-1;;;;4560:397:1:o;6465:383::-;6614:2;6603:9;6596:21;6577:4;6646:6;6640:13;6689:6;6684:2;6673:9;6669:18;6662:34;6705:66;6764:6;6759:2;6748:9;6744:18;6739:2;6731:6;6727:15;6705:66;:::i;:::-;6832:2;6811:15;-1:-1:-1;;6807:29:1;6792:45;;;;6839:2;6788:54;;6586:262;-1:-1:-1;;6586:262:1:o;15408:980::-;15670:4;15718:3;15707:9;15703:19;15749:6;15738:9;15731:25;15775:2;15813:6;15808:2;15797:9;15793:18;15786:34;15856:3;15851:2;15840:9;15836:18;15829:31;15880:6;15915;15909:13;15946:6;15938;15931:22;15984:3;15973:9;15969:19;15962:26;;16023:2;16015:6;16011:15;15997:29;;16044:1;16054:195;16068:6;16065:1;16062:13;16054:195;;;16133:13;;-1:-1:-1;;;;;16129:39:1;16117:52;;16224:15;;;;16189:12;;;;16165:1;16083:9;16054:195;;;-1:-1:-1;;;;;;;16305:32:1;;;;16300:2;16285:18;;16278:60;-1:-1:-1;;;16369:3:1;16354:19;16347:35;16266:3;15679:709;-1:-1:-1;;;15679:709:1:o;16906:128::-;16946:3;16977:1;16973:6;16970:1;16967:13;16964:2;;;16983:18;;:::i;:::-;-1:-1:-1;17019:9:1;;16954:80::o;17039:217::-;17079:1;17105;17095:2;;17149:10;17144:3;17140:20;17137:1;17130:31;17184:4;17181:1;17174:15;17212:4;17209:1;17202:15;17095:2;-1:-1:-1;17241:9:1;;17085:171::o;17261:422::-;17350:1;17393:5;17350:1;17407:270;17428:7;17418:8;17415:21;17407:270;;;17487:4;17483:1;17479:6;17475:17;17469:4;17466:27;17463:2;;;17496:18;;:::i;:::-;17546:7;17536:8;17532:22;17529:2;;;17566:16;;;;17529:2;17645:22;;;;17605:15;;;;17407:270;;;17411:3;17325:358;;;;;:::o;17688:140::-;17746:5;17775:47;17816:4;17806:8;17802:19;17796:4;17882:5;17912:8;17902:2;;-1:-1:-1;17953:1:1;17967:5;;17902:2;18001:4;17991:2;;-1:-1:-1;18038:1:1;18052:5;;17991:2;18083:4;18101:1;18096:59;;;;18169:1;18164:130;;;;18076:218;;18096:59;18126:1;18117:10;;18140:5;;;18164:130;18201:3;18191:8;18188:17;18185:2;;;18208:18;;:::i;:::-;-1:-1:-1;;18264:1:1;18250:16;;18279:5;;18076:218;;18378:2;18368:8;18365:16;18359:3;18353:4;18350:13;18346:36;18340:2;18330:8;18327:16;18322:2;18316:4;18313:12;18309:35;18306:77;18303:2;;;-1:-1:-1;18415:19:1;;;18447:5;;18303:2;18494:34;18519:8;18513:4;18494:34;:::i;:::-;18564:6;18560:1;18556:6;18552:19;18543:7;18540:32;18537:2;;;18575:18;;:::i;:::-;18613:20;;17892:747;-1:-1:-1;;;17892:747:1:o;18644:168::-;18684:7;18750:1;18746;18742:6;18738:14;18735:1;18732:21;18727:1;18720:9;18713:17;18709:45;18706:2;;;18757:18;;:::i;:::-;-1:-1:-1;18797:9:1;;18696:116::o;18817:125::-;18857:4;18885:1;18882;18879:8;18876:2;;;18890:18;;:::i;:::-;-1:-1:-1;18927:9:1;;18866:76::o;18947:258::-;19019:1;19029:113;19043:6;19040:1;19037:13;19029:113;;;19119:11;;;19113:18;19100:11;;;19093:39;19065:2;19058:10;19029:113;;;19160:6;19157:1;19154:13;19151:2;;;-1:-1:-1;;19195:1:1;19177:16;;19170:27;19000:205::o;19210:136::-;19249:3;19277:5;19267:2;;19286:18;;:::i;:::-;-1:-1:-1;;;19322:18:1;;19257:89::o;19351:135::-;19390:3;-1:-1:-1;;19411:17:1;;19408:2;;;19431:18;;:::i;:::-;-1:-1:-1;19478:1:1;19467:13;;19398:88::o;19491:127::-;19552:10;19547:3;19543:20;19540:1;19533:31;19583:4;19580:1;19573:15;19607:4;19604:1;19597:15;19623:127;19684:10;19679:3;19675:20;19672:1;19665:31;19715:4;19712:1;19705:15;19739:4;19736:1;19729:15;19755:127;19816:10;19811:3;19807:20;19804:1;19797:31;19847:4;19844:1;19837:15;19871:4;19868:1;19861:15;19887:127;19948:10;19943:3;19939:20;19936:1;19929:31;19979:4;19976:1;19969:15;20003:4;20000:1;19993:15;20019:127;20080:10;20075:3;20071:20;20068:1;20061:31;20111:4;20108:1;20101:15;20135:4;20132:1;20125:15;20151:131;-1:-1:-1;;;;;20226:31:1;;20216:42;;20206:2;;20272:1;20269;20262:12

Swarm Source

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