#include #include typedef struct { int x, y, z; } b; b *C = NULL; int H, p, q, x, y, _, V, i, o, l, e, t = 1, E[4], I[22] = { 4352, 95, 4554, 1, 2902, 446, 2, 29839, 1841, 11171, 8541, 511, 785, 9, 23, 63, 145, 96, 128, 6, 61466, 135167 }; FILE *f; void SwapChar() { V = C[x].x; C[x].x = C[y].x; C[y].x = V; V = C[x].y; C[x].y = C[y].y; C[y].y = V; V = C[x].z; C[x].z = C[y].z; C[y].z = V; } void m(int p, int q) { int d = (p + q) / 2; if( d - p ) { m(p, d); m(d, q); for(i = p, o = d, y = H + p; y < H + q; y++) x = i >= d || (o < q && (C[i].y > C[o].y || (C[i].y == C[o].y && C[i].x > C[o].x))) ? o++ : i++, SwapChar(); for(y = p, x = H + p; y < q; x++, y++) SwapChar(); } } void UpdateCharWidth() { for(i = l = 0; i < 22 && (o = l + I[i++], l = o + I[i], e < o || e > l); i++); x += 2 - i / 22; } void a() { if( H + 2 > t ) C = (b*)realloc(C, (t *= 2) * 2 * sizeof(b)); C[H].x = x; C[H].y = y; C[H++].z = e; p = p > y ? y : p; q = q < y ? y : q; UpdateCharWidth(); } void P(int p) { E[o = 0] = e = p; if( p > 127 ) { for(; p > 63 >> o; p >>= 6) E[o++] = (p & 63) | 128; E[o] = (1920 >> o & 240) | p; } for(; o > -1;) fputc(E[o--], f); } void Q(int O) { O ? fprintf(f, "\33[%d%c", abs(O), _ + (O > 0)) : 0; _ ^= 2; } char d[2] = "r"; int OpenHandle(char *name) { return !(f = fopen(name, d)) ? perror(name), 1 : 0; } int main(int O, char **Z) { f = stdin; if( O > 1 && (*Z[1] - 45 || Z[1][1]) && OpenHandle(Z[1]) ) goto fail; *d |= 5; for(V = x = y = l = p = q = H = 0; (e = fgetc(f)) - EOF;) _ += e, _ += _ << 10, _ ^= _ >> 6, V = V > 0 ? e - 91 ? e < 48 || e > 59 ? l = e % 4 < 2 ? -l : l, e > 64 && e < 67 ? y += l, 0 : e < 69 && (x += l) < 0 ? x = 0 : 0 : (l = l * 10 + e - 48, V) : V : V < 0 ? (e = l = l << 6 | (e & 63), !++V) ? a(), V : V : (e & 224) == 192 ? l = e & 31, -1 : (e & 240) == 224 ? l = e & 15, -2 : (e & 248) == 240 ? l = e & 7, -3 : e - 27 ? e == 10 ? y++, x = 0 : e - 32 ? e == 8 ? x = (x + 8) % 8 : e > 32 ? a(), V : V : x++, V : (l = 0, 1); fclose(f); f = stdout; if( C ) { if( O < 2 ) { m(0, H); C[H].x = -1; for(V = x = 0, y = p; V < H; V++) { for(; y < C[V].y; y++, x = 0) P(10); for(; x < C[V].x; x++) P(32); for(; C[V + 1].y == C[V].y && C[V + 1].x == C[V].x;) V++; P(C[V].z); UpdateCharWidth(); } if( x ) P(10); } else { srand(_); for(x = H; --x; SwapChar()) y = rand() % -~x; if( (O -= 2) ? OpenHandle(Z[2]) : O++ ) goto fail; for(t = V = 0, y = q + 1; V < H && t < O; t++) { if( t && OpenHandle(Z[t + 2]) ) goto fail; if( !t ) for(V = q - p + 2; --V;) P(10); for(_ = 65; V < H * (t + 1) / O; y = C[V++].y) Q(C[V].y - y), Q(x - C[V].x), P(C[V].z), x = C[V].x, UpdateCharWidth(); Q(q - y); P(10); x = fclose(f); y = q + 1; } } } O = 0; fail: return O; }