public static async Task<VInt> ReadUIntAsync(Stream s, CancellationToken cancel_token)
{
int first = await s.ReadByteAsync();
if (first<0) throw new EndOfStreamException();
int len = CheckLength(first);
var bin = new byte[len];
bin[0] = (byte)first;
await s.ReadBytesAsync(bin, 1, len-1, cancel_token);
long res = bin.Aggregate(0L, (r, b) => (r<<8) | b);
res &= (1<<(7*len))-1;
return new VInt(res, bin);
}