ETH Price: $2,619.28 (+1.31%)
Gas: 1 Gwei

Token

Eurion (ERN)
 

Overview

Max Total Supply

1,000,000,000 ERN

Holders

74 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
29,640.292796513516029724 ERN

Value
$0.00
0x31a3d5acba4b97fda6bb9b325bd6442af5e6bad2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
EurionUpgradable

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlotUpgradeable {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)

pragma solidity ^0.8.0;

/**
 * @dev This is the interface that {BeaconProxy} expects of its beacon.
 */
interface IBeaconUpgradeable {
    /**
     * @dev Must return an address that can be used as a delegate call target.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

// File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
 * proxy whose upgrades are fully controlled by the current implementation.
 */
interface IERC1822ProxiableUpgradeable {
    /**
     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
     * address.
     *
     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
     * function revert if invoked through a proxy.
     */
    function proxiableUUID() external view returns (bytes32);
}

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.2;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     * @custom:oz-retyped-from bool
     */
    uint8 private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint8 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
     */
    modifier initializer() {
        bool isTopLevelCall = !_initializing;
        require(
            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
            "Initializable: contract is already initialized"
        );
        _initialized = 1;
        if (isTopLevelCall) {
            _initializing = true;
        }
        _;
        if (isTopLevelCall) {
            _initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
     * initialization step. This is essential to configure modules that are added through upgrades and that require
     * initialization.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     */
    modifier reinitializer(uint8 version) {
        require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
        _initialized = version;
        _initializing = true;
        _;
        _initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     */
    function _disableInitializers() internal virtual {
        require(!_initializing, "Initializable: contract is initializing");
        if (_initialized < type(uint8).max) {
            _initialized = type(uint8).max;
            emit Initialized(type(uint8).max);
        }
    }
}

// File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)

pragma solidity ^0.8.2;






/**
 * @dev This abstract contract provides getters and event emitting update functions for
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
 *
 * _Available since v4.1._
 *
 * @custom:oz-upgrades-unsafe-allow delegatecall
 */
abstract contract ERC1967UpgradeUpgradeable is Initializable {
    function __ERC1967Upgrade_init() internal onlyInitializing {
    }

    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {
    }
    // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Emitted when the implementation is upgraded.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Returns the current implementation address.
     */
    function _getImplementation() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 implementation slot.
     */
    function _setImplementation(address newImplementation) private {
        require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    }

    /**
     * @dev Perform implementation upgrade
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Perform implementation upgrade with additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCall(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        _upgradeTo(newImplementation);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(newImplementation, data);
        }
    }

    /**
     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCallUUPS(
        address newImplementation,
        bytes memory data,
        bool forceCall
    ) internal {
        // Upgrades from old implementations will perform a rollback test. This test requires the new
        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
        // this special case will break upgrade paths from old UUPS implementation to new ones.
        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {
            _setImplementation(newImplementation);
        } else {
            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
            } catch {
                revert("ERC1967Upgrade: new implementation is not UUPS");
            }
            _upgradeToAndCall(newImplementation, data, forceCall);
        }
    }

    /**
     * @dev Storage slot with the admin of the contract.
     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    /**
     * @dev Emitted when the admin account has changed.
     */
    event AdminChanged(address previousAdmin, address newAdmin);

    /**
     * @dev Returns the current admin.
     */
    function _getAdmin() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
    }

    /**
     * @dev Stores a new address in the EIP1967 admin slot.
     */
    function _setAdmin(address newAdmin) private {
        require(newAdmin != address(0), "ERC1967: new admin is the zero address");
        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     */
    function _changeAdmin(address newAdmin) internal {
        emit AdminChanged(_getAdmin(), newAdmin);
        _setAdmin(newAdmin);
    }

    /**
     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
     */
    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;

    /**
     * @dev Emitted when the beacon is upgraded.
     */
    event BeaconUpgraded(address indexed beacon);

    /**
     * @dev Returns the current beacon.
     */
    function _getBeacon() internal view returns (address) {
        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
    }

    /**
     * @dev Stores a new beacon in the EIP1967 beacon slot.
     */
    function _setBeacon(address newBeacon) private {
        require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract");
        require(
            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
            "ERC1967: beacon implementation is not a contract"
        );
        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
    }

    /**
     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
     *
     * Emits a {BeaconUpgraded} event.
     */
    function _upgradeBeaconToAndCall(
        address newBeacon,
        bytes memory data,
        bool forceCall
    ) internal {
        _setBeacon(newBeacon);
        emit BeaconUpgraded(newBeacon);
        if (data.length > 0 || forceCall) {
            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
        }
    }

    /**
     * @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) private returns (bytes memory) {
        require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed");
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol)

pragma solidity ^0.8.0;




/**
 * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
 * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
 *
 * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
 * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
 * `UUPSUpgradeable` with a custom implementation of upgrades.
 *
 * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
 *
 * _Available since v4.1._
 */
abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {
    function __UUPSUpgradeable_init() internal onlyInitializing {
    }

    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
    }
    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
    address private immutable __self = address(this);

    /**
     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is
     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
     * fail.
     */
    modifier onlyProxy() {
        require(address(this) != __self, "Function must be called through delegatecall");
        require(_getImplementation() == __self, "Function must be called through active proxy");
        _;
    }

    /**
     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
     * callable on the implementing contract but not through proxies.
     */
    modifier notDelegated() {
        require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall");
        _;
    }

    /**
     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
     * implementation. It is used to validate that the this implementation remains valid after an upgrade.
     *
     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
     */
    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {
        return _IMPLEMENTATION_SLOT;
    }

    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeTo(address newImplementation) external virtual onlyProxy {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);
    }

    /**
     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
     * encoded in `data`.
     *
     * Calls {_authorizeUpgrade}.
     *
     * Emits an {Upgraded} event.
     */
    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {
        _authorizeUpgrade(newImplementation);
        _upgradeToAndCallUUPS(newImplementation, data, true);
    }

    /**
     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
     * {upgradeTo} and {upgradeToAndCall}.
     *
     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
     *
     * ```solidity
     * function _authorizeUpgrade(address) internal override onlyOwner {}
     * ```
     */
    function _authorizeUpgrade(address newImplementation) internal virtual;

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(address(0));
    }

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

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

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol


// OpenZeppelin Contracts v4.4.1 (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 IERC20MetadataUpgradeable is IERC20Upgradeable {
    /**
     * @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-upgradeable/token/ERC20/ERC20Upgradeable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    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.
     */
    function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {
        __ERC20_init_unchained(name_, symbol_);
    }

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
        _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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 {}

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[45] private __gap;
}

pragma solidity 0.8.16;


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

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

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

	function WETH() external pure returns (address);

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

	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;

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

contract EurionUpgradable is Initializable, ERC20Upgradeable, UUPSUpgradeable, OwnableUpgradeable {
    IRouter public uniswapV2Router;
    address public uniswapV2Pair;

    bool public isTradingEnabled;
 	uint256 initialSupply;
 	uint256 public maxWalletAmount;
    uint256 public maxTxAmount;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap;

    address public liquidityWallet;
    address public operationsWallet;
    address public devWallet;
    address public legalWallet;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 operationsFeeOnBuy;
        uint8 operationsFeeOnSell;
        uint8 devFeeOnBuy;
        uint8 devFeeOnSell;
        uint8 legalFeeOnBuy;
        uint8 legalFeeOnSell;
    }

    // Launch taxes
    bool private _isLaunched;
    uint256 private _launchStartTimestamp;
    uint256 private _launchBlockNumber;

    // Base taxes
    CustomTaxPeriod private _base;

    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isBlocked;
    mapping (address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping (address => bool) private _isExcludedFromMaxWalletLimit;
    mapping (address => bool) private _isAllowedToTradeWhenDisabled;
    mapping (address => bool) private _feeOnSelectedWalletTransfers;
    mapping (address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _operationsFee;
    uint8 private _devFee;
    uint8 private _legalFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
    event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
    event WalletChange(string indexed indentifier, address indexed newWallet, address indexed oldWallet);
    event BlockedAccountChange(address indexed holder, bool indexed status);
    event FeeChange(string indexed identifier, uint8 liquidityFee, uint8 operationsFee, uint8 devFee, uint8 legalFee);
    event CustomTaxPeriodChange(uint256 indexed newValue, uint256 indexed oldValue, string indexed taxType, bytes23 period);
    event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived,uint256 tokensIntoLiqudity);
    event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
    event ClaimETHOverflow(uint256 amount);
    event FeesApplied(uint8 liquidityFee, uint8 operationsFee, uint8 devFee, uint8 legalFee, uint8 totalFee);

    receive() external payable {}

	function initialize() public initializer {
		__ERC20_init("Eurion", "ERN");
		__Ownable_init();
		__UUPSUpgradeable_init();

		initialSupply = 1000000000 * (10**18);
		maxWalletAmount = initialSupply * 200 / 10000;
		maxTxAmount = initialSupply * 50 / 10000;
		minimumTokensBeforeSwap = initialSupply * 50 / 100000;
		_base = CustomTaxPeriod('base',0,0,3,3,2,2,4,4,1,1);

		liquidityWallet = owner();
		operationsWallet = owner();
		devWallet = owner();
		legalWallet = owner();

		IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
		address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
		uniswapV2Router = _uniswapV2Router;
		uniswapV2Pair = _uniswapV2Pair;
		_setAutomatedMarketMakerPair(_uniswapV2Pair, true);

		_isExcludedFromFee[owner()] = true;
		_isExcludedFromFee[address(this)] = true;

		_isAllowedToTradeWhenDisabled[owner()] = true;

		_isExcludedFromMaxTransactionLimit[address(this)] = true;

		_isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
		_isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
		_isExcludedFromMaxWalletLimit[address(this)] = true;
		_isExcludedFromMaxWalletLimit[owner()] = true;

		_mint(owner(), initialSupply);
	}

    function _authorizeUpgrade(address newImplementaion) internal override onlyOwner {}

    // Setters
    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
        if(_launchBlockNumber == 0) {
            _launchBlockNumber = block.number;
            _launchStartTimestamp = block.timestamp;
            _isLaunched = true;
        }
    }
    function deactivateTrading() external onlyOwner {
        isTradingEnabled = false;
    }
    function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
		_isAllowedToTradeWhenDisabled[account] = allowed;
		emit AllowedWhenTradingDisabledChange(account, allowed);
	}
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "EURION: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        emit AutomatedMarketMakerPairChange(pair, value);
    }
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFee[account] != excluded, "EURION: Account is already the value of 'excluded'");
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }
    function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxTransactionLimit[account] != excluded, "EURION: Account is already the value of 'excluded'");
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }
    function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxWalletLimit[account] != excluded, "EURION: Account is already the value of 'excluded'");
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }
    function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
		require(_feeOnSelectedWalletTransfers[account] != value, "EURION: The selected wallet is already set to the value ");
		_feeOnSelectedWalletTransfers[account] = value;
		emit FeeOnSelectedWalletTransfersChange(account, value);
	}
    function blockAccount(address account) external onlyOwner {
		require(!_isBlocked[account], "EURION: Account is already blocked");
		if (_launchStartTimestamp > 0) {
			require((block.timestamp - _launchStartTimestamp) < 172800, "EURION: Time to block accounts has expired");
		}
		_isBlocked[account] = true;
		emit BlockedAccountChange(account, true);
	}
	function unblockAccount(address account) external onlyOwner {
		require(_isBlocked[account], "EURION: Account is not blcoked");
		_isBlocked[account] = false;
		emit BlockedAccountChange(account, false);
	}
    function setWallets(address newLiquidityWallet, address newOperationsWallet, address newDevWallet, address newLegalWallet) external onlyOwner {
        if(liquidityWallet != newLiquidityWallet) {
            require(newLiquidityWallet != address(0), "EURION: The liquidityWallet cannot be 0");
            emit WalletChange('liquidityWallet', newLiquidityWallet, liquidityWallet);
            liquidityWallet = newLiquidityWallet;
        }
        if(operationsWallet != newOperationsWallet) {
            require(newOperationsWallet != address(0), "EURION: The operationsWallet cannot be 0");
            emit WalletChange('operationsWallet', newOperationsWallet, operationsWallet);
            operationsWallet = newOperationsWallet;
        }
        if(devWallet != newDevWallet) {
            require(newDevWallet != address(0), "EURION: The devWallet cannot be 0");
            emit WalletChange('devWallet', newDevWallet, devWallet);
            devWallet = newDevWallet;
        }
        if(legalWallet != newLegalWallet) {
            require(newLegalWallet != address(0), "EURION: The legalWallet cannot be 0");
            emit WalletChange('legalWallet', newLegalWallet, legalWallet);
            legalWallet = newLegalWallet;
        }
    }
    // Base fees
    function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy, uint8 _operationsFeeOnBuy, uint8 _devFeeOnBuy, uint8 _legalFeeOnBuy) external onlyOwner {
        _setCustomBuyTaxPeriod(_base, _liquidityFeeOnBuy, _operationsFeeOnBuy, _devFeeOnBuy, _legalFeeOnBuy);
        emit FeeChange('baseFees-Buy', _liquidityFeeOnBuy, _operationsFeeOnBuy, _devFeeOnBuy, _legalFeeOnBuy);
    }
    function setBaseFeesOnSell(uint8 _liquidityFeeOnSell,uint8 _operationsFeeOnSell , uint8 _devFeeOnSell, uint8 _legalFeeOnSell) external onlyOwner {
        _setCustomSellTaxPeriod(_base, _liquidityFeeOnSell, _operationsFeeOnSell, _devFeeOnSell, _legalFeeOnSell);
        emit FeeChange('baseFees-Sell', _liquidityFeeOnSell, _operationsFeeOnSell, _devFeeOnSell, _legalFeeOnSell);
    }
    function setUniswapRouter(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "EURION: The router already has that address");
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
        uniswapV2Pair = IFactory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
		_setAutomatedMarketMakerPair(uniswapV2Pair, true);
		_isExcludedFromMaxWalletLimit[uniswapV2Pair] = true;
		_isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;

    }
    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxTxAmount, "EURION: Cannot update maxTxAmount to same value");
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }
    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxWalletAmount, "EURION: Cannot update maxWalletAmount to same value");
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }
    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(newValue != minimumTokensBeforeSwap, "EURION: Cannot update minimumTokensBeforeSwap to same value");
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }
    function claimETHOverflow() external onlyOwner {
        uint256 amount = address(this).balance;
        (bool success,) = address(owner()).call{value : amount}("");
        if (success){
            emit ClaimETHOverflow(amount);
        }
    }

    // Getters
    function getBaseBuyFees() external view returns (uint8, uint8, uint8, uint8) {
        return (_base.liquidityFeeOnBuy, _base.operationsFeeOnBuy, _base.devFeeOnBuy, _base.legalFeeOnBuy);
    }
    function getBaseSellFees() external view returns (uint8, uint8, uint8, uint8) {
        return (_base.liquidityFeeOnSell, _base.operationsFeeOnSell, _base.devFeeOnSell, _base.legalFeeOnSell);
    }

    // Main
    function _transfer(
        address from,
        address to,
        uint256 amount
        ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool isBuyFromLp = automatedMarketMakerPairs[from];
        bool isSelltoLp = automatedMarketMakerPairs[to];

        if(!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
            require(isTradingEnabled, "EURION: Trading is currently disabled.");
            require(!_isBlocked[to], "EURION: Account is blocked");
			require(!_isBlocked[from], "EURION: Account is blocked");
            if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
                require(amount <= maxTxAmount, "EURION: Buy amount exceeds the maxTxBuyAmount.");
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "EURION: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp, from , to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }

        if (takeFee && _totalFee > 0) {
            uint256 fee = amount * _totalFee / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);
        }

        super._transfer(from, to, amount);
    }
    function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp, address from, address to) private {
        _liquidityFee = 0;
        _operationsFee = 0;
        _devFee = 0;
        _legalFee = 0;

        if (isBuyFromLp) {
            if (_isLaunched && block.number - _launchBlockNumber <= 5) {
                _liquidityFee = 100;
            } else {
                _liquidityFee = _base.liquidityFeeOnBuy;
                _operationsFee = _base.operationsFeeOnBuy;
                _devFee = _base.devFeeOnBuy;
                _legalFee = _base.legalFeeOnBuy;
            }
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
            _devFee = _base.devFeeOnSell;
            _legalFee = _base.legalFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) {
			_liquidityFee = _base.liquidityFeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
            _devFee = _base.devFeeOnSell;
            _legalFee = _base.legalFeeOnSell;
		}
        _totalFee = _liquidityFee + _operationsFee + _devFee + _legalFee;
        emit FeesApplied(_liquidityFee, _operationsFee, _devFee, _legalFee, _totalFee);
    }
    function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _operationsFeeOnSell,
        uint8 _devFeeOnSell,
        uint8 _legalFeeOnSell
        ) private {
        require((_liquidityFeeOnSell+_operationsFeeOnSell+_devFeeOnSell+_legalFeeOnSell) <= 10, "EURION: Tax exceeds maximum value of 10%");
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(_liquidityFeeOnSell, map.liquidityFeeOnSell, 'liquidityFeeOnSell', map.periodName);
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.operationsFeeOnSell != _operationsFeeOnSell) {
            emit CustomTaxPeriodChange(_operationsFeeOnSell, map.operationsFeeOnSell, 'operationsFeeOnSell', map.periodName);
            map.operationsFeeOnSell = _operationsFeeOnSell;
        }
        if (map.devFeeOnSell != _devFeeOnSell) {
            emit CustomTaxPeriodChange(_devFeeOnSell, map.devFeeOnSell, 'devFeeOnSell', map.periodName);
            map.devFeeOnSell = _devFeeOnSell;
        }
        if (map.legalFeeOnSell != _legalFeeOnSell) {
            emit CustomTaxPeriodChange(_legalFeeOnSell, map.legalFeeOnSell, 'legalFeeOnSell', map.periodName);
            map.legalFeeOnSell = _legalFeeOnSell;
        }
    }
    function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _operationsFeeOnBuy,
        uint8 _devFeeOnBuy,
        uint8 _legalFeeOnBuy
        ) private {
        require((_liquidityFeeOnBuy+_operationsFeeOnBuy+_devFeeOnBuy+_legalFeeOnBuy) <= 10, "EURION: Tax exceeds maximum value of 10%");

        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(_liquidityFeeOnBuy, map.liquidityFeeOnBuy, 'liquidityFeeOnBuy', map.periodName);
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.operationsFeeOnBuy != _operationsFeeOnBuy) {
            emit CustomTaxPeriodChange(_operationsFeeOnBuy, map.operationsFeeOnBuy, 'operationsFeeOnBuy', map.periodName);
            map.operationsFeeOnBuy = _operationsFeeOnBuy;
        }
        if (map.devFeeOnBuy != _devFeeOnBuy) {
            emit CustomTaxPeriodChange(_devFeeOnBuy, map.devFeeOnBuy, 'devFeeOnBuy', map.periodName);
            map.devFeeOnBuy = _devFeeOnBuy;
        }
        if (map.legalFeeOnBuy != _legalFeeOnBuy) {
            emit CustomTaxPeriodChange(_legalFeeOnBuy, map.legalFeeOnBuy, 'legalFeeOnBuy', map.periodName);
            map.legalFeeOnBuy = _legalFeeOnBuy;
        }
    }
    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;
        uint8 _totalFeePrior = _totalFee;

        uint256 amountToLiquify = contractBalance * _liquidityFee / _totalFeePrior / 2;
        uint256 amountToSwap = contractBalance - amountToLiquify;

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFeePrior - (_liquidityFee / 2);
        uint256 amountETHLiquidity = ETHBalanceAfterSwap * _liquidityFee / totalETHFee / 2;
        uint256 amountETHOperations = ETHBalanceAfterSwap * _operationsFee / totalETHFee;
        uint256 amountETHLegal = ETHBalanceAfterSwap * _legalFee / totalETHFee;
        uint256 amountETHDev = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHOperations + amountETHLegal);

        AddressUpgradeable.sendValue(payable(devWallet),amountETHDev);
        AddressUpgradeable.sendValue(payable(operationsWallet), amountETHOperations);
        AddressUpgradeable.sendValue(payable(legalWallet), amountETHLegal);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

        _totalFee = _totalFeePrior;
    }
    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            1, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            1, // slippage is unavoidable
            1, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"devFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"legalFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"devFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"legalFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legalWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_devFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_legalFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_devFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_legalFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newOperationsWallet","type":"address"},{"internalType":"address","name":"newDevWallet","type":"address"},{"internalType":"address","name":"newLegalWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523060805234801561001457600080fd5b5060805161477561004c60003960008181610b6901528181610ba901528181610e2901528181610e690152610efc01526147756000f3fe6080604052600436106102975760003560e01c80638129fc1c1161015a578063afa28767116100c1578063d32215761161007a578063d322157614610800578063d469801614610820578063dd62ed3e14610841578063f2fde38b14610861578063fd72e22a14610881578063fe017535146108a257600080fd5b8063afa28767146106f7578063b62496f514610718578063bea9849e14610749578063c024666814610769578063cd43e22814610789578063d2d7ad83146107e957600080fd5b806395d89b411161011357806395d89b411461064c5780639d952ce914610661578063a457c2d714610681578063a9059cbb146106a1578063aa4bde28146106c1578063aee50b1e146106d757600080fd5b80638129fc1c146105a257806383672f3e146105b7578063880bcbc1146105d75780638c0b5e22146105f75780638da5cb5b1461060d5780638ea5220f1461062b57600080fd5b806339509351116101fe57806366164f6f116101b757806366164f6f146104e257806366781291146104f757806370a0823114610517578063715018a61461054d578063781edb3c146105625780637c0a893d1461058257600080fd5b8063395093511461043a57806345a423291461045a57806349bd5a5e1461047a5780634d78fdc61461049a5780634f1ef286146104ba57806352d1902d146104cd57600080fd5b80631e293c10116102505780631e293c101461038957806323b872dd146103a957806327a14fc2146103c9578063313ce567146103e957806334cf1fea146104055780633659cfe61461041a57600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb5780630bd05b691461031b5780631694505e1461033257806318160ddd1461036a57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b5060fc546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee6108de565b6040516102d09190613e85565b34801561030757600080fd5b506102c4610316366004613ecd565b610970565b34801561032757600080fd5b5061033061098a565b005b34801561033e57600080fd5b5060fb54610352906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561037657600080fd5b506035545b6040519081526020016102d0565b34801561039557600080fd5b506103306103a4366004613ef9565b6109d1565b3480156103b557600080fd5b506102c46103c4366004613f12565b610a7a565b3480156103d557600080fd5b506103306103e4366004613ef9565b610aa0565b3480156103f557600080fd5b50604051601281526020016102d0565b34801561041157600080fd5b50610330610b48565b34801561042657600080fd5b50610330610435366004613f53565b610b5f565b34801561044657600080fd5b506102c4610455366004613ecd565b610c3e565b34801561046657600080fd5b50610330610475366004613f70565b610c60565b34801561048657600080fd5b5060fc54610352906001600160a01b031681565b3480156104a657600080fd5b506103306104b5366004613f53565b610d60565b6103306104c8366004613fc4565b610e1f565b3480156104d957600080fd5b5061037b610eef565b3480156104ee57600080fd5b50610330610fa2565b34801561050357600080fd5b5061033061051236600461409e565b61104f565b34801561052357600080fd5b5061037b610532366004613f53565b6001600160a01b031660009081526033602052604090205490565b34801561055957600080fd5b506103306110dc565b34801561056e57600080fd5b5061033061057d366004613f70565b6110ee565b34801561058e57600080fd5b5061033061059d366004613f53565b611190565b3480156105ae57600080fd5b506103306112dc565b3480156105c357600080fd5b506103306105d23660046140f2565b61186d565b3480156105e357600080fd5b506103306105f2366004613f70565b611bfd565b34801561060357600080fd5b5061037b60ff5481565b34801561061957600080fd5b5060c9546001600160a01b0316610352565b34801561063757600080fd5b5061010454610352906001600160a01b031681565b34801561065857600080fd5b506102ee611c9f565b34801561066d57600080fd5b5061033061067c36600461409e565b611cae565b34801561068d57600080fd5b506102c461069c366004613ecd565b611ce2565b3480156106ad57600080fd5b506102c46106bc366004613ecd565b611d68565b3480156106cd57600080fd5b5061037b60fe5481565b3480156106e357600080fd5b506103306106f2366004613ef9565b611d76565b34801561070357600080fd5b5061010554610352906001600160a01b031681565b34801561072457600080fd5b506102c4610733366004613f53565b6101116020526000908152604090205460ff1681565b34801561075557600080fd5b50610330610764366004613f53565b611e2b565b34801561077557600080fd5b50610330610784366004613f70565b6120c0565b34801561079557600080fd5b5061010a5460ff80821691620100008104821691600160201b8204811691600160301b9004165b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016102d0565b3480156107f557600080fd5b5061037b6101015481565b34801561080c57600080fd5b5061033061081b366004613f70565b612162565b34801561082c57600080fd5b5061010254610352906001600160a01b031681565b34801561084d57600080fd5b5061037b61085c36600461414e565b6121c3565b34801561086d57600080fd5b5061033061087c366004613f53565b6121ee565b34801561088d57600080fd5b5061010354610352906001600160a01b031681565b3480156108ae57600080fd5b5061010a5460ff610100820481169163010000008104821691600160281b8204811691600160381b9004166107bc565b6060603680546108ed9061417c565b80601f01602080910402602001604051908101604052809291908181526020018280546109199061417c565b80156109665780601f1061093b57610100808354040283529160200191610966565b820191906000526020600020905b81548152906001019060200180831161094957829003601f168201915b5050505050905090565b60003361097e818585612264565b60019150505b92915050565b610992612388565b60fc805460ff60a01b1916600160a01b179055610107546000036109cf5743610107554261010655610105805460ff60a01b1916600160a01b1790555b565b6109d9612388565b60ff548103610a475760405162461bcd60e51b815260206004820152602f60248201527f455552494f4e3a2043616e6e6f7420757064617465206d61785478416d6f756e60448201526e7420746f2073616d652076616c756560881b60648201526084015b60405180910390fd5b60ff5460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a360ff55565b600033610a888582856123e2565b610a93858585612456565b60019150505b9392505050565b610aa8612388565b60fe548103610b155760405162461bcd60e51b815260206004820152603360248201527f455552494f4e3a2043616e6e6f7420757064617465206d617857616c6c6574416044820152726d6f756e7420746f2073616d652076616c756560681b6064820152608401610a3e565b60fe5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a360fe55565b610b50612388565b60fc805460ff60a01b19169055565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ba75760405162461bcd60e51b8152600401610a3e906141b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610bf06000805160206146b9833981519152546001600160a01b031690565b6001600160a01b031614610c165760405162461bcd60e51b8152600401610a3e90614202565b610c1f81612965565b60408051600080825260208201909252610c3b9183919061296d565b50565b60003361097e818585610c5183836121c3565b610c5b9190614264565b612264565b610c68612388565b6001600160a01b0382166000908152610110602052604090205481151560ff909116151503610cff5760405162461bcd60e51b815260206004820152603860248201527f455552494f4e3a205468652073656c65637465642077616c6c6574206973206160448201527f6c72656164792073657420746f207468652076616c75652000000000000000006064820152608401610a3e565b6001600160a01b03821660008181526101106020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b610d68612388565b6001600160a01b038116600090815261010c602052604090205460ff16610dd15760405162461bcd60e51b815260206004820152601e60248201527f455552494f4e3a204163636f756e74206973206e6f7420626c636f6b656400006044820152606401610a3e565b6001600160a01b038116600081815261010c6020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610e675760405162461bcd60e51b8152600401610a3e906141b6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610eb06000805160206146b9833981519152546001600160a01b031690565b6001600160a01b031614610ed65760405162461bcd60e51b8152600401610a3e90614202565b610edf82612965565b610eeb8282600161296d565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f8f5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a3e565b506000805160206146b983398151915290565b610faa612388565b476000610fbf60c9546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611009576040519150601f19603f3d011682016040523d82523d6000602084013e61100e565b606091505b505090508015610eeb576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15050565b611057612388565b61106661010885858585612ad8565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff878116845286811660208501528581168484015284166060840152905190917f69848adfba904cea9fd12f8e800c6bae1d85101b0becc5910e509a93d81449e9919081900360800190a250505050565b6110e4612388565b6109cf6000612d7b565b6110f6612388565b6001600160a01b038216600090815261010e602052604090205481151560ff9091161515036111375760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010e6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610d54565b611198612388565b6001600160a01b038116600090815261010c602052604090205460ff161561120d5760405162461bcd60e51b815260206004820152602260248201527f455552494f4e3a204163636f756e7420697320616c726561647920626c6f636b604482015261195960f21b6064820152608401610a3e565b6101065415611289576202a300610106544261122991906142c9565b106112895760405162461bcd60e51b815260206004820152602a60248201527f455552494f4e3a2054696d6520746f20626c6f636b206163636f756e74732068604482015269185cc8195e1c1a5c995960b21b6064820152608401610a3e565b6001600160a01b038116600081815261010c6020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b600054610100900460ff16158080156112fc5750600054600160ff909116105b806113165750303b158015611316575060005460ff166001145b6113795760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3e565b6000805460ff19166001179055801561139c576000805461ff0019166101001790555b6113df6040518060400160405280600681526020016522bab934b7b760d11b8152506040518060400160405280600381526020016222a92760e91b815250612dcd565b6113e7612dfe565b6113ef612e2d565b6b033b2e3c9fd0803ce800000060fd819055612710906114109060c86142dc565b61141a9190614311565b60fe5560fd546127109061142f9060326142dc565b6114399190614311565b60ff5560fd54620186a09061144f9060326142dc565b6114599190614311565b610101556040805161016081018252636261736560e01b8152600060208083018290528284018290526003606084018190526080840152600260a0840181905260c0840152600460e08401819052610100840181905260016101208501819052610140909401939093526101088054636261736560981b6001600160c01b031990911617905561010982905561010a805467ffffffffffffffff191667010104040202030317905560c95461010280546001600160a01b039092166001600160a01b03199283168117909155610103805483168217905561010480548316821790556101058054909216179055835163c45a015560e01b81529351737a250d5630b4cf539739df2c5dacb4c659f2488d949293859363c45a01559381830193909290918290030181865afa158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b99190614325565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190614325565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169b9190614325565b60fb80546001600160a01b038086166001600160a01b03199283161790925560fc80549284169290911691909117905590506116d8816001612e54565b600161010b60006116f160c9546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815261010b90925281208054909216600190811790925561010f9061174b60c9546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553080825261010d8552838220805487166001908117909155878416835261010e95869052848320805488168217905560fb54909316825283822080548716841790558152918220805490941681179093556117dc60c9546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805491151560ff1990921691909117905561182361181b60c9546001600160a01b031690565b60fd54612f42565b50508015610c3b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b611875612388565b610102546001600160a01b0385811691161461195a576001600160a01b0384166118f15760405162461bcd60e51b815260206004820152602760248201527f455552494f4e3a20546865206c697175696469747957616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610a3e565b610102546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691861690600f01604051908190038120906000805160206146d983398151915290600090a461010280546001600160a01b0319166001600160a01b0386161790555b610103546001600160a01b03848116911614611a41576001600160a01b0383166119d75760405162461bcd60e51b815260206004820152602860248201527f455552494f4e3a20546865206f7065726174696f6e7357616c6c65742063616e60448201526706e6f7420626520360c41b6064820152608401610a3e565b610103546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691851690601001604051908190038120906000805160206146d983398151915290600090a461010380546001600160a01b0319166001600160a01b0385161790555b610104546001600160a01b03838116911614611b1a576001600160a01b038216611ab75760405162461bcd60e51b815260206004820152602160248201527f455552494f4e3a205468652064657657616c6c65742063616e6e6f74206265206044820152600360fc1b6064820152608401610a3e565b610104546040516819195d95d85b1b195d60ba1b81526001600160a01b0391821691841690600901604051908190038120906000805160206146d983398151915290600090a461010480546001600160a01b0319166001600160a01b0384161790555b610105546001600160a01b03828116911614611bf7576001600160a01b038116611b925760405162461bcd60e51b815260206004820152602360248201527f455552494f4e3a20546865206c6567616c57616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610a3e565b610105546040516a1b1959d85b15d85b1b195d60aa1b81526001600160a01b0391821691831690600b01604051908190038120906000805160206146d983398151915290600090a461010580546001600160a01b0319166001600160a01b0383161790555b50505050565b611c05612388565b6001600160a01b038216600090815261010d602052604090205481151560ff909116151503611c465760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010d6020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101610d54565b6060603780546108ed9061417c565b611cb6612388565b611cc561010885858585613021565b6040516b62617365466565732d42757960a01b8152600c01611080565b60003381611cf082866121c3565b905083811015611d505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a3e565b611d5d8286868403612264565b506001949350505050565b60003361097e818585612456565b611d7e612388565b610101548103611df65760405162461bcd60e51b815260206004820152603b60248201527f455552494f4e3a2043616e6e6f7420757064617465206d696e696d756d546f6b60448201527f656e734265666f72655377617020746f2073616d652076616c756500000000006064820152608401610a3e565b6101015460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a361010155565b611e33612388565b60fb546001600160a01b0390811690821603611ea55760405162461bcd60e51b815260206004820152602b60248201527f455552494f4e3a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b6064820152608401610a3e565b60fb546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a360fb80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015611f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5d9190614325565b6001600160a01b031663c9c653963060fb60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe39190614325565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120549190614325565b60fc80546001600160a01b0319166001600160a01b0392909216918217905561207e906001612e54565b5060fc546001600160a01b03908116600090815261010e60205260408082208054600160ff19918216811790925560fb54909416835291208054909216179055565b6120c8612388565b6001600160a01b038216600090815261010b602052604090205481151560ff9091161515036121095760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010b6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610d54565b61216a612388565b6001600160a01b038216600081815261010f6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610d54565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6121f6612388565b6001600160a01b03811661225b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3e565b610c3b81612d7b565b6001600160a01b0383166122c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3e565b6001600160a01b0382166123275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3e565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60c9546001600160a01b031633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3e565b60006123ee84846121c3565b90506000198114611bf757818110156124495760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a3e565b611bf78484848403612264565b6001600160a01b03831661247c5760405162461bcd60e51b8152600401610a3e90614342565b6001600160a01b0382166124a25760405162461bcd60e51b8152600401610a3e90614387565b806000036124bb576124b6838360006132ac565b505050565b6001600160a01b038084166000818152610111602090815260408083205494871683528083205493835261010f90915290205460ff92831692918216911615801561252057506001600160a01b038416600090815261010f602052604090205460ff16155b156127d55760fc54600160a01b900460ff1661258d5760405162461bcd60e51b815260206004820152602660248201527f455552494f4e3a2054726164696e672069732063757272656e746c792064697360448201526530b13632b21760d11b6064820152608401610a3e565b6001600160a01b038416600090815261010c602052604090205460ff16156125f75760405162461bcd60e51b815260206004820152601a60248201527f455552494f4e3a204163636f756e7420697320626c6f636b65640000000000006044820152606401610a3e565b6001600160a01b038516600090815261010c602052604090205460ff16156126615760405162461bcd60e51b815260206004820152601a60248201527f455552494f4e3a204163636f756e7420697320626c6f636b65640000000000006044820152606401610a3e565b6001600160a01b038416600090815261010d602052604090205460ff161580156126a557506001600160a01b038516600090815261010d602052604090205460ff16155b156127135760ff548311156127135760405162461bcd60e51b815260206004820152602e60248201527f455552494f4e3a2042757920616d6f756e74206578636565647320746865206d60448201526d30bc2a3c213abca0b6b7bab73a1760911b6064820152608401610a3e565b6001600160a01b038416600090815261010e602052604090205460ff166127d55760fe5483612757866001600160a01b031660009081526033602052604090205490565b6127619190614264565b11156127d55760405162461bcd60e51b815260206004820152603b60248201527f455552494f4e3a2045787065637465642077616c6c657420616d6f756e74206560448201527f78636565647320746865206d617857616c6c6574416d6f756e742e00000000006064820152608401610a3e565b6127e182828787613400565b610101543060009081526033602052604090205460fc5491111590600160a01b900460ff16801561280f5750805b801561281f57506101005460ff16155b8015612837575061011254600160201b900460ff1615155b801561285c57506001600160a01b0385166000908152610111602052604090205460ff165b1561288357610100805460ff191660011790556128776136a3565b610100805460ff191690555b6101005460009060ff161580156128a3575060fc54600160a01b900460ff165b6001600160a01b038816600090815261010b602052604090205490915060ff16806128e757506001600160a01b038616600090815261010b602052604090205460ff165b156128f0575060005b808015612909575061011254600160201b900460ff1615155b15612951576101125460009060649061292c90600160201b900460ff16886142dc565b6129369190614311565b905061294281876142c9565b955061294f8830836132ac565b505b61295c8787876132ac565b50505050505050565b610c3b612388565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156129a0576124b6836138a2565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129fa575060408051601f3d908101601f191682019092526129f7918101906143ca565b60015b612a5d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a3e565b6000805160206146b98339815191528114612acc5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a3e565b506124b683838361393e565b600a8183612ae686886143e3565b612af091906143e3565b612afa91906143e3565b60ff161115612b1b5760405162461bcd60e51b8152600401610a3e906143fc565b600285015460ff8581166101009092041614612bac57604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff6101009092048216929188169160008051602061472083398151915291612b8d9160481b90614444565b60405180910390a460028501805461ff00191661010060ff8716021790555b600285015460ff84811663010000009092041614612c4657604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028701548754919260ff63010000009092048216929187169160008051602061472083398151915291612c239160481b90614444565b60405180910390a460028501805463ff0000001916630100000060ff8616021790555b600285015460ff838116600160281b9092041614612cdb576040516b19195d91995953db94d95b1b60a21b8152600c0160405190819003812060028701548754919260ff600160281b9092048216929186169160008051602061472083398151915291612cb69160481b90614444565b60405180910390a460028501805465ff00000000001916600160281b60ff8516021790555b600285015460ff828116600160381b9092041614612d74576040516d1b1959d85b11995953db94d95b1b60921b8152600e0160405190819003812060028701548754919260ff600160381b9092048216929185169160008051602061472083398151915291612d4d9160481b90614444565b60405180910390a460028501805467ff000000000000001916600160381b60ff8416021790555b5050505050565b60c980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16612df45760405162461bcd60e51b8152600401610a3e9061445b565b610eeb8282613963565b600054610100900460ff16612e255760405162461bcd60e51b8152600401610a3e9061445b565b6109cf6139a3565b600054610100900460ff166109cf5760405162461bcd60e51b8152600401610a3e9061445b565b6001600160a01b0382166000908152610111602052604090205481151560ff909116151503612eed576040805162461bcd60e51b81526020600482015260248101919091527f455552494f4e3a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c75656064820152608401610a3e565b6001600160a01b03821660008181526101116020526040808220805460ff191685151590811790915590519092917fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a91a35050565b6001600160a01b038216612f985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a3e565b8060356000828254612faa9190614264565b90915550506001600160a01b03821660009081526033602052604081208054839290612fd7908490614264565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600a818361302f86886143e3565b61303991906143e3565b61304391906143e3565b60ff1611156130645760405162461bcd60e51b8152600401610a3e906143fc565b600285015460ff8581169116146130e557604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028701548754919260ff9182169291881691600080516020614720833981519152916130cb9160481b90614444565b60405180910390a460028501805460ff191660ff86161790555b600285015460ff84811662010000909204161461317a57604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028701548754919260ff6201000090920482169291871691600080516020614720833981519152916131599160481b90614444565b60405180910390a460028501805462ff000019166201000060ff8616021790555b600285015460ff838116600160201b909204161461320d576040516a6465764665654f6e42757960a81b8152600b0160405190819003812060028701548754919260ff600160201b90920482169291861691600080516020614720833981519152916131e99160481b90614444565b60405180910390a460028501805464ff000000001916600160201b60ff8516021790555b600285015460ff828116600160301b9092041614612d74576040516c6c6567616c4665654f6e42757960981b8152600d0160405190819003812060028701548754919260ff600160301b909204821692918516916000805160206147208339815191529161327e9160481b90614444565b60405180910390a460028501805460ff8316600160301b0266ff000000000000199091161790555050505050565b6001600160a01b0383166132d25760405162461bcd60e51b8152600401610a3e90614342565b6001600160a01b0382166132f85760405162461bcd60e51b8152600401610a3e90614387565b6001600160a01b038316600090815260336020526040902054818110156133705760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a3e565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906133a7908490614264565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133f391815260200190565b60405180910390a3611bf7565b610112805463ffffffff1916905583156134b45761010554600160a01b900460ff16801561343d57506005610107544361343a91906142c9565b11155b1561345557610112805460ff191660641790556134b4565b61010a54610112805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b850483169190910263ff000000191617600160301b909304166301000000029190911790555b82156135195761010a54610112805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b82158015613525575083155b801561356d57506001600160a01b0382166000908152610110602052604090205460ff168061356d57506001600160a01b0381166000908152610110602052604090205460ff165b156135d15761010a54610112805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b6101125460ff630100000082048116916201000081048216916135fc916101008104821691166143e3565b61360691906143e3565b61361091906143e3565b610112805460ff928316600160201b90810264ff000000001983168117938490556040805191861693861693909317815261010084048516602082015262010000840485168184015263010000008404851660608201529204909216608082015290517f6e2a5b7f71cda0b5cb7df899e2ae963197bad5b9805df7f475458f793841201c9181900360a00190a150505050565b30600090815260336020526040812054610112549091479160ff600160201b82048116929160029184916136d89116876142dc565b6136e29190614311565b6136ec9190614311565b905060006136fa82866142c9565b9050613705816139d3565b600061371185476142c9565b6101125490915060009061372a9060029060ff166144a6565b61373490866144c8565b6101125460ff918216925060009160029184916137529116866142dc565b61375c9190614311565b6137669190614311565b61011254909150600090839061378490610100900460ff16866142dc565b61378e9190614311565b6101125490915060009084906137ae906301000000900460ff16876142dc565b6137b89190614311565b90506000816137c78486614264565b6137d19190614264565b6137db90876142c9565b610104549091506137f5906001600160a01b031682613b2d565b6101035461380c906001600160a01b031684613b2d565b61010554613823906001600160a01b031683613b2d565b8715613875576138338885613c46565b60408051888152602081018690529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b5050610112805460ff909816600160201b0264ff0000000019909816979097179096555050505050505050565b6001600160a01b0381163b61390f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a3e565b6000805160206146b983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61394783613cf4565b6000825111806139545750805b156124b657611bf78383613d34565b600054610100900460ff1661398a5760405162461bcd60e51b8152600401610a3e9061445b565b60366139968382614527565b5060376124b68282614527565b600054610100900460ff166139ca5760405162461bcd60e51b8152600401610a3e9061445b565b6109cf33612d7b565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a0857613a086145e7565b6001600160a01b0392831660209182029290920181019190915260fb54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a859190614325565b81600181518110613a9857613a986145e7565b6001600160a01b03928316602091820292909201015260fb54613abe9130911684612264565b60fb5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613af79085906001908690309042906004016145fd565b600060405180830381600087803b158015613b1157600080fd5b505af1158015613b25573d6000803e3d6000fd5b505050505050565b80471015613b7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a3e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613bca576040519150601f19603f3d011682016040523d82523d6000602084013e613bcf565b606091505b50509050806124b65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a3e565b60fb54613c5e9030906001600160a01b031684612264565b60fb546101025460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613ccf573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d74919061466e565b613cfd816138a2565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b613d9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610a3e565b600080846001600160a01b031684604051613db7919061469c565b600060405180830381855af49150503d8060008114613df2576040519150601f19603f3d011682016040523d82523d6000602084013e613df7565b606091505b5091509150613e1f82826040518060600160405280602781526020016146f960279139613e28565b95945050505050565b60608315613e37575081610a99565b825115613e475782518084602001fd5b8160405162461bcd60e51b8152600401610a3e9190613e85565b60005b83811015613e7c578181015183820152602001613e64565b50506000910152565b6020815260008251806020840152613ea4816040850160208701613e61565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c3b57600080fd5b60008060408385031215613ee057600080fd5b8235613eeb81613eb8565b946020939093013593505050565b600060208284031215613f0b57600080fd5b5035919050565b600080600060608486031215613f2757600080fd5b8335613f3281613eb8565b92506020840135613f4281613eb8565b929592945050506040919091013590565b600060208284031215613f6557600080fd5b8135610a9981613eb8565b60008060408385031215613f8357600080fd5b8235613f8e81613eb8565b915060208301358015158114613fa357600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613fd757600080fd5b8235613fe281613eb8565b9150602083013567ffffffffffffffff80821115613fff57600080fd5b818501915085601f83011261401357600080fd5b81358181111561402557614025613fae565b604051601f8201601f19908116603f0116810190838211818310171561404d5761404d613fae565b8160405282815288602084870101111561406657600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b803560ff8116811461409957600080fd5b919050565b600080600080608085870312156140b457600080fd5b6140bd85614088565b93506140cb60208601614088565b92506140d960408601614088565b91506140e760608601614088565b905092959194509250565b6000806000806080858703121561410857600080fd5b843561411381613eb8565b9350602085013561412381613eb8565b9250604085013561413381613eb8565b9150606085013561414381613eb8565b939692955090935050565b6000806040838503121561416157600080fd5b823561416c81613eb8565b91506020830135613fa381613eb8565b600181811c9082168061419057607f821691505b6020821081036141b057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156109845761098461424e565b60208082526032908201527f455552494f4e3a204163636f756e7420697320616c7265616479207468652076604082015271616c7565206f6620276578636c756465642760701b606082015260800190565b818103818111156109845761098461424e565b60008160001904831182151516156142f6576142f661424e565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614320576143206142fb565b500490565b60006020828403121561433757600080fd5b8151610a9981613eb8565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156143dc57600080fd5b5051919050565b60ff81811683821601908111156109845761098461424e565b60208082526028908201527f455552494f4e3a205461782065786365656473206d6178696d756d2076616c7560408201526765206f662031302560c01b606082015260800190565b68ffffffffffffffffff1991909116815260200190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060ff8316806144b9576144b96142fb565b8060ff84160491505092915050565b60ff82811682821603908111156109845761098461424e565b601f8211156124b657600081815260208120601f850160051c810160208610156145085750805b601f850160051c820191505b81811015613b2557828155600101614514565b815167ffffffffffffffff81111561454157614541613fae565b6145558161454f845461417c565b846144e1565b602080601f83116001811461458a57600084156145725750858301515b600019600386901b1c1916600185901b178555613b25565b600085815260208120601f198616915b828110156145b95788860151825594840194600190910190840161459a565b50858210156145d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561464d5784516001600160a01b031683529383019391830191600101614628565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561468357600080fd5b8351925060208401519150604084015190509250925092565b600082516146ae818460208701613e61565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b52416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606ea26469706673582212205ebb1dd6c9ffc21795e29f0ba96cba8dba90fd988a4f37c3eff951cbb22aff1b64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102975760003560e01c80638129fc1c1161015a578063afa28767116100c1578063d32215761161007a578063d322157614610800578063d469801614610820578063dd62ed3e14610841578063f2fde38b14610861578063fd72e22a14610881578063fe017535146108a257600080fd5b8063afa28767146106f7578063b62496f514610718578063bea9849e14610749578063c024666814610769578063cd43e22814610789578063d2d7ad83146107e957600080fd5b806395d89b411161011357806395d89b411461064c5780639d952ce914610661578063a457c2d714610681578063a9059cbb146106a1578063aa4bde28146106c1578063aee50b1e146106d757600080fd5b80638129fc1c146105a257806383672f3e146105b7578063880bcbc1146105d75780638c0b5e22146105f75780638da5cb5b1461060d5780638ea5220f1461062b57600080fd5b806339509351116101fe57806366164f6f116101b757806366164f6f146104e257806366781291146104f757806370a0823114610517578063715018a61461054d578063781edb3c146105625780637c0a893d1461058257600080fd5b8063395093511461043a57806345a423291461045a57806349bd5a5e1461047a5780634d78fdc61461049a5780634f1ef286146104ba57806352d1902d146104cd57600080fd5b80631e293c10116102505780631e293c101461038957806323b872dd146103a957806327a14fc2146103c9578063313ce567146103e957806334cf1fea146104055780633659cfe61461041a57600080fd5b8063064a59d0146102a357806306fdde03146102d9578063095ea7b3146102fb5780630bd05b691461031b5780631694505e1461033257806318160ddd1461036a57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b5060fc546102c490600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102e557600080fd5b506102ee6108de565b6040516102d09190613e85565b34801561030757600080fd5b506102c4610316366004613ecd565b610970565b34801561032757600080fd5b5061033061098a565b005b34801561033e57600080fd5b5060fb54610352906001600160a01b031681565b6040516001600160a01b0390911681526020016102d0565b34801561037657600080fd5b506035545b6040519081526020016102d0565b34801561039557600080fd5b506103306103a4366004613ef9565b6109d1565b3480156103b557600080fd5b506102c46103c4366004613f12565b610a7a565b3480156103d557600080fd5b506103306103e4366004613ef9565b610aa0565b3480156103f557600080fd5b50604051601281526020016102d0565b34801561041157600080fd5b50610330610b48565b34801561042657600080fd5b50610330610435366004613f53565b610b5f565b34801561044657600080fd5b506102c4610455366004613ecd565b610c3e565b34801561046657600080fd5b50610330610475366004613f70565b610c60565b34801561048657600080fd5b5060fc54610352906001600160a01b031681565b3480156104a657600080fd5b506103306104b5366004613f53565b610d60565b6103306104c8366004613fc4565b610e1f565b3480156104d957600080fd5b5061037b610eef565b3480156104ee57600080fd5b50610330610fa2565b34801561050357600080fd5b5061033061051236600461409e565b61104f565b34801561052357600080fd5b5061037b610532366004613f53565b6001600160a01b031660009081526033602052604090205490565b34801561055957600080fd5b506103306110dc565b34801561056e57600080fd5b5061033061057d366004613f70565b6110ee565b34801561058e57600080fd5b5061033061059d366004613f53565b611190565b3480156105ae57600080fd5b506103306112dc565b3480156105c357600080fd5b506103306105d23660046140f2565b61186d565b3480156105e357600080fd5b506103306105f2366004613f70565b611bfd565b34801561060357600080fd5b5061037b60ff5481565b34801561061957600080fd5b5060c9546001600160a01b0316610352565b34801561063757600080fd5b5061010454610352906001600160a01b031681565b34801561065857600080fd5b506102ee611c9f565b34801561066d57600080fd5b5061033061067c36600461409e565b611cae565b34801561068d57600080fd5b506102c461069c366004613ecd565b611ce2565b3480156106ad57600080fd5b506102c46106bc366004613ecd565b611d68565b3480156106cd57600080fd5b5061037b60fe5481565b3480156106e357600080fd5b506103306106f2366004613ef9565b611d76565b34801561070357600080fd5b5061010554610352906001600160a01b031681565b34801561072457600080fd5b506102c4610733366004613f53565b6101116020526000908152604090205460ff1681565b34801561075557600080fd5b50610330610764366004613f53565b611e2b565b34801561077557600080fd5b50610330610784366004613f70565b6120c0565b34801561079557600080fd5b5061010a5460ff80821691620100008104821691600160201b8204811691600160301b9004165b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016102d0565b3480156107f557600080fd5b5061037b6101015481565b34801561080c57600080fd5b5061033061081b366004613f70565b612162565b34801561082c57600080fd5b5061010254610352906001600160a01b031681565b34801561084d57600080fd5b5061037b61085c36600461414e565b6121c3565b34801561086d57600080fd5b5061033061087c366004613f53565b6121ee565b34801561088d57600080fd5b5061010354610352906001600160a01b031681565b3480156108ae57600080fd5b5061010a5460ff610100820481169163010000008104821691600160281b8204811691600160381b9004166107bc565b6060603680546108ed9061417c565b80601f01602080910402602001604051908101604052809291908181526020018280546109199061417c565b80156109665780601f1061093b57610100808354040283529160200191610966565b820191906000526020600020905b81548152906001019060200180831161094957829003601f168201915b5050505050905090565b60003361097e818585612264565b60019150505b92915050565b610992612388565b60fc805460ff60a01b1916600160a01b179055610107546000036109cf5743610107554261010655610105805460ff60a01b1916600160a01b1790555b565b6109d9612388565b60ff548103610a475760405162461bcd60e51b815260206004820152602f60248201527f455552494f4e3a2043616e6e6f7420757064617465206d61785478416d6f756e60448201526e7420746f2073616d652076616c756560881b60648201526084015b60405180910390fd5b60ff5460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a360ff55565b600033610a888582856123e2565b610a93858585612456565b60019150505b9392505050565b610aa8612388565b60fe548103610b155760405162461bcd60e51b815260206004820152603360248201527f455552494f4e3a2043616e6e6f7420757064617465206d617857616c6c6574416044820152726d6f756e7420746f2073616d652076616c756560681b6064820152608401610a3e565b60fe5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a360fe55565b610b50612388565b60fc805460ff60a01b19169055565b6001600160a01b037f0000000000000000000000006f1feb5fd50f6d41993f430736c4b8abecd9f81c163003610ba75760405162461bcd60e51b8152600401610a3e906141b6565b7f0000000000000000000000006f1feb5fd50f6d41993f430736c4b8abecd9f81c6001600160a01b0316610bf06000805160206146b9833981519152546001600160a01b031690565b6001600160a01b031614610c165760405162461bcd60e51b8152600401610a3e90614202565b610c1f81612965565b60408051600080825260208201909252610c3b9183919061296d565b50565b60003361097e818585610c5183836121c3565b610c5b9190614264565b612264565b610c68612388565b6001600160a01b0382166000908152610110602052604090205481151560ff909116151503610cff5760405162461bcd60e51b815260206004820152603860248201527f455552494f4e3a205468652073656c65637465642077616c6c6574206973206160448201527f6c72656164792073657420746f207468652076616c75652000000000000000006064820152608401610a3e565b6001600160a01b03821660008181526101106020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b610d68612388565b6001600160a01b038116600090815261010c602052604090205460ff16610dd15760405162461bcd60e51b815260206004820152601e60248201527f455552494f4e3a204163636f756e74206973206e6f7420626c636f6b656400006044820152606401610a3e565b6001600160a01b038116600081815261010c6020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6001600160a01b037f0000000000000000000000006f1feb5fd50f6d41993f430736c4b8abecd9f81c163003610e675760405162461bcd60e51b8152600401610a3e906141b6565b7f0000000000000000000000006f1feb5fd50f6d41993f430736c4b8abecd9f81c6001600160a01b0316610eb06000805160206146b9833981519152546001600160a01b031690565b6001600160a01b031614610ed65760405162461bcd60e51b8152600401610a3e90614202565b610edf82612965565b610eeb8282600161296d565b5050565b6000306001600160a01b037f0000000000000000000000006f1feb5fd50f6d41993f430736c4b8abecd9f81c1614610f8f5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a3e565b506000805160206146b983398151915290565b610faa612388565b476000610fbf60c9546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611009576040519150601f19603f3d011682016040523d82523d6000602084013e61100e565b606091505b505090508015610eeb576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15050565b611057612388565b61106661010885858585612ad8565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff878116845286811660208501528581168484015284166060840152905190917f69848adfba904cea9fd12f8e800c6bae1d85101b0becc5910e509a93d81449e9919081900360800190a250505050565b6110e4612388565b6109cf6000612d7b565b6110f6612388565b6001600160a01b038216600090815261010e602052604090205481151560ff9091161515036111375760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010e6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610d54565b611198612388565b6001600160a01b038116600090815261010c602052604090205460ff161561120d5760405162461bcd60e51b815260206004820152602260248201527f455552494f4e3a204163636f756e7420697320616c726561647920626c6f636b604482015261195960f21b6064820152608401610a3e565b6101065415611289576202a300610106544261122991906142c9565b106112895760405162461bcd60e51b815260206004820152602a60248201527f455552494f4e3a2054696d6520746f20626c6f636b206163636f756e74732068604482015269185cc8195e1c1a5c995960b21b6064820152608401610a3e565b6001600160a01b038116600081815261010c6020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b600054610100900460ff16158080156112fc5750600054600160ff909116105b806113165750303b158015611316575060005460ff166001145b6113795760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3e565b6000805460ff19166001179055801561139c576000805461ff0019166101001790555b6113df6040518060400160405280600681526020016522bab934b7b760d11b8152506040518060400160405280600381526020016222a92760e91b815250612dcd565b6113e7612dfe565b6113ef612e2d565b6b033b2e3c9fd0803ce800000060fd819055612710906114109060c86142dc565b61141a9190614311565b60fe5560fd546127109061142f9060326142dc565b6114399190614311565b60ff5560fd54620186a09061144f9060326142dc565b6114599190614311565b610101556040805161016081018252636261736560e01b8152600060208083018290528284018290526003606084018190526080840152600260a0840181905260c0840152600460e08401819052610100840181905260016101208501819052610140909401939093526101088054636261736560981b6001600160c01b031990911617905561010982905561010a805467ffffffffffffffff191667010104040202030317905560c95461010280546001600160a01b039092166001600160a01b03199283168117909155610103805483168217905561010480548316821790556101058054909216179055835163c45a015560e01b81529351737a250d5630b4cf539739df2c5dacb4c659f2488d949293859363c45a01559381830193909290918290030181865afa158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b99190614325565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190614325565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169b9190614325565b60fb80546001600160a01b038086166001600160a01b03199283161790925560fc80549284169290911691909117905590506116d8816001612e54565b600161010b60006116f160c9546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815261010b90925281208054909216600190811790925561010f9061174b60c9546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553080825261010d8552838220805487166001908117909155878416835261010e95869052848320805488168217905560fb54909316825283822080548716841790558152918220805490941681179093556117dc60c9546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805491151560ff1990921691909117905561182361181b60c9546001600160a01b031690565b60fd54612f42565b50508015610c3b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b611875612388565b610102546001600160a01b0385811691161461195a576001600160a01b0384166118f15760405162461bcd60e51b815260206004820152602760248201527f455552494f4e3a20546865206c697175696469747957616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610a3e565b610102546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691861690600f01604051908190038120906000805160206146d983398151915290600090a461010280546001600160a01b0319166001600160a01b0386161790555b610103546001600160a01b03848116911614611a41576001600160a01b0383166119d75760405162461bcd60e51b815260206004820152602860248201527f455552494f4e3a20546865206f7065726174696f6e7357616c6c65742063616e60448201526706e6f7420626520360c41b6064820152608401610a3e565b610103546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691851690601001604051908190038120906000805160206146d983398151915290600090a461010380546001600160a01b0319166001600160a01b0385161790555b610104546001600160a01b03838116911614611b1a576001600160a01b038216611ab75760405162461bcd60e51b815260206004820152602160248201527f455552494f4e3a205468652064657657616c6c65742063616e6e6f74206265206044820152600360fc1b6064820152608401610a3e565b610104546040516819195d95d85b1b195d60ba1b81526001600160a01b0391821691841690600901604051908190038120906000805160206146d983398151915290600090a461010480546001600160a01b0319166001600160a01b0384161790555b610105546001600160a01b03828116911614611bf7576001600160a01b038116611b925760405162461bcd60e51b815260206004820152602360248201527f455552494f4e3a20546865206c6567616c57616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610a3e565b610105546040516a1b1959d85b15d85b1b195d60aa1b81526001600160a01b0391821691831690600b01604051908190038120906000805160206146d983398151915290600090a461010580546001600160a01b0319166001600160a01b0383161790555b50505050565b611c05612388565b6001600160a01b038216600090815261010d602052604090205481151560ff909116151503611c465760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010d6020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a409101610d54565b6060603780546108ed9061417c565b611cb6612388565b611cc561010885858585613021565b6040516b62617365466565732d42757960a01b8152600c01611080565b60003381611cf082866121c3565b905083811015611d505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a3e565b611d5d8286868403612264565b506001949350505050565b60003361097e818585612456565b611d7e612388565b610101548103611df65760405162461bcd60e51b815260206004820152603b60248201527f455552494f4e3a2043616e6e6f7420757064617465206d696e696d756d546f6b60448201527f656e734265666f72655377617020746f2073616d652076616c756500000000006064820152608401610a3e565b6101015460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a361010155565b611e33612388565b60fb546001600160a01b0390811690821603611ea55760405162461bcd60e51b815260206004820152602b60248201527f455552494f4e3a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b6064820152608401610a3e565b60fb546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a360fb80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015611f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5d9190614325565b6001600160a01b031663c9c653963060fb60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe39190614325565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120549190614325565b60fc80546001600160a01b0319166001600160a01b0392909216918217905561207e906001612e54565b5060fc546001600160a01b03908116600090815261010e60205260408082208054600160ff19918216811790925560fb54909416835291208054909216179055565b6120c8612388565b6001600160a01b038216600090815261010b602052604090205481151560ff9091161515036121095760405162461bcd60e51b8152600401610a3e90614277565b6001600160a01b038216600081815261010b6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610d54565b61216a612388565b6001600160a01b038216600081815261010f6020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610d54565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6121f6612388565b6001600160a01b03811661225b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3e565b610c3b81612d7b565b6001600160a01b0383166122c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a3e565b6001600160a01b0382166123275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a3e565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60c9546001600160a01b031633146109cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3e565b60006123ee84846121c3565b90506000198114611bf757818110156124495760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a3e565b611bf78484848403612264565b6001600160a01b03831661247c5760405162461bcd60e51b8152600401610a3e90614342565b6001600160a01b0382166124a25760405162461bcd60e51b8152600401610a3e90614387565b806000036124bb576124b6838360006132ac565b505050565b6001600160a01b038084166000818152610111602090815260408083205494871683528083205493835261010f90915290205460ff92831692918216911615801561252057506001600160a01b038416600090815261010f602052604090205460ff16155b156127d55760fc54600160a01b900460ff1661258d5760405162461bcd60e51b815260206004820152602660248201527f455552494f4e3a2054726164696e672069732063757272656e746c792064697360448201526530b13632b21760d11b6064820152608401610a3e565b6001600160a01b038416600090815261010c602052604090205460ff16156125f75760405162461bcd60e51b815260206004820152601a60248201527f455552494f4e3a204163636f756e7420697320626c6f636b65640000000000006044820152606401610a3e565b6001600160a01b038516600090815261010c602052604090205460ff16156126615760405162461bcd60e51b815260206004820152601a60248201527f455552494f4e3a204163636f756e7420697320626c6f636b65640000000000006044820152606401610a3e565b6001600160a01b038416600090815261010d602052604090205460ff161580156126a557506001600160a01b038516600090815261010d602052604090205460ff16155b156127135760ff548311156127135760405162461bcd60e51b815260206004820152602e60248201527f455552494f4e3a2042757920616d6f756e74206578636565647320746865206d60448201526d30bc2a3c213abca0b6b7bab73a1760911b6064820152608401610a3e565b6001600160a01b038416600090815261010e602052604090205460ff166127d55760fe5483612757866001600160a01b031660009081526033602052604090205490565b6127619190614264565b11156127d55760405162461bcd60e51b815260206004820152603b60248201527f455552494f4e3a2045787065637465642077616c6c657420616d6f756e74206560448201527f78636565647320746865206d617857616c6c6574416d6f756e742e00000000006064820152608401610a3e565b6127e182828787613400565b610101543060009081526033602052604090205460fc5491111590600160a01b900460ff16801561280f5750805b801561281f57506101005460ff16155b8015612837575061011254600160201b900460ff1615155b801561285c57506001600160a01b0385166000908152610111602052604090205460ff165b1561288357610100805460ff191660011790556128776136a3565b610100805460ff191690555b6101005460009060ff161580156128a3575060fc54600160a01b900460ff165b6001600160a01b038816600090815261010b602052604090205490915060ff16806128e757506001600160a01b038616600090815261010b602052604090205460ff165b156128f0575060005b808015612909575061011254600160201b900460ff1615155b15612951576101125460009060649061292c90600160201b900460ff16886142dc565b6129369190614311565b905061294281876142c9565b955061294f8830836132ac565b505b61295c8787876132ac565b50505050505050565b610c3b612388565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156129a0576124b6836138a2565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129fa575060408051601f3d908101601f191682019092526129f7918101906143ca565b60015b612a5d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a3e565b6000805160206146b98339815191528114612acc5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a3e565b506124b683838361393e565b600a8183612ae686886143e3565b612af091906143e3565b612afa91906143e3565b60ff161115612b1b5760405162461bcd60e51b8152600401610a3e906143fc565b600285015460ff8581166101009092041614612bac57604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028701548754919260ff6101009092048216929188169160008051602061472083398151915291612b8d9160481b90614444565b60405180910390a460028501805461ff00191661010060ff8716021790555b600285015460ff84811663010000009092041614612c4657604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028701548754919260ff63010000009092048216929187169160008051602061472083398151915291612c239160481b90614444565b60405180910390a460028501805463ff0000001916630100000060ff8616021790555b600285015460ff838116600160281b9092041614612cdb576040516b19195d91995953db94d95b1b60a21b8152600c0160405190819003812060028701548754919260ff600160281b9092048216929186169160008051602061472083398151915291612cb69160481b90614444565b60405180910390a460028501805465ff00000000001916600160281b60ff8516021790555b600285015460ff828116600160381b9092041614612d74576040516d1b1959d85b11995953db94d95b1b60921b8152600e0160405190819003812060028701548754919260ff600160381b9092048216929185169160008051602061472083398151915291612d4d9160481b90614444565b60405180910390a460028501805467ff000000000000001916600160381b60ff8416021790555b5050505050565b60c980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16612df45760405162461bcd60e51b8152600401610a3e9061445b565b610eeb8282613963565b600054610100900460ff16612e255760405162461bcd60e51b8152600401610a3e9061445b565b6109cf6139a3565b600054610100900460ff166109cf5760405162461bcd60e51b8152600401610a3e9061445b565b6001600160a01b0382166000908152610111602052604090205481151560ff909116151503612eed576040805162461bcd60e51b81526020600482015260248101919091527f455552494f4e3a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c75656064820152608401610a3e565b6001600160a01b03821660008181526101116020526040808220805460ff191685151590811790915590519092917fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a91a35050565b6001600160a01b038216612f985760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a3e565b8060356000828254612faa9190614264565b90915550506001600160a01b03821660009081526033602052604081208054839290612fd7908490614264565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600a818361302f86886143e3565b61303991906143e3565b61304391906143e3565b60ff1611156130645760405162461bcd60e51b8152600401610a3e906143fc565b600285015460ff8581169116146130e557604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028701548754919260ff9182169291881691600080516020614720833981519152916130cb9160481b90614444565b60405180910390a460028501805460ff191660ff86161790555b600285015460ff84811662010000909204161461317a57604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028701548754919260ff6201000090920482169291871691600080516020614720833981519152916131599160481b90614444565b60405180910390a460028501805462ff000019166201000060ff8616021790555b600285015460ff838116600160201b909204161461320d576040516a6465764665654f6e42757960a81b8152600b0160405190819003812060028701548754919260ff600160201b90920482169291861691600080516020614720833981519152916131e99160481b90614444565b60405180910390a460028501805464ff000000001916600160201b60ff8516021790555b600285015460ff828116600160301b9092041614612d74576040516c6c6567616c4665654f6e42757960981b8152600d0160405190819003812060028701548754919260ff600160301b909204821692918516916000805160206147208339815191529161327e9160481b90614444565b60405180910390a460028501805460ff8316600160301b0266ff000000000000199091161790555050505050565b6001600160a01b0383166132d25760405162461bcd60e51b8152600401610a3e90614342565b6001600160a01b0382166132f85760405162461bcd60e51b8152600401610a3e90614387565b6001600160a01b038316600090815260336020526040902054818110156133705760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a3e565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906133a7908490614264565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133f391815260200190565b60405180910390a3611bf7565b610112805463ffffffff1916905583156134b45761010554600160a01b900460ff16801561343d57506005610107544361343a91906142c9565b11155b1561345557610112805460ff191660641790556134b4565b61010a54610112805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b850483169190910263ff000000191617600160301b909304166301000000029190911790555b82156135195761010a54610112805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b82158015613525575083155b801561356d57506001600160a01b0382166000908152610110602052604090205460ff168061356d57506001600160a01b0381166000908152610110602052604090205460ff165b156135d15761010a54610112805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b90940491909116029190911790555b6101125460ff630100000082048116916201000081048216916135fc916101008104821691166143e3565b61360691906143e3565b61361091906143e3565b610112805460ff928316600160201b90810264ff000000001983168117938490556040805191861693861693909317815261010084048516602082015262010000840485168184015263010000008404851660608201529204909216608082015290517f6e2a5b7f71cda0b5cb7df899e2ae963197bad5b9805df7f475458f793841201c9181900360a00190a150505050565b30600090815260336020526040812054610112549091479160ff600160201b82048116929160029184916136d89116876142dc565b6136e29190614311565b6136ec9190614311565b905060006136fa82866142c9565b9050613705816139d3565b600061371185476142c9565b6101125490915060009061372a9060029060ff166144a6565b61373490866144c8565b6101125460ff918216925060009160029184916137529116866142dc565b61375c9190614311565b6137669190614311565b61011254909150600090839061378490610100900460ff16866142dc565b61378e9190614311565b6101125490915060009084906137ae906301000000900460ff16876142dc565b6137b89190614311565b90506000816137c78486614264565b6137d19190614264565b6137db90876142c9565b610104549091506137f5906001600160a01b031682613b2d565b6101035461380c906001600160a01b031684613b2d565b61010554613823906001600160a01b031683613b2d565b8715613875576138338885613c46565b60408051888152602081018690529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b5050610112805460ff909816600160201b0264ff0000000019909816979097179096555050505050505050565b6001600160a01b0381163b61390f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a3e565b6000805160206146b983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61394783613cf4565b6000825111806139545750805b156124b657611bf78383613d34565b600054610100900460ff1661398a5760405162461bcd60e51b8152600401610a3e9061445b565b60366139968382614527565b5060376124b68282614527565b600054610100900460ff166139ca5760405162461bcd60e51b8152600401610a3e9061445b565b6109cf33612d7b565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613a0857613a086145e7565b6001600160a01b0392831660209182029290920181019190915260fb54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a859190614325565b81600181518110613a9857613a986145e7565b6001600160a01b03928316602091820292909201015260fb54613abe9130911684612264565b60fb5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613af79085906001908690309042906004016145fd565b600060405180830381600087803b158015613b1157600080fd5b505af1158015613b25573d6000803e3d6000fd5b505050505050565b80471015613b7d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a3e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613bca576040519150601f19603f3d011682016040523d82523d6000602084013e613bcf565b606091505b50509050806124b65760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a3e565b60fb54613c5e9030906001600160a01b031684612264565b60fb546101025460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613ccf573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d74919061466e565b613cfd816138a2565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b613d9c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610a3e565b600080846001600160a01b031684604051613db7919061469c565b600060405180830381855af49150503d8060008114613df2576040519150601f19603f3d011682016040523d82523d6000602084013e613df7565b606091505b5091509150613e1f82826040518060600160405280602781526020016146f960279139613e28565b95945050505050565b60608315613e37575081610a99565b825115613e475782518084602001fd5b8160405162461bcd60e51b8152600401610a3e9190613e85565b60005b83811015613e7c578181015183820152602001613e64565b50506000910152565b6020815260008251806020840152613ea4816040850160208701613e61565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c3b57600080fd5b60008060408385031215613ee057600080fd5b8235613eeb81613eb8565b946020939093013593505050565b600060208284031215613f0b57600080fd5b5035919050565b600080600060608486031215613f2757600080fd5b8335613f3281613eb8565b92506020840135613f4281613eb8565b929592945050506040919091013590565b600060208284031215613f6557600080fd5b8135610a9981613eb8565b60008060408385031215613f8357600080fd5b8235613f8e81613eb8565b915060208301358015158114613fa357600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613fd757600080fd5b8235613fe281613eb8565b9150602083013567ffffffffffffffff80821115613fff57600080fd5b818501915085601f83011261401357600080fd5b81358181111561402557614025613fae565b604051601f8201601f19908116603f0116810190838211818310171561404d5761404d613fae565b8160405282815288602084870101111561406657600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b803560ff8116811461409957600080fd5b919050565b600080600080608085870312156140b457600080fd5b6140bd85614088565b93506140cb60208601614088565b92506140d960408601614088565b91506140e760608601614088565b905092959194509250565b6000806000806080858703121561410857600080fd5b843561411381613eb8565b9350602085013561412381613eb8565b9250604085013561413381613eb8565b9150606085013561414381613eb8565b939692955090935050565b6000806040838503121561416157600080fd5b823561416c81613eb8565b91506020830135613fa381613eb8565b600181811c9082168061419057607f821691505b6020821081036141b057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156109845761098461424e565b60208082526032908201527f455552494f4e3a204163636f756e7420697320616c7265616479207468652076604082015271616c7565206f6620276578636c756465642760701b606082015260800190565b818103818111156109845761098461424e565b60008160001904831182151516156142f6576142f661424e565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614320576143206142fb565b500490565b60006020828403121561433757600080fd5b8151610a9981613eb8565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156143dc57600080fd5b5051919050565b60ff81811683821601908111156109845761098461424e565b60208082526028908201527f455552494f4e3a205461782065786365656473206d6178696d756d2076616c7560408201526765206f662031302560c01b606082015260800190565b68ffffffffffffffffff1991909116815260200190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060ff8316806144b9576144b96142fb565b8060ff84160491505092915050565b60ff82811682821603908111156109845761098461424e565b601f8211156124b657600081815260208120601f850160051c810160208610156145085750805b601f850160051c820191505b81811015613b2557828155600101614514565b815167ffffffffffffffff81111561454157614541613fae565b6145558161454f845461417c565b846144e1565b602080601f83116001811461458a57600084156145725750858301515b600019600386901b1c1916600185901b178555613b25565b600085815260208120601f198616915b828110156145b95788860151825594840194600190910190840161459a565b50858210156145d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561464d5784516001600160a01b031683529383019391830191600101614628565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561468357600080fd5b8351925060208401519150604084015190509250925092565b600082516146ae818460208701613e61565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b52416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656400edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606ea26469706673582212205ebb1dd6c9ffc21795e29f0ba96cba8dba90fd988a4f37c3eff951cbb22aff1b64736f6c63430008100033

Deployed Bytecode Sourcemap

53385:20225:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53564:28;;;;;;;;;;-1:-1:-1;53564:28:0;;;;-1:-1:-1;;;53564:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;53564:28:0;;;;;;;;41169:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43520:201::-;;;;;;;;;;-1:-1:-1;43520:201:0;;;;;:::i;:::-;;:::i;58110:273::-;;;;;;;;;;;;;:::i;:::-;;53490:30;;;;;;;;;;-1:-1:-1;53490:30:0;;;;-1:-1:-1;;;;;53490:30:0;;;;;;-1:-1:-1;;;;;1498:32:1;;;1480:51;;1468:2;1453:18;53490:30:0;1318:219:1;42289:108:0;;;;;;;;;;-1:-1:-1;42377:12:0;;42289:108;;;1688:25:1;;;1676:2;1661:18;42289:108:0;1542:177:1;63614:270:0;;;;;;;;;;-1:-1:-1;63614:270:0;;;;;:::i;:::-;;:::i;44301:295::-;;;;;;;;;;-1:-1:-1;44301:295:0;;;;;:::i;:::-;;:::i;63890:276::-;;;;;;;;;;-1:-1:-1;63890:276:0;;;;;:::i;:::-;;:::i;42131:93::-;;;;;;;;;;-1:-1:-1;42131:93:0;;42214:2;2512:36:1;;2500:2;2485:18;42131:93:0;2370:184:1;58389:91:0;;;;;;;;;;;;;:::i;28962:200::-;;;;;;;;;;-1:-1:-1;28962:200:0;;;;;:::i;:::-;;:::i;45005:238::-;;;;;;;;;;-1:-1:-1;45005:238:0;;;;;:::i;:::-;;:::i;60032:326::-;;;;;;;;;;-1:-1:-1;60032:326:0;;;;;:::i;:::-;;:::i;53527:28::-;;;;;;;;;;-1:-1:-1;53527:28:0;;;;-1:-1:-1;;;;;53527:28:0;;;60730:210;;;;;;;;;;-1:-1:-1;60730:210:0;;;;;:::i;:::-;;:::i;29421:225::-;;;;;;:::i;:::-;;:::i;28640:133::-;;;;;;;;;;;;;:::i;64503:252::-;;;;;;;;;;;;;:::i;62624:386::-;;;;;;;;;;-1:-1:-1;62624:386:0;;;;;:::i;:::-;;:::i;42460:127::-;;;;;;;;;;-1:-1:-1;42460:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;42561:18:0;42534:7;42561:18;;;:9;:18;;;;;;;42460:127;33928:103;;;;;;;;;;;;;:::i;59687:339::-;;;;;;;;;;-1:-1:-1;59687:339:0;;;;;:::i;:::-;;:::i;60364:363::-;;;;;;;;;;-1:-1:-1;60364:363:0;;;;;:::i;:::-;;:::i;56699:1296::-;;;;;;;;;;;;;:::i;60946:1277::-;;;;;;;;;;-1:-1:-1;60946:1277:0;;;;;:::i;:::-;;:::i;59325:356::-;;;;;;;;;;-1:-1:-1;59325:356:0;;;;;:::i;:::-;;:::i;53660:26::-;;;;;;;;;;;;;;;;33280:87;;;;;;;;;;-1:-1:-1;33353:6:0;;-1:-1:-1;;;;;33353:6:0;33280:87;;53846:24;;;;;;;;;;-1:-1:-1;53846:24:0;;;;-1:-1:-1;;;;;53846:24:0;;;41388:104;;;;;;;;;;;;;:::i;62247:371::-;;;;;;;;;;-1:-1:-1;62247:371:0;;;;;:::i;:::-;;:::i;45746:436::-;;;;;;;;;;-1:-1:-1;45746:436:0;;;;;:::i;:::-;;:::i;42793:193::-;;;;;;;;;;-1:-1:-1;42793:193:0;;;;;:::i;:::-;;:::i;53623:30::-;;;;;;;;;;;;;;;;64172:325;;;;;;;;;;-1:-1:-1;64172:325:0;;;;;:::i;:::-;;:::i;53877:26::-;;;;;;;;;;-1:-1:-1;53877:26:0;;;;-1:-1:-1;;;;;53877:26:0;;;54891:58;;;;;;;;;;-1:-1:-1;54891:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63016:592;;;;;;;;;;-1:-1:-1;63016:592:0;;;;;:::i;:::-;;:::i;59017:302::-;;;;;;;;;;-1:-1:-1;59017:302:0;;;;;:::i;:::-;;:::i;64779:194::-;;;;;;;;;;-1:-1:-1;64875:23:0;;;;;;;64900:24;;;;;;-1:-1:-1;;;64926:17:0;;;;;-1:-1:-1;;;64945:19:0;;;64779:194;;;;6295:4:1;6283:17;;;6265:36;;6337:17;;;6332:2;6317:18;;6310:45;6391:17;;;6371:18;;;6364:45;;;;6445:17;;;6440:2;6425:18;;6418:45;6252:3;6237:19;64779:194:0;6050:419:1;53724:38:0;;;;;;;;;;;;;;;;58486:202;;;;;;;;;;-1:-1:-1;58486:202:0;;;;;:::i;:::-;;:::i;53771:30::-;;;;;;;;;;-1:-1:-1;53771:30:0;;;;-1:-1:-1;;;;;53771:30:0;;;43049:151;;;;;;;;;;-1:-1:-1;43049:151:0;;;;;:::i;:::-;;:::i;34186:201::-;;;;;;;;;;-1:-1:-1;34186:201:0;;;;;:::i;:::-;;:::i;53808:31::-;;;;;;;;;;-1:-1:-1;53808:31:0;;;;-1:-1:-1;;;;;53808:31:0;;;64979:199;;;;;;;;;;-1:-1:-1;65076:24:0;;;;;;;;;65102:25;;;;;;-1:-1:-1;;;65129:18:0;;;;;-1:-1:-1;;;65149:20:0;;;64979:199;;41169:100;41223:13;41256:5;41249:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41169:100;:::o;43520:201::-;43603:4;31398:10;43659:32;31398:10;43675:7;43684:6;43659:8;:32::i;:::-;43709:4;43702:11;;;43520:201;;;;;:::o;58110:273::-;33166:13;:11;:13::i;:::-;58167:16:::1;:23:::0;;-1:-1:-1;;;;58167:23:0::1;-1:-1:-1::0;;;58167:23:0::1;::::0;;58204:18:::1;::::0;58167:23;58204;58201:175:::1;;58265:12;58244:18;:33:::0;58316:15:::1;58292:21;:39:::0;58346:11:::1;:18:::0;;-1:-1:-1;;;;58346:18:0::1;-1:-1:-1::0;;;58346:18:0::1;::::0;;58201:175:::1;58110:273::o:0;63614:270::-;33166:13;:11;:13::i;:::-;63715:11:::1;;63703:8;:23:::0;63695:83:::1;;;::::0;-1:-1:-1;;;63695:83:0;;7454:2:1;63695:83:0::1;::::0;::::1;7436:21:1::0;7493:2;7473:18;;;7466:30;7532:34;7512:18;;;7505:62;-1:-1:-1;;;7583:18:1;;;7576:45;7638:19;;63695:83:0::1;;;;;;;;;63831:11;::::0;63794:49:::1;::::0;63821:8;;63794:49:::1;::::0;;;::::1;63854:11;:22:::0;63614:270::o;44301:295::-;44432:4;31398:10;44490:38;44506:4;31398:10;44521:6;44490:15;:38::i;:::-;44539:27;44549:4;44555:2;44559:6;44539:9;:27::i;:::-;44584:4;44577:11;;;44301:295;;;;;;:::o;63890:276::-;33166:13;:11;:13::i;:::-;63986:15:::1;;63974:8;:27:::0;63966:91:::1;;;::::0;-1:-1:-1;;;63966:91:0;;7870:2:1;63966:91:0::1;::::0;::::1;7852:21:1::0;7909:2;7889:18;;;7882:30;7948:34;7928:18;;;7921:62;-1:-1:-1;;;7999:18:1;;;7992:49;8058:19;;63966:91:0::1;7668:415:1::0;63966:91:0::1;64105:15;::::0;64073:48:::1;::::0;64095:8;;64073:48:::1;::::0;;;::::1;64132:15;:26:::0;63890:276::o;58389:91::-;33166:13;:11;:13::i;:::-;58448:16:::1;:24:::0;;-1:-1:-1;;;;58448:24:0::1;::::0;;58389:91::o;28962:200::-;-1:-1:-1;;;;;27512:6:0;27495:23;27503:4;27495:23;27487:80;;;;-1:-1:-1;;;27487:80:0;;;;;;;:::i;:::-;27610:6;-1:-1:-1;;;;;27586:30:0;:20;-1:-1:-1;;;;;;;;;;;19299:65:0;-1:-1:-1;;;;;19299:65:0;;19219:153;27586:20;-1:-1:-1;;;;;27586:30:0;;27578:87;;;;-1:-1:-1;;;27578:87:0;;;;;;;:::i;:::-;29046:36:::1;29064:17;29046;:36::i;:::-;29134:12;::::0;;29144:1:::1;29134:12:::0;;;::::1;::::0;::::1;::::0;;;29093:61:::1;::::0;29115:17;;29134:12;29093:21:::1;:61::i;:::-;28962:200:::0;:::o;45005:238::-;45093:4;31398:10;45149:64;31398:10;45165:7;45202:10;45174:25;31398:10;45165:7;45174:9;:25::i;:::-;:38;;;;:::i;:::-;45149:8;:64::i;60032:326::-;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;60134:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;60126:116:::1;;;::::0;-1:-1:-1;;;60126:116:0;;9378:2:1;60126:116:0::1;::::0;::::1;9360:21:1::0;9417:2;9397:18;;;9390:30;9456:34;9436:18;;;9429:62;9527:26;9507:18;;;9500:54;9571:19;;60126:116:0::1;9176:420:1::0;60126:116:0::1;-1:-1:-1::0;;;;;60247:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;60247:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;60303:50;;154:41:1;;;60303:50:0::1;::::0;127:18:1;60303:50:0::1;;;;;;;;60032:326:::0;;:::o;60730:210::-;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;60803:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;60795:62;;;::::0;-1:-1:-1;;;60795:62:0;;9803:2:1;60795:62:0::1;::::0;::::1;9785:21:1::0;9842:2;9822:18;;;9815:30;9881:32;9861:18;;;9854:60;9931:18;;60795:62:0::1;9601:354:1::0;60795:62:0::1;-1:-1:-1::0;;;;;60862:19:0;::::1;60884:5;60862:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;60862:27:0::1;::::0;;60899:36;60884:5;;60862:19;60899:36:::1;::::0;60884:5;;60899:36:::1;60730:210:::0;:::o;29421:225::-;-1:-1:-1;;;;;27512:6:0;27495:23;27503:4;27495:23;27487:80;;;;-1:-1:-1;;;27487:80:0;;;;;;;:::i;:::-;27610:6;-1:-1:-1;;;;;27586:30:0;:20;-1:-1:-1;;;;;;;;;;;19299:65:0;-1:-1:-1;;;;;19299:65:0;;19219:153;27586:20;-1:-1:-1;;;;;27586:30:0;;27578:87;;;;-1:-1:-1;;;27578:87:0;;;;;;;:::i;:::-;29539:36:::1;29557:17;29539;:36::i;:::-;29586:52;29608:17;29627:4;29633;29586:21;:52::i;:::-;29421:225:::0;;:::o;28640:133::-;28718:7;27948:4;-1:-1:-1;;;;;27957:6:0;27940:23;;27932:92;;;;-1:-1:-1;;;27932:92:0;;10162:2:1;27932:92:0;;;10144:21:1;10201:2;10181:18;;;10174:30;10240:34;10220:18;;;10213:62;10311:26;10291:18;;;10284:54;10355:19;;27932:92:0;9960:420:1;27932:92:0;-1:-1:-1;;;;;;;;;;;;28640:133:0;:::o;64503:252::-;33166:13;:11;:13::i;:::-;64578:21:::1;64561:14;64636:7;33353:6:::0;;-1:-1:-1;;;;;33353:6:0;;33280:87;64636:7:::1;-1:-1:-1::0;;;;;64628:21:0::1;64658:6;64628:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64610:59;;;64684:7;64680:68;;;64712:24;::::0;1688:25:1;;;64712:24:0::1;::::0;1676:2:1;1661:18;64712:24:0::1;;;;;;;64550:205;;64503:252::o:0;62624:386::-;33166:13;:11;:13::i;:::-;62780:105:::1;62804:5;62811:19;62832:20;62854:13;62869:15;62780:23;:105::i;:::-;62901:101;::::0;-1:-1:-1;;;10797:28:1;;10850:2;10841:12;62901:101:0::1;;::::0;;;;;::::1;::::0;;6295:4:1;6283:17;;;6265:36;;6337:17;;;6332:2;6317:18;;6310:45;6391:17;;;6371:18;;;6364:45;6445:17;;6440:2;6425:18;;6418:45;62901:101:0;;;;::::1;::::0;;;;;6252:3:1;62901:101:0;;::::1;62624:386:::0;;;;:::o;33928:103::-;33166:13;:11;:13::i;:::-;33993:30:::1;34020:1;33993:18;:30::i;59687:339::-:0;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;59792:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;59784:113:::1;;;;-1:-1:-1::0;;;59784:113:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59908:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;59908:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;59973:45;;154:41:1;;;59973:45:0::1;::::0;127:18:1;59973:45:0::1;14:187:1::0;60364:363:0;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;60436:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;60435:20;60427:67;;;::::0;-1:-1:-1;;;60427:67:0;;11485:2:1;60427:67:0::1;::::0;::::1;11467:21:1::0;11524:2;11504:18;;;11497:30;11563:34;11543:18;;;11536:62;-1:-1:-1;;;11614:18:1;;;11607:32;11656:19;;60427:67:0::1;11283:398:1::0;60427:67:0::1;60503:21;::::0;:25;60499:148:::1;;60588:6;60563:21;;60545:15;:39;;;;:::i;:::-;60544:50;60536:105;;;::::0;-1:-1:-1;;;60536:105:0;;12021:2:1;60536:105:0::1;::::0;::::1;12003:21:1::0;12060:2;12040:18;;;12033:30;12099:34;12079:18;;;12072:62;-1:-1:-1;;;12150:18:1;;;12143:40;12200:19;;60536:105:0::1;11819:406:1::0;60536:105:0::1;-1:-1:-1::0;;;;;60651:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;60651:26:0::1;60673:4;60651:26:::0;;::::1;::::0;;;60687:35;;60673:4;;60651:19;60687:35:::1;::::0;::::1;60364:363:::0;:::o;56699:1296::-;15159:19;15182:13;;;;;;15181:14;;15229:34;;;;-1:-1:-1;15247:12:0;;15262:1;15247:12;;;;:16;15229:34;15228:108;;;-1:-1:-1;15308:4:0;5921:19;:23;;;15269:66;;-1:-1:-1;15318:12:0;;;;;:17;15269:66;15206:204;;;;-1:-1:-1;;;15206:204:0;;12432:2:1;15206:204:0;;;12414:21:1;12471:2;12451:18;;;12444:30;12510:34;12490:18;;;12483:62;-1:-1:-1;;;12561:18:1;;;12554:44;12615:19;;15206:204:0;12230:410:1;15206:204:0;15421:12;:16;;-1:-1:-1;;15421:16:0;15436:1;15421:16;;;15448:67;;;;15483:13;:20;;-1:-1:-1;;15483:20:0;;;;;15448:67;56745:29:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;56745:29:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;56745:29:0::1;;::::0;:12:::1;:29::i;:::-;56779:16;:14;:16::i;:::-;56800:24;:22;:24::i;:::-;56847:21;56831:13;:37:::0;;;56913:5:::1;::::0;56891:19:::1;::::0;56907:3:::1;56891:19;:::i;:::-;:27;;;;:::i;:::-;56873:15;:45:::0;56937:13:::1;::::0;56958:5:::1;::::0;56937:18:::1;::::0;56953:2:::1;56937:18;:::i;:::-;:26;;;;:::i;:::-;56923:11;:40:::0;56994:13:::1;::::0;57015:6:::1;::::0;56994:18:::1;::::0;57010:2:::1;56994:18;:::i;:::-;:27;;;;:::i;:::-;56968:23;:53:::0;57034:43:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;57034:43:0;;-1:-1:-1;57034:43:0::1;::::0;;::::1;::::0;;;;;;;;;57061:1:::1;57034:43:::0;;;;;;;;;;57065:1:::1;57034:43:::0;;;;;;;;;;57069:1:::1;57034:43:::0;;;;;;;;;;;;57073:1:::1;57034:43:::0;;;;;;;;;;;;;;57026:5:::1;:51:::0;;-1:-1:-1;;;;;;;;;57026:51:0;;;;;;;;;;;;;-1:-1:-1;;57026:51:0;;;;;33353:6;;57084:15:::1;:25:::0;;-1:-1:-1;;;;;33353:6:0;;;-1:-1:-1;;;;;;57084:25:0;;::::1;::::0;::::1;::::0;;;57114:16:::1;:26:::0;;;::::1;::::0;::::1;::::0;;57145:9:::1;:19:::0;;;::::1;::::0;::::1;::::0;;57169:11:::1;:21:::0;;;;::::1;;::::0;;57314:26;;-1:-1:-1;;;57314:26:0;;;;57232:42:::1;::::0;-1:-1:-1;;57232:42:0;;57314:24:::1;::::0;:26;;::::1;::::0;57034:43;;57314:26;;;;;;;57232:42;57314:26:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57305:47:0::1;;57361:4;57368:16;-1:-1:-1::0;;;;;57368:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57305:87;::::0;-1:-1:-1;;;;;;57305:87:0::1;::::0;;;;;;-1:-1:-1;;;;;13561:15:1;;;57305:87:0::1;::::0;::::1;13543:34:1::0;13613:15;;13593:18;;;13586:43;13478:18;;57305:87:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57397:15;:34:::0;;-1:-1:-1;;;;;57397:34:0;;::::1;-1:-1:-1::0;;;;;;57397:34:0;;::::1;;::::0;;;57436:13:::1;:30:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;57280:112;-1:-1:-1;57471:50:0::1;57280:112:::0;57397:34;57471:28:::1;:50::i;:::-;57558:4;57528:18;:27;57547:7;33353:6:::0;;-1:-1:-1;;;;;33353:6:0;;33280:87;57547:7:::1;-1:-1:-1::0;;;;;57528:27:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;57528:27:0;;;:34;;;::::1;;-1:-1:-1::0;;57528:34:0;;::::1;;::::0;;57594:4:::1;57567:33:::0;;:18:::1;:33:::0;;;;;:40;;;;::::1;57528:34:::0;57567:40;;::::1;::::0;;;57614:29:::1;::::0;57644:7:::1;33353:6:::0;;-1:-1:-1;;;;;33353:6:0;;33280:87;57644:7:::1;-1:-1:-1::0;;;;;57614:38:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;57614:38:0;;;:45;;;::::1;;-1:-1:-1::0;;57614:45:0;;::::1;;::::0;;57709:4:::1;57666:49:::0;;;:34:::1;:49:::0;;;;;:56;;;::::1;57614:45:::0;57666:56;;::::1;::::0;;;57729:45;;::::1;::::0;;:29:::1;:45:::0;;;;;;;:52;;;::::1;::::0;::::1;::::0;;57824:15:::1;::::0;;;::::1;57786:55:::0;;;;;:62;;;::::1;::::0;::::1;::::0;;57853:44;;;;;:51;;;;::::1;::::0;::::1;::::0;;;57939:7:::1;33353:6:::0;;-1:-1:-1;;;;;33353:6:0;;33280:87;57939:7:::1;-1:-1:-1::0;;;;;57909:38:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57909:38:0;:45;;;::::1;;-1:-1:-1::0;;57909:45:0;;::::1;::::0;;;::::1;::::0;;57961:29:::1;57967:7;33353:6:::0;;-1:-1:-1;;;;;33353:6:0;;33280:87;57967:7:::1;57976:13;;57961:5;:29::i;:::-;56740:1255;;15541:14:::0;15537:102;;;15588:5;15572:21;;-1:-1:-1;;15572:21:0;;;15613:14;;-1:-1:-1;2512:36:1;;15613:14:0;;2500:2:1;2485:18;15613:14:0;;;;;;;15148:498;56699:1296::o;60946:1277::-;33166:13;:11;:13::i;:::-;61102:15:::1;::::0;-1:-1:-1;;;;;61102:37:0;;::::1;:15:::0;::::1;:37;61099:292;;-1:-1:-1::0;;;;;61164:32:0;::::1;61156:84;;;::::0;-1:-1:-1;;;61156:84:0;;14041:2:1;61156:84:0::1;::::0;::::1;14023:21:1::0;14080:2;14060:18;;;14053:30;14119:34;14099:18;;;14092:62;-1:-1:-1;;;14170:18:1;;;14163:37;14217:19;;61156:84:0::1;13839:403:1::0;61156:84:0::1;61312:15;::::0;61260:68:::1;::::0;-1:-1:-1;;;14449:30:1;;-1:-1:-1;;;;;61312:15:0;;::::1;::::0;61260:68;::::1;::::0;14504:2:1;14495:12;61260:68:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;61260:68:0;;;::::1;61343:15;:36:::0;;-1:-1:-1;;;;;;61343:36:0::1;-1:-1:-1::0;;;;;61343:36:0;::::1;;::::0;;61099:292:::1;61404:16;::::0;-1:-1:-1;;;;;61404:39:0;;::::1;:16:::0;::::1;:39;61401:301;;-1:-1:-1::0;;;;;61468:33:0;::::1;61460:86;;;::::0;-1:-1:-1;;;61460:86:0;;14720:2:1;61460:86:0::1;::::0;::::1;14702:21:1::0;14759:2;14739:18;;;14732:30;14798:34;14778:18;;;14771:62;-1:-1:-1;;;14849:18:1;;;14842:38;14897:19;;61460:86:0::1;14518:404:1::0;61460:86:0::1;61620:16;::::0;61566:71:::1;::::0;-1:-1:-1;;;15129:31:1;;-1:-1:-1;;;;;61620:16:0;;::::1;::::0;61566:71;::::1;::::0;15185:2:1;15176:12;61566:71:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;61566:71:0;;;::::1;61652:16;:38:::0;;-1:-1:-1;;;;;;61652:38:0::1;-1:-1:-1::0;;;;;61652:38:0;::::1;;::::0;;61401:301:::1;61715:9;::::0;-1:-1:-1;;;;;61715:25:0;;::::1;:9:::0;::::1;:25;61712:238;;-1:-1:-1::0;;;;;61765:26:0;::::1;61757:72;;;::::0;-1:-1:-1;;;61757:72:0;;15401:2:1;61757:72:0::1;::::0;::::1;15383:21:1::0;15440:2;15420:18;;;15413:30;15479:34;15459:18;;;15452:62;-1:-1:-1;;;15530:18:1;;;15523:31;15571:19;;61757:72:0::1;15199:397:1::0;61757:72:0::1;61889:9;::::0;61849:50:::1;::::0;-1:-1:-1;;;15803:24:1;;-1:-1:-1;;;;;61889:9:0;;::::1;::::0;61849:50;::::1;::::0;15852:1:1;15843:11;61849:50:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;61849:50:0;;;::::1;61914:9;:24:::0;;-1:-1:-1;;;;;;61914:24:0::1;-1:-1:-1::0;;;;;61914:24:0;::::1;;::::0;;61712:238:::1;61963:11;::::0;-1:-1:-1;;;;;61963:29:0;;::::1;:11:::0;::::1;:29;61960:256;;-1:-1:-1::0;;;;;62017:28:0;::::1;62009:76;;;::::0;-1:-1:-1;;;62009:76:0;;16067:2:1;62009:76:0::1;::::0;::::1;16049:21:1::0;16106:2;16086:18;;;16079:30;16145:34;16125:18;;;16118:62;-1:-1:-1;;;16196:18:1;;;16189:33;16239:19;;62009:76:0::1;15865:399:1::0;62009:76:0::1;62149:11;::::0;62105:56:::1;::::0;-1:-1:-1;;;16471:26:1;;-1:-1:-1;;;;;62149:11:0;;::::1;::::0;62105:56;::::1;::::0;16522:2:1;16513:12;62105:56:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;62105:56:0;;;::::1;62176:11;:28:::0;;-1:-1:-1;;;;;;62176:28:0::1;-1:-1:-1::0;;;;;62176:28:0;::::1;;::::0;;61960:256:::1;60946:1277:::0;;;;:::o;59325:356::-;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;59435:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;59427:118:::1;;;;-1:-1:-1::0;;;59427:118:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59556:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;59556:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;59626:47;;154:41:1;;;59626:47:0::1;::::0;127:18:1;59626:47:0::1;14:187:1::0;41388:104:0;41444:13;41477:7;41470:14;;;;;:::i;62247:371::-;33166:13;:11;:13::i;:::-;62398:100:::1;62421:5;62428:18;62448:19;62469:12;62483:14;62398:22;:100::i;:::-;62514:96;::::0;-1:-1:-1;;;16738:27:1;;16790:2;16781:12;62514:96:0::1;16536:263:1::0;45746:436:0;45839:4;31398:10;45839:4;45922:25;31398:10;45939:7;45922:9;:25::i;:::-;45895:52;;45986:15;45966:16;:35;;45958:85;;;;-1:-1:-1;;;45958:85:0;;17006:2:1;45958:85:0;;;16988:21:1;17045:2;17025:18;;;17018:30;17084:34;17064:18;;;17057:62;-1:-1:-1;;;17135:18:1;;;17128:35;17180:19;;45958:85:0;16804:401:1;45958:85:0;46079:60;46088:5;46095:7;46123:15;46104:16;:34;46079:8;:60::i;:::-;-1:-1:-1;46170:4:0;;45746:436;-1:-1:-1;;;;45746:436:0:o;42793:193::-;42872:4;31398:10;42928:28;31398:10;42945:2;42949:6;42928:9;:28::i;64172:325::-;33166:13;:11;:13::i;:::-;64276:23:::1;;64264:8;:35:::0;64256:107:::1;;;::::0;-1:-1:-1;;;64256:107:0;;17412:2:1;64256:107:0::1;::::0;::::1;17394:21:1::0;17451:2;17431:18;;;17424:30;17490:34;17470:18;;;17463:62;17561:29;17541:18;;;17534:57;17608:19;;64256:107:0::1;17210:423:1::0;64256:107:0::1;64420:23;::::0;64379:65:::1;::::0;64410:8;;64379:65:::1;::::0;;;::::1;64455:23;:34:::0;64172:325::o;63016:592::-;33166:13;:11;:13::i;:::-;63122:15:::1;::::0;-1:-1:-1;;;;;63122:15:0;;::::1;63100:38:::0;;::::1;::::0;63092:94:::1;;;::::0;-1:-1:-1;;;63092:94:0;;17840:2:1;63092:94:0::1;::::0;::::1;17822:21:1::0;17879:2;17859:18;;;17852:30;17918:34;17898:18;;;17891:62;-1:-1:-1;;;17969:18:1;;;17962:41;18020:19;;63092:94:0::1;17638:407:1::0;63092:94:0::1;63244:15;::::0;63202:59:::1;::::0;-1:-1:-1;;;;;63244:15:0;;::::1;::::0;63202:59;::::1;::::0;::::1;::::0;63244:15:::1;::::0;63202:59:::1;63272:15;:37:::0;;-1:-1:-1;;;;;;63272:37:0::1;-1:-1:-1::0;;;;;63272:37:0;::::1;::::0;;::::1;::::0;;;63345:25:::1;::::0;;-1:-1:-1;;;63345:25:0;;;;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;63272:37;63345:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63336:46:0::1;;63391:4;63398:15;;;;;;;;;-1:-1:-1::0;;;;;63398:15:0::1;-1:-1:-1::0;;;;;63398:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63336:85;::::0;-1:-1:-1;;;;;;63336:85:0::1;::::0;;;;;;-1:-1:-1;;;;;13561:15:1;;;63336:85:0::1;::::0;::::1;13543:34:1::0;13613:15;;13593:18;;;13586:43;13478:18;;63336:85:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63320:13;:101:::0;;-1:-1:-1;;;;;;63320:101:0::1;-1:-1:-1::0;;;;;63320:101:0;;;::::1;::::0;;::::1;::::0;;63426:49:::1;::::0;-1:-1:-1;63426:28:0::1;:49::i;:::-;-1:-1:-1::0;63510:13:0::1;::::0;-1:-1:-1;;;;;63510:13:0;;::::1;63480:44;::::0;;;:29:::1;:44;::::0;;;;;:51;;63527:4:::1;-1:-1:-1::0;;63480:51:0;;::::1;::::0;::::1;::::0;;;63574:15:::1;::::0;;;::::1;63536:55:::0;;;;:62;;;;::::1;;::::0;;63016:592::o;59017:302::-;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;59112:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;59104:102:::1;;;;-1:-1:-1::0;;;59104:102:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59217:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;59217:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;59271:40;;154:41:1;;;59271:40:0::1;::::0;127:18:1;59271:40:0::1;14:187:1::0;58486:202:0;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;58575:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;58575:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;58633:50;;154:41:1;;;58633:50:0::1;::::0;127:18:1;58633:50:0::1;14:187:1::0;43049:151:0;-1:-1:-1;;;;;43165:18:0;;;43138:7;43165:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;43049:151::o;34186:201::-;33166:13;:11;:13::i;:::-;-1:-1:-1;;;;;34275:22:0;::::1;34267:73;;;::::0;-1:-1:-1;;;34267:73:0;;18252:2:1;34267:73:0::1;::::0;::::1;18234:21:1::0;18291:2;18271:18;;;18264:30;18330:34;18310:18;;;18303:62;-1:-1:-1;;;18381:18:1;;;18374:36;18427:19;;34267:73:0::1;18050:402:1::0;34267:73:0::1;34351:28;34370:8;34351:18;:28::i;49371:380::-:0;-1:-1:-1;;;;;49507:19:0;;49499:68;;;;-1:-1:-1;;;49499:68:0;;18659:2:1;49499:68:0;;;18641:21:1;18698:2;18678:18;;;18671:30;18737:34;18717:18;;;18710:62;-1:-1:-1;;;18788:18:1;;;18781:34;18832:19;;49499:68:0;18457:400:1;49499:68:0;-1:-1:-1;;;;;49586:21:0;;49578:68;;;;-1:-1:-1;;;49578:68:0;;19064:2:1;49578:68:0;;;19046:21:1;19103:2;19083:18;;;19076:30;19142:34;19122:18;;;19115:62;-1:-1:-1;;;19193:18:1;;;19186:32;19235:19;;49578:68:0;18862:398:1;49578:68:0;-1:-1:-1;;;;;49659:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;49711:32;;1688:25:1;;;49711:32:0;;1661:18:1;49711:32:0;;;;;;;49371:380;;;:::o;33445:132::-;33353:6;;-1:-1:-1;;;;;33353:6:0;31398:10;33509:23;33501:68;;;;-1:-1:-1;;;33501:68:0;;19467:2:1;33501:68:0;;;19449:21:1;;;19486:18;;;19479:30;19545:34;19525:18;;;19518:62;19597:18;;33501:68:0;19265:356:1;50042:453:0;50177:24;50204:25;50214:5;50221:7;50204:9;:25::i;:::-;50177:52;;-1:-1:-1;;50244:16:0;:37;50240:248;;50326:6;50306:16;:26;;50298:68;;;;-1:-1:-1;;;50298:68:0;;19828:2:1;50298:68:0;;;19810:21:1;19867:2;19847:18;;;19840:30;19906:31;19886:18;;;19879:59;19955:18;;50298:68:0;19626:353:1;50298:68:0;50410:51;50419:5;50426:7;50454:6;50435:16;:25;50410:8;:51::i;65199:2084::-;-1:-1:-1;;;;;65335:18:0;;65327:68;;;;-1:-1:-1;;;65327:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65414:16:0;;65406:64;;;;-1:-1:-1;;;65406:64:0;;;;;;;:::i;:::-;65486:6;65496:1;65486:11;65483:92;;65514:28;65530:4;65536:2;65540:1;65514:15;:28::i;:::-;65199:2084;;;:::o;65483:92::-;-1:-1:-1;;;;;65606:31:0;;;65587:16;65606:31;;;:25;:31;;;;;;;;;65666:29;;;;;;;;;65712:35;;;:29;:35;;;;;;65606:31;;;;;65666:29;;;;65712:35;65711:36;:74;;;;-1:-1:-1;;;;;;65752:33:0;;;;;;:29;:33;;;;;;;;65751:34;65711:74;65708:727;;;65810:16;;-1:-1:-1;;;65810:16:0;;;;65802:67;;;;-1:-1:-1;;;65802:67:0;;20996:2:1;65802:67:0;;;20978:21:1;21035:2;21015:18;;;21008:30;21074:34;21054:18;;;21047:62;-1:-1:-1;;;21125:18:1;;;21118:36;21171:19;;65802:67:0;20794:402:1;65802:67:0;-1:-1:-1;;;;;65893:14:0;;;;;;:10;:14;;;;;;;;65892:15;65884:54;;;;-1:-1:-1;;;65884:54:0;;21403:2:1;65884:54:0;;;21385:21:1;21442:2;21422:18;;;21415:30;21481:28;21461:18;;;21454:56;21527:18;;65884:54:0;21201:350:1;65884:54:0;-1:-1:-1;;;;;65953:16:0;;;;;;:10;:16;;;;;;;;65952:17;65944:56;;;;-1:-1:-1;;;65944:56:0;;21403:2:1;65944:56:0;;;21385:21:1;21442:2;21422:18;;;21415:30;21481:28;21461:18;;;21454:56;21527:18;;65944:56:0;21201:350:1;65944:56:0;-1:-1:-1;;;;;66020:38:0;;;;;;:34;:38;;;;;;;;66019:39;:84;;;;-1:-1:-1;;;;;;66063:40:0;;;;;;:34;:40;;;;;;;;66062:41;66019:84;66015:205;;;66142:11;;66132:6;:21;;66124:80;;;;-1:-1:-1;;;66124:80:0;;21758:2:1;66124:80:0;;;21740:21:1;21797:2;21777:18;;;21770:30;21836:34;21816:18;;;21809:62;-1:-1:-1;;;21887:18:1;;;21880:44;21941:19;;66124:80:0;21556:410:1;66124:80:0;-1:-1:-1;;;;;66239:33:0;;;;;;:29;:33;;;;;;;;66234:190;;66329:15;;66318:6;66302:13;66312:2;-1:-1:-1;;;;;42561:18:0;42534:7;42561:18;;;:9;:18;;;;;;;42460:127;66302:13;:22;;;;:::i;:::-;66301:43;;66293:115;;;;-1:-1:-1;;;66293:115:0;;22173:2:1;66293:115:0;;;22155:21:1;22212:2;22192:18;;;22185:30;22251:34;22231:18;;;22224:62;22322:29;22302:18;;;22295:57;22369:19;;66293:115:0;21971:423:1;66293:115:0;66447:48;66460:11;66473:10;66485:4;66492:2;66447:12;:48::i;:::-;66549:23;;66539:4;66506:12;42561:18;;;:9;:18;;;;;;66603:16;;-1:-1:-1;;66521:51:0;;-1:-1:-1;;;66603:16:0;;;;:40;;;;;66636:7;66603:40;:67;;;;-1:-1:-1;66661:9:0;;;;66660:10;66603:67;:97;;;;-1:-1:-1;66687:9:0;;-1:-1:-1;;;66687:9:0;;;;:13;;66603:97;:143;;;;-1:-1:-1;;;;;;66717:29:0;;;;;;:25;:29;;;;;;;;66603:143;66585:280;;;66773:9;:16;;-1:-1:-1;;66773:16:0;66785:4;66773:16;;;66804:17;:15;:17::i;:::-;66836:9;:17;;-1:-1:-1;;66836:17:0;;;66585:280;66893:9;;66877:12;;66893:9;;66892:10;:30;;;;-1:-1:-1;66906:16:0;;-1:-1:-1;;;66906:16:0;;;;66892:30;-1:-1:-1;;;;;66938:24:0;;;;;;:18;:24;;;;;;66877:45;;-1:-1:-1;66938:24:0;;;:50;;-1:-1:-1;;;;;;66966:22:0;;;;;;:18;:22;;;;;;;;66938:50;66935:96;;;-1:-1:-1;67014:5:0;66935:96;67047:7;:24;;;;-1:-1:-1;67058:9:0;;-1:-1:-1;;;67058:9:0;;;;:13;;67047:24;67043:187;;;67111:9;;67088:11;;67123:3;;67102:18;;-1:-1:-1;;;67111:9:0;;;;67102:6;:18;:::i;:::-;:24;;;;:::i;:::-;67088:38;-1:-1:-1;67150:12:0;67088:38;67150:6;:12;:::i;:::-;67141:21;;67177:41;67193:4;67207;67214:3;67177:15;:41::i;:::-;67073:157;67043:187;67242:33;67258:4;67264:2;67268:6;67242:15;:33::i;:::-;65316:1967;;;;65199:2084;;;:::o;58003:83::-;33166:13;:11;:13::i;20637:992::-;18590:66;21091:59;;;21087:535;;;21167:37;21186:17;21167:18;:37::i;21087:535::-;21270:17;-1:-1:-1;;;;;21241:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21241:63:0;;;;;;;;-1:-1:-1;;21241:63:0;;;;;;;;;;;;:::i;:::-;;;21237:306;;21471:56;;-1:-1:-1;;;21471:56:0;;22790:2:1;21471:56:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:34;22848:18;;;22841:62;-1:-1:-1;;;22919:18:1;;;22912:44;22973:19;;21471:56:0;22588:410:1;21237:306:0;-1:-1:-1;;;;;;;;;;;21355:28:0;;21347:82;;;;-1:-1:-1;;;21347:82:0;;23205:2:1;21347:82:0;;;23187:21:1;23244:2;23224:18;;;23217:30;23283:34;23263:18;;;23256:62;-1:-1:-1;;;23334:18:1;;;23327:39;23383:19;;21347:82:0;23003:405:1;21347:82:0;21305:140;21557:53;21575:17;21594:4;21600:9;21557:17;:53::i;68625:1326::-;68935:2;68915:15;68901:13;68860:40;68880:20;68860:19;:40;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;68859:78;;;;68851:131;;;;-1:-1:-1;;;68851:131:0;;;;;;;:::i;:::-;68997:22;;;;:45;;;;:22;;;;;:45;68993:246;;69064:104;;-1:-1:-1;;;24177:33:1;;24235:2;24226:12;69064:104:0;;;;;;;;69107:22;;;;69153:14;;69064:104;;69107:22;;;;;;;;69064:104;;;;-1:-1:-1;;;;;;;;;;;69064:104:0;;;69153:14;;;69064:104;:::i;:::-;;;;;;;;69183:22;;;:44;;-1:-1:-1;;69183:44:0;;;;;;;;;68993:246;69253:23;;;;:47;;;;:23;;;;;:47;69249:253;;69322:107;;-1:-1:-1;;;24665:34:1;;24724:2;24715:12;69322:107:0;;;;;;;;69366:23;;;;69414:14;;69322:107;;69366:23;;;;;;;;69322:107;;;;-1:-1:-1;;;;;;;;;;;69322:107:0;;;69414:14;;;69322:107;:::i;:::-;;;;;;;;69444:23;;;:46;;-1:-1:-1;;69444:46:0;;;;;;;;;69249:253;69516:16;;;;:33;;;;-1:-1:-1;;;69516:16:0;;;;:33;69512:204;;69571:86;;-1:-1:-1;;;24940:27:1;;24992:2;24983:12;69571:86:0;;;;;;;;69608:16;;;;69642:14;;69571:86;;69608:16;-1:-1:-1;;;69608:16:0;;;;;;69571:86;;;;-1:-1:-1;;;;;;;;;;;69571:86:0;;;69642:14;;;69571:86;:::i;:::-;;;;;;;;69672:16;;;:32;;-1:-1:-1;;69672:32:0;-1:-1:-1;;;69672:32:0;;;;;;;69512:204;69730:18;;;;:37;;;;-1:-1:-1;;;69730:18:0;;;;:37;69726:218;;69789:92;;-1:-1:-1;;;25208:29:1;;25262:2;25253:12;69789:92:0;;;;;;;;69828:18;;;;69866:14;;69789:92;;69828:18;-1:-1:-1;;;69828:18:0;;;;;;69789:92;;;;-1:-1:-1;;;;;;;;;;;69789:92:0;;;69866:14;;;69789:92;:::i;:::-;;;;;;;;69896:18;;;:36;;-1:-1:-1;;69896:36:0;-1:-1:-1;;;69896:36:0;;;;;;;69726:218;68625:1326;;;;;:::o;34547:191::-;34640:6;;;-1:-1:-1;;;;;34657:17:0;;;-1:-1:-1;;;;;;34657:17:0;;;;;;;34690:40;;34640:6;;;34657:17;34640:6;;34690:40;;34621:16;;34690:40;34610:128;34547:191;:::o;40780:149::-;17000:13;;;;;;;16992:69;;;;-1:-1:-1;;;16992:69:0;;;;;;;:::i;:::-;40883:38:::1;40906:5;40913:7;40883:22;:38::i;32823:97::-:0;17000:13;;;;;;;16992:69;;;;-1:-1:-1;;;16992:69:0;;;;;;;:::i;:::-;32886:26:::1;:24;:26::i;26640:68::-:0;17000:13;;;;;;;16992:69;;;;-1:-1:-1;;;16992:69:0;;;;;;;:::i;58694:317::-;-1:-1:-1;;;;;58785:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;58777:117;;;;;-1:-1:-1;;;58777:117:0;;25890:2:1;58777:117:0;;;25872:21:1;25909:18;;;25902:30;;;;25968:34;25948:18;;;25941:62;26039:34;26019:18;;;26012:62;26091:19;;58777:117:0;25688:428:1;58777:117:0;-1:-1:-1;;;;;58905:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;58905:39:0;;;;;;;;;;58960:43;;58905:39;;:31;58960:43;;;58694:317;;:::o;47610:399::-;-1:-1:-1;;;;;47694:21:0;;47686:65;;;;-1:-1:-1;;;47686:65:0;;26323:2:1;47686:65:0;;;26305:21:1;26362:2;26342:18;;;26335:30;26401:33;26381:18;;;26374:61;26452:18;;47686:65:0;26121:355:1;47686:65:0;47842:6;47826:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;47859:18:0;;;;;;:9;:18;;;;;:28;;47881:6;;47859:18;:28;;47881:6;;47859:28;:::i;:::-;;;;-1:-1:-1;;47903:37:0;;1688:25:1;;;-1:-1:-1;;;;;47903:37:0;;;47920:1;;47903:37;;1676:2:1;1661:18;47903:37:0;;;;;;;29421:225;;:::o;69957:1291::-;70258:2;70239:14;70226:12;70187:38;70206:19;70187:18;:38;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;70186:74;;;;70178:127;;;;-1:-1:-1;;;70178:127:0;;;;;;;:::i;:::-;70322:21;;;;:43;;;;:21;;:43;70318:239;;70387:101;;-1:-1:-1;;;26683:32:1;;26740:2;26731:12;70387:101:0;;;;;;;;70429:21;;;;70473:14;;70387:101;;70429:21;;;;;70387:101;;;;-1:-1:-1;;;;;;;;;;;70387:101:0;;;70473:14;;;70387:101;:::i;:::-;;;;;;;;70503:21;;;:42;;-1:-1:-1;;70503:42:0;;;;;;;70318:239;70571:22;;;;:45;;;;:22;;;;;:45;70567:246;;70638:104;;-1:-1:-1;;;26956:33:1;;27014:2;27005:12;70638:104:0;;;;;;;;70681:22;;;;70727:14;;70638:104;;70681:22;;;;;;;;70638:104;;;;-1:-1:-1;;;;;;;;;;;70638:104:0;;;70727:14;;;70638:104;:::i;:::-;;;;;;;;70757:22;;;:44;;-1:-1:-1;;70757:44:0;;;;;;;;;70567:246;70827:15;;;;:31;;;;-1:-1:-1;;;70827:15:0;;;;:31;70823:197;;70880:83;;-1:-1:-1;;;27230:26:1;;27281:2;27272:12;70880:83:0;;;;;;;;70916:15;;;;70948:14;;70880:83;;70916:15;-1:-1:-1;;;70916:15:0;;;;;;70880:83;;;;-1:-1:-1;;;;;;;;;;;70880:83:0;;;70948:14;;;70880:83;:::i;:::-;;;;;;;;70978:15;;;:30;;-1:-1:-1;;70978:30:0;-1:-1:-1;;;70978:30:0;;;;;;;70823:197;71034:17;;;;:35;;;;-1:-1:-1;;;71034:17:0;;;;:35;71030:211;;71091:89;;-1:-1:-1;;;27497:28:1;;27550:2;27541:12;71091:89:0;;;;;;;;71129:17;;;;71165:14;;71091:89;;71129:17;-1:-1:-1;;;71129:17:0;;;;;;71091:89;;;;-1:-1:-1;;;;;;;;;;;71091:89:0;;;71165:14;;;71091:89;:::i;:::-;;;;;;;;71195:17;;;:34;;;;;-1:-1:-1;;;71195:34:0;-1:-1:-1;;71195:34:0;;;;;;69957:1291;;;;;:::o;46652:671::-;-1:-1:-1;;;;;46783:18:0;;46775:68;;;;-1:-1:-1;;;46775:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46862:16:0;;46854:64;;;;-1:-1:-1;;;46854:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47004:15:0;;46982:19;47004:15;;;:9;:15;;;;;;47038:21;;;;47030:72;;;;-1:-1:-1;;;47030:72:0;;27766:2:1;47030:72:0;;;27748:21:1;27805:2;27785:18;;;27778:30;27844:34;27824:18;;;27817:62;-1:-1:-1;;;27895:18:1;;;27888:36;27941:19;;47030:72:0;27564:402:1;47030:72:0;-1:-1:-1;;;;;47138:15:0;;;;;;;:9;:15;;;;;;47156:20;;;47138:38;;47198:13;;;;;;;;:23;;47170:6;;47138:15;47198:23;;47170:6;;47198:23;:::i;:::-;;;;;;;;47254:2;-1:-1:-1;;;;;47239:26:0;47248:4;-1:-1:-1;;;;;47239:26:0;;47258:6;47239:26;;;;1688:25:1;;1676:2;1661:18;;1542:177;47239:26:0;;;;;;;;47278:37;65199:2084;67289:1330;67391:13;:17;;-1:-1:-1;;67470:13:0;;;67496:392;;;;67532:11;;-1:-1:-1;;;67532:11:0;;;;:53;;;;;67584:1;67562:18;;67547:12;:33;;;;:::i;:::-;:38;;67532:53;67528:349;;;67606:13;:19;;-1:-1:-1;;67606:19:0;67622:3;67606:19;;;67528:349;;;67682:23;;67666:13;:39;;67682:23;;;;-1:-1:-1;;67724:41:0;;;;;;;67682:23;67741:24;;;;;;67724:41;;;;;;;;-1:-1:-1;;67830:31:0;-1:-1:-1;;;67794:17:0;;;;67784:27;;;;-1:-1:-1;;67830:31:0;;-1:-1:-1;;;67842:19:0;;;;67830:31;;;;;;;;67528:349;67902:10;67898:230;;;67945:24;;67929:13;:40;;67945:24;;;;;;;;-1:-1:-1;;67984:42:0;;;;;;;68001:25;;;;;;67984:42;;;;;-1:-1:-1;;68084:32:0;-1:-1:-1;;;68051:18:0;;;;68041:28;;-1:-1:-1;;68084:32:0;;-1:-1:-1;;;68096:20:0;;;;;;;68084:32;;;;;;;67898:230;68143:10;68142:11;:27;;;;;68158:11;68157:12;68142:27;:105;;;;-1:-1:-1;;;;;;68174:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;68213:33:0;;;;;;:29;:33;;;;;;;;68174:72;68138:310;;;68271:24;;68255:13;:40;;68271:24;;;;;;;;-1:-1:-1;;68310:42:0;;;;;;;68327:25;;;;;;68310:42;;;;;-1:-1:-1;;68410:32:0;-1:-1:-1;;;68377:18:0;;;;68367:28;;-1:-1:-1;;68410:32:0;;-1:-1:-1;;;68422:20:0;;;;;;;68410:32;;;;;;;68138:310;68513:9;;;;;;;;;68503:7;;;;;;68470:30;;68513:9;68486:14;;;;;68470:13;:30;:::i;:::-;:40;;;;:::i;:::-;:52;;;;:::i;:::-;68458:9;:64;;;;;;-1:-1:-1;;;68458:64:0;;;-1:-1:-1;;68458:64:0;;;;;;;;68538:73;;;68550:13;;;;;;;;;;28210:36:1;;68458:64:0;68565:14;;;;28277:2:1;28262:18;;28255:45;68581:7:0;;;;;28316:18:1;;;28309:45;68590:9:0;;;;;28385:2:1;28370:18;;28363:45;68601:9:0;;;;;28439:3:1;28424:19;;28417:46;68538:73:0;;;;;;;28197:3:1;68538:73:0;;;67289:1330;;;;:::o;71254:1418::-;71344:4;71300:23;42561:18;;;:9;:18;;;;;;71444:9;;42561:18;;71389:21;;71444:9;-1:-1:-1;;;71444:9:0;;;;;71300:23;71543:1;;71444:9;;71492:31;;71510:13;42561:18;71492:31;:::i;:::-;:48;;;;:::i;:::-;:52;;;;:::i;:::-;71466:78;-1:-1:-1;71555:20:0;71578:33;71466:78;71578:15;:33;:::i;:::-;71555:56;;71624:31;71642:12;71624:17;:31::i;:::-;71668:27;71698:41;71722:17;71698:21;:41;:::i;:::-;71790:13;;71668:71;;-1:-1:-1;71750:19:0;;71790:17;;71806:1;;71790:13;;:17;:::i;:::-;71772:36;;:14;:36;:::i;:::-;71870:13;;71750:58;;;;;-1:-1:-1;71819:26:0;;71900:1;;71750:58;;71848:35;;71870:13;71848:19;:35;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;71964:14;;71819:82;;-1:-1:-1;71912:27:0;;71981:11;;71942:36;;71964:14;;;;;71942:19;:36;:::i;:::-;:50;;;;:::i;:::-;72050:9;;71912:80;;-1:-1:-1;72003:22:0;;72062:11;;72028:31;;72050:9;;;;;72028:19;:31;:::i;:::-;:45;;;;:::i;:::-;72003:70;-1:-1:-1;72084:20:0;72003:70;72130:40;72151:19;72130:18;:40;:::i;:::-;:57;;;;:::i;:::-;72107:81;;:19;:81;:::i;:::-;72238:9;;72084:104;;-1:-1:-1;72201:61:0;;-1:-1:-1;;;;;72238:9:0;72084:104;72201:28;:61::i;:::-;72310:16;;72273:76;;-1:-1:-1;;;;;72310:16:0;72329:19;72273:28;:76::i;:::-;72397:11;;72360:66;;-1:-1:-1;;;;;72397:11:0;72411:14;72360:28;:66::i;:::-;72443:19;;72439:187;;72479:50;72493:15;72510:18;72479:13;:50::i;:::-;72549:65;;;29002:25:1;;;29058:2;29043:18;;29036:34;;;29086:18;;;29079:34;;;72549:65:0;;28990:2:1;28975:18;72549:65:0;;;;;;;72439:187;-1:-1:-1;;72638:9:0;:26;;;;;;-1:-1:-1;;;72638:26:0;-1:-1:-1;;72638:26:0;;;;;;;;;;-1:-1:-1;;;;;;;;71254:1418:0:o;19468:284::-;-1:-1:-1;;;;;5921:19:0;;;19542:106;;;;-1:-1:-1;;;19542:106:0;;29326:2:1;19542:106:0;;;29308:21:1;29365:2;29345:18;;;29338:30;29404:34;29384:18;;;29377:62;-1:-1:-1;;;29455:18:1;;;29448:43;29508:19;;19542:106:0;29124:409:1;19542:106:0;-1:-1:-1;;;;;;;;;;;19659:85:0;;-1:-1:-1;;;;;;19659:85:0;-1:-1:-1;;;;;19659:85:0;;;;;;;;;;19468:284::o;20161:297::-;20304:29;20315:17;20304:10;:29::i;:::-;20362:1;20348:4;:11;:15;:28;;;;20367:9;20348:28;20344:107;;;20393:46;20415:17;20434:4;20393:21;:46::i;40937:162::-;17000:13;;;;;;;16992:69;;;;-1:-1:-1;;;16992:69:0;;;;;;;:::i;:::-;41050:5:::1;:13;41058:5:::0;41050;:13:::1;:::i;:::-;-1:-1:-1::0;41074:7:0::1;:17;41084:7:::0;41074;:17:::1;:::i;32928:113::-:0;17000:13;;;;;;;16992:69;;;;-1:-1:-1;;;16992:69:0;;;;;;;:::i;:::-;33001:32:::1;31398:10:::0;33001:18:::1;:32::i;72678:500::-:0;72769:16;;;72783:1;72769:16;;;;;;;;72745:21;;72769:16;;;;;;;;;;-1:-1:-1;72769:16:0;72745:40;;72814:4;72796;72801:1;72796:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72796:23:0;;;:7;;;;;;;;;;:23;;;;72840:15;;:22;;;-1:-1:-1;;;72840:22:0;;;;:15;;;;;:20;;:22;;;;;72796:7;;72840:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72830:4;72835:1;72830:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72830:32:0;;;:7;;;;;;;;;:32;72905:15;;72873:62;;72890:4;;72905:15;72923:11;72873:8;:62::i;:::-;72946:15;;:224;;-1:-1:-1;;;72946:224:0;;-1:-1:-1;;;;;72946:15:0;;;;:66;;:224;;73027:11;;72946:15;;73097:4;;73124;;73144:15;;72946:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72734:444;72678:500;:::o;6887:317::-;7002:6;6977:21;:31;;6969:73;;;;-1:-1:-1;;;6969:73:0;;33061:2:1;6969:73:0;;;33043:21:1;33100:2;33080:18;;;33073:30;33139:31;33119:18;;;33112:59;33188:18;;6969:73:0;32859:353:1;6969:73:0;7056:12;7074:9;-1:-1:-1;;;;;7074:14:0;7096:6;7074:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7055:52;;;7126:7;7118:78;;;;-1:-1:-1;;;7118:78:0;;33419:2:1;7118:78:0;;;33401:21:1;33458:2;33438:18;;;33431:30;33497:34;33477:18;;;33470:62;33568:28;33548:18;;;33541:56;33614:19;;7118:78:0;33217:422:1;73184:423:0;73298:15;;73266:62;;73283:4;;-1:-1:-1;;;;;73298:15:0;73316:11;73266:8;:62::i;:::-;73339:15;;73543;;73339:260;;-1:-1:-1;;;73339:260:0;;73411:4;73339:260;;;33985:34:1;34035:18;;;34028:34;;;73339:15:0;34078:18:1;;;34071:34;;;34121:18;;;34114:34;-1:-1:-1;;;;;73543:15:0;;;34164:19:1;;;34157:44;73573:15:0;34217:19:1;;;34210:35;73339:15:0;;;:31;;73378:9;;33919:19:1;;73339:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19865:155::-;19932:37;19951:17;19932:18;:37::i;:::-;19985:27;;-1:-1:-1;;;;;19985:27:0;;;;;;;;19865:155;:::o;24898:461::-;24981:12;-1:-1:-1;;;;;5921:19:0;;;25006:88;;;;-1:-1:-1;;;25006:88:0;;34769:2:1;25006:88:0;;;34751:21:1;34808:2;34788:18;;;34781:30;34847:34;34827:18;;;34820:62;-1:-1:-1;;;34898:18:1;;;34891:36;34944:19;;25006:88:0;34567:402:1;25006:88:0;25168:12;25182:23;25209:6;-1:-1:-1;;;;;25209:19:0;25229:4;25209:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25167:67;;;;25252:99;25288:7;25297:10;25252:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;25245:106;24898:461;-1:-1:-1;;;;;24898:461:0:o;11200:762::-;11350:12;11379:7;11375:580;;;-1:-1:-1;11410:10:0;11403:17;;11375:580;11524:17;;:21;11520:424;;11772:10;11766:17;11833:15;11820:10;11816:2;11812:19;11805:44;11520:424;11915:12;11908:20;;-1:-1:-1;;;11908:20:0;;;;;;;;:::i;206:250:1:-;291:1;301:113;315:6;312:1;309:13;301:113;;;391:11;;;385:18;372:11;;;365:39;337:2;330:10;301:113;;;-1:-1:-1;;448:1:1;430:16;;423:27;206:250::o;461:396::-;610:2;599:9;592:21;573:4;642:6;636:13;685:6;680:2;669:9;665:18;658:34;701:79;773:6;768:2;757:9;753:18;748:2;740:6;736:15;701:79;:::i;:::-;841:2;820:15;-1:-1:-1;;816:29:1;801:45;;;;848:2;797:54;;461:396;-1:-1:-1;;461:396:1:o;862:131::-;-1:-1:-1;;;;;937:31:1;;927:42;;917:70;;983:1;980;973:12;998:315;1066:6;1074;1127:2;1115:9;1106:7;1102:23;1098:32;1095:52;;;1143:1;1140;1133:12;1095:52;1182:9;1169:23;1201:31;1226:5;1201:31;:::i;:::-;1251:5;1303:2;1288:18;;;;1275:32;;-1:-1:-1;;;998:315:1:o;1724:180::-;1783:6;1836:2;1824:9;1815:7;1811:23;1807:32;1804:52;;;1852:1;1849;1842:12;1804:52;-1:-1:-1;1875:23:1;;1724:180;-1:-1:-1;1724:180:1:o;1909:456::-;1986:6;1994;2002;2055:2;2043:9;2034:7;2030:23;2026:32;2023:52;;;2071:1;2068;2061:12;2023:52;2110:9;2097:23;2129:31;2154:5;2129:31;:::i;:::-;2179:5;-1:-1:-1;2236:2:1;2221:18;;2208:32;2249:33;2208:32;2249:33;:::i;:::-;1909:456;;2301:7;;-1:-1:-1;;;2355:2:1;2340:18;;;;2327:32;;1909:456::o;2559:247::-;2618:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;2811:416::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2992:9;2979:23;3011:31;3036:5;3011:31;:::i;:::-;3061:5;-1:-1:-1;3118:2:1;3103:18;;3090:32;3160:15;;3153:23;3141:36;;3131:64;;3191:1;3188;3181:12;3131:64;3214:7;3204:17;;;2811:416;;;;;:::o;3440:127::-;3501:10;3496:3;3492:20;3489:1;3482:31;3532:4;3529:1;3522:15;3556:4;3553:1;3546:15;3572:1056;3649:6;3657;3710:2;3698:9;3689:7;3685:23;3681:32;3678:52;;;3726:1;3723;3716:12;3678:52;3765:9;3752:23;3784:31;3809:5;3784:31;:::i;:::-;3834:5;-1:-1:-1;3890:2:1;3875:18;;3862:32;3913:18;3943:14;;;3940:34;;;3970:1;3967;3960:12;3940:34;4008:6;3997:9;3993:22;3983:32;;4053:7;4046:4;4042:2;4038:13;4034:27;4024:55;;4075:1;4072;4065:12;4024:55;4111:2;4098:16;4133:2;4129;4126:10;4123:36;;;4139:18;;:::i;:::-;4214:2;4208:9;4182:2;4268:13;;-1:-1:-1;;4264:22:1;;;4288:2;4260:31;4256:40;4244:53;;;4312:18;;;4332:22;;;4309:46;4306:72;;;4358:18;;:::i;:::-;4398:10;4394:2;4387:22;4433:2;4425:6;4418:18;4473:7;4468:2;4463;4459;4455:11;4451:20;4448:33;4445:53;;;4494:1;4491;4484:12;4445:53;4550:2;4545;4541;4537:11;4532:2;4524:6;4520:15;4507:46;4595:1;4590:2;4585;4577:6;4573:15;4569:24;4562:35;4616:6;4606:16;;;;;;;3572:1056;;;;;:::o;4815:156::-;4881:20;;4941:4;4930:16;;4920:27;;4910:55;;4961:1;4958;4951:12;4910:55;4815:156;;;:::o;4976:393::-;5054:6;5062;5070;5078;5131:3;5119:9;5110:7;5106:23;5102:33;5099:53;;;5148:1;5145;5138:12;5099:53;5171:27;5188:9;5171:27;:::i;:::-;5161:37;;5217:36;5249:2;5238:9;5234:18;5217:36;:::i;:::-;5207:46;;5272:36;5304:2;5293:9;5289:18;5272:36;:::i;:::-;5262:46;;5327:36;5359:2;5348:9;5344:18;5327:36;:::i;:::-;5317:46;;4976:393;;;;;;;:::o;5374:671::-;5460:6;5468;5476;5484;5537:3;5525:9;5516:7;5512:23;5508:33;5505:53;;;5554:1;5551;5544:12;5505:53;5593:9;5580:23;5612:31;5637:5;5612:31;:::i;:::-;5662:5;-1:-1:-1;5719:2:1;5704:18;;5691:32;5732:33;5691:32;5732:33;:::i;:::-;5784:7;-1:-1:-1;5843:2:1;5828:18;;5815:32;5856:33;5815:32;5856:33;:::i;:::-;5908:7;-1:-1:-1;5967:2:1;5952:18;;5939:32;5980:33;5939:32;5980:33;:::i;:::-;5374:671;;;;-1:-1:-1;5374:671:1;;-1:-1:-1;;5374:671:1:o;6474:388::-;6542:6;6550;6603:2;6591:9;6582:7;6578:23;6574:32;6571:52;;;6619:1;6616;6609:12;6571:52;6658:9;6645:23;6677:31;6702:5;6677:31;:::i;:::-;6727:5;-1:-1:-1;6784:2:1;6769:18;;6756:32;6797:33;6756:32;6797:33;:::i;6867:380::-;6946:1;6942:12;;;;6989;;;7010:61;;7064:4;7056:6;7052:17;7042:27;;7010:61;7117:2;7109:6;7106:14;7086:18;7083:38;7080:161;;7163:10;7158:3;7154:20;7151:1;7144:31;7198:4;7195:1;7188:15;7226:4;7223:1;7216:15;7080:161;;6867:380;;;:::o;8088:408::-;8290:2;8272:21;;;8329:2;8309:18;;;8302:30;8368:34;8363:2;8348:18;;8341:62;-1:-1:-1;;;8434:2:1;8419:18;;8412:42;8486:3;8471:19;;8088:408::o;8501:::-;8703:2;8685:21;;;8742:2;8722:18;;;8715:30;8781:34;8776:2;8761:18;;8754:62;-1:-1:-1;;;8847:2:1;8832:18;;8825:42;8899:3;8884:19;;8501:408::o;8914:127::-;8975:10;8970:3;8966:20;8963:1;8956:31;9006:4;9003:1;8996:15;9030:4;9027:1;9020:15;9046:125;9111:9;;;9132:10;;;9129:36;;;9145:18;;:::i;10864:414::-;11066:2;11048:21;;;11105:2;11085:18;;;11078:30;11144:34;11139:2;11124:18;;11117:62;-1:-1:-1;;;11210:2:1;11195:18;;11188:48;11268:3;11253:19;;10864:414::o;11686:128::-;11753:9;;;11774:11;;;11771:37;;;11788:18;;:::i;12645:168::-;12685:7;12751:1;12747;12743:6;12739:14;12736:1;12733:21;12728:1;12721:9;12714:17;12710:45;12707:71;;;12758:18;;:::i;:::-;-1:-1:-1;12798:9:1;;12645:168::o;12818:127::-;12879:10;12874:3;12870:20;12867:1;12860:31;12910:4;12907:1;12900:15;12934:4;12931:1;12924:15;12950:120;12990:1;13016;13006:35;;13021:18;;:::i;:::-;-1:-1:-1;13055:9:1;;12950:120::o;13075:251::-;13145:6;13198:2;13186:9;13177:7;13173:23;13169:32;13166:52;;;13214:1;13211;13204:12;13166:52;13246:9;13240:16;13265:31;13290:5;13265:31;:::i;19984:401::-;20186:2;20168:21;;;20225:2;20205:18;;;20198:30;20264:34;20259:2;20244:18;;20237:62;-1:-1:-1;;;20330:2:1;20315:18;;20308:35;20375:3;20360:19;;19984:401::o;20390:399::-;20592:2;20574:21;;;20631:2;20611:18;;;20604:30;20670:34;20665:2;20650:18;;20643:62;-1:-1:-1;;;20736:2:1;20721:18;;20714:33;20779:3;20764:19;;20390:399::o;22399:184::-;22469:6;22522:2;22510:9;22501:7;22497:23;22493:32;22490:52;;;22538:1;22535;22528:12;22490:52;-1:-1:-1;22561:16:1;;22399:184;-1:-1:-1;22399:184:1:o;23413:148::-;23501:4;23480:12;;;23494;;;23476:31;;23519:13;;23516:39;;;23535:18;;:::i;23566:404::-;23768:2;23750:21;;;23807:2;23787:18;;;23780:30;23846:34;23841:2;23826:18;;23819:62;-1:-1:-1;;;23912:2:1;23897:18;;23890:38;23960:3;23945:19;;23566:404::o;24249:209::-;-1:-1:-1;;24413:38:1;;;;24395:57;;24383:2;24368:18;;24249:209::o;25276:407::-;25478:2;25460:21;;;25517:2;25497:18;;;25490:30;25556:34;25551:2;25536:18;;25529:62;-1:-1:-1;;;25622:2:1;25607:18;;25600:41;25673:3;25658:19;;25276:407::o;28474:165::-;28512:1;28546:4;28543:1;28539:12;28570:3;28560:37;;28577:18;;:::i;:::-;28629:3;28622:4;28619:1;28615:12;28611:22;28606:27;;;28474:165;;;;:::o;28644:151::-;28734:4;28727:12;;;28713;;;28709:31;;28752:14;;28749:40;;;28769:18;;:::i;29664:545::-;29766:2;29761:3;29758:11;29755:448;;;29802:1;29827:5;29823:2;29816:17;29872:4;29868:2;29858:19;29942:2;29930:10;29926:19;29923:1;29919:27;29913:4;29909:38;29978:4;29966:10;29963:20;29960:47;;;-1:-1:-1;30001:4:1;29960:47;30056:2;30051:3;30047:12;30044:1;30040:20;30034:4;30030:31;30020:41;;30111:82;30129:2;30122:5;30119:13;30111:82;;;30174:17;;;30155:1;30144:13;30111:82;;30385:1352;30511:3;30505:10;30538:18;30530:6;30527:30;30524:56;;;30560:18;;:::i;:::-;30589:97;30679:6;30639:38;30671:4;30665:11;30639:38;:::i;:::-;30633:4;30589:97;:::i;:::-;30741:4;;30805:2;30794:14;;30822:1;30817:663;;;;31524:1;31541:6;31538:89;;;-1:-1:-1;31593:19:1;;;31587:26;31538:89;-1:-1:-1;;30342:1:1;30338:11;;;30334:24;30330:29;30320:40;30366:1;30362:11;;;30317:57;31640:81;;30787:944;;30817:663;29611:1;29604:14;;;29648:4;29635:18;;-1:-1:-1;;30853:20:1;;;30971:236;30985:7;30982:1;30979:14;30971:236;;;31074:19;;;31068:26;31053:42;;31166:27;;;;31134:1;31122:14;;;;31001:19;;30971:236;;;30975:3;31235:6;31226:7;31223:19;31220:201;;;31296:19;;;31290:26;-1:-1:-1;;31379:1:1;31375:14;;;31391:3;31371:24;31367:37;31363:42;31348:58;31333:74;;31220:201;-1:-1:-1;;;;;31467:1:1;31451:14;;;31447:22;31434:36;;-1:-1:-1;30385:1352:1:o;31742:127::-;31803:10;31798:3;31794:20;31791:1;31784:31;31834:4;31831:1;31824:15;31858:4;31855:1;31848:15;31874:980;32136:4;32184:3;32173:9;32169:19;32215:6;32204:9;32197:25;32241:2;32279:6;32274:2;32263:9;32259:18;32252:34;32322:3;32317:2;32306:9;32302:18;32295:31;32346:6;32381;32375:13;32412:6;32404;32397:22;32450:3;32439:9;32435:19;32428:26;;32489:2;32481:6;32477:15;32463:29;;32510:1;32520:195;32534:6;32531:1;32528:13;32520:195;;;32599:13;;-1:-1:-1;;;;;32595:39:1;32583:52;;32690:15;;;;32655:12;;;;32631:1;32549:9;32520:195;;;-1:-1:-1;;;;;;;32771:32:1;;;;32766:2;32751:18;;32744:60;-1:-1:-1;;;32835:3:1;32820:19;32813:35;32732:3;31874:980;-1:-1:-1;;;31874:980:1:o;34256:306::-;34344:6;34352;34360;34413:2;34401:9;34392:7;34388:23;34384:32;34381:52;;;34429:1;34426;34419:12;34381:52;34458:9;34452:16;34442:26;;34508:2;34497:9;34493:18;34487:25;34477:35;;34552:2;34541:9;34537:18;34531:25;34521:35;;34256:306;;;;;:::o;34974:287::-;35103:3;35141:6;35135:13;35157:66;35216:6;35211:3;35204:4;35196:6;35192:17;35157:66;:::i;:::-;35239:16;;;;;34974:287;-1:-1:-1;;34974:287:1:o

Swarm Source

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