/*****************************************************************************
 *                                                                            *
 *                   HotEqn Equation Viewer Basic Applet                      *
 *                                                                            *
 ******************************************************************************
 * Java Applet to view mathematical Equations provided in the LaTeX language  *
 ******************************************************************************

Copyright 2006 Stefan Müller and Christian Schmid, modified by Rene Grothmann

This file is part of the HotEqn package.

    HotEqn is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation;
    HotEqn is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package atp;

import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionListener;
import java.util.Hashtable;

import javax.swing.JComponent;

public class sHotEqn {

	JComponent PC; // container panel

	private int width;
	private int height;
	private String _fldcase;
	private String _fldint;
	ActionListener G;
	private final b S;
	private e D;
	private Font d;
	private Font b;
	private Font _fldnull;
	private Font _fldlong;
	private final int j[] = { 14, 12, 10, 8 };
	private final int _fldfor[] = { 3, 3, 3, 3 };
	private Image s;
	private boolean Q;
	private int f;
	private int H;
	private final boolean K;
	private int g;
	private String z;
	private String E;
	private final f _flddo;
	private final MediaTracker B;
	private final Hashtable<String, Image> w;
	public boolean r;
	public boolean L;
	public boolean q;
	private boolean A;
	private boolean t;
	private int _fldelse;
	private int _fldchar;
	private int J;
	private int I;
	private int a;
	private int m;
	private int R;
	private int l;
	private int F;
	private boolean c;
	private int p;
	private int o;

	public sHotEqn(final JComponent PC) {
		width = 0;
		height = 0;
		_fldcase = null;
		_fldint = "Helvetica";
		Q = false;
		f = 0;
		H = 0;
		K = false;
		g = 0;
		z = "left";
		E = "top";
		w = new Hashtable<String, Image>(13);
		r = false;
		L = false;
		q = true;
		A = false;
		t = true;
		_fldelse = 0;
		_fldchar = 0;
		J = 0;
		I = 0;
		a = 0;
		m = 0;
		R = 0;
		l = 0;
		F = 5;
		c = false;
		p = 0;
		o = 0;
		_flddo = new f();
		B = new MediaTracker(PC);
		S = new b("");
	}

	public void setEquation(final String s1) {
		_fldcase = s1;
		S.a(s1);
		Q = false;
	}

	public String getEquation() {
		return _fldcase;
	}

	public String Status;

	public void printStatus(final String s1) {
		Status = s1;
	}

	private void a(final String s1) {
		Status = s1;

	}

	public Image getImage() {
		if (Q) {
			return s;
		} else {
			return null;
		}
	}

	public void setDebug(final boolean flag) {
		q = flag;
	}

	public boolean isDebug() {
		return q;
	}

	public void setFontname(final String s1) {
		_fldint = s1;
	}

	public String getFontname() {
		return _fldint;
	}

	int i10, j10, k10, l10;
	boolean bold0, fonts = false;

	public void setHAlign(final String s1) {
		z = s1;
		Q = false;
	}

	public String getHAlign() {
		return z;
	}

	public void setVAlign(final String s1) {
		E = s1;
		Q = false;
	}

	public String getVAlign() {
		return E;
	}

	public void setEditable(final boolean flag) {
		t = flag;
	}

	public boolean isEditable() {
		return t;
	}

	public String getSelectedArea() {
		return S.a(p, o);
	}

	public Dimension getPreferredSize() {
		if ((width == 0) & (height == 0)) {
			final Graphics2D g1 = (Graphics2D) PC.getGraphics();
			if (g1 != null) {
				g1.setFont(d);
				S._mthdo();
				final c c1 = _mthnew(0, 150, false, g1, 1);
				if (K) {
					g = 5;
				} else {
					g = 0;
				}
				f = 1 + c1._flddo + 2 * g;
				H = 1 + c1._fldif + c1.a + 2 * g;
			}
		}
		width = f;
		height = H;
		if (f <= 1) {
			return new Dimension(100, 100);
		} else {
			return new Dimension(f, H);
		}
	}

	final int ff1 = 8, ff2 = 6;

	public Dimension getSizeof(final String s1, final Graphics2D g1) {
		if (d != g1.getFont()) {
			d = g1.getFont();
			final int fs = d.getSize();
			b = new Font(d.getFamily(), d.getStyle(), fs * ff1 / 10);

			_fldnull = _fldlong = new Font(d.getFamily(), d.getStyle(), fs
					* ff2 / 10);
		}

		S.a(s1);
		final c c1 = _mthnew(0, 150, false, g1, 1);
		byte byte0;
		if (K) {
			byte0 = 5;
		} else {
			byte0 = 0;
		}
		return new Dimension(1 + c1._flddo + 2 * byte0, 1 + c1._fldif + c1.a
				+ 2 * byte0);
	}

	public int getAscent(final String s1, final Graphics2D g1) {
		if (d != g1.getFont()) {
			d = g1.getFont();
			final int fs = d.getSize();
			b = new Font(d.getFamily(), d.getStyle(), fs * ff1 / 10);
			_fldnull = _fldlong = new Font(d.getFamily(), d.getStyle(), fs
					* ff2 / 10);
		}

		S.a(s1);
		final c c1 = _mthnew(0, 150, false, g1, 1);
		byte byte0;
		if (K) {
			byte0 = 5;
		} else {
			byte0 = 0;
		}
		return c1._fldif + byte0;
	}

	public Dimension getMinimumSize() {
		return getPreferredSize();
	}

	public synchronized int paint(final int cc, final int rr, final Graphics2D g2) {
//                g2.setStroke(new BasicStroke(1.0f));
		if (d != g2.getFont()) {
			d = g2.getFont();
			final int fs = d.getSize();
			b = new Font(d.getFamily(), d.getStyle(), fs * ff1 / 10);
			_fldnull = _fldlong = new Font(d.getFamily(), d.getStyle(), fs
					* ff2 / 10);
		}
		c c1 = new c();
		g2.setFont(d);
		g = 0;
		S._mthdo();
		c1 = _mthnew(cc, rr, false, g2, 1);
		final int hh = c1._fldif;
		c1 = new c();
		S._mthdo();
		c1 = _mthnew(cc, rr + hh, true, g2, 1);
		a(" ");
		if (z.equals("center")) {
		} else if (z.equals("right")) {
		}
		if (E.equals("middle")) {
		} else if (E.equals("bottom")) {
		}
		f = 1 + c1._flddo + 2 * g;
		H = 1 + c1._fldif + c1.a + 2 * g;
		if (f > width) {
		}
		if (H > height) {
		}
		Q = true;
		notify();
		return c1._fldif + c1.a;
	}

	private c _mthnew(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		return _mthtry(i1, j1, flag, g1, k1, true);
	}

	private c _mthtry(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1, final boolean flag1) {
		c c1 = new c();
		final c c2 = new c();
		boolean flag2 = true;
		boolean flag5 = false;
		int l1 = 0;
		while (!S._mthnew() && flag2) {
			D = S._mthint();
			if (A && flag) {
				l1 = S._mthif();
			}
			boolean flag4 = false;
			final int i2 = l1;
			final int j2 = D.y;
			switch (D.y) {
			case 4: // '\004'
			case 7: // '\007'
			case 8: // '\b'
			case 17: // '\021'
			case 51: // '3'
				if (c && flag) {
					if (l1 > o) {
						o = l1;
					}
					if (l1 < p) {
						p = l1;
					}
				}
				return c2;

			case 22: // '\026'
				c1 = _mthbyte(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 5: // '\005'
				c1 = a(i1 + c2._flddo, j1, flag, g1);
				break;

			case 15: // '\017'
				if (c && flag) {
					flag5 = true;
				}
				c1 = _mthif(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 50: // '2'
				if (c && flag) {
					flag5 = true;
				}
				c1 = _mthgoto(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 3: // '\003'
				c1 = _mthtry(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 123: // '{'
				if (c && flag) {
					flag5 = true;
				}
				c1 = _mthelse(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 1: // '\001'
				c1 = _mthnew(i1 + c2._flddo, j1, flag, g1);
				break;

			case 110: // 'n'
				c1 = _mthtry(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 108: // 'l'
				c1 = _mthint(i1 + c2._flddo, j1, flag, g1);
				break;

			case 12: // '\f'
				c1 = _mthfor(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 1001: // '\f'
				c1 = _mthfor(i1 + c2._flddo, j1, flag, g1, k1 - 1, true);
				break;

			case 115: // 's'
				c1 = _mthfor(i1 + c2._flddo, j1, flag, g1, k1, false);
				break;

			case 2: // '\002'
			case 9: // '\t'
				c1 = _mthif(i1 + c2._flddo, j1, flag, g1);
				break;

			case 18: // '\022'
				c1 = _mthif(i1 + c2._flddo, j1, flag, g1, k1, false);
				break;

			case 19: // '\023'
				c1 = _mthif(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 16: // '\020'
				if (c && flag) {
					flag5 = true;
				}
				c1 = _mthnull(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 24: // '\030'
				c1 = _mthfor(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 124: // '|'
				c1 = _mthdo(i1 + c2._flddo, j1, flag, g1);
				break;

			case 118: // 'v'
				c1 = a(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 119: // 'w'
				c1 = _mthlong(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 116: // 't'
				c1 = a(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 117: // 'u'
				c1 = a(i1 + c2._flddo, j1, flag, g1, k1, false);
				break;

			case 109: // 'm'
				c1 = _mthtry(i1 + c2._flddo, j1, flag, g1);
				break;

			case 113: // 'q'
				c1 = _mthfor(i1 + c2._flddo, j1, flag, g1);
				break;

			case 13: // '\r'
				if (c && flag) {
					flag5 = true;
				}
				c1 = _mthcase(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 120: // 'x'
				c1 = _mthchar(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 10: // '\n'
				c1 = _mthint(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 11: // '\013'
				c1 = _mthdo(i1 + c2._flddo, j1, flag, g1, k1, true);
				break;

			case 20: // '\024'
				c1 = _mthdo(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 14: // '\016'
				c1 = _mthint(i1 + c2._flddo, j1, flag, g1, k1);
				break;

			case 25: // '\031'
				c1 = new c(0, 0, 0);
				flag4 = true;
				break;

			case 99: // 'c'
			case 100: // 'd'
				c1 = new c(0, 0, 0);
				break;

			case 6: // '\006'
			case 21: // '\025'
			case 23: // '\027'
			case 26: // '\032'
			case 27: // '\033'
			case 28: // '\034'
			case 29: // '\035'
			case 30: // '\036'
			case 31: // '\037'
			case 32: // ' '
			case 33: // '!'
			case 34: // '"'
			case 35: // '#'
			case 36: // '$'
			case 37: // '%'
			case 38: // '&'
			case 39: // '\''
			case 40: // '('
			case 41: // ')'
			case 42: // '*'
			case 43: // '+'
			case 44: // ','
			case 45: // '-'
			case 46: // '.'
			case 47: // '/'
			case 48: // '0'
			case 49: // '1'
			case 52: // '4'
			case 53: // '5'
			case 54: // '6'
			case 55: // '7'
			case 56: // '8'
			case 57: // '9'
			case 58: // ':'
			case 59: // ';'
			case 60: // '<'
			case 61: // '='
			case 62: // '>'
			case 63: // '?'
			case 64: // '@'
			case 913:
			case 914:
			case 915:
			case 916:
			case 917:
			case 918:
			case 919:
			case 920:
			case 921:
			case 922:
			case 923:
			case 924:
			case 925:
			case 926:
			case 927:
			case 928:
			case 929:
			case 930:
			case 931:
			case 932:
			case 933:
			case 934:
			case 935:
			case 936:
			case 937:
			case 945:
			case 946:
			case 947:
			case 948:
			case 949:
			case 950:
			case 951:
			case 952:
			case 953:
			case 954:
			case 955:
			case 956:
			case 957:
			case 958:
			case 959:
			case 960:
			case 961:
			case 962:
			case 963:
			case 964:
			case 965:
			case 966:
			case 967:
			case 968:
			case 969:// GreekLetters (unicode)

			case 65: // 'A'
			case 66: // 'B'
			case 67: // 'C'
			case 68: // 'D'
			case 69: // 'E'
			case 70: // 'F'
			case 71: // 'G'
			case 72: // 'H'
			case 73: // 'I'
			case 74: // 'J'
			case 75: // 'K'
			case 76: // 'L'
			case 77: // 'M'
			case 78: // 'N'
			case 79: // 'O'
			case 80: // 'P'
			case 81: // 'Q'
			case 82: // 'R'
			case 83: // 'S'
			case 84: // 'T'
			case 85: // 'U'
			case 86: // 'V'
			case 87: // 'W'
			case 88: // 'X'
			case 89: // 'Y'
			case 90: // 'Z'
			case 91: // '['
			case 92: // '\\'
			case 93: // ']'
			case 94: // '^'
			case 95: // '_'
			case 96: // '`'
			case 97: // 'a'
			case 98: // 'b'
			case 101:// 'e'
			case 102: // 'f'
			case 103: // 'g'
			case 104: // 'h'
			case 105: // 'i'
			case 106: // 'j'
			case 107: // 'k'
			case 111: // 'o'
			case 112: // 'p'
			case 114: // 'r'
			default:
				printStatus("Parser: unknown token: " + D.y + " " + D.w);
				break;
			}
			if (flag) {
				if (A) {
					if (!c && i1 + c2._flddo <= _fldelse
							&& _fldelse <= i1 + c2._flddo + c1._flddo
							&& j1 - c1._fldif <= _fldchar
							&& _fldchar <= j1 + c1.a) {
						m = l = _fldelse;
						a = R = _fldchar;
						c = true;
						p = l1;
						o = l1;
					}
					if (!c && i1 + c2._flddo <= J
							&& J <= i1 + c2._flddo + c1._flddo
							&& j1 - c1._fldif <= I && I <= j1 + c1.a) {
						m = l = J;
						a = R = I;
						c = true;
						p = l1;
						o = l1;
						final int k2 = J;
						final int l2 = I;
						J = _fldelse;
						I = _fldchar;
						_fldelse = k2;
						_fldchar = l2;
					}
					if (c) {
						m = Math.min(m, i1 + c2._flddo);
						l = Math.max(l, i1 + c2._flddo + c1._flddo);
						a = Math.min(a, j1 - c1._fldif);
						R = Math.max(R, j1 + c1.a);
						if (F > k1) {
							F = k1;
						}
						switch (j2) {
						case 13: // '\r'
						case 15: // '\017'
						case 16: // '\020'
						case 50: // '2'
						case 123: // '{'
						case 124: // '|'
							flag5 = true;
							if (i2 > o) {
								o = i2;
							}
							if (i2 < p) {
								p = i2;
							}
							l1 = S._mthif();
							break;
						}
						if (l1 > o) {
							o = l1;
						}
						if (l1 < p) {
							p = l1;
						}
						if (i1 + c2._flddo <= J
								&& J <= i1 + c2._flddo + c1._flddo
								&& j1 - c1._fldif <= I && I <= j1 + c1.a
								&& F == k1) {
							A = false;
							c = false;
						}
					}
				}
				if (flag5) {
					m = Math.min(m, i1 + c2._flddo);
					l = Math.max(l, i1 + c2._flddo + c1._flddo);
					a = Math.min(a, j1 - c1._fldif);
					R = Math.max(R, j1 + c1.a);
					switch (j2) {
					case 13: // '\r'
					case 15: // '\017'
					case 16: // '\020'
					case 50: // '2'
					case 123: // '{'
					case 124: // '|'
						if (i2 > o) {
							o = i2;
						}
						if (i2 < p) {
							p = i2;
						}
						l1 = S._mthif();
						break;
					}
					if (l1 > o) {
						o = l1;
					}
					if (l1 < p) {
						p = l1;
					}
					flag5 = false;
				}
			}
			c2._flddo += c1._flddo;
			c2._fldif = Math.max(c2._fldif, c1._fldif);
			c2.a = Math.max(c2.a, c1.a);
			if (!flag1 && !flag4) {
				flag2 = false;
			}
		}
		return c2;
	}

	private c _mthbyte(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		int l1 = 0;
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final String s1 = D.w;
		if (flag) {
			l1 = S._mthif();
		}
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		final int i2 = Math.max(c1._flddo, fontmetrics.stringWidth(s1));
		final int j2 = c1._fldif + fontmetrics.getAscent() / 2;
		final int k2 = c1.a;
		if (flag) {
			S.a(l1);
			_mthtry(i1, j1, true, g1, k1, false);
			final int l2 = 3 * ((i2 - fontmetrics.stringWidth(s1)) / 4);
			if (s1.equals(".") | s1.equals("..")) {
				g1.drawString(s1, i1 + l2, j1 - fontmetrics.getAscent());
			} else if (s1.equals("\264") | s1.equals("`")) {
				g1.drawString(s1, i1 + l2, j1 - fontmetrics.getAscent() / 3);
			} else {
				g1.drawString(s1, i1 + l2, j1 - (fontmetrics.getAscent() * 2)
						/ 3);
			}
		}
		return new c(i2, j2, k2);
	}

	private c a(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		new c();
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final int k1 = g1.getFont().getSize() / 2;
		final int l1 = fontmetrics.getHeight() - fontmetrics.getDescent();
		final int i2 = fontmetrics.getDescent();
		if (flag) {
			final int j2 = (j1 - l1) + 1;
			final int k2 = (j1 + i2) - 1;
			final int l2 = (j2 + k2) / 2;
			if (D.w.equals("<")) {
				g1.drawLine(i1 + k1, j2, i1, l2);
				g1.drawLine(i1, l2, i1 + k1, k2);
			} else {
				g1.drawLine(i1, j2, i1 + k1, l2);
				g1.drawLine(i1 + k1, l2, i1, k2);
			}
		}
		return new c(k1, l1, i2);
	}

	private c _mthif(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int l2 = 0;
		final int ai[] = new int[100];
		final int ai1[] = new int[100];
		final int ai2[] = new int[100];
		new c();
		int i3 = 0;
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final int j3 = g1.getFont().getSize();
		if (flag) {
			i3 = S._mthif();
		}
		if (!a(3, "ARRAY: BeginSym")) {
			return new c(0, 0, 0);
		}
		for (int k3 = 0; k3 < 99; k3++) {
			int i2 = 0;
			int k2 = 0;
			for (int l3 = 0; l3 < 99; l3++) {
				final c c2 = _mthnew(i1, j1, false, g1, k1);
				i2 = Math.max(i2, c2._fldif);
				k2 = Math.max(k2, c2.a);
				ai[l3] = Math.max(ai[l3], c2._flddo + j3);
				if (D.y == 8 || D.y == 4) {
					break;
				}
			}

			ai1[k3] = Math.max(ai1[k3], i2);
			ai2[k3] = Math.max(ai2[k3], k2);
			l2 += i2 + k2;
			if (D.y == 4) {
				break;
			}
		}

		int i4 = 0;
		for (int j4 = 0; j4 < 99; j4++) {
			i4 += ai[j4];
		}

		if (flag) {
			S.a(i3);
			a(3, "ARRAY: Begin");
			int j2 = 0;
			for (int k4 = 0; k4 < 99; k4++) {
				int l1 = 0;
				if (k4 == 0) {
					j2 = ai1[k4];
				} else {
					j2 += ai2[k4 - 1] + ai1[k4];
				}
				for (int l4 = 0; l4 < 99; l4++) {
					_mthnew(i1 + l1, (j1 - l2 / 2 - fontmetrics.getDescent())
							+ j2, true, g1, k1);
					l1 += ai[l4];
					if (D.y == 8 || D.y == 4) {
						break;
					}
				}

				if (D.y == 4) {
					break;
				}
			}

		}
		return new c(i4 - j3, l2 / 2 + fontmetrics.getDescent(), l2 / 2
				- fontmetrics.getDescent());
	}

	private c _mthgoto(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int i2 = 0;
		int j3 = 0;
		final int ai[] = new int[100];
		final int ai1[] = new int[100];
		final int ai2[] = new int[100];
		final int ai3[] = new int[100];
		final int ai4[] = new int[100];
		int k3 = 0;
		int l3 = 0;
		int i4 = 0;
		new c();
		int j4 = 0;
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final int k5 = g1.getFont().getSize();
		int l5 = 0;
		boolean flag3 = false;
		boolean flag4 = true;
		boolean flag5 = true;
		if (!a(3)) {
			return new c(0, 0, 0);
		}
		if (S._mthint().w.equals("eqnarray")) {
			flag5 = false;
		}
		if (!a(4, "BEGIN: EndSym")) {
			return new c(0, 0, 0);
		}
		if (flag5) {
			j4 = S._mthif();
			if (!a(3)) {
				flag4 = false;
				S.a(j4);
			}
		}
		if (flag5 && flag4) {
			new e();
			for (e e2 = S._mthint(); e2.y != 4; e2 = S._mthint()) {
				final StringBuffer stringbuffer = new StringBuffer(e2.w);
				for (int i7 = 0; i7 < stringbuffer.length(); i7++) {
					switch (stringbuffer.charAt(i7)) {
					case 108: // 'l'
						ai3[l5] = 1;
						if (l5 < 99) {
							l5++;
						}
						break;

					case 99: // 'c'
						ai3[l5] = 2;
						if (l5 < 99) {
							l5++;
						}
						break;

					case 114: // 'r'
						ai3[l5] = 3;
						if (l5 < 99) {
							l5++;
						}
						break;

					case 64: // '@'
						ai3[l5] = 4;
						ai4[l5] = S._mthif();
						final c c2 = _mthtry(i1, j1, false, g1, k1, false);
						k3 += c2._flddo;
						l3 = Math.max(l3, c2._fldif);
						i4 = Math.max(i4, c2.a);
						if (l5 < 99) {
							l5++;
						}
						break;

					case 42: // '*'
						a(3, "Begin *{");
						int j6;
						try {
							j6 = Integer.parseInt(S._mthint().w);
						} catch (final NumberFormatException numberformatexception) {
							j6 = 0;
						}
						a(4, 3, "Begin }{");
						final int l7 = S._mthif();
						for (int j8 = 0; j8 < j6; j8++) {
							S.a(l7);
							for (e2 = S._mthint(); e2.y != 4; e2 = S._mthint()) {
								final StringBuffer stringbuffer1 = new StringBuffer(
										e2.w);
								for (int l8 = 0; l8 < stringbuffer1.length(); l8++) {
									switch (stringbuffer1.charAt(l8)) {
									case 108: // 'l'
										ai3[l5] = 1;
										if (l5 < 99) {
											l5++;
										}
										break;

									case 99: // 'c'
										ai3[l5] = 2;
										if (l5 < 99) {
											l5++;
										}
										break;

									case 114: // 'r'
										ai3[l5] = 3;
										if (l5 < 99) {
											l5++;
										}
										break;

									case 64: // '@'
										ai3[l5] = 4;
										ai4[l5] = S._mthif();
										final c c3 = _mthtry(i1, j1, false, g1,
												k1, false);
										k3 += c3._flddo;
										l3 = Math.max(l3, c3._fldif);
										i4 = Math.max(i4, c3.a);
										if (l5 < 99) {
											l5++;
										}
										break;

									default:
										printStatus("P: begin: illegal format 2");
										break;
									}
								}

							}

						}

						break;

					default:
						printStatus("P: begin: illegal format 1");
						break;
					}
				}

			}

		}
		if (!flag5) {
			ai3[0] = 3;
			ai3[1] = 2;
			ai3[2] = 1;
			l5 = 3;
		}
		for (int k6 = 0; k6 < l5 - 1; k6++) {
			if (ai3[k6] != 4 && ai3[k6 + 1] != 4) {
				i2 += k5 / 2;
			}
		}

		if (flag) {
			j4 = S._mthif();
		}
		for (int l6 = 0; l6 < 99; l6++) {
			int j2 = 0;
			int l2 = 0;
			for (int j7 = 0; j7 < 99; j7++) {
				final c c4 = _mthnew(i1, j1, false, g1, k1);
				j2 = Math.max(j2, c4._fldif);
				l2 = Math.max(l2, c4.a);
				ai[j7] = Math.max(ai[j7], c4._flddo);
				if (D.y == 8 || D.y == 51) {
					break;
				}
			}

			j2 = Math.max(j2, l3);
			l2 = Math.max(l2, i4);
			ai1[l6] = j2;
			ai2[l6] = l2;
			j3 += j2 + l2;
			if (D.y == 51) {
				break;
			}
		}

		for (int i6 = 0; i6 < 99; i6++) {
			i2 += ai[i6];
		}

		i2 += (2 * k5) / 2;
		if (flag) {
			S.a(j4);
			int k2 = 0;
			final int i3 = j3 / 2 + fontmetrics.getDescent();
			for (int k7 = 0; k7 < 99; k7++) {
				int l1 = k5 / 2;
				if (k7 == 0) {
					k2 = ai1[k7];
				} else {
					k2 += ai2[k7 - 1] + ai1[k7];
				}
				int i8 = 0;
				for (int k8 = 0; k8 < 99; k8++) {
					while (ai3[i8] == 4) {
						final int k4 = S._mthif();
						S.a(ai4[i8]);
						final c c5 = _mthtry(i1 + l1, (j1 - i3) + k2, true, g1,
								k1, false);
						l1 += c5._flddo;
						S.a(k4);
						i8++;
					}
					switch (ai3[i8]) {
					case 0: // '\0'
					case 1: // '\001'
						_mthnew(i1 + l1, (j1 - i3) + k2, true, g1, k1);
						i8++;
						break;

					case 2: // '\002'
						final int l4 = S._mthif();
						c c7 = _mthnew(i1, j1, false, g1, k1);
						S.a(l4);
						c7 = _mthnew(i1 + l1 + (ai[k8] - c7._flddo) / 2,
								(j1 - i3) + k2, true, g1, k1);
						i8++;
						break;

					case 3: // '\003'
						final int i5 = S._mthif();
						c c8 = _mthnew(i1, j1, false, g1, k1);
						S.a(i5);
						c8 = _mthnew((i1 + l1 + ai[k8]) - c8._flddo, (j1 - i3)
								+ k2, true, g1, k1);
						i8++;
						break;
					}
					if (ai3[i8] != 4) {
						l1 += k5 / 2;
					}
					l1 += ai[k8];
					boolean flag2 = false;
					flag3 = false;
					if (D.y == 8) {
						flag2 = true;
					} else if (D.y == 51) {
						flag2 = true;
						flag3 = true;
					}
					for (; ai3[i8] == 4; i8++) {
						final int j5 = S._mthif();
						S.a(ai4[i8]);
						final c c9 = _mthtry(i1 + l1, (j1 - i3) + k2, true, g1,
								k1, false);
						l1 += c9._flddo;
						S.a(j5);
					}

					if (flag2) {
						break;
					}
				}

				if (flag3) {
					break;
				}
			}

		}
		if (!a(3, "BEGIN 2: begin")) {
			return new c(0, 0, 0);
		}
		S._mthint();
		if (!a(4, "BEGIN 2: end")) {
			return new c(0, 0, 0);
		} else {
			return new c(i2 + k3, j3 / 2 + fontmetrics.getDescent(), j3 / 2
					- fontmetrics.getDescent());
		}
	}

	private c _mthelse(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		final int l1 = g1.getFont().getSize() / 2;
		c1 = _mthtry(i1 + l1, j1, flag, g1, k1, false);
		if (flag) {
			g1.drawRect(i1 + l1 / 2, j1 - c1._fldif - l1 / 2, c1._flddo + l1,
					c1._fldif + c1.a + l1);
		}
		return new c(c1._flddo + l1 + l1, c1._fldif + l1, c1.a + l1);
	}

	private c _mthfor(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1, final boolean flag1) {
		int l1 = 0;
		new c();
		c c3 = new c();
		c c4 = new c();
		int i2 = 0;
		final Font font = g1.getFont();
		font.getSize();
		a(g1, k1 + 1);
		final FontMetrics fontmetrics = g1.getFontMetrics();
		if (flag) {
			i2 = S._mthif();
		}
		c3 = _mthtry(i1, j1, false, g1, k1 + 1, false);
		int k2 = c3._fldif + c3.a;
		c4 = _mthtry(i1, j1, false, g1, k1 + 1, false);
		int l2 = Math.max(c3._flddo, c4._flddo);
		int i3 = c4._fldif + c4.a;
		final Font font1 = g1.getFont();
		final int j3 = (3 * font1.getSize()) / 18;
		l2 += 2 * j3;
		if (fontmetrics.getAscent() < i3) {
			l1 = fontmetrics.getAscent() / 2;
		}
		k2 += 2 + l1;
		i3 += 1 - l1;
		if (flag) {
			S.a(i2);
			if (flag1) {
				g1.drawLine(i1 + j3, j1 - l1, (i1 + l2) - j3, j1 - l1);
			}
			_mthtry(i1 + (l2 - c3._flddo) / 2, j1 - 2 - c3.a - l1, true, g1,
					k1 + 1, false);
			if (c && k1 < F) {
				F = k1;
			}
			_mthtry(i1 + (l2 - c4._flddo) / 2, (j1 + 1 + c4._fldif) - l1, true,
					g1, k1 + 1, false);
		}
		a(g1, k1);
		return new c(l2, k2, i3);
	}

	private c _mthnew(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		final FontMetrics fontmetrics = g1.getFontMetrics();
		if (flag) {
			g1.drawString(D.w, i1, j1);
			// System.out.println(g1.getFont());
			// System.out.println("5: "+D.w);
		}
		final int k1 = fontmetrics.stringWidth(D.w);
		final int l1 = fontmetrics.getHeight() - fontmetrics.getDescent();
		final int i2 = fontmetrics.getDescent();
		return new c(k1, l1, i2);
	}

	private void a(final Graphics2D g1, final int i1, final int j1, final int k1,
			final int l1, final int i2) {
		g1.drawArc(i1 - k1, j1 - k1, 2 * k1, 2 * k1, l1, i2);
	}

	private void a(final Graphics2D g1, final String s1, final int i1,
			final int j1, final int k1, final int l1, final int i2, final int j2) {
		final int k2 = j1 / 2;
		final int l2 = i1 + k2;
		final int i3 = i1 + j1;
		final int j3 = i1 + k2 / 2;
		final int k3 = l2 + k2 / 2;
		final int l3 = (k1 + l1) / 2;
		final int i4 = (int) ((double) k2 * 0.86602540378444004D);
		final int j4 = k1 + i4;
		final int k4 = l1 - i4;
		if (s1.equals("[")) {
			g1.drawLine(j3, k1, j3, l1);
			g1.drawLine(j3, l1, k3, l1);
			g1.drawLine(j3, k1, k3, k1);
		} else if (s1.equals("]")) {
			g1.drawLine(k3, k1, k3, l1);
			g1.drawLine(j3, l1, k3, l1);
			g1.drawLine(j3, k1, k3, k1);
		} else if (s1.equals("|")) {
			g1.drawLine(l2, k1, l2, l1);
		} else if (s1.equals("||")) {
			final int l4 = l2 + i2 / 4;
			g1.drawLine(l2, k1, l2, l1);
			g1.drawLine(l4, k1, l4, l1);
		} else if (s1.equals("(")) {
			for (int i5 = j2; i5 < 2 + j2; i5++) {
				final int i6 = j3 + i5;
				a(g1, k3 + i5, j4, k2, 180, -60);
				g1.drawLine(i6, j4, i6, k4);
				a(g1, k3 + i5, k4, k2, 180, 60);
			}

		} else if (s1.equals(")")) {
			for (int j5 = j2; j5 < 2 + j2; j5++) {
				final int j6 = k3 + j5;
				a(g1, j3 + j5, j4, k2, 0, 60);
				g1.drawLine(j6, j4, j6, k4);
				a(g1, j3 + j5, k4, k2, 0, -60);
			}

		} else if (s1.equals("<")) {
			g1.drawLine(j3, l3, k3, k1);
			g1.drawLine(j3, l3, k3, l1);
		} else if (s1.equals(">")) {
			g1.drawLine(k3, l3, j3, k1);
			g1.drawLine(k3, l3, j3, l1);
		} else if (s1.equals("{")) {
			for (int k5 = j2; k5 < 2 + j2; k5++) {
				final int k6 = l2 + k5;
				a(g1, i3 + k5, j4, k2, 180, -60);
				g1.drawLine(k6, j4, k6, l3 - k2);
				a(g1, i1 + k5, l3 - k2, k2, 0, -90);
				a(g1, i1 + k5, l3 + k2, k2, 0, 90);
				g1.drawLine(k6, l3 + k2, k6, k4);
				a(g1, i3 + k5, k4, k2, 180, 60);
			}

		} else if (s1.equals("}")) {
			for (int l5 = j2; l5 < 2 + j2; l5++) {
				final int l6 = l2 + l5;
				a(g1, i1 + l5, j4, k2, 0, 60);
				g1.drawLine(l6, j4, l6, l3 - k2);
				a(g1, i3 + l5, l3 - k2, k2, -180, 90);
				a(g1, i3 + l5, l3 + k2, k2, 180, -90);
				g1.drawLine(l6, l3 + k2, l6, k4);
				a(g1, i1 + l5, k4, k2, 0, -60);
			}

		}
	}

	private c _mthnull(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int l1 = 0;
		int i2 = 0;
		c c1 = new c();
		int j2 = 0;
		final Font font = g1.getFont();
		final int k2 = font.getSize();
		final int l2 = (int) (2.0F * (float) k2);
		int i3 = k2 / 9;
		if (flag) {
			j2 = S._mthif();
		}
		final String s1 = S._mthint().w;
		c1 = _mthnew(i1, j1, false, g1, k1);
		final int j3 = c1._flddo;
		int k3 = c1._fldif;
		int l3 = c1.a;
		final int i4 = (j1 - k3) + 1;
		final int j4 = (j1 + l3) - 1;
		final String s3 = S._mthint().w;
		final int k4 = (k3 + l3) - 2;
		final Font font1 = new Font(font.getFamily(), font.getStyle(), k4);
		g1.setFont(font1);
		final FontMetrics fontmetrics = g1.getFontMetrics();
		if (s1.equals("<") || s1.equals(">")) {
			l1 = k2;
		} else if (k4 < l2) {
			l1 = fontmetrics.stringWidth(s1);
			if ("([{)]}".indexOf(s1) >= 0) {
				l1 += i3;
			}
		} else {
			l1 = k2;
		}
		if (s3.equals("<") || s3.equals(">")) {
			i2 = k2;
		} else if (k4 < l2) {
			i2 = fontmetrics.stringWidth(s3);
			if ("([{)]}".indexOf(s3) >= 0) {
				i2 += i3;
			}
		} else {
			i2 = k2;
		}
		g1.setFont(font);
		final int l4 = S._mthif();
		int j5 = 0;
		int k5 = 0;
		if (S._mthint().y == 11) {
			final c c2 = _mthdo(i1, j1, false, g1, k1, false);
			j5 = c2._flddo;
			k5 = (j4 + c2._fldif) - (c2._fldif + c2.a) / 2;
			l3 += (c2._fldif + c2.a) / 2;
		} else {
			S.a(l4);
		}
		final int l5 = S._mthif();
		int j6 = 0;
		int k6 = 0;
		if (S._mthint().y == 10) {
			final c c3 = _mthint(i1, j1, false, g1, k1, false);
			j6 = c3._flddo;
			k6 = (i4 + c3._fldif) - (c3._fldif + c3.a) / 2;
			k3 += (c3._fldif + c3.a) / 2;
		} else {
			S.a(l5);
		}
		j5 = Math.max(j5, j6);
		if (flag) {
			S.a(j2);
			final String s2 = S._mthint().w;
			if (!s2.equals(".")) {
				if (k4 < l2 && !s2.equals("<") && !s2.equals(">")) {
					g1.setFont(font1);
					g1.drawString(s2, i1, j4 - fontmetrics.getDescent()
							- fontmetrics.getLeading() / 2);
					g1.setFont(font);
				} else {
					a(g1, s2, i1, l1, i4, j4, k2, 0);
				}
			}
			_mthnew(i1 + l1, j1, true, g1, k1);
			final String s4 = S._mthint().w;
			if (!s4.equals(".")) {
				if (k4 < l2 && !s4.equals("<") && !s4.equals(">")) {
					g1.setFont(font1);
					if ("([{)]}".indexOf(s4) < 0) {
						i3 = 0;
					}
					g1.drawString(s4, i1 + j3 + l1 + i3, j4
							- fontmetrics.getDescent()
							- fontmetrics.getLeading() / 2);
					// System.out.println("2: "+s4);
					g1.setFont(font);
				} else {
					a(g1, s4, i1 + j3 + l1, i2, i4, j4, -k2, -1);
				}
			}
			final int i5 = S._mthif();
			if (a(11)) {
				_mthdo(i1 + j3 + l1 + i2, k5, true, g1, k1, false);
			} else {
				S.a(i5);
			}
			final int i6 = S._mthif();
			if (a(10)) {
				_mthint(i1 + j3 + l1 + i2, k6, true, g1, k1, false);
			} else {
				S.a(i6);
			}
		}
		return new c(j3 + l1 + i2 + j5, k3 + 2, l3 + 2);
	}

	private c _mthfor(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int l1 = 0;
		new c();
		int i2 = 0;
		int j2 = 0;
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final String s1 = D.w;
		final int k2 = S._mthif();
		final int l2 = l1 = fontmetrics.stringWidth(s1);
		final int i3 = fontmetrics.getHeight() - fontmetrics.getDescent();
		int j3 = fontmetrics.getDescent();
		if (a(11)) {
			final c c2 = _mthdo(i1, j1, false, g1, k1, false);
			i2 = c2._flddo;
			l1 = Math.max(l1, c2._flddo);
			j2 = c2._fldif;
			j3 = c2._fldif + c2.a;
		} else {
			S.a(k2);
		}
		if (flag) {
			S.a(k2);
			g1.drawString(s1, i1 + (l1 - l2) / 2, j1);
			if (a(11)) {
				_mthdo(i1 + (l1 - i2) / 2, j1 + j2, true, g1, k1, false);
			} else {
				S.a(k2);
			}
		}
		return new c(l1, i3, j3);
	}

	private c _mthdo(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		int k1 = 0;
		int l1 = 0;
		int i2 = 0;
		new c();
		if (!a(3)) {
			return new c(0, 0, 0);
		}
		while (!S._mthnew()) {
			D = S._mthint();
			if (D.y == 4) {
				break;
			}
			final c c2 = _mthif(i1 + k1, j1, flag, g1);
			k1 += c2._flddo;
			l1 = Math.max(l1, c2._fldif);
			i2 = Math.max(i2, c2.a);
		}
		return new c(k1, l1, i2);
	}

	private c _mthtry(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		c1 = _mthtry(i1, j1, flag, g1, k1, false);
		if (flag) {
			g1.drawLine(i1 + c1._flddo / 4, j1 + c1.a,
					i1 + (c1._flddo * 3) / 4, j1 - c1._fldif);
		}
		return c1;
	}

	private c _mthint(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		final FontMetrics fontmetrics = g1.getFontMetrics();
		if (flag) {
			g1.drawString(D.w, i1 + 1, j1);
			// System.out.println("3: "+D.w);
		}
		return new c(fontmetrics.stringWidth(D.w) + 2, fontmetrics.getHeight()
				- fontmetrics.getDescent(), fontmetrics.getDescent());
	}

	private c a(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int l1 = 0;
		c c1 = new c();
		final int i2 = g1.getFont().getSize() / 4;
		final int j2 = i2 / 2;
		int k2 = 0;
		int l2 = 0;
		int i3 = 0;
		if (flag) {
			l1 = S._mthif();
		}
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		int j3 = c1._flddo;
		final int k3 = j3 / 2;
		int l3 = k3;
		int i4 = c1._fldif;
		final int j4 = c1.a;
		final int k4 = S._mthif();
		if (a(10)) {
			final c c2 = _mthint(i1, j1, false, g1, k1, false);
			k2 = c2._flddo;
			l3 = Math.max(l3, k2 / 2);
			l2 = i4 + c2.a;
			i3 = c2._fldif + c2.a;
		} else {
			S.a(k4);
		}
		if (flag) {
			S.a(l1);
			final int i5 = (i1 + l3) - k3;
			_mthtry(i5, j1, true, g1, k1, false);
			final int j5 = (int) ((double) i2 * 0.86602540378444004D);
			for (int k5 = 0; k5 < 2; k5++) {
				final int l5 = (j1 - i4 - j2) + k5;
				a(g1, i5 + j5, l5 + i2, i2, 90, 60);
				g1.drawLine(i5 + j5, l5, (i5 + k3) - i2, l5);
				a(g1, (i5 + k3) - i2, l5 - i2, i2, 0, -90);
				a(g1, i5 + k3 + i2, l5 - i2, i2, -90, -90);
				g1.drawLine(i5 + k3 + i2, l5, (i5 + j3) - j5, l5);
				a(g1, (i5 + j3) - j5, l5 + i2, i2, 90, -60);
			}

			final int l4 = S._mthif();
			if (a(10)) {
				_mthint((i1 + l3) - k2 / 2, j1 - l2 - i2 - j2, true, g1, k1,
						false);
			} else {
				S.a(l4);
			}
		}
		i4 += i3 + i2 + j2;
		j3 = Math.max(j3, k2);
		return new c(j3, i4, j4);
	}

	private c _mthlong(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		int l1 = 0;
		c c1 = new c();
		final int i2 = g1.getFont().getSize() / 4;
		final int j2 = i2 / 2;
		int k2 = 0;
		int l2 = 0;
		int i3 = 0;
		if (flag) {
			l1 = S._mthif();
		}
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		int j3 = c1._flddo;
		final int k3 = j3 / 2;
		int l3 = k3;
		final int i4 = c1._fldif;
		int j4 = c1.a;
		final int k4 = S._mthif();
		if (a(11)) {
			final c c2 = _mthdo(i1, j1, false, g1, k1, false);
			k2 = c2._flddo;
			l3 = Math.max(l3, k2 / 2);
			l2 = j4 + c2._fldif;
			i3 = c2._fldif + c2.a;
		} else {
			S.a(k4);
		}
		if (flag) {
			S.a(l1);
			final int i5 = (i1 + l3) - k3;
			_mthtry(i5, j1, true, g1, k1, false);
			final int j5 = (int) ((double) i2 * 0.86602540378444004D);
			for (int k5 = 0; k5 < 2; k5++) {
				final int l5 = (j1 + j4 + j2) - k5;
				a(g1, i5 + j5, l5 - i2, i2, -90, -60);
				g1.drawLine(i5 + j5, l5, (i5 + k3) - i2, l5);
				a(g1, (i5 + k3) - i2, l5 + i2, i2, 90, -90);
				a(g1, i5 + k3 + i2, l5 + i2, i2, 90, 90);
				g1.drawLine(i5 + k3 + i2, l5, (i5 + j3) - j5, l5);
				a(g1, (i5 + j3) - j5, l5 - i2, i2, -90, 60);
			}

			final int l4 = S._mthif();
			if (S._mthint().y == 11) {
				_mthdo((i1 + l3) - k2 / 2, j1 + l2 + i2 + j2, true, g1, k1,
						false);
			} else {
				S.a(l4);
			}
		}
		j4 += i3 + i2 + j2;
		j3 = Math.max(j3, k2);
		return new c(j3, i4, j4);
	}

	private c a(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1, final boolean flag1) {
		int l1 = 0;
		c c1 = new c();
		if (flag) {
			l1 = S._mthif();
		}
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		if (flag1) {
			c1._fldif += 2;
		} else {
			c1.a += 2;
		}
		final int i2 = c1._fldif;
		final int j2 = c1.a;
		if (flag) {
			S.a(l1);
			if (flag1) {
				g1.drawLine(i1 + 1, (j1 - i2) + 2, (i1 + c1._flddo) - 1,
						(j1 - i2) + 2);
			} else {
				g1.drawLine(i1, (j1 + j2) - 2, i1 + c1._flddo, (j1 + j2) - 2);
			}
			c1 = _mthtry(i1, j1, true, g1, k1, false);
		}
		return new c(c1._flddo, i2, j2);
	}

	private c _mthtry(int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		final FontMetrics fontmetrics = g1.getFontMetrics();
		final int k1 = g1.getFont().getSize() / 9;
		int l1 = fontmetrics.stringWidth(D.w);
		final int i2 = "([{)]}".indexOf(D.w);
		if (i2 >= 0) {
			l1 += k1;
			if (i2 > 2) {
				i1 += k1;
			}
		}
		if (flag) {
			g1.drawString(D.w, i1, j1);
			// System.out.println("2: "+D.w);
		}
		return new c(l1, fontmetrics.getHeight() - fontmetrics.getDescent(),
				fontmetrics.getDescent());
	}

	private c _mthif(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		final FontMetrics fontmetrics = g1.getFontMetrics();
		if (flag) {
			g1.drawString(D.w, i1, j1);
			// System.out.println(g1.getFont());
			// System.out.println("1: "+D.w);
		}
		return new c(fontmetrics.stringWidth(D.w), fontmetrics.getHeight()
				- fontmetrics.getDescent(), fontmetrics.getDescent());
	}

	private c _mthfor(final int i1, final int j1, final boolean flag,
			final Graphics2D g1) {
		int k1 = 0;
		final Font font = g1.getFont();
		try {
			k1 = Integer.parseInt(D.w);
		} catch (final NumberFormatException numberformatexception) {
			k1 = 0;
		}
		k1 = (k1 * font.getSize()) / 18;
		return new c(k1, 0, 0);
	}

	private c _mthcase(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		int l1 = 0;
		final FontMetrics fontmetrics = g1.getFontMetrics();
		int i2 = 0;
		int k2 = 0;
		int l2 = 0;
		boolean flag2 = false;
		if (flag) {
			l1 = S._mthif();
		}
		final int i3 = fontmetrics.stringWidth("A");
		final int j3 = i3 / 2;
		final int k3 = S._mthif();
		e e1 = new e();
		e1 = S._mthint();
		if (e1.w.equals("[")) {
			a(g1, k1 + 1);
			c1 = _mthtry(i1, j1, false, g1, k1 + 1, true);
			a(g1, k1);
			i2 = c1._flddo;
			final int j2 = c1._fldif;
			k2 = c1.a;
			l2 = k2 + j2;
			flag2 = true;
		} else {
			S.a(k3);
		}
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		int l3 = c1._flddo + i3;
		int i4 = c1._fldif + 2;
		final int j4 = c1.a;
		if (flag2 & (i2 > j3)) {
			l3 += i2 - j3;
		}
		if (flag) {
			S.a(l1);
			int k4 = 0;
			if (flag2 & (i2 > j3)) {
				k4 = i2 - j3;
			}
			g1.drawLine(i1 + k4 + 1, j1 - i4 / 2, i1 + k4 + j3, (j1 + j4) - 1);
			g1.drawLine(i1 + k4 + j3, (j1 + j4) - 1, (i1 + k4 + i3) - 2,
					(j1 - i4) + 2);
			g1.drawLine((i1 + k4 + i3) - 2, (j1 - i4) + 2, i1 + l3,
					(j1 - i4) + 2);
			if (flag2) {
				S._mthint();
				a(g1, k1 + 1);
				if (i2 >= j3) {
					g1.drawLine(i1 + 1, j1 - i4 / 2, i1 + k4 + 1, j1 - i4 / 2);
					_mthtry(i1 + 1, j1 - i4 / 2 - k2 - 1, true, g1, k1 + 1,
							true);
				} else {
					_mthtry(i1 + 1 + (j3 - i2), j1 - i4 / 2 - k2 - 1, true, g1,
							k1 + 1, true);
				}
				a(g1, k1);
			}
			_mthtry(i1 + k4 + i3, j1, true, g1, k1, false);
		}
		if (flag2 & (i4 / 2 < l2)) {
			i4 = i4 / 2 + l2;
		}
		return new c(l3, i4, j4);
	}

	private c _mthchar(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		int l1 = 0;
		final int i2 = g1.getFontMetrics().getLeading();
		if (flag) {
			l1 = S._mthif();
		}
		c1 = _mthint(i1, j1, false, g1, k1, true);
		int j2 = c1._flddo;
		final int k2 = c1._flddo;
		int l2 = (c1._fldif + c1.a) - i2;
		int i3 = c1.a - i2;
		c1 = _mthtry(i1, j1, false, g1, k1, false);
		j2 = Math.max(j2, c1._flddo);
		final int j3 = j2 / 2;
		final int k3 = c1._flddo;
		l2 += c1._fldif;
		final int l3 = c1.a;
		i3 += c1._fldif;
		if (flag) {
			S.a(l1);
			_mthint((i1 + j3) - k2 / 2, j1 - i3, true, g1, k1, false);
			_mthtry((i1 + j3) - k3 / 2, j1, true, g1, k1, false);
		}
		return new c(j2, l2, l3);
	}

	private c _mthdo(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1, final boolean flag1) {
		int l1 = 0;
		int i2 = 0;
		c c1 = new c();
		int j2 = 0;
		final int l2 = g1.getFontMetrics().getAscent() / 2;
		if (flag) {
			j2 = S._mthif();
		}
		a(g1, k1 + 1);
		c1 = _mthtry(i1, j1, false, g1, k1 + 1, false);
		int i3 = c1._flddo;
		if (flag1) {
			l1 = l2 - 1;
			i2 = (c1._fldif + c1.a) - l1;
		} else {
			i2 = c1._fldif + c1.a;
		}
		if (flag) {
			S.a(j2);
			if (flag1) {
				c1 = _mthtry(i1, (j1 + c1._fldif) - l1, true, g1, k1 + 1, false);
			} else {
				c1 = _mthtry(i1, j1 + c1._fldif, true, g1, k1 + 1, false);
			}
		}
		a(g1, k1);
		if (flag1) {
			final int k2 = S._mthif();
			if (a(10)) {
				final c c2 = _mthint(i1, j1, flag, g1, k1, true);
				i3 = Math.max(i3, c2._flddo);
				l1 = Math.max(l1, c2._fldif);
			} else {
				S.a(k2);
			}
		}
		return new c(i3, l1, i2);
	}

	private c _mthint(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1, final boolean flag1) {
		int l1 = 0;
		int i2 = 0;
		c c1 = new c();
		int j2 = 0;
		final int l2 = g1.getFontMetrics().getAscent() / 2;
		if (flag) {
			j2 = S._mthif();
		}
		a(g1, k1 + 1);
		c1 = _mthtry(i1, j1, false, g1, k1 + 1, false);
		int i3 = c1._flddo;
		if (flag1) {
			i2 = -l2 - 1;
			l1 = (c1._fldif + c1.a) - i2;
		} else {
			l1 = c1._fldif + c1.a;
		}
		if (flag) {
			S.a(j2);
			if (flag1) {
				c1 = _mthtry(i1, (j1 - c1.a) + i2, true, g1, k1 + 1, false);
			} else {
				c1 = _mthtry(i1, j1 - c1.a, true, g1, k1 + 1, false);
			}
		}
		a(g1, k1);
		if (flag1) {
			final int k2 = S._mthif();
			if (a(11)) {
				final c c2 = _mthdo(i1, j1, flag, g1, k1, true);
				i3 = Math.max(i3, c2._flddo);
				i2 = Math.max(i2, c2.a);
			} else {
				S.a(k2);
			}
		}
		return new c(i3, l1, i2);
	}

	private Image _mthif(final Graphics2D g1, final int i1) {
		final String s1 = D.w + j[i1 - 1] + g1.getColor().getRGB();
		if (!w.containsKey(s1)) {
			final String s2 = "Fonts/Greek" + j[i1 - 1] + "/" + D.w + ".gif";
			final Image image = _flddo.a(s2, g1);
			final int j1 = S._mthif();
			B.addImage(image, j1);
			a("Loading " + D.w);
			try {
				B.waitForID(j1, 10000L);
			} catch (final InterruptedException interruptedexception) {
			}
			if (B.isErrorID(j1)) {
				a("Error loading " + D.w);
			} else {
				w.put(s1, image);
			}
			return image;
		} else {
			return (Image) w.get(s1);
		}
	}

	private c _mthif(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, int k1, final boolean flag1) {
		final FontMetrics fontmetrics = g1.getFontMetrics();
		k1 = Math.min(k1, j.length);
		final Image image = _mthif(g1, k1);
		int l1 = image.getWidth(PC);
		if (l1 < 0) {
			l1 = fontmetrics.getMaxAdvance();
		}
		if (flag) {
			int i2 = 0;
			if (flag1) {
				i2 = _fldfor[k1 - 1];
			}
			g1.drawImage(image, i1, (j1 - image.getHeight(PC)) + i2, PC);
		}
		return new c(l1, fontmetrics.getHeight() - fontmetrics.getDescent(),
				fontmetrics.getDescent());
	}

	private c _mthdo(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, int k1) {
		int l1 = 0;
		new c();
		int i2 = 0;
		int j2 = 0;
		int k2 = 0;
		int l2 = 0;
		int i3 = 0;
		final int j3 = g1.getFontMetrics().getAscent();
		k1 = Math.min(k1, j.length);
		final Image image = _mthif(g1, k1);
		int k3 = l1 = image.getWidth(PC);
		int l3 = image.getHeight(PC);
		if (l3 < 0) {
			l3 = 2 * j3;
			k3 = l1 = j3;
		}
		int i4 = (int) ((double) (l3 / 2) - 0.40000000000000002D * (double) j3);
		int j4 = i3 = l3 - i4;
		final int k4 = S._mthif();
		if (a(11)) {
			final c c2 = _mthdo(i1, j1, false, g1, k1, false);
			k2 = c2._flddo;
			l1 = Math.max(l1, c2._flddo);
			i2 = i4 + c2._fldif;
			i4 += c2._fldif + c2.a;
		} else {
			S.a(k4);
		}
		final int l4 = S._mthif();
		if (a(10)) {
			final c c3 = _mthint(i1, j1, false, g1, k1, false);
			l2 = c3._flddo;
			l1 = Math.max(l1, c3._flddo);
			j2 = j4 + c3.a;
			j4 += c3._fldif + c3.a;
		} else {
			S.a(l4);
		}
		if (flag) {
			S.a(k4);
			g1.drawImage(image, i1 + (l1 - k3) / 2, j1 - i3, PC);
			if (a(11)) {
				_mthdo(i1 + (l1 - k2) / 2, j1 + i2, true, g1, k1, false);
			} else {
				S.a(k4);
			}
			final int i5 = S._mthif();
			if (a(10)) {
				_mthint(i1 + (l1 - l2) / 2, j1 - j2, true, g1, k1, false);
			} else {
				S.a(i5);
			}
		}
		return new c(l1, j4, i4);
	}

	private c _mthint(final int i1, final int j1, final boolean flag,
			final Graphics2D g1, final int k1) {
		c c1 = new c();
		final int l1 = g1.getFont().getSize();
		final String s1 = D.w;
		c1 = _mthtry(i1, j1, flag, g1, k1, false);
		final int i2 = c1._flddo;
		final int j2 = i2 / 2;
		final int k2 = l1 / 4;
		final int l2 = c1._fldif + k2;
		final int i3 = c1.a;
		if (flag) {
			final int j3 = (j1 - l2) + k2;
			final int k3 = l1 / 8;
			final int l3 = i1 + i2;
			final int i4 = i1 + j2;
			if (s1.equals("")) {
				g1.drawLine(i1, j3, l3, j3);
				g1.drawLine(i1 + (int) ((double) i2 * 0.80000000000000004D), j3
						- k3, l3, j3);
				g1.drawLine(i1 + (int) ((double) i2 * 0.80000000000000004D), j3
						+ k3, l3, j3);
			} else if (s1.equals("bar")) {
				g1.drawLine(i1, j3, l3, j3);
			} else if (s1.equals("widehat")) {
				g1.drawLine(i1, j3, i4, j3 - k2);
				g1.drawLine(i4, j3 - k2, l3, j3);
			} else if (s1.equals("widetilde")) {
				int k4 = 0;
				for (int l4 = 1; l4 < j2; l4++) {
					final int j4 = k4;
					k4 = (int) ((double) k3 * Math
							.sin((4.0840704496667311D * (double) l4)
									/ (double) j2));
					g1.drawLine((i4 + l4) - 1, j3 + j4, i4 + l4, j3 + k4);
					g1.drawLine((i4 - l4) + 1, j3 - j4, i4 - l4, j3 - k4);
				}

			}
		}
		return new c(i2, l2 + 2, i3);
	}

	private boolean a(final int i1) {
		return a(i1, "");
	}

	private boolean a(final int i1, final String s1) {
		int j1;
		while ((j1 = S._mthint().y) == 25) {
		}
		if (j1 == i1) {
			return true;
		}
		if (!s1.equals("")) {
			printStatus("Parser: " + s1 + " not found");
		}
		return false;
	}

	private boolean a(final int i1, final int j1, final String s1) {
		int k1;
		while ((k1 = S._mthint().y) == 25) {
		}
		boolean flag = k1 == i1;
		while ((k1 = S._mthint().y) == 25) {
		}
		flag = k1 == j1;
		if (!flag && !s1.equals("")) {
			printStatus("Parser: " + s1 + " not found");
		}
		return flag;
	}

	private void a(final Graphics2D g1, final int i1) {
		if (i1 <= 1) {
			g1.setFont(d);
		} else if (i1 == 2) {
			g1.setFont(b);
		} else if (i1 == 3) {
			g1.setFont(_fldnull);
		} else {
			g1.setFont(_fldlong);
		}
	}

}
