false
false
0

Contract Address Details

0x1f68C7b973FC4Db362d5CDb213faf1AB133e2d0F

Contract Name
TwoBearsBalances
Creator
0xebe894–7a24f6 at 0xb7046a–345f7b
Balance
15,685.100000000000000001 CLO
Tokens
Fetching tokens...
Transactions
590 Transactions
Transfers
422 Transfers
Gas Used
30,766,031
Last Balance Update
16285731
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TwoBearsBalances




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




EVM Version
default




Verified at
2024-09-26T15:34:52.786669Z

Contract source code

// All rights reserved.
// SPDX-License-Identifier: No License (None)

pragma solidity ^0.8.16;

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);
}

contract TwoBearsBalances {

    struct Tokens { 
        uint256 minValue; // 32 байта - минимальное количество токена, доступное для торговли (ограничивает создание пылевых ордеров)
        uint8 standart; // 1 байта - стандарт токена
        uint8 decimal; // 1 байт - количество десятичных знаков
        uint16 priority; // 2 байта - приоритет токена для определения ценообразования (цена - отношение к токену с максимальным приоритетом)
        bytes8 symb; // 8 байт - аббревиатура токена
        address next; // 20 байт - адрес следующего токена (последний токен указывает на нулевой адрес)
    }

    struct Balances { 
        uint256 free; // Свободный баланс
        uint256 in_orders; // Баланс в ордерах
    }

    uint256 commission = 4 * 1e17; // комиссионный процент взымаемый с каждого выполняемого ордера (оплачивается получаемым токеном, в процессе исполнения ордера)
    uint256 numExecutedOrders = 75; // максимальное количество ордеров которое можно выполнить за 1 транзакцию 

    mapping(address => Tokens) private tokens; // Односвязный список всех токенов на бирже
    mapping(address => mapping(address => Balances)) private balances; // Балансы пользователей

    address public owner = msg.sender; // Владелец
    address public owner2 = 0xCA110B82bE575DfD1829191Cc38F7a4ab7D808bc; // второй владелец
    address public contractOrders; // Контракт с книгами ордеров
    address private constant firstToken = 0x0000000000000000000000000000000000000001; // первый адрес в списке токенов это нативный CLO
    address private endToken = firstToken; // всегда указывает на последний токен в списке токенов
   
    event Deposit(address indexed token, address indexed to, uint value);
    event Withdrawal(address indexed token, address indexed to, uint value);
    event Transfer(address indexed token, address indexed from, address indexed to, uint value);

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this");
        _;
    }

    modifier onlyContractOrders() {
        require(msg.sender == contractOrders, "Only contract orders can call");
        _;
    }

    constructor()
    {
        tokens[firstToken] = Tokens(1000 * 1e18, 1, 18, 50000, "CLO", address(0x00));
    }

    // Депозитные функции

    receive() external payable {
        depositCLO();
    }

    function depositCLO() public payable { // пополнение нативным CLO
        balances[firstToken][msg.sender].free += msg.value;
        emit Deposit(firstToken, msg.sender, msg.value);
    }

    function depositERC20(address _token, uint _value) external {
        require(tokens[_token].standart == 20); // токен должен присутствовать в списке токенов
        IERC20(_token).transferFrom(msg.sender, address(this), _value);
        balances[_token][msg.sender].free += _value;
        emit Deposit(_token, msg.sender, _value);
    }

    function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4) { // новый ERC223
        require(tokens[msg.sender].standart == 223); // токен должен присутствовать в списке токенов
        balances[msg.sender][_from].free += _value;
        emit Deposit(msg.sender, _from, _value);
        return this.tokenReceived.selector; // возвращаем селектор этой функции
    }

    // Функция вывода свободного депозита

    function withdraw(address _token, address _recipient, uint _value) external {
        //require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов
        require((_value > 0) && (_value <= balances[_token][msg.sender].free)); // количество должно быть больше 0 (защита от фишинговых транзакций, так как токены не делают такую проверку), а также у пользователя должны быть доступные для вывода свободные средства
        require((_recipient != address(0)), "err: zero address"); // Адрес получателя ненулевой

        balances[_token][msg.sender].free -= _value;
        if(tokens[_token].standart == 1){ // вывод нативного CLO
            payable(_recipient).transfer(_value);
        }
        else{ // вывод токена
            IERC20(_token).transfer(_recipient, _value);
        }

        emit Withdrawal(_token, _recipient, _value);
    }

    function withdrawFee(address _token) external // вывести комиссию владельцев
    {
        uint _val = balances[_token][address(this)].free;
        require(_val > 0); // доступный баланс должен быть больше 0
        --_val;
        balances[_token][owner].free += (_val / 2);
        balances[_token][owner2].free += (_val - (_val / 2));
        balances[_token][address(this)].free -= _val;

        emit Transfer(_token, address(this), owner, _val / 2);
        emit Transfer(_token, address(this), owner2, _val - (_val / 2));
    }

    function transfer(address _token, address _recipient, uint _value) external { // внутрибиржевые переводы
        //require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов
        require((_value > 0) && (_value <= balances[_token][msg.sender].free)); // количество должно быть больше 0 (защита от фишинговых транзакций, так как токены не делают такую проверку), а также у пользователя должны быть доступные для вывода свободные средства
        require((_recipient != address(0)), "err: zero address"); // Адрес получателя ненулевой

        balances[_token][msg.sender].free -= _value;
        balances[_token][_recipient].free += _value;

        emit Transfer(_token, msg.sender, _recipient, _value);
    }

    // ФУНКЦИИ ВЛАДЕЛЬЦА

    function setContractOrders(address _newContractOrders) external onlyOwner // установить новый контракт ордеров
    {
        contractOrders = _newContractOrders;
    }

    function setFeesExchange(uint256 _newCommission) external onlyOwner // установить новый процент биржи
    {
        commission = _newCommission;
    }

    function setNumExecutedOrders(uint256 _numExecutedOrders) external onlyOwner // установить максимальное количество исполняемых ордеров в пределах 1 транзакции
    {
        numExecutedOrders = _numExecutedOrders;
    }    

    function addToken(address _newToken, uint8 _standart, uint16 _priority, uint256 _minValue) external onlyOwner // Добавление нового токена на dex
    {
        require(tokens[_newToken].standart == 0, "err: token exists"); // токен должен отсутствовать в списке токенов

        bytes8 _newSymb;
        string memory str = IERC20(_newToken).symbol();
        assembly {
            _newSymb := mload(add(str, 32))
        }    

        tokens[_newToken] = Tokens(_minValue, _standart, IERC20(_newToken).decimals(), _priority, _newSymb, address(0x00));
        tokens[endToken].next = _newToken; // связываем последний токен с новым токеном
        endToken = _newToken; // новый токен становится последним
    }

    function changeTokenMinValue(address _token, uint256 _minValue) external onlyOwner // Изменить минимальное количество токена, доступное для торговли
    {
        require(tokens[_token].standart > 0); // токен должен присутствовать в списке токенов
        tokens[_token].minValue = _minValue;
    }

    function delToken(address _delToken, address _prevToken) external onlyOwner // Делистинг токена
    { // _delToken - удаляемый токен, _prevToken - токен в списке перед удаляемым токеном
        require((_delToken != address(0)) && (_delToken != firstToken)); // Удаляемый токен не может быть нулевым адресом и нативной монетой CLO
        require(tokens[_prevToken].next == _delToken); // предыдущий токен в списке должен указывать на удаляемый токен
        require(IERC20(_delToken).balanceOf(address(this)) == 0); // контракт не должен иметь баланс в удаляемом токене
        if(_delToken == endToken) endToken = _prevToken; // если удаляется последний токен в списке
        tokens[_prevToken].next = tokens[_delToken].next; // исключаем удаляемый токен из списка
        delete tokens[_delToken]; // чистим память, данная операция поощрается EVM и будет возвращено часть газа
        //tokens[_delToken] = Tokens(0, 0, 0, 0, address(0x00)); 
    }

    function searchToken(address _searchToken, address _startSearchToken, uint _elem) public view returns (Tokens memory) // поиск предыдущего токена относительно заданного. Если _elem = 0, то функция просто выводит информацию по токену _searchToken
    {
        // _searchToken - ищем токен перед ним
        // _startSearchToken - от какого токена производится поиск (поиск с первого токена, если данного токена нет в списке)
        // _elem - сколько токенов обойти по списку
        require(tokens[_searchToken].standart > 0, "err: missing _searchToken"); // искомый токен должен присутствовать в списке токенов
        if(_elem == 0) return tokens[_searchToken]; // если _elem = 0, то функция вернет информацию по токену _searchToken

        _startSearchToken = tokens[_startSearchToken].standart > 0 ? _startSearchToken : firstToken; // определяем стартовую позицию
        require(_searchToken != _startSearchToken, "err: tokens are equal"); // искомый и предыдущий токен не должны быть равны
        
        address _nextToken;

        while (_elem > 0) {
            _nextToken = tokens[_startSearchToken].next;
            if((_nextToken == _searchToken) || (_nextToken == address(0x00))){
                break; // токен был найден или достигли конца списка
            } else {
                _startSearchToken = _nextToken;
            }
            --_elem;
        }

        return tokens[_startSearchToken]; // у возвращаемой структуры по полю "next" видно (0х00 - достигли конца списка, токен поиска - если поиск удался, другой адрес токена - значит не хватило итераций, следует возобновить поиск с этого элемента)
    }

    function getTokensInfo(address _startToken, uint _elem) public view returns (Tokens[] memory) // Возвращаем _elem токенов на бирже от указанного адреса
    {   
        Tokens[] memory result = new Tokens[](_elem);  
        _startToken = tokens[_startToken].standart > 0 ? _startToken : firstToken; // определяем стартовую позицию
        address _nextToken;

        for(uint i; i < _elem; i++){
            _nextToken = tokens[_startToken].next;
            result[i] = Tokens(tokens[_startToken].minValue, tokens[_startToken].standart, tokens[_startToken].decimal, tokens[_startToken].priority, tokens[_startToken].symb, tokens[_startToken].next);

            if(_nextToken == address(0x00)){
                break; // достигли конца списка
            } else {
                _startToken = _nextToken;
            }
        }
        return (result); // возвращаем массив с инфой по токенам
    }

    function getTraderBalancesByTokens(address _trader, address[] calldata _tokens) public view returns (Balances[] memory) // Возвращает балансы трейдера (свободный баланс/ баланс в ордерах) по токенам в массиве
    {
        Balances[] memory result = new Balances[](_tokens.length);  
        for(uint i; i < _tokens.length; i++){
            result[i] = Balances(balances[_tokens[i]][_trader].free, balances[_tokens[i]][_trader].in_orders);
        }
        return (result); // возвращаем массив с балансами
    }

    // ФУНКЦИИ ДЛЯ КОНТРАКТА С КНИГАМИ ОРДЕРОВ

    function getFeesAndNumExecOrd() external view returns (uint256, uint256) // вернуть процент биржи и максимальное количество исполняемых ордеров за 1 транзакцию
    {
        return (commission, numExecutedOrders);
    }

    function lockInOrder(address _token_in, address _token_out, address _owner, uint _value_in, uint _value_out) external onlyContractOrders // Блокировка баланса в ордере. Функция вызывается только при создании ордера
    {
        require((_value_in > 0) && (_value_out > 0)); // количество входящего и получаемого токена должно быть больше 0  
        require(tokens[_token_out].standart > 0); // получаемый токен должен присутствовать на бирже
        require(_value_in <= balances[_token_in][_owner].free); // количество входящего токена должно иметься в наличии 
        require(_token_in != _token_out); // токены не должны быть одинаковыми
        if(tokens[_token_in].priority < tokens[_token_out].priority){ // делаем проверку что ордера не пылевые - соответствуют минимальному значению по токену с максимальным приоритетом
            require(_value_out >= tokens[_token_out].minValue);
        }
        else{
            require(_value_in >= tokens[_token_in].minValue);
        }

        balances[_token_in][_owner].free -= _value_in; // блокируем средства входящего токена в ордере
        balances[_token_in][_owner].in_orders += _value_in;
    }

    function getTypeAndPriceOrder(address _token_in, uint _value_in, address _token_out, uint _value_out) external view returns (uint8, uint256) // вернуть тип ордера и цену ордера
    {
        uint8 _order_type = tokens[_token_in].priority < tokens[_token_out].priority ? 1 : 2; // тип ордера (1 - продажа, 2 - покупка)
        uint256 res = _order_type == 1 ? _value_out * (10**tokens[_token_in].decimal) / _value_in : _value_in * (10**tokens[_token_out].decimal) / _value_out; // расчет цены ордера
        return (_order_type, res);
    }

    function operSub(address _token, address _owner, uint _value) external onlyContractOrders // Функция забирает баланс заблокированный в ордере
    {
        balances[_token][_owner].in_orders -= _value;
    }

    function operAdd(address _token, address _owner, uint _value) external onlyContractOrders // Функция пополняет свободный баланс
    {
        balances[_token][_owner].free += _value;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addToken","inputs":[{"type":"address","name":"_newToken","internalType":"address"},{"type":"uint8","name":"_standart","internalType":"uint8"},{"type":"uint16","name":"_priority","internalType":"uint16"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenMinValue","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_minValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractOrders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delToken","inputs":[{"type":"address","name":"_delToken","internalType":"address"},{"type":"address","name":"_prevToken","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositCLO","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositERC20","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFeesAndNumExecOrd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Tokens[]","components":[{"type":"uint256","name":"minValue","internalType":"uint256"},{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"getTokensInfo","inputs":[{"type":"address","name":"_startToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct TwoBearsBalances.Balances[]","components":[{"type":"uint256","name":"free","internalType":"uint256"},{"type":"uint256","name":"in_orders","internalType":"uint256"}]}],"name":"getTraderBalancesByTokens","inputs":[{"type":"address","name":"_trader","internalType":"address"},{"type":"address[]","name":"_tokens","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTypeAndPriceOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"uint256","name":"_value_out","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockInOrder","inputs":[{"type":"address","name":"_token_in","internalType":"address"},{"type":"address","name":"_token_out","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value_in","internalType":"uint256"},{"type":"uint256","name":"_value_out","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operAdd","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operSub","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct TwoBearsBalances.Tokens","components":[{"type":"uint256","name":"minValue","internalType":"uint256"},{"type":"uint8","name":"standart","internalType":"uint8"},{"type":"uint8","name":"decimal","internalType":"uint8"},{"type":"uint16","name":"priority","internalType":"uint16"},{"type":"bytes8","name":"symb","internalType":"bytes8"},{"type":"address","name":"next","internalType":"address"}]}],"name":"searchToken","inputs":[{"type":"address","name":"_searchToken","internalType":"address"},{"type":"address","name":"_startSearchToken","internalType":"address"},{"type":"uint256","name":"_elem","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setContractOrders","inputs":[{"type":"address","name":"_newContractOrders","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeesExchange","inputs":[{"type":"uint256","name":"_newCommission","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumExecutedOrders","inputs":[{"type":"uint256","name":"_numExecutedOrders","internalType":"uint256"}]},{"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":"transfer","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":"withdraw","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":"withdrawFee","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x608060405267058d15e176280000600055604b60015533600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ca110b82be575dfd1829191cc38f7a4ab7d808bc600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100f957600080fd5b506040518060c00160405280683635c9adc5dea000008152602001600160ff168152602001601260ff16815260200161c35061ffff1681526020017f434c4f000000000000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050614777806102c06000396000f3fe6080604052600436106101445760003560e01c806367579e21116100b6578063bc3e7f991161006f578063bc3e7f9914610469578063beabacc8146104a6578063bfdf0bd7146104cf578063d9caed12146104f8578063e06b440014610521578063fef4d95b1461054c57610153565b806367579e211461035d57806381e1c10b146103865780638943ec02146103af5780638a6cea2c146103ec5780638da5cb5b1461041557806397feb9261461044057610153565b80632171d407116101085780632171d4071461024d57806324bd3e8f1461027657806331cefa861461029f57806350878405146102c857806352709725146102f4578063665558041461031f57610153565b80630da529b61461015857806313442900146101815780631a180bb6146101be5780631ac3ddeb146101e75780631f2bff681461021057610153565b3661015357610151610556565b005b600080fd5b34801561016457600080fd5b5061017f600480360381019061017a919061351a565b610655565b005b34801561018d57600080fd5b506101a860048036038101906101a3919061351a565b610780565b6040516101b5919061367a565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e09190613695565b610c9b565b005b3480156101f357600080fd5b5061020e600480360381019061020991906136d5565b610dd5565b005b34801561021c57600080fd5b5061023760048036038101906102329190613695565b6111fe565b604051610244919061382c565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f919061384e565b6115ec565b005b34801561028257600080fd5b5061029d600480360381019061029891906138c9565b611a3f565b005b3480156102ab57600080fd5b506102c660048036038101906102c191906136d5565b611ad9565b005b3480156102d457600080fd5b506102dd611bad565b6040516102eb929190613905565b60405180910390f35b34801561030057600080fd5b50610309611bbe565b604051610316919061393d565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190613958565b611be4565b6040516103549291906139ce565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061351a565b611dae565b005b34801561039257600080fd5b506103ad60048036038101906103a891906139f7565b611ed9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613b7d565b612343565b6040516103e39190613c27565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906138c9565b6124b0565b005b34801561042157600080fd5b5061042a61254a565b604051610437919061393d565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613695565b612570565b005b34801561047557600080fd5b50610490600480360381019061048b9190613ca2565b61274f565b60405161049d9190613de0565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c8919061351a565b612958565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613e5a565b612c0c565b005b34801561050457600080fd5b5061051f600480360381019061051a919061351a565b613094565b005b34801561052d57600080fd5b506105366133c1565b604051610543919061393d565b60405180910390f35b610554610556565b005b3460036000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546105e69190613ef0565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f623460405161064b9190613f24565b60405180910390a3565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dc90613f9c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546107749190613ef0565b92505081905550505050565b6107886133e7565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161081d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081490614008565b60405180910390fd5b6000820361097d57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160018201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050610c94565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116109de5760016109e0565b825b92508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790614074565b60405180910390fd5b60005b6000831115610b3f57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b275750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b3f5780935082610b3890614094565b9250610a53565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160018201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509150505b9392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290614109565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611610d8a57600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610e6657600080fd5b80610e7090614094565b9050600281610e7f9190614158565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610f2f9190613ef0565b92505081905550600281610f439190614158565b81610f4e9190614189565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ffe9190613ef0565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546110949190614189565b92505081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f6002856111309190614158565b60405161113d9190613f24565b60405180910390a4600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f6002856111da9190614158565b856111e59190614189565b6040516111f29190613f24565b60405180910390a45050565b606060008267ffffffffffffffff81111561121c5761121b613a52565b5b60405190808252806020026020018201604052801561125557816020015b6112426133e7565b81526020019060019003908161123a5790505b5090506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116112b95760016112bb565b835b93506000805b848110156115e057600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525083828151811061158a576115896141bd565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156115e05781955080806115d8906141ec565b9150506112c1565b50819250505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390613f9c565b60405180910390fd5b60008211801561168c5750600081115b61169557600080fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116116f457600080fd5b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482111561178057600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036117b857600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610156118bc57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548110156118b757600080fd5b61190c565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482101561190b57600080fd5b5b81600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461199b9190614189565b9250508190555081600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611a319190613ef0565b925050819055505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614109565b60405180910390fd5b8060018190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614109565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600054600154915091509091565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610611c9f576002611ca2565b60015b9050600060018260ff1614611d285784600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a611d0e9190614367565b88611d1991906143b2565b611d239190614158565b611d9b565b86600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a611d859190614367565b86611d9091906143b2565b611d9a9190614158565b5b9050818193509350505094509492505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590613f9c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611ecd9190614189565b92505081905550505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6090614109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fd35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fdc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461207657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120b1919061393d565b602060405180830381865afa1580156120ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f29190614421565b146120fc57600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121935780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b600060df600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146123a457600080fd5b82600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546124339190613ef0565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62856040516124979190613f24565b60405180910390a3638943ec0260e01b90509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253790614109565b60405180910390fd5b8060008190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146125cf57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161260c9392919061444e565b6020604051808303816000875af115801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906144bd565b5080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546126df9190613ef0565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62836040516127439190613f24565b60405180910390a35050565b606060008383905067ffffffffffffffff8111156127705761276f613a52565b5b6040519080825280602002602001820160405280156127a957816020015b612796613458565b81526020019060019003908161278e5790505b50905060005b8484905081101561294c576040518060400160405280600360008888868181106127dc576127db6141bd565b5b90506020020160208101906127f191906136d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200160036000888886818110612888576128876141bd565b5b905060200201602081019061289d91906136d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481525082828151811061292e5761292d6141bd565b5b60200260200101819052508080612944906141ec565b9150506127af565b50809150509392505050565b6000811180156129e75750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b6129f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690614536565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612aee9190614189565b9250508190555080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612b849190613ef0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f84604051612bff9190613f24565b60405180910390a4505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390614109565b60405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1614612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d28906145a2565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015612d7f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612da8919061468d565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a91906146eb565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560026000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000811180156131235750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b61312c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614536565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461322a9190614189565b925050819055506001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16036132d7578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156132d1573d6000803e3d6000fd5b50613357565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401613312929190614718565b6020604051808303816000875af1158015613331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335591906144bd565b505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398836040516133b49190613f24565b60405180910390a3505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134b182613486565b9050919050565b6134c1816134a6565b81146134cc57600080fd5b50565b6000813590506134de816134b8565b92915050565b6000819050919050565b6134f7816134e4565b811461350257600080fd5b50565b600081359050613514816134ee565b92915050565b6000806000606084860312156135335761353261347c565b5b6000613541868287016134cf565b9350506020613552868287016134cf565b925050604061356386828701613505565b9150509250925092565b613576816134e4565b82525050565b600060ff82169050919050565b6135928161357c565b82525050565b600061ffff82169050919050565b6135af81613598565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6135ea816135b5565b82525050565b6135f9816134a6565b82525050565b60c082016000820151613615600085018261356d565b5060208201516136286020850182613589565b50604082015161363b6040850182613589565b50606082015161364e60608501826135a6565b50608082015161366160808501826135e1565b5060a082015161367460a08501826135f0565b50505050565b600060c08201905061368f60008301846135ff565b92915050565b600080604083850312156136ac576136ab61347c565b5b60006136ba858286016134cf565b92505060206136cb85828601613505565b9150509250929050565b6000602082840312156136eb576136ea61347c565b5b60006136f9848285016134cf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c082016000820151613744600085018261356d565b5060208201516137576020850182613589565b50604082015161376a6040850182613589565b50606082015161377d60608501826135a6565b50608082015161379060808501826135e1565b5060a08201516137a360a08501826135f0565b50505050565b60006137b5838361372e565b60c08301905092915050565b6000602082019050919050565b60006137d982613702565b6137e3818561370d565b93506137ee8361371e565b8060005b8381101561381f57815161380688826137a9565b9750613811836137c1565b9250506001810190506137f2565b5085935050505092915050565b6000602082019050818103600083015261384681846137ce565b905092915050565b600080600080600060a0868803121561386a5761386961347c565b5b6000613878888289016134cf565b9550506020613889888289016134cf565b945050604061389a888289016134cf565b93505060606138ab88828901613505565b92505060806138bc88828901613505565b9150509295509295909350565b6000602082840312156138df576138de61347c565b5b60006138ed84828501613505565b91505092915050565b6138ff816134e4565b82525050565b600060408201905061391a60008301856138f6565b61392760208301846138f6565b9392505050565b613937816134a6565b82525050565b6000602082019050613952600083018461392e565b92915050565b600080600080608085870312156139725761397161347c565b5b6000613980878288016134cf565b945050602061399187828801613505565b93505060406139a2878288016134cf565b92505060606139b387828801613505565b91505092959194509250565b6139c88161357c565b82525050565b60006040820190506139e360008301856139bf565b6139f060208301846138f6565b9392505050565b60008060408385031215613a0e57613a0d61347c565b5b6000613a1c858286016134cf565b9250506020613a2d858286016134cf565b9150509250929050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a8a82613a41565b810181811067ffffffffffffffff82111715613aa957613aa8613a52565b5b80604052505050565b6000613abc613472565b9050613ac88282613a81565b919050565b600067ffffffffffffffff821115613ae857613ae7613a52565b5b613af182613a41565b9050602081019050919050565b82818337600083830152505050565b6000613b20613b1b84613acd565b613ab2565b905082815260208101848484011115613b3c57613b3b613a3c565b5b613b47848285613afe565b509392505050565b600082601f830112613b6457613b63613a37565b5b8135613b74848260208601613b0d565b91505092915050565b600080600060608486031215613b9657613b9561347c565b5b6000613ba4868287016134cf565b9350506020613bb586828701613505565b925050604084013567ffffffffffffffff811115613bd657613bd5613481565b5b613be286828701613b4f565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c2181613bec565b82525050565b6000602082019050613c3c6000830184613c18565b92915050565b600080fd5b600080fd5b60008083601f840112613c6257613c61613a37565b5b8235905067ffffffffffffffff811115613c7f57613c7e613c42565b5b602083019150836020820283011115613c9b57613c9a613c47565b5b9250929050565b600080600060408486031215613cbb57613cba61347c565b5b6000613cc9868287016134cf565b935050602084013567ffffffffffffffff811115613cea57613ce9613481565b5b613cf686828701613c4c565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b604082016000820151613d44600085018261356d565b506020820151613d57602085018261356d565b50505050565b6000613d698383613d2e565b60408301905092915050565b6000602082019050919050565b6000613d8d82613d02565b613d978185613d0d565b9350613da283613d1e565b8060005b83811015613dd3578151613dba8882613d5d565b9750613dc583613d75565b925050600181019050613da6565b5085935050505092915050565b60006020820190508181036000830152613dfa8184613d82565b905092915050565b613e0b8161357c565b8114613e1657600080fd5b50565b600081359050613e2881613e02565b92915050565b613e3781613598565b8114613e4257600080fd5b50565b600081359050613e5481613e2e565b92915050565b60008060008060808587031215613e7457613e7361347c565b5b6000613e82878288016134cf565b9450506020613e9387828801613e19565b9350506040613ea487828801613e45565b9250506060613eb587828801613505565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613efb826134e4565b9150613f06836134e4565b9250828201905080821115613f1e57613f1d613ec1565b5b92915050565b6000602082019050613f3960008301846138f6565b92915050565b600082825260208201905092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b6000613f86601d83613f3f565b9150613f9182613f50565b602082019050919050565b60006020820190508181036000830152613fb581613f79565b9050919050565b7f6572723a206d697373696e67205f736561726368546f6b656e00000000000000600082015250565b6000613ff2601983613f3f565b9150613ffd82613fbc565b602082019050919050565b6000602082019050818103600083015261402181613fe5565b9050919050565b7f6572723a20746f6b656e732061726520657175616c0000000000000000000000600082015250565b600061405e601583613f3f565b915061406982614028565b602082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b600061409f826134e4565b9150600082036140b2576140b1613ec1565b5b600182039050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b60006140f3601883613f3f565b91506140fe826140bd565b602082019050919050565b60006020820190508181036000830152614122816140e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614163826134e4565b915061416e836134e4565b92508261417e5761417d614129565b5b828204905092915050565b6000614194826134e4565b915061419f836134e4565b92508282039050818111156141b7576141b6613ec1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141f7826134e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361422957614228613ec1565b5b600182019050919050565b60008160011c9050919050565b6000808291508390505b600185111561428b5780860481111561426757614266613ec1565b5b60018516156142765780820291505b808102905061428485614234565b945061424b565b94509492505050565b6000826142a45760019050614360565b816142b25760009050614360565b81600181146142c857600281146142d257614301565b6001915050614360565b60ff8411156142e4576142e3613ec1565b5b8360020a9150848211156142fb576142fa613ec1565b5b50614360565b5060208310610133831016604e8410600b84101617156143365782820a90508381111561433157614330613ec1565b5b614360565b6143438484846001614241565b9250905081840481111561435a57614359613ec1565b5b81810290505b9392505050565b6000614372826134e4565b915061437d8361357c565b92506143aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614294565b905092915050565b60006143bd826134e4565b91506143c8836134e4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561440157614400613ec1565b5b828202905092915050565b60008151905061441b816134ee565b92915050565b6000602082840312156144375761443661347c565b5b60006144458482850161440c565b91505092915050565b6000606082019050614463600083018661392e565b614470602083018561392e565b61447d60408301846138f6565b949350505050565b60008115159050919050565b61449a81614485565b81146144a557600080fd5b50565b6000815190506144b781614491565b92915050565b6000602082840312156144d3576144d261347c565b5b60006144e1848285016144a8565b91505092915050565b7f6572723a207a65726f2061646472657373000000000000000000000000000000600082015250565b6000614520601183613f3f565b915061452b826144ea565b602082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b600061458c601183613f3f565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b600067ffffffffffffffff8211156145dd576145dc613a52565b5b6145e682613a41565b9050602081019050919050565b60005b838110156146115780820151818401526020810190506145f6565b60008484015250505050565b600061463061462b846145c2565b613ab2565b90508281526020810184848401111561464c5761464b613a3c565b5b6146578482856145f3565b509392505050565b600082601f83011261467457614673613a37565b5b815161468484826020860161461d565b91505092915050565b6000602082840312156146a3576146a261347c565b5b600082015167ffffffffffffffff8111156146c1576146c0613481565b5b6146cd8482850161465f565b91505092915050565b6000815190506146e581613e02565b92915050565b6000602082840312156147015761470061347c565b5b600061470f848285016146d6565b91505092915050565b600060408201905061472d600083018561392e565b61473a60208301846138f6565b939250505056fea2646970667358221220db8dcb5e1a741e8bb5423ca56378fe2f63d06f666f7c6a4180cf903ac71489e164736f6c63430008100033

Deployed ByteCode

0x6080604052600436106101445760003560e01c806367579e21116100b6578063bc3e7f991161006f578063bc3e7f9914610469578063beabacc8146104a6578063bfdf0bd7146104cf578063d9caed12146104f8578063e06b440014610521578063fef4d95b1461054c57610153565b806367579e211461035d57806381e1c10b146103865780638943ec02146103af5780638a6cea2c146103ec5780638da5cb5b1461041557806397feb9261461044057610153565b80632171d407116101085780632171d4071461024d57806324bd3e8f1461027657806331cefa861461029f57806350878405146102c857806352709725146102f4578063665558041461031f57610153565b80630da529b61461015857806313442900146101815780631a180bb6146101be5780631ac3ddeb146101e75780631f2bff681461021057610153565b3661015357610151610556565b005b600080fd5b34801561016457600080fd5b5061017f600480360381019061017a919061351a565b610655565b005b34801561018d57600080fd5b506101a860048036038101906101a3919061351a565b610780565b6040516101b5919061367a565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e09190613695565b610c9b565b005b3480156101f357600080fd5b5061020e600480360381019061020991906136d5565b610dd5565b005b34801561021c57600080fd5b5061023760048036038101906102329190613695565b6111fe565b604051610244919061382c565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f919061384e565b6115ec565b005b34801561028257600080fd5b5061029d600480360381019061029891906138c9565b611a3f565b005b3480156102ab57600080fd5b506102c660048036038101906102c191906136d5565b611ad9565b005b3480156102d457600080fd5b506102dd611bad565b6040516102eb929190613905565b60405180910390f35b34801561030057600080fd5b50610309611bbe565b604051610316919061393d565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190613958565b611be4565b6040516103549291906139ce565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f919061351a565b611dae565b005b34801561039257600080fd5b506103ad60048036038101906103a891906139f7565b611ed9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613b7d565b612343565b6040516103e39190613c27565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906138c9565b6124b0565b005b34801561042157600080fd5b5061042a61254a565b604051610437919061393d565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613695565b612570565b005b34801561047557600080fd5b50610490600480360381019061048b9190613ca2565b61274f565b60405161049d9190613de0565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c8919061351a565b612958565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613e5a565b612c0c565b005b34801561050457600080fd5b5061051f600480360381019061051a919061351a565b613094565b005b34801561052d57600080fd5b506105366133c1565b604051610543919061393d565b60405180910390f35b610554610556565b005b3460036000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546105e69190613ef0565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f623460405161064b9190613f24565b60405180910390a3565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106dc90613f9c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546107749190613ef0565b92505081905550505050565b6107886133e7565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff161161081d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081490614008565b60405180910390fd5b6000820361097d57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160018201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050610c94565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116109de5760016109e0565b825b92508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790614074565b60405180910390fd5b60005b6000831115610b3f57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b275750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b3f5780935082610b3890614094565b9250610a53565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a900460ff1660ff1660ff1681526020016001820160019054906101000a900460ff1660ff1660ff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff191677ffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160018201600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509150505b9392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290614109565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1611610d8a57600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060008111610e6657600080fd5b80610e7090614094565b9050600281610e7f9190614158565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610f2f9190613ef0565b92505081905550600281610f439190614158565b81610f4e9190614189565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ffe9190613ef0565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546110949190614189565b92505081905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f6002856111309190614158565b60405161113d9190613f24565b60405180910390a4600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f6002856111da9190614158565b856111e59190614189565b6040516111f29190613f24565b60405180910390a45050565b606060008267ffffffffffffffff81111561121c5761121b613a52565b5b60405190808252806020026020018201604052801561125557816020015b6112426133e7565b81526020019060019003908161123a5790505b5090506000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116112b95760016112bb565b835b93506000805b848110156115e057600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506040518060c00160405280600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1660ff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160049054906101000a900460c01b77ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525083828151811061158a576115896141bd565b5b6020026020010181905250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156115e05781955080806115d8906141ec565b9150506112c1565b50819250505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390613f9c565b60405180910390fd5b60008211801561168c5750600081115b61169557600080fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16116116f457600080fd5b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482111561178057600080fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036117b857600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610156118bc57600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548110156118b757600080fd5b61190c565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482101561190b57600080fd5b5b81600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461199b9190614189565b9250508190555081600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611a319190613ef0565b925050819055505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614109565b60405180910390fd5b8060018190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614109565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600054600154915091509091565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff16600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900461ffff1661ffff1610611c9f576002611ca2565b60015b9050600060018260ff1614611d285784600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a611d0e9190614367565b88611d1991906143b2565b611d239190614158565b611d9b565b86600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff16600a611d859190614367565b86611d9091906143b2565b611d9a9190614158565b5b9050818193509350505094509492505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590613f9c565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611ecd9190614189565b92505081905550505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6090614109565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fd35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611fdc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461207657600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120b1919061393d565b602060405180830381865afa1580156120ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f29190614421565b146120fc57600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121935780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160006101000a81549060ff02191690556001820160016101000a81549060ff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549067ffffffffffffffff021916905560018201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050565b600060df600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146123a457600080fd5b82600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546124339190613ef0565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62856040516124979190613f24565b60405180910390a3638943ec0260e01b90509392505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253790614109565b60405180910390fd5b8060008190555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6014600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16146125cf57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161260c9392919061444e565b6020604051808303816000875af115801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906144bd565b5080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546126df9190613ef0565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62836040516127439190613f24565b60405180910390a35050565b606060008383905067ffffffffffffffff8111156127705761276f613a52565b5b6040519080825280602002602001820160405280156127a957816020015b612796613458565b81526020019060019003908161278e5790505b50905060005b8484905081101561294c576040518060400160405280600360008888868181106127dc576127db6141bd565b5b90506020020160208101906127f191906136d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154815260200160036000888886818110612888576128876141bd565b5b905060200201602081019061289d91906136d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015481525082828151811061292e5761292d6141bd565b5b60200260200101819052508080612944906141ec565b9150506127af565b50809150509392505050565b6000811180156129e75750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b6129f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690614536565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612aee9190614189565b9250508190555080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254612b849190613ef0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f84604051612bff9190613f24565b60405180910390a4505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9390614109565b60405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff1614612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d28906145a2565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015612d7f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612da8919061468d565b9050602081015191506040518060c001604052808481526020018660ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a91906146eb565b60ff1681526020018561ffff1681526020018377ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548161ffff021916908361ffff16021790555060808201518160010160046101000a81548167ffffffffffffffff021916908360c01c021790555060a082015181600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508560026000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000811180156131235750600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b61312c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614536565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461322a9190614189565b925050819055506001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1660ff16036132d7578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156132d1573d6000803e3d6000fd5b50613357565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401613312929190614718565b6020604051808303816000875af1158015613331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335591906144bd565b505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398836040516133b49190613f24565b60405180910390a3505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060c0016040528060008152602001600060ff168152602001600060ff168152602001600061ffff168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134b182613486565b9050919050565b6134c1816134a6565b81146134cc57600080fd5b50565b6000813590506134de816134b8565b92915050565b6000819050919050565b6134f7816134e4565b811461350257600080fd5b50565b600081359050613514816134ee565b92915050565b6000806000606084860312156135335761353261347c565b5b6000613541868287016134cf565b9350506020613552868287016134cf565b925050604061356386828701613505565b9150509250925092565b613576816134e4565b82525050565b600060ff82169050919050565b6135928161357c565b82525050565b600061ffff82169050919050565b6135af81613598565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6135ea816135b5565b82525050565b6135f9816134a6565b82525050565b60c082016000820151613615600085018261356d565b5060208201516136286020850182613589565b50604082015161363b6040850182613589565b50606082015161364e60608501826135a6565b50608082015161366160808501826135e1565b5060a082015161367460a08501826135f0565b50505050565b600060c08201905061368f60008301846135ff565b92915050565b600080604083850312156136ac576136ab61347c565b5b60006136ba858286016134cf565b92505060206136cb85828601613505565b9150509250929050565b6000602082840312156136eb576136ea61347c565b5b60006136f9848285016134cf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c082016000820151613744600085018261356d565b5060208201516137576020850182613589565b50604082015161376a6040850182613589565b50606082015161377d60608501826135a6565b50608082015161379060808501826135e1565b5060a08201516137a360a08501826135f0565b50505050565b60006137b5838361372e565b60c08301905092915050565b6000602082019050919050565b60006137d982613702565b6137e3818561370d565b93506137ee8361371e565b8060005b8381101561381f57815161380688826137a9565b9750613811836137c1565b9250506001810190506137f2565b5085935050505092915050565b6000602082019050818103600083015261384681846137ce565b905092915050565b600080600080600060a0868803121561386a5761386961347c565b5b6000613878888289016134cf565b9550506020613889888289016134cf565b945050604061389a888289016134cf565b93505060606138ab88828901613505565b92505060806138bc88828901613505565b9150509295509295909350565b6000602082840312156138df576138de61347c565b5b60006138ed84828501613505565b91505092915050565b6138ff816134e4565b82525050565b600060408201905061391a60008301856138f6565b61392760208301846138f6565b9392505050565b613937816134a6565b82525050565b6000602082019050613952600083018461392e565b92915050565b600080600080608085870312156139725761397161347c565b5b6000613980878288016134cf565b945050602061399187828801613505565b93505060406139a2878288016134cf565b92505060606139b387828801613505565b91505092959194509250565b6139c88161357c565b82525050565b60006040820190506139e360008301856139bf565b6139f060208301846138f6565b9392505050565b60008060408385031215613a0e57613a0d61347c565b5b6000613a1c858286016134cf565b9250506020613a2d858286016134cf565b9150509250929050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a8a82613a41565b810181811067ffffffffffffffff82111715613aa957613aa8613a52565b5b80604052505050565b6000613abc613472565b9050613ac88282613a81565b919050565b600067ffffffffffffffff821115613ae857613ae7613a52565b5b613af182613a41565b9050602081019050919050565b82818337600083830152505050565b6000613b20613b1b84613acd565b613ab2565b905082815260208101848484011115613b3c57613b3b613a3c565b5b613b47848285613afe565b509392505050565b600082601f830112613b6457613b63613a37565b5b8135613b74848260208601613b0d565b91505092915050565b600080600060608486031215613b9657613b9561347c565b5b6000613ba4868287016134cf565b9350506020613bb586828701613505565b925050604084013567ffffffffffffffff811115613bd657613bd5613481565b5b613be286828701613b4f565b9150509250925092565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c2181613bec565b82525050565b6000602082019050613c3c6000830184613c18565b92915050565b600080fd5b600080fd5b60008083601f840112613c6257613c61613a37565b5b8235905067ffffffffffffffff811115613c7f57613c7e613c42565b5b602083019150836020820283011115613c9b57613c9a613c47565b5b9250929050565b600080600060408486031215613cbb57613cba61347c565b5b6000613cc9868287016134cf565b935050602084013567ffffffffffffffff811115613cea57613ce9613481565b5b613cf686828701613c4c565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b604082016000820151613d44600085018261356d565b506020820151613d57602085018261356d565b50505050565b6000613d698383613d2e565b60408301905092915050565b6000602082019050919050565b6000613d8d82613d02565b613d978185613d0d565b9350613da283613d1e565b8060005b83811015613dd3578151613dba8882613d5d565b9750613dc583613d75565b925050600181019050613da6565b5085935050505092915050565b60006020820190508181036000830152613dfa8184613d82565b905092915050565b613e0b8161357c565b8114613e1657600080fd5b50565b600081359050613e2881613e02565b92915050565b613e3781613598565b8114613e4257600080fd5b50565b600081359050613e5481613e2e565b92915050565b60008060008060808587031215613e7457613e7361347c565b5b6000613e82878288016134cf565b9450506020613e9387828801613e19565b9350506040613ea487828801613e45565b9250506060613eb587828801613505565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613efb826134e4565b9150613f06836134e4565b9250828201905080821115613f1e57613f1d613ec1565b5b92915050565b6000602082019050613f3960008301846138f6565b92915050565b600082825260208201905092915050565b7f4f6e6c7920636f6e7472616374206f72646572732063616e2063616c6c000000600082015250565b6000613f86601d83613f3f565b9150613f9182613f50565b602082019050919050565b60006020820190508181036000830152613fb581613f79565b9050919050565b7f6572723a206d697373696e67205f736561726368546f6b656e00000000000000600082015250565b6000613ff2601983613f3f565b9150613ffd82613fbc565b602082019050919050565b6000602082019050818103600083015261402181613fe5565b9050919050565b7f6572723a20746f6b656e732061726520657175616c0000000000000000000000600082015250565b600061405e601583613f3f565b915061406982614028565b602082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b600061409f826134e4565b9150600082036140b2576140b1613ec1565b5b600182039050919050565b7f4f6e6c79206f776e65722063616e2063616c6c20746869730000000000000000600082015250565b60006140f3601883613f3f565b91506140fe826140bd565b602082019050919050565b60006020820190508181036000830152614122816140e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614163826134e4565b915061416e836134e4565b92508261417e5761417d614129565b5b828204905092915050565b6000614194826134e4565b915061419f836134e4565b92508282039050818111156141b7576141b6613ec1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141f7826134e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361422957614228613ec1565b5b600182019050919050565b60008160011c9050919050565b6000808291508390505b600185111561428b5780860481111561426757614266613ec1565b5b60018516156142765780820291505b808102905061428485614234565b945061424b565b94509492505050565b6000826142a45760019050614360565b816142b25760009050614360565b81600181146142c857600281146142d257614301565b6001915050614360565b60ff8411156142e4576142e3613ec1565b5b8360020a9150848211156142fb576142fa613ec1565b5b50614360565b5060208310610133831016604e8410600b84101617156143365782820a90508381111561433157614330613ec1565b5b614360565b6143438484846001614241565b9250905081840481111561435a57614359613ec1565b5b81810290505b9392505050565b6000614372826134e4565b915061437d8361357c565b92506143aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614294565b905092915050565b60006143bd826134e4565b91506143c8836134e4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561440157614400613ec1565b5b828202905092915050565b60008151905061441b816134ee565b92915050565b6000602082840312156144375761443661347c565b5b60006144458482850161440c565b91505092915050565b6000606082019050614463600083018661392e565b614470602083018561392e565b61447d60408301846138f6565b949350505050565b60008115159050919050565b61449a81614485565b81146144a557600080fd5b50565b6000815190506144b781614491565b92915050565b6000602082840312156144d3576144d261347c565b5b60006144e1848285016144a8565b91505092915050565b7f6572723a207a65726f2061646472657373000000000000000000000000000000600082015250565b6000614520601183613f3f565b915061452b826144ea565b602082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f6572723a20746f6b656e20657869737473000000000000000000000000000000600082015250565b600061458c601183613f3f565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b600067ffffffffffffffff8211156145dd576145dc613a52565b5b6145e682613a41565b9050602081019050919050565b60005b838110156146115780820151818401526020810190506145f6565b60008484015250505050565b600061463061462b846145c2565b613ab2565b90508281526020810184848401111561464c5761464b613a3c565b5b6146578482856145f3565b509392505050565b600082601f83011261467457614673613a37565b5b815161468484826020860161461d565b91505092915050565b6000602082840312156146a3576146a261347c565b5b600082015167ffffffffffffffff8111156146c1576146c0613481565b5b6146cd8482850161465f565b91505092915050565b6000815190506146e581613e02565b92915050565b6000602082840312156147015761470061347c565b5b600061470f848285016146d6565b91505092915050565b600060408201905061472d600083018561392e565b61473a60208301846138f6565b939250505056fea2646970667358221220db8dcb5e1a741e8bb5423ca56378fe2f63d06f666f7c6a4180cf903ac71489e164736f6c63430008100033