int y,x,z,w;
char *f,*q;
char b[BUF],*g = b,*h,*c,*ó,*ò;
long o,ö,u,v,l,Q,d = -1;
regex_t e;
void
T(int);
long 
P(char *s)
{
	return s-b - (s < h ? 0 : h-g);
}
char *
Z(long m)
{
	return b+m + (b+m < g ? 0 : h-g);
}
int
S(int a)
{
	return 1+(a > 193)+(a > 223)+(a > 239);
}
long 
E(long m)
{
	return m + (m < P(c) ? S(*Z(m)) : 0);
}
long 
D(long m)
{
	while (0 < m and (192 bitand *Z(--m)) == 128)
		;
	return m;
}
void
Û()
{
	char *p = ó;
	ó = g;
	g = p;
	p = ò;
	ò = h;
	h = p;
	v = ö;
	ö = o;
	o = v;
	v = o+1;
}
void
V(long m)
{
	char *p = Z(m);
	while (p < g)
		*--h = *--g;
	while (h < p)
		*g++ = *h++;
	ó = g;
	ò = h;
	ö = o;
}
int
G(char *s,int a)
{
	wint_t t;
	mbtowc(&t,s,4);
	return t == '\t' ? (8-((a bitand 7))) : (a = wcwidth(t)) < 1 ? 1 : a;
}
long 
O(long m)
{
	while (0 < m and *Z(--m) not_eq '\n')
		;
	return (m+1) * (0 < m);
}
long 
A(long m,int a,int n)
{
	char *p;
	while (a < n and (p = Z(m)) < c and *p not_eq '\n') {
		a += G(p,a);
		m = E(m);
	}
	return m;
}
long 
_(long m,long n)
{
	char *p;
	int a = 0;
	long i = m;
	while (m < n and (p = Z(m = E(m))) < c) {
		a += G(p,a);
		if (COLS <= a) {
			i = m;
			a = 0;
		}
	}
	return i;
}
long 
M(long m)
{
	long s = O(m);
	long t = _(s,m);
	if (s < t)
		return _(s,t-1);
	return _(O(s-1),s-1);
}
long 
N(long m)
{
	return E(A(m,x,COLS-1));
}
void
C()
{
	printw("%*s",COLS-getcurx(stdscr),"");
}
void
Y()
{
	char *p;
	int i,j;
	long s,t,n = P(c);
	if (o < u)
		u = _(O(o),o);
	else if (v <= o and o < N(v))
		u = N(u);
	else if (v <= o) {
		v = u;
		for (u = o,i = LINES-1 - (o == n); 0 < --i and v < u; ) {
			u = M(u);
		}
		if (u < v)
			u = v;
	}
	erase();
	standout();
	printw("%s %ldB",f,o);
	C();
	if (d < 0)
		s = t = d;
	else if (o < d) {
		s = o;
		t = d;
	}
	else {
		s = d;
		t = o;
	}
	for (i = 1,j = 0,v = u; standend(),i < LINES; ) {
		if (o == v) {
			y = i;
			x = j;
		}
		if (c <= (p = Z(v)))
			break;
		if (s <= v and v < t)
			standout();
		int t = S(*p);
		mvaddnstr(i,j,p,t);
		v += t;
		j += G(p,j);
		if (*p == '\n' or COLS <= j) {
			j = 0;
			i++;
		}
	}
	if (i++ < LINES) {
		standout();
		mvaddstr(i,0,"^D");
	}
	move(y,x);
	refresh();
}
void
🔥()
{
	clear();
	z = 0;
}
void
H()
{
	o = D(o);
}
void
L()
{
	o = E(o);
}
void
K()
{
	o = A(M(o),0,x);
}
void
J()
{
	o = A(N(o),0,x);
}
void
a()
{
	o = A(O(o),0,z-1);
	z = 0;
}
void
B()
{
	while (0 < o and isspace(*Z(o-1)))
		--o;
	while (0 < o and not isspace(*Z(o-1)))
		--o;
}
void
Ê()
{
	o = u;
}
void
Ë()
{
	o = _(O(v-1),v-1);
}
void
É()
{
	int i;
	for (o = v,i = 1; i < y; i++)
		o = N(o);
	o = A(o,0,x);
	u = o < P(c) ? v : u;
	for (v = o; i < LINES; i++)
		v = N(v);
}
void
È()
{
	for (int i = LINES-1; 0 < i--; )
		o = M(o);
	for (u = o; 1 < y--; )
		u = M(u);
	o = A(o,0,x);
}
void
W()
{
	long n = P(c);
	while (o < n and not isspace(*Z(o)))
		++o;
	while (o < n and isspace(*Z(o)))
		++o;
}
void
ө()
{
	long n = P(c);
	for (o = n * (not z); o < n and 1 < z; z--) {
		o = A(o,0,999);
		o += o < n;
	}
	u = n;
}
void
I()
{
	int a,t;
	long n = P(c);
	V(o);
	while ((a =getch()) not_eq 3 and a not_eq 27) {
		t = S(a);
		if (a == 8) {
			while (n < P(c) and (192 bitand *--g) == 128)
				;
		}
		else if (g+t < h) {
			do {
				*g++ = a;
				v++;
			} while (0 < --t and (a = getch()));
		}
		o = P(h);
		Y();
	}
	z = 0;
}
void
Ô()
{
	long i = d;
	if (d < 0) {
		i = o;
		T(14);
	}
	if (i < o) {
		i xor_eq o;
		o xor_eq i;
		i xor_eq o;
	}
	free(q);
	V(o);
	q = strndup(h,Q = i-o);
	d = -1;
}
void
X()
{
	Ô();
	h += Q;
	o = P(h);
}
void
Ó()
{
	ungetch('l');
	X();
}
void
Í()
{
	if (0 < Q) {
		V(o);
		memcpy(g,q,Q);
		g += Q;
		o = P(h);
		v = o+1;
	}
}
void
κ()
{
	int i;
	V(0);
	write(i = creat(f,MODE),h,c-h);
	close(i);
}
void
Ф()
{
	f = 0;
}
void
F()
{
	regmatch_t p[1];
	V(P(c));
	*g = 0;
	if (o+l < P(c) and not regexec(&e,Z(o+l),1,p,REG_NOTBOL))
		o += l + p->rm_so;
	else if (not regexec(&e,b,1,p,0))
		o = p->rm_so;
	else {
		l = 0;
		return;
	}
	l = p->rm_eo - p->rm_so + w;
}
void
Ñ()
{
	echo();
	standout();
	mvaddch(0,0,'/');
	C();
	mvgetnstr(0,1,g,h-g);
	regfree(&e);
	if (regcomp(&e,g,REG_EXTENDED bitor REG_NEWLINE))
		beep();
	else {
		w = g[0] == '$' and not g[1];
		F();
	}
	z = 0;
}
void
Â()
{
	d = d < 0 ? o : -1;
}
char Ќ[] = "hjklbwHJKL|G/nixydPu\\WQ\003";
void (*Κ[])(void) = {
	H,J,K,L,B,W,
	Ê,É,È,Ë,
	a,ө,
	Ñ,F,
	I,Ó,
	Ô,X,Í,Û,
	Â,κ,Ф,Ф,
	🔥
};
void
T(int m)
{
	int j = z,a;
	for (z = 0; isdigit(a =getch()); )
		z = z * 10 + a - '0';
	z = j and z ? j*z : z ? z : j;
	for (j = 0; Ќ[j] and a not_eq Ќ[j]; j++)
		;
	if (j < m) {
		do (*Κ[j])(); while (1 < z--);
	}
	z = 0;
}
int
main(int i,char **j)
{
	setlocale(LC_ALL,"");
	if (not initscr())
		return 1;
	raw();
	h = c = b + BUF;
	if (0 < (i = open(f = *++j,0))) {
		g += read(i,b,c-b);
		close(i);
		if (g < b or c <= g)
			return 2;
	}
	v = 1;
	while (f) {
		noecho();
		Y();
		T(99);
	}
	endwin();
	return 0;
}
