false
false
0

Contract Address Details

0x3eeC65E62Df55bEb88Cb7877cbA767D31bF1c47f

Contract Name
PromoVault2
Creator
0xc7d98c–7f3521 at 0xf31e93–b2bf1a
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
16287803
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
PromoVault2




Optimization enabled
false
Compiler version
v0.8.19+commit.7dd6d404




EVM Version
default




Verified at
2024-09-26T15:33:49.897570Z

Contract source code

// SPDX-License-Identifier: No License (None)
pragma solidity 0.8.19;

// 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, uint 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: APPROVE_FAILED');
    }


    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }


    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }


    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

abstract contract Ownable {
    address internal _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /**
     * @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() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

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

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
}

contract PromoVault2 is Ownable {
    using TransferHelper for address;

    struct Airdrop {
        uint128 balance;    // available airdrop balance
        uint64 vestingDate; // after this date when tokens can be claimed
        uint64 deadline;    // until this date tokens can be claimed 
        address token;      // airdrop token
    }

    mapping(address signer => Airdrop) public airdrops;
    mapping(bytes32 messageHash => bool processed) public isProcessed;   // record processed messages


    event VaultTransfer(address indexed token, address indexed signer, address indexed from, address to, uint256 value);
    event CreateAirdrop(address signer, address token, uint256 amount);
    event CloseAirdrop(address signer, address receiver, uint256 amount);
    event Rescue(address _token, uint256 _amount);

    bool public isPaused;

    modifier isNotPaused() {
        require(!isPaused, "is paused");
        _;
    }

    function setPause(bool pause) external onlyOwner {
        isPaused = pause;
    }

    function createAirdrop(
        address token,  // airdrop token
        uint256 amount, // amount of tokens for airdrop
        address signer  // unique signer for this airdrop
    ) external isNotPaused {
        require(signer != address(0) && airdrops[signer].token == address(0), "signer already was used");
        airdrops[signer].token = token;
        uint256 balance = IERC20(token).balanceOf(address(this));
        token.safeTransferFrom(msg.sender, address(this), amount);
        amount = IERC20(token).balanceOf(address(this)) - balance;
        require(amount < 2**128, "too big amount");
        airdrops[signer].balance = uint128(amount);
        emit CreateAirdrop(signer, token, amount);
    }
/*
// to sign message on the server-side use:

var vault = new web3.eth.Contract(VaultContractABI, VaultContractAddress);
var nonce = await vault.methods.nonces(from).call();
var messageHash = web3.utils.soliditySha3(signer, token, from, value, nonce, ChainId, VaultContractAddress);
var signature = web3.eth.accounts.sign(messageHash, PrivateKey);
*/
    // claim promo tokens from vault to user's address. Can be called by any wallet
    function claimTokens(
        address signer, // signer of airdrop
        address to, // transfer to address (user's address who received airdrop)
        uint256 value, // amount of tokens to transfer
        uint256 nonce, // nonce is used to if you need to airdrop tokens to the same user many times
        bytes memory signature
    ) external isNotPaused {
        claim(signer, to, to, value, nonce, signature);
    }


    // user transfers promo tokens from vault to some address. Must be called by user who received airdrop
    function transferTokens(
        address signer, // signer of airdrop
        address to, // transfer to address (any address)
        uint256 value, // amount of tokens to transfer
        uint256 nonce, // nonce is used to if you need to airdrop tokens to the same user many times
        bytes memory signature
    ) external isNotPaused {
        claim(signer, msg.sender, to, value, nonce, signature);
    }

    function claim(
        address signer, // signer of airdrop
        address from, // transfer from address
        address to, // transfer to address
        uint256 value, // amount of tokens to transfer
        uint256 nonce, // nonce is used to if you need to airdrop tokens to the same user many times
        bytes memory signature        
    ) internal {
        Airdrop memory a = airdrops[signer];
        require(a.token != address(0) && signer != address(0), "closed");
        require(a.balance >= value, "Not enough tokens");
        require(a.vestingDate <= block.timestamp, "under vesting");
        require(a.deadline == 0 || a.deadline >= block.timestamp, "expired");

        bytes32 messageHash = keccak256(
            abi.encodePacked(
                signer,
                a.token,
                from,
                value,
                nonce,
                block.chainid,
                address(this)
            )
        );
        messageHash = prefixed(messageHash);
        require(!isProcessed[messageHash], "already claimed");
        require(signer == recoverSigner(messageHash, signature), "wrong signature");
        isProcessed[messageHash] = true;
        airdrops[signer].balance = a.balance - uint128(value);
        a.token.safeTransfer(to, value);
        emit VaultTransfer(a.token, signer, from, to, value);
    }

    function splitSignature(bytes memory sig)
        internal
        pure
        returns (
            uint8 v,
            bytes32 r,
            bytes32 s
        )
    {
        require(sig.length == 65);
        assembly {
            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }
    }

    function recoverSigner(bytes32 message, bytes memory sig)
        internal
        pure
        returns (address)
    {
        uint8 v;
        bytes32 r;
        bytes32 s;
        (v, r, s) = splitSignature(sig);
        return ecrecover(message, v, r, s);
    }

    // Builds a prefixed hash to mimic the behavior of eth_sign.
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }
/*
    // ERC223 callback
    function tokenReceived(address, uint, bytes calldata) external pure returns(bytes4) {
        return this.tokenReceived.selector;
    }
*/
    // owner can close airdrop before all tokens is claimed and transfer leftover tokens to receiver address
    function closeAirdrop(address signer, address receiver) external onlyOwner {
        Airdrop memory a = airdrops[signer];
        require(a.token != address(0) && signer != address(0), "closed");
        require(a.balance != 0, "Not enough tokens");
        a.token.safeTransfer(receiver, uint256(a.balance));
        airdrops[signer].balance = 0;
        emit CloseAirdrop(signer, receiver, uint256(a.balance));
    }

    // allow owner to rescue tokens from contract
    function rescueTokens(address token, uint256 amount) onlyOwner external {
        if (token == address(0)) {
            msg.sender.safeTransferETH(amount);
        } else {
            token.safeTransfer(msg.sender, amount);
        }
        emit Rescue(token, amount);
    } 
}
        

Contract ABI

[{"type":"event","name":"CloseAirdrop","inputs":[{"type":"address","name":"signer","internalType":"address","indexed":false},{"type":"address","name":"receiver","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CreateAirdrop","inputs":[{"type":"address","name":"signer","internalType":"address","indexed":false},{"type":"address","name":"token","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":"Rescue","inputs":[{"type":"address","name":"_token","internalType":"address","indexed":false},{"type":"uint256","name":"_amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VaultTransfer","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"signer","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint128","name":"balance","internalType":"uint128"},{"type":"uint64","name":"vestingDate","internalType":"uint64"},{"type":"uint64","name":"deadline","internalType":"uint64"},{"type":"address","name":"token","internalType":"address"}],"name":"airdrops","inputs":[{"type":"address","name":"signer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimTokens","inputs":[{"type":"address","name":"signer","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"bytes","name":"signature","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeAirdrop","inputs":[{"type":"address","name":"signer","internalType":"address"},{"type":"address","name":"receiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createAirdrop","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"signer","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPaused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"processed","internalType":"bool"}],"name":"isProcessed","inputs":[{"type":"bytes32","name":"messageHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPause","inputs":[{"type":"bool","name":"pause","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferTokens","inputs":[{"type":"address","name":"signer","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"bytes","name":"signature","internalType":"bytes"}]}]
              

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361290f806100bb6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063b187bd2611610071578063b187bd2614610167578063bedb86fb14610185578063cbc20fe0146101a1578063dcc4a5fc146101bd578063f2fde38b146101d9578063f6368f7b146101f5576100a9565b806311c16896146100ae57806357376198146100de578063690e6cc2146100fa5780638c86f0a7146101165780638da5cb5b14610149575b600080fd5b6100c860048036038101906100c3919061196a565b610211565b6040516100d591906119b2565b60405180910390f35b6100f860048036038101906100f39190611a61565b610231565b005b610114600480360381019061010f9190611aa1565b610371565b005b610130600480360381019061012b9190611ae1565b610753565b6040516101409493929190611b6b565b60405180910390f35b6101516107e7565b60405161015e9190611bb0565b60405180910390f35b61016f610810565b60405161017c91906119b2565b60405180910390f35b61019f600480360381019061019a9190611bf7565b610823565b005b6101bb60048036038101906101b69190611d6a565b6108b5565b005b6101d760048036038101906101d29190611e01565b61091a565b005b6101f360048036038101906101ee9190611ae1565b610d34565b005b61020f600480360381019061020a9190611d6a565b610ed5565b005b60026020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166102506107e7565b73ffffffffffffffffffffffffffffffffffffffff16146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029d90611eb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361030857610303813373ffffffffffffffffffffffffffffffffffffffff16610f3a90919063ffffffff16565b610334565b61033333828473ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b5b7f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af28282604051610365929190611ee0565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff166103906107e7565b73ffffffffffffffffffffffffffffffffffffffff16146103e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103dd90611eb1565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff16141580156105a65750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6105e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dc90611f55565b60405180910390fd5b600081600001516fffffffffffffffffffffffffffffffff160361063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590611fc1565b60405180910390fd5b6106838282600001516fffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f3ec192272fa9cf7c91850e76dbc4eb1665ed08972b0eca02adcfa50a875ed3d0838383600001516fffffffffffffffffffffffffffffffff1660405161074693929190611fe1565b60405180910390a1505050565b60016020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166108426107e7565b73ffffffffffffffffffffffffffffffffffffffff1614610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90611eb1565b60405180910390fd5b80600360006101000a81548160ff02191690831515021790555050565b600360009054906101000a900460ff1615610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90612064565b60405180910390fd5b610913853386868686611170565b5050505050565b600360009054906101000a900460ff161561096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612064565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610a355750600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b906120d0565b60405180910390fd5b82600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b309190611bb0565b602060405180830381865afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190612105565b9050610ba03330858773ffffffffffffffffffffffffffffffffffffffff16611710909392919063ffffffff16565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bda9190611bb0565b602060405180830381865afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190612105565b610c259190612161565b92507001000000000000000000000000000000008310610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c71906121e1565b60405180910390fd5b82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f8bb035a14e427c40fc1fb7f442d2a84d053d2cf217513ca816ca3a8af748c56c828585604051610d2693929190611fe1565b60405180910390a150505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d536107e7565b73ffffffffffffffffffffffffffffffffffffffff1614610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090611eb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90612273565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1615610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90612064565b60405180910390fd5b610f33858586868686611170565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115610f6f57610f6e611c3f565b5b6040519080825280601f01601f191660200182016040528015610fa15781602001600182028036833780820191505090505b50604051610faf9190612304565b60006040518083038185875af1925050503d8060008114610fec576040519150601f19603f3d011682016040523d82523d6000602084013e610ff1565b606091505b5050905080611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061238d565b60405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161106c929190611ee0565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516110ba9190612304565b6000604051808303816000865af19150503d80600081146110f7576040519150601f19603f3d011682016040523d82523d6000602084013e6110fc565b606091505b509150915081801561112a575060008151148061112957508080602001905181019061112891906123c2565b5b5b611169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111609061243b565b60405180910390fd5b5050505050565b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff16141580156113305750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b61136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690611f55565b60405180910390fd5b8381600001516fffffffffffffffffffffffffffffffff1610156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90611fc1565b60405180910390fd5b42816020015167ffffffffffffffff161115611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906124a7565b60405180910390fd5b6000816040015167ffffffffffffffff161480611444575042816040015167ffffffffffffffff1610155b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90612513565b60405180910390fd5b600087826060015188878746306040516020016114a6979695949392919061259c565b6040516020818303038152906040528051906020012090506114c781611849565b90506002600082815260200190815260200160002060009054906101000a900460ff161561152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190612669565b60405180910390fd5b6115348184611879565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906126d5565b60405180910390fd5b60016002600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508482600001516115dd91906126f5565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506116848686846060015173ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff167f8f7ed91db14906804e8af6e610b463affb6ae634df5652729578f321300fb4d089896040516116fe929190611ee0565b60405180910390a45050505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161174493929190611fe1565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117929190612304565b6000604051808303816000865af19150503d80600081146117cf576040519150601f19603f3d011682016040523d82523d6000602084013e6117d4565b606091505b5091509150818015611802575060008151148061180157508080602001905181019061180091906123c2565b5b5b611841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611838906127ab565b60405180910390fd5b505050505050565b60008160405160200161185c9190612843565b604051602081830303815290604052805190602001209050919050565b600080600080611888856118ee565b809350819450829550505050600186848484604051600081526020016040526040516118b79493929190612894565b6020604051602081039080840390855afa1580156118d9573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000806000604184511461190157600080fd5b6020840151915060408401519050606084015160001a92509193909250565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61194781611934565b811461195257600080fd5b50565b6000813590506119648161193e565b92915050565b6000602082840312156119805761197f61192a565b5b600061198e84828501611955565b91505092915050565b60008115159050919050565b6119ac81611997565b82525050565b60006020820190506119c760008301846119a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119f8826119cd565b9050919050565b611a08816119ed565b8114611a1357600080fd5b50565b600081359050611a25816119ff565b92915050565b6000819050919050565b611a3e81611a2b565b8114611a4957600080fd5b50565b600081359050611a5b81611a35565b92915050565b60008060408385031215611a7857611a7761192a565b5b6000611a8685828601611a16565b9250506020611a9785828601611a4c565b9150509250929050565b60008060408385031215611ab857611ab761192a565b5b6000611ac685828601611a16565b9250506020611ad785828601611a16565b9150509250929050565b600060208284031215611af757611af661192a565b5b6000611b0584828501611a16565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611b3381611b0e565b82525050565b600067ffffffffffffffff82169050919050565b611b5681611b39565b82525050565b611b65816119ed565b82525050565b6000608082019050611b806000830187611b2a565b611b8d6020830186611b4d565b611b9a6040830185611b4d565b611ba76060830184611b5c565b95945050505050565b6000602082019050611bc56000830184611b5c565b92915050565b611bd481611997565b8114611bdf57600080fd5b50565b600081359050611bf181611bcb565b92915050565b600060208284031215611c0d57611c0c61192a565b5b6000611c1b84828501611be2565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c7782611c2e565b810181811067ffffffffffffffff82111715611c9657611c95611c3f565b5b80604052505050565b6000611ca9611920565b9050611cb58282611c6e565b919050565b600067ffffffffffffffff821115611cd557611cd4611c3f565b5b611cde82611c2e565b9050602081019050919050565b82818337600083830152505050565b6000611d0d611d0884611cba565b611c9f565b905082815260208101848484011115611d2957611d28611c29565b5b611d34848285611ceb565b509392505050565b600082601f830112611d5157611d50611c24565b5b8135611d61848260208601611cfa565b91505092915050565b600080600080600060a08688031215611d8657611d8561192a565b5b6000611d9488828901611a16565b9550506020611da588828901611a16565b9450506040611db688828901611a4c565b9350506060611dc788828901611a4c565b925050608086013567ffffffffffffffff811115611de857611de761192f565b5b611df488828901611d3c565b9150509295509295909350565b600080600060608486031215611e1a57611e1961192a565b5b6000611e2886828701611a16565b9350506020611e3986828701611a4c565b9250506040611e4a86828701611a16565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e9b602083611e54565b9150611ea682611e65565b602082019050919050565b60006020820190508181036000830152611eca81611e8e565b9050919050565b611eda81611a2b565b82525050565b6000604082019050611ef56000830185611b5c565b611f026020830184611ed1565b9392505050565b7f636c6f7365640000000000000000000000000000000000000000000000000000600082015250565b6000611f3f600683611e54565b9150611f4a82611f09565b602082019050919050565b60006020820190508181036000830152611f6e81611f32565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b6000611fab601183611e54565b9150611fb682611f75565b602082019050919050565b60006020820190508181036000830152611fda81611f9e565b9050919050565b6000606082019050611ff66000830186611b5c565b6120036020830185611b5c565b6120106040830184611ed1565b949350505050565b7f6973207061757365640000000000000000000000000000000000000000000000600082015250565b600061204e600983611e54565b915061205982612018565b602082019050919050565b6000602082019050818103600083015261207d81612041565b9050919050565b7f7369676e657220616c7265616479207761732075736564000000000000000000600082015250565b60006120ba601783611e54565b91506120c582612084565b602082019050919050565b600060208201905081810360008301526120e9816120ad565b9050919050565b6000815190506120ff81611a35565b92915050565b60006020828403121561211b5761211a61192a565b5b6000612129848285016120f0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c82611a2b565b915061217783611a2b565b925082820390508181111561218f5761218e612132565b5b92915050565b7f746f6f2062696720616d6f756e74000000000000000000000000000000000000600082015250565b60006121cb600e83611e54565b91506121d682612195565b602082019050919050565b600060208201905081810360008301526121fa816121be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061225d602683611e54565b915061226882612201565b604082019050919050565b6000602082019050818103600083015261228c81612250565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156122c75780820151818401526020810190506122ac565b60008484015250505050565b60006122de82612293565b6122e8818561229e565b93506122f88185602086016122a9565b80840191505092915050565b600061231082846122d3565b915081905092915050565b7f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960008201527f4c45440000000000000000000000000000000000000000000000000000000000602082015250565b6000612377602383611e54565b91506123828261231b565b604082019050919050565b600060208201905081810360008301526123a68161236a565b9050919050565b6000815190506123bc81611bcb565b92915050565b6000602082840312156123d8576123d761192a565b5b60006123e6848285016123ad565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000612425601f83611e54565b9150612430826123ef565b602082019050919050565b6000602082019050818103600083015261245481612418565b9050919050565b7f756e6465722076657374696e6700000000000000000000000000000000000000600082015250565b6000612491600d83611e54565b915061249c8261245b565b602082019050919050565b600060208201905081810360008301526124c081612484565b9050919050565b7f6578706972656400000000000000000000000000000000000000000000000000600082015250565b60006124fd600783611e54565b9150612508826124c7565b602082019050919050565b6000602082019050818103600083015261252c816124f0565b9050919050565b60008160601b9050919050565b600061254b82612533565b9050919050565b600061255d82612540565b9050919050565b612575612570826119ed565b612552565b82525050565b6000819050919050565b61259661259182611a2b565b61257b565b82525050565b60006125a8828a612564565b6014820191506125b88289612564565b6014820191506125c88288612564565b6014820191506125d88287612585565b6020820191506125e88286612585565b6020820191506125f88285612585565b6020820191506126088284612564565b60148201915081905098975050505050505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612653600f83611e54565b915061265e8261261d565b602082019050919050565b6000602082019050818103600083015261268281612646565b9050919050565b7f77726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b60006126bf600f83611e54565b91506126ca82612689565b602082019050919050565b600060208201905081810360008301526126ee816126b2565b9050919050565b600061270082611b0e565b915061270b83611b0e565b925082820390506fffffffffffffffffffffffffffffffff81111561273357612732612132565b5b92915050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b6000612795602483611e54565b91506127a082612739565b604082019050919050565b600060208201905081810360008301526127c481612788565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061280c601c836127cb565b9150612817826127d6565b601c82019050919050565b6000819050919050565b61283d61283882611934565b612822565b82525050565b600061284e826127ff565b915061285a828461282c565b60208201915081905092915050565b61287281611934565b82525050565b600060ff82169050919050565b61288e81612878565b82525050565b60006080820190506128a96000830187612869565b6128b66020830186612885565b6128c36040830185612869565b6128d06060830184612869565b9594505050505056fea26469706673582212202575d8ff22576d9b58837edde49343fe5b5f1655bf6e687d527c217295b067f164736f6c63430008130033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063b187bd2611610071578063b187bd2614610167578063bedb86fb14610185578063cbc20fe0146101a1578063dcc4a5fc146101bd578063f2fde38b146101d9578063f6368f7b146101f5576100a9565b806311c16896146100ae57806357376198146100de578063690e6cc2146100fa5780638c86f0a7146101165780638da5cb5b14610149575b600080fd5b6100c860048036038101906100c3919061196a565b610211565b6040516100d591906119b2565b60405180910390f35b6100f860048036038101906100f39190611a61565b610231565b005b610114600480360381019061010f9190611aa1565b610371565b005b610130600480360381019061012b9190611ae1565b610753565b6040516101409493929190611b6b565b60405180910390f35b6101516107e7565b60405161015e9190611bb0565b60405180910390f35b61016f610810565b60405161017c91906119b2565b60405180910390f35b61019f600480360381019061019a9190611bf7565b610823565b005b6101bb60048036038101906101b69190611d6a565b6108b5565b005b6101d760048036038101906101d29190611e01565b61091a565b005b6101f360048036038101906101ee9190611ae1565b610d34565b005b61020f600480360381019061020a9190611d6a565b610ed5565b005b60026020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166102506107e7565b73ffffffffffffffffffffffffffffffffffffffff16146102a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029d90611eb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361030857610303813373ffffffffffffffffffffffffffffffffffffffff16610f3a90919063ffffffff16565b610334565b61033333828473ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b5b7f542fa6bfee3b4746210fbdd1d83f9e49b65adde3639f8d8f165dd18347938af28282604051610365929190611ee0565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff166103906107e7565b73ffffffffffffffffffffffffffffffffffffffff16146103e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103dd90611eb1565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff16141580156105a65750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6105e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dc90611f55565b60405180910390fd5b600081600001516fffffffffffffffffffffffffffffffff160361063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590611fc1565b60405180910390fd5b6106838282600001516fffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f3ec192272fa9cf7c91850e76dbc4eb1665ed08972b0eca02adcfa50a875ed3d0838383600001516fffffffffffffffffffffffffffffffff1660405161074693929190611fe1565b60405180910390a1505050565b60016020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166108426107e7565b73ffffffffffffffffffffffffffffffffffffffff1614610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90611eb1565b60405180910390fd5b80600360006101000a81548160ff02191690831515021790555050565b600360009054906101000a900460ff1615610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90612064565b60405180910390fd5b610913853386868686611170565b5050505050565b600360009054906101000a900460ff161561096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612064565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610a355750600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b906120d0565b60405180910390fd5b82600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b309190611bb0565b602060405180830381865afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190612105565b9050610ba03330858773ffffffffffffffffffffffffffffffffffffffff16611710909392919063ffffffff16565b808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bda9190611bb0565b602060405180830381865afa158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190612105565b610c259190612161565b92507001000000000000000000000000000000008310610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c71906121e1565b60405180910390fd5b82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f8bb035a14e427c40fc1fb7f442d2a84d053d2cf217513ca816ca3a8af748c56c828585604051610d2693929190611fe1565b60405180910390a150505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d536107e7565b73ffffffffffffffffffffffffffffffffffffffff1614610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da090611eb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90612273565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900460ff1615610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90612064565b60405180910390fd5b610f33858586868686611170565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115610f6f57610f6e611c3f565b5b6040519080825280601f01601f191660200182016040528015610fa15781602001600182028036833780820191505090505b50604051610faf9190612304565b60006040518083038185875af1925050503d8060008114610fec576040519150601f19603f3d011682016040523d82523d6000602084013e610ff1565b606091505b5050905080611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c9061238d565b60405180910390fd5b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb858560405160240161106c929190611ee0565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516110ba9190612304565b6000604051808303816000865af19150503d80600081146110f7576040519150601f19603f3d011682016040523d82523d6000602084013e6110fc565b606091505b509150915081801561112a575060008151148061112957508080602001905181019061112891906123c2565b5b5b611169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111609061243b565b60405180910390fd5b5050505050565b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff16141580156113305750600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b61136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690611f55565b60405180910390fd5b8381600001516fffffffffffffffffffffffffffffffff1610156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90611fc1565b60405180910390fd5b42816020015167ffffffffffffffff161115611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906124a7565b60405180910390fd5b6000816040015167ffffffffffffffff161480611444575042816040015167ffffffffffffffff1610155b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90612513565b60405180910390fd5b600087826060015188878746306040516020016114a6979695949392919061259c565b6040516020818303038152906040528051906020012090506114c781611849565b90506002600082815260200190815260200160002060009054906101000a900460ff161561152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190612669565b60405180910390fd5b6115348184611879565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906126d5565b60405180910390fd5b60016002600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508482600001516115dd91906126f5565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506116848686846060015173ffffffffffffffffffffffffffffffffffffffff1661103a9092919063ffffffff16565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff167f8f7ed91db14906804e8af6e610b463affb6ae634df5652729578f321300fb4d089896040516116fe929190611ee0565b60405180910390a45050505050505050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161174493929190611fe1565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117929190612304565b6000604051808303816000865af19150503d80600081146117cf576040519150601f19603f3d011682016040523d82523d6000602084013e6117d4565b606091505b5091509150818015611802575060008151148061180157508080602001905181019061180091906123c2565b5b5b611841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611838906127ab565b60405180910390fd5b505050505050565b60008160405160200161185c9190612843565b604051602081830303815290604052805190602001209050919050565b600080600080611888856118ee565b809350819450829550505050600186848484604051600081526020016040526040516118b79493929190612894565b6020604051602081039080840390855afa1580156118d9573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000806000604184511461190157600080fd5b6020840151915060408401519050606084015160001a92509193909250565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61194781611934565b811461195257600080fd5b50565b6000813590506119648161193e565b92915050565b6000602082840312156119805761197f61192a565b5b600061198e84828501611955565b91505092915050565b60008115159050919050565b6119ac81611997565b82525050565b60006020820190506119c760008301846119a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119f8826119cd565b9050919050565b611a08816119ed565b8114611a1357600080fd5b50565b600081359050611a25816119ff565b92915050565b6000819050919050565b611a3e81611a2b565b8114611a4957600080fd5b50565b600081359050611a5b81611a35565b92915050565b60008060408385031215611a7857611a7761192a565b5b6000611a8685828601611a16565b9250506020611a9785828601611a4c565b9150509250929050565b60008060408385031215611ab857611ab761192a565b5b6000611ac685828601611a16565b9250506020611ad785828601611a16565b9150509250929050565b600060208284031215611af757611af661192a565b5b6000611b0584828501611a16565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611b3381611b0e565b82525050565b600067ffffffffffffffff82169050919050565b611b5681611b39565b82525050565b611b65816119ed565b82525050565b6000608082019050611b806000830187611b2a565b611b8d6020830186611b4d565b611b9a6040830185611b4d565b611ba76060830184611b5c565b95945050505050565b6000602082019050611bc56000830184611b5c565b92915050565b611bd481611997565b8114611bdf57600080fd5b50565b600081359050611bf181611bcb565b92915050565b600060208284031215611c0d57611c0c61192a565b5b6000611c1b84828501611be2565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c7782611c2e565b810181811067ffffffffffffffff82111715611c9657611c95611c3f565b5b80604052505050565b6000611ca9611920565b9050611cb58282611c6e565b919050565b600067ffffffffffffffff821115611cd557611cd4611c3f565b5b611cde82611c2e565b9050602081019050919050565b82818337600083830152505050565b6000611d0d611d0884611cba565b611c9f565b905082815260208101848484011115611d2957611d28611c29565b5b611d34848285611ceb565b509392505050565b600082601f830112611d5157611d50611c24565b5b8135611d61848260208601611cfa565b91505092915050565b600080600080600060a08688031215611d8657611d8561192a565b5b6000611d9488828901611a16565b9550506020611da588828901611a16565b9450506040611db688828901611a4c565b9350506060611dc788828901611a4c565b925050608086013567ffffffffffffffff811115611de857611de761192f565b5b611df488828901611d3c565b9150509295509295909350565b600080600060608486031215611e1a57611e1961192a565b5b6000611e2886828701611a16565b9350506020611e3986828701611a4c565b9250506040611e4a86828701611a16565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611e9b602083611e54565b9150611ea682611e65565b602082019050919050565b60006020820190508181036000830152611eca81611e8e565b9050919050565b611eda81611a2b565b82525050565b6000604082019050611ef56000830185611b5c565b611f026020830184611ed1565b9392505050565b7f636c6f7365640000000000000000000000000000000000000000000000000000600082015250565b6000611f3f600683611e54565b9150611f4a82611f09565b602082019050919050565b60006020820190508181036000830152611f6e81611f32565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b6000611fab601183611e54565b9150611fb682611f75565b602082019050919050565b60006020820190508181036000830152611fda81611f9e565b9050919050565b6000606082019050611ff66000830186611b5c565b6120036020830185611b5c565b6120106040830184611ed1565b949350505050565b7f6973207061757365640000000000000000000000000000000000000000000000600082015250565b600061204e600983611e54565b915061205982612018565b602082019050919050565b6000602082019050818103600083015261207d81612041565b9050919050565b7f7369676e657220616c7265616479207761732075736564000000000000000000600082015250565b60006120ba601783611e54565b91506120c582612084565b602082019050919050565b600060208201905081810360008301526120e9816120ad565b9050919050565b6000815190506120ff81611a35565b92915050565b60006020828403121561211b5761211a61192a565b5b6000612129848285016120f0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c82611a2b565b915061217783611a2b565b925082820390508181111561218f5761218e612132565b5b92915050565b7f746f6f2062696720616d6f756e74000000000000000000000000000000000000600082015250565b60006121cb600e83611e54565b91506121d682612195565b602082019050919050565b600060208201905081810360008301526121fa816121be565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061225d602683611e54565b915061226882612201565b604082019050919050565b6000602082019050818103600083015261228c81612250565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156122c75780820151818401526020810190506122ac565b60008484015250505050565b60006122de82612293565b6122e8818561229e565b93506122f88185602086016122a9565b80840191505092915050565b600061231082846122d3565b915081905092915050565b7f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960008201527f4c45440000000000000000000000000000000000000000000000000000000000602082015250565b6000612377602383611e54565b91506123828261231b565b604082019050919050565b600060208201905081810360008301526123a68161236a565b9050919050565b6000815190506123bc81611bcb565b92915050565b6000602082840312156123d8576123d761192a565b5b60006123e6848285016123ad565b91505092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000612425601f83611e54565b9150612430826123ef565b602082019050919050565b6000602082019050818103600083015261245481612418565b9050919050565b7f756e6465722076657374696e6700000000000000000000000000000000000000600082015250565b6000612491600d83611e54565b915061249c8261245b565b602082019050919050565b600060208201905081810360008301526124c081612484565b9050919050565b7f6578706972656400000000000000000000000000000000000000000000000000600082015250565b60006124fd600783611e54565b9150612508826124c7565b602082019050919050565b6000602082019050818103600083015261252c816124f0565b9050919050565b60008160601b9050919050565b600061254b82612533565b9050919050565b600061255d82612540565b9050919050565b612575612570826119ed565b612552565b82525050565b6000819050919050565b61259661259182611a2b565b61257b565b82525050565b60006125a8828a612564565b6014820191506125b88289612564565b6014820191506125c88288612564565b6014820191506125d88287612585565b6020820191506125e88286612585565b6020820191506125f88285612585565b6020820191506126088284612564565b60148201915081905098975050505050505050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000612653600f83611e54565b915061265e8261261d565b602082019050919050565b6000602082019050818103600083015261268281612646565b9050919050565b7f77726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b60006126bf600f83611e54565b91506126ca82612689565b602082019050919050565b600060208201905081810360008301526126ee816126b2565b9050919050565b600061270082611b0e565b915061270b83611b0e565b925082820390506fffffffffffffffffffffffffffffffff81111561273357612732612132565b5b92915050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b6000612795602483611e54565b91506127a082612739565b604082019050919050565b600060208201905081810360008301526127c481612788565b9050919050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061280c601c836127cb565b9150612817826127d6565b601c82019050919050565b6000819050919050565b61283d61283882611934565b612822565b82525050565b600061284e826127ff565b915061285a828461282c565b60208201915081905092915050565b61287281611934565b82525050565b600060ff82169050919050565b61288e81612878565b82525050565b60006080820190506128a96000830187612869565b6128b66020830186612885565b6128c36040830185612869565b6128d06060830184612869565b9594505050505056fea26469706673582212202575d8ff22576d9b58837edde49343fe5b5f1655bf6e687d527c217295b067f164736f6c63430008130033