Contract Address Details

0xd2E295a42667854B22a1e2B2507d08056E35AC08

Creator
0xc890a0–ee8ac5 at 0x88b0a7–ddb697
Balance
41.201986985217906854 Doge
Tokens
Fetching tokens...
Transactions
2,457 Transactions
Transfers
0 Transfers
Gas Used
146,146,062
Last Balance Update
25378551
Contract name:
BourbonDoge




Optimization enabled
true
Compiler version
v0.8.9+commit.e5eed63a




Optimization runs
999999
EVM Version
default




Verified at
2022-08-17T01:46:57.765095Z

Contract source code

/**
 *Submitted for verification at BscScan.com on 2022-04-09
*/

// SPDX-License-Identifier: MIT

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message 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(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. 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 mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity 0.8.9;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

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

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

    /**
    * @dev Returns the address of the current owner.
    */
    function owner() public view returns (address) {
      return _owner;
    }

    
    modifier onlyOwner() {
      require(_owner == _msgSender(), "Ownable: caller is not the owner");
      _;
    }

    function renounceOwnership() public onlyOwner {
      emit OwnershipTransferred(_owner, address(0));
      _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
      _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
      require(newOwner != address(0), "Ownable: new owner is the zero address");
      emit OwnershipTransferred(_owner, newOwner);
      _owner = newOwner;
    }
}

contract BourbonDoge is Context, Ownable {
    using SafeMath for uint256;

    uint256 private EGGS_TO_HATCH_1MINERS = 1080000;//for final version should be seconds in a day
    uint256 private PSN = 10000;
    uint256 private PSNH = 5000;
    uint256 private devFeeVal = 6;
    bool private initialized = false;
    address payable private recAdd;
    mapping (address => uint256) private hatcheryMiners;
    mapping (address => uint256) private claimedEggs;
    mapping (address => uint256) private lastHatch;
    mapping (address => address) private referrals;
    uint256 private marketEggs;
    
    constructor() {
        recAdd = payable(msg.sender);
    }
    
    function hatchEggs(address ref) public {
        require(initialized);
        
        if(ref == msg.sender) {
            ref = address(0);
        }
        
        if(referrals[msg.sender] == address(0) && referrals[msg.sender] != msg.sender) {
            referrals[msg.sender] = ref;
        }
        
        uint256 eggsUsed = getMyEggs(msg.sender);
        uint256 newMiners = SafeMath.div(eggsUsed,EGGS_TO_HATCH_1MINERS);
        hatcheryMiners[msg.sender] = SafeMath.add(hatcheryMiners[msg.sender],newMiners);
        claimedEggs[msg.sender] = 0;
        lastHatch[msg.sender] = block.timestamp;
        
        //send referral eggs
        claimedEggs[referrals[msg.sender]] = SafeMath.add(claimedEggs[referrals[msg.sender]],SafeMath.div(eggsUsed,20));
        
        //boost market to nerf miners hoarding
        marketEggs=SafeMath.add(marketEggs,SafeMath.div(eggsUsed,5));
    }
    
    function sellEggs() public {
        require(initialized);
        uint256 hasEggs = getMyEggs(msg.sender);
        uint256 eggValue = calculateEggSell(hasEggs);
        uint256 fee = devFee(eggValue);
        claimedEggs[msg.sender] = 0;
        lastHatch[msg.sender] = block.timestamp;
        marketEggs = SafeMath.add(marketEggs,hasEggs);
        recAdd.transfer(fee);
        payable (msg.sender).transfer(SafeMath.sub(eggValue,fee));
    }
    
    function beanRewards(address adr) public view returns(uint256) {
        uint256 hasEggs = getMyEggs(adr);
        uint256 eggValue = calculateEggSell(hasEggs);
        return eggValue;
    }
    
    function buyEggs(address ref) public payable {
        require(initialized);
        uint256 eggsBought = calculateEggBuy(msg.value,SafeMath.sub(address(this).balance,msg.value));
        eggsBought = SafeMath.sub(eggsBought,devFee(eggsBought));
        uint256 fee = devFee(msg.value);
        recAdd.transfer(fee);
        claimedEggs[msg.sender] = SafeMath.add(claimedEggs[msg.sender],eggsBought);
        hatchEggs(ref);
    }
    
    function calculateTrade(uint256 rt,uint256 rs, uint256 bs) private view returns(uint256) {
        return SafeMath.div(SafeMath.mul(PSN,bs),SafeMath.add(PSNH,SafeMath.div(SafeMath.add(SafeMath.mul(PSN,rs),SafeMath.mul(PSNH,rt)),rt)));
    }
    
    function calculateEggSell(uint256 eggs) public view returns(uint256) {
        return calculateTrade(eggs,marketEggs,address(this).balance);
    }
    
    function calculateEggBuy(uint256 eth,uint256 contractBalance) public view returns(uint256) {
        return calculateTrade(eth,contractBalance,marketEggs);
    }
    
    function calculateEggBuySimple(uint256 eth) public view returns(uint256) {
        return calculateEggBuy(eth,address(this).balance);
    }
    
    function devFee(uint256 amount) private view returns(uint256) {
        return SafeMath.div(SafeMath.mul(amount,devFeeVal),100);
    }
    
    function seedMarket() public payable onlyOwner {
        require(marketEggs == 0);
        initialized = true;
        marketEggs = 108000000000;
    }
    
    function getBalance() public view returns(uint256) {
        return address(this).balance;
    }
    
    function getMyMiners(address adr) public view returns(uint256) {
        return hatcheryMiners[adr];
    }
    
    function getMyEggs(address adr) public view returns(uint256) {
        return SafeMath.add(claimedEggs[adr],getEggsSinceLastHatch(adr));
    }
    
    function getEggsSinceLastHatch(address adr) public view returns(uint256) {
        uint256 secondsPassed=min(EGGS_TO_HATCH_1MINERS,SafeMath.sub(block.timestamp,lastHatch[adr]));
        return SafeMath.mul(secondsPassed,hatcheryMiners[adr]);
    }
    
    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return a < b ? a : b;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"beanRewards","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyEggs","inputs":[{"type":"address","name":"ref","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggBuy","inputs":[{"type":"uint256","name":"eth","internalType":"uint256"},{"type":"uint256","name":"contractBalance","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggBuySimple","inputs":[{"type":"uint256","name":"eth","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggSell","inputs":[{"type":"uint256","name":"eggs","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEggsSinceLastHatch","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMyEggs","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMyMiners","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"hatchEggs","inputs":[{"type":"address","name":"ref","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"seedMarket","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sellEggs","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
            

Contract Creation Code

0x608060405262107ac060015561271060025561138860035560066004556005805460ff1916905534801561003257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060058054610100600160a81b0319163361010002179055610cec8061009a6000396000f3fe6080604052600436106100e85760003560e01c8063715018a61161008a578063a507abee11610059578063a507abee1461025b578063d7c8843b1461027b578063db6638651461029b578063f2fde38b146102ae57600080fd5b8063715018a6146101d15780637e56fde5146101e65780638da5cb5b146102065780638e3163271461023b57600080fd5b80633955f0fe116100c65780633955f0fe1461014f5780633c5f07cb146101665780633ec862a81461016e5780634b634b061461018e57600080fd5b806312065fe0146100ed57806326fd84221461010f5780632ef6a7431461012f575b600080fd5b3480156100f957600080fd5b50475b6040519081526020015b60405180910390f35b34801561011b57600080fd5b506100fc61012a366004610b6f565b6102ce565b34801561013b57600080fd5b506100fc61014a366004610b91565b6102e4565b34801561015b57600080fd5b50610164610322565b005b610164610410565b34801561017a57600080fd5b50610164610189366004610b91565b6104d9565b34801561019a57600080fd5b506100fc6101a9366004610b91565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205490565b3480156101dd57600080fd5b50610164610697565b3480156101f257600080fd5b506100fc610201366004610bc7565b610787565b34801561021257600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610106565b34801561024757600080fd5b506100fc610256366004610bc7565b610793565b34801561026757600080fd5b506100fc610276366004610b91565b6107a2565b34801561028757600080fd5b506100fc610296366004610b91565b6107c3565b6101646102a9366004610b91565b61084e565b3480156102ba57600080fd5b506101646102c9366004610b91565b610914565b60006102dd8383600a546109a1565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461031c90610317846107c3565b6109e1565b92915050565b60055460ff1661033157600080fd5b600061033c336102e4565b9050600061034982610793565b90506000610356826109ed565b33600090815260076020908152604080832083905560089091529020429055600a5490915061038590846109e1565b600a5560055460405161010090910473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f193505050501580156103d3573d6000803e3d6000fd5b50336108fc6103e28484610a05565b6040518115909202916000818181858888f1935050505015801561040a573d6000803e3d6000fd5b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600a54156104a357600080fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556419254d3800600a55565b60055460ff166104e857600080fd5b73ffffffffffffffffffffffffffffffffffffffff811633141561050a575060005b3360009081526009602052604090205473ffffffffffffffffffffffffffffffffffffffff1615801561056157503360008181526009602052604090205473ffffffffffffffffffffffffffffffffffffffff1614155b156105b45733600090815260096020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b60006105bf336102e4565b905060006105cf82600154610a11565b336000908152600660205260409020549091506105ec90826109e1565b33600090815260066020908152604080832093909355600780825283832083905560088252838320429055600982528383205473ffffffffffffffffffffffffffffffffffffffff1683529052205461064a90610317846014610a11565b3360009081526009602090815260408083205473ffffffffffffffffffffffffffffffffffffffff1683526007909152902055600a5461068f90610317846005610a11565b600a55505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048d565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061031c82476102ce565b600061031c82600a54476109a1565b6000806107ae836102e4565b905060006107bb82610793565b949350505050565b60008061081a60015461081542600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a05565b610a1d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600660205260409020549091506102dd908290610a33565b60055460ff1661085d57600080fd5b600061086d3461012a4734610a05565b90506108818161087c836109ed565b610a05565b9050600061088e346109ed565b600554604051919250610100900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f193505050501580156108db573d6000803e3d6000fd5b50336000908152600760205260409020546108f690836109e1565b3360009081526007602052604090205561090f836104d9565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048d565b61099e81610a3f565b50565b60006107bb6109b260025484610a33565b6109dc6003546103176109d66109ca6002548a610a33565b6103176003548c610a33565b89610a11565b610a11565b60006102dd8284610c0f565b600061031c6109fe83600454610a33565b6064610a11565b60006102dd8284610c27565b60006102dd8284610c3e565b6000818310610a2c57816102dd565b5090919050565b60006102dd8284610c79565b73ffffffffffffffffffffffffffffffffffffffff8116610ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048d565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008060408385031215610b8257600080fd5b50508035926020909101359150565b600060208284031215610ba357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146102dd57600080fd5b600060208284031215610bd957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610c2257610c22610be0565b500190565b600082821015610c3957610c39610be0565b500390565b600082610c74577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610cb157610cb1610be0565b50029056fea2646970667358221220480dc2dd666fc5de5c20a973d24d82b3da70fc3f14d9da6848db1635ac389fd964736f6c63430008090033

Deployed ByteCode

0x6080604052600436106100e85760003560e01c8063715018a61161008a578063a507abee11610059578063a507abee1461025b578063d7c8843b1461027b578063db6638651461029b578063f2fde38b146102ae57600080fd5b8063715018a6146101d15780637e56fde5146101e65780638da5cb5b146102065780638e3163271461023b57600080fd5b80633955f0fe116100c65780633955f0fe1461014f5780633c5f07cb146101665780633ec862a81461016e5780634b634b061461018e57600080fd5b806312065fe0146100ed57806326fd84221461010f5780632ef6a7431461012f575b600080fd5b3480156100f957600080fd5b50475b6040519081526020015b60405180910390f35b34801561011b57600080fd5b506100fc61012a366004610b6f565b6102ce565b34801561013b57600080fd5b506100fc61014a366004610b91565b6102e4565b34801561015b57600080fd5b50610164610322565b005b610164610410565b34801561017a57600080fd5b50610164610189366004610b91565b6104d9565b34801561019a57600080fd5b506100fc6101a9366004610b91565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205490565b3480156101dd57600080fd5b50610164610697565b3480156101f257600080fd5b506100fc610201366004610bc7565b610787565b34801561021257600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610106565b34801561024757600080fd5b506100fc610256366004610bc7565b610793565b34801561026757600080fd5b506100fc610276366004610b91565b6107a2565b34801561028757600080fd5b506100fc610296366004610b91565b6107c3565b6101646102a9366004610b91565b61084e565b3480156102ba57600080fd5b506101646102c9366004610b91565b610914565b60006102dd8383600a546109a1565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604081205461031c90610317846107c3565b6109e1565b92915050565b60055460ff1661033157600080fd5b600061033c336102e4565b9050600061034982610793565b90506000610356826109ed565b33600090815260076020908152604080832083905560089091529020429055600a5490915061038590846109e1565b600a5560055460405161010090910473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f193505050501580156103d3573d6000803e3d6000fd5b50336108fc6103e28484610a05565b6040518115909202916000818181858888f1935050505015801561040a573d6000803e3d6000fd5b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600a54156104a357600080fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556419254d3800600a55565b60055460ff166104e857600080fd5b73ffffffffffffffffffffffffffffffffffffffff811633141561050a575060005b3360009081526009602052604090205473ffffffffffffffffffffffffffffffffffffffff1615801561056157503360008181526009602052604090205473ffffffffffffffffffffffffffffffffffffffff1614155b156105b45733600090815260096020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b60006105bf336102e4565b905060006105cf82600154610a11565b336000908152600660205260409020549091506105ec90826109e1565b33600090815260066020908152604080832093909355600780825283832083905560088252838320429055600982528383205473ffffffffffffffffffffffffffffffffffffffff1683529052205461064a90610317846014610a11565b3360009081526009602090815260408083205473ffffffffffffffffffffffffffffffffffffffff1683526007909152902055600a5461068f90610317846005610a11565b600a55505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048d565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061031c82476102ce565b600061031c82600a54476109a1565b6000806107ae836102e4565b905060006107bb82610793565b949350505050565b60008061081a60015461081542600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a05565b610a1d565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600660205260409020549091506102dd908290610a33565b60055460ff1661085d57600080fd5b600061086d3461012a4734610a05565b90506108818161087c836109ed565b610a05565b9050600061088e346109ed565b600554604051919250610100900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f193505050501580156108db573d6000803e3d6000fd5b50336000908152600760205260409020546108f690836109e1565b3360009081526007602052604090205561090f836104d9565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048d565b61099e81610a3f565b50565b60006107bb6109b260025484610a33565b6109dc6003546103176109d66109ca6002548a610a33565b6103176003548c610a33565b89610a11565b610a11565b60006102dd8284610c0f565b600061031c6109fe83600454610a33565b6064610a11565b60006102dd8284610c27565b60006102dd8284610c3e565b6000818310610a2c57816102dd565b5090919050565b60006102dd8284610c79565b73ffffffffffffffffffffffffffffffffffffffff8116610ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048d565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008060408385031215610b8257600080fd5b50508035926020909101359150565b600060208284031215610ba357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146102dd57600080fd5b600060208284031215610bd957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610c2257610c22610be0565b500190565b600082821015610c3957610c39610be0565b500390565b600082610c74577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610cb157610cb1610be0565b50029056fea2646970667358221220480dc2dd666fc5de5c20a973d24d82b3da70fc3f14d9da6848db1635ac389fd964736f6c63430008090033