false
true
0

Contract Address Details

0x037870bdF00946c7385c241845D32d5A11Afbcc3

Contract Name
SushiMaker
Creator
0x58b4b6–7d3503 at 0x6a0b61–8eb930
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26237958
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
SushiMaker




Optimization enabled
true
Compiler version
v0.8.10+commit.fc410830




Optimization runs
99999
EVM Version
london




Verified at
2026-04-08T08:44:05.015280Z

Constructor Arguments

0000000000000000000000003027a0c4e35272c0707de2651a0638c3df1c37ac00000000000000000000000010025a49f69ba9445e9b81d0003b235ee629115f000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff4272

Arg [0] (address) : 0x3027a0c4e35272c0707de2651a0638c3df1c37ac
Arg [1] (address) : 0x10025a49f69ba9445e9b81d0003b235ee629115f
Arg [2] (address) : 0xc0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac
Arg [3] (address) : 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] (address) : 0x6b3595068778dd592e39a122f4f5a5cf09c90fe2
Arg [5] (address) : 0x8798249c2e607446efb7ad49ec89dd1865ff4272

              

contracts/SushiMaker.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "./WethMaker.sol";

/// @notice Contract for selling weth to sushi. Deploy on mainnet.
contract SushiMaker is WethMaker {

    event Serve(uint256 amount);

    address public immutable sushi;
    address public immutable xSushi;

    constructor(
        address owner,
        address user,
        address factory,
        address weth,
        address _sushi,
        address _xSushi
    ) WethMaker(owner, user, factory, weth) {
        sushi = _sushi;
        xSushi = _xSushi;
    }

    function buySushi(uint256 amountIn, uint256 minOutAmount) external onlyTrusted returns (uint256 amountOut) {
        amountOut = _swap(weth, sushi, amountIn, xSushi);
        if (amountOut < minOutAmount) revert SlippageProtection();
        emit Serve(amountOut);
    }

    function sweep(uint256 amount) external onlyTrusted {
        IERC20(sushi).transfer(xSushi, amount);
        emit Serve(amount);
    }

    // In case we receive any unwrapped ethereum we can call this.
    function wrapEth() external {
        weth.call{value: address(this).balance}("");
    }

}
        

/IUniV2Factory.sol

// SPDX-License-Identifier: GPL-3.0-or-later

interface IUniV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address);
}
          

/IUniV2.sol

// SPDX-License-Identifier: GPL-3.0-or-later

import "./IERC20.sol";

interface IUniV2 is IERC20 {
    function totalSupply() external view returns (uint256);
    function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast);
    function burn(address to) external returns (uint256 amount0, uint256 amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function token0() external view returns (address);
    function token1() external view returns (address);
}
          

/Auth.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

abstract contract Auth {

    event SetOwner(address indexed owner);
    event SetTrusted(address indexed user, bool isTrusted);

    address public owner;

    mapping(address => bool) public trusted;

    error OnlyOwner();
    error OnlyTrusted();

    modifier onlyOwner() {
        if (msg.sender != owner) revert OnlyOwner();
        _;
    }

    modifier onlyTrusted() {
        if (!trusted[msg.sender]) revert OnlyTrusted();
        _;
    }

    constructor(address newOwner, address trustedUser) {
        owner = newOwner;
        trusted[trustedUser] = true;

        emit SetOwner(owner);
        emit SetTrusted(trustedUser, true);
    }

    function setOwner(address newOwner) external onlyOwner {
        owner = newOwner;
        emit SetOwner(newOwner);
    }

    function setTrusted(address user, bool isTrusted) external onlyOwner {
        trusted[user] = isTrusted;
        emit SetTrusted(user, isTrusted);
    }

}
          

/Unwindooor.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "./Auth.sol";
import "./interfaces/IUniV2.sol";
import "./interfaces/IUniV2Factory.sol";

/// @notice Contract for withdrawing LP positions.
/// @dev Calling unwindPairs() withdraws the LP position into one of the two tokens
contract Unwindooor is Auth {

    error SlippageProtection();
    error TransferFailed();

    bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

    IUniV2Factory public immutable factory;

    constructor(
        address owner,
        address user,
        address factoryAddress
    ) Auth(owner, user) {
        factory = IUniV2Factory(factoryAddress);
    }

    // We remove liquidity and sell tokensB[i] for tokensA[i].
    function unwindPairs(
        address[] calldata tokensA,
        address[] calldata tokensB,
        uint256[] calldata amounts,
        uint256[] calldata minimumOuts
    ) external onlyTrusted {
        for (uint256 i = 0; i < tokensA.length; i++) {
            
            address tokenA = tokensA[i];
            address tokenB = tokensB[i];
            bool keepToken0 = tokenA < tokenB;
            address pair = _pairFor(tokenA, tokenB);

            if (_unwindPair(IUniV2(pair), amounts[i], keepToken0, tokenB) < minimumOuts[i]) revert SlippageProtection();
        }
    }

    // Burn liquidity and sell one of the tokens for the other.
    function _unwindPair(
        IUniV2 pair,
        uint256 amount,
        bool keepToken0,
        address tokenToSell
    ) private returns (uint256 amountOut) {

        pair.transfer(address(pair), amount);
        (uint256 amount0, uint256 amount1) = pair.burn(address(this));
        (uint112 reserve0, uint112 reserve1,) = pair.getReserves();

        if (keepToken0) {
            _safeTransfer(tokenToSell, address(pair), amount1);
            amountOut = _getAmountOut(amount1, uint256(reserve1), uint256(reserve0));
            pair.swap(amountOut, 0, address(this), "");
            amountOut += amount0;
        } else {
            _safeTransfer(tokenToSell, address(pair), amount0);
            amountOut = _getAmountOut(amount0, uint256(reserve0), uint256(reserve1));
            pair.swap(0, amountOut, address(this), "");
            amountOut += amount1;
        }
    }

    // In case we don't want to sell one of the tokens for the other.
    function burnPairs(
        IUniV2[] calldata lpTokens,
        uint256[] calldata amounts,
        uint256[] calldata minimumOut0,
        uint256[] calldata minimumOut1
    ) external onlyTrusted {
        for (uint256 i = 0; i < lpTokens.length; i++) {
            IUniV2 pair = lpTokens[i];
            pair.transfer(address(pair), amounts[i]);
            (uint256 amount0, uint256 amount1) = pair.burn(address(this));
            if (amount0 < minimumOut0[i] || amount1 < minimumOut1[i]) revert SlippageProtection();
        }
    }

    function _getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256) {
        uint256 amountInWithFee = amountIn * 997;
        uint256 numerator = amountInWithFee * reserveOut;
        uint256 denominator = reserveIn * 1000 + amountInWithFee;
        return numerator / denominator;
    }

    function _safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, to, value));
        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) revert TransferFailed();
    }

    function _pairFor(address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        pair = address(uint160(uint256(keccak256(abi.encodePacked(
            hex'ff',
            factory,
            keccak256(abi.encodePacked(token0, token1)),
            hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
        )))));
    }

}
          

/WethMaker.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "./Unwindooor.sol";

/// @notice Contract for selling received tokens into weth. Deploy on secondary networks.
contract WethMaker is Unwindooor {

    event SetBridge(address indexed token, address bridge);

    address public immutable weth;

    mapping(address => address) public bridges;

    constructor(
        address owner,
        address user,
        address factory,
        address _weth
    ) Unwindooor(owner, user, factory) {
        weth = _weth;
    }

    function setBridge(address token, address bridge) external onlyOwner {
        bridges[token] = bridge;
        emit SetBridge(token, bridge);
    }

    // Exchange token for weth or its bridge token (which gets converted into weth in subsequent transactions).
    function buyWeth(
        address[] calldata tokens,
        uint256[] calldata amountsIn,
        uint256[] calldata minimumOuts
    ) external onlyTrusted {
        for (uint256 i = 0; i < tokens.length; i++) {

            address tokenIn = tokens[i];
            address outToken = bridges[tokenIn] == address(0) ? weth : bridges[tokenIn];
            if (_swap(tokenIn, outToken, amountsIn[i], address(this)) < minimumOuts[i]) revert SlippageProtection();
            
        }
    }

    function _swap(
        address tokenIn,
        address tokenOut,
        uint256 amountIn,
        address to
    ) internal returns (uint256 outAmount) {

        IUniV2 pair = IUniV2(factory.getPair(tokenIn, tokenOut));
        IERC20(tokenIn).transfer(address(pair), amountIn);

        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();

        if (tokenIn < tokenOut) {

            outAmount = _getAmountOut(amountIn, reserve0, reserve1);
            pair.swap(0, outAmount, to, "");

        } else {

            outAmount = _getAmountOut(amountIn, reserve1, reserve0);
            pair.swap(outAmount, 0, to, "");

        }

    }

    // Allow the owner to withdraw the funds and bridge them to mainnet.
    function withdraw(address token, address to, uint256 _value) onlyOwner external {
        if (token != address(0)) {
            _safeTransfer(token, to, _value);
        } else {
            (bool success, ) = to.call{value: _value}("");
            require(success);
        }
    }

    function doAction(address to, uint256 _value, bytes memory data) onlyOwner external {
        (bool success, ) = to.call{value: _value}(data);
        require(success);
    }

    receive() external payable {}

}
          

/IERC20.sol

// SPDX-License-Identifier: GPL-3.0-or-later

interface IERC20 {
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function balanceOf(address addy) external view returns (uint256);
}
          

Compiler Settings

{"remappings":[],"optimizer":{"runs":99999,"enabled":true},"metadata":{"useLiteralContent":true,"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"contracts/SushiMaker.sol":"SushiMaker"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"user","internalType":"address"},{"type":"address","name":"factory","internalType":"address"},{"type":"address","name":"weth","internalType":"address"},{"type":"address","name":"_sushi","internalType":"address"},{"type":"address","name":"_xSushi","internalType":"address"}]},{"type":"error","name":"OnlyOwner","inputs":[]},{"type":"error","name":"OnlyTrusted","inputs":[]},{"type":"error","name":"SlippageProtection","inputs":[]},{"type":"error","name":"TransferFailed","inputs":[]},{"type":"event","name":"Serve","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetBridge","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"bridge","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetOwner","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetTrusted","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"bool","name":"isTrusted","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"bridges","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnPairs","inputs":[{"type":"address[]","name":"lpTokens","internalType":"contract IUniV2[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"uint256[]","name":"minimumOut0","internalType":"uint256[]"},{"type":"uint256[]","name":"minimumOut1","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"}],"name":"buySushi","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"minOutAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyWeth","inputs":[{"type":"address[]","name":"tokens","internalType":"address[]"},{"type":"uint256[]","name":"amountsIn","internalType":"uint256[]"},{"type":"uint256[]","name":"minimumOuts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doAction","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniV2Factory"}],"name":"factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBridge","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"bridge","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTrusted","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"bool","name":"isTrusted","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sushi","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sweep","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trusted","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unwindPairs","inputs":[{"type":"address[]","name":"tokensA","internalType":"address[]"},{"type":"address[]","name":"tokensB","internalType":"address[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"uint256[]","name":"minimumOuts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"weth","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"wrapEth","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"xSushi","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6101006040523480156200001257600080fd5b506040516200238d3803806200238d83398101604081905262000035916200013c565b600080546001600160a01b0319166001600160a01b038881169190911782558681168252600160208190526040808420805460ff19169092179091558254905189938993899389938793879387938693869391909216917f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb59190a2604051600181526001600160a01b038216907f878d105ed19c01e992a54459c2f04ba19432ac45600b42ce340d0342722074369060200160405180910390a250506001600160a01b0390811660805292831660a052505094851660c0525050501660e05250620001bd92505050565b80516001600160a01b03811681146200013757600080fd5b919050565b60008060008060008060c087890312156200015657600080fd5b62000161876200011f565b955062000171602088016200011f565b945062000181604088016200011f565b935062000191606088016200011f565b9250620001a1608088016200011f565b9150620001b160a088016200011f565b90509295509295509295565b60805160a05160c05160e05161215762000236600039600081816103e6015281816105970152610dce01526000818161014b015281816105750152610dfd0152600081816102190152818161055401528181610c930152610ebb01526000818161036f015281816110dc01526114a101526121576000f3fe60806040526004361061012d5760003560e01c80639d22ae8c116100a5578063c45a015511610074578063d298460811610059578063d2984608146103d4578063d9caed1214610408578063f32a12ac1461042857600080fd5b8063c45a01551461035d578063ced67f0c1461039157600080fd5b80639d22ae8c146102e85780639dd8a81c14610308578063aa60e73314610328578063b081b4eb1461034857600080fd5b80633fc8cef3116100fc5780636e9821c2116100e15780636e9821c21461025b5780638da5cb5b1461029b5780638e9be9f4146102c857600080fd5b80633fc8cef31461020757806354a0af171461023b57600080fd5b80630a0879031461013957806313af403514610197578063225bf435146101b9578063248091c0146101e757600080fd5b3661013457005b600080fd5b34801561014557600080fd5b5061016d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a357600080fd5b506101b76101b2366004611b15565b610448565b005b3480156101c557600080fd5b506101d96101d4366004611b39565b610506565b60405190815260200161018e565b3480156101f357600080fd5b506101b7610202366004611ba7565b610630565b34801561021357600080fd5b5061016d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561024757600080fd5b506101b7610256366004611c9a565b6108a9565b34801561026757600080fd5b5061028b610276366004611b15565b60016020526000908152604090205460ff1681565b604051901515815260200161018e565b3480156102a757600080fd5b5060005461016d9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102d457600080fd5b506101b76102e3366004611ba7565b610978565b3480156102f457600080fd5b506101b7610303366004611d85565b610ad8565b34801561031457600080fd5b506101b7610323366004611dbe565b610bb6565b34801561033457600080fd5b506101b7610343366004611e58565b610d48565b34801561035457600080fd5b506101b7610ea1565b34801561036957600080fd5b5061016d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039d57600080fd5b5061016d6103ac366004611b15565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103e057600080fd5b5061016d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561041457600080fd5b506101b7610423366004611e71565b610f1c565b34801561043457600080fd5b506101b7610443366004611ec0565b610fb6565b60005473ffffffffffffffffffffffffffffffffffffffff163314610499576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb591a250565b3360009081526001602052604081205460ff1661054f576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105bb7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000857f000000000000000000000000000000000000000000000000000000000000000061108a565b9050818110156105f7576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518181527f4bd1bdc2f263261c65e1cf0d8f7908b6fbf4b4906bafb6a28e11aafdc86c326e9060200160405180910390a192915050565b3360009081526001602052604090205460ff16610679576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8781101561089e57600089898381811061069857610698611eee565b90506020020160208101906106ad9190611b15565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a8a868181106106de576106de611eee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff909416600485015260200291909101356024830152506044016020604051808303816000875af1158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190611f1d565b506040517f89afcb44000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906389afcb449060240160408051808303816000875af11580156107ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108109190611f3a565b9150915087878581811061082657610826611eee565b90506020020135821080610851575085858581811061084757610847611eee565b9050602002013581105b15610888576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050808061089690611f8d565b91505061067c565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108fa576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1683836040516109229190611fc6565b60006040518083038185875af1925050503d806000811461095f576040519150601f19603f3d011682016040523d82523d6000602084013e610964565b606091505b505090508061097257600080fd5b50505050565b3360009081526001602052604090205460ff166109c1576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8781101561089e5760008989838181106109e0576109e0611eee565b90506020020160208101906109f59190611b15565b90506000888884818110610a0b57610a0b611eee565b9050602002016020810190610a209190611b15565b905073ffffffffffffffffffffffffffffffffffffffff808216908316106000610a4a848461141f565b9050868686818110610a5e57610a5e611eee565b90506020020135610a89828b8b89818110610a7b57610a7b611eee565b9050602002013585876115a6565b1015610ac1576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050508080610ad090611f8d565b9150506109c4565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b29576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526002602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055905192835290917f8357797ab855a0bad5103ea8bd2f21f986350e94d73f143ae114db8f0db5a93a91015b60405180910390a25050565b3360009081526001602052604090205460ff16610bff576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610d3f576000878783818110610c1e57610c1e611eee565b9050602002016020810190610c339190611b15565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040812054929350911615610c915773ffffffffffffffffffffffffffffffffffffffff80831660009081526002602052604090205416610cb3565b7f00000000000000000000000000000000000000000000000000000000000000005b9050848484818110610cc757610cc7611eee565b90506020020135610cf283838a8a88818110610ce557610ce5611eee565b905060200201353061108a565b1015610d2a576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080610d3790611f8d565b915050610c02565b50505050505050565b3360009081526001602052604090205460ff16610d91576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6a9190611f1d565b506040518181527f4bd1bdc2f263261c65e1cf0d8f7908b6fbf4b4906bafb6a28e11aafdc86c326e9060200160405180910390a150565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016904790600081818185875af1925050503d8060008114610f17576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f6d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831615610f9457610f1783838361192c565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610922565b60005473ffffffffffffffffffffffffffffffffffffffff163314611007576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f878d105ed19c01e992a54459c2f04ba19432ac45600b42ce340d0342722074369101610baa565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063e6a4390590604401602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190612001565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152602482018790529192509087169063a9059cbb906044016020604051808303816000875af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e49190611f1d565b506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612041565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161015611364576112bb868383611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526000600482018190526024820183905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484015260848301919091529195509084169063022c0d9f9060a401600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b50505050611414565b61136f868284611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526004810182905260006024820181905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484015260848301919091529195509084169063022c0d9f9060a401600060405180830381600087803b1580156113fb57600080fd5b505af115801561140f573d6000803e3d6000fd5b505050505b505050949350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061145e578385611461565b84845b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091507f000000000000000000000000000000000000000000000000000000000000000090604801604051602081830303815290604052805190602001206040516020016115679291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012095945050505050565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482018190526024820185905260009163a9059cbb906044016020604051808303816000875af115801561161c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116409190611f1d565b506040517f89afcb44000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8816906389afcb449060240160408051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190611f3a565b915091506000808873ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b9190612041565b5091509150861561183d57611761868a8561192c565b61178c83826dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff16611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526004810182905260006024820181905230604483015260806064830152608482015290955073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9060a401600060405180830381600087803b15801561181257600080fd5b505af1158015611826573d6000803e3d6000fd5b5050505083856118369190612091565b9450611920565b611848868a8661192c565b61187384836dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526000600482018190526024820183905230604483015260806064830152608482015290955073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9060a401600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b50505050828561191d9190612091565b94505b50505050949350505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928716916119f39190611fc6565b6000604051808303816000865af19150503d8060008114611a30576040519150601f19603f3d011682016040523d82523d6000602084013e611a35565b606091505b5091509150811580611a635750805115801590611a63575080806020019051810190611a619190611f1d565b155b15611a9a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600080611ab0856103e56120a9565b90506000611abe84836120a9565b9050600082611acf876103e86120a9565b611ad99190612091565b9050611ae581836120e6565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b1257600080fd5b50565b600060208284031215611b2757600080fd5b8135611b3281611af0565b9392505050565b60008060408385031215611b4c57600080fd5b50508035926020909101359150565b60008083601f840112611b6d57600080fd5b50813567ffffffffffffffff811115611b8557600080fd5b6020830191508360208260051b8501011115611ba057600080fd5b9250929050565b6000806000806000806000806080898b031215611bc357600080fd5b883567ffffffffffffffff80821115611bdb57600080fd5b611be78c838d01611b5b565b909a50985060208b0135915080821115611c0057600080fd5b611c0c8c838d01611b5b565b909850965060408b0135915080821115611c2557600080fd5b611c318c838d01611b5b565b909650945060608b0135915080821115611c4a57600080fd5b50611c578b828c01611b5b565b999c989b5096995094979396929594505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611caf57600080fd5b8335611cba81611af0565b925060208401359150604084013567ffffffffffffffff80821115611cde57600080fd5b818601915086601f830112611cf257600080fd5b813581811115611d0457611d04611c6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d4a57611d4a611c6b565b81604052828152896020848701011115611d6357600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060408385031215611d9857600080fd5b8235611da381611af0565b91506020830135611db381611af0565b809150509250929050565b60008060008060008060608789031215611dd757600080fd5b863567ffffffffffffffff80821115611def57600080fd5b611dfb8a838b01611b5b565b90985096506020890135915080821115611e1457600080fd5b611e208a838b01611b5b565b90965094506040890135915080821115611e3957600080fd5b50611e4689828a01611b5b565b979a9699509497509295939492505050565b600060208284031215611e6a57600080fd5b5035919050565b600080600060608486031215611e8657600080fd5b8335611e9181611af0565b92506020840135611ea181611af0565b929592945050506040919091013590565b8015158114611b1257600080fd5b60008060408385031215611ed357600080fd5b8235611ede81611af0565b91506020830135611db381611eb2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f2f57600080fd5b8151611b3281611eb2565b60008060408385031215611f4d57600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fbf57611fbf611f5e565b5060010190565b6000825160005b81811015611fe75760208186018101518583015201611fcd565b81811115611ff6576000828501525b509190910192915050565b60006020828403121561201357600080fd5b8151611b3281611af0565b80516dffffffffffffffffffffffffffff8116811461203c57600080fd5b919050565b60008060006060848603121561205657600080fd5b61205f8461201e565b925061206d6020850161201e565b9150604084015163ffffffff8116811461208657600080fd5b809150509250925092565b600082198211156120a4576120a4611f5e565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120e1576120e1611f5e565b500290565b60008261211c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122046026fefa398c8eedce166e1b5ed9811d378d038a3aa2b4eb00ab843641c45aa64736f6c634300080a00330000000000000000000000003027a0c4e35272c0707de2651a0638c3df1c37ac00000000000000000000000010025a49f69ba9445e9b81d0003b235ee629115f000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff4272

Deployed ByteCode

0x60806040526004361061012d5760003560e01c80639d22ae8c116100a5578063c45a015511610074578063d298460811610059578063d2984608146103d4578063d9caed1214610408578063f32a12ac1461042857600080fd5b8063c45a01551461035d578063ced67f0c1461039157600080fd5b80639d22ae8c146102e85780639dd8a81c14610308578063aa60e73314610328578063b081b4eb1461034857600080fd5b80633fc8cef3116100fc5780636e9821c2116100e15780636e9821c21461025b5780638da5cb5b1461029b5780638e9be9f4146102c857600080fd5b80633fc8cef31461020757806354a0af171461023b57600080fd5b80630a0879031461013957806313af403514610197578063225bf435146101b9578063248091c0146101e757600080fd5b3661013457005b600080fd5b34801561014557600080fd5b5061016d7f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101a357600080fd5b506101b76101b2366004611b15565b610448565b005b3480156101c557600080fd5b506101d96101d4366004611b39565b610506565b60405190815260200161018e565b3480156101f357600080fd5b506101b7610202366004611ba7565b610630565b34801561021357600080fd5b5061016d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561024757600080fd5b506101b7610256366004611c9a565b6108a9565b34801561026757600080fd5b5061028b610276366004611b15565b60016020526000908152604090205460ff1681565b604051901515815260200161018e565b3480156102a757600080fd5b5060005461016d9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102d457600080fd5b506101b76102e3366004611ba7565b610978565b3480156102f457600080fd5b506101b7610303366004611d85565b610ad8565b34801561031457600080fd5b506101b7610323366004611dbe565b610bb6565b34801561033457600080fd5b506101b7610343366004611e58565b610d48565b34801561035457600080fd5b506101b7610ea1565b34801561036957600080fd5b5061016d7f000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b34801561039d57600080fd5b5061016d6103ac366004611b15565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103e057600080fd5b5061016d7f0000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff427281565b34801561041457600080fd5b506101b7610423366004611e71565b610f1c565b34801561043457600080fd5b506101b7610443366004611ec0565b610fb6565b60005473ffffffffffffffffffffffffffffffffffffffff163314610499576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f167d3e9c1016ab80e58802ca9da10ce5c6a0f4debc46a2e7a2cd9e56899a4fb591a250565b3360009081526001602052604081205460ff1661054f576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105bb7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2857f0000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff427261108a565b9050818110156105f7576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518181527f4bd1bdc2f263261c65e1cf0d8f7908b6fbf4b4906bafb6a28e11aafdc86c326e9060200160405180910390a192915050565b3360009081526001602052604090205460ff16610679576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8781101561089e57600089898381811061069857610698611eee565b90506020020160208101906106ad9190611b15565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828a8a868181106106de576106de611eee565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff909416600485015260200291909101356024830152506044016020604051808303816000875af1158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190611f1d565b506040517f89afcb44000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906389afcb449060240160408051808303816000875af11580156107ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108109190611f3a565b9150915087878581811061082657610826611eee565b90506020020135821080610851575085858581811061084757610847611eee565b9050602002013581105b15610888576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050808061089690611f8d565b91505061067c565b505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108fa576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1683836040516109229190611fc6565b60006040518083038185875af1925050503d806000811461095f576040519150601f19603f3d011682016040523d82523d6000602084013e610964565b606091505b505090508061097257600080fd5b50505050565b3360009081526001602052604090205460ff166109c1576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8781101561089e5760008989838181106109e0576109e0611eee565b90506020020160208101906109f59190611b15565b90506000888884818110610a0b57610a0b611eee565b9050602002016020810190610a209190611b15565b905073ffffffffffffffffffffffffffffffffffffffff808216908316106000610a4a848461141f565b9050868686818110610a5e57610a5e611eee565b90506020020135610a89828b8b89818110610a7b57610a7b611eee565b9050602002013585876115a6565b1015610ac1576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050508080610ad090611f8d565b9150506109c4565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b29576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526002602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055905192835290917f8357797ab855a0bad5103ea8bd2f21f986350e94d73f143ae114db8f0db5a93a91015b60405180910390a25050565b3360009081526001602052604090205460ff16610bff576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b85811015610d3f576000878783818110610c1e57610c1e611eee565b9050602002016020810190610c339190611b15565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040812054929350911615610c915773ffffffffffffffffffffffffffffffffffffffff80831660009081526002602052604090205416610cb3565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b9050848484818110610cc757610cc7611eee565b90506020020135610cf283838a8a88818110610ce557610ce5611eee565b905060200201353061108a565b1015610d2a576040517f17d431f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508080610d3790611f8d565b915050610c02565b50505050505050565b3360009081526001602052604090205460ff16610d91576040517fcf1119ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff427281166004830152602482018390527f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2169063a9059cbb906044016020604051808303816000875af1158015610e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6a9190611f1d565b506040518181527f4bd1bdc2f263261c65e1cf0d8f7908b6fbf4b4906bafb6a28e11aafdc86c326e9060200160405180910390a150565b60405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216904790600081818185875af1925050503d8060008114610f17576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f6d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831615610f9457610f1783838361192c565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610922565b60005473ffffffffffffffffffffffffffffffffffffffff163314611007576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f878d105ed19c01e992a54459c2f04ba19432ac45600b42ce340d0342722074369101610baa565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015260009182917f000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac169063e6a4390590604401602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190612001565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152602482018790529192509087169063a9059cbb906044016020604051808303816000875af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e49190611f1d565b506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112579190612041565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161015611364576112bb868383611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526000600482018190526024820183905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484015260848301919091529195509084169063022c0d9f9060a401600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b50505050611414565b61136f868284611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526004810182905260006024820181905273ffffffffffffffffffffffffffffffffffffffff88811660448401526080606484015260848301919091529195509084169063022c0d9f9060a401600060405180830381600087803b1580156113fb57600080fd5b505af115801561140f573d6000803e3d6000fd5b505050505b505050949350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061145e578385611461565b84845b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091507f000000000000000000000000c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac90604801604051602081830303815290604052805190602001206040516020016115679291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012095945050505050565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482018190526024820185905260009163a9059cbb906044016020604051808303816000875af115801561161c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116409190611f1d565b506040517f89afcb44000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8816906389afcb449060240160408051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190611f3a565b915091506000808873ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174b9190612041565b5091509150861561183d57611761868a8561192c565b61178c83826dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff16611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526004810182905260006024820181905230604483015260806064830152608482015290955073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9060a401600060405180830381600087803b15801561181257600080fd5b505af1158015611826573d6000803e3d6000fd5b5050505083856118369190612091565b9450611920565b611848868a8661192c565b61187384836dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16611aa1565b6040517f022c0d9f0000000000000000000000000000000000000000000000000000000081526000600482018190526024820183905230604483015260806064830152608482015290955073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9060a401600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b50505050828561191d9190612091565b94505b50505050949350505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928716916119f39190611fc6565b6000604051808303816000865af19150503d8060008114611a30576040519150601f19603f3d011682016040523d82523d6000602084013e611a35565b606091505b5091509150811580611a635750805115801590611a63575080806020019051810190611a619190611f1d565b155b15611a9a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600080611ab0856103e56120a9565b90506000611abe84836120a9565b9050600082611acf876103e86120a9565b611ad99190612091565b9050611ae581836120e6565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b1257600080fd5b50565b600060208284031215611b2757600080fd5b8135611b3281611af0565b9392505050565b60008060408385031215611b4c57600080fd5b50508035926020909101359150565b60008083601f840112611b6d57600080fd5b50813567ffffffffffffffff811115611b8557600080fd5b6020830191508360208260051b8501011115611ba057600080fd5b9250929050565b6000806000806000806000806080898b031215611bc357600080fd5b883567ffffffffffffffff80821115611bdb57600080fd5b611be78c838d01611b5b565b909a50985060208b0135915080821115611c0057600080fd5b611c0c8c838d01611b5b565b909850965060408b0135915080821115611c2557600080fd5b611c318c838d01611b5b565b909650945060608b0135915080821115611c4a57600080fd5b50611c578b828c01611b5b565b999c989b5096995094979396929594505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611caf57600080fd5b8335611cba81611af0565b925060208401359150604084013567ffffffffffffffff80821115611cde57600080fd5b818601915086601f830112611cf257600080fd5b813581811115611d0457611d04611c6b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d4a57611d4a611c6b565b81604052828152896020848701011115611d6357600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60008060408385031215611d9857600080fd5b8235611da381611af0565b91506020830135611db381611af0565b809150509250929050565b60008060008060008060608789031215611dd757600080fd5b863567ffffffffffffffff80821115611def57600080fd5b611dfb8a838b01611b5b565b90985096506020890135915080821115611e1457600080fd5b611e208a838b01611b5b565b90965094506040890135915080821115611e3957600080fd5b50611e4689828a01611b5b565b979a9699509497509295939492505050565b600060208284031215611e6a57600080fd5b5035919050565b600080600060608486031215611e8657600080fd5b8335611e9181611af0565b92506020840135611ea181611af0565b929592945050506040919091013590565b8015158114611b1257600080fd5b60008060408385031215611ed357600080fd5b8235611ede81611af0565b91506020830135611db381611eb2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f2f57600080fd5b8151611b3281611eb2565b60008060408385031215611f4d57600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fbf57611fbf611f5e565b5060010190565b6000825160005b81811015611fe75760208186018101518583015201611fcd565b81811115611ff6576000828501525b509190910192915050565b60006020828403121561201357600080fd5b8151611b3281611af0565b80516dffffffffffffffffffffffffffff8116811461203c57600080fd5b919050565b60008060006060848603121561205657600080fd5b61205f8461201e565b925061206d6020850161201e565b9150604084015163ffffffff8116811461208657600080fd5b809150509250925092565b600082198211156120a4576120a4611f5e565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120e1576120e1611f5e565b500290565b60008261211c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122046026fefa398c8eedce166e1b5ed9811d378d038a3aa2b4eb00ab843641c45aa64736f6c634300080a0033