Contract Address Details

0xEC1b9910d13612Aab537e8f53Ebd0B192E965F53

Contract Name
NativeVault
Creator
0xe4bc3d–a61c7a at 0xa2df5f–935632
Balance
0 ADIL ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
13254908
Contract name:
NativeVault




Optimization enabled
true
Compiler version
v0.8.2+commit.661d1103




Optimization runs
999999
Verified at
2024-04-24 08:22:41.114041Z

contracts/NativeVault.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./libraries/TransferHelper.sol";
import "./libraries/BytesLibrary.sol";
import "./libraries/StringLibrary.sol";
import "./interfaces/ITransporter.sol";

import "./libraries/upgrade/PauseUpgradeSafe.sol";
import "./libraries/upgrade/OwnerOperatorUpgradeSafe.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract NativeVault is OwnerOperatorUpgradeSafe, PauseUpgradeSafe {
    using StringLibrary for string;
    using BytesLibrary for bytes32;
    struct SavedData {
        address sender;
        uint256 value;
    }

    struct SwapData {
        address payable sender;
        string token;
        uint256 blockExpired;
        uint256 amount;
        string nonce;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    mapping(string => SavedData) public withdrawData;
    mapping(string => SavedData) public depositData;
    mapping(string => SavedData) public swapData;
    mapping(bytes32 => bool) public swapCompleted;

    event DepositVault(string nonce, address from, uint256 amount);
    event WithdrawVault(string nonce, address to, uint256 amount);
    event SwapToken(string nonce, address from, uint256 amount, string token);

    function initialize() public initializer {
        __OwnerOperator_init();
        __Pause_init();
    }

    /**
     * @dev pauses all deposits, claims. See {Pausable-_pause}.
     */
    function pause() external virtual onlyOwner {
        _pause();
    }

    /**
     * @dev unpauses all deposits, claims. See {Pausable-_pause}.
     */
    function unpause() external virtual onlyOwner {
        _unpause();
    }

    /**
     * @dev withdraw tokens that do not belong to the vault.
     */
    function withdraw(string memory nonce, uint256 amount) external onlyOwner {
        require(amount > 0, "NativeVault: zero out amount");

        TransferHelper.safeTransferETH(msg.sender, amount);
        withdrawData[nonce] = SavedData(msg.sender, amount);

        emit WithdrawVault(nonce, msg.sender, amount);
    }

    receive() external payable {}

    function deposit(string memory nonce) external payable {
        require(msg.value > 0, "NativeVault: zero out amount");
        depositData[nonce] = SavedData(msg.sender, msg.value);

        emit DepositVault(nonce, msg.sender, msg.value);
    }

    function swapToken(SwapData memory data) external payable whenNotPaused {
        require(
            keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("kuda"))) ||
                keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("merah"))),
            "NativeVault: swap token invalid"
        );
        require(data.amount > 0, "NativeVault: zero out amount");

        bytes32 message = _verifySwap(data);
        swapCompleted[message] = true;

        TransferHelper.safeTransferETH(msg.sender, data.amount);
        swapData[data.nonce] = SavedData(msg.sender, data.amount);

        emit SwapToken(data.nonce, msg.sender, msg.value, data.token);
    }

    function swapAdil(SwapData memory data) external payable whenNotPaused {
        require(
            keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("kuda"))) ||
                keccak256(abi.encodePacked((data.token))) == keccak256(abi.encodePacked(("merah"))),
            "NativeVault: swap token invalid"
        );
        bytes32 message = _verifySwap(data);
        swapCompleted[message] = true;
        require(data.amount > 0, "NativeVault: zero out amount");
        TransferHelper.safeTransferETH(address(this), data.amount);
        swapData[data.nonce] = SavedData(msg.sender, data.amount);

        emit SwapToken(data.nonce, msg.sender, data.amount, "adil");
    }

    function _verifySwap(SwapData memory data) internal view returns (bytes32) {
        bytes32 message = keccak256(
            abi.encode(address(this), "Swap", data.sender, data.token, data.blockExpired, data.amount, data.nonce)
        );
        address signer = message.toString().recover(data.v, data.r, data.s);

        require(!swapCompleted[message], "NativeVault: swap completed");
        require(operators[signer], "NativeVault: swap not verify");
        require(block.number < data.blockExpired, "NativeVault: swap expired");

        return message;
    }
}
        

contracts/libraries/upgrade/OwnableUpgradeSafe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ContextUpgradeSafe.sol";

abstract contract OwnableUpgradeSafe is ContextUpgradeSafe {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

    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 initializer {
        _setOwner(_msgSender());
    }

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

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

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

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

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

@openzeppelin/contracts/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 a proxied contract can't have 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.
 *
 * 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.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

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

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}
          

@openzeppelin/contracts/utils/Counters.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
          

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contracts/interfaces/ITransporter.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface ITransporter {
    function safeTransferTokenFrom(
        address token_,
        address from_,
        address to_,
        uint256 amount_
    ) external;

    function safeTransferNFT721From(
        address token_,
        address from_,
        address to_,
        uint256 tokenId_
    ) external;

    function safeBurnNFT721From(address token_, uint256 tokenId_) external;

    function safeTransferNFT1155From(
        address token_,
        address from_,
        address to_,
        uint256 tokenId_,
        uint256 amount_
    ) external;

    function safeBurnNFT1155From(
        address token_,
        address from_,
        uint256 tokenId_,
        uint256 amount_
    ) external;

    function safeBurnBatchNFT1155From(
        address token_,
        address from_,
        uint256[] memory tokenId_,
        uint256[] memory amount_
    ) external;
}
          

contracts/libraries/BytesLibrary.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev BytesLibrary operations.
 */
library BytesLibrary {
    function toString(bytes32 value) internal pure returns (string memory) {
        bytes memory alphabet = "0123456789abcdef";
        bytes memory str = new bytes(64);
        for (uint256 i = 0; i < 32; i++) {
            str[i * 2] = alphabet[uint8(value[i] >> 4)];
            str[1 + i * 2] = alphabet[uint8(value[i] & 0x0f)];
        }
        return string(str);
    }
}
          

contracts/libraries/StringLibrary.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./UintLibrary.sol";

library StringLibrary {
    using UintLibrary for uint256;

    function append(string memory a, string memory b) internal pure returns (string memory) {
        bytes memory ba = bytes(a);
        bytes memory bb = bytes(b);
        bytes memory bab = new bytes(ba.length + bb.length);
        uint256 k = 0;
        for (uint256 i = 0; i < ba.length; i++) bab[k++] = ba[i];
        for (uint256 i = 0; i < bb.length; i++) bab[k++] = bb[i];
        return string(bab);
    }

    function append(
        string memory a,
        string memory b,
        string memory c
    ) internal pure returns (string memory) {
        bytes memory ba = bytes(a);
        bytes memory bb = bytes(b);
        bytes memory bc = bytes(c);
        bytes memory bbb = new bytes(ba.length + bb.length + bc.length);
        uint256 k = 0;
        for (uint256 i = 0; i < ba.length; i++) bbb[k++] = ba[i];
        for (uint256 i = 0; i < bb.length; i++) bbb[k++] = bb[i];
        for (uint256 i = 0; i < bc.length; i++) bbb[k++] = bc[i];
        return string(bbb);
    }

    function recover(
        string memory message,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        bytes memory msgBytes = bytes(message);
        bytes memory fullMessage = concat(
            bytes("\x19Ethereum Signed Message:\n"),
            bytes(msgBytes.length.toString()),
            msgBytes,
            new bytes(0),
            new bytes(0),
            new bytes(0),
            new bytes(0)
        );
        return ecrecover(keccak256(fullMessage), v, r, s);
    }

    function concat(
        bytes memory ba,
        bytes memory bb,
        bytes memory bc,
        bytes memory bd,
        bytes memory be,
        bytes memory bf,
        bytes memory bg
    ) internal pure returns (bytes memory) {
        bytes memory resultBytes = new bytes(ba.length + bb.length + bc.length + bd.length + be.length + bf.length + bg.length);
        uint256 k = 0;
        for (uint256 i = 0; i < ba.length; i++) resultBytes[k++] = ba[i];
        for (uint256 i = 0; i < bb.length; i++) resultBytes[k++] = bb[i];
        for (uint256 i = 0; i < bc.length; i++) resultBytes[k++] = bc[i];
        for (uint256 i = 0; i < bd.length; i++) resultBytes[k++] = bd[i];
        for (uint256 i = 0; i < be.length; i++) resultBytes[k++] = be[i];
        for (uint256 i = 0; i < bf.length; i++) resultBytes[k++] = bf[i];
        for (uint256 i = 0; i < bg.length; i++) resultBytes[k++] = bg[i];
        return resultBytes;
    }
}
          

contracts/libraries/TransferHelper.sol

//SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper::safeApprove: approve failed"
        );
    }

    function safeTransfer(address token, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper::safeTransfer: transfer failed"
        );
    }

    function safeTransferFrom(address token, address from, address to, uint256 value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper::transferFrom: transferFrom failed"
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "TransferHelper::safeTransferETH: ETH transfer failed");
    }
}
          

contracts/libraries/UintLibrary.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/math/SafeMath.sol";

library UintLibrary {
    using SafeMath for uint256;

    function toString(uint256 i) internal pure returns (string memory) {
        if (i == 0) {
            return "0";
        }

        uint256 j = i;
        uint256 len;

        while (j != 0) {
            len++;
            j /= 10;
        }

        bytes memory bstr = new bytes(len);

        for (uint256 k = len; k > 0; k--) {
            bstr[k - 1] = bytes1(uint8(48 + (i % 10)));
            i /= 10;
        }

        return string(bstr);
    }

    function bp(uint256 value, uint256 bpValue) internal pure returns (uint256) {
        return value.mul(bpValue).div(10000);
    }
}
          

contracts/libraries/upgrade/ContextUpgradeSafe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/proxy/utils/Initializable.sol";

abstract contract ContextUpgradeSafe is Initializable {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

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

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

    // Reserved storage space to allow for layout changes in the future.
    uint256[50] private __gap;
}
          

contracts/libraries/upgrade/OwnerOperatorUpgradeSafe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./OwnableUpgradeSafe.sol";

abstract contract OwnerOperatorUpgradeSafe is OwnableUpgradeSafe {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

    mapping(address => bool) public operators;
    event AddOperator(address indexed operator);
    event RemoveOperator(address indexed operator);

    function __OwnerOperator_init() internal initializer {
        __Ownable_init();
    }

    modifier operatorOrOwner() {
        require(operators[msg.sender] || owner() == msg.sender, "OwnerOperator: !operator, !owner");
        _;
    }

    modifier onlyOperator() {
        require(operators[msg.sender], "OwnerOperator: !operator");
        _;
    }

    function addOperator(address operator) external virtual onlyOwner {
        require(operator != address(0), "OwnerOperator: operator is the zero address");
        require(!operators[operator], "OwnerOperator: operator existed");
        operators[operator] = true;
        emit AddOperator(operator);
    }

    function removeOperator(address operator) external virtual onlyOwner {
        require(operator != address(0), "OwnerOperator: operator is the zero address");
        require(operators[operator], "OwnerOperator: operator not exist");
        operators[operator] = false;
        emit RemoveOperator(operator);
    }
}
          

contracts/libraries/upgrade/PauseUpgradeSafe.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ContextUpgradeSafe.sol";

abstract contract PauseUpgradeSafe is ContextUpgradeSafe {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.

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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pause_init() internal initializer {
        _paused = false;
    }

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

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

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

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

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

Contract ABI

[{"type":"event","name":"AddOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"DepositVault","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RemoveOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapToken","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"string","name":"token","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawVault","inputs":[{"type":"string","name":"nonce","internalType":"string","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"string","name":"nonce","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"depositData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"operators","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapAdil","inputs":[{"type":"tuple","name":"data","internalType":"struct NativeVault.SwapData","components":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"string","name":"token","internalType":"string"},{"type":"uint256","name":"blockExpired","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"string","name":"nonce","internalType":"string"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapCompleted","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"swapData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapToken","inputs":[{"type":"tuple","name":"data","internalType":"struct NativeVault.SwapData","components":[{"type":"address","name":"sender","internalType":"address payable"},{"type":"string","name":"token","internalType":"string"},{"type":"uint256","name":"blockExpired","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"string","name":"nonce","internalType":"string"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"string","name":"nonce","internalType":"string"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}],"name":"withdrawData","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x60806040526004361061012d5760003560e01c80638456cb59116100a5578063ac8a584a11610074578063d9f8f7c011610059578063d9f8f7c0146103db578063ea32e7a11461040b578063f2fde38b1461041e57610134565b8063ac8a584a146103a8578063c530d4bc146103c857610134565b80638456cb591461032b5780638da5cb5b146103405780639870d7fe14610375578063a26e11861461039557610134565b8063601d6220116100fc578063623f1e98116100e1578063623f1e98146102a9578063715018a6146103015780638129fc1c1461031657610134565b8063601d6220146101cd578063604ff5a41461025157610134565b806313e7c9d81461013957806330b39a621461017e5780633f4ba83a146101a05780635c975abb146101b557610134565b3661013457005b600080fd5b34801561014557600080fd5b50610169610154366004612c76565b60346020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561018a57600080fd5b5061019e610199366004612cec565b61043e565b005b3480156101ac57600080fd5b5061019e6105f7565b3480156101c157600080fd5b5060355460ff16610169565b3480156101d957600080fd5b506102256101e8366004612cb1565b80516020818301810180516037825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610175565b34801561025d57600080fd5b5061022561026c366004612cb1565b80516020818301810180516036825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b3480156102b557600080fd5b506102256102c4366004612cb1565b80516020818301810180516038825292820191909301209152805460019091015473ffffffffffffffffffffffffffffffffffffffff9091169082565b34801561030d57600080fd5b5061019e610682565b34801561032257600080fd5b5061019e61070d565b34801561033757600080fd5b5061019e61085a565b34801561034c57600080fd5b5060335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610175565b34801561038157600080fd5b5061019e610390366004612c76565b6108e3565b61019e6103a3366004612cb1565b610b0e565b3480156103b457600080fd5b5061019e6103c3366004612c76565b610c35565b61019e6103d6366004612d2f565b610e82565b3480156103e757600080fd5b506101696103f6366004612c99565b60396020526000908152604090205460ff1681565b61019e610419366004612d2f565b6111d0565b34801561042a57600080fd5b5061019e610439366004612c76565b611524565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000811161052e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6105383382611651565b60408051808201825233815260208101839052905160369061055b908590612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617815592909101516001909201919091557fb28ba8757c533c11df0a0296f055315bd4f431269f7a466ab4201a27fb8a5c69906105eb90849033908590612f10565b60405180910390a15050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b610680611760565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314610703576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b6106806000611841565b600054610100900460ff1680610726575060005460ff16155b6107b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff1615801561081857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6108206118b8565b6108286119cb565b801561085757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b610680611b2f565b60335473ffffffffffffffffffffffffffffffffffffffff163314610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f776e65724f70657261746f723a206f70657261746f7220697320746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff1615610a97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f776e65724f70657261746f723a206f70657261746f7220657869737465640060448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660008181526034602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f4c141abccf173677929dea054f218ed87362117834a8869ec9f68d8bdaaea1dc9190a250565b60003411610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6040805180820182523381523460208201529051603790610b9a908490612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617815592909101516001909201919091557f72e136c7777894ff746375347b3cb412587ec82a887eb1ce12489dd6e4ce632a90610c2a90839033903490612f10565b60405180910390a150565b60335473ffffffffffffffffffffffffffffffffffffffff163314610cb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116610d59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f776e65724f70657261746f723a206f70657261746f7220697320746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff16610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f776e65724f70657261746f723a206f70657261746f72206e6f74206578697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660008181526034602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f6b4be2dd49eba45ba43390fbe7da13e2b965d255db41d6a0fcf6d2e15ac1fccb9190a250565b60355460ff1615610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b6040517f6b756461000000000000000000000000000000000000000000000000000000006020820152602401604051602081830303815290604052805190602001208160200151604051602001610f469190612e58565b604051602081830303815290604052805190602001201480610fd257506040517f6d657261680000000000000000000000000000000000000000000000000000006020820152602501604051602081830303815290604052805190602001208160200151604051602001610fba9190612e58565b60405160208183030381529060405280519060200120145b611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e61746976655661756c743a207377617020746f6b656e20696e76616c69640060448201526064016104bb565b600061104382611bef565b600081815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560608301519091506110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b6110f6308360600151611651565b60405180604001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018360600151815250603883608001516040516111399190612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161781559290910151600190920191909155608083015160608401517f18467ac40591fb7037440982a806dc2926e7798e5bb8d85948e890761f1002c1926105eb92913391612f9d565b60355460ff161561123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b6040517f6b7564610000000000000000000000000000000000000000000000000000000060208201526024016040516020818303038152906040528051906020012081602001516040516020016112949190612e58565b60405160208183030381529060405280519060200120148061132057506040517f6d6572616800000000000000000000000000000000000000000000000000000060208201526025016040516020818303038152906040528051906020012081602001516040516020016113089190612e58565b60405160208183030381529060405280519060200120145b611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e61746976655661756c743a207377617020746f6b656e20696e76616c69640060448201526064016104bb565b60008160600151116113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a207a65726f206f757420616d6f756e740000000060448201526064016104bb565b60006113ff82611bef565b600081815260396020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060830151909150611449903390611651565b60405180604001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183606001518152506038836080015160405161148c9190612e58565b90815260405160209181900382018120835181547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178155928201516001909301929092556080840151908401517f18467ac40591fb7037440982a806dc2926e7798e5bb8d85948e890761f1002c1926105eb92913391349190612f4b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff8116611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104bb565b61085781611841565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516116889190612e58565b60006040518083038185875af1925050503d80600081146116c5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ca565b606091505b505090508061175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016104bb565b505050565b60355460ff166117cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016104bb565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806118d1575060005460ff16155b61195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff161580156119c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b610828611ddf565b600054610100900460ff16806119e4575060005460ff16155b611a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff16158015611ad657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561085757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60355460ff1615611b9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016104bb565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118173390565b6000803083600001518460200151856040015186606001518760800151604051602001611c2196959493929190612e74565b6040516020818303038152906040528051906020012090506000611c5e8460a001518560c001518660e00151611c5686611ef3565b9291906121c2565b60008381526039602052604090205490915060ff1615611cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e61746976655661756c743a207377617020636f6d706c65746564000000000060448201526064016104bb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526034602052604090205460ff16611d69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e61746976655661756c743a2073776170206e6f74207665726966790000000060448201526064016104bb565b83604001514310611dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e61746976655661756c743a207377617020657870697265640000000000000060448201526064016104bb565b5090505b919050565b600054610100900460ff1680611df8575060005460ff16155b611e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bb565b600054610100900460ff16158015611eea57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61082833611841565b604080518082018252601081527f30313233343536373839616263646566000000000000000000000000000000006020820152815182815260608181018452926000919060208201818036833701905050905060005b60208110156121ba57826004868360208110611f8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110611ff3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261202683600261308e565b8151811061205d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350828582602081106120c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b825191901a600f16908110612104577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261213783600261308e565b612142906001613062565b81518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806121b281613147565b915050611f49565b509392505050565b600080859050600061223a6040518060400160405280601a81526020017f19457468657265756d205369676e6564204d6573736167653a0a00000000000081525061220d84516122d5565b6040805160008082526020820181815282840182815260608401928352608084019094528893909161246a565b9050600181805190602001208787876040516000815260200160405260405161227f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156122a1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b606081612316575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152611dda565b8160005b8115612340578061232a81613147565b91506123399050600a8361307a565b915061231a565b60008167ffffffffffffffff811115612382577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123ac576020820181803683370190505b509050815b8015612461576123c2600a87613180565b6123cd906030613062565b60f81b826123dc6001846130cb565b81518110612413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061244d600a8761307a565b95508061245981613112565b9150506123b1565b50949350505050565b6060600082518451865188518a518c518e516124869190613062565b6124909190613062565b61249a9190613062565b6124a49190613062565b6124ae9190613062565b6124b89190613062565b67ffffffffffffffff8111156124f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612521576020820181803683370190505b5090506000805b8a51811015612616578a818151811061256a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361259c81613147565b9450815181106125d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061260e81613147565b915050612528565b5060005b89518110156127085789818151811061265c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361268e81613147565b9450815181106126c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061270081613147565b91505061261a565b5060005b88518110156127fa5788818151811061274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361278081613147565b9450815181106127b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806127f281613147565b91505061270c565b5060005b87518110156128ec57878181518110612840577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361287281613147565b9450815181106128ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806128e481613147565b9150506127fe565b5060005b86518110156129de57868181518110612932577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361296481613147565b94508151811061299d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806129d681613147565b9150506128f0565b5060005b8551811015612ad057858181518110612a24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612a5681613147565b945081518110612a8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612ac881613147565b9150506129e2565b5060005b8451811015612bc257848181518110612b16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01602001517fff00000000000000000000000000000000000000000000000000000000000000168383612b4881613147565b945081518110612b81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612bba81613147565b915050612ad4565b50909998505050505050505050565b8035611dda81613221565b600082601f830112612bec578081fd5b813567ffffffffffffffff811115612c0657612c066131f2565b612c3760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613013565b818152846020838601011115612c4b578283fd5b816020850160208301379081016020019190915292915050565b803560ff81168114611dda57600080fd5b600060208284031215612c87578081fd5b8135612c9281613221565b9392505050565b600060208284031215612caa578081fd5b5035919050565b600060208284031215612cc2578081fd5b813567ffffffffffffffff811115612cd8578182fd5b612ce484828501612bdc565b949350505050565b60008060408385031215612cfe578081fd5b823567ffffffffffffffff811115612d14578182fd5b612d2085828601612bdc565b95602094909401359450505050565b600060208284031215612d40578081fd5b813567ffffffffffffffff80821115612d57578283fd5b8184019150610100808387031215612d6d578384fd5b612d7681613013565b9050612d8183612bd1565b8152602083013582811115612d94578485fd5b612da087828601612bdc565b6020830152506040830135604082015260608301356060820152608083013582811115612dcb578485fd5b612dd787828601612bdc565b608083015250612de960a08401612c65565b60a082015260c083013560c082015260e083013560e082015280935050505092915050565b60008151808452612e268160208601602086016130e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612e6a8184602087016130e2565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260e06020840152600460e08401527f53776170000000000000000000000000000000000000000000000000000000006101008401526101208189166040850152806060850152612ee281850189612e0e565b9150508560808401528460a084015282810360c0840152612f038185612e0e565b9998505050505050505050565b600060608252612f236060830186612e0e565b73ffffffffffffffffffffffffffffffffffffffff9490941660208301525060400152919050565b600060808252612f5e6080830187612e0e565b73ffffffffffffffffffffffffffffffffffffffff861660208401528460408401528281036060840152612f928185612e0e565b979650505050505050565b600060808252612fb06080830186612e0e565b73ffffffffffffffffffffffffffffffffffffffff851660208401528360408401528281036060840152600481527f6164696c00000000000000000000000000000000000000000000000000000000602082015260408101915050949350505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561305a5761305a6131f2565b604052919050565b6000821982111561307557613075613194565b500190565b600082613089576130896131c3565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130c6576130c6613194565b500290565b6000828210156130dd576130dd613194565b500390565b60005b838110156130fd5781810151838201526020016130e5565b8381111561310c576000848401525b50505050565b60008161312157613121613194565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317957613179613194565b5060010190565b60008261318f5761318f6131c3565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461085757600080fdfea2646970667358221220fccddf8456ed785d5619d226bbf6ef6045f87caf86b7b8783b620caadbc4171f64736f6c63430008020033