public string Encode (string s, int offset)
{
int n = initial_n;
int delta = 0;
int bias = initial_bias;
int b = 0, h = 0;
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < s.Length; i++)
if (s [i] < '\x80')
sb.Append (s [i]);
b = h = sb.Length;
if (b > 0)
sb.Append (delimiter);
while (h < s.Length) {
int m = int.MaxValue;
for (int i = 0; i < s.Length; i++)
if (s [i] >= n && s [i] < m)
m = s [i];
checked { delta += (m - n) * (h + 1); }
n = m;
for (int i = 0; i < s.Length; i++) {
char c = s [i];
if (c < n || c < '\x80')
checked { delta++; }
if (c == n) {
int q = delta;
for (int k = base_num; ;k += base_num) {
int t =
k <= bias + tmin ? tmin :
k >= bias + tmax ? tmax :
k - bias;
if (q < t)
break;
sb.Append (EncodeDigit (t + (q - t) % (base_num - t)));
q = (q - t) / (base_num - t);
}
sb.Append (EncodeDigit (q));
bias = Adapt (delta, h + 1, h == b);
delta = 0;
h++;
}
}
delta++;
n++;
}
return sb.ToString ();
}