false
false
0

Contract Address Details

0x6dd4c097C5f7A57FeAC50D23E53540f4578a0467

Contract Name
WalletDAO
Creator
0xebe894–7a24f6 at 0x843107–caf3f0
Balance
1,667,473.192007123826045984 CLO
Tokens
Fetching tokens...
Transactions
12 Transactions
Transfers
397 Transfers
Gas Used
253,683
Last Balance Update
16406580
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
WalletDAO




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-09-26T15:35:32.053486Z

Contract source code

// SPDX-License-Identifier: GPL-3.0-only
// Разработчик: Upaut

pragma solidity ^0.8.16;

interface ITwoBearsBots {
    function id() external view returns (uint256);
    function createBotSellBuy(address _token_in, address _token_out, uint _value, uint _value_inc, uint _price, uint _price_step, uint _price_limit, uint _order_position) external;
    function createBotNetTrade(address _token_in, address _token_out, uint _value_sell, uint _value_buy, uint _price, uint _price_step, uint _price_up_limit, uint _price_down_limit, uint _order_position_sell, uint _order_position_buy) external;
    function restoreBot(uint _id_bot) external;
    function deleteBot(uint _id_bot) external;
}

interface IColdStaking {
    function start_staking(uint rounds) external payable;
    function claim() external;
    function withdraw_stake() external;
}

interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IWCLO {
    function deposit() external payable;
    function withdraw(uint wad) external;
}

contract WalletDAO {

    struct TokenData { // структура вывода информации по токену
        uint256 balance; // баланс токена в walletDAO
        uint8 decimal; // количество десятичных знаков у токена
        address token; // адрес контракта токена
        string symbol; // символ токена
    }

/* Callisto network testnet
    address public constant DAO = 0xb356A5a5710Cac1677854f1b95608D1d4B4B417d; // Контракт DAO
    address public constant WCLO = 0xbd2D3BCe975FD72E44A73cC8e834aD1B8441BdDa; // Контракт WCLO
    address public constant ColdStaking = 0xBD38997D00295D738BDC258DB4446577f4181Ed7; // Контракт ColdStaking
    address public constant TwoBearsBalances = 0x1501Bffb3D83239214AE55eCE3a4ccd40092c922; // Контракт депозитов на 2bears
    address public constant TwoBearsBots = 0x69b78bF6300a39D186C7850A46ea6CA261c265c3; // Контракт ботов на 2bears
*/
    address public constant DAO = 0x810059e1406dEDAFd1BdCa4E0137CbA306c0Ce36; // Контракт DAO
    address public constant WCLO = 0xF5AD6F6EDeC824C7fD54A66d241a227F6503aD3a; // Контракт WCLO
    address public constant ColdStaking = 0x08A7c8be47773546DC5E173d67B0c38AfFfa4b84; // Контракт ColdStaking
    address public constant TwoBearsBalances = 0x820b5c3835B731DdeB1155ac0b37009E37524a53; // Контракт депозитов на 2bears
    address public constant TwoBearsBots = 0xc113Ed199eF9380e3f93B0a6e25FA86b7298FB16; // Контракт ботов на 2bears

    uint[] listBots; // список всех запущенных ботов на 2bears
    address[] tokenTrackingList; // список адресов токенов для отcлеживания в UI

    event TransferCLO(address indexed _sender, address indexed _recipient, uint _value);

    modifier onlyDAO() {
        require(msg.sender == DAO, "Only contract DAO");
        _;
    }


    // Контракт кошелька DAO работает с 2bears
    function twoBears_Approve(address _token, bool _permission) external onlyDAO { // Выдать/отозвать разрешение ботам торговать токеном
        uint _val = _permission == true ? uint(int(-1)) : 0;
        IERC20(_token).approve(TwoBearsBalances, _val); // даем/отзываем разрешение на использование токена
    }

    function twoBears_BotSellBuy(address _token_in, address _token_out, uint _value, uint _value_inc, uint _price, uint _price_step, uint _price_limit) external onlyDAO { // создание бота закупа или бота распродажи
        // _value - объем токена с наименьшим приоритетом
        // _price - цена в токене с максимальным приоритетом
        ITwoBearsBots(TwoBearsBots).createBotSellBuy(_token_in, _token_out, _value, _value_inc, _price, _price_step, _price_limit, 0);
        uint _id_bot = ITwoBearsBots(TwoBearsBots).id(); // возвращаем id созданного бота
        _add_ID_listBots(_id_bot); // сохраняем ID бота в списке отслеживаний
    }

    function twoBears_BotNetTrade(address _token_in, address _token_out, uint _value_sell, uint _value_buy, uint _price, uint _price_step, uint _price_up_limit, uint _price_down_limit) external onlyDAO { // создание бота сеточной торговли
        // _value_sell и _value_buy - объем токена с наименьшим приоритетом
        // _price - цена в токене с максимальным приоритетом
        ITwoBearsBots(TwoBearsBots).createBotNetTrade(_token_in, _token_out, _value_sell, _value_buy, _price, _price_step, _price_up_limit, _price_down_limit, 0, 0);
        uint _id_bot = ITwoBearsBots(TwoBearsBots).id(); // возвращаем id созданного бота
        _add_ID_listBots(_id_bot); // сохраняем ID бота в списке отслеживаний
    }

    function twoBears_RestoreBot(uint _id_bot) external onlyDAO { // Восстановить работу бота после устранения неисправности
        ITwoBearsBots(TwoBearsBots).restoreBot(_id_bot);
    }

    function twoBears_DeleteBot(uint _id_bot) external onlyDAO { // Удалить бота (все ордера данного бота будут отменены, все средства вернутся на кошелек DAO)
        ITwoBearsBots(TwoBearsBots).deleteBot(_id_bot);
        _del_ID_listBots(_id_bot);
    }

    function _add_ID_listBots(uint _id_bot) private { // Добавление ID нового бота в список
        listBots.push(_id_bot);
    }

    function _del_ID_listBots(uint _id_bot) private { // Удаление ID бота из списка
        for(uint i; i < listBots.length; i++){
            if(listBots[i] == _id_bot){
                listBots[i] = listBots[listBots.length - 1];
                listBots.pop();
                break;
            }
        }
    }

    function twoBears_ViewListBots() public view returns (uint[] memory) { // Просмотреть список созданых ботов
        return (listBots);
    }



    // Контракт кошелька DAO работает с ColdStaking
    function coldStaking_Start(uint256 _value, uint256 _rounds) external onlyDAO { // Сделать ставку. _value - количество CLO, _rounds - количество раундов
        IColdStaking(ColdStaking).start_staking{value: _value}(_rounds);
    }

    function coldStaking_Claim() external onlyDAO { // Забрать награду (claim)
        IColdStaking(ColdStaking).claim();
    }

    function coldStaking_Withdraw() external onlyDAO { // Забрать ставку (withdraw_stake)
        IColdStaking(ColdStaking).withdraw_stake();
    }



    // Контракт кошелька DAO оборачивает CLO и разворачивает WCLO
    function walletDAO_WrapCLO(uint256 _value) external onlyDAO { // обернуть CLO в WCLO
        IWCLO(WCLO).deposit{value: _value}();
    }

    function walletDAO_UnwrapWCLO(uint256 _value) external onlyDAO { // развернуть WCLO в CLO
        IWCLO(WCLO).withdraw(_value);
    }



    // Контракт кошелька DAO отправляет CLO и любые токены стандартов ERC20, ERC223
    function walletDAO_TransferCLO(address _recipient, uint256 _value) external onlyDAO { // отправка CLO
        payable(_recipient).transfer(_value); // отправляем CLO
        emit TransferCLO(address(this), _recipient, _value); // логируем отправку CLO
    }

    function walletDAO_TransferToken(address _token, address _recipient, uint256 _value) external onlyDAO { // отправка любого токена
        IERC20(_token).transfer(_recipient, _value); // отправляем токен
    }



    // Контракт кошелька DAO добавляет / удаляет токены для отслеживания в UI
    function walletDAO_AddTokenTracking(address _token) external onlyDAO { // Добавить токен для отслеживания
        if(IERC20(_token).decimals() > 0){ // перестраховка что добавляется контракт имеющий десятичные знаки
            tokenTrackingList.push(_token);
        }
    }

    function walletDAO_DelTokenTracking(address _token) external onlyDAO { // Удалить токен из отслеживаемых
        for(uint i; i < tokenTrackingList.length; i++){
            if(tokenTrackingList[i] == _token){
                tokenTrackingList[i] = tokenTrackingList[tokenTrackingList.length - 1];
                tokenTrackingList.pop();
                break;
            }
        }
    }

    function walletDAO_ViewBalances() public view returns (TokenData[] memory) { // Просмотреть балансы кошелька
        TokenData[] memory _result = new TokenData[](tokenTrackingList.length + 1);  // + 1 это для вывода нативного CLO
        _result[0] = TokenData(address(this).balance, 18, address(0x00), "CLO"); // Информация нативной монеты сети

        for(uint i; i < tokenTrackingList.length; i++){ // перебираем весь массив токенов
            address _token = tokenTrackingList[i];
            _result[i+1] = TokenData(IERC20(_token).balanceOf(address(this)), IERC20(_token).decimals(), _token, IERC20(_token).symbol());
        }
        return (_result); // возвращаем балансы и информацию по заданным токенам
    }



    // Контракт кошелька DAO примимает CLO и любые токены стандартов ERC20, ERC223
    receive() external payable {} // принимаем CLO

    function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // принимаем токены ERC223
        return this.tokenReceived.selector; // возвращаем селектор этой функции
    }
}
        

Contract ABI

[{"type":"event","name":"TransferCLO","inputs":[{"type":"address","name":"_sender","internalType":"address","indexed":true},{"type":"address","name":"_recipient","internalType":"address","indexed":true},{"type":"uint256","name":"_value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ColdStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DAO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"TwoBearsBalances","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"TwoBearsBots","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WCLO","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"coldStaking_Claim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"coldStaking_Start","inputs":[{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_rounds","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"coldStaking_Withdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"tokenReceived","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"twoBears_Approve","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_permission","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"twoBears_BotNetTrade","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_sell","internalType":"uint256"},{"type":"uint256","name":"_value_buy","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_up_limit","internalType":"uint256"},{"type":"uint256","name":"_price_down_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"twoBears_BotSellBuy","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"},{"type":"uint256","name":"_value_inc","internalType":"uint256"},{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_price_step","internalType":"uint256"},{"type":"uint256","name":"_price_limit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"twoBears_DeleteBot","inputs":[{"type":"uint256","name":"_id_bot","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"twoBears_RestoreBot","inputs":[{"type":"uint256","name":"_id_bot","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"twoBears_ViewListBots","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_AddTokenTracking","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_DelTokenTracking","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_TransferCLO","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_TransferToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_UnwrapWCLO","inputs":[{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct WalletDAO.TokenData[]","components":[{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"symbol","internalType":"string"}]}],"name":"walletDAO_ViewBalances","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"walletDAO_WrapCLO","inputs":[{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b5061297b806100206000396000f3fe6080604052600436106101395760003560e01c80636e3adf8d116100ab57806398fabd3a1161006f57806398fabd3a146103cf578063b53a7052146103fa578063be66ca9214610423578063e13758011461044c578063f800490314610475578063ff5cf4b11461049e57610140565b80636e3adf8d146102fc57806379cce4f5146103275780638726968d1461035257806387a7c32a146103695780638943ec021461039257610140565b8063232fc349116100fd578063232fc3491461021657806329581b3e1461022d5780632e5a318d1461025657806344b6d9c41461027f57806365fac6dc146102a85780636d85e609146102d157610140565b806307ac32d81461014557806311a924161461016e5780631558c67c1461019757806320357b8c146101c257806322c380e4146101ed57610140565b3661014057005b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190611bb1565b6104c9565b005b34801561017a57600080fd5b5061019560048036038101906101909190611c3c565b6105c3565b005b3480156101a357600080fd5b506101ac6106c9565b6040516101b99190611d4d565b60405180910390f35b3480156101ce57600080fd5b506101d7610721565b6040516101e49190611f4f565b60405180910390f35b3480156101f957600080fd5b50610214600480360381019061020f9190611bb1565b610a48565b005b34801561022257600080fd5b5061022b610b4c565b005b34801561023957600080fd5b50610254600480360381019061024f9190611bb1565b610c44565b005b34801561026257600080fd5b5061027d60048036038101906102789190611f71565b610d51565b005b34801561028b57600080fd5b506102a660048036038101906102a19190612027565b610f00565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612067565b611032565b005b3480156102dd57600080fd5b506102e66111dc565b6040516102f39190612118565b60405180910390f35b34801561030857600080fd5b506103116111f4565b60405161031e9190612118565b60405180910390f35b34801561033357600080fd5b5061033c61120c565b6040516103499190612118565b60405180910390f35b34801561035e57600080fd5b50610367611224565b005b34801561037557600080fd5b50610390600480360381019061038b9190612133565b61131c565b005b34801561039e57600080fd5b506103b960048036038101906103b49190612295565b61152c565b6040516103c6919061233f565b60405180910390f35b3480156103db57600080fd5b506103e461153f565b6040516103f19190612118565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190611bb1565b611557565b005b34801561042f57600080fd5b5061044a60048036038101906104459190612133565b61165b565b005b34801561045857600080fd5b50610473600480360381019061046e9190612392565b6117be565b005b34801561048157600080fd5b5061049c600480360381019061049791906123d2565b611911565b005b3480156104aa57600080fd5b506104b3611a17565b6040516104c09190612118565b60405180910390f35b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461054b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105429061246f565b60405180910390fd5b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156105a757600080fd5b505af11580156105bb573d6000803e3d6000fd5b505050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c9061246f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161068092919061249e565b6020604051808303816000875af115801561069f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c391906124dc565b50505050565b6060600080548060200260200160405190810160405280929190818152602001828054801561071757602002820191906000526020600020905b815481526020019060010190808311610703575b5050505050905090565b60606000600180805490506107369190612538565b67ffffffffffffffff81111561074f5761074e61216a565b5b60405190808252806020026020018201604052801561078857816020015b610775611b26565b81526020019060019003908161076d5790505b5090506040518060800160405280478152602001601260ff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016040518060400160405280600381526020017f434c4f0000000000000000000000000000000000000000000000000000000000815250815250816000815181106108105761080f61256c565b5b602002602001018190525060005b600180549050811015610a40576000600182815481106108415761084061256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060405180608001604052808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108b29190612118565b602060405180830381865afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f391906125b0565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109679190612609565b60ff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109d6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ff91906126d7565b81525083600184610a109190612538565b81518110610a2157610a2061256c565b5b6020026020010181905250508080610a3890612720565b91505061081e565b508091505090565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061246f565b60405180910390fd5b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610b179190612768565b600060405180830381600087803b158015610b3157600080fd5b505af1158015610b45573d6000803e3d6000fd5b5050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc59061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff1663cd9488556040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663c78f936f826040518263ffffffff1660e01b8152600401610d139190612768565b600060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b50505050610d4e81611a2f565b50565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff166330be116089898989898989896000806040518b63ffffffff1660e01b8152600401610e339a999897969594939291906127c8565b600060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b50505050600073c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea91906125b0565b9050610ef581611afa565b505050505050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f799061246f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fc8573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd836040516110269190612768565b60405180910390a35050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff16632fd96ca98888888888888860006040518963ffffffff1660e01b8152600401611110989796959493929190612864565b600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b50505050600073c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c791906125b0565b90506111d281611afa565b5050505050505050565b73820b5c3835b731ddeb1155ac0b37009e37524a5381565b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1681565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a81565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113959061246f565b60405180910390fd5b60005b600180549050811015611528578173ffffffffffffffffffffffffffffffffffffffff16600182815481106113d9576113d861256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361151557600180808054905061143191906128e2565b815481106114425761144161256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600182815481106114815761148061256c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018054806114db576114da612916565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611528565b808061152090612720565b9150506113a1565b5050565b6000638943ec0260e01b90509392505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3681565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663e38d1a40826040518263ffffffff1660e01b81526004016116269190612768565b600060405180830381600087803b15801561164057600080fd5b505af1158015611654573d6000803e3d6000fd5b5050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061246f565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190612609565b60ff1611156117bb576001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118379061246f565b60405180910390fd5b60006001151582151514611855576000611877565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b373820b5c3835b731ddeb1155ac0b37009e37524a53836040518363ffffffff1660e01b81526004016118c892919061249e565b6020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b91906124dc565b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a9061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff16635d8c85ef83836040518363ffffffff1660e01b81526004016119e19190612768565b6000604051808303818588803b1580156119fa57600080fd5b505af1158015611a0e573d6000803e3d6000fd5b50505050505050565b7308a7c8be47773546dc5e173d67b0c38afffa4b8481565b60005b600080549050811015611af6578160008281548110611a5457611a5361256c565b5b906000526020600020015403611ae35760006001600080549050611a7891906128e2565b81548110611a8957611a8861256c565b5b906000526020600020015460008281548110611aa857611aa761256c565b5b90600052602060002001819055506000805480611ac857611ac7612916565b5b60019003818190600052602060002001600090559055611af6565b8080611aee90612720565b915050611a32565b5050565b600081908060018154018082558091505060019003906000526020600020016000909190919091505550565b604051806080016040528060008152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b8e81611b7b565b8114611b9957600080fd5b50565b600081359050611bab81611b85565b92915050565b600060208284031215611bc757611bc6611b71565b5b6000611bd584828501611b9c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0982611bde565b9050919050565b611c1981611bfe565b8114611c2457600080fd5b50565b600081359050611c3681611c10565b92915050565b600080600060608486031215611c5557611c54611b71565b5b6000611c6386828701611c27565b9350506020611c7486828701611c27565b9250506040611c8586828701611b9c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611cc481611b7b565b82525050565b6000611cd68383611cbb565b60208301905092915050565b6000602082019050919050565b6000611cfa82611c8f565b611d048185611c9a565b9350611d0f83611cab565b8060005b83811015611d40578151611d278882611cca565b9750611d3283611ce2565b925050600181019050611d13565b5085935050505092915050565b60006020820190508181036000830152611d678184611cef565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060ff82169050919050565b611db181611d9b565b82525050565b611dc081611bfe565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e00578082015181840152602081019050611de5565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e2882611dc6565b611e328185611dd1565b9350611e42818560208601611de2565b611e4b81611e0c565b840191505092915050565b6000608083016000830151611e6e6000860182611cbb565b506020830151611e816020860182611da8565b506040830151611e946040860182611db7565b5060608301518482036060860152611eac8282611e1d565b9150508091505092915050565b6000611ec58383611e56565b905092915050565b6000602082019050919050565b6000611ee582611d6f565b611eef8185611d7a565b935083602082028501611f0185611d8b565b8060005b85811015611f3d5784840389528151611f1e8582611eb9565b9450611f2983611ecd565b925060208a01995050600181019050611f05565b50829750879550505050505092915050565b60006020820190508181036000830152611f698184611eda565b905092915050565b600080600080600080600080610100898b031215611f9257611f91611b71565b5b6000611fa08b828c01611c27565b9850506020611fb18b828c01611c27565b9750506040611fc28b828c01611b9c565b9650506060611fd38b828c01611b9c565b9550506080611fe48b828c01611b9c565b94505060a0611ff58b828c01611b9c565b93505060c06120068b828c01611b9c565b92505060e06120178b828c01611b9c565b9150509295985092959890939650565b6000806040838503121561203e5761203d611b71565b5b600061204c85828601611c27565b925050602061205d85828601611b9c565b9150509250929050565b600080600080600080600060e0888a03121561208657612085611b71565b5b60006120948a828b01611c27565b97505060206120a58a828b01611c27565b96505060406120b68a828b01611b9c565b95505060606120c78a828b01611b9c565b94505060806120d88a828b01611b9c565b93505060a06120e98a828b01611b9c565b92505060c06120fa8a828b01611b9c565b91505092959891949750929550565b61211281611bfe565b82525050565b600060208201905061212d6000830184612109565b92915050565b60006020828403121561214957612148611b71565b5b600061215784828501611c27565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121a282611e0c565b810181811067ffffffffffffffff821117156121c1576121c061216a565b5b80604052505050565b60006121d4611b67565b90506121e08282612199565b919050565b600067ffffffffffffffff821115612200576121ff61216a565b5b61220982611e0c565b9050602081019050919050565b82818337600083830152505050565b6000612238612233846121e5565b6121ca565b90508281526020810184848401111561225457612253612165565b5b61225f848285612216565b509392505050565b600082601f83011261227c5761227b612160565b5b813561228c848260208601612225565b91505092915050565b6000806000606084860312156122ae576122ad611b71565b5b60006122bc86828701611c27565b93505060206122cd86828701611b9c565b925050604084013567ffffffffffffffff8111156122ee576122ed611b76565b5b6122fa86828701612267565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61233981612304565b82525050565b60006020820190506123546000830184612330565b92915050565b60008115159050919050565b61236f8161235a565b811461237a57600080fd5b50565b60008135905061238c81612366565b92915050565b600080604083850312156123a9576123a8611b71565b5b60006123b785828601611c27565b92505060206123c88582860161237d565b9150509250929050565b600080604083850312156123e9576123e8611b71565b5b60006123f785828601611b9c565b925050602061240885828601611b9c565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920636f6e74726163742044414f000000000000000000000000000000600082015250565b6000612459601183612412565b915061246482612423565b602082019050919050565b600060208201905081810360008301526124888161244c565b9050919050565b61249881611b7b565b82525050565b60006040820190506124b36000830185612109565b6124c0602083018461248f565b9392505050565b6000815190506124d681612366565b92915050565b6000602082840312156124f2576124f1611b71565b5b6000612500848285016124c7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061254382611b7b565b915061254e83611b7b565b925082820190508082111561256657612565612509565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506125aa81611b85565b92915050565b6000602082840312156125c6576125c5611b71565b5b60006125d48482850161259b565b91505092915050565b6125e681611d9b565b81146125f157600080fd5b50565b600081519050612603816125dd565b92915050565b60006020828403121561261f5761261e611b71565b5b600061262d848285016125f4565b91505092915050565b600067ffffffffffffffff8211156126515761265061216a565b5b61265a82611e0c565b9050602081019050919050565b600061267a61267584612636565b6121ca565b90508281526020810184848401111561269657612695612165565b5b6126a1848285611de2565b509392505050565b600082601f8301126126be576126bd612160565b5b81516126ce848260208601612667565b91505092915050565b6000602082840312156126ed576126ec611b71565b5b600082015167ffffffffffffffff81111561270b5761270a611b76565b5b612717848285016126a9565b91505092915050565b600061272b82611b7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275d5761275c612509565b5b600182019050919050565b600060208201905061277d600083018461248f565b92915050565b6000819050919050565b6000819050919050565b60006127b26127ad6127a884612783565b61278d565b611b7b565b9050919050565b6127c281612797565b82525050565b6000610140820190506127de600083018d612109565b6127eb602083018c612109565b6127f8604083018b61248f565b612805606083018a61248f565b612812608083018961248f565b61281f60a083018861248f565b61282c60c083018761248f565b61283960e083018661248f565b6128476101008301856127b9565b6128556101208301846127b9565b9b9a5050505050505050505050565b60006101008201905061287a600083018b612109565b612887602083018a612109565b612894604083018961248f565b6128a1606083018861248f565b6128ae608083018761248f565b6128bb60a083018661248f565b6128c860c083018561248f565b6128d560e08301846127b9565b9998505050505050505050565b60006128ed82611b7b565b91506128f883611b7b565b92508282039050818111156129105761290f612509565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220e570ea0c18ebbe85208cac62731668b681800ced5c114c82ab71e4826847ca3e64736f6c63430008100033

Deployed ByteCode

0x6080604052600436106101395760003560e01c80636e3adf8d116100ab57806398fabd3a1161006f57806398fabd3a146103cf578063b53a7052146103fa578063be66ca9214610423578063e13758011461044c578063f800490314610475578063ff5cf4b11461049e57610140565b80636e3adf8d146102fc57806379cce4f5146103275780638726968d1461035257806387a7c32a146103695780638943ec021461039257610140565b8063232fc349116100fd578063232fc3491461021657806329581b3e1461022d5780632e5a318d1461025657806344b6d9c41461027f57806365fac6dc146102a85780636d85e609146102d157610140565b806307ac32d81461014557806311a924161461016e5780631558c67c1461019757806320357b8c146101c257806322c380e4146101ed57610140565b3661014057005b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190611bb1565b6104c9565b005b34801561017a57600080fd5b5061019560048036038101906101909190611c3c565b6105c3565b005b3480156101a357600080fd5b506101ac6106c9565b6040516101b99190611d4d565b60405180910390f35b3480156101ce57600080fd5b506101d7610721565b6040516101e49190611f4f565b60405180910390f35b3480156101f957600080fd5b50610214600480360381019061020f9190611bb1565b610a48565b005b34801561022257600080fd5b5061022b610b4c565b005b34801561023957600080fd5b50610254600480360381019061024f9190611bb1565b610c44565b005b34801561026257600080fd5b5061027d60048036038101906102789190611f71565b610d51565b005b34801561028b57600080fd5b506102a660048036038101906102a19190612027565b610f00565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612067565b611032565b005b3480156102dd57600080fd5b506102e66111dc565b6040516102f39190612118565b60405180910390f35b34801561030857600080fd5b506103116111f4565b60405161031e9190612118565b60405180910390f35b34801561033357600080fd5b5061033c61120c565b6040516103499190612118565b60405180910390f35b34801561035e57600080fd5b50610367611224565b005b34801561037557600080fd5b50610390600480360381019061038b9190612133565b61131c565b005b34801561039e57600080fd5b506103b960048036038101906103b49190612295565b61152c565b6040516103c6919061233f565b60405180910390f35b3480156103db57600080fd5b506103e461153f565b6040516103f19190612118565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190611bb1565b611557565b005b34801561042f57600080fd5b5061044a60048036038101906104459190612133565b61165b565b005b34801561045857600080fd5b50610473600480360381019061046e9190612392565b6117be565b005b34801561048157600080fd5b5061049c600480360381019061049791906123d2565b611911565b005b3480156104aa57600080fd5b506104b3611a17565b6040516104c09190612118565b60405180910390f35b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461054b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105429061246f565b60405180910390fd5b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156105a757600080fd5b505af11580156105bb573d6000803e3d6000fd5b505050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c9061246f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161068092919061249e565b6020604051808303816000875af115801561069f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c391906124dc565b50505050565b6060600080548060200260200160405190810160405280929190818152602001828054801561071757602002820191906000526020600020905b815481526020019060010190808311610703575b5050505050905090565b60606000600180805490506107369190612538565b67ffffffffffffffff81111561074f5761074e61216a565b5b60405190808252806020026020018201604052801561078857816020015b610775611b26565b81526020019060019003908161076d5790505b5090506040518060800160405280478152602001601260ff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016040518060400160405280600381526020017f434c4f0000000000000000000000000000000000000000000000000000000000815250815250816000815181106108105761080f61256c565b5b602002602001018190525060005b600180549050811015610a40576000600182815481106108415761084061256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060405180608001604052808273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108b29190612118565b602060405180830381865afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f391906125b0565b81526020018273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109679190612609565b60ff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109d6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ff91906126d7565b81525083600184610a109190612538565b81518110610a2157610a2061256c565b5b6020026020010181905250508080610a3890612720565b91505061081e565b508091505090565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac19061246f565b60405180910390fd5b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610b179190612768565b600060405180830381600087803b158015610b3157600080fd5b505af1158015610b45573d6000803e3d6000fd5b5050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc59061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff1663cd9488556040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663c78f936f826040518263ffffffff1660e01b8152600401610d139190612768565b600060405180830381600087803b158015610d2d57600080fd5b505af1158015610d41573d6000803e3d6000fd5b50505050610d4e81611a2f565b50565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff166330be116089898989898989896000806040518b63ffffffff1660e01b8152600401610e339a999897969594939291906127c8565b600060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b50505050600073c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea91906125b0565b9050610ef581611afa565b505050505050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f799061246f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fc8573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f4ddebed7447a12da95902559eac51ea2594f93265e70f2d11da210e33abdafcd836040516110269190612768565b60405180910390a35050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ab9061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff16632fd96ca98888888888888860006040518963ffffffff1660e01b8152600401611110989796959493929190612864565b600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b50505050600073c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c791906125b0565b90506111d281611afa565b5050505050505050565b73820b5c3835b731ddeb1155ac0b37009e37524a5381565b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1681565b73f5ad6f6edec824c7fd54a66d241a227f6503ad3a81565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff16634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113959061246f565b60405180910390fd5b60005b600180549050811015611528578173ffffffffffffffffffffffffffffffffffffffff16600182815481106113d9576113d861256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361151557600180808054905061143191906128e2565b815481106114425761144161256c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600182815481106114815761148061256c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018054806114db576114da612916565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611528565b808061152090612720565b9150506113a1565b5050565b6000638943ec0260e01b90509392505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3681565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061246f565b60405180910390fd5b73c113ed199ef9380e3f93b0a6e25fa86b7298fb1673ffffffffffffffffffffffffffffffffffffffff1663e38d1a40826040518263ffffffff1660e01b81526004016116269190612768565b600060405180830381600087803b15801561164057600080fd5b505af1158015611654573d6000803e3d6000fd5b5050505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061246f565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190612609565b60ff1611156117bb576001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118379061246f565b60405180910390fd5b60006001151582151514611855576000611877565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b373820b5c3835b731ddeb1155ac0b37009e37524a53836040518363ffffffff1660e01b81526004016118c892919061249e565b6020604051808303816000875af11580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b91906124dc565b50505050565b73810059e1406dedafd1bdca4e0137cba306c0ce3673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a9061246f565b60405180910390fd5b7308a7c8be47773546dc5e173d67b0c38afffa4b8473ffffffffffffffffffffffffffffffffffffffff16635d8c85ef83836040518363ffffffff1660e01b81526004016119e19190612768565b6000604051808303818588803b1580156119fa57600080fd5b505af1158015611a0e573d6000803e3d6000fd5b50505050505050565b7308a7c8be47773546dc5e173d67b0c38afffa4b8481565b60005b600080549050811015611af6578160008281548110611a5457611a5361256c565b5b906000526020600020015403611ae35760006001600080549050611a7891906128e2565b81548110611a8957611a8861256c565b5b906000526020600020015460008281548110611aa857611aa761256c565b5b90600052602060002001819055506000805480611ac857611ac7612916565b5b60019003818190600052602060002001600090559055611af6565b8080611aee90612720565b915050611a32565b5050565b600081908060018154018082558091505060019003906000526020600020016000909190919091505550565b604051806080016040528060008152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b8e81611b7b565b8114611b9957600080fd5b50565b600081359050611bab81611b85565b92915050565b600060208284031215611bc757611bc6611b71565b5b6000611bd584828501611b9c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0982611bde565b9050919050565b611c1981611bfe565b8114611c2457600080fd5b50565b600081359050611c3681611c10565b92915050565b600080600060608486031215611c5557611c54611b71565b5b6000611c6386828701611c27565b9350506020611c7486828701611c27565b9250506040611c8586828701611b9c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611cc481611b7b565b82525050565b6000611cd68383611cbb565b60208301905092915050565b6000602082019050919050565b6000611cfa82611c8f565b611d048185611c9a565b9350611d0f83611cab565b8060005b83811015611d40578151611d278882611cca565b9750611d3283611ce2565b925050600181019050611d13565b5085935050505092915050565b60006020820190508181036000830152611d678184611cef565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060ff82169050919050565b611db181611d9b565b82525050565b611dc081611bfe565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e00578082015181840152602081019050611de5565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e2882611dc6565b611e328185611dd1565b9350611e42818560208601611de2565b611e4b81611e0c565b840191505092915050565b6000608083016000830151611e6e6000860182611cbb565b506020830151611e816020860182611da8565b506040830151611e946040860182611db7565b5060608301518482036060860152611eac8282611e1d565b9150508091505092915050565b6000611ec58383611e56565b905092915050565b6000602082019050919050565b6000611ee582611d6f565b611eef8185611d7a565b935083602082028501611f0185611d8b565b8060005b85811015611f3d5784840389528151611f1e8582611eb9565b9450611f2983611ecd565b925060208a01995050600181019050611f05565b50829750879550505050505092915050565b60006020820190508181036000830152611f698184611eda565b905092915050565b600080600080600080600080610100898b031215611f9257611f91611b71565b5b6000611fa08b828c01611c27565b9850506020611fb18b828c01611c27565b9750506040611fc28b828c01611b9c565b9650506060611fd38b828c01611b9c565b9550506080611fe48b828c01611b9c565b94505060a0611ff58b828c01611b9c565b93505060c06120068b828c01611b9c565b92505060e06120178b828c01611b9c565b9150509295985092959890939650565b6000806040838503121561203e5761203d611b71565b5b600061204c85828601611c27565b925050602061205d85828601611b9c565b9150509250929050565b600080600080600080600060e0888a03121561208657612085611b71565b5b60006120948a828b01611c27565b97505060206120a58a828b01611c27565b96505060406120b68a828b01611b9c565b95505060606120c78a828b01611b9c565b94505060806120d88a828b01611b9c565b93505060a06120e98a828b01611b9c565b92505060c06120fa8a828b01611b9c565b91505092959891949750929550565b61211281611bfe565b82525050565b600060208201905061212d6000830184612109565b92915050565b60006020828403121561214957612148611b71565b5b600061215784828501611c27565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6121a282611e0c565b810181811067ffffffffffffffff821117156121c1576121c061216a565b5b80604052505050565b60006121d4611b67565b90506121e08282612199565b919050565b600067ffffffffffffffff821115612200576121ff61216a565b5b61220982611e0c565b9050602081019050919050565b82818337600083830152505050565b6000612238612233846121e5565b6121ca565b90508281526020810184848401111561225457612253612165565b5b61225f848285612216565b509392505050565b600082601f83011261227c5761227b612160565b5b813561228c848260208601612225565b91505092915050565b6000806000606084860312156122ae576122ad611b71565b5b60006122bc86828701611c27565b93505060206122cd86828701611b9c565b925050604084013567ffffffffffffffff8111156122ee576122ed611b76565b5b6122fa86828701612267565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61233981612304565b82525050565b60006020820190506123546000830184612330565b92915050565b60008115159050919050565b61236f8161235a565b811461237a57600080fd5b50565b60008135905061238c81612366565b92915050565b600080604083850312156123a9576123a8611b71565b5b60006123b785828601611c27565b92505060206123c88582860161237d565b9150509250929050565b600080604083850312156123e9576123e8611b71565b5b60006123f785828601611b9c565b925050602061240885828601611b9c565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920636f6e74726163742044414f000000000000000000000000000000600082015250565b6000612459601183612412565b915061246482612423565b602082019050919050565b600060208201905081810360008301526124888161244c565b9050919050565b61249881611b7b565b82525050565b60006040820190506124b36000830185612109565b6124c0602083018461248f565b9392505050565b6000815190506124d681612366565b92915050565b6000602082840312156124f2576124f1611b71565b5b6000612500848285016124c7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061254382611b7b565b915061254e83611b7b565b925082820190508082111561256657612565612509565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506125aa81611b85565b92915050565b6000602082840312156125c6576125c5611b71565b5b60006125d48482850161259b565b91505092915050565b6125e681611d9b565b81146125f157600080fd5b50565b600081519050612603816125dd565b92915050565b60006020828403121561261f5761261e611b71565b5b600061262d848285016125f4565b91505092915050565b600067ffffffffffffffff8211156126515761265061216a565b5b61265a82611e0c565b9050602081019050919050565b600061267a61267584612636565b6121ca565b90508281526020810184848401111561269657612695612165565b5b6126a1848285611de2565b509392505050565b600082601f8301126126be576126bd612160565b5b81516126ce848260208601612667565b91505092915050565b6000602082840312156126ed576126ec611b71565b5b600082015167ffffffffffffffff81111561270b5761270a611b76565b5b612717848285016126a9565b91505092915050565b600061272b82611b7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275d5761275c612509565b5b600182019050919050565b600060208201905061277d600083018461248f565b92915050565b6000819050919050565b6000819050919050565b60006127b26127ad6127a884612783565b61278d565b611b7b565b9050919050565b6127c281612797565b82525050565b6000610140820190506127de600083018d612109565b6127eb602083018c612109565b6127f8604083018b61248f565b612805606083018a61248f565b612812608083018961248f565b61281f60a083018861248f565b61282c60c083018761248f565b61283960e083018661248f565b6128476101008301856127b9565b6128556101208301846127b9565b9b9a5050505050505050505050565b60006101008201905061287a600083018b612109565b612887602083018a612109565b612894604083018961248f565b6128a1606083018861248f565b6128ae608083018761248f565b6128bb60a083018661248f565b6128c860c083018561248f565b6128d560e08301846127b9565b9998505050505050505050565b60006128ed82611b7b565b91506128f883611b7b565b92508282039050818111156129105761290f612509565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220e570ea0c18ebbe85208cac62731668b681800ced5c114c82ab71e4826847ca3e64736f6c63430008100033