library Percent {
    struct percent {
      uint num;
      uint den;
    }

    // storage
    function mul(percent storage p, uint a) internal view returns (uint) {
      if (a == 0) {
        return 0;
      }
      return a*p.num/p.den;
    }

    function div(percent storage p, uint a) internal view returns (uint) {
      return a/p.num*p.den;
    }

    function sub(percent storage p, uint a) internal view returns (uint) {
      uint b = mul(p, a);
      if (b >= a) {
        return 0;
      }
      return a - b;
    }

    function add(percent storage p, uint a) internal view returns (uint) {
      return a + mul(p, a);
    }

    function toMemory(percent storage p) internal view returns (Percent.percent memory) {
      return Percent.percent(p.num, p.den);
    }

    // memory
    function mmul(percent memory p, uint a) internal pure returns (uint) {
      if (a == 0) {
        return 0;
      }
      return a*p.num/p.den;
    }

    function mdiv(percent memory p, uint a) internal pure returns (uint) {
      return a/p.num*p.den;
    }

    function msub(percent memory p, uint a) internal pure returns (uint) {
      uint b = mmul(p, a);
      if (b >= a) {
        return 0;
      }
      return a - b;
    }

    function madd(percent memory p, uint a) internal pure returns (uint) {
      return a + mmul(p, a);
    }
}
function mul(percent storage p, uint a) internal view returns (uint) {
  if (a == 0) {
    return 0;
  }
  return a*p.num/p.den;
}

// storage