Contract Address Details

0x7Cb0E2e944069D6d70A6f470154C4EEF3eB67530

Contract Name
MiniChefV2
Creator
0x1a1625–728789 at 0x20aece–176c96
Balance
0 Ether
Tokens
Fetching tokens...
Transactions
2,663 Transactions
Transfers
2,799 Transfers
Gas Used
395,128,530
Last Balance Update
2986381
Contract name:
MiniChefV2




Optimization enabled
false
Compiler version
v0.6.12+commit.27d51765




Verified at
2022-05-16T22:13:39.490746Z

Constructor Arguments

000000000000000000000000a0cb58e7f783fce0f4042c790ea3045c48cd51e8

Arg [0] (address) : 0xa0cb58e7f783fce0f4042c790ea3045c48cd51e8

              

contracts/MiniChefV2.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./libraries/BoringMath.sol";
import "./libraries/BoringBatchable.sol";
import "./libraries/BoringOwnable.sol";
import "./libraries/SignedSafeMath.sol";
import "./interfaces/IRewarder.sol";
import "./interfaces/IMasterChef.sol";

interface IMigratorChef {
    // Take the current LP token address and return the new LP token address.
    // Migrator should have full access to the caller's LP token.
    function migrate(IERC20 token) external returns (IERC20);
}

/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.
/// It is the only address with minting rights for SUSHI.
/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token
/// that is deposited into the MasterChef V1 (MCV1) contract.
/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.
contract MiniChefV2 is BoringOwnable, BoringBatchable {
    using BoringMath for uint256;
    using BoringMath128 for uint128;
    using BoringERC20 for IERC20;
    using SignedSafeMath for int256;

    /// @notice Info of each MCV2 user.
    /// `amount` LP token amount the user has provided.
    /// `rewardDebt` The amount of SUSHI entitled to the user.
    struct UserInfo {
        uint256 amount;
        int256 rewardDebt;
    }

    /// @notice Info of each MCV2 pool.
    /// `allocPoint` The amount of allocation points assigned to the pool.
    /// Also known as the amount of SUSHI to distribute per block.
    struct PoolInfo {
        uint128 accSushiPerShare;
        uint64 lastRewardTime;
        uint64 allocPoint;
    }

    /// @notice Address of SUSHI contract.
    IERC20 public immutable SUSHI;
    // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).
    IMigratorChef public migrator;

    /// @notice Info of each MCV2 pool.
    PoolInfo[] public poolInfo;
    /// @notice Address of the LP token for each MCV2 pool.
    IERC20[] public lpToken;
    /// @notice Address of each `IRewarder` contract in MCV2.
    IRewarder[] public rewarder;

    /// @notice Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;

    /// @dev Tokens added
    mapping (address => bool) public addedTokens;

    /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint;

    uint256 public sushiPerSecond;
    uint256 private constant ACC_SUSHI_PRECISION = 1e12;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
    event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
    event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
    event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare);
    event LogSushiPerSecond(uint256 sushiPerSecond);

    /// @param _sushi The SUSHI token contract address.
    constructor(IERC20 _sushi) public {
        SUSHI = _sushi;
    }

    /// @notice Returns the number of MCV2 pools.
    function poolLength() public view returns (uint256 pools) {
        pools = poolInfo.length;
    }

    /// @notice Add a new LP to the pool. Can only be called by the owner.
    /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    /// @param allocPoint AP of the new pool.
    /// @param _lpToken Address of the LP ERC-20 token.
    /// @param _rewarder Address of the rewarder delegate.
    function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
        require(addedTokens[address(_lpToken)] == false, "Token already added");
        totalAllocPoint = totalAllocPoint.add(allocPoint);
        lpToken.push(_lpToken);
        rewarder.push(_rewarder);

        poolInfo.push(PoolInfo({
            allocPoint: allocPoint.to64(),
            lastRewardTime: block.timestamp.to64(),
            accSushiPerShare: 0
        }));
        addedTokens[address(_lpToken)] = true;
        emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
    }

    /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _allocPoint New AP of the pool.
    /// @param _rewarder Address of the rewarder delegate.
    /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
    function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint.to64();
        if (overwrite) { rewarder[_pid] = _rewarder; }
        emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
    }

    /// @notice Sets the sushi per second to be distributed. Can only be called by the owner.
    /// @param _sushiPerSecond The amount of Sushi to be distributed per second.
    function setSushiPerSecond(uint256 _sushiPerSecond) public onlyOwner {
        sushiPerSecond = _sushiPerSecond;
        emit LogSushiPerSecond(_sushiPerSecond);
    }

    /// @notice Set the `migrator` contract. Can only be called by the owner.
    /// @param _migrator The contract address to set.
    function setMigrator(IMigratorChef _migrator) public onlyOwner {
        migrator = _migrator;
    }

    /// @notice Migrate LP token to another LP contract through the `migrator` contract.
    /// @param _pid The index of the pool. See `poolInfo`.
    function migrate(uint256 _pid) public {
        require(address(migrator) != address(0), "MasterChefV2: no migrator set");
        IERC20 _lpToken = lpToken[_pid];
        uint256 bal = _lpToken.balanceOf(address(this));
        _lpToken.approve(address(migrator), bal);
        IERC20 newLpToken = migrator.migrate(_lpToken);
        require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match");
        require(addedTokens[address(newLpToken)] == false, "Token already added");
        addedTokens[address(newLpToken)] = true;
        addedTokens[address(_lpToken)] = false;
        lpToken[_pid] = newLpToken;
    }

    /// @notice View function to see pending SUSHI on frontend.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _user Address of user.
    /// @return pending SUSHI reward for a given user.
    function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accSushiPerShare = pool.accSushiPerShare;
        uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
            uint256 time = block.timestamp.sub(pool.lastRewardTime);
            uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
            accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);
        }
        pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();
    }

    /// @notice Update reward variables for all pools. Be careful of gas spending!
    /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
    function massUpdatePools(uint256[] calldata pids) external {
        uint256 len = pids.length;
        for (uint256 i = 0; i < len; ++i) {
            updatePool(pids[i]);
        }
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        if (block.timestamp > pool.lastRewardTime) {
            uint256 lpSupply = lpToken[pid].balanceOf(address(this));
            if (lpSupply > 0) {
                uint256 time = block.timestamp.sub(pool.lastRewardTime);
                uint256 sushiReward = time.mul(sushiPerSecond).mul(pool.allocPoint) / totalAllocPoint;
                pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());
            }
            pool.lastRewardTime = block.timestamp.to64();
            poolInfo[pid] = pool;
            emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare);
        }
    }

    /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to deposit.
    /// @param to The receiver of `amount` deposit benefit.
    function deposit(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][to];

        // Effects
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));

        // Interactions
        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSushiReward(pid, to, to, 0, user.amount);
        }

        lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);

        emit Deposit(msg.sender, pid, amount, to);
    }

    /// @notice Withdraw LP tokens from MCV2.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens.
    function withdraw(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];

        // Effects
        user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
        user.amount = user.amount.sub(amount);

        // Interactions
        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);
        }

        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
    }

    /// @notice Harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of SUSHI rewards.
    function harvest(uint256 pid, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
        uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();

        // Effects
        user.rewardDebt = accumulatedSushi;

        // Interactions
        if (_pendingSushi != 0) {
            SUSHI.safeTransfer(to, _pendingSushi);
        }

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);
        }

        emit Harvest(msg.sender, pid, _pendingSushi);
    }

    /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens and SUSHI rewards.
    function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);
        uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();

        // Effects
        user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));
        user.amount = user.amount.sub(amount);

        // Interactions
        SUSHI.safeTransfer(to, _pendingSushi);

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);
        }

        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
        emit Harvest(msg.sender, pid, _pendingSushi);
    }

    /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the LP tokens.
    function emergencyWithdraw(uint256 pid, address to) public {
        UserInfo storage user = userInfo[pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);
        }

        // Note: transfer can fail or succeed if `amount` is zero.
        lpToken[pid].safeTransfer(to, amount);
        emit EmergencyWithdraw(msg.sender, pid, amount, to);
    }
}
        

contracts/interfaces/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // EIP 2612
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
}
          

contracts/interfaces/IMasterChef.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "../libraries/BoringERC20.sol";

interface IMasterChef {
    using BoringERC20 for IERC20;
    struct UserInfo {
        uint256 amount;     // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
    }

    struct PoolInfo {
        IERC20 lpToken;           // Address of LP token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool. SUSHI to distribute per block.
        uint256 lastRewardBlock;  // Last block number that SUSHI distribution occurs.
        uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.
    }

    function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);
    function totalAllocPoint() external view returns (uint256);
    function deposit(uint256 _pid, uint256 _amount) external;
}
          

contracts/interfaces/IRewarder.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "../libraries/BoringERC20.sol";

interface IRewarder {
    using BoringERC20 for IERC20;
    function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;
    function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory);
}
          

contracts/libraries/BoringBatchable.sol

// SPDX-License-Identifier: MIT

// Audit on 5-Jan-2021 by Keno and BoringCrypto

import "../interfaces/IERC20.sol";

// P1 - P3: OK
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

// solhint-disable avoid-low-level-calls
// T1 - T4: OK
contract BaseBoringBatchable {
    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";

        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }    
    
    // F3 - F9: OK
    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
    // C1 - C21: OK
    // C3: The length of the loop is fully under user control, so can't be exploited
    // C7: Delegatecall is only used on the same contract, so it's safe
    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {
        // Interactions
        successes = new bool[](calls.length);
        results = new bytes[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            require(success || !revertOnFail, _getRevertMsg(result));
            successes[i] = success;
            results[i] = result;
        }
    }
}

// T1 - T4: OK
contract BoringBatchable is BaseBoringBatchable {
    // F1 - F9: OK
    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
    //     if part of a batch this could be used to grief once as the second call would not need the permit
    // C1 - C21: OK
    function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
        // Interactions
        // X1 - X5
        token.permit(from, to, amount, deadline, v, r, s);
    }
}
          

contracts/libraries/BoringERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "../interfaces/IERC20.sol";

library BoringERC20 {
    function safeSymbol(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeName(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}
          

contracts/libraries/BoringMath.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
library BoringMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");}
    function to128(uint256 a) internal pure returns (uint128 c) {
        require(a <= uint128(-1), "BoringMath: uint128 Overflow");
        c = uint128(a);
    }
    function to64(uint256 a) internal pure returns (uint64 c) {
        require(a <= uint64(-1), "BoringMath: uint64 Overflow");
        c = uint64(a);
    }
    function to32(uint256 a) internal pure returns (uint32 c) {
        require(a <= uint32(-1), "BoringMath: uint32 Overflow");
        c = uint32(a);
    }
}

library BoringMath128 {
    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}

library BoringMath64 {
    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}

library BoringMath32 {
    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
          

contracts/libraries/BoringOwnable.sol

// SPDX-License-Identifier: MIT

// Audit on 5-Jan-2021 by Keno and BoringCrypto

// P1 - P3: OK
pragma solidity 0.6.12;

// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

// T1 - T4: OK
contract BoringOwnableData {
    // V1 - V5: OK
    address public owner;
    // V1 - V5: OK
    address public pendingOwner;
}

// T1 - T4: OK
contract BoringOwnable is BoringOwnableData {
    // E1: OK
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () public {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;
        
        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    // M1 - M5: OK
    // C1 - C21: OK
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}
          

contracts/libraries/SignedSafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }

    function toUInt256(int256 a) internal pure returns (uint256) {
        require(a >= 0, "Integer < 0");
        return uint256(a);
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_sushi","internalType":"contract IERC20"}]},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"EmergencyWithdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Harvest","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogPoolAddition","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"lpToken","internalType":"contract IERC20","indexed":true},{"type":"address","name":"rewarder","internalType":"contract IRewarder","indexed":true}],"anonymous":false},{"type":"event","name":"LogSetPool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"rewarder","internalType":"contract IRewarder","indexed":true},{"type":"bool","name":"overwrite","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"LogSushiPerSecond","inputs":[{"type":"uint256","name":"sushiPerSecond","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogUpdatePool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint64","name":"lastRewardTime","internalType":"uint64","indexed":false},{"type":"uint256","name":"lpSupply","internalType":"uint256","indexed":false},{"type":"uint256","name":"accSushiPerShare","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"SUSHI","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add","inputs":[{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IERC20"},{"type":"address","name":"_rewarder","internalType":"contract IRewarder"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"addedTokens","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bool[]","name":"successes","internalType":"bool[]"},{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"batch","inputs":[{"type":"bytes[]","name":"calls","internalType":"bytes[]"},{"type":"bool","name":"revertOnFail","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"lpToken","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[{"type":"uint256[]","name":"pids","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMigratorChef"}],"name":"migrator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pending","internalType":"uint256"}],"name":"pendingSushi","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permitToken","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint128","name":"accSushiPerShare","internalType":"uint128"},{"type":"uint64","name":"lastRewardTime","internalType":"uint64"},{"type":"uint64","name":"allocPoint","internalType":"uint64"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pools","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRewarder"}],"name":"rewarder","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_rewarder","internalType":"contract IRewarder"},{"type":"bool","name":"overwrite","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMigrator","inputs":[{"type":"address","name":"_migrator","internalType":"contract IMigratorChef"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSushiPerSecond","inputs":[{"type":"uint256","name":"_sushiPerSecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sushiPerSecond","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"},{"type":"bool","name":"direct","internalType":"bool"},{"type":"bool","name":"renounce","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"tuple","name":"pool","internalType":"struct MiniChefV2.PoolInfo","components":[{"type":"uint128","name":"accSushiPerShare","internalType":"uint128"},{"type":"uint64","name":"lastRewardTime","internalType":"uint64"},{"type":"uint64","name":"allocPoint","internalType":"uint64"}]}],"name":"updatePool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"int256","name":"rewardDebt","internalType":"int256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAndHarvest","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]}]
            

Contract Creation Code

0x60a06040523480156200001157600080fd5b50604051620050f9380380620050f9833981810160405281019062000037919062000127565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050620001b5565b60008151905062000121816200019b565b92915050565b6000602082840312156200013a57600080fd5b60006200014a8482850162000110565b91505092915050565b600062000160826200017b565b9050919050565b6000620001748262000153565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001a68162000167565b8114620001b257600080fd5b50565b60805160601c614f1c620001dd60003980610d5252806126b55280612c485250614f1c6000f3fe6080604052600436106101c25760003560e01c806379d12ffb116100f75780639baf58c311610095578063c346253d11610064578063c346253d1461063d578063d1abb9071461067a578063d2423b51146106a3578063e30c3978146106d4576101c2565b80639baf58c314610595578063a06e408b146105be578063ab560e10146105e9578063ab7de09814610614576101c2565b806388bba42f116100d157806388bba42f146104da5780638da5cb5b146105035780638dbdbe6d1461052e57806393f1a40b14610557576101c2565b806379d12ffb146104495780637c516e94146104865780637cd07e47146104af576101c2565b806323cf3118116101645780634e71e0c81161013e5780634e71e0c81461038f57806351eb05a6146103a657806357a5b58c146103e357806378ed5d1f1461040c576101c2565b806323cf3118146103145780632f940c701461033d578063454b060814610366576101c2565b80631526fe27116101a05780631526fe271461024457806317caf6f11461028357806318fccc76146102ae578063195426ec146102d7576101c2565b8063078dfbe7146101c7578063081e3eda146101f05780630ad58d2f1461021b575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061395d565b6106ff565b005b3480156101fc57600080fd5b50610205610953565b60405161021291906148f1565b60405180910390f35b34801561022757600080fd5b50610242600480360381019061023d9190613c94565b610960565b005b34801561025057600080fd5b5061026b60048036038101906102669190613bb7565b610bf4565b60405161027a939291906148ba565b60405180910390f35b34801561028f57600080fd5b50610298610c6b565b6040516102a591906148f1565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613c09565b610c71565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613c09565b610ed7565b60405161030b91906148f1565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613b4d565b6111f9565b005b34801561034957600080fd5b50610364600480360381019061035f9190613c09565b6112cb565b005b34801561037257600080fd5b5061038d60048036038101906103889190613bb7565b6114f0565b005b34801561039b57600080fd5b506103a4611a15565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190613bb7565b611ba9565b6040516103da919061489f565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613a04565b611f7d565b005b34801561041857600080fd5b50610433600480360381019061042e9190613bb7565b611fbd565b604051610440919061462c565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613934565b611ff9565b60405161047d9190614611565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613a9b565b612019565b005b3480156104bb57600080fd5b506104c461209a565b6040516104d19190614647565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613ce3565b6120c0565b005b34801561050f57600080fd5b506105186122f3565b60405161052591906144f0565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613c94565b612317565b005b34801561056357600080fd5b5061057e60048036038101906105799190613c09565b6125ad565b60405161058c929190614a81565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613bb7565b6125de565b005b3480156105ca57600080fd5b506105d36126ad565b6040516105e091906148f1565b60405180910390f35b3480156105f557600080fd5b506105fe6126b3565b60405161060b919061462c565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613c45565b6126d7565b005b34801561064957600080fd5b50610664600480360381019061065f9190613bb7565b612acc565b6040516106719190614662565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613c94565b612b08565b005b6106bd60048036038101906106b891906139ac565b612e95565b6040516106cb9291906145da565b60405180910390f35b3480156106e057600080fd5b506106e9613073565b6040516106f691906144f0565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461078d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107849061479f565b60405180910390fd5b811561090c57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806107cc5750805b61080b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108029061471f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094e565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b6000600380549050905090565b61096861371e565b61097184611ba9565b905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610a1464e8d4a510006109f984600001516fffffffffffffffffffffffffffffffff168761309990919063ffffffff16565b81610a0057fe5b0482600101546130fb90919063ffffffff16565b8160010181905550610a3384826000015461317390919063ffffffff16565b8160000181905550600060058681548110610a4a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b24578073ffffffffffffffffffffffffffffffffffffffff16638bf63742873387600087600001546040518663ffffffff1660e01b8152600401610af195949392919061495f565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b505050505b610b86848660048981548110610b3657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec213288604051610be491906148f1565b60405180910390a4505050505050565b60038181548110610c0157fe5b906000526020600020016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b60085481565b610c7961371e565b610c8283611ba9565b905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a51000610d0d84600001516fffffffffffffffffffffffffffffffff16846000015461309990919063ffffffff16565b81610d1457fe5b0490506000610d38610d338460010154846130fb90919063ffffffff16565b6132fa565b905081836001018190555060008114610d9757610d9685827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b5b600060058781548110610da657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7f578073ffffffffffffffffffffffffffffffffffffffff16638bf637428833898689600001546040518663ffffffff1660e01b8152600401610e4c9594939291906149b2565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b505050505b863373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610ec691906148f1565b60405180910390a350505050505050565b6000610ee161371e565b60038481548110610eee57fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001516fffffffffffffffffffffffffffffffff16905060006004878154811061103157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161109491906144f0565b60206040518083038186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190613be0565b9050836020015167ffffffffffffffff1642118015611104575060008114155b156111aa57600061112c856020015167ffffffffffffffff164261317390919063ffffffff16565b90506000600854611168876040015167ffffffffffffffff1661115a6009548661309990919063ffffffff16565b61309990919063ffffffff16565b8161116f57fe5b0490506111a58361118e64e8d4a510008461309990919063ffffffff16565b8161119557fe5b048561334790919063ffffffff16565b935050505b6111ed6111e8846001015464e8d4a510006111d286886000015461309990919063ffffffff16565b816111d957fe5b046130fb90919063ffffffff16565b6132fa565b94505050505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061479f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555060006005858154811061134b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611421578073ffffffffffffffffffffffffffffffffffffffff16638bf637428633876000806040518663ffffffff1660e01b81526004016113ee95949392919061490c565b600060405180830381600087803b15801561140857600080fd5b505af115801561141c573d6000803e3d6000fd5b505050505b61148384836004888154811061143357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b856040516114e191906148f1565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061481f565b60405180910390fd5b60006004828154811061159157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115f991906144f0565b60206040518083038186803b15801561161157600080fd5b505afa158015611625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116499190613be0565b90508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016116a89291906145b1565b602060405180830381600087803b1580156116c257600080fd5b505af11580156116d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fa9190613a49565b506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401611758919061462c565b602060405180830381600087803b15801561177257600080fd5b505af1158015611786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117aa9190613a72565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117e591906144f0565b60206040518083038186803b1580156117fd57600080fd5b505afa158015611811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118359190613be0565b8214611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d9061473f565b60405180910390fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611900906147df565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600485815481106119c757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa1906147bf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611bb161371e565b60038281548110611bbe57fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806020015167ffffffffffffffff16421115611f7857600060048381548110611ca857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d0b91906144f0565b60206040518083038186803b158015611d2357600080fd5b505afa158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5b9190613be0565b90506000811115611e52576000611d89836020015167ffffffffffffffff164261317390919063ffffffff16565b90506000600854611dc5856040015167ffffffffffffffff16611db76009548661309990919063ffffffff16565b61309990919063ffffffff16565b81611dcc57fe5b049050611e20611dfb84611dee64e8d4a510008561309990919063ffffffff16565b81611df557fe5b04613397565b85600001516fffffffffffffffffffffffffffffffff1661341690919063ffffffff16565b84600001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505050505b611e5b4261348a565b826020019067ffffffffffffffff16908167ffffffffffffffff16815250508160038481548110611e8857fe5b9060005260206000200160008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050827f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad3538360200151838560000151604051611f6e93929190614aaa565b60405180910390a2505b919050565b600082829050905060005b81811015611fb757611fab848483818110611f9f57fe5b90506020020135611ba9565b50806001019050611f88565b50505050565b60048181548110611fca57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b8773ffffffffffffffffffffffffffffffffffffffff1663d505accf888888888888886040518863ffffffff1660e01b815260040161205e9796959493929190614542565b600060405180830381600087803b15801561207857600080fd5b505af115801561208c573d6000803e3d6000fd5b505050505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121459061479f565b60405180910390fd5b6121ad8361219f6003878154811061216257fe5b9060005260206000200160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1660085461317390919063ffffffff16565b61334790919063ffffffff16565b6008819055506121bc8361348a565b600385815481106121c957fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550801561225957816005858154811061221057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8061229b576005848154811061226b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661229d565b815b73ffffffffffffffffffffffffffffffffffffffff16847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516122e5929190614a58565b60405180910390a350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61231f61371e565b61232884611ba9565b905060006006600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061239584826000015461334790919063ffffffff16565b81600001819055506123ea64e8d4a510006123cf84600001516fffffffffffffffffffffffffffffffff168761309990919063ffffffff16565b816123d657fe5b04826001015461350190919063ffffffff16565b816001018190555060006005868154811061240157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124db578073ffffffffffffffffffffffffffffffffffffffff16638bf63742878687600087600001546040518663ffffffff1660e01b81526004016124a8959493929190614a05565b600060405180830381600087803b1580156124c257600080fd5b505af11580156124d6573d6000803e3d6000fd5b505050505b61253f33308760048a815481106124ee57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613579909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478860405161259d91906148f1565b60405180910390a4505050505050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126639061479f565b60405180910390fd5b806009819055507fc6ce5eff3291fb2c1517b943daa5067ea76c83816bbf674307fbc7fea3b311d0816040516126a291906148f1565b60405180910390a150565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c9061479f565b60405180910390fd5b60001515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef906147df565b60405180910390fd5b61280d8360085461334790919063ffffffff16565b6008819055506004829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003604051806060016040528060006fffffffffffffffffffffffffffffffff1681526020016129084261348a565b67ffffffffffffffff1681526020016129208661348a565b67ffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16612a90600160048054905061317390919063ffffffff16565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e586604051612abf91906148f1565b60405180910390a4505050565b60058181548110612ad957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b1061371e565b612b1984611ba9565b905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a51000612ba484600001516fffffffffffffffffffffffffffffffff16846000015461309990919063ffffffff16565b81612bab57fe5b0490506000612bcf612bca8460010154846130fb90919063ffffffff16565b6132fa565b9050612c1a64e8d4a51000612c0386600001516fffffffffffffffffffffffffffffffff168961309990919063ffffffff16565b81612c0a57fe5b04836130fb90919063ffffffff16565b8360010181905550612c3986846000015461317390919063ffffffff16565b8360000181905550612c8c85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b600060058881548110612c9b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d74578073ffffffffffffffffffffffffffffffffffffffff16638bf637428933898689600001546040518663ffffffff1660e01b8152600401612d419594939291906149b2565b600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050505b612dd6868860048b81548110612d8657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051612e3491906148f1565b60405180910390a4873373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051612e8391906148f1565b60405180910390a35050505050505050565b6060808484905067ffffffffffffffff81118015612eb257600080fd5b50604051908082528060200260200182016040528015612ee15781602001602082028036833780820191505090505b5091508484905067ffffffffffffffff81118015612efe57600080fd5b50604051908082528060200260200182016040528015612f3257816020015b6060815260200190600190039081612f1d5790505b50905060005b8585905081101561306a57600060603073ffffffffffffffffffffffffffffffffffffffff16888885818110612f6a57fe5b9050602002810190612f7c9190614ae1565b604051612f8a9291906144c0565b600060405180830381855af49150503d8060008114612fc5576040519150601f19603f3d011682016040523d82523d6000602084013e612fca565b606091505b50915091508180612fd9575085155b612fe2826136b3565b90613023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301a919061467d565b60405180910390fd5b508185848151811061303157fe5b6020026020010190151590811515815250508084848151811061305057fe5b602002602001018190525050508080600101915050612f38565b50935093915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808214806130b657508282838502925082816130b357fe5b04145b6130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec9061487f565b60405180910390fd5b92915050565b6000808284039050600083121580156131145750838113155b8061312a575060008312801561312957508381135b5b613169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131609061483f565b60405180910390fd5b8091505092915050565b60008282840391508111156131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b49061469f565b60405180910390fd5b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016131f69291906145b1565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161324491906144d9565b6000604051808303816000865af19150503d8060008114613281576040519150601f19603f3d011682016040523d82523d6000602084013e613286565b606091505b50915091508180156132b457506000815114806132b35750808060200190518101906132b29190613a49565b5b5b6132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea906146df565b60405180910390fd5b5050505050565b60008082121561333f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613336906146bf565b60405180910390fd5b819050919050565b6000818284019150811015613391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133889061477f565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff1682111561340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134059061475f565b60405180910390fd5b819050919050565b6000816fffffffffffffffffffffffffffffffff168284019150816fffffffffffffffffffffffffffffffff161015613484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347b9061477f565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168211156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f0906147ff565b60405180910390fd5b819050919050565b60008082840190506000831215801561351a5750838112155b80613530575060008312801561352f57508381125b5b61356f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613566906146ff565b60405180910390fd5b8091505092915050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016135ae9392919061450b565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516135fc91906144d9565b6000604051808303816000865af19150503d8060008114613639576040519150601f19603f3d011682016040523d82523d6000602084013e61363e565b606091505b509150915081801561366c575060008151148061366b57508080602001905181019061366a9190613a49565b5b5b6136ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a29061485f565b60405180910390fd5b505050505050565b60606044825110156136fc576040518060400160405280601d81526020017f5472616e73616374696f6e2072657665727465642073696c656e746c790000008152509050613719565b600482019150818060200190518101906137169190613b76565b90505b919050565b604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b60008135905061377481614e2e565b92915050565b60008083601f84011261378c57600080fd5b8235905067ffffffffffffffff8111156137a557600080fd5b6020830191508360208202830111156137bd57600080fd5b9250929050565b60008083601f8401126137d657600080fd5b8235905067ffffffffffffffff8111156137ef57600080fd5b60208301915083602082028301111561380757600080fd5b9250929050565b60008135905061381d81614e45565b92915050565b60008151905061383281614e45565b92915050565b60008135905061384781614e5c565b92915050565b60008135905061385c81614e73565b92915050565b60008151905061387181614e73565b92915050565b60008135905061388681614e8a565b92915050565b60008135905061389b81614ea1565b92915050565b600082601f8301126138b257600080fd5b81516138c56138c082614b65565b614b38565b915080825260208301602083018583830111156138e157600080fd5b6138ec838284614dea565b50505092915050565b60008135905061390481614eb8565b92915050565b60008151905061391981614eb8565b92915050565b60008135905061392e81614ecf565b92915050565b60006020828403121561394657600080fd5b600061395484828501613765565b91505092915050565b60008060006060848603121561397257600080fd5b600061398086828701613765565b93505060206139918682870161380e565b92505060406139a28682870161380e565b9150509250925092565b6000806000604084860312156139c157600080fd5b600084013567ffffffffffffffff8111156139db57600080fd5b6139e78682870161377a565b935093505060206139fa8682870161380e565b9150509250925092565b60008060208385031215613a1757600080fd5b600083013567ffffffffffffffff811115613a3157600080fd5b613a3d858286016137c4565b92509250509250929050565b600060208284031215613a5b57600080fd5b6000613a6984828501613823565b91505092915050565b600060208284031215613a8457600080fd5b6000613a9284828501613862565b91505092915050565b600080600080600080600080610100898b031215613ab857600080fd5b6000613ac68b828c0161384d565b9850506020613ad78b828c01613765565b9750506040613ae88b828c01613765565b9650506060613af98b828c016138f5565b9550506080613b0a8b828c016138f5565b94505060a0613b1b8b828c0161391f565b93505060c0613b2c8b828c01613838565b92505060e0613b3d8b828c01613838565b9150509295985092959890939650565b600060208284031215613b5f57600080fd5b6000613b6d84828501613877565b91505092915050565b600060208284031215613b8857600080fd5b600082015167ffffffffffffffff811115613ba257600080fd5b613bae848285016138a1565b91505092915050565b600060208284031215613bc957600080fd5b6000613bd7848285016138f5565b91505092915050565b600060208284031215613bf257600080fd5b6000613c008482850161390a565b91505092915050565b60008060408385031215613c1c57600080fd5b6000613c2a858286016138f5565b9250506020613c3b85828601613765565b9150509250929050565b600080600060608486031215613c5a57600080fd5b6000613c68868287016138f5565b9350506020613c798682870161384d565b9250506040613c8a8682870161388c565b9150509250925092565b600080600060608486031215613ca957600080fd5b6000613cb7868287016138f5565b9350506020613cc8868287016138f5565b9250506040613cd986828701613765565b9150509250925092565b60008060008060808587031215613cf957600080fd5b6000613d07878288016138f5565b9450506020613d18878288016138f5565b9350506040613d298782880161388c565b9250506060613d3a8782880161380e565b91505092959194509250565b6000613d528383613e63565b60208301905092915050565b6000613d6a8383613eb5565b905092915050565b613d7b81614d15565b82525050565b613d8a81614c46565b82525050565b6000613d9b82614bb1565b613da58185614bf7565b9350613db083614b91565b8060005b83811015613de1578151613dc88882613d46565b9750613dd383614bdd565b925050600181019050613db4565b5085935050505092915050565b6000613df982614bbc565b613e038185614c08565b935083602082028501613e1585614ba1565b8060005b85811015613e515784840389528151613e328582613d5e565b9450613e3d83614bea565b925060208a01995050600181019050613e19565b50829750879550505050505092915050565b613e6c81614c58565b82525050565b613e7b81614c58565b82525050565b613e8a81614c64565b82525050565b6000613e9c8385614c2a565b9350613ea9838584614ddb565b82840190509392505050565b6000613ec082614bc7565b613eca8185614c19565b9350613eda818560208601614dea565b613ee381614e1d565b840191505092915050565b6000613ef982614bc7565b613f038185614c2a565b9350613f13818560208601614dea565b80840191505092915050565b613f2881614d27565b82525050565b613f3781614d4b565b82525050565b613f4681614d6f565b82525050565b613f5581614ca4565b82525050565b613f6481614d93565b82525050565b6000613f7582614bd2565b613f7f8185614c35565b9350613f8f818560208601614dea565b613f9881614e1d565b840191505092915050565b6000613fb0601583614c35565b91507f426f72696e674d6174683a20556e646572666c6f7700000000000000000000006000830152602082019050919050565b6000613ff0600b83614c35565b91507f496e7465676572203c20300000000000000000000000000000000000000000006000830152602082019050919050565b6000614030601c83614c35565b91507f426f72696e6745524332303a205472616e73666572206661696c6564000000006000830152602082019050919050565b6000614070602183614c35565b91507f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140d6601583614c35565b91507f4f776e61626c653a207a65726f206164647265737300000000000000000000006000830152602082019050919050565b6000614116602983614c35565b91507f4d61737465724368656656323a206d696772617465642062616c616e6365206d60008301527f757374206d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b600061417c601c83614c35565b91507f426f72696e674d6174683a2075696e74313238204f766572666c6f77000000006000830152602082019050919050565b60006141bc601883614c35565b91507f426f72696e674d6174683a20416464204f766572666c6f7700000000000000006000830152602082019050919050565b60006141fc602083614c35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061423c602083614c35565b91507f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726000830152602082019050919050565b600061427c601383614c35565b91507f546f6b656e20616c7265616479206164646564000000000000000000000000006000830152602082019050919050565b60006142bc601b83614c35565b91507f426f72696e674d6174683a2075696e743634204f766572666c6f7700000000006000830152602082019050919050565b60006142fc601d83614c35565b91507f4d61737465724368656656323a206e6f206d69677261746f72207365740000006000830152602082019050919050565b600061433c602483614c35565b91507f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260008301527f666c6f77000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a2602083614c35565b91507f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646000830152602082019050919050565b60006143e2601883614c35565b91507f426f72696e674d6174683a204d756c204f766572666c6f7700000000000000006000830152602082019050919050565b60608201600082015161442b6000850182614457565b50602082015161443e6020850182614493565b5060408201516144516040850182614493565b50505050565b61446081614cae565b82525050565b61446f81614cae565b82525050565b61447e81614da5565b82525050565b61448d81614cea565b82525050565b61449c81614cf4565b82525050565b6144ab81614cf4565b82525050565b6144ba81614d08565b82525050565b60006144cd828486613e90565b91508190509392505050565b60006144e58284613eee565b915081905092915050565b60006020820190506145056000830184613d81565b92915050565b60006060820190506145206000830186613d81565b61452d6020830185613d81565b61453a6040830184614484565b949350505050565b600060e082019050614557600083018a613d81565b6145646020830189613d81565b6145716040830188614484565b61457e6060830187614484565b61458b60808301866144b1565b61459860a0830185613e81565b6145a560c0830184613e81565b98975050505050505050565b60006040820190506145c66000830185613d81565b6145d36020830184614484565b9392505050565b600060408201905081810360008301526145f48185613d90565b905081810360208301526146088184613dee565b90509392505050565b60006020820190506146266000830184613e72565b92915050565b60006020820190506146416000830184613f1f565b92915050565b600060208201905061465c6000830184613f2e565b92915050565b60006020820190506146776000830184613f3d565b92915050565b600060208201905081810360008301526146978184613f6a565b905092915050565b600060208201905081810360008301526146b881613fa3565b9050919050565b600060208201905081810360008301526146d881613fe3565b9050919050565b600060208201905081810360008301526146f881614023565b9050919050565b6000602082019050818103600083015261471881614063565b9050919050565b60006020820190508181036000830152614738816140c9565b9050919050565b6000602082019050818103600083015261475881614109565b9050919050565b600060208201905081810360008301526147788161416f565b9050919050565b60006020820190508181036000830152614798816141af565b9050919050565b600060208201905081810360008301526147b8816141ef565b9050919050565b600060208201905081810360008301526147d88161422f565b9050919050565b600060208201905081810360008301526147f88161426f565b9050919050565b60006020820190508181036000830152614818816142af565b9050919050565b60006020820190508181036000830152614838816142ef565b9050919050565b600060208201905081810360008301526148588161432f565b9050919050565b6000602082019050818103600083015261487881614395565b9050919050565b60006020820190508181036000830152614898816143d5565b9050919050565b60006060820190506148b46000830184614415565b92915050565b60006060820190506148cf6000830186614466565b6148dc60208301856144a2565b6148e960408301846144a2565b949350505050565b60006020820190506149066000830184614484565b92915050565b600060a0820190506149216000830188614484565b61492e6020830187613d72565b61493b6040830186613d81565b6149486060830185613f5b565b6149556080830184613f5b565b9695505050505050565b600060a0820190506149746000830188614484565b6149816020830187613d72565b61498e6040830186613d81565b61499b6060830185613f5b565b6149a86080830184614484565b9695505050505050565b600060a0820190506149c76000830188614484565b6149d46020830187613d72565b6149e16040830186613d81565b6149ee6060830185614484565b6149fb6080830184614484565b9695505050505050565b600060a082019050614a1a6000830188614484565b614a276020830187613d81565b614a346040830186613d81565b614a416060830185613f5b565b614a4e6080830184614484565b9695505050505050565b6000604082019050614a6d6000830185614484565b614a7a6020830184613e72565b9392505050565b6000604082019050614a966000830185614484565b614aa36020830184613f4c565b9392505050565b6000606082019050614abf60008301866144a2565b614acc6020830185614484565b614ad96040830184614475565b949350505050565b60008083356001602003843603038112614afa57600080fd5b80840192508235915067ffffffffffffffff821115614b1857600080fd5b602083019250600182023603831315614b3057600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff82111715614b5b57600080fd5b8060405250919050565b600067ffffffffffffffff821115614b7c57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614c5182614cca565b9050919050565b60008115159050919050565b6000819050919050565b6000614c7982614c46565b9050919050565b6000614c8b82614c46565b9050919050565b6000614c9d82614c46565b9050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b6000614d2082614db7565b9050919050565b6000614d3282614d39565b9050919050565b6000614d4482614cca565b9050919050565b6000614d5682614d5d565b9050919050565b6000614d6882614cca565b9050919050565b6000614d7a82614d81565b9050919050565b6000614d8c82614cca565b9050919050565b6000614d9e82614cea565b9050919050565b6000614db082614cae565b9050919050565b6000614dc282614dc9565b9050919050565b6000614dd482614cca565b9050919050565b82818337600083830152505050565b60005b83811015614e08578082015181840152602081019050614ded565b83811115614e17576000848401525b50505050565b6000601f19601f8301169050919050565b614e3781614c46565b8114614e4257600080fd5b50565b614e4e81614c58565b8114614e5957600080fd5b50565b614e6581614c64565b8114614e7057600080fd5b50565b614e7c81614c6e565b8114614e8757600080fd5b50565b614e9381614c80565b8114614e9e57600080fd5b50565b614eaa81614c92565b8114614eb557600080fd5b50565b614ec181614cea565b8114614ecc57600080fd5b50565b614ed881614d08565b8114614ee357600080fd5b5056fea264697066735822122052e774d320511afbd8023f407877a3444e33747ec0f131edf192601df1a708b964736f6c634300060c0033000000000000000000000000a0cb58e7f783fce0f4042c790ea3045c48cd51e8

Deployed ByteCode

0x6080604052600436106101c25760003560e01c806379d12ffb116100f75780639baf58c311610095578063c346253d11610064578063c346253d1461063d578063d1abb9071461067a578063d2423b51146106a3578063e30c3978146106d4576101c2565b80639baf58c314610595578063a06e408b146105be578063ab560e10146105e9578063ab7de09814610614576101c2565b806388bba42f116100d157806388bba42f146104da5780638da5cb5b146105035780638dbdbe6d1461052e57806393f1a40b14610557576101c2565b806379d12ffb146104495780637c516e94146104865780637cd07e47146104af576101c2565b806323cf3118116101645780634e71e0c81161013e5780634e71e0c81461038f57806351eb05a6146103a657806357a5b58c146103e357806378ed5d1f1461040c576101c2565b806323cf3118146103145780632f940c701461033d578063454b060814610366576101c2565b80631526fe27116101a05780631526fe271461024457806317caf6f11461028357806318fccc76146102ae578063195426ec146102d7576101c2565b8063078dfbe7146101c7578063081e3eda146101f05780630ad58d2f1461021b575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061395d565b6106ff565b005b3480156101fc57600080fd5b50610205610953565b60405161021291906148f1565b60405180910390f35b34801561022757600080fd5b50610242600480360381019061023d9190613c94565b610960565b005b34801561025057600080fd5b5061026b60048036038101906102669190613bb7565b610bf4565b60405161027a939291906148ba565b60405180910390f35b34801561028f57600080fd5b50610298610c6b565b6040516102a591906148f1565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613c09565b610c71565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613c09565b610ed7565b60405161030b91906148f1565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613b4d565b6111f9565b005b34801561034957600080fd5b50610364600480360381019061035f9190613c09565b6112cb565b005b34801561037257600080fd5b5061038d60048036038101906103889190613bb7565b6114f0565b005b34801561039b57600080fd5b506103a4611a15565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190613bb7565b611ba9565b6040516103da919061489f565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613a04565b611f7d565b005b34801561041857600080fd5b50610433600480360381019061042e9190613bb7565b611fbd565b604051610440919061462c565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190613934565b611ff9565b60405161047d9190614611565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613a9b565b612019565b005b3480156104bb57600080fd5b506104c461209a565b6040516104d19190614647565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613ce3565b6120c0565b005b34801561050f57600080fd5b506105186122f3565b60405161052591906144f0565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613c94565b612317565b005b34801561056357600080fd5b5061057e60048036038101906105799190613c09565b6125ad565b60405161058c929190614a81565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190613bb7565b6125de565b005b3480156105ca57600080fd5b506105d36126ad565b6040516105e091906148f1565b60405180910390f35b3480156105f557600080fd5b506105fe6126b3565b60405161060b919061462c565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613c45565b6126d7565b005b34801561064957600080fd5b50610664600480360381019061065f9190613bb7565b612acc565b6040516106719190614662565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613c94565b612b08565b005b6106bd60048036038101906106b891906139ac565b612e95565b6040516106cb9291906145da565b60405180910390f35b3480156106e057600080fd5b506106e9613073565b6040516106f691906144f0565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461078d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107849061479f565b60405180910390fd5b811561090c57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806107cc5750805b61080b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108029061471f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094e565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b6000600380549050905090565b61096861371e565b61097184611ba9565b905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610a1464e8d4a510006109f984600001516fffffffffffffffffffffffffffffffff168761309990919063ffffffff16565b81610a0057fe5b0482600101546130fb90919063ffffffff16565b8160010181905550610a3384826000015461317390919063ffffffff16565b8160000181905550600060058681548110610a4a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b24578073ffffffffffffffffffffffffffffffffffffffff16638bf63742873387600087600001546040518663ffffffff1660e01b8152600401610af195949392919061495f565b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b505050505b610b86848660048981548110610b3657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec213288604051610be491906148f1565b60405180910390a4505050505050565b60038181548110610c0157fe5b906000526020600020016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b60085481565b610c7961371e565b610c8283611ba9565b905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a51000610d0d84600001516fffffffffffffffffffffffffffffffff16846000015461309990919063ffffffff16565b81610d1457fe5b0490506000610d38610d338460010154846130fb90919063ffffffff16565b6132fa565b905081836001018190555060008114610d9757610d9685827f000000000000000000000000a0cb58e7f783fce0f4042c790ea3045c48cd51e873ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b5b600060058781548110610da657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e7f578073ffffffffffffffffffffffffffffffffffffffff16638bf637428833898689600001546040518663ffffffff1660e01b8152600401610e4c9594939291906149b2565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b505050505b863373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610ec691906148f1565b60405180910390a350505050505050565b6000610ee161371e565b60038481548110610eee57fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001516fffffffffffffffffffffffffffffffff16905060006004878154811061103157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161109491906144f0565b60206040518083038186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e49190613be0565b9050836020015167ffffffffffffffff1642118015611104575060008114155b156111aa57600061112c856020015167ffffffffffffffff164261317390919063ffffffff16565b90506000600854611168876040015167ffffffffffffffff1661115a6009548661309990919063ffffffff16565b61309990919063ffffffff16565b8161116f57fe5b0490506111a58361118e64e8d4a510008461309990919063ffffffff16565b8161119557fe5b048561334790919063ffffffff16565b935050505b6111ed6111e8846001015464e8d4a510006111d286886000015461309990919063ffffffff16565b816111d957fe5b046130fb90919063ffffffff16565b6132fa565b94505050505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e9061479f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555060006005858154811061134b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611421578073ffffffffffffffffffffffffffffffffffffffff16638bf637428633876000806040518663ffffffff1660e01b81526004016113ee95949392919061490c565b600060405180830381600087803b15801561140857600080fd5b505af115801561141c573d6000803e3d6000fd5b505050505b61148384836004888154811061143357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b856040516114e191906148f1565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061481f565b60405180910390fd5b60006004828154811061159157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115f991906144f0565b60206040518083038186803b15801561161157600080fd5b505afa158015611625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116499190613be0565b90508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016116a89291906145b1565b602060405180830381600087803b1580156116c257600080fd5b505af11580156116d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fa9190613a49565b506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401611758919061462c565b602060405180830381600087803b15801561177257600080fd5b505af1158015611786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117aa9190613a72565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117e591906144f0565b60206040518083038186803b1580156117fd57600080fd5b505afa158015611811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118359190613be0565b8214611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d9061473f565b60405180910390fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611900906147df565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600485815481106119c757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa1906147bf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611bb161371e565b60038281548110611bbe57fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806020015167ffffffffffffffff16421115611f7857600060048381548110611ca857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d0b91906144f0565b60206040518083038186803b158015611d2357600080fd5b505afa158015611d37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5b9190613be0565b90506000811115611e52576000611d89836020015167ffffffffffffffff164261317390919063ffffffff16565b90506000600854611dc5856040015167ffffffffffffffff16611db76009548661309990919063ffffffff16565b61309990919063ffffffff16565b81611dcc57fe5b049050611e20611dfb84611dee64e8d4a510008561309990919063ffffffff16565b81611df557fe5b04613397565b85600001516fffffffffffffffffffffffffffffffff1661341690919063ffffffff16565b84600001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505050505b611e5b4261348a565b826020019067ffffffffffffffff16908167ffffffffffffffff16815250508160038481548110611e8857fe5b9060005260206000200160008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050827f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad3538360200151838560000151604051611f6e93929190614aaa565b60405180910390a2505b919050565b600082829050905060005b81811015611fb757611fab848483818110611f9f57fe5b90506020020135611ba9565b50806001019050611f88565b50505050565b60048181548110611fca57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b8773ffffffffffffffffffffffffffffffffffffffff1663d505accf888888888888886040518863ffffffff1660e01b815260040161205e9796959493929190614542565b600060405180830381600087803b15801561207857600080fd5b505af115801561208c573d6000803e3d6000fd5b505050505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121459061479f565b60405180910390fd5b6121ad8361219f6003878154811061216257fe5b9060005260206000200160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1660085461317390919063ffffffff16565b61334790919063ffffffff16565b6008819055506121bc8361348a565b600385815481106121c957fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550801561225957816005858154811061221057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8061229b576005848154811061226b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661229d565b815b73ffffffffffffffffffffffffffffffffffffffff16847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516122e5929190614a58565b60405180910390a350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61231f61371e565b61232884611ba9565b905060006006600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061239584826000015461334790919063ffffffff16565b81600001819055506123ea64e8d4a510006123cf84600001516fffffffffffffffffffffffffffffffff168761309990919063ffffffff16565b816123d657fe5b04826001015461350190919063ffffffff16565b816001018190555060006005868154811061240157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146124db578073ffffffffffffffffffffffffffffffffffffffff16638bf63742878687600087600001546040518663ffffffff1660e01b81526004016124a8959493929190614a05565b600060405180830381600087803b1580156124c257600080fd5b505af11580156124d6573d6000803e3d6000fd5b505050505b61253f33308760048a815481106124ee57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613579909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478860405161259d91906148f1565b60405180910390a4505050505050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126639061479f565b60405180910390fd5b806009819055507fc6ce5eff3291fb2c1517b943daa5067ea76c83816bbf674307fbc7fea3b311d0816040516126a291906148f1565b60405180910390a150565b60095481565b7f000000000000000000000000a0cb58e7f783fce0f4042c790ea3045c48cd51e881565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c9061479f565b60405180910390fd5b60001515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef906147df565b60405180910390fd5b61280d8360085461334790919063ffffffff16565b6008819055506004829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003604051806060016040528060006fffffffffffffffffffffffffffffffff1681526020016129084261348a565b67ffffffffffffffff1681526020016129208661348a565b67ffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16612a90600160048054905061317390919063ffffffff16565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e586604051612abf91906148f1565b60405180910390a4505050565b60058181548110612ad957fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b1061371e565b612b1984611ba9565b905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a51000612ba484600001516fffffffffffffffffffffffffffffffff16846000015461309990919063ffffffff16565b81612bab57fe5b0490506000612bcf612bca8460010154846130fb90919063ffffffff16565b6132fa565b9050612c1a64e8d4a51000612c0386600001516fffffffffffffffffffffffffffffffff168961309990919063ffffffff16565b81612c0a57fe5b04836130fb90919063ffffffff16565b8360010181905550612c3986846000015461317390919063ffffffff16565b8360000181905550612c8c85827f000000000000000000000000a0cb58e7f783fce0f4042c790ea3045c48cd51e873ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b600060058881548110612c9b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d74578073ffffffffffffffffffffffffffffffffffffffff16638bf637428933898689600001546040518663ffffffff1660e01b8152600401612d419594939291906149b2565b600060405180830381600087803b158015612d5b57600080fd5b505af1158015612d6f573d6000803e3d6000fd5b505050505b612dd6868860048b81548110612d8657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131c39092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051612e3491906148f1565b60405180910390a4873373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051612e8391906148f1565b60405180910390a35050505050505050565b6060808484905067ffffffffffffffff81118015612eb257600080fd5b50604051908082528060200260200182016040528015612ee15781602001602082028036833780820191505090505b5091508484905067ffffffffffffffff81118015612efe57600080fd5b50604051908082528060200260200182016040528015612f3257816020015b6060815260200190600190039081612f1d5790505b50905060005b8585905081101561306a57600060603073ffffffffffffffffffffffffffffffffffffffff16888885818110612f6a57fe5b9050602002810190612f7c9190614ae1565b604051612f8a9291906144c0565b600060405180830381855af49150503d8060008114612fc5576040519150601f19603f3d011682016040523d82523d6000602084013e612fca565b606091505b50915091508180612fd9575085155b612fe2826136b3565b90613023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301a919061467d565b60405180910390fd5b508185848151811061303157fe5b6020026020010190151590811515815250508084848151811061305057fe5b602002602001018190525050508080600101915050612f38565b50935093915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808214806130b657508282838502925082816130b357fe5b04145b6130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec9061487f565b60405180910390fd5b92915050565b6000808284039050600083121580156131145750838113155b8061312a575060008312801561312957508381135b5b613169576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131609061483f565b60405180910390fd5b8091505092915050565b60008282840391508111156131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b49061469f565b60405180910390fd5b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016131f69291906145b1565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161324491906144d9565b6000604051808303816000865af19150503d8060008114613281576040519150601f19603f3d011682016040523d82523d6000602084013e613286565b606091505b50915091508180156132b457506000815114806132b35750808060200190518101906132b29190613a49565b5b5b6132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea906146df565b60405180910390fd5b5050505050565b60008082121561333f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613336906146bf565b60405180910390fd5b819050919050565b6000818284019150811015613391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133889061477f565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff1682111561340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134059061475f565b60405180910390fd5b819050919050565b6000816fffffffffffffffffffffffffffffffff168284019150816fffffffffffffffffffffffffffffffff161015613484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347b9061477f565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff168211156134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f0906147ff565b60405180910390fd5b819050919050565b60008082840190506000831215801561351a5750838112155b80613530575060008312801561352f57508381125b5b61356f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613566906146ff565b60405180910390fd5b8091505092915050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016135ae9392919061450b565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516135fc91906144d9565b6000604051808303816000865af19150503d8060008114613639576040519150601f19603f3d011682016040523d82523d6000602084013e61363e565b606091505b509150915081801561366c575060008151148061366b57508080602001905181019061366a9190613a49565b5b5b6136ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a29061485f565b60405180910390fd5b505050505050565b60606044825110156136fc576040518060400160405280601d81526020017f5472616e73616374696f6e2072657665727465642073696c656e746c790000008152509050613719565b600482019150818060200190518101906137169190613b76565b90505b919050565b604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b60008135905061377481614e2e565b92915050565b60008083601f84011261378c57600080fd5b8235905067ffffffffffffffff8111156137a557600080fd5b6020830191508360208202830111156137bd57600080fd5b9250929050565b60008083601f8401126137d657600080fd5b8235905067ffffffffffffffff8111156137ef57600080fd5b60208301915083602082028301111561380757600080fd5b9250929050565b60008135905061381d81614e45565b92915050565b60008151905061383281614e45565b92915050565b60008135905061384781614e5c565b92915050565b60008135905061385c81614e73565b92915050565b60008151905061387181614e73565b92915050565b60008135905061388681614e8a565b92915050565b60008135905061389b81614ea1565b92915050565b600082601f8301126138b257600080fd5b81516138c56138c082614b65565b614b38565b915080825260208301602083018583830111156138e157600080fd5b6138ec838284614dea565b50505092915050565b60008135905061390481614eb8565b92915050565b60008151905061391981614eb8565b92915050565b60008135905061392e81614ecf565b92915050565b60006020828403121561394657600080fd5b600061395484828501613765565b91505092915050565b60008060006060848603121561397257600080fd5b600061398086828701613765565b93505060206139918682870161380e565b92505060406139a28682870161380e565b9150509250925092565b6000806000604084860312156139c157600080fd5b600084013567ffffffffffffffff8111156139db57600080fd5b6139e78682870161377a565b935093505060206139fa8682870161380e565b9150509250925092565b60008060208385031215613a1757600080fd5b600083013567ffffffffffffffff811115613a3157600080fd5b613a3d858286016137c4565b92509250509250929050565b600060208284031215613a5b57600080fd5b6000613a6984828501613823565b91505092915050565b600060208284031215613a8457600080fd5b6000613a9284828501613862565b91505092915050565b600080600080600080600080610100898b031215613ab857600080fd5b6000613ac68b828c0161384d565b9850506020613ad78b828c01613765565b9750506040613ae88b828c01613765565b9650506060613af98b828c016138f5565b9550506080613b0a8b828c016138f5565b94505060a0613b1b8b828c0161391f565b93505060c0613b2c8b828c01613838565b92505060e0613b3d8b828c01613838565b9150509295985092959890939650565b600060208284031215613b5f57600080fd5b6000613b6d84828501613877565b91505092915050565b600060208284031215613b8857600080fd5b600082015167ffffffffffffffff811115613ba257600080fd5b613bae848285016138a1565b91505092915050565b600060208284031215613bc957600080fd5b6000613bd7848285016138f5565b91505092915050565b600060208284031215613bf257600080fd5b6000613c008482850161390a565b91505092915050565b60008060408385031215613c1c57600080fd5b6000613c2a858286016138f5565b9250506020613c3b85828601613765565b9150509250929050565b600080600060608486031215613c5a57600080fd5b6000613c68868287016138f5565b9350506020613c798682870161384d565b9250506040613c8a8682870161388c565b9150509250925092565b600080600060608486031215613ca957600080fd5b6000613cb7868287016138f5565b9350506020613cc8868287016138f5565b9250506040613cd986828701613765565b9150509250925092565b60008060008060808587031215613cf957600080fd5b6000613d07878288016138f5565b9450506020613d18878288016138f5565b9350506040613d298782880161388c565b9250506060613d3a8782880161380e565b91505092959194509250565b6000613d528383613e63565b60208301905092915050565b6000613d6a8383613eb5565b905092915050565b613d7b81614d15565b82525050565b613d8a81614c46565b82525050565b6000613d9b82614bb1565b613da58185614bf7565b9350613db083614b91565b8060005b83811015613de1578151613dc88882613d46565b9750613dd383614bdd565b925050600181019050613db4565b5085935050505092915050565b6000613df982614bbc565b613e038185614c08565b935083602082028501613e1585614ba1565b8060005b85811015613e515784840389528151613e328582613d5e565b9450613e3d83614bea565b925060208a01995050600181019050613e19565b50829750879550505050505092915050565b613e6c81614c58565b82525050565b613e7b81614c58565b82525050565b613e8a81614c64565b82525050565b6000613e9c8385614c2a565b9350613ea9838584614ddb565b82840190509392505050565b6000613ec082614bc7565b613eca8185614c19565b9350613eda818560208601614dea565b613ee381614e1d565b840191505092915050565b6000613ef982614bc7565b613f038185614c2a565b9350613f13818560208601614dea565b80840191505092915050565b613f2881614d27565b82525050565b613f3781614d4b565b82525050565b613f4681614d6f565b82525050565b613f5581614ca4565b82525050565b613f6481614d93565b82525050565b6000613f7582614bd2565b613f7f8185614c35565b9350613f8f818560208601614dea565b613f9881614e1d565b840191505092915050565b6000613fb0601583614c35565b91507f426f72696e674d6174683a20556e646572666c6f7700000000000000000000006000830152602082019050919050565b6000613ff0600b83614c35565b91507f496e7465676572203c20300000000000000000000000000000000000000000006000830152602082019050919050565b6000614030601c83614c35565b91507f426f72696e6745524332303a205472616e73666572206661696c6564000000006000830152602082019050919050565b6000614070602183614c35565b91507f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140d6601583614c35565b91507f4f776e61626c653a207a65726f206164647265737300000000000000000000006000830152602082019050919050565b6000614116602983614c35565b91507f4d61737465724368656656323a206d696772617465642062616c616e6365206d60008301527f757374206d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b600061417c601c83614c35565b91507f426f72696e674d6174683a2075696e74313238204f766572666c6f77000000006000830152602082019050919050565b60006141bc601883614c35565b91507f426f72696e674d6174683a20416464204f766572666c6f7700000000000000006000830152602082019050919050565b60006141fc602083614c35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061423c602083614c35565b91507f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726000830152602082019050919050565b600061427c601383614c35565b91507f546f6b656e20616c7265616479206164646564000000000000000000000000006000830152602082019050919050565b60006142bc601b83614c35565b91507f426f72696e674d6174683a2075696e743634204f766572666c6f7700000000006000830152602082019050919050565b60006142fc601d83614c35565b91507f4d61737465724368656656323a206e6f206d69677261746f72207365740000006000830152602082019050919050565b600061433c602483614c35565b91507f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260008301527f666c6f77000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a2602083614c35565b91507f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646000830152602082019050919050565b60006143e2601883614c35565b91507f426f72696e674d6174683a204d756c204f766572666c6f7700000000000000006000830152602082019050919050565b60608201600082015161442b6000850182614457565b50602082015161443e6020850182614493565b5060408201516144516040850182614493565b50505050565b61446081614cae565b82525050565b61446f81614cae565b82525050565b61447e81614da5565b82525050565b61448d81614cea565b82525050565b61449c81614cf4565b82525050565b6144ab81614cf4565b82525050565b6144ba81614d08565b82525050565b60006144cd828486613e90565b91508190509392505050565b60006144e58284613eee565b915081905092915050565b60006020820190506145056000830184613d81565b92915050565b60006060820190506145206000830186613d81565b61452d6020830185613d81565b61453a6040830184614484565b949350505050565b600060e082019050614557600083018a613d81565b6145646020830189613d81565b6145716040830188614484565b61457e6060830187614484565b61458b60808301866144b1565b61459860a0830185613e81565b6145a560c0830184613e81565b98975050505050505050565b60006040820190506145c66000830185613d81565b6145d36020830184614484565b9392505050565b600060408201905081810360008301526145f48185613d90565b905081810360208301526146088184613dee565b90509392505050565b60006020820190506146266000830184613e72565b92915050565b60006020820190506146416000830184613f1f565b92915050565b600060208201905061465c6000830184613f2e565b92915050565b60006020820190506146776000830184613f3d565b92915050565b600060208201905081810360008301526146978184613f6a565b905092915050565b600060208201905081810360008301526146b881613fa3565b9050919050565b600060208201905081810360008301526146d881613fe3565b9050919050565b600060208201905081810360008301526146f881614023565b9050919050565b6000602082019050818103600083015261471881614063565b9050919050565b60006020820190508181036000830152614738816140c9565b9050919050565b6000602082019050818103600083015261475881614109565b9050919050565b600060208201905081810360008301526147788161416f565b9050919050565b60006020820190508181036000830152614798816141af565b9050919050565b600060208201905081810360008301526147b8816141ef565b9050919050565b600060208201905081810360008301526147d88161422f565b9050919050565b600060208201905081810360008301526147f88161426f565b9050919050565b60006020820190508181036000830152614818816142af565b9050919050565b60006020820190508181036000830152614838816142ef565b9050919050565b600060208201905081810360008301526148588161432f565b9050919050565b6000602082019050818103600083015261487881614395565b9050919050565b60006020820190508181036000830152614898816143d5565b9050919050565b60006060820190506148b46000830184614415565b92915050565b60006060820190506148cf6000830186614466565b6148dc60208301856144a2565b6148e960408301846144a2565b949350505050565b60006020820190506149066000830184614484565b92915050565b600060a0820190506149216000830188614484565b61492e6020830187613d72565b61493b6040830186613d81565b6149486060830185613f5b565b6149556080830184613f5b565b9695505050505050565b600060a0820190506149746000830188614484565b6149816020830187613d72565b61498e6040830186613d81565b61499b6060830185613f5b565b6149a86080830184614484565b9695505050505050565b600060a0820190506149c76000830188614484565b6149d46020830187613d72565b6149e16040830186613d81565b6149ee6060830185614484565b6149fb6080830184614484565b9695505050505050565b600060a082019050614a1a6000830188614484565b614a276020830187613d81565b614a346040830186613d81565b614a416060830185613f5b565b614a4e6080830184614484565b9695505050505050565b6000604082019050614a6d6000830185614484565b614a7a6020830184613e72565b9392505050565b6000604082019050614a966000830185614484565b614aa36020830184613f4c565b9392505050565b6000606082019050614abf60008301866144a2565b614acc6020830185614484565b614ad96040830184614475565b949350505050565b60008083356001602003843603038112614afa57600080fd5b80840192508235915067ffffffffffffffff821115614b1857600080fd5b602083019250600182023603831315614b3057600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff82111715614b5b57600080fd5b8060405250919050565b600067ffffffffffffffff821115614b7c57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614c5182614cca565b9050919050565b60008115159050919050565b6000819050919050565b6000614c7982614c46565b9050919050565b6000614c8b82614c46565b9050919050565b6000614c9d82614c46565b9050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b6000614d2082614db7565b9050919050565b6000614d3282614d39565b9050919050565b6000614d4482614cca565b9050919050565b6000614d5682614d5d565b9050919050565b6000614d6882614cca565b9050919050565b6000614d7a82614d81565b9050919050565b6000614d8c82614cca565b9050919050565b6000614d9e82614cea565b9050919050565b6000614db082614cae565b9050919050565b6000614dc282614dc9565b9050919050565b6000614dd482614cca565b9050919050565b82818337600083830152505050565b60005b83811015614e08578082015181840152602081019050614ded565b83811115614e17576000848401525b50505050565b6000601f19601f8301169050919050565b614e3781614c46565b8114614e4257600080fd5b50565b614e4e81614c58565b8114614e5957600080fd5b50565b614e6581614c64565b8114614e7057600080fd5b50565b614e7c81614c6e565b8114614e8757600080fd5b50565b614e9381614c80565b8114614e9e57600080fd5b50565b614eaa81614c92565b8114614eb557600080fd5b50565b614ec181614cea565b8114614ecc57600080fd5b50565b614ed881614d08565b8114614ee357600080fd5b5056fea264697066735822122052e774d320511afbd8023f407877a3444e33747ec0f131edf192601df1a708b964736f6c634300060c0033