// SPDX-License-Identifier: MIT

/*
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP55PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP5Y5PPPPPPPPPPPPPPPPPPPPJ~^?PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPP5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPY~::!YPPPPPPPPPPPPPPPPPJ^...JPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP7^...:?5PPPPPPPPPPPPPPJ~..7!^5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP5~::7!:.!YPPPPP555YYYY?J^ :5Y.?PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPJ~:^YP7:.!?J?77777??JJ?J7~~5J:~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPP55PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP7~^:?B5~ ~GY7JY555555PGPYJ?7!!^5PPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPP5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP~!!.~PB7^JYJYY5Y5YJ7!?5GPY~.~7^JPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPP555555PPPPPPPP55555555555PPPPPPPPP~7?^^~?YJJYYYYYYJJY!..7JYY7^!P57YPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPP555555555555555555555PPPPPPPPPPPPPP7?J?!~7JY5YYYYJ!?5GPY!!?777!!JY!!5555PPPPPPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555PPPPPPPPPPPPPY~YY?J555555YY77J5Y?J7!!!!^^::~7?YYYY5PPPPPPPPPPPPPPPPPPPPPPP
PP5555555555555555555555555PP55555PPPPPY.7YJGP5Y?!~^:::^~~~:::~~^. .!5#B###YJ555PPPPPPPPPPPPPPPPPPPP
PP5555555555555555555555555555555555PPP~.7?5J~:.     .....   .:::...:7PGBBB77555PPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555555555555PPPY ~??J^...    .....  ..:::::..:!YGGPP!7P55PPPPPPPPPPPPPPPPPPPP
PP555555555555555555555555555555555PPP? ?JJ7::....  ........::^^^^^~!J5P5?^?P55PPPPPPPPPPPPPPPPPPPPP
PP555555555555555555555555555555555PPP?.Y5Y7::::.........::~JY?777!!!~~^:.:5P5PPPPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555555555555PPPJ.JGPY~::::::::....::^~!!!!!!!!~^:. ~PPPPPPPPPPPPPPPPPPPPPPPPP
PPPP555555555555555555555555555555PPPP5:7PBG57^:::::::^^^^~~77???7!~^:.   !P5PPPPPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555555555555PPY!?JJPBBG5?^.........::^^^::....     ?P5PPPPPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555555PPPPPPPPY~7PGGPGBBBPJ!:.  ........    .     .YPPPPPPPPPPPPPPPPPPPPPPPPP
PP5555555555555555555555555PPPPPPPPP57~7?YGBGGGGBBGPJ!^.   ...          .~!5PPPPPPPPPPPPPPPPPPPPPPPP
PP55555555555555555555555555P555PPPY::?JJJJ55GBBGGGGGGPYJ7^.      ..   .~!^?PPPPPPPPPPPPPPPPPPPPPPPP
PPP55555555555555555555555555555PP5:.7Y555YY?YY5PGGGGGPPP5YJ!^:.     .^~^^~!PPPPPPPPPPPPPPPPPPPPPPPP
PPP5555555555555555555555555555PPPY :?JY55PP55JJJJJJYY5PPPPYJJ??7!~~~~^:.^~!PPPPPPPPPPPPPPPPPPPPPPPP
PPP555555555555555555PP555PPP555PPJ :JYYYYY55PP5YJ??777!!!!!7?7!~~^::.  :~~^YPPPPPPPPPPPPPPPPPPPPPPP
PPP55555555555P55PPPPPPPPPPPP55PPPJ .?5YYJJJJJY5PP5Y?7!!!~~~^^:.     .:^~~^:!PPPPPPPPPPPPPPPPPPPPPPP
PPP5555555555555PPPPPPPPPPPPPPP5J77!:7Y55YYJJ????JYY55YJ7!~~~~~~~^^::^~~~^^.:5PPPPPPPPPPPPPPPPPPPPPP
PPP555555PPPPPPPPPPPPPPPPPPPPJ~:~JGG77JJY55YJJ?7!!!~~~!7????77!~~~~!~~^!!~. .YPPPPPPPPPPPPPPPPPPPPPP
PPPPPPP55PPPPPPPPPPPPPPPPPPJ^ :75GBBPJ???JYY5YJ7!~^^::....::^~!77777!~!7^.  .YPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPP55PPPP555PPPPPPPP5~ .!J5PPGBB5J????JJYYYJ7~::...         :~~~~~~^:  .JPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPP5555555PPPPPPPPP?. ^7YY5PPGBBB5JJ??????JYYY?~:...       .!^~~~^~~^.. ^5PPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPP55555PPPPPPPP7  ^?YY55PPGBBBGYYJJ?777777?JYJ!^...     :J!~~~~~~~^.  JPPPPPPPPPPPPPPPPPPPPP
PPPPPPP5555555PPPPPPPP7  ~?YYYY5PPGBBBBP55J??7!!!~!!!7???!^...  .~YY7!!~~~.   ?PPPPPPPPPPPPPPPPPPPPP
PPPPPP55555555PPPPPPP?  ~JY555Y55PGGBBBB55YJ?7!!~~~^^^^^^~~^^:....:!77!!^.   .YPPPPPPPPPPPPPPPPPPPPP
PPPPP5555555555P55PPY. ^?Y55YY555PGGBBBBP55YJ7!!~^^^::::........ .           7PPPPPPPPPPPPPPPPPPPPPP
PPPP5555555555555PP5^ :7Y55555555PGGBBBB5555Y?!~~^^::::..   ..            ..?PPPPPPPPPPPPPPPPPPPPPPP
PPP555555555PPPPPPPJ :?YPPP5555PPGGBBBBG555YYJ7!~^^:::. .^!7??7!:      .^~~YP55PPPPPPPPPPPPPPPPPPPPP
PPP55555555555PPPPP~ 75PPPPPPPPPGGGBBB#G555YYJ?!~~^^:..!JJ?7!!!!!.   .~7~.?P555PPPPPPPPPPPPPPPPPPPPP
PPP555555555555PPPJ.~5PGGGGGGGGGGGGBBB#P555YJ?7!~~^^::?Y7~~^:::::: .~?!:.^PP5PPPPPPPPPPPPPPPPPPPPPPP
PPPPP555555555PPY~:75GGGGGGGGGGGGGBBBB#P55YYJ?!~~^^:^?J!~^:::... .~??~:. ?P5P5PPPPPPPPPPPPPPPPPPPPPP
PPP5555555555PP7.~YGBBBBBBBBBBBBBBBBBBB555YJ?7~~^^::!J!^^::.... ^JJ7^::.:5P555PPPPPPPPPPPPPPPPPPPPPP
PP555555555PPP! ^7JJYPGB#BBBBBBBBBBBB#B55YYJ?7!^^^:.!J~^:::..  !YJ~^^::.?P5555PPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPP7 ~??7!~^~75##BBBBBBBBBB#B55YYJJ7!~^^::^J~^::...^?5J!^^::.:5P555PPPPPPPPPPPP555555PPPPP
PPPPPPPPPPPP5:~JJJJ??!~::!P#######B###B55YYYJ?!~^::::?!^::^!J55Y?~^^::.~P55555555555PPPPP55555555PPP
PPP5PPPPPPPPY:?YYYYJJ?7!~^^P##BB#B##BB#G55YYJ?7!~~^^:!J7?YPPP55Y7!~^^^:?PPPPPPPPPPPPPPPPPP5555555PPP
PPPPPPPPPPPP555PPPPP55555555PPPPPPPPPPPPPPPPP555555555PPPPPPPPP555555555PPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPP555PPPPPPPPPP555555555555PPPPPPPPPPPPPPPP5PPPPPPPPPPPPPPP55555555PPPPPPPPPPPPPPPPPPPP
//
    ███████    █████   █████ ██████   ██████ █████
  ███░░░░░███ ░░███   ░░███ ░░██████ ██████ ░░███ 
 ███     ░░███ ░███    ░███  ░███░█████░███  ░███ 
░███      ░███ ░███████████  ░███░░███ ░███  ░███ 
░███      ░███ ░███░░░░░███  ░███ ░░░  ░███  ░███ 
░░███     ███  ░███    ░███  ░███      ░███  ░███ 
 ░░░███████░   █████   █████ █████     █████ █████
   ░░░░░░░    ░░░░░   ░░░░░ ░░░░░     ░░░░░ ░░░░░ 
// 
// BARK DIFFERENT!
// The top dog that rewards true loyalty.
//
// https://linktr.ee/ohmi
//
*/

pragma solidity ^0.4.23;

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;

  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool)
  {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract OHMI is StandardToken {

  string public constant name = "OHMI"; // solium-disable-line uppercase
  string public constant symbol = "OHMI"; // solium-disable-line uppercase
  uint8 public constant decimals = 18; // solium-disable-line uppercase

  uint256 public constant INITIAL_SUPPLY = 100000000 * (10 ** uint256(decimals));

  constructor() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    emit Transfer(0x0, msg.sender, INITIAL_SUPPLY);
  }

}