include "keyring.m"
keyring:= load Keyring Keyring->PATH;
IPint: adt
{
  iptob64:   fn(i: self ref IPint): string;
  b64toip:   fn(str: string)  : ref IPint;
  iptobytes: fn(i: self ref IPint): array of byte;
  bytestoip: fn(buf: array of byte): ref IPint;
  iptobebytes: fn(i: self ref IPint): array of byte;
  bebytestoip: fn(buf: array of byte): ref IPint;
  inttoip:   fn(i: int): ref IPint;
  iptoint:   fn(i: self ref IPint): int;
  iptostr:   fn(i: self ref IPint, base: int): string;
  strtoip:   fn(str: string, base: int): ref IPint;
  random:    fn(minbits, maxbits: int): ref IPint;
  copy:      fn(i: self ref IPint): ref IPint;
  bits:      fn(i:  self ref IPint): int;
  expmod:    fn(base: self ref IPint, exp, mod: ref IPint):ref IPint;
  add:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
  sub:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
  neg:  fn(i: self ref IPint): ref IPint;
  mul:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
  div:  fn(i1: self ref IPint, i2: ref IPint): (ref IPint, ref IPint);
  eq:   fn(i1:  self ref IPint, i2: ref IPint): int;
  cmp:  fn(i1: self ref IPint, i2: ref IPint): int;
  shl:  fn(i: self ref IPint, n: int): ref IPint;
  shr:  fn(i: self ref IPint, n: int): ref IPint;
  and:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
  ori:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
  not:  fn(i: self ref IPint): ref IPint;
  xor:  fn(i1: self ref IPint, i2: ref IPint): ref IPint;
};