abstract contract Ownable {
    constructor() { _owner = msg.sender; }
    address payable _owner;
    
    /**
     * @dev returns whether sender is owner
     */
    function isOwner(address sender) public view returns (bool) {
        return sender == _owner;
    }
    
    /**
     * @dev require sender to be owner
     */
    function ownly() internal view {
        require(isOwner(msg.sender));
    }
    
    /**
     * @dev modifier for owner only
     */
    modifier owned() {
        ownly(); _;
    }
    
    /**
     * @dev renounce ownership of contract
     */
    function renounceOwnership() public owned() {
        transferOwnership(address(0));
    }
    
    /**
     * @dev transfer contract ownership to address
     */
    function transferOwnership(address payable adr) public owned() {
        _owner = adr;
    }
}
/**
 * Provide owner context
 */
function renounceOwnership() public owned() {
    transferOwnership(address(0));
}

/**
 * @dev renounce ownership of contract
 */