// Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) final class Censor { public static void loadConfig(StreamLoader streamLoader) { Stream stream = new Stream(streamLoader.getDataForName("fragmentsenc.txt")); Stream stream_1 = new Stream(streamLoader.getDataForName("badenc.txt")); Stream stream_2 = new Stream(streamLoader.getDataForName("domainenc.txt")); Stream stream_3 = new Stream(streamLoader.getDataForName("tldlist.txt")); readValues(stream, stream_1, stream_2, stream_3); } private static void readValues(Stream stream, Stream stream_1, Stream stream_2, Stream stream_3) { readBadEnc(stream_1); readDomainEnc(stream_2); readFragmentsEnc(stream); readTldList(stream_3); } private static void readTldList(Stream stream) { int i = stream.readDWord(); aCharArrayArray624 = new char[i][]; anIntArray625 = new int[i]; for (int j = 0; j < i; j++) { anIntArray625[j] = stream.readUnsignedByte(); char ac[] = new char[stream.readUnsignedByte()]; for (int k = 0; k < ac.length; k++) { ac[k] = (char) stream.readUnsignedByte(); } aCharArrayArray624[j] = ac; } } private static void readBadEnc(Stream stream) { int j = stream.readDWord(); aCharArrayArray621 = new char[j][]; aByteArrayArrayArray622 = new byte[j][][]; method493(stream, aCharArrayArray621, aByteArrayArrayArray622); } private static void readDomainEnc(Stream stream) { int i = stream.readDWord(); aCharArrayArray623 = new char[i][]; method494(aCharArrayArray623, stream); } private static void readFragmentsEnc(Stream stream) { anIntArray620 = new int[stream.readDWord()]; for (int i = 0; i < anIntArray620.length; i++) { anIntArray620[i] = stream.readUnsignedWord(); } } private static void method493(Stream stream, char ac[][], byte abyte0[][][]) { for (int j = 0; j < ac.length; j++) { char ac1[] = new char[stream.readUnsignedByte()]; for (int k = 0; k < ac1.length; k++) { ac1[k] = (char) stream.readUnsignedByte(); } ac[j] = ac1; byte abyte1[][] = new byte[stream.readUnsignedByte()][2]; for (int l = 0; l < abyte1.length; l++) { abyte1[l][0] = (byte) stream.readUnsignedByte(); abyte1[l][1] = (byte) stream.readUnsignedByte(); } if (abyte1.length > 0) { abyte0[j] = abyte1; } } } private static void method494(char ac[][], Stream stream) { for (int j = 0; j < ac.length; j++) { char ac1[] = new char[stream.readUnsignedByte()]; for (int k = 0; k < ac1.length; k++) { ac1[k] = (char) stream.readUnsignedByte(); } ac[j] = ac1; } } private static void method495(char ac[]) { int i = 0; for (int j = 0; j < ac.length; j++) { if (method496(ac[j])) { ac[i] = ac[j]; } else { ac[i] = ' '; } if (i == 0 || ac[i] != ' ' || ac[i - 1] != ' ') { i++; } } for (int k = i; k < ac.length; k++) { ac[k] = ' '; } } private static boolean method496(char c) { return c >= ' ' && c <= '\177' || c == ' ' || c == '\n' || c == '\t' || c == '\243' || c == '\u20AC'; } public static String doCensor(String s) { System.currentTimeMillis(); char ac[] = s.toCharArray(); method495(ac); String s1 = new String(ac).trim(); ac = s1.toLowerCase().toCharArray(); String s2 = s1.toLowerCase(); method505(ac); method500(ac); method501(ac); method514(ac); for (String exception : exceptions) { for (int k = -1; (k = s2.indexOf(exception, k + 1)) != -1;) { char ac1[] = exception.toCharArray(); System.arraycopy(ac1, 0, ac, k, ac1.length); } } method498(s1.toCharArray(), ac); method499(ac); System.currentTimeMillis(); return s; // xxx chat filter, return s to avoid new String(ac).trim() } private static void method498(char ac[], char ac1[]) { for (int j = 0; j < ac.length; j++) { if (ac1[j] != '*' && isUpperCaseLetter(ac[j])) { ac1[j] = ac[j]; } } } private static void method499(char ac[]) { boolean flag = true; for (int j = 0; j < ac.length; j++) { char c = ac[j]; if (isLetter(c)) { if (flag) { if (isLowerCaseLetter(c)) { flag = false; } } else if (isUpperCaseLetter(c)) { ac[j] = (char) (c + 97 - 65); } } else { flag = true; } } } private static void method500(char ac[]) { for (int i = 0; i < 2; i++) { for (int j = aCharArrayArray621.length - 1; j >= 0; j--) { method509(aByteArrayArrayArray622[j], ac, aCharArrayArray621[j]); } } } private static void method501(char ac[]) { char ac1[] = ac.clone(); char ac2[] = {'(', 'a', ')'}; method509(null, ac1, ac2); char ac3[] = ac.clone(); char ac4[] = {'d', 'o', 't'}; method509(null, ac3, ac4); for (int i = aCharArrayArray623.length - 1; i >= 0; i--) { method502(ac, aCharArrayArray623[i], ac3, ac1); } } private static void method502(char ac[], char ac1[], char ac2[], char ac3[]) { if (ac1.length > ac.length) { return; } int j; for (int k = 0; k <= ac.length - ac1.length; k += j) { int l = k; int i1 = 0; j = 1; while (l < ac.length) { int j1; char c = ac[l]; char c1 = '\0'; if (l + 1 < ac.length) { c1 = ac[l + 1]; } if (i1 < ac1.length && (j1 = method511(c, ac1[i1], c1)) > 0) { l += j1; i1++; continue; } if (i1 == 0) { break; } if ((j1 = method511(c, ac1[i1 - 1], c1)) > 0) { l += j1; if (i1 == 1) { j++; } continue; } if (i1 >= ac1.length || !method517(c)) { break; } l++; } if (i1 >= ac1.length) { boolean flag1 = false; int k1 = method503(ac, ac3, k); int l1 = method504(ac2, l - 1, ac); if (k1 > 2 || l1 > 2) { flag1 = true; } if (flag1) { for (int i2 = k; i2 < l; i2++) { ac[i2] = '*'; } } } } } private static int method503(char ac[], char ac1[], int j) { if (j == 0) { return 2; } for (int k = j - 1; k >= 0; k--) { if (!method517(ac[k])) { break; } if (ac[k] == '@') { return 3; } } int l = 0; for (int i1 = j - 1; i1 >= 0; i1--) { if (!method517(ac1[i1])) { break; } if (ac1[i1] == '*') { l++; } } if (l >= 3) { return 4; } return !method517(ac[j - 1]) ? 0 : 1; } private static int method504(char ac[], int i, char ac1[]) { if (i + 1 == ac1.length) { return 2; } for (int j = i + 1; j < ac1.length; j++) { if (!method517(ac1[j])) { break; } if (ac1[j] == '.' || ac1[j] == ',') { return 3; } } int k = 0; for (int l = i + 1; l < ac1.length; l++) { if (!method517(ac[l])) { break; } if (ac[l] == '*') { k++; } } if (k >= 3) { return 4; } return !method517(ac1[i + 1]) ? 0 : 1; } private static void method505(char ac[]) { char ac1[] = ac.clone(); char ac2[] = {'d', 'o', 't'}; method509(null, ac1, ac2); char ac3[] = ac.clone(); char ac4[] = {'s', 'l', 'a', 's', 'h'}; method509(null, ac3, ac4); for (int i = 0; i < aCharArrayArray624.length; i++) { method506(ac3, aCharArrayArray624[i], anIntArray625[i], ac1, ac); } } private static void method506(char ac[], char ac1[], int i, char ac2[], char ac3[]) { if (ac1.length > ac3.length) { return; } int j; for (int k = 0; k <= ac3.length - ac1.length; k += j) { int l = k; int i1 = 0; j = 1; while (l < ac3.length) { int j1; char c = ac3[l]; char c1 = '\0'; if (l + 1 < ac3.length) { c1 = ac3[l + 1]; } if (i1 < ac1.length && (j1 = method511(c, ac1[i1], c1)) > 0) { l += j1; i1++; continue; } if (i1 == 0) { break; } if ((j1 = method511(c, ac1[i1 - 1], c1)) > 0) { l += j1; if (i1 == 1) { j++; } continue; } if (i1 >= ac1.length || !method517(c)) { break; } l++; } if (i1 >= ac1.length) { boolean flag1 = false; int k1 = method507(ac3, k, ac2); int l1 = method508(ac3, ac, l - 1); if (i == 1 && k1 > 0 && l1 > 0) { flag1 = true; } if (i == 2 && (k1 > 2 && l1 > 0 || k1 > 0 && l1 > 2)) { flag1 = true; } if (i == 3 && k1 > 0 && l1 > 2) { flag1 = true; } if (flag1) { int i2 = k; int j2 = l - 1; if (k1 > 2) { if (k1 == 4) { boolean flag2 = false; for (int l2 = i2 - 1; l2 >= 0; l2--) { if (flag2) { if (ac2[l2] != '*') { break; } i2 = l2; } else if (ac2[l2] == '*') { i2 = l2; flag2 = true; } } } boolean flag3 = false; for (int i3 = i2 - 1; i3 >= 0; i3--) { if (flag3) { if (method517(ac3[i3])) { break; } i2 = i3; } else if (!method517(ac3[i3])) { flag3 = true; i2 = i3; } } } if (l1 > 2) { if (l1 == 4) { boolean flag4 = false; for (int j3 = j2 + 1; j3 < ac3.length; j3++) { if (flag4) { if (ac[j3] != '*') { break; } j2 = j3; } else if (ac[j3] == '*') { j2 = j3; flag4 = true; } } } boolean flag5 = false; for (int k3 = j2 + 1; k3 < ac3.length; k3++) { if (flag5) { if (method517(ac3[k3])) { break; } j2 = k3; } else if (!method517(ac3[k3])) { flag5 = true; j2 = k3; } } } for (int k2 = i2; k2 <= j2; k2++) { ac3[k2] = '*'; } } } } } private static int method507(char ac[], int j, char ac1[]) { if (j == 0) { return 2; } for (int k = j - 1; k >= 0; k--) { if (!method517(ac[k])) { break; } if (ac[k] == ',' || ac[k] == '.') { return 3; } } int l = 0; for (int i1 = j - 1; i1 >= 0; i1--) { if (!method517(ac1[i1])) { break; } if (ac1[i1] == '*') { l++; } } if (l >= 3) { return 4; } return !method517(ac[j - 1]) ? 0 : 1; } private static int method508(char ac[], char ac1[], int i) { if (i + 1 == ac.length) { return 2; } for (int j = i + 1; j < ac.length; j++) { if (!method517(ac[j])) { break; } if (ac[j] == '\\' || ac[j] == '/') { return 3; } } int k = 0; for (int l = i + 1; l < ac.length; l++) { if (!method517(ac1[l])) { break; } if (ac1[l] == '*') { k++; } } if (k >= 5) { return 4; } return !method517(ac[i + 1]) ? 0 : 1; } private static void method509(byte abyte0[][], char ac[], char ac1[]) { if (ac1.length > ac.length) { return; } int j; for (int k = 0; k <= ac.length - ac1.length; k += j) { int l = k; int i1 = 0; int j1 = 0; j = 1; boolean flag1 = false; boolean flag2 = false; boolean flag3 = false; while (l < ac.length && (!flag2 || !flag3)) { int k1; char c = ac[l]; char c2 = '\0'; if (l + 1 < ac.length) { c2 = ac[l + 1]; } if (i1 < ac1.length && (k1 = method512(c2, c, ac1[i1])) > 0) { if (k1 == 1 && isDigit(c)) { flag2 = true; } if (k1 == 2 && (isDigit(c) || isDigit(c2))) { flag2 = true; } l += k1; i1++; continue; } if (i1 == 0) { break; } if ((k1 = method512(c2, c, ac1[i1 - 1])) > 0) { l += k1; if (i1 == 1) { j++; } continue; } if (i1 >= ac1.length || !method518(c)) { break; } if (method517(c) && c != '\'') { flag1 = true; } if (isDigit(c)) { flag3 = true; } l++; if (++j1 * 100 / (l - k) > 90) { break; } } if (i1 >= ac1.length && (!flag2 || !flag3)) { boolean flag4 = true; if (!flag1) { char c1 = ' '; if (k - 1 >= 0) { c1 = ac[k - 1]; } char c3 = ' '; if (l < ac.length) { c3 = ac[l]; } byte byte0 = method513(c1); byte byte1 = method513(c3); if (abyte0 != null && method510(byte0, abyte0, byte1)) { flag4 = false; } } else { boolean flag5 = false; boolean flag6 = false; if (k - 1 < 0 || method517(ac[k - 1]) && ac[k - 1] != '\'') { flag5 = true; } if (l >= ac.length || method517(ac[l]) && ac[l] != '\'') { flag6 = true; } if (!flag5 || !flag6) { boolean flag7 = false; int k2 = k - 2; if (flag5) { k2 = k; } for (; !flag7 && k2 < l; k2++) { if (k2 >= 0 && (!method517(ac[k2]) || ac[k2] == '\'')) { char ac2[] = new char[3]; int j3; for (j3 = 0; j3 < 3; j3++) { if (k2 + j3 >= ac.length || method517(ac[k2 + j3]) && ac[k2 + j3] != '\'') { break; } ac2[j3] = ac[k2 + j3]; } boolean flag8 = true; if (j3 == 0) { flag8 = false; } if (j3 < 3 && k2 - 1 >= 0 && (!method517(ac[k2 - 1]) || ac[k2 - 1] == '\'')) { flag8 = false; } if (flag8 && !method523(ac2)) { flag7 = true; } } } if (!flag7) { flag4 = false; } } } if (flag4) { int l1 = 0; int i2 = 0; int j2 = -1; for (int l2 = k; l2 < l; l2++) { if (isDigit(ac[l2])) { l1++; } else if (isLetter(ac[l2])) { i2++; j2 = l2; } } if (j2 > -1) { l1 -= l - 1 - j2; } if (l1 <= i2) { for (int i3 = k; i3 < l; i3++) { ac[i3] = '*'; } } else { j = 1; } } } } } private static boolean method510(byte byte0, byte abyte0[][], byte byte2) { int i = 0; if (abyte0[i][0] == byte0 && abyte0[i][1] == byte2) { return true; } int j = abyte0.length - 1; if (abyte0[j][0] == byte0 && abyte0[j][1] == byte2) { return true; } do { int k = (i + j) / 2; if (abyte0[k][0] == byte0 && abyte0[k][1] == byte2) { return true; } if (byte0 < abyte0[k][0] || byte0 == abyte0[k][0] && byte2 < abyte0[k][1]) { j = k; } else { i = k; } } while (i != j && i + 1 != j); return false; } private static int method511(char c, char c1, char c2) { if (c1 == c) { return 1; } if (c1 == 'o' && c == '0') { return 1; } if (c1 == 'o' && c == '(' && c2 == ')') { return 2; } if (c1 == 'c' && (c == '(' || c == '<' || c == '[')) { return 1; } if (c1 == 'e' && c == '\u20AC') { return 1; } if (c1 == 's' && c == '$') { return 1; } return c1 != 'l' || c != 'i' ? 0 : 1; } private static int method512(char c, char c1, char c2) { if (c2 == c1) { return 1; } if (c2 >= 'a' && c2 <= 'm') { if (c2 == 'a') { if (c1 == '4' || c1 == '@' || c1 == '^') { return 1; } return c1 != '/' || c != '\\' ? 0 : 2; } if (c2 == 'b') { if (c1 == '6' || c1 == '8') { return 1; } return (c1 != '1' || c != '3') && (c1 != 'i' || c != '3') ? 0 : 2; } if (c2 == 'c') { return c1 != '(' && c1 != '<' && c1 != '{' && c1 != '[' ? 0 : 1; } if (c2 == 'd') { return (c1 != '[' || c != ')') && (c1 != 'i' || c != ')') ? 0 : 2; } if (c2 == 'e') { return c1 != '3' && c1 != '\u20AC' ? 0 : 1; } if (c2 == 'f') { if (c1 == 'p' && c == 'h') { return 2; } return c1 != '\243' ? 0 : 1; } if (c2 == 'g') { return c1 != '9' && c1 != '6' && c1 != 'q' ? 0 : 1; } if (c2 == 'h') { return c1 != '#' ? 0 : 1; } if (c2 == 'i') { return c1 != 'y' && c1 != 'l' && c1 != 'j' && c1 != '1' && c1 != '!' && c1 != ':' && c1 != ';' && c1 != '|' ? 0 : 1; } if (c2 == 'j') { return 0; } if (c2 == 'k') { return 0; } if (c2 == 'l') { return c1 != '1' && c1 != '|' && c1 != 'i' ? 0 : 1; } if (c2 == 'm') { return 0; } } if (c2 >= 'n' && c2 <= 'z') { if (c2 == 'n') { return 0; } if (c2 == 'o') { if (c1 == '0' || c1 == '*') { return 1; } return (c1 != '(' || c != ')') && (c1 != '[' || c != ']') && (c1 != '{' || c != '}') && (c1 != '<' || c != '>') ? 0 : 2; } if (c2 == 'p') { return 0; } if (c2 == 'q') { return 0; } if (c2 == 'r') { return 0; } if (c2 == 's') { return c1 != '5' && c1 != 'z' && c1 != '$' && c1 != '2' ? 0 : 1; } if (c2 == 't') { return c1 != '7' && c1 != '+' ? 0 : 1; } if (c2 == 'u') { if (c1 == 'v') { return 1; } return (c1 != '\\' || c != '/') && (c1 != '\\' || c != '|') && (c1 != '|' || c != '/') ? 0 : 2; } if (c2 == 'v') { return (c1 != '\\' || c != '/') && (c1 != '\\' || c != '|') && (c1 != '|' || c != '/') ? 0 : 2; } if (c2 == 'w') { return c1 != 'v' || c != 'v' ? 0 : 2; } if (c2 == 'x') { return (c1 != ')' || c != '(') && (c1 != '}' || c != '{') && (c1 != ']' || c != '[') && (c1 != '>' || c != '<') ? 0 : 2; } if (c2 == 'y') { return 0; } if (c2 == 'z') { return 0; } } if (c2 >= '0' && c2 <= '9') { if (c2 == '0') { if (c1 == 'o' || c1 == 'O') { return 1; } return (c1 != '(' || c != ')') && (c1 != '{' || c != '}') && (c1 != '[' || c != ']') ? 0 : 2; } if (c2 == '1') { return c1 != 'l' ? 0 : 1; } else { return 0; } } if (c2 == ',') { return c1 != '.' ? 0 : 1; } if (c2 == '.') { return c1 != ',' ? 0 : 1; } if (c2 == '!') { return c1 != 'i' ? 0 : 1; } else { return 0; } } private static byte method513(char c) { if (c >= 'a' && c <= 'z') { return (byte) (c - 97 + 1); } if (c == '\'') { return 28; } if (c >= '0' && c <= '9') { return (byte) (c - 48 + 29); } else { return 27; } } private static void method514(char ac[]) { int j; int k = 0; int l = 0; int i1 = 0; while ((j = method515(ac, k)) != -1) { boolean flag = false; for (int j1 = k; j1 >= 0 && j1 < j && !flag; j1++) { if (!method517(ac[j1]) && !method518(ac[j1])) { flag = true; } } if (flag) { l = 0; } if (l == 0) { i1 = j; } k = method516(ac, j); int k1 = 0; for (int l1 = j; l1 < k; l1++) { k1 = k1 * 10 + ac[l1] - 48; } if (k1 > 255 || k - j > 8) { l = 0; } else { l++; } if (l == 4) { for (int i2 = i1; i2 < k; i2++) { ac[i2] = '*'; } l = 0; } } } private static int method515(char ac[], int i) { for (int k = i; k < ac.length && k >= 0; k++) { if (ac[k] >= '0' && ac[k] <= '9') { return k; } } return -1; } private static int method516(char ac[], int j) { for (int k = j; k < ac.length && k >= 0; k++) { if (ac[k] < '0' || ac[k] > '9') { return k; } } return ac.length; } private static boolean method517(char c) { return !isLetter(c) && !isDigit(c); } private static boolean method518(char c) { return c < 'a' || c > 'z' || c == 'v' || c == 'x' || c == 'j' || c == 'q' || c == 'z'; } private static boolean isLetter(char c) { return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'; } private static boolean isDigit(char c) { return c >= '0' && c <= '9'; } private static boolean isLowerCaseLetter(char c) { return c >= 'a' && c <= 'z'; } private static boolean isUpperCaseLetter(char c) { return c >= 'A' && c <= 'Z'; } private static boolean method523(char ac[]) { boolean flag = true; for (int i = 0; i < ac.length; i++) { if (!isDigit(ac[i]) && ac[i] != 0) { flag = false; } } if (flag) { return true; } int j = method524(ac); int k = 0; int l = anIntArray620.length - 1; if (j == anIntArray620[k] || j == anIntArray620[l]) { return true; } do { int i1 = (k + l) / 2; if (j == anIntArray620[i1]) { return true; } if (j < anIntArray620[i1]) { l = i1; } else { k = i1; } } while (k != l && k + 1 != l); return false; } private static int method524(char ac[]) { if (ac.length > 6) { return 0; } int k = 0; for (int l = 0; l < ac.length; l++) { char c = ac[ac.length - l - 1]; if (c >= 'a' && c <= 'z') { k = k * 38 + c - 97 + 1; } else if (c == '\'') { k = k * 38 + 27; } else if (c >= '0' && c <= '9') { k = k * 38 + c - 48 + 28; } else if (c != 0) { return 0; } } return k; } private static int[] anIntArray620; private static char[][] aCharArrayArray621; private static byte[][][] aByteArrayArrayArray622; private static char[][] aCharArrayArray623; private static char[][] aCharArrayArray624; private static int[] anIntArray625; private static final String[] exceptions = {"cook", "cook's", "cooks", "seeks", "sheet", "woop", "woops", "faq", "noob", "noobs"}; }