diff --git a/john/all.chr b/john/all.chr new file mode 100644 index 0000000..6c8c9df Binary files /dev/null and b/john/all.chr differ diff --git a/john/alnum.chr b/john/alnum.chr new file mode 100644 index 0000000..55e9a0a Binary files /dev/null and b/john/alnum.chr differ diff --git a/john/alpha.chr b/john/alpha.chr new file mode 100644 index 0000000..48586c0 Binary files /dev/null and b/john/alpha.chr differ diff --git a/john/digits.chr b/john/digits.chr new file mode 100644 index 0000000..c7f4806 Binary files /dev/null and b/john/digits.chr differ diff --git a/john/dumb16.conf b/john/dumb16.conf new file mode 100644 index 0000000..791fc41 --- /dev/null +++ b/john/dumb16.conf @@ -0,0 +1,1078 @@ +# This software is Copyright (c) 2012 magnum, and it is hereby +# released to the general public under the following terms: +# Redistribution and use in source and binary forms, with or without +# modification, are permitted. +# +# Generic implementation of "dumb" exhaustive search of Unicode/UCS-2 and +# an arbitrary charset. Default is to try *all* allocated characters (there's +# 54473 of them). Even if a fast format can exhaust two characters in 15 +# minutes, three characters would take 1,5 years... +# +# The output is UTF-8, so for 16-bit formats you need to give --enc=utf8 +[List.External:Dumb16] +int maxlength; // Maximum password length to try +int last; // Last character position, zero-based +int lastid; // Character index in the last position +int id[0x7f]; // Current character indices for other positions +int charset[0x10000], c0; // Characters +int ucs2[0x7F]; // Word in UCS-2 + +void init() +{ + int minlength; + int i, c; + + minlength = 1; // Initial password length to try, must be at least 1 + maxlength = 2; // Must be at least same as minlength + +/* + * This defines the character set. This is auto-generated from UnicodeData.txt + * and we skip control characters. + */ + i = 0; + c = 0x20; // from SPACE + while (c < 0x7f) // ..to TILDE + charset[i++] = c++; + c = 0xa0; // from NO-BREAK SPACE + while (c < 0x378) // ..to GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + charset[i++] = c++; + c = 0x37a; // from GREEK YPOGEGRAMMENI + while (c < 0x37f) // ..to GREEK QUESTION MARK + charset[i++] = c++; + c = 0x384; // from GREEK TONOS + while (c < 0x38b) // ..to GREEK CAPITAL LETTER IOTA WITH TONOS + charset[i++] = c++; + c = 0x38e; // from GREEK CAPITAL LETTER UPSILON WITH TONOS + while (c < 0x3a2) // ..to GREEK CAPITAL LETTER RHO + charset[i++] = c++; + c = 0x3a3; // from GREEK CAPITAL LETTER SIGMA + while (c < 0x528) // ..to CYRILLIC SMALL LETTER SHHA WITH DESCENDER + charset[i++] = c++; + c = 0x531; // from ARMENIAN CAPITAL LETTER AYB + while (c < 0x557) // ..to ARMENIAN CAPITAL LETTER FEH + charset[i++] = c++; + c = 0x559; // from ARMENIAN MODIFIER LETTER LEFT HALF RING + while (c < 0x560) // ..to ARMENIAN ABBREVIATION MARK + charset[i++] = c++; + c = 0x561; // from ARMENIAN SMALL LETTER AYB + while (c < 0x588) // ..to ARMENIAN SMALL LIGATURE ECH YIWN + charset[i++] = c++; + charset[i++] = 0x589; // ARMENIAN FULL STOP + charset[i++] = 0x58a; // ARMENIAN HYPHEN + c = 0x591; // from HEBREW ACCENT ETNAHTA + while (c < 0x5c8) // ..to HEBREW POINT QAMATS QATAN + charset[i++] = c++; + c = 0x5d0; // from HEBREW LETTER ALEF + while (c < 0x5eb) // ..to HEBREW LETTER TAV + charset[i++] = c++; + c = 0x5f0; // from HEBREW LIGATURE YIDDISH DOUBLE VAV + while (c < 0x5f5) // ..to HEBREW PUNCTUATION GERSHAYIM + charset[i++] = c++; + c = 0x600; // from ARABIC NUMBER SIGN + while (c < 0x604) // ..to ARABIC SIGN SAFHA + charset[i++] = c++; + c = 0x606; // from ARABIC-INDIC CUBE ROOT + while (c < 0x61c) // ..to ARABIC SEMICOLON + charset[i++] = c++; + c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK + while (c < 0x70e) // ..to SYRIAC HARKLEAN ASTERISCUS + charset[i++] = c++; + c = 0x70f; // from SYRIAC ABBREVIATION MARK + while (c < 0x74b) // ..to SYRIAC BARREKH + charset[i++] = c++; + c = 0x74d; // from SYRIAC LETTER SOGDIAN ZHAIN + while (c < 0x7b2) // ..to THAANA LETTER NAA + charset[i++] = c++; + c = 0x7c0; // from NKO DIGIT ZERO + while (c < 0x7fb) // ..to NKO LAJANYALAN + charset[i++] = c++; + c = 0x800; // from SAMARITAN LETTER ALAF + while (c < 0x82e) // ..to SAMARITAN MARK NEQUDAA + charset[i++] = c++; + c = 0x830; // from SAMARITAN PUNCTUATION NEQUDAA + while (c < 0x83f) // ..to SAMARITAN PUNCTUATION ANNAAU + charset[i++] = c++; + c = 0x840; // from MANDAIC LETTER HALQA + while (c < 0x85c) // ..to MANDAIC GEMINATION MARK + charset[i++] = c++; + c = 0x900; // from DEVANAGARI SIGN INVERTED CANDRABINDU + while (c < 0x978) // ..to DEVANAGARI LETTER UUE + charset[i++] = c++; + c = 0x979; // from DEVANAGARI LETTER ZHA + while (c < 0x980) // ..to DEVANAGARI LETTER BBA + charset[i++] = c++; + charset[i++] = 0x981; // BENGALI SIGN CANDRABINDU + charset[i++] = 0x983; // BENGALI SIGN VISARGA + c = 0x985; // from BENGALI LETTER A + while (c < 0x98d) // ..to BENGALI LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0x98f; // BENGALI LETTER E + charset[i++] = 0x990; // BENGALI LETTER AI + c = 0x993; // from BENGALI LETTER O + while (c < 0x9a9) // ..to BENGALI LETTER NA + charset[i++] = c++; + c = 0x9aa; // from BENGALI LETTER PA + while (c < 0x9b1) // ..to BENGALI LETTER RA + charset[i++] = c++; + c = 0x9b6; // from BENGALI LETTER SHA + while (c < 0x9ba) // ..to BENGALI LETTER HA + charset[i++] = c++; + c = 0x9bc; // from BENGALI SIGN NUKTA + while (c < 0x9c5) // ..to BENGALI VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0x9c7; // BENGALI VOWEL SIGN E + charset[i++] = 0x9c8; // BENGALI VOWEL SIGN AI + c = 0x9cb; // from BENGALI VOWEL SIGN O + while (c < 0x9cf) // ..to BENGALI LETTER KHANDA TA + charset[i++] = c++; + charset[i++] = 0x9dc; // BENGALI LETTER RRA + charset[i++] = 0x9dd; // BENGALI LETTER RHA + c = 0x9df; // from BENGALI LETTER YYA + while (c < 0x9e4) // ..to BENGALI VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0x9e6; // from BENGALI DIGIT ZERO + while (c < 0x9fc) // ..to BENGALI GANDA MARK + charset[i++] = c++; + charset[i++] = 0xa01; // GURMUKHI SIGN ADAK BINDI + charset[i++] = 0xa03; // GURMUKHI SIGN VISARGA + c = 0xa05; // from GURMUKHI LETTER A + while (c < 0xa0b) // ..to GURMUKHI LETTER UU + charset[i++] = c++; + charset[i++] = 0xa0f; // GURMUKHI LETTER EE + charset[i++] = 0xa10; // GURMUKHI LETTER AI + c = 0xa13; // from GURMUKHI LETTER OO + while (c < 0xa29) // ..to GURMUKHI LETTER NA + charset[i++] = c++; + c = 0xa2a; // from GURMUKHI LETTER PA + while (c < 0xa31) // ..to GURMUKHI LETTER RA + charset[i++] = c++; + charset[i++] = 0xa32; // GURMUKHI LETTER LA + charset[i++] = 0xa33; // GURMUKHI LETTER LLA + charset[i++] = 0xa35; // GURMUKHI LETTER VA + charset[i++] = 0xa36; // GURMUKHI LETTER SHA + charset[i++] = 0xa38; // GURMUKHI LETTER SA + charset[i++] = 0xa39; // GURMUKHI LETTER HA + c = 0xa3e; // from GURMUKHI VOWEL SIGN AA + while (c < 0xa43) // ..to GURMUKHI VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xa47; // GURMUKHI VOWEL SIGN EE + charset[i++] = 0xa48; // GURMUKHI VOWEL SIGN AI + charset[i++] = 0xa4b; // GURMUKHI VOWEL SIGN OO + charset[i++] = 0xa4d; // GURMUKHI SIGN VIRAMA + c = 0xa59; // from GURMUKHI LETTER KHHA + while (c < 0xa5d) // ..to GURMUKHI LETTER RRA + charset[i++] = c++; + c = 0xa66; // from GURMUKHI DIGIT ZERO + while (c < 0xa76) // ..to GURMUKHI SIGN YAKASH + charset[i++] = c++; + charset[i++] = 0xa81; // GUJARATI SIGN CANDRABINDU + charset[i++] = 0xa83; // GUJARATI SIGN VISARGA + c = 0xa85; // from GUJARATI LETTER A + while (c < 0xa8e) // ..to GUJARATI VOWEL CANDRA E + charset[i++] = c++; + charset[i++] = 0xa8f; // GUJARATI LETTER E + charset[i++] = 0xa91; // GUJARATI VOWEL CANDRA O + c = 0xa93; // from GUJARATI LETTER O + while (c < 0xaa9) // ..to GUJARATI LETTER NA + charset[i++] = c++; + c = 0xaaa; // from GUJARATI LETTER PA + while (c < 0xab1) // ..to GUJARATI LETTER RA + charset[i++] = c++; + charset[i++] = 0xab2; // GUJARATI LETTER LA + charset[i++] = 0xab3; // GUJARATI LETTER LLA + c = 0xab5; // from GUJARATI LETTER VA + while (c < 0xaba) // ..to GUJARATI LETTER HA + charset[i++] = c++; + c = 0xabc; // from GUJARATI SIGN NUKTA + while (c < 0xac6) // ..to GUJARATI VOWEL SIGN CANDRA E + charset[i++] = c++; + charset[i++] = 0xac7; // GUJARATI VOWEL SIGN E + charset[i++] = 0xac9; // GUJARATI VOWEL SIGN CANDRA O + charset[i++] = 0xacb; // GUJARATI VOWEL SIGN O + charset[i++] = 0xacd; // GUJARATI SIGN VIRAMA + c = 0xae0; // from GUJARATI LETTER VOCALIC RR + while (c < 0xae4) // ..to GUJARATI VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xae6; // from GUJARATI DIGIT ZERO + while (c < 0xaf0) // ..to GUJARATI DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xb01; // ORIYA SIGN CANDRABINDU + charset[i++] = 0xb03; // ORIYA SIGN VISARGA + c = 0xb05; // from ORIYA LETTER A + while (c < 0xb0d) // ..to ORIYA LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xb0f; // ORIYA LETTER E + charset[i++] = 0xb10; // ORIYA LETTER AI + c = 0xb13; // from ORIYA LETTER O + while (c < 0xb29) // ..to ORIYA LETTER NA + charset[i++] = c++; + c = 0xb2a; // from ORIYA LETTER PA + while (c < 0xb31) // ..to ORIYA LETTER RA + charset[i++] = c++; + charset[i++] = 0xb32; // ORIYA LETTER LA + charset[i++] = 0xb33; // ORIYA LETTER LLA + c = 0xb35; // from ORIYA LETTER VA + while (c < 0xb3a) // ..to ORIYA LETTER HA + charset[i++] = c++; + c = 0xb3c; // from ORIYA SIGN NUKTA + while (c < 0xb45) // ..to ORIYA VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xb47; // ORIYA VOWEL SIGN E + charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI + charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O + charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA + charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb57; // ORIYA AU LENGTH MARK + charset[i++] = 0xb5c; // ORIYA LETTER RRA + charset[i++] = 0xb5d; // ORIYA LETTER RHA + c = 0xb5f; // from ORIYA LETTER YYA + while (c < 0xb64) // ..to ORIYA VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xb66; // from ORIYA DIGIT ZERO + while (c < 0xb78) // ..to ORIYA FRACTION THREE SIXTEENTHS + charset[i++] = c++; + charset[i++] = 0xb82; // TAMIL SIGN ANUSVARA + charset[i++] = 0xb83; // TAMIL SIGN VISARGA + c = 0xb85; // from TAMIL LETTER A + while (c < 0xb8b) // ..to TAMIL LETTER UU + charset[i++] = c++; + charset[i++] = 0xb8e; // TAMIL LETTER E + charset[i++] = 0xb90; // TAMIL LETTER AI + c = 0xb92; // from TAMIL LETTER O + while (c < 0xb96) // ..to TAMIL LETTER KA + charset[i++] = c++; + charset[i++] = 0xb99; // TAMIL LETTER NGA + charset[i++] = 0xb9a; // TAMIL LETTER CA + charset[i++] = 0xb9e; // TAMIL LETTER NYA + charset[i++] = 0xb9f; // TAMIL LETTER TTA + charset[i++] = 0xba3; // TAMIL LETTER NNA + charset[i++] = 0xba4; // TAMIL LETTER TA + charset[i++] = 0xba8; // TAMIL LETTER NA + charset[i++] = 0xbaa; // TAMIL LETTER PA + c = 0xbae; // from TAMIL LETTER MA + while (c < 0xbba) // ..to TAMIL LETTER HA + charset[i++] = c++; + c = 0xbbe; // from TAMIL VOWEL SIGN AA + while (c < 0xbc3) // ..to TAMIL VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xbc6; // TAMIL VOWEL SIGN E + charset[i++] = 0xbc8; // TAMIL VOWEL SIGN AI + c = 0xbca; // from TAMIL VOWEL SIGN O + while (c < 0xbce) // ..to TAMIL SIGN VIRAMA + charset[i++] = c++; + c = 0xbe6; // from TAMIL DIGIT ZERO + while (c < 0xbfb) // ..to TAMIL NUMBER SIGN + charset[i++] = c++; + charset[i++] = 0xc01; // TELUGU SIGN CANDRABINDU + charset[i++] = 0xc03; // TELUGU SIGN VISARGA + c = 0xc05; // from TELUGU LETTER A + while (c < 0xc0d) // ..to TELUGU LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xc0e; // TELUGU LETTER E + charset[i++] = 0xc10; // TELUGU LETTER AI + c = 0xc12; // from TELUGU LETTER O + while (c < 0xc29) // ..to TELUGU LETTER NA + charset[i++] = c++; + c = 0xc2a; // from TELUGU LETTER PA + while (c < 0xc34) // ..to TELUGU LETTER LLA + charset[i++] = c++; + c = 0xc35; // from TELUGU LETTER VA + while (c < 0xc3a) // ..to TELUGU LETTER HA + charset[i++] = c++; + c = 0xc3d; // from TELUGU SIGN AVAGRAHA + while (c < 0xc45) // ..to TELUGU VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xc46; // TELUGU VOWEL SIGN E + charset[i++] = 0xc48; // TELUGU VOWEL SIGN AI + c = 0xc4a; // from TELUGU VOWEL SIGN O + while (c < 0xc4e) // ..to TELUGU SIGN VIRAMA + charset[i++] = c++; + charset[i++] = 0xc55; // TELUGU LENGTH MARK + charset[i++] = 0xc56; // TELUGU AI LENGTH MARK + charset[i++] = 0xc58; // TELUGU LETTER TSA + charset[i++] = 0xc59; // TELUGU LETTER DZA + c = 0xc60; // from TELUGU LETTER VOCALIC RR + while (c < 0xc64) // ..to TELUGU VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xc66; // from TELUGU DIGIT ZERO + while (c < 0xc70) // ..to TELUGU DIGIT NINE + charset[i++] = c++; + c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + while (c < 0xc80) // ..to TELUGU SIGN TUUMU + charset[i++] = c++; + charset[i++] = 0xc82; // KANNADA SIGN ANUSVARA + charset[i++] = 0xc83; // KANNADA SIGN VISARGA + c = 0xc85; // from KANNADA LETTER A + while (c < 0xc8d) // ..to KANNADA LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xc8e; // KANNADA LETTER E + charset[i++] = 0xc90; // KANNADA LETTER AI + c = 0xc92; // from KANNADA LETTER O + while (c < 0xca9) // ..to KANNADA LETTER NA + charset[i++] = c++; + c = 0xcaa; // from KANNADA LETTER PA + while (c < 0xcb4) // ..to KANNADA LETTER LLA + charset[i++] = c++; + c = 0xcb5; // from KANNADA LETTER VA + while (c < 0xcba) // ..to KANNADA LETTER HA + charset[i++] = c++; + c = 0xcbc; // from KANNADA SIGN NUKTA + while (c < 0xcc5) // ..to KANNADA VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xcc6; // KANNADA VOWEL SIGN E + charset[i++] = 0xcc8; // KANNADA VOWEL SIGN AI + c = 0xcca; // from KANNADA VOWEL SIGN O + while (c < 0xcce) // ..to KANNADA SIGN VIRAMA + charset[i++] = c++; + charset[i++] = 0xcd5; // KANNADA LENGTH MARK + charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK + c = 0xce0; // from KANNADA LETTER VOCALIC RR + while (c < 0xce4) // ..to KANNADA VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xce6; // from KANNADA DIGIT ZERO + while (c < 0xcf0) // ..to KANNADA DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA + charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA + charset[i++] = 0xd02; // MALAYALAM SIGN ANUSVARA + charset[i++] = 0xd03; // MALAYALAM SIGN VISARGA + c = 0xd05; // from MALAYALAM LETTER A + while (c < 0xd0d) // ..to MALAYALAM LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xd0e; // MALAYALAM LETTER E + charset[i++] = 0xd10; // MALAYALAM LETTER AI + c = 0xd12; // from MALAYALAM LETTER O + while (c < 0xd3b) // ..to MALAYALAM LETTER TTTA + charset[i++] = c++; + c = 0xd3d; // from MALAYALAM SIGN AVAGRAHA + while (c < 0xd45) // ..to MALAYALAM VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xd46; // MALAYALAM VOWEL SIGN E + charset[i++] = 0xd48; // MALAYALAM VOWEL SIGN AI + c = 0xd4a; // from MALAYALAM VOWEL SIGN O + while (c < 0xd4f) // ..to MALAYALAM LETTER DOT REPH + charset[i++] = c++; + c = 0xd60; // from MALAYALAM LETTER VOCALIC RR + while (c < 0xd64) // ..to MALAYALAM VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xd66; // from MALAYALAM DIGIT ZERO + while (c < 0xd76) // ..to MALAYALAM FRACTION THREE QUARTERS + charset[i++] = c++; + c = 0xd79; // from MALAYALAM DATE MARK + while (c < 0xd80) // ..to MALAYALAM LETTER CHILLU K + charset[i++] = c++; + charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA + c = 0xd85; // from SINHALA LETTER AYANNA + while (c < 0xd97) // ..to SINHALA LETTER AUYANNA + charset[i++] = c++; + c = 0xd9a; // from SINHALA LETTER ALPAPRAANA KAYANNA + while (c < 0xdb2) // ..to SINHALA LETTER DANTAJA NAYANNA + charset[i++] = c++; + c = 0xdb3; // from SINHALA LETTER SANYAKA DAYANNA + while (c < 0xdbc) // ..to SINHALA LETTER RAYANNA + charset[i++] = c++; + c = 0xdc0; // from SINHALA LETTER VAYANNA + while (c < 0xdc7) // ..to SINHALA LETTER FAYANNA + charset[i++] = c++; + c = 0xdcf; // from SINHALA VOWEL SIGN AELA-PILLA + while (c < 0xdd5) // ..to SINHALA VOWEL SIGN KETTI PAA-PILLA + charset[i++] = c++; + c = 0xdd8; // from SINHALA VOWEL SIGN GAETTA-PILLA + while (c < 0xde0) // ..to SINHALA VOWEL SIGN GAYANUKITTA + charset[i++] = c++; + charset[i++] = 0xdf2; // SINHALA VOWEL SIGN DIGA GAETTA-PILLA + charset[i++] = 0xdf4; // SINHALA PUNCTUATION KUNDDALIYA + c = 0xe01; // from THAI CHARACTER KO KAI + while (c < 0xe3b) // ..to THAI CHARACTER PHINTHU + charset[i++] = c++; + c = 0xe3f; // from THAI CURRENCY SYMBOL BAHT + while (c < 0xe5c) // ..to THAI CHARACTER KHOMUT + charset[i++] = c++; + charset[i++] = 0xe81; // LAO LETTER KO + charset[i++] = 0xe82; // LAO LETTER KHO SUNG + charset[i++] = 0xe87; // LAO LETTER NGO + charset[i++] = 0xe88; // LAO LETTER CO + c = 0xe94; // from LAO LETTER DO + while (c < 0xe98) // ..to LAO LETTER THO TAM + charset[i++] = c++; + c = 0xe99; // from LAO LETTER NO + while (c < 0xea0) // ..to LAO LETTER FO SUNG + charset[i++] = c++; + charset[i++] = 0xea1; // LAO LETTER MO + charset[i++] = 0xea3; // LAO LETTER LO LING + charset[i++] = 0xeaa; // LAO LETTER SO SUNG + charset[i++] = 0xeab; // LAO LETTER HO SUNG + c = 0xead; // from LAO LETTER O + while (c < 0xeba) // ..to LAO VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON + charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO + c = 0xec0; // from LAO VOWEL SIGN E + while (c < 0xec5) // ..to LAO VOWEL SIGN AI + charset[i++] = c++; + c = 0xec8; // from LAO TONE MAI EK + while (c < 0xece) // ..to LAO NIGGAHITA + charset[i++] = c++; + c = 0xed0; // from LAO DIGIT ZERO + while (c < 0xeda) // ..to LAO DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xedc; // LAO HO NO + charset[i++] = 0xedd; // LAO HO MO + c = 0xf00; // from TIBETAN SYLLABLE OM + while (c < 0xf48) // ..to TIBETAN LETTER JA + charset[i++] = c++; + c = 0xf49; // from TIBETAN LETTER NYA + while (c < 0xf6d) // ..to TIBETAN LETTER RRA + charset[i++] = c++; + c = 0xf71; // from TIBETAN VOWEL SIGN AA + while (c < 0xf98) // ..to TIBETAN SUBJOINED LETTER JA + charset[i++] = c++; + c = 0xf99; // from TIBETAN SUBJOINED LETTER NYA + while (c < 0xfbd) // ..to TIBETAN SUBJOINED LETTER FIXED-FORM RA + charset[i++] = c++; + c = 0xfbe; // from TIBETAN KU RU KHA + while (c < 0xfcd) // ..to TIBETAN SYMBOL NOR BU BZHI -KHYIL + charset[i++] = c++; + c = 0xfce; // from TIBETAN SIGN RDEL NAG RDEL DKAR + while (c < 0xfdb) // ..to TIBETAN MARK TRAILING MCHAN RTAGS + charset[i++] = c++; + c = 0x1000; // from MYANMAR LETTER KA + while (c < 0x10c6) // ..to GEORGIAN CAPITAL LETTER HOE + charset[i++] = c++; + c = 0x10d0; // from GEORGIAN LETTER AN + while (c < 0x10fd) // ..to MODIFIER LETTER GEORGIAN NAR + charset[i++] = c++; + c = 0x1100; // from HANGUL CHOSEONG KIYEOK + while (c < 0x1249) // ..to ETHIOPIC SYLLABLE QWA + charset[i++] = c++; + c = 0x124a; // from ETHIOPIC SYLLABLE QWI + while (c < 0x124e) // ..to ETHIOPIC SYLLABLE QWE + charset[i++] = c++; + c = 0x1250; // from ETHIOPIC SYLLABLE QHA + while (c < 0x1257) // ..to ETHIOPIC SYLLABLE QHO + charset[i++] = c++; + c = 0x125a; // from ETHIOPIC SYLLABLE QHWI + while (c < 0x125e) // ..to ETHIOPIC SYLLABLE QHWE + charset[i++] = c++; + c = 0x1260; // from ETHIOPIC SYLLABLE BA + while (c < 0x1289) // ..to ETHIOPIC SYLLABLE XWA + charset[i++] = c++; + c = 0x128a; // from ETHIOPIC SYLLABLE XWI + while (c < 0x128e) // ..to ETHIOPIC SYLLABLE XWE + charset[i++] = c++; + c = 0x1290; // from ETHIOPIC SYLLABLE NA + while (c < 0x12b1) // ..to ETHIOPIC SYLLABLE KWA + charset[i++] = c++; + c = 0x12b2; // from ETHIOPIC SYLLABLE KWI + while (c < 0x12b6) // ..to ETHIOPIC SYLLABLE KWE + charset[i++] = c++; + c = 0x12b8; // from ETHIOPIC SYLLABLE KXA + while (c < 0x12bf) // ..to ETHIOPIC SYLLABLE KXO + charset[i++] = c++; + c = 0x12c2; // from ETHIOPIC SYLLABLE KXWI + while (c < 0x12c6) // ..to ETHIOPIC SYLLABLE KXWE + charset[i++] = c++; + c = 0x12c8; // from ETHIOPIC SYLLABLE WA + while (c < 0x12d7) // ..to ETHIOPIC SYLLABLE PHARYNGEAL O + charset[i++] = c++; + c = 0x12d8; // from ETHIOPIC SYLLABLE ZA + while (c < 0x1311) // ..to ETHIOPIC SYLLABLE GWA + charset[i++] = c++; + c = 0x1312; // from ETHIOPIC SYLLABLE GWI + while (c < 0x1316) // ..to ETHIOPIC SYLLABLE GWE + charset[i++] = c++; + c = 0x1318; // from ETHIOPIC SYLLABLE GGA + while (c < 0x135b) // ..to ETHIOPIC SYLLABLE FYA + charset[i++] = c++; + c = 0x135d; // from ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK + while (c < 0x137d) // ..to ETHIOPIC NUMBER TEN THOUSAND + charset[i++] = c++; + c = 0x1380; // from ETHIOPIC SYLLABLE SEBATBEIT MWA + while (c < 0x139a) // ..to ETHIOPIC TONAL MARK KURT + charset[i++] = c++; + c = 0x13a0; // from CHEROKEE LETTER A + while (c < 0x13f5) // ..to CHEROKEE LETTER YV + charset[i++] = c++; + c = 0x1400; // from CANADIAN SYLLABICS HYPHEN + while (c < 0x169d) // ..to OGHAM REVERSED FEATHER MARK + charset[i++] = c++; + c = 0x16a0; // from RUNIC LETTER FEHU FEOH FE F + while (c < 0x16f1) // ..to RUNIC BELGTHOR SYMBOL + charset[i++] = c++; + c = 0x1700; // from TAGALOG LETTER A + while (c < 0x170d) // ..to TAGALOG LETTER YA + charset[i++] = c++; + c = 0x170e; // from TAGALOG LETTER LA + while (c < 0x1715) // ..to TAGALOG SIGN VIRAMA + charset[i++] = c++; + c = 0x1720; // from HANUNOO LETTER A + while (c < 0x1737) // ..to PHILIPPINE DOUBLE PUNCTUATION + charset[i++] = c++; + c = 0x1740; // from BUHID LETTER A + while (c < 0x1754) // ..to BUHID VOWEL SIGN U + charset[i++] = c++; + c = 0x1760; // from TAGBANWA LETTER A + while (c < 0x176d) // ..to TAGBANWA LETTER YA + charset[i++] = c++; + charset[i++] = 0x176e; // TAGBANWA LETTER LA + charset[i++] = 0x1770; // TAGBANWA LETTER SA + charset[i++] = 0x1772; // TAGBANWA VOWEL SIGN I + charset[i++] = 0x1773; // TAGBANWA VOWEL SIGN U + c = 0x1780; // from KHMER LETTER KA + while (c < 0x17de) // ..to KHMER SIGN ATTHACAN + charset[i++] = c++; + c = 0x17e0; // from KHMER DIGIT ZERO + while (c < 0x17ea) // ..to KHMER DIGIT NINE + charset[i++] = c++; + c = 0x17f0; // from KHMER SYMBOL LEK ATTAK SON + while (c < 0x17fa) // ..to KHMER SYMBOL LEK ATTAK PRAM-BUON + charset[i++] = c++; + c = 0x1800; // from MONGOLIAN BIRGA + while (c < 0x180f) // ..to MONGOLIAN VOWEL SEPARATOR + charset[i++] = c++; + c = 0x1810; // from MONGOLIAN DIGIT ZERO + while (c < 0x181a) // ..to MONGOLIAN DIGIT NINE + charset[i++] = c++; + c = 0x1820; // from MONGOLIAN LETTER A + while (c < 0x1878) // ..to MONGOLIAN LETTER MANCHU ZHA + charset[i++] = c++; + c = 0x1880; // from MONGOLIAN LETTER ALI GALI ANUSVARA ONE + while (c < 0x18ab) // ..to MONGOLIAN LETTER MANCHU ALI GALI LHA + charset[i++] = c++; + c = 0x18b0; // from CANADIAN SYLLABICS OY + while (c < 0x18f6) // ..to CANADIAN SYLLABICS CARRIER DENTAL S + charset[i++] = c++; + c = 0x1900; // from LIMBU VOWEL-CARRIER LETTER + while (c < 0x191d) // ..to LIMBU LETTER HA + charset[i++] = c++; + c = 0x1920; // from LIMBU VOWEL SIGN A + while (c < 0x192c) // ..to LIMBU SUBJOINED LETTER WA + charset[i++] = c++; + c = 0x1930; // from LIMBU SMALL LETTER KA + while (c < 0x193c) // ..to LIMBU SIGN SA-I + charset[i++] = c++; + c = 0x1944; // from LIMBU EXCLAMATION MARK + while (c < 0x196e) // ..to TAI LE LETTER AI + charset[i++] = c++; + c = 0x1970; // from TAI LE LETTER TONE-2 + while (c < 0x1975) // ..to TAI LE LETTER TONE-6 + charset[i++] = c++; + c = 0x1980; // from NEW TAI LUE LETTER HIGH QA + while (c < 0x19ac) // ..to NEW TAI LUE LETTER LOW SUA + charset[i++] = c++; + c = 0x19b0; // from NEW TAI LUE VOWEL SIGN VOWEL SHORTENER + while (c < 0x19ca) // ..to NEW TAI LUE TONE MARK-2 + charset[i++] = c++; + c = 0x19d0; // from NEW TAI LUE DIGIT ZERO + while (c < 0x19db) // ..to NEW TAI LUE THAM DIGIT ONE + charset[i++] = c++; + c = 0x19de; // from NEW TAI LUE SIGN LAE + while (c < 0x1a1c) // ..to BUGINESE VOWEL SIGN AE + charset[i++] = c++; + c = 0x1a1e; // from BUGINESE PALLAWA + while (c < 0x1a5f) // ..to TAI THAM CONSONANT SIGN SA + charset[i++] = c++; + c = 0x1a60; // from TAI THAM SIGN SAKOT + while (c < 0x1a7d) // ..to TAI THAM SIGN KHUEN-LUE KARAN + charset[i++] = c++; + c = 0x1a7f; // from TAI THAM COMBINING CRYPTOGRAMMIC DOT + while (c < 0x1a8a) // ..to TAI THAM HORA DIGIT NINE + charset[i++] = c++; + c = 0x1a90; // from TAI THAM THAM DIGIT ZERO + while (c < 0x1a9a) // ..to TAI THAM THAM DIGIT NINE + charset[i++] = c++; + c = 0x1aa0; // from TAI THAM SIGN WIANG + while (c < 0x1aae) // ..to TAI THAM SIGN CAANG + charset[i++] = c++; + c = 0x1b00; // from BALINESE SIGN ULU RICEM + while (c < 0x1b4c) // ..to BALINESE LETTER ASYURA SASAK + charset[i++] = c++; + c = 0x1b50; // from BALINESE DIGIT ZERO + while (c < 0x1b7d) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING + charset[i++] = c++; + c = 0x1b80; // from SUNDANESE SIGN PANYECEK + while (c < 0x1bab) // ..to SUNDANESE SIGN PAMAAEH + charset[i++] = c++; + c = 0x1bae; // from SUNDANESE LETTER KHA + while (c < 0x1bba) // ..to SUNDANESE DIGIT NINE + charset[i++] = c++; + c = 0x1bc0; // from BATAK LETTER A + while (c < 0x1bf4) // ..to BATAK PANONGONAN + charset[i++] = c++; + c = 0x1bfc; // from BATAK SYMBOL BINDU NA METEK + while (c < 0x1c38) // ..to LEPCHA SIGN NUKTA + charset[i++] = c++; + c = 0x1c3b; // from LEPCHA PUNCTUATION TA-ROL + while (c < 0x1c4a) // ..to LEPCHA DIGIT NINE + charset[i++] = c++; + c = 0x1c4d; // from LEPCHA LETTER TTA + while (c < 0x1c80) // ..to OL CHIKI PUNCTUATION DOUBLE MUCAAD + charset[i++] = c++; + c = 0x1cd0; // from VEDIC TONE KARSHANA + while (c < 0x1cf3) // ..to VEDIC SIGN ARDHAVISARGA + charset[i++] = c++; + c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A + while (c < 0x1de7) // ..to COMBINING LATIN SMALL LETTER Z + charset[i++] = c++; + c = 0x1dfc; // from COMBINING DOUBLE INVERTED BREVE BELOW + while (c < 0x1f16) // ..to GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f18; // from GREEK CAPITAL LETTER EPSILON WITH PSILI + while (c < 0x1f1e) // ..to GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f20; // from GREEK SMALL LETTER ETA WITH PSILI + while (c < 0x1f46) // ..to GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f48; // from GREEK CAPITAL LETTER OMICRON WITH PSILI + while (c < 0x1f4e) // ..to GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f50; // from GREEK SMALL LETTER UPSILON WITH PSILI + while (c < 0x1f58) // ..to GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + charset[i++] = c++; + c = 0x1f5f; // from GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + while (c < 0x1f7e) // ..to GREEK SMALL LETTER OMEGA WITH OXIA + charset[i++] = c++; + c = 0x1f80; // from GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + while (c < 0x1fb5) // ..to GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + charset[i++] = c++; + c = 0x1fb6; // from GREEK SMALL LETTER ALPHA WITH PERISPOMENI + while (c < 0x1fc5) // ..to GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + charset[i++] = c++; + c = 0x1fc6; // from GREEK SMALL LETTER ETA WITH PERISPOMENI + while (c < 0x1fd4) // ..to GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + charset[i++] = c++; + c = 0x1fd6; // from GREEK SMALL LETTER IOTA WITH PERISPOMENI + while (c < 0x1fdc) // ..to GREEK CAPITAL LETTER IOTA WITH OXIA + charset[i++] = c++; + c = 0x1fdd; // from GREEK DASIA AND VARIA + while (c < 0x1ff0) // ..to GREEK VARIA + charset[i++] = c++; + charset[i++] = 0x1ff2; // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + charset[i++] = 0x1ff4; // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + c = 0x1ff6; // from GREEK SMALL LETTER OMEGA WITH PERISPOMENI + while (c < 0x1fff) // ..to GREEK DASIA + charset[i++] = c++; + c = 0x2000; // from EN QUAD + while (c < 0x2065) // ..to INVISIBLE PLUS + charset[i++] = c++; + c = 0x206a; // from INHIBIT SYMMETRIC SWAPPING + while (c < 0x2072) // ..to SUPERSCRIPT LATIN SMALL LETTER I + charset[i++] = c++; + c = 0x2074; // from SUPERSCRIPT FOUR + while (c < 0x208f) // ..to SUBSCRIPT RIGHT PARENTHESIS + charset[i++] = c++; + c = 0x2090; // from LATIN SUBSCRIPT SMALL LETTER A + while (c < 0x209d) // ..to LATIN SUBSCRIPT SMALL LETTER T + charset[i++] = c++; + c = 0x20a0; // from EURO-CURRENCY SIGN + while (c < 0x20ba) // ..to INDIAN RUPEE SIGN + charset[i++] = c++; + c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE + while (c < 0x20f1) // ..to COMBINING ASTERISK ABOVE + charset[i++] = c++; + c = 0x2100; // from ACCOUNT OF + while (c < 0x218a) // ..to VULGAR FRACTION ZERO THIRDS + charset[i++] = c++; + c = 0x2190; // from LEFTWARDS ARROW + while (c < 0x23f4) // ..to HOURGLASS WITH FLOWING SAND + charset[i++] = c++; + c = 0x2400; // from SYMBOL FOR NULL + while (c < 0x2427) // ..to SYMBOL FOR SUBSTITUTE FORM TWO + charset[i++] = c++; + c = 0x2440; // from OCR HOOK + while (c < 0x244b) // ..to OCR DOUBLE BACKSLASH + charset[i++] = c++; + c = 0x2460; // from CIRCLED DIGIT ONE + while (c < 0x2700) // ..to WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + charset[i++] = c++; + c = 0x2701; // from UPPER BLADE SCISSORS + while (c < 0x27cb) // ..to VERTICAL BAR WITH HORIZONTAL STROKE + charset[i++] = c++; + c = 0x27ce; // from SQUARED LOGICAL AND + while (c < 0x2b4d) // ..to RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR + charset[i++] = c++; + c = 0x2b50; // from WHITE MEDIUM STAR + while (c < 0x2b5a) // ..to HEAVY CIRCLED SALTIRE + charset[i++] = c++; + c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU + while (c < 0x2c2f) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE + charset[i++] = c++; + c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU + while (c < 0x2c5f) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE + charset[i++] = c++; + c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR + while (c < 0x2cf2) // ..to COPTIC COMBINING SPIRITUS LENIS + charset[i++] = c++; + c = 0x2cf9; // from COPTIC OLD NUBIAN FULL STOP + while (c < 0x2d26) // ..to GEORGIAN SMALL LETTER HOE + charset[i++] = c++; + c = 0x2d30; // from TIFINAGH LETTER YA + while (c < 0x2d66) // ..to TIFINAGH LETTER YAZZ + charset[i++] = c++; + charset[i++] = 0x2d6f; // TIFINAGH MODIFIER LETTER LABIALIZATION MARK + charset[i++] = 0x2d70; // TIFINAGH SEPARATOR MARK + c = 0x2d7f; // from TIFINAGH CONSONANT JOINER + while (c < 0x2d97) // ..to ETHIOPIC SYLLABLE GGWE + charset[i++] = c++; + c = 0x2da0; // from ETHIOPIC SYLLABLE SSA + while (c < 0x2da7) // ..to ETHIOPIC SYLLABLE SSO + charset[i++] = c++; + c = 0x2da8; // from ETHIOPIC SYLLABLE CCA + while (c < 0x2daf) // ..to ETHIOPIC SYLLABLE CCO + charset[i++] = c++; + c = 0x2db0; // from ETHIOPIC SYLLABLE ZZA + while (c < 0x2db7) // ..to ETHIOPIC SYLLABLE ZZO + charset[i++] = c++; + c = 0x2db8; // from ETHIOPIC SYLLABLE CCHA + while (c < 0x2dbf) // ..to ETHIOPIC SYLLABLE CCHO + charset[i++] = c++; + c = 0x2dc0; // from ETHIOPIC SYLLABLE QYA + while (c < 0x2dc7) // ..to ETHIOPIC SYLLABLE QYO + charset[i++] = c++; + c = 0x2dc8; // from ETHIOPIC SYLLABLE KYA + while (c < 0x2dcf) // ..to ETHIOPIC SYLLABLE KYO + charset[i++] = c++; + c = 0x2dd0; // from ETHIOPIC SYLLABLE XYA + while (c < 0x2dd7) // ..to ETHIOPIC SYLLABLE XYO + charset[i++] = c++; + c = 0x2dd8; // from ETHIOPIC SYLLABLE GYA + while (c < 0x2ddf) // ..to ETHIOPIC SYLLABLE GYO + charset[i++] = c++; + c = 0x2de0; // from COMBINING CYRILLIC LETTER BE + while (c < 0x2e32) // ..to WORD SEPARATOR MIDDLE DOT + charset[i++] = c++; + c = 0x2e80; // from CJK RADICAL REPEAT + while (c < 0x2e9a) // ..to CJK RADICAL RAP + charset[i++] = c++; + c = 0x2e9b; // from CJK RADICAL CHOKE + while (c < 0x2ef4) // ..to CJK RADICAL C-SIMPLIFIED TURTLE + charset[i++] = c++; + c = 0x2f00; // from KANGXI RADICAL ONE + while (c < 0x2fd6) // ..to KANGXI RADICAL FLUTE + charset[i++] = c++; + c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT + while (c < 0x2ffc) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID + charset[i++] = c++; + c = 0x3000; // from IDEOGRAPHIC SPACE + while (c < 0x3040) // ..to IDEOGRAPHIC HALF FILL SPACE + charset[i++] = c++; + c = 0x3041; // from HIRAGANA LETTER SMALL A + while (c < 0x3097) // ..to HIRAGANA LETTER SMALL KE + charset[i++] = c++; + c = 0x3099; // from COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + while (c < 0x3100) // ..to KATAKANA DIGRAPH KOTO + charset[i++] = c++; + c = 0x3105; // from BOPOMOFO LETTER B + while (c < 0x312e) // ..to BOPOMOFO LETTER IH + charset[i++] = c++; + c = 0x3131; // from HANGUL LETTER KIYEOK + while (c < 0x318f) // ..to HANGUL LETTER ARAEAE + charset[i++] = c++; + c = 0x3190; // from IDEOGRAPHIC ANNOTATION LINKING MARK + while (c < 0x31bb) // ..to BOPOMOFO LETTER ZY + charset[i++] = c++; + c = 0x31c0; // from CJK STROKE T + while (c < 0x31e4) // ..to CJK STROKE Q + charset[i++] = c++; + c = 0x31f0; // from KATAKANA LETTER SMALL KU + while (c < 0x321f) // ..to PARENTHESIZED KOREAN CHARACTER O HU + charset[i++] = c++; + c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE + while (c < 0x32ff) // ..to CIRCLED KATAKANA WO + charset[i++] = c++; + c = 0x3300; // from SQUARE APAATO + while (c < 0x3400) // ..to SQUARE GAL + charset[i++] = c++; + c = 0x3400; // from + while (c < 0x4db6) // ..to + charset[i++] = c++; + c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN + while (c < 0x4e00) // ..to HEXAGRAM FOR BEFORE COMPLETION + charset[i++] = c++; + c = 0x4e00; // from + while (c < 0x9fcc) // ..to + charset[i++] = c++; + c = 0xa000; // from YI SYLLABLE IT + while (c < 0xa48d) // ..to YI SYLLABLE YYR + charset[i++] = c++; + c = 0xa490; // from YI RADICAL QOT + while (c < 0xa4c7) // ..to YI RADICAL KE + charset[i++] = c++; + c = 0xa4d0; // from LISU LETTER BA + while (c < 0xa62c) // ..to VAI SYLLABLE NDOLE DO + charset[i++] = c++; + c = 0xa640; // from CYRILLIC CAPITAL LETTER ZEMLYA + while (c < 0xa674) // ..to SLAVONIC ASTERISK + charset[i++] = c++; + c = 0xa67c; // from COMBINING CYRILLIC KAVYKA + while (c < 0xa698) // ..to CYRILLIC SMALL LETTER SHWE + charset[i++] = c++; + c = 0xa6a0; // from BAMUM LETTER A + while (c < 0xa6f8) // ..to BAMUM QUESTION MARK + charset[i++] = c++; + c = 0xa700; // from MODIFIER LETTER CHINESE TONE YIN PING + while (c < 0xa78f) // ..to LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + charset[i++] = c++; + charset[i++] = 0xa790; // LATIN CAPITAL LETTER N WITH DESCENDER + charset[i++] = 0xa791; // LATIN SMALL LETTER N WITH DESCENDER + c = 0xa7a0; // from LATIN CAPITAL LETTER G WITH OBLIQUE STROKE + while (c < 0xa7aa) // ..to LATIN SMALL LETTER S WITH OBLIQUE STROKE + charset[i++] = c++; + c = 0xa7fa; // from LATIN LETTER SMALL CAPITAL TURNED M + while (c < 0xa82c) // ..to SYLOTI NAGRI POETRY MARK-4 + charset[i++] = c++; + c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER + while (c < 0xa83a) // ..to NORTH INDIC QUANTITY MARK + charset[i++] = c++; + c = 0xa840; // from PHAGS-PA LETTER KA + while (c < 0xa878) // ..to PHAGS-PA MARK DOUBLE SHAD + charset[i++] = c++; + c = 0xa880; // from SAURASHTRA SIGN ANUSVARA + while (c < 0xa8c5) // ..to SAURASHTRA SIGN VIRAMA + charset[i++] = c++; + c = 0xa8ce; // from SAURASHTRA DANDA + while (c < 0xa8da) // ..to SAURASHTRA DIGIT NINE + charset[i++] = c++; + c = 0xa8e0; // from COMBINING DEVANAGARI DIGIT ZERO + while (c < 0xa8fc) // ..to DEVANAGARI HEADSTROKE + charset[i++] = c++; + c = 0xa900; // from KAYAH LI DIGIT ZERO + while (c < 0xa954) // ..to REJANG VIRAMA + charset[i++] = c++; + c = 0xa95f; // from REJANG SECTION MARK + while (c < 0xa97d) // ..to HANGUL CHOSEONG SSANGYEORINHIEUH + charset[i++] = c++; + c = 0xa980; // from JAVANESE SIGN PANYANGGA + while (c < 0xa9ce) // ..to JAVANESE TURNED PADA PISELEH + charset[i++] = c++; + c = 0xa9cf; // from JAVANESE PANGRANGKEP + while (c < 0xa9da) // ..to JAVANESE DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xa9de; // JAVANESE PADA TIRTA TUMETES + charset[i++] = 0xa9df; // JAVANESE PADA ISEN-ISEN + c = 0xaa00; // from CHAM LETTER A + while (c < 0xaa37) // ..to CHAM CONSONANT SIGN WA + charset[i++] = c++; + c = 0xaa40; // from CHAM LETTER FINAL K + while (c < 0xaa4e) // ..to CHAM CONSONANT SIGN FINAL H + charset[i++] = c++; + c = 0xaa50; // from CHAM DIGIT ZERO + while (c < 0xaa5a) // ..to CHAM DIGIT NINE + charset[i++] = c++; + c = 0xaa5c; // from CHAM PUNCTUATION SPIRAL + while (c < 0xaa7c) // ..to MYANMAR SIGN PAO KAREN TONE + charset[i++] = c++; + c = 0xaa80; // from TAI VIET LETTER LOW KO + while (c < 0xaac3) // ..to TAI VIET TONE MAI SONG + charset[i++] = c++; + c = 0xaadb; // from TAI VIET SYMBOL KON + while (c < 0xaae0) // ..to TAI VIET SYMBOL KOI KOI + charset[i++] = c++; + c = 0xab01; // from ETHIOPIC SYLLABLE TTHU + while (c < 0xab07) // ..to ETHIOPIC SYLLABLE TTHO + charset[i++] = c++; + c = 0xab09; // from ETHIOPIC SYLLABLE DDHU + while (c < 0xab0f) // ..to ETHIOPIC SYLLABLE DDHO + charset[i++] = c++; + c = 0xab11; // from ETHIOPIC SYLLABLE DZU + while (c < 0xab17) // ..to ETHIOPIC SYLLABLE DZO + charset[i++] = c++; + c = 0xab20; // from ETHIOPIC SYLLABLE CCHHA + while (c < 0xab27) // ..to ETHIOPIC SYLLABLE CCHHO + charset[i++] = c++; + c = 0xab28; // from ETHIOPIC SYLLABLE BBA + while (c < 0xab2f) // ..to ETHIOPIC SYLLABLE BBO + charset[i++] = c++; + c = 0xabc0; // from MEETEI MAYEK LETTER KOK + while (c < 0xabee) // ..to MEETEI MAYEK APUN IYEK + charset[i++] = c++; + c = 0xabf0; // from MEETEI MAYEK DIGIT ZERO + while (c < 0xabfa) // ..to MEETEI MAYEK DIGIT NINE + charset[i++] = c++; + c = 0xac00; // from + while (c < 0xd7a4) // ..to + charset[i++] = c++; + c = 0xd7b0; // from HANGUL JUNGSEONG O-YEO + while (c < 0xd7c7) // ..to HANGUL JUNGSEONG ARAEA-E + charset[i++] = c++; + c = 0xd7cb; // from HANGUL JONGSEONG NIEUN-RIEUL + while (c < 0xd7fc) // ..to HANGUL JONGSEONG PHIEUPH-THIEUTH + charset[i++] = c++; + c = 0xf900; // from CJK COMPATIBILITY IDEOGRAPH-F900 + while (c < 0xfa2e) // ..to CJK COMPATIBILITY IDEOGRAPH-FA2D + charset[i++] = c++; + c = 0xfa30; // from CJK COMPATIBILITY IDEOGRAPH-FA30 + while (c < 0xfa6e) // ..to CJK COMPATIBILITY IDEOGRAPH-FA6D + charset[i++] = c++; + c = 0xfa70; // from CJK COMPATIBILITY IDEOGRAPH-FA70 + while (c < 0xfada) // ..to CJK COMPATIBILITY IDEOGRAPH-FAD9 + charset[i++] = c++; + c = 0xfb00; // from LATIN SMALL LIGATURE FF + while (c < 0xfb07) // ..to LATIN SMALL LIGATURE ST + charset[i++] = c++; + c = 0xfb13; // from ARMENIAN SMALL LIGATURE MEN NOW + while (c < 0xfb18) // ..to ARMENIAN SMALL LIGATURE MEN XEH + charset[i++] = c++; + c = 0xfb1d; // from HEBREW LETTER YOD WITH HIRIQ + while (c < 0xfb37) // ..to HEBREW LETTER ZAYIN WITH DAGESH + charset[i++] = c++; + c = 0xfb38; // from HEBREW LETTER TET WITH DAGESH + while (c < 0xfb3d) // ..to HEBREW LETTER LAMED WITH DAGESH + charset[i++] = c++; + charset[i++] = 0xfb40; // HEBREW LETTER NUN WITH DAGESH + charset[i++] = 0xfb41; // HEBREW LETTER SAMEKH WITH DAGESH + charset[i++] = 0xfb43; // HEBREW LETTER FINAL PE WITH DAGESH + charset[i++] = 0xfb44; // HEBREW LETTER PE WITH DAGESH + c = 0xfb46; // from HEBREW LETTER TSADI WITH DAGESH + while (c < 0xfbc2) // ..to ARABIC SYMBOL SMALL TAH BELOW + charset[i++] = c++; + c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM + while (c < 0xfd40) // ..to ORNATE RIGHT PARENTHESIS + charset[i++] = c++; + c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM + while (c < 0xfd90) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + charset[i++] = c++; + c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM + while (c < 0xfdc8) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + charset[i++] = c++; + c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM + while (c < 0xfdfe) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM + charset[i++] = c++; + c = 0xfe00; // from VARIATION SELECTOR-1 + while (c < 0xfe1a) // ..to PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS + charset[i++] = c++; + c = 0xfe20; // from COMBINING LIGATURE LEFT HALF + while (c < 0xfe27) // ..to COMBINING CONJOINING MACRON + charset[i++] = c++; + c = 0xfe30; // from PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + while (c < 0xfe53) // ..to SMALL FULL STOP + charset[i++] = c++; + c = 0xfe54; // from SMALL SEMICOLON + while (c < 0xfe67) // ..to SMALL EQUALS SIGN + charset[i++] = c++; + c = 0xfe68; // from SMALL REVERSE SOLIDUS + while (c < 0xfe6c) // ..to SMALL COMMERCIAL AT + charset[i++] = c++; + c = 0xfe70; // from ARABIC FATHATAN ISOLATED FORM + while (c < 0xfe75) // ..to ARABIC KASRATAN ISOLATED FORM + charset[i++] = c++; + c = 0xfe76; // from ARABIC FATHA ISOLATED FORM + while (c < 0xfefd) // ..to ARABIC LIGATURE LAM WITH ALEF FINAL FORM + charset[i++] = c++; + c = 0xff01; // from FULLWIDTH EXCLAMATION MARK + while (c < 0xffbf) // ..to HALFWIDTH HANGUL LETTER HIEUH + charset[i++] = c++; + c = 0xffc2; // from HALFWIDTH HANGUL LETTER A + while (c < 0xffc8) // ..to HALFWIDTH HANGUL LETTER E + charset[i++] = c++; + c = 0xffca; // from HALFWIDTH HANGUL LETTER YEO + while (c < 0xffd0) // ..to HALFWIDTH HANGUL LETTER OE + charset[i++] = c++; + c = 0xffd2; // from HALFWIDTH HANGUL LETTER YO + while (c < 0xffd8) // ..to HALFWIDTH HANGUL LETTER YU + charset[i++] = c++; + charset[i++] = 0xffda; // HALFWIDTH HANGUL LETTER EU + charset[i++] = 0xffdc; // HALFWIDTH HANGUL LETTER I + c = 0xffe0; // from FULLWIDTH CENT SIGN + while (c < 0xffe7) // ..to FULLWIDTH WON SIGN + charset[i++] = c++; + c = 0xffe8; // from HALFWIDTH FORMS LIGHT VERTICAL + while (c < 0xffef) // ..to HALFWIDTH WHITE CIRCLE + charset[i++] = c++; + c = 0xfff9; // from INTERLINEAR ANNOTATION ANCHOR + while (c < 0xfffe) // ..to REPLACEMENT CHARACTER + charset[i++] = c++; + +/* Zero-terminate it, and cache the first character */ + charset[i] = 0; + c0 = charset[0]; + + last = minlength - 1; + i = 0; + while (i <= last) { + id[i] = 0; + ucs2[i++] = c0; + } + lastid = -1; + ucs2[i] = 0; + +/* We must init word with dummy data, it doesn't get set until filter() */ + word = 1; +} + +void generate() +{ + int i; + +/* Handle the typical case specially */ + if (ucs2[last] = charset[++lastid]) return; + + lastid = 0; + ucs2[i = last] = c0; + while (i--) { // Have a preceding position? + if (ucs2[i] = charset[++id[i]]) return; + id[i] = 0; + ucs2[i] = c0; + } + + if (++last < maxlength) { // Next length? + id[last] = lastid = 0; + ucs2[last] = c0; + ucs2[last + 1] = 0; + } else // We're done + ucs2 = 0; +} + +void restore() +{ + int i, o, c; + +/* Convert the restored word back from UTF-8 to UCS-2 */ + i = o = 0; + while (c = word[i]) { + if (c >= 0xe0) { + c = (c << 6) + word[++i]; + c = (c << 6) + word[++i]; + c -= 0xE2080; + } else if (c >= 0xc0) { + c = (c << 6) + word[++i]; + c -= 0x3080; + } + i++; + ucs2[o++] = c; + } + ucs2[o] = 0; + +/* Calculate the current length and infer the character indices */ + last = 0; + while (c = ucs2[last]) { + i = 0; while (charset[i] != c && charset[i]) i++; + if (!charset[i]) i = 0; // Not found + id[last++] = i; + } + lastid = id[--last]; +} + +/* Convert from UCS-2 to UTF-8 */ +void filter() +{ + int i, c; + i = -1; c = 0; + + while (ucs2[++i]) { + if (ucs2[i] >= 0x0800) { + word[c++] = 0xe0 | (ucs2[i]>>12); + word[c++] = 0x80 | (ucs2[i]>>6 & 0x3f); + word[c++] = 0x80 | (ucs2[i] & 0x3f); + } + else if (ucs2[i] >= 0x80) { + word[c++] = 0xc0 | (ucs2[i]>>6); + word[c++] = 0x80 | (ucs2[i] & 0x3f); + } + else { + word[c++] = ucs2[i]; + } + } + word[c] = 0; +} diff --git a/john/dumb32.conf b/john/dumb32.conf new file mode 100644 index 0000000..725e716 --- /dev/null +++ b/john/dumb32.conf @@ -0,0 +1,1434 @@ +# This software is Copyright (c) 2012 magnum, and it is hereby +# released to the general public under the following terms: +# Redistribution and use in source and binary forms, with or without +# modification, are permitted. +# +# Generic implementation of "dumb" exhaustive search of FULL Unicode and +# an arbitrary charset. Default is to try *all* allocated characters (there's +# 109070 of them). Even if a fast format can exhaust two characters in one +# hour, three characters would take 12 years... +# +# The output is UTF-8, so for 16-bit formats you need to give --enc=utf8 +[List.External:Dumb32] +int maxlength; // Maximum password length to try +int last; // Last character position, zero-based +int lastid; // Character index in the last position +int id[0x7f]; // Current character indices for other positions +int charset[0x20000], c0; // Characters +int utf32[0x7F]; // Word in UTF32 + +void init() +{ + int minlength; + int i, c; + + minlength = 1; // Initial password length to try, must be at least 1 + maxlength = 2; // Must be at least same as minlength + +/* + * This defines the character set. This is auto-generated from UnicodeData.txt + * and we skip control characters. + */ + i = 0; + c = 0x20; // from SPACE + while (c < 0x7f) // ..to TILDE + charset[i++] = c++; + c = 0xa0; // from NO-BREAK SPACE + while (c < 0x378) // ..to GREEK SMALL LETTER PAMPHYLIAN DIGAMMA + charset[i++] = c++; + c = 0x37a; // from GREEK YPOGEGRAMMENI + while (c < 0x37f) // ..to GREEK QUESTION MARK + charset[i++] = c++; + c = 0x384; // from GREEK TONOS + while (c < 0x38b) // ..to GREEK CAPITAL LETTER IOTA WITH TONOS + charset[i++] = c++; + c = 0x38e; // from GREEK CAPITAL LETTER UPSILON WITH TONOS + while (c < 0x3a2) // ..to GREEK CAPITAL LETTER RHO + charset[i++] = c++; + c = 0x3a3; // from GREEK CAPITAL LETTER SIGMA + while (c < 0x528) // ..to CYRILLIC SMALL LETTER SHHA WITH DESCENDER + charset[i++] = c++; + c = 0x531; // from ARMENIAN CAPITAL LETTER AYB + while (c < 0x557) // ..to ARMENIAN CAPITAL LETTER FEH + charset[i++] = c++; + c = 0x559; // from ARMENIAN MODIFIER LETTER LEFT HALF RING + while (c < 0x560) // ..to ARMENIAN ABBREVIATION MARK + charset[i++] = c++; + c = 0x561; // from ARMENIAN SMALL LETTER AYB + while (c < 0x588) // ..to ARMENIAN SMALL LIGATURE ECH YIWN + charset[i++] = c++; + charset[i++] = 0x589; // ARMENIAN FULL STOP + charset[i++] = 0x58a; // ARMENIAN HYPHEN + c = 0x591; // from HEBREW ACCENT ETNAHTA + while (c < 0x5c8) // ..to HEBREW POINT QAMATS QATAN + charset[i++] = c++; + c = 0x5d0; // from HEBREW LETTER ALEF + while (c < 0x5eb) // ..to HEBREW LETTER TAV + charset[i++] = c++; + c = 0x5f0; // from HEBREW LIGATURE YIDDISH DOUBLE VAV + while (c < 0x5f5) // ..to HEBREW PUNCTUATION GERSHAYIM + charset[i++] = c++; + c = 0x600; // from ARABIC NUMBER SIGN + while (c < 0x604) // ..to ARABIC SIGN SAFHA + charset[i++] = c++; + c = 0x606; // from ARABIC-INDIC CUBE ROOT + while (c < 0x61c) // ..to ARABIC SEMICOLON + charset[i++] = c++; + c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK + while (c < 0x70e) // ..to SYRIAC HARKLEAN ASTERISCUS + charset[i++] = c++; + c = 0x70f; // from SYRIAC ABBREVIATION MARK + while (c < 0x74b) // ..to SYRIAC BARREKH + charset[i++] = c++; + c = 0x74d; // from SYRIAC LETTER SOGDIAN ZHAIN + while (c < 0x7b2) // ..to THAANA LETTER NAA + charset[i++] = c++; + c = 0x7c0; // from NKO DIGIT ZERO + while (c < 0x7fb) // ..to NKO LAJANYALAN + charset[i++] = c++; + c = 0x800; // from SAMARITAN LETTER ALAF + while (c < 0x82e) // ..to SAMARITAN MARK NEQUDAA + charset[i++] = c++; + c = 0x830; // from SAMARITAN PUNCTUATION NEQUDAA + while (c < 0x83f) // ..to SAMARITAN PUNCTUATION ANNAAU + charset[i++] = c++; + c = 0x840; // from MANDAIC LETTER HALQA + while (c < 0x85c) // ..to MANDAIC GEMINATION MARK + charset[i++] = c++; + c = 0x900; // from DEVANAGARI SIGN INVERTED CANDRABINDU + while (c < 0x978) // ..to DEVANAGARI LETTER UUE + charset[i++] = c++; + c = 0x979; // from DEVANAGARI LETTER ZHA + while (c < 0x980) // ..to DEVANAGARI LETTER BBA + charset[i++] = c++; + charset[i++] = 0x981; // BENGALI SIGN CANDRABINDU + charset[i++] = 0x983; // BENGALI SIGN VISARGA + c = 0x985; // from BENGALI LETTER A + while (c < 0x98d) // ..to BENGALI LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0x98f; // BENGALI LETTER E + charset[i++] = 0x990; // BENGALI LETTER AI + c = 0x993; // from BENGALI LETTER O + while (c < 0x9a9) // ..to BENGALI LETTER NA + charset[i++] = c++; + c = 0x9aa; // from BENGALI LETTER PA + while (c < 0x9b1) // ..to BENGALI LETTER RA + charset[i++] = c++; + c = 0x9b6; // from BENGALI LETTER SHA + while (c < 0x9ba) // ..to BENGALI LETTER HA + charset[i++] = c++; + c = 0x9bc; // from BENGALI SIGN NUKTA + while (c < 0x9c5) // ..to BENGALI VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0x9c7; // BENGALI VOWEL SIGN E + charset[i++] = 0x9c8; // BENGALI VOWEL SIGN AI + c = 0x9cb; // from BENGALI VOWEL SIGN O + while (c < 0x9cf) // ..to BENGALI LETTER KHANDA TA + charset[i++] = c++; + charset[i++] = 0x9dc; // BENGALI LETTER RRA + charset[i++] = 0x9dd; // BENGALI LETTER RHA + c = 0x9df; // from BENGALI LETTER YYA + while (c < 0x9e4) // ..to BENGALI VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0x9e6; // from BENGALI DIGIT ZERO + while (c < 0x9fc) // ..to BENGALI GANDA MARK + charset[i++] = c++; + charset[i++] = 0xa01; // GURMUKHI SIGN ADAK BINDI + charset[i++] = 0xa03; // GURMUKHI SIGN VISARGA + c = 0xa05; // from GURMUKHI LETTER A + while (c < 0xa0b) // ..to GURMUKHI LETTER UU + charset[i++] = c++; + charset[i++] = 0xa0f; // GURMUKHI LETTER EE + charset[i++] = 0xa10; // GURMUKHI LETTER AI + c = 0xa13; // from GURMUKHI LETTER OO + while (c < 0xa29) // ..to GURMUKHI LETTER NA + charset[i++] = c++; + c = 0xa2a; // from GURMUKHI LETTER PA + while (c < 0xa31) // ..to GURMUKHI LETTER RA + charset[i++] = c++; + charset[i++] = 0xa32; // GURMUKHI LETTER LA + charset[i++] = 0xa33; // GURMUKHI LETTER LLA + charset[i++] = 0xa35; // GURMUKHI LETTER VA + charset[i++] = 0xa36; // GURMUKHI LETTER SHA + charset[i++] = 0xa38; // GURMUKHI LETTER SA + charset[i++] = 0xa39; // GURMUKHI LETTER HA + c = 0xa3e; // from GURMUKHI VOWEL SIGN AA + while (c < 0xa43) // ..to GURMUKHI VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xa47; // GURMUKHI VOWEL SIGN EE + charset[i++] = 0xa48; // GURMUKHI VOWEL SIGN AI + charset[i++] = 0xa4b; // GURMUKHI VOWEL SIGN OO + charset[i++] = 0xa4d; // GURMUKHI SIGN VIRAMA + c = 0xa59; // from GURMUKHI LETTER KHHA + while (c < 0xa5d) // ..to GURMUKHI LETTER RRA + charset[i++] = c++; + c = 0xa66; // from GURMUKHI DIGIT ZERO + while (c < 0xa76) // ..to GURMUKHI SIGN YAKASH + charset[i++] = c++; + charset[i++] = 0xa81; // GUJARATI SIGN CANDRABINDU + charset[i++] = 0xa83; // GUJARATI SIGN VISARGA + c = 0xa85; // from GUJARATI LETTER A + while (c < 0xa8e) // ..to GUJARATI VOWEL CANDRA E + charset[i++] = c++; + charset[i++] = 0xa8f; // GUJARATI LETTER E + charset[i++] = 0xa91; // GUJARATI VOWEL CANDRA O + c = 0xa93; // from GUJARATI LETTER O + while (c < 0xaa9) // ..to GUJARATI LETTER NA + charset[i++] = c++; + c = 0xaaa; // from GUJARATI LETTER PA + while (c < 0xab1) // ..to GUJARATI LETTER RA + charset[i++] = c++; + charset[i++] = 0xab2; // GUJARATI LETTER LA + charset[i++] = 0xab3; // GUJARATI LETTER LLA + c = 0xab5; // from GUJARATI LETTER VA + while (c < 0xaba) // ..to GUJARATI LETTER HA + charset[i++] = c++; + c = 0xabc; // from GUJARATI SIGN NUKTA + while (c < 0xac6) // ..to GUJARATI VOWEL SIGN CANDRA E + charset[i++] = c++; + charset[i++] = 0xac7; // GUJARATI VOWEL SIGN E + charset[i++] = 0xac9; // GUJARATI VOWEL SIGN CANDRA O + charset[i++] = 0xacb; // GUJARATI VOWEL SIGN O + charset[i++] = 0xacd; // GUJARATI SIGN VIRAMA + c = 0xae0; // from GUJARATI LETTER VOCALIC RR + while (c < 0xae4) // ..to GUJARATI VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xae6; // from GUJARATI DIGIT ZERO + while (c < 0xaf0) // ..to GUJARATI DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xb01; // ORIYA SIGN CANDRABINDU + charset[i++] = 0xb03; // ORIYA SIGN VISARGA + c = 0xb05; // from ORIYA LETTER A + while (c < 0xb0d) // ..to ORIYA LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xb0f; // ORIYA LETTER E + charset[i++] = 0xb10; // ORIYA LETTER AI + c = 0xb13; // from ORIYA LETTER O + while (c < 0xb29) // ..to ORIYA LETTER NA + charset[i++] = c++; + c = 0xb2a; // from ORIYA LETTER PA + while (c < 0xb31) // ..to ORIYA LETTER RA + charset[i++] = c++; + charset[i++] = 0xb32; // ORIYA LETTER LA + charset[i++] = 0xb33; // ORIYA LETTER LLA + c = 0xb35; // from ORIYA LETTER VA + while (c < 0xb3a) // ..to ORIYA LETTER HA + charset[i++] = c++; + c = 0xb3c; // from ORIYA SIGN NUKTA + while (c < 0xb45) // ..to ORIYA VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xb47; // ORIYA VOWEL SIGN E + charset[i++] = 0xb48; // ORIYA VOWEL SIGN AI + charset[i++] = 0xb4b; // ORIYA VOWEL SIGN O + charset[i++] = 0xb4d; // ORIYA SIGN VIRAMA + charset[i++] = 0xb56; // ORIYA AI LENGTH MARK + charset[i++] = 0xb57; // ORIYA AU LENGTH MARK + charset[i++] = 0xb5c; // ORIYA LETTER RRA + charset[i++] = 0xb5d; // ORIYA LETTER RHA + c = 0xb5f; // from ORIYA LETTER YYA + while (c < 0xb64) // ..to ORIYA VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xb66; // from ORIYA DIGIT ZERO + while (c < 0xb78) // ..to ORIYA FRACTION THREE SIXTEENTHS + charset[i++] = c++; + charset[i++] = 0xb82; // TAMIL SIGN ANUSVARA + charset[i++] = 0xb83; // TAMIL SIGN VISARGA + c = 0xb85; // from TAMIL LETTER A + while (c < 0xb8b) // ..to TAMIL LETTER UU + charset[i++] = c++; + charset[i++] = 0xb8e; // TAMIL LETTER E + charset[i++] = 0xb90; // TAMIL LETTER AI + c = 0xb92; // from TAMIL LETTER O + while (c < 0xb96) // ..to TAMIL LETTER KA + charset[i++] = c++; + charset[i++] = 0xb99; // TAMIL LETTER NGA + charset[i++] = 0xb9a; // TAMIL LETTER CA + charset[i++] = 0xb9e; // TAMIL LETTER NYA + charset[i++] = 0xb9f; // TAMIL LETTER TTA + charset[i++] = 0xba3; // TAMIL LETTER NNA + charset[i++] = 0xba4; // TAMIL LETTER TA + charset[i++] = 0xba8; // TAMIL LETTER NA + charset[i++] = 0xbaa; // TAMIL LETTER PA + c = 0xbae; // from TAMIL LETTER MA + while (c < 0xbba) // ..to TAMIL LETTER HA + charset[i++] = c++; + c = 0xbbe; // from TAMIL VOWEL SIGN AA + while (c < 0xbc3) // ..to TAMIL VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xbc6; // TAMIL VOWEL SIGN E + charset[i++] = 0xbc8; // TAMIL VOWEL SIGN AI + c = 0xbca; // from TAMIL VOWEL SIGN O + while (c < 0xbce) // ..to TAMIL SIGN VIRAMA + charset[i++] = c++; + c = 0xbe6; // from TAMIL DIGIT ZERO + while (c < 0xbfb) // ..to TAMIL NUMBER SIGN + charset[i++] = c++; + charset[i++] = 0xc01; // TELUGU SIGN CANDRABINDU + charset[i++] = 0xc03; // TELUGU SIGN VISARGA + c = 0xc05; // from TELUGU LETTER A + while (c < 0xc0d) // ..to TELUGU LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xc0e; // TELUGU LETTER E + charset[i++] = 0xc10; // TELUGU LETTER AI + c = 0xc12; // from TELUGU LETTER O + while (c < 0xc29) // ..to TELUGU LETTER NA + charset[i++] = c++; + c = 0xc2a; // from TELUGU LETTER PA + while (c < 0xc34) // ..to TELUGU LETTER LLA + charset[i++] = c++; + c = 0xc35; // from TELUGU LETTER VA + while (c < 0xc3a) // ..to TELUGU LETTER HA + charset[i++] = c++; + c = 0xc3d; // from TELUGU SIGN AVAGRAHA + while (c < 0xc45) // ..to TELUGU VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xc46; // TELUGU VOWEL SIGN E + charset[i++] = 0xc48; // TELUGU VOWEL SIGN AI + c = 0xc4a; // from TELUGU VOWEL SIGN O + while (c < 0xc4e) // ..to TELUGU SIGN VIRAMA + charset[i++] = c++; + charset[i++] = 0xc55; // TELUGU LENGTH MARK + charset[i++] = 0xc56; // TELUGU AI LENGTH MARK + charset[i++] = 0xc58; // TELUGU LETTER TSA + charset[i++] = 0xc59; // TELUGU LETTER DZA + c = 0xc60; // from TELUGU LETTER VOCALIC RR + while (c < 0xc64) // ..to TELUGU VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xc66; // from TELUGU DIGIT ZERO + while (c < 0xc70) // ..to TELUGU DIGIT NINE + charset[i++] = c++; + c = 0xc78; // from TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR + while (c < 0xc80) // ..to TELUGU SIGN TUUMU + charset[i++] = c++; + charset[i++] = 0xc82; // KANNADA SIGN ANUSVARA + charset[i++] = 0xc83; // KANNADA SIGN VISARGA + c = 0xc85; // from KANNADA LETTER A + while (c < 0xc8d) // ..to KANNADA LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xc8e; // KANNADA LETTER E + charset[i++] = 0xc90; // KANNADA LETTER AI + c = 0xc92; // from KANNADA LETTER O + while (c < 0xca9) // ..to KANNADA LETTER NA + charset[i++] = c++; + c = 0xcaa; // from KANNADA LETTER PA + while (c < 0xcb4) // ..to KANNADA LETTER LLA + charset[i++] = c++; + c = 0xcb5; // from KANNADA LETTER VA + while (c < 0xcba) // ..to KANNADA LETTER HA + charset[i++] = c++; + c = 0xcbc; // from KANNADA SIGN NUKTA + while (c < 0xcc5) // ..to KANNADA VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xcc6; // KANNADA VOWEL SIGN E + charset[i++] = 0xcc8; // KANNADA VOWEL SIGN AI + c = 0xcca; // from KANNADA VOWEL SIGN O + while (c < 0xcce) // ..to KANNADA SIGN VIRAMA + charset[i++] = c++; + charset[i++] = 0xcd5; // KANNADA LENGTH MARK + charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK + c = 0xce0; // from KANNADA LETTER VOCALIC RR + while (c < 0xce4) // ..to KANNADA VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xce6; // from KANNADA DIGIT ZERO + while (c < 0xcf0) // ..to KANNADA DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA + charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA + charset[i++] = 0xd02; // MALAYALAM SIGN ANUSVARA + charset[i++] = 0xd03; // MALAYALAM SIGN VISARGA + c = 0xd05; // from MALAYALAM LETTER A + while (c < 0xd0d) // ..to MALAYALAM LETTER VOCALIC L + charset[i++] = c++; + charset[i++] = 0xd0e; // MALAYALAM LETTER E + charset[i++] = 0xd10; // MALAYALAM LETTER AI + c = 0xd12; // from MALAYALAM LETTER O + while (c < 0xd3b) // ..to MALAYALAM LETTER TTTA + charset[i++] = c++; + c = 0xd3d; // from MALAYALAM SIGN AVAGRAHA + while (c < 0xd45) // ..to MALAYALAM VOWEL SIGN VOCALIC RR + charset[i++] = c++; + charset[i++] = 0xd46; // MALAYALAM VOWEL SIGN E + charset[i++] = 0xd48; // MALAYALAM VOWEL SIGN AI + c = 0xd4a; // from MALAYALAM VOWEL SIGN O + while (c < 0xd4f) // ..to MALAYALAM LETTER DOT REPH + charset[i++] = c++; + c = 0xd60; // from MALAYALAM LETTER VOCALIC RR + while (c < 0xd64) // ..to MALAYALAM VOWEL SIGN VOCALIC LL + charset[i++] = c++; + c = 0xd66; // from MALAYALAM DIGIT ZERO + while (c < 0xd76) // ..to MALAYALAM FRACTION THREE QUARTERS + charset[i++] = c++; + c = 0xd79; // from MALAYALAM DATE MARK + while (c < 0xd80) // ..to MALAYALAM LETTER CHILLU K + charset[i++] = c++; + charset[i++] = 0xd82; // SINHALA SIGN ANUSVARAYA + charset[i++] = 0xd83; // SINHALA SIGN VISARGAYA + c = 0xd85; // from SINHALA LETTER AYANNA + while (c < 0xd97) // ..to SINHALA LETTER AUYANNA + charset[i++] = c++; + c = 0xd9a; // from SINHALA LETTER ALPAPRAANA KAYANNA + while (c < 0xdb2) // ..to SINHALA LETTER DANTAJA NAYANNA + charset[i++] = c++; + c = 0xdb3; // from SINHALA LETTER SANYAKA DAYANNA + while (c < 0xdbc) // ..to SINHALA LETTER RAYANNA + charset[i++] = c++; + c = 0xdc0; // from SINHALA LETTER VAYANNA + while (c < 0xdc7) // ..to SINHALA LETTER FAYANNA + charset[i++] = c++; + c = 0xdcf; // from SINHALA VOWEL SIGN AELA-PILLA + while (c < 0xdd5) // ..to SINHALA VOWEL SIGN KETTI PAA-PILLA + charset[i++] = c++; + c = 0xdd8; // from SINHALA VOWEL SIGN GAETTA-PILLA + while (c < 0xde0) // ..to SINHALA VOWEL SIGN GAYANUKITTA + charset[i++] = c++; + charset[i++] = 0xdf2; // SINHALA VOWEL SIGN DIGA GAETTA-PILLA + charset[i++] = 0xdf4; // SINHALA PUNCTUATION KUNDDALIYA + c = 0xe01; // from THAI CHARACTER KO KAI + while (c < 0xe3b) // ..to THAI CHARACTER PHINTHU + charset[i++] = c++; + c = 0xe3f; // from THAI CURRENCY SYMBOL BAHT + while (c < 0xe5c) // ..to THAI CHARACTER KHOMUT + charset[i++] = c++; + charset[i++] = 0xe81; // LAO LETTER KO + charset[i++] = 0xe82; // LAO LETTER KHO SUNG + charset[i++] = 0xe87; // LAO LETTER NGO + charset[i++] = 0xe88; // LAO LETTER CO + c = 0xe94; // from LAO LETTER DO + while (c < 0xe98) // ..to LAO LETTER THO TAM + charset[i++] = c++; + c = 0xe99; // from LAO LETTER NO + while (c < 0xea0) // ..to LAO LETTER FO SUNG + charset[i++] = c++; + charset[i++] = 0xea1; // LAO LETTER MO + charset[i++] = 0xea3; // LAO LETTER LO LING + charset[i++] = 0xeaa; // LAO LETTER SO SUNG + charset[i++] = 0xeab; // LAO LETTER HO SUNG + c = 0xead; // from LAO LETTER O + while (c < 0xeba) // ..to LAO VOWEL SIGN UU + charset[i++] = c++; + charset[i++] = 0xebb; // LAO VOWEL SIGN MAI KON + charset[i++] = 0xebd; // LAO SEMIVOWEL SIGN NYO + c = 0xec0; // from LAO VOWEL SIGN E + while (c < 0xec5) // ..to LAO VOWEL SIGN AI + charset[i++] = c++; + c = 0xec8; // from LAO TONE MAI EK + while (c < 0xece) // ..to LAO NIGGAHITA + charset[i++] = c++; + c = 0xed0; // from LAO DIGIT ZERO + while (c < 0xeda) // ..to LAO DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xedc; // LAO HO NO + charset[i++] = 0xedd; // LAO HO MO + c = 0xf00; // from TIBETAN SYLLABLE OM + while (c < 0xf48) // ..to TIBETAN LETTER JA + charset[i++] = c++; + c = 0xf49; // from TIBETAN LETTER NYA + while (c < 0xf6d) // ..to TIBETAN LETTER RRA + charset[i++] = c++; + c = 0xf71; // from TIBETAN VOWEL SIGN AA + while (c < 0xf98) // ..to TIBETAN SUBJOINED LETTER JA + charset[i++] = c++; + c = 0xf99; // from TIBETAN SUBJOINED LETTER NYA + while (c < 0xfbd) // ..to TIBETAN SUBJOINED LETTER FIXED-FORM RA + charset[i++] = c++; + c = 0xfbe; // from TIBETAN KU RU KHA + while (c < 0xfcd) // ..to TIBETAN SYMBOL NOR BU BZHI -KHYIL + charset[i++] = c++; + c = 0xfce; // from TIBETAN SIGN RDEL NAG RDEL DKAR + while (c < 0xfdb) // ..to TIBETAN MARK TRAILING MCHAN RTAGS + charset[i++] = c++; + c = 0x1000; // from MYANMAR LETTER KA + while (c < 0x10c6) // ..to GEORGIAN CAPITAL LETTER HOE + charset[i++] = c++; + c = 0x10d0; // from GEORGIAN LETTER AN + while (c < 0x10fd) // ..to MODIFIER LETTER GEORGIAN NAR + charset[i++] = c++; + c = 0x1100; // from HANGUL CHOSEONG KIYEOK + while (c < 0x1249) // ..to ETHIOPIC SYLLABLE QWA + charset[i++] = c++; + c = 0x124a; // from ETHIOPIC SYLLABLE QWI + while (c < 0x124e) // ..to ETHIOPIC SYLLABLE QWE + charset[i++] = c++; + c = 0x1250; // from ETHIOPIC SYLLABLE QHA + while (c < 0x1257) // ..to ETHIOPIC SYLLABLE QHO + charset[i++] = c++; + c = 0x125a; // from ETHIOPIC SYLLABLE QHWI + while (c < 0x125e) // ..to ETHIOPIC SYLLABLE QHWE + charset[i++] = c++; + c = 0x1260; // from ETHIOPIC SYLLABLE BA + while (c < 0x1289) // ..to ETHIOPIC SYLLABLE XWA + charset[i++] = c++; + c = 0x128a; // from ETHIOPIC SYLLABLE XWI + while (c < 0x128e) // ..to ETHIOPIC SYLLABLE XWE + charset[i++] = c++; + c = 0x1290; // from ETHIOPIC SYLLABLE NA + while (c < 0x12b1) // ..to ETHIOPIC SYLLABLE KWA + charset[i++] = c++; + c = 0x12b2; // from ETHIOPIC SYLLABLE KWI + while (c < 0x12b6) // ..to ETHIOPIC SYLLABLE KWE + charset[i++] = c++; + c = 0x12b8; // from ETHIOPIC SYLLABLE KXA + while (c < 0x12bf) // ..to ETHIOPIC SYLLABLE KXO + charset[i++] = c++; + c = 0x12c2; // from ETHIOPIC SYLLABLE KXWI + while (c < 0x12c6) // ..to ETHIOPIC SYLLABLE KXWE + charset[i++] = c++; + c = 0x12c8; // from ETHIOPIC SYLLABLE WA + while (c < 0x12d7) // ..to ETHIOPIC SYLLABLE PHARYNGEAL O + charset[i++] = c++; + c = 0x12d8; // from ETHIOPIC SYLLABLE ZA + while (c < 0x1311) // ..to ETHIOPIC SYLLABLE GWA + charset[i++] = c++; + c = 0x1312; // from ETHIOPIC SYLLABLE GWI + while (c < 0x1316) // ..to ETHIOPIC SYLLABLE GWE + charset[i++] = c++; + c = 0x1318; // from ETHIOPIC SYLLABLE GGA + while (c < 0x135b) // ..to ETHIOPIC SYLLABLE FYA + charset[i++] = c++; + c = 0x135d; // from ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK + while (c < 0x137d) // ..to ETHIOPIC NUMBER TEN THOUSAND + charset[i++] = c++; + c = 0x1380; // from ETHIOPIC SYLLABLE SEBATBEIT MWA + while (c < 0x139a) // ..to ETHIOPIC TONAL MARK KURT + charset[i++] = c++; + c = 0x13a0; // from CHEROKEE LETTER A + while (c < 0x13f5) // ..to CHEROKEE LETTER YV + charset[i++] = c++; + c = 0x1400; // from CANADIAN SYLLABICS HYPHEN + while (c < 0x169d) // ..to OGHAM REVERSED FEATHER MARK + charset[i++] = c++; + c = 0x16a0; // from RUNIC LETTER FEHU FEOH FE F + while (c < 0x16f1) // ..to RUNIC BELGTHOR SYMBOL + charset[i++] = c++; + c = 0x1700; // from TAGALOG LETTER A + while (c < 0x170d) // ..to TAGALOG LETTER YA + charset[i++] = c++; + c = 0x170e; // from TAGALOG LETTER LA + while (c < 0x1715) // ..to TAGALOG SIGN VIRAMA + charset[i++] = c++; + c = 0x1720; // from HANUNOO LETTER A + while (c < 0x1737) // ..to PHILIPPINE DOUBLE PUNCTUATION + charset[i++] = c++; + c = 0x1740; // from BUHID LETTER A + while (c < 0x1754) // ..to BUHID VOWEL SIGN U + charset[i++] = c++; + c = 0x1760; // from TAGBANWA LETTER A + while (c < 0x176d) // ..to TAGBANWA LETTER YA + charset[i++] = c++; + charset[i++] = 0x176e; // TAGBANWA LETTER LA + charset[i++] = 0x1770; // TAGBANWA LETTER SA + charset[i++] = 0x1772; // TAGBANWA VOWEL SIGN I + charset[i++] = 0x1773; // TAGBANWA VOWEL SIGN U + c = 0x1780; // from KHMER LETTER KA + while (c < 0x17de) // ..to KHMER SIGN ATTHACAN + charset[i++] = c++; + c = 0x17e0; // from KHMER DIGIT ZERO + while (c < 0x17ea) // ..to KHMER DIGIT NINE + charset[i++] = c++; + c = 0x17f0; // from KHMER SYMBOL LEK ATTAK SON + while (c < 0x17fa) // ..to KHMER SYMBOL LEK ATTAK PRAM-BUON + charset[i++] = c++; + c = 0x1800; // from MONGOLIAN BIRGA + while (c < 0x180f) // ..to MONGOLIAN VOWEL SEPARATOR + charset[i++] = c++; + c = 0x1810; // from MONGOLIAN DIGIT ZERO + while (c < 0x181a) // ..to MONGOLIAN DIGIT NINE + charset[i++] = c++; + c = 0x1820; // from MONGOLIAN LETTER A + while (c < 0x1878) // ..to MONGOLIAN LETTER MANCHU ZHA + charset[i++] = c++; + c = 0x1880; // from MONGOLIAN LETTER ALI GALI ANUSVARA ONE + while (c < 0x18ab) // ..to MONGOLIAN LETTER MANCHU ALI GALI LHA + charset[i++] = c++; + c = 0x18b0; // from CANADIAN SYLLABICS OY + while (c < 0x18f6) // ..to CANADIAN SYLLABICS CARRIER DENTAL S + charset[i++] = c++; + c = 0x1900; // from LIMBU VOWEL-CARRIER LETTER + while (c < 0x191d) // ..to LIMBU LETTER HA + charset[i++] = c++; + c = 0x1920; // from LIMBU VOWEL SIGN A + while (c < 0x192c) // ..to LIMBU SUBJOINED LETTER WA + charset[i++] = c++; + c = 0x1930; // from LIMBU SMALL LETTER KA + while (c < 0x193c) // ..to LIMBU SIGN SA-I + charset[i++] = c++; + c = 0x1944; // from LIMBU EXCLAMATION MARK + while (c < 0x196e) // ..to TAI LE LETTER AI + charset[i++] = c++; + c = 0x1970; // from TAI LE LETTER TONE-2 + while (c < 0x1975) // ..to TAI LE LETTER TONE-6 + charset[i++] = c++; + c = 0x1980; // from NEW TAI LUE LETTER HIGH QA + while (c < 0x19ac) // ..to NEW TAI LUE LETTER LOW SUA + charset[i++] = c++; + c = 0x19b0; // from NEW TAI LUE VOWEL SIGN VOWEL SHORTENER + while (c < 0x19ca) // ..to NEW TAI LUE TONE MARK-2 + charset[i++] = c++; + c = 0x19d0; // from NEW TAI LUE DIGIT ZERO + while (c < 0x19db) // ..to NEW TAI LUE THAM DIGIT ONE + charset[i++] = c++; + c = 0x19de; // from NEW TAI LUE SIGN LAE + while (c < 0x1a1c) // ..to BUGINESE VOWEL SIGN AE + charset[i++] = c++; + c = 0x1a1e; // from BUGINESE PALLAWA + while (c < 0x1a5f) // ..to TAI THAM CONSONANT SIGN SA + charset[i++] = c++; + c = 0x1a60; // from TAI THAM SIGN SAKOT + while (c < 0x1a7d) // ..to TAI THAM SIGN KHUEN-LUE KARAN + charset[i++] = c++; + c = 0x1a7f; // from TAI THAM COMBINING CRYPTOGRAMMIC DOT + while (c < 0x1a8a) // ..to TAI THAM HORA DIGIT NINE + charset[i++] = c++; + c = 0x1a90; // from TAI THAM THAM DIGIT ZERO + while (c < 0x1a9a) // ..to TAI THAM THAM DIGIT NINE + charset[i++] = c++; + c = 0x1aa0; // from TAI THAM SIGN WIANG + while (c < 0x1aae) // ..to TAI THAM SIGN CAANG + charset[i++] = c++; + c = 0x1b00; // from BALINESE SIGN ULU RICEM + while (c < 0x1b4c) // ..to BALINESE LETTER ASYURA SASAK + charset[i++] = c++; + c = 0x1b50; // from BALINESE DIGIT ZERO + while (c < 0x1b7d) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING + charset[i++] = c++; + c = 0x1b80; // from SUNDANESE SIGN PANYECEK + while (c < 0x1bab) // ..to SUNDANESE SIGN PAMAAEH + charset[i++] = c++; + c = 0x1bae; // from SUNDANESE LETTER KHA + while (c < 0x1bba) // ..to SUNDANESE DIGIT NINE + charset[i++] = c++; + c = 0x1bc0; // from BATAK LETTER A + while (c < 0x1bf4) // ..to BATAK PANONGONAN + charset[i++] = c++; + c = 0x1bfc; // from BATAK SYMBOL BINDU NA METEK + while (c < 0x1c38) // ..to LEPCHA SIGN NUKTA + charset[i++] = c++; + c = 0x1c3b; // from LEPCHA PUNCTUATION TA-ROL + while (c < 0x1c4a) // ..to LEPCHA DIGIT NINE + charset[i++] = c++; + c = 0x1c4d; // from LEPCHA LETTER TTA + while (c < 0x1c80) // ..to OL CHIKI PUNCTUATION DOUBLE MUCAAD + charset[i++] = c++; + c = 0x1cd0; // from VEDIC TONE KARSHANA + while (c < 0x1cf3) // ..to VEDIC SIGN ARDHAVISARGA + charset[i++] = c++; + c = 0x1d00; // from LATIN LETTER SMALL CAPITAL A + while (c < 0x1de7) // ..to COMBINING LATIN SMALL LETTER Z + charset[i++] = c++; + c = 0x1dfc; // from COMBINING DOUBLE INVERTED BREVE BELOW + while (c < 0x1f16) // ..to GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f18; // from GREEK CAPITAL LETTER EPSILON WITH PSILI + while (c < 0x1f1e) // ..to GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f20; // from GREEK SMALL LETTER ETA WITH PSILI + while (c < 0x1f46) // ..to GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f48; // from GREEK CAPITAL LETTER OMICRON WITH PSILI + while (c < 0x1f4e) // ..to GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA + charset[i++] = c++; + c = 0x1f50; // from GREEK SMALL LETTER UPSILON WITH PSILI + while (c < 0x1f58) // ..to GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI + charset[i++] = c++; + c = 0x1f5f; // from GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI + while (c < 0x1f7e) // ..to GREEK SMALL LETTER OMEGA WITH OXIA + charset[i++] = c++; + c = 0x1f80; // from GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI + while (c < 0x1fb5) // ..to GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI + charset[i++] = c++; + c = 0x1fb6; // from GREEK SMALL LETTER ALPHA WITH PERISPOMENI + while (c < 0x1fc5) // ..to GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI + charset[i++] = c++; + c = 0x1fc6; // from GREEK SMALL LETTER ETA WITH PERISPOMENI + while (c < 0x1fd4) // ..to GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + charset[i++] = c++; + c = 0x1fd6; // from GREEK SMALL LETTER IOTA WITH PERISPOMENI + while (c < 0x1fdc) // ..to GREEK CAPITAL LETTER IOTA WITH OXIA + charset[i++] = c++; + c = 0x1fdd; // from GREEK DASIA AND VARIA + while (c < 0x1ff0) // ..to GREEK VARIA + charset[i++] = c++; + charset[i++] = 0x1ff2; // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI + charset[i++] = 0x1ff4; // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + c = 0x1ff6; // from GREEK SMALL LETTER OMEGA WITH PERISPOMENI + while (c < 0x1fff) // ..to GREEK DASIA + charset[i++] = c++; + c = 0x2000; // from EN QUAD + while (c < 0x2065) // ..to INVISIBLE PLUS + charset[i++] = c++; + c = 0x206a; // from INHIBIT SYMMETRIC SWAPPING + while (c < 0x2072) // ..to SUPERSCRIPT LATIN SMALL LETTER I + charset[i++] = c++; + c = 0x2074; // from SUPERSCRIPT FOUR + while (c < 0x208f) // ..to SUBSCRIPT RIGHT PARENTHESIS + charset[i++] = c++; + c = 0x2090; // from LATIN SUBSCRIPT SMALL LETTER A + while (c < 0x209d) // ..to LATIN SUBSCRIPT SMALL LETTER T + charset[i++] = c++; + c = 0x20a0; // from EURO-CURRENCY SIGN + while (c < 0x20ba) // ..to INDIAN RUPEE SIGN + charset[i++] = c++; + c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE + while (c < 0x20f1) // ..to COMBINING ASTERISK ABOVE + charset[i++] = c++; + c = 0x2100; // from ACCOUNT OF + while (c < 0x218a) // ..to VULGAR FRACTION ZERO THIRDS + charset[i++] = c++; + c = 0x2190; // from LEFTWARDS ARROW + while (c < 0x23f4) // ..to HOURGLASS WITH FLOWING SAND + charset[i++] = c++; + c = 0x2400; // from SYMBOL FOR NULL + while (c < 0x2427) // ..to SYMBOL FOR SUBSTITUTE FORM TWO + charset[i++] = c++; + c = 0x2440; // from OCR HOOK + while (c < 0x244b) // ..to OCR DOUBLE BACKSLASH + charset[i++] = c++; + c = 0x2460; // from CIRCLED DIGIT ONE + while (c < 0x2700) // ..to WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + charset[i++] = c++; + c = 0x2701; // from UPPER BLADE SCISSORS + while (c < 0x27cb) // ..to VERTICAL BAR WITH HORIZONTAL STROKE + charset[i++] = c++; + c = 0x27ce; // from SQUARED LOGICAL AND + while (c < 0x2b4d) // ..to RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR + charset[i++] = c++; + c = 0x2b50; // from WHITE MEDIUM STAR + while (c < 0x2b5a) // ..to HEAVY CIRCLED SALTIRE + charset[i++] = c++; + c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU + while (c < 0x2c2f) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE + charset[i++] = c++; + c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU + while (c < 0x2c5f) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE + charset[i++] = c++; + c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR + while (c < 0x2cf2) // ..to COPTIC COMBINING SPIRITUS LENIS + charset[i++] = c++; + c = 0x2cf9; // from COPTIC OLD NUBIAN FULL STOP + while (c < 0x2d26) // ..to GEORGIAN SMALL LETTER HOE + charset[i++] = c++; + c = 0x2d30; // from TIFINAGH LETTER YA + while (c < 0x2d66) // ..to TIFINAGH LETTER YAZZ + charset[i++] = c++; + charset[i++] = 0x2d6f; // TIFINAGH MODIFIER LETTER LABIALIZATION MARK + charset[i++] = 0x2d70; // TIFINAGH SEPARATOR MARK + c = 0x2d7f; // from TIFINAGH CONSONANT JOINER + while (c < 0x2d97) // ..to ETHIOPIC SYLLABLE GGWE + charset[i++] = c++; + c = 0x2da0; // from ETHIOPIC SYLLABLE SSA + while (c < 0x2da7) // ..to ETHIOPIC SYLLABLE SSO + charset[i++] = c++; + c = 0x2da8; // from ETHIOPIC SYLLABLE CCA + while (c < 0x2daf) // ..to ETHIOPIC SYLLABLE CCO + charset[i++] = c++; + c = 0x2db0; // from ETHIOPIC SYLLABLE ZZA + while (c < 0x2db7) // ..to ETHIOPIC SYLLABLE ZZO + charset[i++] = c++; + c = 0x2db8; // from ETHIOPIC SYLLABLE CCHA + while (c < 0x2dbf) // ..to ETHIOPIC SYLLABLE CCHO + charset[i++] = c++; + c = 0x2dc0; // from ETHIOPIC SYLLABLE QYA + while (c < 0x2dc7) // ..to ETHIOPIC SYLLABLE QYO + charset[i++] = c++; + c = 0x2dc8; // from ETHIOPIC SYLLABLE KYA + while (c < 0x2dcf) // ..to ETHIOPIC SYLLABLE KYO + charset[i++] = c++; + c = 0x2dd0; // from ETHIOPIC SYLLABLE XYA + while (c < 0x2dd7) // ..to ETHIOPIC SYLLABLE XYO + charset[i++] = c++; + c = 0x2dd8; // from ETHIOPIC SYLLABLE GYA + while (c < 0x2ddf) // ..to ETHIOPIC SYLLABLE GYO + charset[i++] = c++; + c = 0x2de0; // from COMBINING CYRILLIC LETTER BE + while (c < 0x2e32) // ..to WORD SEPARATOR MIDDLE DOT + charset[i++] = c++; + c = 0x2e80; // from CJK RADICAL REPEAT + while (c < 0x2e9a) // ..to CJK RADICAL RAP + charset[i++] = c++; + c = 0x2e9b; // from CJK RADICAL CHOKE + while (c < 0x2ef4) // ..to CJK RADICAL C-SIMPLIFIED TURTLE + charset[i++] = c++; + c = 0x2f00; // from KANGXI RADICAL ONE + while (c < 0x2fd6) // ..to KANGXI RADICAL FLUTE + charset[i++] = c++; + c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT + while (c < 0x2ffc) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID + charset[i++] = c++; + c = 0x3000; // from IDEOGRAPHIC SPACE + while (c < 0x3040) // ..to IDEOGRAPHIC HALF FILL SPACE + charset[i++] = c++; + c = 0x3041; // from HIRAGANA LETTER SMALL A + while (c < 0x3097) // ..to HIRAGANA LETTER SMALL KE + charset[i++] = c++; + c = 0x3099; // from COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + while (c < 0x3100) // ..to KATAKANA DIGRAPH KOTO + charset[i++] = c++; + c = 0x3105; // from BOPOMOFO LETTER B + while (c < 0x312e) // ..to BOPOMOFO LETTER IH + charset[i++] = c++; + c = 0x3131; // from HANGUL LETTER KIYEOK + while (c < 0x318f) // ..to HANGUL LETTER ARAEAE + charset[i++] = c++; + c = 0x3190; // from IDEOGRAPHIC ANNOTATION LINKING MARK + while (c < 0x31bb) // ..to BOPOMOFO LETTER ZY + charset[i++] = c++; + c = 0x31c0; // from CJK STROKE T + while (c < 0x31e4) // ..to CJK STROKE Q + charset[i++] = c++; + c = 0x31f0; // from KATAKANA LETTER SMALL KU + while (c < 0x321f) // ..to PARENTHESIZED KOREAN CHARACTER O HU + charset[i++] = c++; + c = 0x3220; // from PARENTHESIZED IDEOGRAPH ONE + while (c < 0x32ff) // ..to CIRCLED KATAKANA WO + charset[i++] = c++; + c = 0x3300; // from SQUARE APAATO + while (c < 0x3400) // ..to SQUARE GAL + charset[i++] = c++; + c = 0x3400; // from + while (c < 0x4db6) // ..to + charset[i++] = c++; + c = 0x4dc0; // from HEXAGRAM FOR THE CREATIVE HEAVEN + while (c < 0x4e00) // ..to HEXAGRAM FOR BEFORE COMPLETION + charset[i++] = c++; + c = 0x4e00; // from + while (c < 0x9fcc) // ..to + charset[i++] = c++; + c = 0xa000; // from YI SYLLABLE IT + while (c < 0xa48d) // ..to YI SYLLABLE YYR + charset[i++] = c++; + c = 0xa490; // from YI RADICAL QOT + while (c < 0xa4c7) // ..to YI RADICAL KE + charset[i++] = c++; + c = 0xa4d0; // from LISU LETTER BA + while (c < 0xa62c) // ..to VAI SYLLABLE NDOLE DO + charset[i++] = c++; + c = 0xa640; // from CYRILLIC CAPITAL LETTER ZEMLYA + while (c < 0xa674) // ..to SLAVONIC ASTERISK + charset[i++] = c++; + c = 0xa67c; // from COMBINING CYRILLIC KAVYKA + while (c < 0xa698) // ..to CYRILLIC SMALL LETTER SHWE + charset[i++] = c++; + c = 0xa6a0; // from BAMUM LETTER A + while (c < 0xa6f8) // ..to BAMUM QUESTION MARK + charset[i++] = c++; + c = 0xa700; // from MODIFIER LETTER CHINESE TONE YIN PING + while (c < 0xa78f) // ..to LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT + charset[i++] = c++; + charset[i++] = 0xa790; // LATIN CAPITAL LETTER N WITH DESCENDER + charset[i++] = 0xa791; // LATIN SMALL LETTER N WITH DESCENDER + c = 0xa7a0; // from LATIN CAPITAL LETTER G WITH OBLIQUE STROKE + while (c < 0xa7aa) // ..to LATIN SMALL LETTER S WITH OBLIQUE STROKE + charset[i++] = c++; + c = 0xa7fa; // from LATIN LETTER SMALL CAPITAL TURNED M + while (c < 0xa82c) // ..to SYLOTI NAGRI POETRY MARK-4 + charset[i++] = c++; + c = 0xa830; // from NORTH INDIC FRACTION ONE QUARTER + while (c < 0xa83a) // ..to NORTH INDIC QUANTITY MARK + charset[i++] = c++; + c = 0xa840; // from PHAGS-PA LETTER KA + while (c < 0xa878) // ..to PHAGS-PA MARK DOUBLE SHAD + charset[i++] = c++; + c = 0xa880; // from SAURASHTRA SIGN ANUSVARA + while (c < 0xa8c5) // ..to SAURASHTRA SIGN VIRAMA + charset[i++] = c++; + c = 0xa8ce; // from SAURASHTRA DANDA + while (c < 0xa8da) // ..to SAURASHTRA DIGIT NINE + charset[i++] = c++; + c = 0xa8e0; // from COMBINING DEVANAGARI DIGIT ZERO + while (c < 0xa8fc) // ..to DEVANAGARI HEADSTROKE + charset[i++] = c++; + c = 0xa900; // from KAYAH LI DIGIT ZERO + while (c < 0xa954) // ..to REJANG VIRAMA + charset[i++] = c++; + c = 0xa95f; // from REJANG SECTION MARK + while (c < 0xa97d) // ..to HANGUL CHOSEONG SSANGYEORINHIEUH + charset[i++] = c++; + c = 0xa980; // from JAVANESE SIGN PANYANGGA + while (c < 0xa9ce) // ..to JAVANESE TURNED PADA PISELEH + charset[i++] = c++; + c = 0xa9cf; // from JAVANESE PANGRANGKEP + while (c < 0xa9da) // ..to JAVANESE DIGIT NINE + charset[i++] = c++; + charset[i++] = 0xa9de; // JAVANESE PADA TIRTA TUMETES + charset[i++] = 0xa9df; // JAVANESE PADA ISEN-ISEN + c = 0xaa00; // from CHAM LETTER A + while (c < 0xaa37) // ..to CHAM CONSONANT SIGN WA + charset[i++] = c++; + c = 0xaa40; // from CHAM LETTER FINAL K + while (c < 0xaa4e) // ..to CHAM CONSONANT SIGN FINAL H + charset[i++] = c++; + c = 0xaa50; // from CHAM DIGIT ZERO + while (c < 0xaa5a) // ..to CHAM DIGIT NINE + charset[i++] = c++; + c = 0xaa5c; // from CHAM PUNCTUATION SPIRAL + while (c < 0xaa7c) // ..to MYANMAR SIGN PAO KAREN TONE + charset[i++] = c++; + c = 0xaa80; // from TAI VIET LETTER LOW KO + while (c < 0xaac3) // ..to TAI VIET TONE MAI SONG + charset[i++] = c++; + c = 0xaadb; // from TAI VIET SYMBOL KON + while (c < 0xaae0) // ..to TAI VIET SYMBOL KOI KOI + charset[i++] = c++; + c = 0xab01; // from ETHIOPIC SYLLABLE TTHU + while (c < 0xab07) // ..to ETHIOPIC SYLLABLE TTHO + charset[i++] = c++; + c = 0xab09; // from ETHIOPIC SYLLABLE DDHU + while (c < 0xab0f) // ..to ETHIOPIC SYLLABLE DDHO + charset[i++] = c++; + c = 0xab11; // from ETHIOPIC SYLLABLE DZU + while (c < 0xab17) // ..to ETHIOPIC SYLLABLE DZO + charset[i++] = c++; + c = 0xab20; // from ETHIOPIC SYLLABLE CCHHA + while (c < 0xab27) // ..to ETHIOPIC SYLLABLE CCHHO + charset[i++] = c++; + c = 0xab28; // from ETHIOPIC SYLLABLE BBA + while (c < 0xab2f) // ..to ETHIOPIC SYLLABLE BBO + charset[i++] = c++; + c = 0xabc0; // from MEETEI MAYEK LETTER KOK + while (c < 0xabee) // ..to MEETEI MAYEK APUN IYEK + charset[i++] = c++; + c = 0xabf0; // from MEETEI MAYEK DIGIT ZERO + while (c < 0xabfa) // ..to MEETEI MAYEK DIGIT NINE + charset[i++] = c++; + c = 0xac00; // from + while (c < 0xd7a4) // ..to + charset[i++] = c++; + c = 0xd7b0; // from HANGUL JUNGSEONG O-YEO + while (c < 0xd7c7) // ..to HANGUL JUNGSEONG ARAEA-E + charset[i++] = c++; + c = 0xd7cb; // from HANGUL JONGSEONG NIEUN-RIEUL + while (c < 0xd7fc) // ..to HANGUL JONGSEONG PHIEUPH-THIEUTH + charset[i++] = c++; + c = 0xf900; // from CJK COMPATIBILITY IDEOGRAPH-F900 + while (c < 0xfa2e) // ..to CJK COMPATIBILITY IDEOGRAPH-FA2D + charset[i++] = c++; + c = 0xfa30; // from CJK COMPATIBILITY IDEOGRAPH-FA30 + while (c < 0xfa6e) // ..to CJK COMPATIBILITY IDEOGRAPH-FA6D + charset[i++] = c++; + c = 0xfa70; // from CJK COMPATIBILITY IDEOGRAPH-FA70 + while (c < 0xfada) // ..to CJK COMPATIBILITY IDEOGRAPH-FAD9 + charset[i++] = c++; + c = 0xfb00; // from LATIN SMALL LIGATURE FF + while (c < 0xfb07) // ..to LATIN SMALL LIGATURE ST + charset[i++] = c++; + c = 0xfb13; // from ARMENIAN SMALL LIGATURE MEN NOW + while (c < 0xfb18) // ..to ARMENIAN SMALL LIGATURE MEN XEH + charset[i++] = c++; + c = 0xfb1d; // from HEBREW LETTER YOD WITH HIRIQ + while (c < 0xfb37) // ..to HEBREW LETTER ZAYIN WITH DAGESH + charset[i++] = c++; + c = 0xfb38; // from HEBREW LETTER TET WITH DAGESH + while (c < 0xfb3d) // ..to HEBREW LETTER LAMED WITH DAGESH + charset[i++] = c++; + charset[i++] = 0xfb40; // HEBREW LETTER NUN WITH DAGESH + charset[i++] = 0xfb41; // HEBREW LETTER SAMEKH WITH DAGESH + charset[i++] = 0xfb43; // HEBREW LETTER FINAL PE WITH DAGESH + charset[i++] = 0xfb44; // HEBREW LETTER PE WITH DAGESH + c = 0xfb46; // from HEBREW LETTER TSADI WITH DAGESH + while (c < 0xfbc2) // ..to ARABIC SYMBOL SMALL TAH BELOW + charset[i++] = c++; + c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM + while (c < 0xfd40) // ..to ORNATE RIGHT PARENTHESIS + charset[i++] = c++; + c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM + while (c < 0xfd90) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM + charset[i++] = c++; + c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM + while (c < 0xfdc8) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM + charset[i++] = c++; + c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM + while (c < 0xfdfe) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM + charset[i++] = c++; + c = 0xfe00; // from VARIATION SELECTOR-1 + while (c < 0xfe1a) // ..to PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS + charset[i++] = c++; + c = 0xfe20; // from COMBINING LIGATURE LEFT HALF + while (c < 0xfe27) // ..to COMBINING CONJOINING MACRON + charset[i++] = c++; + c = 0xfe30; // from PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + while (c < 0xfe53) // ..to SMALL FULL STOP + charset[i++] = c++; + c = 0xfe54; // from SMALL SEMICOLON + while (c < 0xfe67) // ..to SMALL EQUALS SIGN + charset[i++] = c++; + c = 0xfe68; // from SMALL REVERSE SOLIDUS + while (c < 0xfe6c) // ..to SMALL COMMERCIAL AT + charset[i++] = c++; + c = 0xfe70; // from ARABIC FATHATAN ISOLATED FORM + while (c < 0xfe75) // ..to ARABIC KASRATAN ISOLATED FORM + charset[i++] = c++; + c = 0xfe76; // from ARABIC FATHA ISOLATED FORM + while (c < 0xfefd) // ..to ARABIC LIGATURE LAM WITH ALEF FINAL FORM + charset[i++] = c++; + c = 0xff01; // from FULLWIDTH EXCLAMATION MARK + while (c < 0xffbf) // ..to HALFWIDTH HANGUL LETTER HIEUH + charset[i++] = c++; + c = 0xffc2; // from HALFWIDTH HANGUL LETTER A + while (c < 0xffc8) // ..to HALFWIDTH HANGUL LETTER E + charset[i++] = c++; + c = 0xffca; // from HALFWIDTH HANGUL LETTER YEO + while (c < 0xffd0) // ..to HALFWIDTH HANGUL LETTER OE + charset[i++] = c++; + c = 0xffd2; // from HALFWIDTH HANGUL LETTER YO + while (c < 0xffd8) // ..to HALFWIDTH HANGUL LETTER YU + charset[i++] = c++; + charset[i++] = 0xffda; // HALFWIDTH HANGUL LETTER EU + charset[i++] = 0xffdc; // HALFWIDTH HANGUL LETTER I + c = 0xffe0; // from FULLWIDTH CENT SIGN + while (c < 0xffe7) // ..to FULLWIDTH WON SIGN + charset[i++] = c++; + c = 0xffe8; // from HALFWIDTH FORMS LIGHT VERTICAL + while (c < 0xffef) // ..to HALFWIDTH WHITE CIRCLE + charset[i++] = c++; + c = 0xfff9; // from INTERLINEAR ANNOTATION ANCHOR + while (c < 0xfffe) // ..to REPLACEMENT CHARACTER + charset[i++] = c++; + c = 0x10000; // from LINEAR B SYLLABLE B008 A + while (c < 0x1000c) // ..to LINEAR B SYLLABLE B046 JE + charset[i++] = c++; + c = 0x1000d; // from LINEAR B SYLLABLE B036 JO + while (c < 0x10027) // ..to LINEAR B SYLLABLE B032 QO + charset[i++] = c++; + c = 0x10028; // from LINEAR B SYLLABLE B060 RA + while (c < 0x1003b) // ..to LINEAR B SYLLABLE B042 WO + charset[i++] = c++; + charset[i++] = 0x1003c; // LINEAR B SYLLABLE B017 ZA + charset[i++] = 0x1003d; // LINEAR B SYLLABLE B074 ZE + c = 0x1003f; // from LINEAR B SYLLABLE B020 ZO + while (c < 0x1004e) // ..to LINEAR B SYLLABLE B091 TWO + charset[i++] = c++; + c = 0x10050; // from LINEAR B SYMBOL B018 + while (c < 0x1005e) // ..to LINEAR B SYMBOL B089 + charset[i++] = c++; + c = 0x10080; // from LINEAR B IDEOGRAM B100 MAN + while (c < 0x100fb) // ..to LINEAR B IDEOGRAM VESSEL B305 + charset[i++] = c++; + charset[i++] = 0x10100; // AEGEAN WORD SEPARATOR LINE + charset[i++] = 0x10102; // AEGEAN CHECK MARK + c = 0x10107; // from AEGEAN NUMBER ONE + while (c < 0x10134) // ..to AEGEAN NUMBER NINETY THOUSAND + charset[i++] = c++; + c = 0x10137; // from AEGEAN WEIGHT BASE UNIT + while (c < 0x1018b) // ..to GREEK ZERO SIGN + charset[i++] = c++; + c = 0x10190; // from ROMAN SEXTANS SIGN + while (c < 0x1019c) // ..to ROMAN CENTURIAL SIGN + charset[i++] = c++; + c = 0x101d0; // from PHAISTOS DISC SIGN PEDESTRIAN + while (c < 0x101fe) // ..to PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + charset[i++] = c++; + c = 0x10280; // from LYCIAN LETTER A + while (c < 0x1029d) // ..to LYCIAN LETTER X + charset[i++] = c++; + c = 0x102a0; // from CARIAN LETTER A + while (c < 0x102d1) // ..to CARIAN LETTER UUU3 + charset[i++] = c++; + c = 0x10300; // from OLD ITALIC LETTER A + while (c < 0x1031f) // ..to OLD ITALIC LETTER UU + charset[i++] = c++; + c = 0x10320; // from OLD ITALIC NUMERAL ONE + while (c < 0x10324) // ..to OLD ITALIC NUMERAL FIFTY + charset[i++] = c++; + c = 0x10330; // from GOTHIC LETTER AHSA + while (c < 0x1034b) // ..to GOTHIC LETTER NINE HUNDRED + charset[i++] = c++; + c = 0x10380; // from UGARITIC LETTER ALPA + while (c < 0x1039e) // ..to UGARITIC LETTER SSU + charset[i++] = c++; + c = 0x1039f; // from UGARITIC WORD DIVIDER + while (c < 0x103c4) // ..to OLD PERSIAN SIGN HA + charset[i++] = c++; + c = 0x103c8; // from OLD PERSIAN SIGN AURAMAZDAA + while (c < 0x103d6) // ..to OLD PERSIAN NUMBER HUNDRED + charset[i++] = c++; + c = 0x10400; // from DESERET CAPITAL LETTER LONG I + while (c < 0x1049e) // ..to OSMANYA LETTER OO + charset[i++] = c++; + c = 0x104a0; // from OSMANYA DIGIT ZERO + while (c < 0x104aa) // ..to OSMANYA DIGIT NINE + charset[i++] = c++; + c = 0x10800; // from CYPRIOT SYLLABLE A + while (c < 0x10806) // ..to CYPRIOT SYLLABLE JA + charset[i++] = c++; + c = 0x1080a; // from CYPRIOT SYLLABLE KA + while (c < 0x10836) // ..to CYPRIOT SYLLABLE WO + charset[i++] = c++; + charset[i++] = 0x10837; // CYPRIOT SYLLABLE XA + charset[i++] = 0x10838; // CYPRIOT SYLLABLE XE + c = 0x1083f; // from CYPRIOT SYLLABLE ZO + while (c < 0x10856) // ..to IMPERIAL ARAMAIC LETTER TAW + charset[i++] = c++; + c = 0x10857; // from IMPERIAL ARAMAIC SECTION SIGN + while (c < 0x10860) // ..to IMPERIAL ARAMAIC NUMBER TEN THOUSAND + charset[i++] = c++; + c = 0x10900; // from PHOENICIAN LETTER ALF + while (c < 0x1091c) // ..to PHOENICIAN NUMBER THREE + charset[i++] = c++; + c = 0x1091f; // from PHOENICIAN WORD SEPARATOR + while (c < 0x1093a) // ..to LYDIAN LETTER C + charset[i++] = c++; + c = 0x10a00; // from KHAROSHTHI LETTER A + while (c < 0x10a04) // ..to KHAROSHTHI VOWEL SIGN VOCALIC R + charset[i++] = c++; + charset[i++] = 0x10a05; // KHAROSHTHI VOWEL SIGN E + charset[i++] = 0x10a06; // KHAROSHTHI VOWEL SIGN O + c = 0x10a0c; // from KHAROSHTHI VOWEL LENGTH MARK + while (c < 0x10a14) // ..to KHAROSHTHI LETTER GHA + charset[i++] = c++; + charset[i++] = 0x10a15; // KHAROSHTHI LETTER CA + charset[i++] = 0x10a17; // KHAROSHTHI LETTER JA + c = 0x10a19; // from KHAROSHTHI LETTER NYA + while (c < 0x10a34) // ..to KHAROSHTHI LETTER TTTHA + charset[i++] = c++; + charset[i++] = 0x10a38; // KHAROSHTHI SIGN BAR ABOVE + charset[i++] = 0x10a3a; // KHAROSHTHI SIGN DOT BELOW + c = 0x10a3f; // from KHAROSHTHI VIRAMA + while (c < 0x10a48) // ..to KHAROSHTHI NUMBER ONE THOUSAND + charset[i++] = c++; + c = 0x10a50; // from KHAROSHTHI PUNCTUATION DOT + while (c < 0x10a59) // ..to KHAROSHTHI PUNCTUATION LINES + charset[i++] = c++; + c = 0x10a60; // from OLD SOUTH ARABIAN LETTER HE + while (c < 0x10a80) // ..to OLD SOUTH ARABIAN NUMERIC INDICATOR + charset[i++] = c++; + c = 0x10b00; // from AVESTAN LETTER A + while (c < 0x10b36) // ..to AVESTAN LETTER HE + charset[i++] = c++; + c = 0x10b39; // from AVESTAN ABBREVIATION MARK + while (c < 0x10b56) // ..to INSCRIPTIONAL PARTHIAN LETTER TAW + charset[i++] = c++; + c = 0x10b58; // from INSCRIPTIONAL PARTHIAN NUMBER ONE + while (c < 0x10b73) // ..to INSCRIPTIONAL PAHLAVI LETTER TAW + charset[i++] = c++; + c = 0x10b78; // from INSCRIPTIONAL PAHLAVI NUMBER ONE + while (c < 0x10b80) // ..to INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + charset[i++] = c++; + c = 0x10c00; // from OLD TURKIC LETTER ORKHON A + while (c < 0x10c49) // ..to OLD TURKIC LETTER ORKHON BASH + charset[i++] = c++; + c = 0x10e60; // from RUMI DIGIT ONE + while (c < 0x10e7f) // ..to RUMI FRACTION TWO THIRDS + charset[i++] = c++; + c = 0x11000; // from BRAHMI SIGN CANDRABINDU + while (c < 0x1104e) // ..to BRAHMI PUNCTUATION LOTUS + charset[i++] = c++; + c = 0x11052; // from BRAHMI NUMBER ONE + while (c < 0x11070) // ..to BRAHMI DIGIT NINE + charset[i++] = c++; + c = 0x11080; // from KAITHI SIGN CANDRABINDU + while (c < 0x110c2) // ..to KAITHI DOUBLE DANDA + charset[i++] = c++; + c = 0x12000; // from CUNEIFORM SIGN A + while (c < 0x1236f) // ..to CUNEIFORM SIGN ZUM + charset[i++] = c++; + c = 0x12400; // from CUNEIFORM NUMERIC SIGN TWO ASH + while (c < 0x12463) // ..to CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER + charset[i++] = c++; + c = 0x12470; // from CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER + while (c < 0x12474) // ..to CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON + charset[i++] = c++; + c = 0x13000; // from EGYPTIAN HIEROGLYPH A001 + while (c < 0x1342f) // ..to EGYPTIAN HIEROGLYPH AA032 + charset[i++] = c++; + c = 0x16800; // from BAMUM LETTER PHASE-A NGKUE MFON + while (c < 0x16a39) // ..to BAMUM LETTER PHASE-F VUEQ + charset[i++] = c++; + charset[i++] = 0x1b000; // KATAKANA LETTER ARCHAIC E + charset[i++] = 0x1b001; // HIRAGANA LETTER ARCHAIC YE + c = 0x1d000; // from BYZANTINE MUSICAL SYMBOL PSILI + while (c < 0x1d0f6) // ..to BYZANTINE MUSICAL SYMBOL GORGON NEO KATO + charset[i++] = c++; + c = 0x1d100; // from MUSICAL SYMBOL SINGLE BARLINE + while (c < 0x1d127) // ..to MUSICAL SYMBOL DRUM CLEF-2 + charset[i++] = c++; + c = 0x1d129; // from MUSICAL SYMBOL MULTIPLE MEASURE REST + while (c < 0x1d1de) // ..to MUSICAL SYMBOL PES SUBPUNCTIS + charset[i++] = c++; + c = 0x1d200; // from GREEK VOCAL NOTATION SYMBOL-1 + while (c < 0x1d246) // ..to GREEK MUSICAL LEIMMA + charset[i++] = c++; + c = 0x1d300; // from MONOGRAM FOR EARTH + while (c < 0x1d357) // ..to TETRAGRAM FOR FOSTERING + charset[i++] = c++; + c = 0x1d360; // from COUNTING ROD UNIT DIGIT ONE + while (c < 0x1d372) // ..to COUNTING ROD TENS DIGIT NINE + charset[i++] = c++; + c = 0x1d400; // from MATHEMATICAL BOLD CAPITAL A + while (c < 0x1d455) // ..to MATHEMATICAL ITALIC SMALL G + charset[i++] = c++; + c = 0x1d456; // from MATHEMATICAL ITALIC SMALL I + while (c < 0x1d49d) // ..to MATHEMATICAL SCRIPT CAPITAL A + charset[i++] = c++; + charset[i++] = 0x1d49e; // MATHEMATICAL SCRIPT CAPITAL C + charset[i++] = 0x1d49f; // MATHEMATICAL SCRIPT CAPITAL D + charset[i++] = 0x1d4a5; // MATHEMATICAL SCRIPT CAPITAL J + charset[i++] = 0x1d4a6; // MATHEMATICAL SCRIPT CAPITAL K + c = 0x1d4a9; // from MATHEMATICAL SCRIPT CAPITAL N + while (c < 0x1d4ad) // ..to MATHEMATICAL SCRIPT CAPITAL Q + charset[i++] = c++; + c = 0x1d4ae; // from MATHEMATICAL SCRIPT CAPITAL S + while (c < 0x1d4ba) // ..to MATHEMATICAL SCRIPT SMALL D + charset[i++] = c++; + c = 0x1d4bd; // from MATHEMATICAL SCRIPT SMALL H + while (c < 0x1d4c4) // ..to MATHEMATICAL SCRIPT SMALL N + charset[i++] = c++; + c = 0x1d4c5; // from MATHEMATICAL SCRIPT SMALL P + while (c < 0x1d506) // ..to MATHEMATICAL FRAKTUR CAPITAL B + charset[i++] = c++; + c = 0x1d507; // from MATHEMATICAL FRAKTUR CAPITAL D + while (c < 0x1d50b) // ..to MATHEMATICAL FRAKTUR CAPITAL G + charset[i++] = c++; + c = 0x1d50d; // from MATHEMATICAL FRAKTUR CAPITAL J + while (c < 0x1d515) // ..to MATHEMATICAL FRAKTUR CAPITAL Q + charset[i++] = c++; + c = 0x1d516; // from MATHEMATICAL FRAKTUR CAPITAL S + while (c < 0x1d51d) // ..to MATHEMATICAL FRAKTUR CAPITAL Y + charset[i++] = c++; + c = 0x1d51e; // from MATHEMATICAL FRAKTUR SMALL A + while (c < 0x1d53a) // ..to MATHEMATICAL DOUBLE-STRUCK CAPITAL B + charset[i++] = c++; + c = 0x1d53b; // from MATHEMATICAL DOUBLE-STRUCK CAPITAL D + while (c < 0x1d53f) // ..to MATHEMATICAL DOUBLE-STRUCK CAPITAL G + charset[i++] = c++; + c = 0x1d540; // from MATHEMATICAL DOUBLE-STRUCK CAPITAL I + while (c < 0x1d545) // ..to MATHEMATICAL DOUBLE-STRUCK CAPITAL M + charset[i++] = c++; + c = 0x1d54a; // from MATHEMATICAL DOUBLE-STRUCK CAPITAL S + while (c < 0x1d551) // ..to MATHEMATICAL DOUBLE-STRUCK CAPITAL Y + charset[i++] = c++; + c = 0x1d552; // from MATHEMATICAL DOUBLE-STRUCK SMALL A + while (c < 0x1d6a6) // ..to MATHEMATICAL ITALIC SMALL DOTLESS J + charset[i++] = c++; + c = 0x1d6a8; // from MATHEMATICAL BOLD CAPITAL ALPHA + while (c < 0x1d7cc) // ..to MATHEMATICAL BOLD SMALL DIGAMMA + charset[i++] = c++; + c = 0x1d7ce; // from MATHEMATICAL BOLD DIGIT ZERO + while (c < 0x1d800) // ..to MATHEMATICAL MONOSPACE DIGIT NINE + charset[i++] = c++; + c = 0x1f000; // from MAHJONG TILE EAST WIND + while (c < 0x1f02c) // ..to MAHJONG TILE BACK + charset[i++] = c++; + c = 0x1f030; // from DOMINO TILE HORIZONTAL BACK + while (c < 0x1f094) // ..to DOMINO TILE VERTICAL-06-06 + charset[i++] = c++; + c = 0x1f0a0; // from PLAYING CARD BACK + while (c < 0x1f0af) // ..to PLAYING CARD KING OF SPADES + charset[i++] = c++; + c = 0x1f0b1; // from PLAYING CARD ACE OF HEARTS + while (c < 0x1f0bf) // ..to PLAYING CARD KING OF HEARTS + charset[i++] = c++; + c = 0x1f0c1; // from PLAYING CARD ACE OF DIAMONDS + while (c < 0x1f0d0) // ..to PLAYING CARD BLACK JOKER + charset[i++] = c++; + c = 0x1f0d1; // from PLAYING CARD ACE OF CLUBS + while (c < 0x1f0e0) // ..to PLAYING CARD WHITE JOKER + charset[i++] = c++; + c = 0x1f100; // from DIGIT ZERO FULL STOP + while (c < 0x1f10b) // ..to DIGIT NINE COMMA + charset[i++] = c++; + c = 0x1f110; // from PARENTHESIZED LATIN CAPITAL LETTER A + while (c < 0x1f12f) // ..to CIRCLED WZ + charset[i++] = c++; + c = 0x1f130; // from SQUARED LATIN CAPITAL LETTER A + while (c < 0x1f16a) // ..to NEGATIVE CIRCLED LATIN CAPITAL LETTER Z + charset[i++] = c++; + c = 0x1f170; // from NEGATIVE SQUARED LATIN CAPITAL LETTER A + while (c < 0x1f19b) // ..to SQUARED VS + charset[i++] = c++; + c = 0x1f1e6; // from REGIONAL INDICATOR SYMBOL LETTER A + while (c < 0x1f203) // ..to SQUARED KATAKANA SA + charset[i++] = c++; + c = 0x1f210; // from SQUARED CJK UNIFIED IDEOGRAPH-624B + while (c < 0x1f23b) // ..to SQUARED CJK UNIFIED IDEOGRAPH-55B6 + charset[i++] = c++; + c = 0x1f240; // from TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C + while (c < 0x1f249) // ..to TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 + charset[i++] = c++; + charset[i++] = 0x1f250; // CIRCLED IDEOGRAPH ADVANTAGE + charset[i++] = 0x1f251; // CIRCLED IDEOGRAPH ACCEPT + c = 0x1f300; // from CYCLONE + while (c < 0x1f321) // ..to SHOOTING STAR + charset[i++] = c++; + c = 0x1f330; // from CHESTNUT + while (c < 0x1f336) // ..to CACTUS + charset[i++] = c++; + c = 0x1f337; // from TULIP + while (c < 0x1f37d) // ..to BABY BOTTLE + charset[i++] = c++; + c = 0x1f380; // from RIBBON + while (c < 0x1f394) // ..to GRADUATION CAP + charset[i++] = c++; + c = 0x1f3a0; // from CAROUSEL HORSE + while (c < 0x1f3c5) // ..to SURFER + charset[i++] = c++; + c = 0x1f3c6; // from TROPHY + while (c < 0x1f3cb) // ..to SWIMMER + charset[i++] = c++; + c = 0x1f3e0; // from HOUSE BUILDING + while (c < 0x1f3f1) // ..to EUROPEAN CASTLE + charset[i++] = c++; + c = 0x1f400; // from RAT + while (c < 0x1f43f) // ..to PAW PRINTS + charset[i++] = c++; + c = 0x1f442; // from EAR + while (c < 0x1f4f8) // ..to CAMERA + charset[i++] = c++; + c = 0x1f4f9; // from VIDEO CAMERA + while (c < 0x1f4fd) // ..to VIDEOCASSETTE + charset[i++] = c++; + c = 0x1f500; // from TWISTED RIGHTWARDS ARROWS + while (c < 0x1f53e) // ..to DOWN-POINTING SMALL RED TRIANGLE + charset[i++] = c++; + c = 0x1f550; // from CLOCK FACE ONE OCLOCK + while (c < 0x1f568) // ..to CLOCK FACE TWELVE-THIRTY + charset[i++] = c++; + c = 0x1f5fb; // from MOUNT FUJI + while (c < 0x1f600) // ..to MOYAI + charset[i++] = c++; + c = 0x1f601; // from GRINNING FACE WITH SMILING EYES + while (c < 0x1f611) // ..to NEUTRAL FACE + charset[i++] = c++; + charset[i++] = 0x1f612; // UNAMUSED FACE + charset[i++] = 0x1f614; // PENSIVE FACE + charset[i++] = 0x1f61c; // FACE WITH STUCK-OUT TONGUE AND WINKING EYE + charset[i++] = 0x1f61e; // DISAPPOINTED FACE + c = 0x1f620; // from ANGRY FACE + while (c < 0x1f626) // ..to DISAPPOINTED BUT RELIEVED FACE + charset[i++] = c++; + c = 0x1f628; // from FEARFUL FACE + while (c < 0x1f62c) // ..to TIRED FACE + charset[i++] = c++; + c = 0x1f630; // from FACE WITH OPEN MOUTH AND COLD SWEAT + while (c < 0x1f634) // ..to FLUSHED FACE + charset[i++] = c++; + c = 0x1f635; // from DIZZY FACE + while (c < 0x1f641) // ..to WEARY CAT FACE + charset[i++] = c++; + c = 0x1f645; // from FACE WITH NO GOOD GESTURE + while (c < 0x1f650) // ..to PERSON WITH FOLDED HANDS + charset[i++] = c++; + c = 0x1f680; // from ROCKET + while (c < 0x1f6c6) // ..to LEFT LUGGAGE + charset[i++] = c++; + c = 0x1f700; // from ALCHEMICAL SYMBOL FOR QUINTESSENCE + while (c < 0x1f774) // ..to ALCHEMICAL SYMBOL FOR HALF OUNCE + charset[i++] = c++; + c = 0x20000; // from + while (c < 0x2a6d7) // ..to + charset[i++] = c++; + c = 0x2a700; // from + while (c < 0x2b735) // ..to + charset[i++] = c++; + c = 0x2b740; // from + while (c < 0x2b81e) // ..to + charset[i++] = c++; + c = 0x2f800; // from CJK COMPATIBILITY IDEOGRAPH-2F800 + while (c < 0x2fa1e) // ..to CJK COMPATIBILITY IDEOGRAPH-2FA1D + charset[i++] = c++; + c = 0xe0020; // from TAG SPACE + while (c < 0xe0080) // ..to CANCEL TAG + charset[i++] = c++; + +/* Zero-terminate it, and cache the first character */ + charset[i] = 0; + c0 = charset[0]; + + last = minlength - 1; + i = 0; + while (i <= last) { + id[i] = 0; + utf32[i++] = c0; + } + lastid = -1; + utf32[i] = 0; + +/* We must init word with dummy data, it doesn't get set until filter() */ + word = 1; +} + +void generate() +{ + int i; + +/* Handle the typical case specially */ + if (utf32[last] = charset[++lastid]) return; + + lastid = 0; + utf32[i = last] = c0; + while (i--) { // Have a preceding position? + if (utf32[i] = charset[++id[i]]) return; + id[i] = 0; + utf32[i] = c0; + } + + if (++last < maxlength) { // Next length? + id[last] = lastid = 0; + utf32[last] = c0; + utf32[last + 1] = 0; + } else // We're done + utf32 = 0; +} + +void restore() +{ + int i, o, c; + +/* Convert the restored word back from UTF-8 to UTF-32 */ + i = o = 0; + while (c = word[i]) { + if (c >= 0xf0) { + c = (c << 6) + word[++i]; + c = (c << 6) + word[++i]; + c = (c << 6) + word[++i]; + c -= 0x3C82080; + } else if (c >= 0xe0) { + c = (c << 6) + word[++i]; + c = (c << 6) + word[++i]; + c -= 0xE2080; + } else if (c >= 0xc0) { + c = (c << 6) + word[++i]; + c -= 0x3080; + } + i++; + utf32[o++] = c; + } + utf32[o] = 0; + +/* Calculate the current length and infer the character indices */ + last = 0; + while (c = utf32[last]) { + i = 0; while (charset[i] != c && charset[i]) i++; + if (!charset[i]) i = 0; // Not found + id[last++] = i; + } + lastid = id[--last]; +} + +/* Convert from UTF-32 to UTF-8 */ +void filter() +{ + int i, c; + i = -1; c = 0; + + while (utf32[++i]) { + if (utf32[i] >= 0x10000) { + word[c++] = 0xf0 | (utf32[i]>>18); + word[c++] = 0x80 | (utf32[i]>>12 & 0x3f); + word[c++] = 0x80 | (utf32[i]>>6 & 0x3f); + word[c++] = 0x80 | (utf32[i] & 0x3f); + } + else if (utf32[i] >= 0x0800) { + word[c++] = 0xe0 | (utf32[i]>>12); + word[c++] = 0x80 | (utf32[i]>>6 & 0x3f); + word[c++] = 0x80 | (utf32[i] & 0x3f); + } + else if (utf32[i] >= 0x80) { + word[c++] = 0xc0 | (utf32[i]>>6); + word[c++] = 0x80 | (utf32[i] & 0x3f); + } + else { + word[c++] = utf32[i]; + } + } + word[c] = 0; +} diff --git a/john/dynamic.conf b/john/dynamic.conf new file mode 100644 index 0000000..68d7cde --- /dev/null +++ b/john/dynamic.conf @@ -0,0 +1,241 @@ +# Here are some examples of DYNAMIC. +# Please refer to ./doc/DYNAMIC for documentation on how to set these up. +# Format names up to dynamic_999 are reserved for builtin functions. +#################################################################### +# Simple DYNAMIC type for md5($p)^^4 (i.e. 4 steps of md5 recursively) +#################################################################### +[List.Generic:dynamic_1001] +# expression shown will be the string: dynamic_1001 md5(md5(md5(md5($p)))) +Expression=md5(md5(md5(md5($p)))) +Flag=MGF_KEYS_INPUT +# here is the optimized 'script' to perform the md5 4 times on itself. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +Test=$dynamic_1001$57200e13b490d4ae47d5e19be026b057:test1 +Test=$dynamic_1001$c6cc44f9e7fb7efcde62ba2e627a49c6:thatsworking +Test=$dynamic_1001$0ae9549604e539a249c1fa9f5e5fb73b:test3 + +#################################################################### +# Simple DYNAMIC type for md5($p)^^5 (i.e. 5 steps of md5 recursively) +#################################################################### +[List.Generic:dynamic_1002] +# expression shown will be the string: dynamic_1002 md5(md5(md5(md5(md5($p))))) +Expression=md5(md5(md5(md5(md5($p))))) +Flag=MGF_KEYS_INPUT +# here is the optimized 'script' to perform the md5 5 times on itself. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +# These are test strings for this format. +Test=$dynamic_1002$25de8cd0b0cf69c5b5bc19c8ee64adab:test1 +Test=$dynamic_1002$a0b535420ea47849f7c2cc09a3ad0ac3:thatsworking +Test=$dynamic_1002$4cb029bd5b4ef79f785ca685caf17bf8:test3 + +#################################################################### +# Simple DYNAMIC type for md5(md5($p).md5($p)) +#################################################################### +[List.Generic:dynamic_1003] +# expression shown will be the string: dynamic_1003 md5(md5($p).md5($p)) +Expression=md5(md5($p).md5($p)) +# NOTE, this format does NOT work on SSE2. It requires a md5() of a 64 byte string. +# SSE (or MMX) is limtited to 54 byte max password, due to 'enhancements' +# Thus, we need a non-sse2 safe flag. +Flag=MGF_NOTSSE2Safe +Flag=MGF_KEYS_INPUT +Flag=MGF_FULL_CLEAN_REQUIRED +# here is the optimized 'script' to perform hash 'like' IPB but salt replaced with password. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +# These are test strings for this format. +Test=$dynamic_1003$478b10974f15e7295883224fd286ccba:test1 +Test=$dynamic_1003$18a59101e6c6fb38260d542a394ecb22:thatsworking +Test=$dynamic_1003$630b01b68b6db6fd43a751f8147d1faf:test3 + +#################################################################### +# Simple DYNAMIC type for md5($p)^^6 (i.e. 6 steps of md5 recursively) +#################################################################### +[List.Generic:dynamic_1004] +# expression shown will be the string: dynamic_1004 md5(md5(md5(md5(md5(md5($p)))))) +Expression=md5(md5(md5(md5(md5(md5($p)))))) +Flag=MGF_KEYS_INPUT +# here is the optimized 'script' to perform the md5 6 times on itself. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +# These are test strings for this format. +Test=$dynamic_1004$de1b991dd27fb9813e88b957a455dccd:test1 +Test=$dynamic_1004$6a62cd3c4d81139f61fb2553cdef0dc7:thatsworking +Test=$dynamic_1004$a977990e521c5d1d17c6d65fdf2681b4:test3 + + +#################################################################### +# Simple DYNAMIC type for md5($p)^^7 (i.e. 7 steps of md5 recursively) +#################################################################### +[List.Generic:dynamic_1005] +# expression shown will be the string: dynamic_1005 md5(md5(md5(md5(md5(md5(md5($p))))))) +Expression=md5(md5(md5(md5(md5(md5(md5($p))))))) +Flag=MGF_KEYS_INPUT +# here is the optimized 'script' to perform the md5 7 times on itself. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +# These are test strings for this format. +Test=$dynamic_1005$784c527d0d92873ff9c0773e1c35621d:test1 +Test=$dynamic_1005$efcbbe6331caecf0e7f40160e65aadcc:thatsworking +Test=$dynamic_1005$abb8bdd2c6ac2dfea2b2af6f5aed5446:test3 + +#################################################################### +# Simple DYNAMIC type for md5($p)^^8 (i.e. 8 steps of md5 recursively) +#################################################################### +[List.Generic:dynamic_1006] +# expression shown will be the string: dynamic_1006 md5(md5(md5(md5(md5(md5(md5(md5($p)))))))) +Expression=md5(md5(md5(md5(md5(md5(md5(md5($p)))))))) +Flag=MGF_KEYS_INPUT +# here is the optimized 'script' to perform the md5 8 times on itself. +Func=DynamicFunc__crypt_md5 +Func=DynamicFunc__clean_input2 +Func=DynamicFunc__append_from_last_output_to_input2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt2_md5 +Func=DynamicFunc__clean_input2_kwik +Func=DynamicFunc__append_from_last_output2_as_base16 +Func=DynamicFunc__crypt_md5_in2_to_out1 +# These are test strings for this format. +Test=$dynamic_1006$1ec1f32398f64cab51183f63630eceea:test1 +Test=$dynamic_1006$f66b339ac21d6fd6af216f2b70aab2c9:thatsworking +Test=$dynamic_1006$e9d38522b5eeec753332e576e2e0fe5d:test3 + +#################################################################### +# Simple DYNAMIC type for vBulletin md5(md5($p).$s) Included here to 'exercise' the script parser +#################################################################### +[List.Generic:dynamic_1007] +# expression shown will be the string: dynamic_1007 md5(md5($p).$s) [vBulletin] +Expression=md5(md5($p).$s) (vBulletin) +# Flag needed here, is Salt. There is no 'fixed' saltlen. +Flag=MGF_SALTED +Flag=MGF_KEYS_BASE16_IN1 +# vBulletin has a 'fixed' 3 byte salt, so list the fixed size +SaltLen=3 +# here is the optimized 'script' to perform vBulletin hash +Func=DynamicFunc__set_input_len_32 +Func=DynamicFunc__append_salt +Func=DynamicFunc__crypt_md5 +Test=$dynamic_1007$daa61d77e218e42060c2fa198ac1feaf$SXB:test1 +Test=$dynamic_1007$de56b00bb15d6db79204bd44383469bc$T &:thatsworking +Test=$dynamic_1007$fb685c6f469f6e549c85e4c1fb5a65a6$HEX$5C483A:test3 + +#################################################################### +# Dynamic type for algorithm used in RADIUS User-Password attrinute md5($p.$s) +#################################################################### +[List.Generic:dynamic_1008] +# expression shown will be this string: +Expression=md5($p.$s) (RADIUS User-Password) +# Flag needed here, is Salt +Flag=MGF_SALTED +# The salt has a fixed length of 16 bytes +Saltlen=16 +Func=DynamicFunc__clean_input +Func=DynamicFunc__append_keys +Func=DynamicFunc__append_salt +Func=DynamicFunc__crypt_md5 +Test=$dynamic_1008$b962b0d40fc9111ce5f8efab424bad73$NormalSaltNormal:secret +Test=$dynamic_1008$8bfccd9d67ec0bcdc38e9ae3c19a2903$FinishingwitHEX$:secret +Test=$dynamic_1008$bf239357f3aa95508a53fe41b7e5f2e3$inthem$HEXiddle6:secret +# unfortunately, these next 2 have embedded NULLs, so at this time they have been removed. +# later we will get dynamic working with these also. +#Test=$dynamic_1008$7fe3c4d1bf2ac68e94ee9f2bf75b9601$HEX$00000000000000000000000000000000:secret +#Test=$dynamic_1008$658bbf9f04538d6bede09a4a52a77504$HEX$626c6168003637383930313233343536:secret + +###################################################################### +# Dynamic Type for algorithm used in RADIUS Responses md5($s.$p) +###################################################################### +[List.Generic:dynamic_1009] +Expression=md5($s.$p) (RADIUS Responses) +Flag=MGF_SALTED +Saltlen=-16 +Func=DynamicFunc__clean_input +Func=DynamicFunc__append_salt +Func=DynamicFunc__append_keys +Func=DynamicFunc__crypt_md5 +Test=$dynamic_1009$0b9b9fdf75fc79d85c5b69aa1de26288$Salt:test1 + +###################################################################### +# Dynamic Type for algorithm used in RAdmin v2.x Responses md5($p.NULL-to-100-bytes) +# v2, where keys are in input, and set_input_len_100 'cleans' up if needed. +###################################################################### +[List.Generic:dynamic_1010] +Expression=md5($p null_padded_to_len_100) RAdmin v2.x MD5 +Flag=MGF_NOTSSE2Safe +Flag=MGF_KEYS_INPUT +Func=DynamicFunc__set_input_len_100 +Func=DynamicFunc__crypt_md5 +Test=$dynamic_1010$B137F09CF92F465CABCA06AB1B283C1F:lastwolf +Test=$dynamic_1010$14e897b1a9354f875df51047bb1a0765:podebradka +Test=$dynamic_1010$02ba5e187e2589be6f80da0046aa7e3c:12345678 +Test=$dynamic_1010$b4e13c7149ebde51e510959f30319ac7:firebaLL +Test=$dynamic_1010$3d2c8cae4621edf8abb081408569482b:yamaha12345 +Test=$dynamic_1010$60cb8e411b02c10ecc3c98e29e830de8:xplicit diff --git a/john/genincstats.rb b/john/genincstats.rb new file mode 100644 index 0000000..42d9b6e --- /dev/null +++ b/john/genincstats.rb @@ -0,0 +1,78 @@ +#!/usr/bin/ruby -w + +require 'getoptlong' + +def help + puts "Usage: #{$0} [options]" + puts "\t-h --help\t\tthis help." + puts "\t-f --file\t\toutput file." + puts "\t-n --num\t\tcharset: 0123456789" + puts "\t-a --alpha\t\tcharset: abcdefghijklmnopqrstuvwxyz" + puts "\t-A --alphamaj\t\tcharset: ABCDEFGHIJKLMNOPQRSTUVWXYZ" + puts "\t-l --alphanum\t\tcharset: alpha + num" + puts "\t-l --alphanummaj\tcharset: alpha + alphamaj + num" + puts "\t-s --all\t\tcharset: alpha + alphamaj + num + !@#$+=.*" + puts "\t-c --custom" + puts "\nExample:\n" + puts "#{$0} -f stats -s" + puts "#{$0} -f stats -c \"0123abc+=\"" + exit +end + +ch_alpha = 'abcdefghijklmnopqrstuvwxyz' +ch_num = '0123456789' +ch_sp = '!@#$+=.*' + +opts = GetoptLong.new( + [ '--help', '-h', GetoptLong::NO_ARGUMENT ], + [ '--file', '-f', GetoptLong::OPTIONAL_ARGUMENT], + [ '--all', '-s', GetoptLong::NO_ARGUMENT], + [ '--num', '-n', GetoptLong::NO_ARGUMENT], + [ '--alpha', '-a', GetoptLong::NO_ARGUMENT ], + [ '--alphamaj', '-A', GetoptLong::NO_ARGUMENT ], + [ '--alphanum', '-l', GetoptLong::NO_ARGUMENT ], + [ '--alphanummaj', '-L', GetoptLong::NO_ARGUMENT ], + [ '--custom', '-c', GetoptLong::OPTIONAL_ARGUMENT ] +) + +charset = nil +filename = "stats_out" + +opts.each do |opt, arg| + case opt + when '--help' + help + when '--file' + filename = arg + when '--num' + charset = ch_num + when '--alpha' + charset = ch_alpha + when '--alphamaj' + charset = ch_alpha.capitalize + when '--alphanum' + charset = ch_alpha + ch_num + when '--alphanummaj' + charset = ch_alpha.capitalize + ch_num + when '--all' + charset = ch_alpha + ch_alpha.capitalize + ch_num + ch_sp + when '--custom' + charset = arg + end +end + + +if charset == nil + help +end + + +fstat = File.open(filename, "w") +charset.each_byte do |c| + fstat.write("1=proba1[#{c.to_s}]\n") + charset.each_byte do |tmp| + fstat.write("1=proba2[#{c.to_s}*256+#{tmp.to_s}]\n") + end +end +fstat.close + diff --git a/john/john.conf b/john/john.conf new file mode 100644 index 0000000..16da9fc --- /dev/null +++ b/john/john.conf @@ -0,0 +1,1616 @@ +# +# This file is part of John the Ripper password cracker, +# Copyright (c) 1996-2006,2008-2012 by Solar Designer +# +# ...with changes in the jumbo patch, by various authors +# + +# The [Options] section is for general options only. +# Note that MPI specific options have been moved +# to [Options.MPI] +# There is also a new section [Options.OpenCL] +# for OpenCL specific options +# Default settings for Markov mode have been moved +# to [Markov.Default], but you can define other +# Markov modes as well, see ../doc/MARKOV +[Options] +# Wordlist file name, to be used in batch mode +Wordlist = $JOHN/password.lst +# Use idle cycles only +Idle = Y +# Crash recovery file saving delay in seconds +Save = 600 +# Beep when a password is found (who needs this anyway?) +Beep = N + +# Time formatting string used in status ETA. +# %c means 'local' specific canonical form, such as: +# 05/06/11 18:10:34 +# +# Other examples +# %d/%m/%y %H:%M (day/mon/year hour:min) +# %m/%d/%y %H:%M (mon/day/year hour:min) +# %Y-%m-%d %H:%M (ISO 8601 style, 2011-05-06 18:10) +TimeFormat = %c + +# Threshold for showing ETA, in percent. ETA will not be +# shown if progress is less than this. If too low, early +# reported figures will be less accurate (default 0.05%) +ETAthreshold = 0.05% + +# Emit a status line whenever a password is cracked (this is the same as +# passing the --crack-status option flag to john). NOTE: if this is set +# to true here, --crack-status will toggle it back to false. +CrackStatus = N + +# When printing status, show number of candidates tried (eg. 1/43210 for one +# guess out of 43 thousand candidates). Note that the number is not equal to +# "words tried" but rather "words x hash" combinations so if you are attacking +# 1000 hashes, "43210" means you have tried about 43 words from your wordlist. +StatusShowCandidates = N + +# Always report (to screen and log) cracked passwords as UTF-8, regardless of +# input encoding. This is recommended if you have your terminal set for UTF-8. +AlwaysReportUTF8 = N + +# Always store Unicode (UTF-16) passwords as UTF-8 in john.pot, regardless +# of input encoding. This prevents john.pot from being filled with mixed +# and eventually unknown encodings. This is recommended if you have your +# terminal set for UTF-8. +UnicodeStoreUTF8 = N + +# Always report/store non-Unicode formats as UTF-8, regardless of input +# encoding. This is NOT recommended unless you REALLY understand the +# implications. The actual codepage that was used is not stored anywhere +# except in the log file. +CPstoreUTF8 = N + +# Write cracked passwords to the log file (default is just the user name) +LogCrackedPasswords = N + + +[Options:MPI] +# Automagically disable OMP if MPI is used (set to N if +# you want to run one MPI process per multi-core host) +MPIOMPmutex = Y + +# Print a notice if disabling OMP (when MPIOMPmutex = Y) +# or when running OMP and MPI at the same time +MPIOMPverbose = Y + + +[Options:OpenCL] +# Set default OpenCL platform and/or device. Command line options will +# override these. If neither is set, we will search for a GPU or fall-back +# to platform 0, device 0. +#Platform = 0 +#Device = 0 + +# Format-specific settings for Local Work Size and Global Work Size call. +# An LWS or GWS of zero will initiate auto enumeration. The environment +# variables LWS and/or GWS will override these figures. +#ssha_LWS = 512 +#ssha_GWS = 8192 + +# For RAR format. MaxDuration (seconds) can be used to limit run time in case +# there is a watch-dog time-out. +#rar_LWS = 128 +#rar_GWS = 8192 +rar_MaxDuration = 5 + +# For crypt SHA-512. +#sha512crypt_LWS = 64 +#sha512crypt_GWS = 8192 + + +# Markov modes, see ../doc/MARKOV for more information +[Markov:Default] +# Default Markov mode settings +# +# Statsfile cannot be specified on the command line, so +# specifying it here is mandatory +Statsfile = $JOHN/stats +# MkvLvl and MkvMaxLen should also be specified here, as a fallback for +# --markov usage without specifying LEVEL and/or LENGTH on the command line +MkvLvl = 200 +MkvMaxLen = 12 +# MkvMinLvl and MkvMinLen should not be specified at all in [Markov:Default], +# or they should be equal to 0 (which is the default if not specified. +# MkvMinLvl and MkvMinLen can be used in other Markov mode sections +# except [Markov:Default] +; MkvMinLvl = 0 +; MkvMinLen = 0 + +# A user defined character class is named with a single digit, ie. 0..9. After +# the equal-sign, just list all characters that this class should match. You +# can specify ranges within brackets, much like pre-processor ranges in rules. +# BEWARE of encoding if using non-ASCII characters. If you put UTF-8 characters +# here, it will *not* work! You must use a singlebyte encoding and it should +# be the same here as you intend to use for your dictionary. +# You can however put characters here in \xA3 format (for codepoint 0xA3 - in +# many iso-8859-x codepages that would mean a pound sign). This works in ranges +# too but NOTE that this syntax does NOT work in any other section of john.conf +# +# This is a couple of example classes: +# ?0 matches (one version of) base64 characters +# ?1 matches hex digits +# ?2 matches the TAB character (never try to use \x00!) +[UserClasses] +0 = [a-zA-Z0-9/.] +1 = [0-9a-fA-F] +2 = \x09 + + +# "Single crack" mode rules +[List.Rules:Single] +# Simple rules come first... +: +-s x** +-c (?a c Q +-c l Q +-s-c x** /?u l +# These were not included in crackers I've seen, but are pretty efficient, +# so I include them near the beginning +>6 '6 +>7 '7 l +-c >6 '6 /?u l +>5 '5 +# Weird order, eh? Can't do anything about it, the order is based on the +# number of successful cracks... +<* d +r c +-c <* (?a d c +-c >5 '5 /?u l +-c u Q +-c )?a r l +-[:c] <* !?A \p1[lc] p +-c <* c Q d +-c >7 '7 /?u +>4 '4 l +-c <+ (?l c r +-c <+ )?l l Tm +>3 '3 +-c >4 '4 /?u +-c >3 '3 /?u l +-c u Q r +<* d M 'l f Q +-c <* l Q d M 'l f Q +# About 50% of single-mode-crackable passwords get cracked by now... +# >2 x12 ... >8 x18 +>[2-8] x1\1 +>9 \[ +# >3 x22 ... >9 x28 +>[3-9] x2\p[2-8] +# >4 x32 ... >9 x37 +>[4-9] x3\p[2-7] +# >2 x12 /?u l ... >8 x18 /?u l +-c >[2-8] x1\1 /?u l +-c >9 \[ /?u l +# >3 x22 /?u l ... >9 x28 /?u l +-c >[3-9] x2\p[2-8] /?u l +# >4 x32 /?u l ... >9 x37 /?u l +-c >[4-9] x3\p[2-7] /?u l +# Now to the suffix stuff... +<* l $[1-9!0a-rt-z"-/:-@\[-`{-~] +-c <* (?a c $[1-9!0a-rt-z"-/:-@\[-`{-~] +-[:c] <* !?A (?\p1[za] \p1[lc] $s M 'l p Q X0z0 'l $s +-[:c] <* /?A (?\p1[za] \p1[lc] $s +<* l r $[1-9!] +-c <* /?a u $[1-9!] +-[:c] <- (?\p1[za] \p1[lc] Az"'s" +-[:c] <- (?\p1[za] \p1[lc] Az"!!" +-[:c] (?\p1[za] \p1[lc] $! <- Az"!!" +# Removing vowels... +-[:c] /?v @?v >2 (?\p1[za] \p1[lc] +/?v @?v >2 <* d +# crack -> cracked, crack -> cracking +<* l [PI] +-c <* l [PI] (?a c +# mary -> marie +-[:c] <* (?\p1[za] \p1[lc] )y omi $e +# marie -> mary +-[:c] <* (?\p1[za] \p1[lc] )e \] )i val1 oay +# The following are some 3l33t rules +-[:c] l /[aelos] s\0\p[4310$] (?\p1[za] \p1[:c] +-[:c] l /a /[elos] sa4 s\0\p[310$] (?\p1[za] \p1[:c] +-[:c] l /e /[los] se3 s\0\p[10$] (?\p1[za] \p1[:c] +-[:c] l /l /[os] sl1 s\0\p[0$] (?\p1[za] \p1[:c] +-[:c] l /o /s so0 ss$ (?\p1[za] \p1[:c] +-[:c] l /a /e /[los] sa4 se3 s\0\p[10$] (?\p1[za] \p1[:c] +-[:c] l /a /l /[os] sa4 sl1 s\0\p[0$] (?\p1[za] \p1[:c] +-[:c] l /a /o /s sa4 so0 ss$ (?\p1[za] \p1[:c] +-[:c] l /e /l /[os] se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c] +-[:c] l /[el] /o /s s\0\p[31] so0 ss$ (?\p1[za] \p1[:c] +-[:c] l /a /e /l /[os] sa4 se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c] +-[:c] l /a /[el] /o /s sa4 s\0\p[31] so0 ss$ (?\p1[za] \p1[:c] +-[:c] l /e /l /o /s se3 sl1 so0 ss$ (?\p1[za] \p1[:c] +-[:c] l /a /e /l /o /s sa4 se3 sl1 so0 ss$ (?\p1[za] \p1[:c] +# Now to the prefix stuff... +l ^[1a-z2-90] +-c l Q ^[A-Z] +^[A-Z] +l ^["-/:-@\[-`{-~] +-[:c] <9 (?a \p1[lc] A0"[tT]he" +-[:c] <9 (?a \p1[lc] A0"[aA]my" +-[:c] <9 (?a \p1[lc] A0"[mdMD]r" +-[:c] <9 (?a \p1[lc] A0"[mdMD]r." +-[:c] <9 (?a \p1[lc] A0"__" +<- !?A l p ^[240-9] +# Some word pair rules... +# johnsmith -> JohnSmith, johnSmith +-p-c (?a 2 (?a c 1 [cl] +# JohnSmith -> john smith, john_smith, john-smith +-p 1 <- $[ _\-] + l +# JohnSmith -> John smith, John_smith, John-smith +-p-c 1 <- (?a c $[ _\-] 2 l +# JohnSmith -> john Smith, john_Smith, john-Smith +-p-c 1 <- l $[ _\-] 2 (?a c +# johnsmith -> John Smith, John_Smith, John-Smith +-p-c 1 <- (?a c $[ _\-] 2 (?a c +# Applying different simple rules to each of the two words +-p-[c:] 1 \p1[ur] 2 l +-p-c 2 (?a c 1 [ur] +-p-[c:] 1 l 2 \p1[ur] +-p-c 1 (?a c 2 [ur] +# jsmith -> smithj, etc... +-[:c] (?a \p1[lc] [{}] +-[:c] (?a \p1[lc] [{}] \0 +# Toggle case... +-c <+ )?u l Tm +-c T0 Q M c Q l Q u Q C Q X0z0 'l +-c T[1-9A-E] Q M l Tm Q C Q u Q l Q c Q X0z0 'l +-c l Q T[1-9A-E] Q M T\0 Q l Tm Q C Q u Q X0z0 'l +-c >2 2 /?l /?u t Q M c Q C Q l Tm Q X0z0 'l +# Deleting chars... +>[2-8] D\p[1-7] +>[8-9A-E] D\1 +-c /?u >[2-8] D\p[1-7] l +-c /?u >[8-9A-E] D\1 l +=1?a \[ M c Q +-c (?a >[1-9A-E] D\1 c +# Inserting a dot... +-[:c] >3 (?a \p1[lc] i[12]. +# More suffix stuff... +<- l Az"[190][0-9]" +-c <- (?a c Az"[190][0-9]" +<- l Az"[782][0-9]" +-c <- (?a c Az"[782][0-9]" +<* l $[A-Z] +-c <* (?a c $[A-Z] +# cracking -> CRACKiNG +-c u /I sIi +# Crack96 -> cRACK96 +%2?a C Q +# Crack96 -> cRACK(^ +/?A S Q +# Crack96 -> CRaCK96 +-c /?v V Q +# Really weird charset conversions, like "england" -> "rmh;smf" +:[RL] Q +l Q [RL] +-c (?a c Q [RL] +:[RL] \0 Q +# Both prefixing and suffixing... +<- l ^[1!@#$%^&*\-=_+.?|:'"] $\1 +<- l ^[({[<] $\p[)}\]>] +# The rest of two-digit suffix stuff, less common numbers... +<- l Az"[63-5][0-9]" +-c <- (?a c Az"[63-5][0-9]" +# Some multi-digit numbers... +-[:c] (?a \p1[lc] Az"007" <+ +-[:c] (?a \p1[lc] Az"123" <+ +-[:c] (?a \p1[lc] Az"[0-9]\0\0" <+ +-[:c] (?a \p1[lc] Az"1234" <+ +-[:c] (?a \p1[lc] Az"[0-9]\0\0\0" <+ +-[:c] (?a \p1[lc] Az"12345" <+ +-[:c] (?a \p1[lc] Az"[0-9]\0\0\0\0" <+ +-[:c] (?a \p1[lc] Az"123456" <+ +-[:c] (?a \p1[lc] Az"[0-9]\0\0\0\0\0" <+ +# Some [birth] years... +l Az"19[7-96-0]" <+ >- +l Az"20[01]" <+ >- +l Az"19[7-9][0-9]" <+ +l Az"20[01][0-9]" <+ +l Az"19[6-0][9-0]" <+ + +[List.Rules:Extra] +# Insert/overstrike some characters... +!?A >[1-6] l i\0[a-z] +!?A l o0[a-z] +!?A >[1-7] l o\0[a-z] +# Toggle case everywhere (up to length 8), assuming that certain case +# combinations were already tried. +-c T1 Q M T0 Q +-c T2 Q M T[z0] T[z1] Q +-c T3 Q M T[z0] T[z1] T[z2] Q +-c T4 Q M T[z0] T[z1] T[z2] T[z3] Q +-c T5 Q M T[z0] T[z1] T[z2] T[z3] T[z4] Q +-c T6 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] Q +-c T7 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] T[z6] Q +# Very slow stuff... +l Az"[1-90][0-9][0-9]" <+ +-c (?a c Az"[1-90][0-9][0-9]" <+ +<[\-9] l A\p[z0]"[a-z][a-z]" +<- l ^[a-z] $[a-z] + +# Wordlist mode rules +[List.Rules:Wordlist] +# Try words as they are +: +# Lowercase every pure alphanumeric word +-c >3 !?X l Q +# Capitalize every pure alphanumeric word +-c (?a >2 !?X c Q +# Lowercase and pluralize pure alphabetic words +<* >2 !?A l p +# Lowercase pure alphabetic words and append '1' +<* >2 !?A l $1 +# Capitalize pure alphabetic words and append '1' +-c <* >2 !?A c $1 +# Duplicate reasonably short pure alphabetic words (fred -> fredfred) +<7 >1 !?A l d +# Lowercase and reverse pure alphabetic words +>3 !?A l M r Q +# Prefix pure alphabetic words with '1' +>2 !?A l ^1 +# Uppercase pure alphanumeric words +-c >2 !?X u Q M c Q u +# Lowercase pure alphabetic words and append a digit or simple punctuation +<* >2 !?A l $[2!37954860.?] +# Words containing punctuation, which is then squeezed out, lowercase +/?p @?p >3 l +# Words with vowels removed, lowercase +/?v @?v >3 l +# Words containing whitespace, which is then squeezed out, lowercase +/?w @?w >3 l +# Capitalize and duplicate short pure alphabetic words (fred -> FredFred) +-c <7 >1 !?A c d +# Capitalize and reverse pure alphabetic words (fred -> derF) +-c <+ >2 !?A c r +# Reverse and capitalize pure alphabetic words (fred -> Derf) +-c >2 !?A l M r Q c +# Lowercase and reflect pure alphabetic words (fred -> fredderf) +<7 >1 !?A l d M 'l f Q +# Uppercase the last letter of pure alphabetic words (fred -> freD) +-c <+ >2 !?A l M r Q c r +# Prefix pure alphabetic words with '2' or '4' +>2 !?A l ^[24] +# Capitalize pure alphabetic words and append a digit or simple punctuation +-c <* >2 !?A c $[2!3957468.?0] +# Prefix pure alphabetic words with digits +>2 !?A l ^[379568] +# Capitalize and pluralize pure alphabetic words of reasonable length +-c <* >2 !?A c p +# Lowercase/capitalize pure alphabetic words of reasonable length and convert: +# crack -> cracked, crack -> cracking +-[:c] <* >2 !?A \p1[lc] M [PI] Q +# Try the second half of split passwords +-s x** +-s-c x** M l Q + +# Case toggler for cracking MD4-based NTLM hashes (with the contributed patch) +# given already cracked DES-based LM hashes. +# Rename this section to [List.Rules:Wordlist] to activate it. +[List.Rules:NT] +: +-c T0Q +-c T1QT[z0] +-c T2QT[z0]T[z1] +-c T3QT[z0]T[z1]T[z2] +-c T4QT[z0]T[z1]T[z2]T[z3] +-c T5QT[z0]T[z1]T[z2]T[z3]T[z4] +-c T6QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5] +-c T7QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6] +-c T8QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7] +-c T9QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8] +-c TAQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9] +-c TBQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA] +-c TCQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB] +-c TDQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB]T[zC] + +# For Single Mode against fast hashes +[List.Rules:Single-Extra] +.include [List.Rules:Single] +.include [List.Rules:Extra] + +# For Wordlist mode and very fast hashes +[List.Rules:Jumbo] +.include [List.Rules:Wordlist] +.include [List.Rules:Single] +.include [List.Rules:Extra] +.include [List.Rules:NT] + +# Incremental modes +[Incremental:All] +File = $JOHN/all.chr +MinLen = 0 +MaxLen = 8 +CharCount = 95 + +[Incremental:All5] +.include [Incremental:All] +MaxLen = 5 + +[Incremental:All6] +.include [Incremental:All] +MaxLen = 6 +MinLen = 6 + +[Incremental:All7] +.include [Incremental:All] +MinLen = 7 +MaxLen = 7 + +[Incremental:All8] +.include [Incremental:All] +MinLen = 8 + +[Incremental:Alpha] +File = $JOHN/alpha.chr +MinLen = 1 +MaxLen = 8 +CharCount = 26 + +[Incremental:Digits] +File = $JOHN/digits.chr +MinLen = 1 +MaxLen = 8 +CharCount = 10 + +[Incremental:Digits8] +File = $JOHN/digits.chr +MinLen = 8 +MaxLen = 8 +CharCount = 10 + +[Incremental:Alnum] +File = $JOHN/alnum.chr +MinLen = 1 +MaxLen = 8 +CharCount = 36 + +[Incremental:LanMan] +File = $JOHN/lanman.chr +MinLen = 0 +MaxLen = 7 +CharCount = 69 + +# Some pre-defined word filters +[List.External:Filter_Alpha] +void filter() +{ + int i, c; + + i = 0; + while (c = word[i++]) + if (c < 'a' || c > 'z') { + word = 0; return; + } +} + +[List.External:Filter_Digits] +void filter() +{ + int i, c; + + i = 0; + while (c = word[i++]) + if (c < '0' || c > '9') { + word = 0; return; + } +} + +[List.External:Filter_Alnum] +void filter() +{ + int i, c; + + i = 0; + while (c = word[i++]) + if ((c < 'a' || c > 'z') && (c < '0' || c > '9')) { + word = 0; return; + } +} + +[List.External:Filter_No_Cap_or_Symbols] +void filter() +{ + int i, c; + + i = 0; + while (c = word[i++]) + if ((c < 'a' || c > 'z') && (c < '0' || c > '9')) { + return; + } + word = 0; return; +} + +[List.External:Filter_LanMan] +void filter() +{ + int i, c; + + word[7] = 0; // Truncate at 7 characters + + i = 0; // Convert to uppercase + while (c = word[i]) { + if (c >= 'a' && c <= 'z') word[i] &= 0xDF; + i++; + } +} + +# A simple cracker for LM hashes +[List.External:LanMan] +int length; // Current length + +void init() +{ + word[0] = 'A' - 1; // Start with "A" + word[length = 1] = 0; +} + +void generate() +{ + int i; + + i = length - 1; // Start from the last character + while (++word[i] > 'Z') // Try to increase it + if (i) // Overflow here, any more positions? + word[i--] = 'A'; // Yes, move to the left, and repeat + else // No + if (length < 7) { + word[i = ++length] = 0; // Switch to the next length + while (i--) + word[i] = 'A'; + return; + } else { + word = 0; return; // We're done + } +} + +void restore() +{ + length = 0; // Calculate the length + while (word[length]) length++; +} + +# Simple and well-commented, yet useful external mode example +# NOTE, this has now been 'split' up into a base extern, 'base', and then +# multiple External:double functions. It still has same code as original +# double, but now can be easily expanded. +[List.External_base:Double] +/* + * This cracking mode tries all the possible duplicated lowercase alphabetic + * "words" of up to 8 characters long. Since word halves are the same, it + * only has to try about 500,000 words. + */ + +/* Global variables: current length and word */ +/* make this 'long' enough for other externs that include this one */ +/* (up to 14 bytes long) We currently have double and double10 defined, */ +/* but could add more, up to double14 */ + +int length, current[15], max; + +/* this new 'type' variable, is used to tell double what character set to + * use. It can use the original (alpha). If type is 0 (i.e. unset), then + * a-z (alpha) character set is used. If type is '0' (a zero ascii byte) + * then alnum charset is used, a-z0-9. If type is a space char, then all + * charset is used [space - tilde] or [ -~]. This required setting the + * type var in the init() of alnum or all doubles (it can be left unset + * in the alpha versions). It also requires some if logic in generate. + * other than that, it works the same, with almost no performance hit */ +int type; + +/* Generates a new word */ +void generate() +{ + int i; + +/* Export last generated word, duplicating it at the same time; here "word" + * is a pre-defined external variable. */ + word[(i = length) << 1] = 0; + while (i--) word[length + i] = word[i] = current[i]; + +/* Generate a new word */ + i = length - 1; // Start from the last character + if (type == 0) { + /* alpha */ + while (++current[i] > 'z') // Try to increase it + if (i) // Overflow here, any more positions? + current[i--] = 'a'; // Yes, move to the left, and repeat + else { // No + current = 0; // Request a length switch + break; // Break out of the loop + } + } else if (type == '0') { + /* alnum */ + if (current[i] == 'z') current[i] = '0'-1; + while (++current[i] == '9') { // Try to increase it + if (i) // Overflow here, any more positions? + current[i--] = 'a'; // Yes, move to the left, and repeat + else { // No + current = 0; // Request a length switch + break; // Break out of the loop + } + if (current[i] == 'z') current[i] = '0'-1; + } + } else if (type == ' ') { + /* all */ + while (++current[i] > '~') { // Try to increase it + if (i) // Overflow here, any more positions? + current[i--] = ' '; // Yes, move to the left, and repeat + else { // No + current = 0; // Request a length switch + break; // Break out of the loop + } + } + } + /* else ????? wtf?? */ + +/* Switch to the next length, unless we were generating 8 character long + * words already. */ + if (!current && length < max) { + i = ++length; + if (type == 0 || type == '0') + while (i--) current[i] = 'a'; + else if (type == ' ') + while (i--) current[i] = ' '; + } +} + +/* Called when restoring an interrupted session */ +void restore() +{ + int i; + +/* Import the word back */ + i = 0; + while (current[i] = word[i]) i++; + +/* ...and calculate the half-word length */ + length = i >> 1; +} + +[List.External:Double] +.include [List.External_base:Double] + +/* Called at startup to initialize the global variables */ +void init() +{ + int i; + + i = length = 2; // Start with 4 character long words + while (i--) current[i] = 'a'; // Set our half-word to "aa" + max = 4; +} + +[List.External:Double_alnum] +.include [List.External_base:Double] + +/* Called at startup to initialize the global variables */ +void init() +{ + int i; + + i = length = 2; // Start with 4 character long words + while (i--) current[i] = 'a'; // Set our half-word to "aa" + max = 4; + + type = '0'; +} + +[List.External:Double_all] +.include [List.External_base:Double] +void init() +{ + int i; + + i = length = 2; // Start with 4 character long words + while (i--) current[i] = ' '; // Set our half-word to " " + max = 4; + + type = ' '; +} + +[List.External:Double10] +.include [List.External_base:Double] + +/* Called at startup to initialize the global variables */ +void init() +{ + int i; + + i = length = 5; // Start with 10 character long words (we assume double has already been run) + while (i--) current[i] = 'a'; // Set our half-word to "aaaaa" + max = 5; +} + +[List.External:Double10_alnum] +.include [List.External_base:Double] +void init() +{ + int i; + + i = length = 5; // Start with 4 character long words + while (i--) current[i] = 'a'; // Set our half-word to "aaaaa" + max = 5; + + type = '0'; +} + +# Strip 0.5 ("Secure Tool for Recalling Important Passwords") cracker, +# based on analysis done by Thomas Roessler and Ian Goldberg. This will +# crack passwords you may have generated with Strip; other uses of Strip +# are unaffected. +[List.External:Strip] +int minlength, maxlength, mintype, maxtype; +int crack_seed, length, type; +int count, charset[128]; + +void init() +{ + int c; + +/* Password lengths to try; Strip can generate passwords of 4 to 16 + * characters, but traditional crypt(3) hashes are limited to 8. */ + minlength = 4; // 4 + maxlength = 8; // 16 + +/* Password types to try (Numeric, Alpha-Num, Alpha-Num w/ Meta). */ + mintype = 0; // 0 + maxtype = 2; // 2 + + crack_seed = 0x10000; + length = minlength - 1; + type = mintype; + + count = 0; + c = '0'; while (c <= '9') charset[count++] = c++; +} + +void generate() +{ + int seed, random; + int i, c; + + if (crack_seed > 0xffff) { + crack_seed = 0; + + if (++length > maxlength) { + length = minlength; + + if (++type > maxtype) { + word[0] = 0; + return; + } + } + + count = 10; + if (type >= 1) { + c = 'a'; while (c <= 'f') charset[count++] = c++; + c = 'h'; while (c <= 'z') charset[count++] = c++; + c = 'A'; while (c <= 'Z') charset[count++] = c++; + } + if (type == 2) { + charset[count++] = '!'; + c = '#'; while (c <= '&') charset[count++] = c++; + c = '('; while (c <= '/') charset[count++] = c++; + c = '<'; while (c <= '>') charset[count++] = c++; + charset[count++] = '?'; charset[count++] = '@'; + charset[count++] = '['; charset[count++] = ']'; + charset[count++] = '^'; charset[count++] = '_'; + c = '{'; while (c <= '~') charset[count++] = c++; + } + } + + seed = (crack_seed++ << 16 >> 16) * 22695477 + 1; + + i = 0; + while (i < length) { + random = ((seed = seed * 22695477 + 1) >> 16) & 0x7fff; + word[i++] = charset[random % count]; + } + + word[i] = 0; +} + +# Try sequences of adjacent keys on a keyboard as candidate passwords +[List.External:Keyboard] +int maxlength, length; // Maximum password length to try, current length +int fuzz; // The desired "fuzz factor", either 0 or 1 +int id[15]; // Current character indices for each position +int m[0x800], mc[0x100];// The keys matrix, counts of adjacent keys +int f[0x40], fc; // Characters for the first position, their count + +void init() +{ + int minlength; + int i, j, c, p; + int k[0x40]; + + minlength = 1; // Initial password length to try + maxlength = 15; // Maximum password length to try, up to 15 + fuzz = 1; // "Fuzz factor", set to 0 for much quicker runs + +/* + * This defines the keyboard layout, by default for a QWERTY keyboard. + */ + i = 0; while (i < 0x40) k[i++] = 0; + k[0] = '`'; + i = 0; while (++i <= 9) k[i] = '0' + i; + k[10] = '0'; k[11] = '-'; k[12] = '='; + k[0x11] = 'q'; k[0x12] = 'w'; k[0x13] = 'e'; k[0x14] = 'r'; + k[0x15] = 't'; k[0x16] = 'y'; k[0x17] = 'u'; k[0x18] = 'i'; + k[0x19] = 'o'; k[0x1a] = 'p'; k[0x1b] = '['; k[0x1c] = ']'; + k[0x1d] = '\\'; + k[0x21] = 'a'; k[0x22] = 's'; k[0x23] = 'd'; k[0x24] = 'f'; + k[0x25] = 'g'; k[0x26] = 'h'; k[0x27] = 'j'; k[0x28] = 'k'; + k[0x29] = 'l'; k[0x2a] = ';'; k[0x2b] = '\''; + k[0x31] = 'z'; k[0x32] = 'x'; k[0x33] = 'c'; k[0x34] = 'v'; + k[0x35] = 'b'; k[0x36] = 'n'; k[0x37] = 'm'; k[0x38] = ','; + k[0x39] = '.'; k[0x3a] = '/'; + + i = 0; while (i < 0x100) mc[i++] = 0; + fc = 0; + + /* rows */ + c = 0; + i = 0; + while (i < 0x40) { + p = c; + c = k[i++] & 0xff; + if (!c) continue; + f[fc++] = c; + if (!p) continue; + m[(c << 3) + mc[c]++] = p; + m[(p << 3) + mc[p]++] = c; + } + f[fc] = 0; + + /* columns */ + i = 0; + while (i < 0x30) { + p = k[i++] & 0xff; + if (!p) continue; + j = 1 - fuzz; + while (j <= 1 + fuzz) { + c = k[i + 0x10 - j++] & 0xff; + if (!c) continue; + m[(c << 3) + mc[c]++] = p; + m[(p << 3) + mc[p]++] = c; + } + } + + length = 0; + while (length < minlength) + id[length++] = 0; +} + +void generate() +{ + int i, p, maxcount; + + word[i = 0] = p = f[id[0]]; + while (++i < length) + word[i] = p = m[(p << 3) + id[i]]; + word[i--] = 0; + + if (i) maxcount = mc[word[i - 1]]; else maxcount = fc; + while (++id[i] >= maxcount) { + if (!i) { + if (length < maxlength) { + id[0] = 0; + id[length++] = 0; + } + return; + } + id[i--] = 0; + if (i) maxcount = mc[word[i - 1]]; else maxcount = fc; + } +} + +void restore() +{ + int i; + + /* Calculate the length */ + length = 0; + while (word[length]) + id[length++] = 0; + + /* Infer the first character index */ + i = -1; + while (++i < fc) { + if (f[i] == word[0]) { + id[0] = i; + break; + } + } + + /* This sample can be enhanced to infer the rest of the indices here */ +} + +# Generic implementation of "dumb" exhaustive search, given a range of lengths +# and an arbitrary charset. This is pre-configured to try 8-bit characters +# against LM hashes, which is only reasonable to do for very short password +# half lengths. +[List.External:DumbForce] +int maxlength; // Maximum password length to try +int last; // Last character position, zero-based +int lastid; // Character index in the last position +int id[0x7f]; // Current character indices for other positions +int charset[0x100], c0; // Character set + +void init() +{ + int minlength; + int i, c; + + minlength = 1; // Initial password length to try, must be at least 1 + maxlength = 7; // Must be at least same as minlength + +/* + * This defines the character set. + * + * Let's say, we want to try TAB, all non-control ASCII characters, and all + * 8-bit characters, including the 8-bit terminal controls range (as these are + * used as regular national characters with some 8-bit encodings), but except + * for known terminal controls (risky for the terminal we may be running on). + * + * Also, let's say our hashes are case-insensitive, so skip lowercase letters + * (this is right for LM hashes). + */ + i = 0; + charset[i++] = 9; // Add horizontal TAB (ASCII 9), then + c = ' '; // start with space (ASCII 32) and + while (c < 'a') // proceed till lowercase 'a' + charset[i++] = c++; + c = 'z' + 1; // Skip lowercase letters and + while (c <= 0x7e) // proceed for all printable ASCII + charset[i++] = c++; + c++; // Skip DEL (ASCII 127) and + while (c < 0x84) // proceed over 8-bit codes till IND + charset[i++] = c++; + charset[i++] = 0x86; // Skip IND (84 hex) and NEL (85 hex) + charset[i++] = 0x87; + c = 0x89; // Skip HTS (88 hex) + while (c < 0x8d) // Proceed till RI (8D hex) + charset[i++] = c++; + c = 0x91; // Skip RI, SS2, SS3, DCS + while (c < 0x96) // Proceed till SPA (96 hex) + charset[i++] = c++; + charset[i++] = 0x99; // Skip SPA, EPA, SOS + c = 0xa0; // Skip DECID, CSI, ST, OSC, PM, APC + while (c <= 0xff) // Proceed with the rest of 8-bit codes + charset[i++] = c++; + +/* Zero-terminate it, and cache the first character */ + charset[i] = 0; + c0 = charset[0]; + + last = minlength - 1; + i = 0; + while (i <= last) { + id[i] = 0; + word[i++] = c0; + } + lastid = -1; + word[i] = 0; +} + +void generate() +{ + int i; + +/* Handle the typical case specially */ + if (word[last] = charset[++lastid]) return; + + lastid = 0; + word[i = last] = c0; + while (i--) { // Have a preceding position? + if (word[i] = charset[++id[i]]) return; + id[i] = 0; + word[i] = c0; + } + + if (++last < maxlength) { // Next length? + id[last] = lastid = 0; + word[last] = c0; + word[last + 1] = 0; + } else // We're done + word = 0; +} + +void restore() +{ + int i, c; + +/* Calculate the current length and infer the character indices */ + last = 0; + while (c = word[last]) { + i = 0; while (charset[i] != c && charset[i]) i++; + if (!charset[i]) i = 0; // Not found + id[last++] = i; + } + lastid = id[--last]; +} + +# Generic implementation of exhaustive search for a partially-known password. +# This is pre-configured for length 8, lowercase and uppercase letters in the +# first 4 positions (52 different characters), and digits in the remaining 4 +# positions - however, the corresponding part of init() may be modified to use +# arbitrary character sets or even fixed characters for each position. +[List.External:KnownForce] +int last; // Last character position, zero-based +int lastofs; // Last character position offset into charset[] +int lastid; // Current character index in the last position +int id[0x7f]; // Current character indices for other positions +int charset[0x7f00]; // Character sets, 0x100 elements for each position + +void init() +{ + int length; + int pos, ofs, i, c; + + length = 8; // Password length to try + +/* This defines the character sets for different character positions */ + pos = 0; + while (pos < 4) { + ofs = pos++ << 8; + i = 0; + c = 'a'; + while (c <= 'z') + charset[ofs + i++] = c++; + c = 'A'; + while (c <= 'Z') + charset[ofs + i++] = c++; + charset[ofs + i] = 0; + } + while (pos < length) { + ofs = pos++ << 8; + i = 0; + c = '0'; + while (c <= '9') + charset[ofs + i++] = c++; + charset[ofs + i] = 0; + } + + last = length - 1; + pos = -1; + while (++pos <= last) + word[pos] = charset[id[pos] = pos << 8]; + lastid = (lastofs = last << 8) - 1; + word[pos] = 0; +} + +void generate() +{ + int pos; + +/* Handle the typical case specially */ + if (word[last] = charset[++lastid]) return; + + word[pos = last] = charset[lastid = lastofs]; + while (pos--) { // Have a preceding position? + if (word[pos] = charset[++id[pos]]) return; + word[pos] = charset[id[pos] = pos << 8]; + } + + word = 0; // We're done +} + +void restore() +{ + int i, c; + +/* Calculate the current length and infer the character indices */ + last = 0; + while (c = word[last]) { + i = lastofs = last << 8; + while (charset[i] != c && charset[i]) i++; + if (!charset[i]) i = lastofs; // Not found + id[last++] = i; + } + lastid = id[--last]; +} + +# A variation of KnownForce configured to try likely date and time strings. +[List.External:DateTime] +int last; // Last character position, zero-based +int lastofs; // Last character position offset into charset[] +int lastid; // Current character index in the last position +int id[0x7f]; // Current character indices for other positions +int charset[0x7f00]; // Character sets, 0x100 elements for each position + +void init() +{ + int length; + int pos, ofs, i, c; + + length = 8; // Must be one of: 4, 5, 7, 8 + +/* This defines the character sets for different character positions */ + pos = 0; + while (pos < length - 6) { + ofs = pos++ << 8; + i = 0; + c = '0'; + while (c <= '9') + charset[ofs + i++] = c++; + charset[ofs + i] = 0; + } + if (pos) { + ofs = pos++ << 8; + charset[ofs] = '/'; + charset[ofs + 1] = '.'; + charset[ofs + 2] = ':'; + charset[ofs + 3] = 0; + } + while (pos < length - 3) { + ofs = pos++ << 8; + i = 0; + c = '0'; + while (c <= '9') + charset[ofs + i++] = c++; + charset[ofs + i] = 0; + } + ofs = pos++ << 8; + charset[ofs] = '/'; + charset[ofs + 1] = '.'; + charset[ofs + 2] = ':'; + charset[ofs + 3] = 0; + while (pos < length) { + ofs = pos++ << 8; + i = 0; + c = '0'; + while (c <= '9') + charset[ofs + i++] = c++; + charset[ofs + i] = 0; + } + + last = length - 1; + pos = -1; + while (++pos <= last) + word[pos] = charset[id[pos] = pos << 8]; + lastid = (lastofs = last << 8) - 1; + word[pos] = 0; +} + +void generate() +{ + int pos; + +/* Handle the typical case specially */ + if (word[last] = charset[++lastid]) return; + + word[pos = last] = charset[lastid = lastofs]; + while (pos--) { // Have a preceding position? + if (word[pos] = charset[++id[pos]]) return; + word[pos] = charset[id[pos] = pos << 8]; + } + + word = 0; // We're done +} + +void restore() +{ + int i, c; + +/* Calculate the current length and infer the character indices */ + last = 0; + while (c = word[last]) { + i = lastofs = last << 8; + while (charset[i] != c && charset[i]) i++; + if (!charset[i]) i = lastofs; // Not found + id[last++] = i; + } + lastid = id[--last]; +} + +# Try strings of repeated characters. +[List.External:Repeats] +int minlength, maxlength, minc, maxc, length, c; + +void init() +{ + minlength = 1; + maxlength = 72; + minc = 0x20; + maxc = 0xff; + + length = minlength; c = minc; +} + +void generate() +{ + int i; + + i = 0; + while (i < length) + word[i++] = c; + word[i] = 0; + + if (c++ < maxc) + return; + + c = minc; + if (++length > maxlength) + c = 0; // Will NUL out the next "word" and thus terminate +} + +# Generate candidate passwords from many small subsets of characters from a +# much larger full character set. This will test for passwords containing too +# few different characters. As currently implemented, this code will produce +# some duplicates, although their number is relatively small when the maximum +# number of different characters (the maxdiff setting) is significantly lower +# than the maximum length (the maxlength setting). Nevertheless, you may want +# to pass the resulting candidate passwords through "unique" if you intend to +# test them against hashes that are salted and/or of a slow to compute type. +[List.External:Subsets] +int minlength; // Minimum password length to try +int maxlength; // Maximum password length to try +int startdiff; // Initial number of characters in a subset to try +int maxdiff; // Maximum number of characters in a subset to try +int last; // Last character position, zero-based +int lastid; // Character index in the last position +int id[0x7f]; // Current character indices for other positions +int subset[0x100], c0; // Current subset +int subcount; // Number of characters in the current subset +int subid[0x100]; // Indices into charset[] of characters in subset[] +int charset[0x100]; // Full character set +int charcount; // Number of characters in the full charset + +void init() +{ + int i, c; + + minlength = 1; // Minimum password length to try, must be at least 1 + maxlength = 8; // Must be at least same as minlength + + startdiff = 1; // Initial number of different characters to try + maxdiff = 3; // Maximum number of different characters to try + +/* This defines the character set */ + i = 0; + c = 0x20; + while (c <= 0x7e) + charset[i++] = c++; + + if (maxdiff > (charcount = i)) + maxdiff = i; + if (maxdiff > maxlength) + maxdiff = maxlength; + +/* + * Initialize the variables such that generate() gets to its "next subset" + * code, which will initialize everything for real. + */ + subcount = (i = startdiff) - 1; + while (i--) + subid[i] = charcount; + subset[0] = c0 = 0; + last = maxlength - 1; + lastid = -1; +} + +void generate() +{ + int i; + +/* Handle the typical case specially */ + if (word[last] = subset[++lastid]) return; + + lastid = 0; + word[i = last] = c0; + while (i--) { // Have a preceding position? + if (word[i] = subset[++id[i]]) return; + id[i] = 0; + word[i] = c0; + } + + if (++last < maxlength) { // Next length? + id[last] = lastid = 0; + word[last] = c0; + word[last + 1] = 0; + return; + } + +/* Next subset */ + if (subcount) { + int j; + i = subcount - 1; + j = charcount; + while (++subid[i] >= j) { + if (i--) { + j--; + continue; + } + subid[i = 0] = 0; + subset[++subcount] = 0; + break; + } + } else { + subid[i = 0] = 0; + subset[++subcount] = 0; + } + subset[i] = charset[subid[i]]; + while (++i < subcount) + subset[i] = charset[subid[i] = subid[i - 1] + 1]; + + if (subcount > maxdiff) { + word = 0; // Done + return; + } + +/* + * We won't be able to fully use the subset if the length is smaller than the + * character count. We assume that we've tried all smaller subsets before, so + * we don't bother with such short lengths. + */ + if (minlength < subcount) + last = subcount - 1; + else + last = minlength - 1; + c0 = subset[0]; + i = 0; + while (i <= last) { + id[i] = 0; + word[i++] = c0; + } + lastid = 0; + word[i] = 0; +} + +# Simple password policy matching: require at least one digit. +[List.External:AtLeast1-Simple] +void filter() +{ + int i, c; + + i = 0; + while (c = word[i++]) + if (c >= '0' && c <= '9') + return; // Found at least one suitable character, good + + word = 0; // No suitable characters found, skip this "word" +} + +# The same password policy implemented in a more efficient and more generic +# fashion (easy to expand to include other "sufficient" characters as well). +[List.External:AtLeast1-Generic] +int mask[0x100]; + +void init() +{ + int c; + + mask[0] = 0; // Terminate the loop in filter() on NUL + c = 1; + while (c < 0x100) + mask[c++] = 1; // Continue looping in filter() on most chars + + c = '0'; + while (c <= '9') + mask[c++] = 0; // Terminate the loop in filter() on digits +} + +void filter() +{ + int i; + + i = -1; + while (mask[word[++i]]) + continue; + if (word[i]) + return; // Found at least one suitable character, good + + word = 0; // No suitable characters found, skip this "word" +} + +# An efficient and fairly generic password policy matcher. The policy to match +# is specified in the check at the end of filter() and in mask[]. For example, +# lowercase and uppercase letters may be treated the same by initializing the +# corresponding mask[] elements to the same value, then adjusting the value to +# check "seen" for accordingly. +[List.External:Policy] +int mask[0x100]; + +void init() +{ + int c; + + mask[0] = 0x100; + c = 1; + while (c < 0x100) + mask[c++] = 0x200; + + c = 'a'; + while (c <= 'z') + mask[c++] = 1; + c = 'A'; + while (c <= 'Z') + mask[c++] = 2; + c = '0'; + while (c <= '9') + mask[c++] = 4; +} + +void filter() +{ + int i, seen; + +/* + * This loop ends when we see NUL (sets 0x100) or a disallowed character + * (sets 0x200). + */ + i = -1; seen = 0; + while ((seen |= mask[word[++i]]) < 0x100) + continue; + +/* + * We should have seen at least one character of each type (which "add up" + * to 7) and then a NUL (adds 0x100), but not any other characters (would + * add 0x200). The length must be 8. + */ + if (seen != 0x107 || i != 8) + word = 0; // Does not conform to policy +} + +# Append the Luhn algorithm digit to arbitrary all-digit strings. Optimized +# for speed, not for size nor simplicity. The primary optimization trick is to +# compute the length and four sums in parallel (in two SIMD'ish variables). +# Then whether the length is even or odd determines which two of the four sums +# are actually used. Checks for non-digits and for NUL are packed into the +# SIMD'ish bitmasks as well. +[List.External:AppendLuhn] +int map1[0x100], map2[0x1fff]; + +void init() +{ + int i; + + map1[0] = ~0x7fffffff; + i = 1; + while (i < 0x100) + map1[i++] = ~0x7effffff; + i = -1; + while (++i < 10) + map1['0' + i] = i + ((i * 2 % 10 + i / 5) << 12); + i = -1; + while (++i < 0x1fff) { + if (i % 10) + map2[i] = '9' + 1 - i % 10; + else + map2[i] = '0'; + } +} + +void filter() +{ + int i, o, e; + + i = o = e = 0; + while ((o += map1[word[i++]]) >= 0) { + if ((e += map1[word[i++]]) >= 0) + continue; + if (e & 0x01000000) + return; // Not all-digit, leave unmodified + word[i--] = 0; + word[i] = map2[(e & 0xfff) + (o >> 12)]; + return; + } + if (o & 0x01000000) + return; // Not all-digit, leave unmodified + word[i--] = 0; + word[i] = map2[(o & 0xfff) + (e >> 12)]; +} + +# Trivial Rot13 Example +# Words which don't contain any letters (and thus wouldn't be changed +# by Rot13) are skipped, because these unchanged words probably should +# have been tried before trying a mangled version. +[List.External:Filter_Rot13] +void filter() +{ + int i, j, c; + + j = 0; + i = 0; // Convert to uppercase + + while (c = word[i]) { + if ((c >= 'a' && c <= 'm') || c >= 'A' && c <= 'M' ) { + word[i] = c + 13; + j++; + } else if ((c >= 'n' && c <= 'z') || c >= 'N' && c <= 'Z' ) { + word[i] = c - 13; + j++; + } + i++; + } + if (j == 0) + word = 0; +} + +# Trivial parallel processing example +[List.External_base:Parallel] +/* + * This word filter makes John process some of the words only, for running + * multiple instances on different CPUs. It can be used with any cracking + * mode except for "single crack". Note: this is not a good solution, but + * is just an example of what can be done with word filters. + */ + +int node, total; // This node's number, and node count +int number; // Current word number + +void filter() +{ + if (number++ % total) // Word for a different node? + word = 0; // Yes, skip it +} + +[List.External:Parallel1_2] +.include [List.External_base:Parallel] +void init() +{ + node = 1; total = 2; // Node 1 of 2 + number = node - 1; // Speedup the filter a bit +} +[List.External:Parallel2_2] +.include [List.External_base:Parallel] +void init() +{ + node = 2; total = 2; // Node 2 of 2 + number = node - 1; // Speedup the filter a bit +} + +# Interrupt the cracking session after "max" words tried +[List.External:AutoAbort] +int max; // Maximum number of words to try +int number; // Current word number + +void init() +{ + max = 1000; + number = 0; +} + +void filter() +{ + if (++number > max) + abort = 1; // Interrupt the cracking session +} + +# Print the status line after every "interval" words tried +[List.External:AutoStatus] +int interval; // How often to print the status +int number; // Current word number + +void init() +{ + interval = 1000; + number = 0; +} + +void filter() +{ + if (number++ % interval) + return; + status = 1; // Print the status line +} + +# dumb-force UTF-16, in an external file +.include "$JOHN/dumb16.conf" + +# dumb-force UTF-32, in an external file +.include "$JOHN/dumb32.conf" + +# Dynamic ($dynamic_n$) scripting code, in an external file +# also shows/tests that .include works the same as .include "$JOHN/file" +.include + +# include john.local.conf (defaults to being empty, but never overwritten) +.include "$JOHN/john.local.conf" diff --git a/john/john.local.conf b/john/john.local.conf new file mode 100644 index 0000000..e69de29 diff --git a/john/lanman.chr b/john/lanman.chr new file mode 100644 index 0000000..9927991 Binary files /dev/null and b/john/lanman.chr differ diff --git a/john/netscreen.py b/john/netscreen.py new file mode 100644 index 0000000..0459afe --- /dev/null +++ b/john/netscreen.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python + +################################################################## +# Filename: netscreen.py +# +# Please note this script will now run in Python version 3.x +# +# This script will generate a netscreen formatted password +# +# This program requires two command line arguments, and works in two modes: +# Mode 1: +# The first argument is a username +# The second argument is a plaintext password +# Mode 2: +# The first argument is -f to indicate reading usernames and passwords from a file +# The second argument is the filename to read +# +# The input file should have one of the following formats (a "," or ":" separator): +# , +# or +# : +# +# (Don't put a "space" after the separator, unless it is part of the password) +# +# Example input file: +# admin,netscreen +# cisco:cisco +# robert,harris +# +# Output will be the username and hashed password in John the Ripper format +# If reading usernames and passwords from a file, the output file name will be: netscreen-JtR-output.txt +# If the file netscreen-JtR-output.txt exists, it will be overwritten. +# +# Version 2.04 +# Updated on September 13, 2010 by Robert B. Harris from VA and Brad Tilley +# Updated to now run in Python v3.x (still works in Python 2.x) +# Additional separator for the input file. It can now have the new separator ":" (or use the old one ",") +# Now correctly handles a separator ("," or ":") in the password field when reading from a file. +# Updated help text in script +# +# Version 2.01 +# Updated on August 30, 2010 by Robert B. Harris from VA +# Very minor changes, removed tab, noted it won't run in python 3.x +# +# Version 2.0 +# Updated on August 12, 2010 by Robert B. Harris from VA +# Updated to use the hashlib library +# Updated to print help text if both input arguments are missing +# Updated to optionally read from a file +# +################################################################## + +import sys + +def net(user, password): + b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + middle = "Administration Tools" + s = "%s:%s:%s" % (user, middle, password) + + # For versions of Python 2.5 and older + if sys.version_info[0] == 2 and sys.version_info[1] < 6: + import md5 + m = md5.new(s).digest() + else: + import hashlib + m = hashlib.md5(s.encode('latin_1')).digest() + + narray = [] + for i in range(8): + if sys.version_info[0] == 2: + n1 = ord(m[2*i]) + n2 = ord(m[2*i+1]) + narray.append( (n1<<8 & 0xff00) | (n2 & 0xff) ) + + if sys.version_info[0] == 3: + n1 = ord(chr(m[2*i])) + n2 = ord(chr(m[2*i+1])) + narray.append( (n1<<8 & 0xff00) | (n2 & 0xff) ) + res = "" + for i in narray: + p1 = i >> 12 & 0xf + p2 = i >> 6 & 0x3f + p3 = i & 0x3f + res = res + b64[p1] + b64[p2] + b64[p3] + + for c, n in zip("nrcstn", [0, 6, 12, 17, 23, 29]): + res = res[:n] + c + res[n:] + return res + + +if __name__ == '__main__': + if len(sys.argv) == 3: + if (sys.argv[1])== "-f": # If true, reading from a file + in_file = (sys.argv[2]) # 2nd commandline arg is the filename to read from + input_file = open( in_file, 'r') + output_file = open ("netscreen-JtR-output.txt" , 'w') + import re + for line in input_file: + data=line.strip('\n') + if re.search(',',line): + data=data.split(',',1) # line contains , + else: + if re.search(':',line): + data=data.split(':',1) # line contains : + else: + print ("\n\n\n") + print ("Error in input file.") + print ("The input file must have either a \",\" or \":\" separator on each line.") + print ("Also it should not contain any blank lines. Please correct the input file.") + break + username = data[0] + password = data[1] + ciphertext = net(username,password) + output_file.write ("%s:%s$%s" % (username,username,ciphertext)) + output_file.write ("\n") + input_file.close() + print("\nThe output file has been created.") + output_file.close() + else: # We are not reading from a file + username = sys.argv[1] + password = sys.argv[2] + ciphertext = net(username,password) + print(("%s:%s$%s" % (username,username,ciphertext))) + else: # User did not input the required two commandline arguments + print("\n\n") + print("This program requires two commandline arguments:") + print("The first argument is a username, or -f to indicate reading from a file.") + print("The second argument is a plaintext password, or the name of the file to read from.") + print("See the additional text at the beginning of this script for more details.\n") + print("Output will be the username and the (Netscreen algorithm based) hashed password, in John the Ripper format. \n\n") + print("Example") + print("Input: netscreen.py admin netscreen") + print("Output: admin:admin$nKv3LvrdAVtOcE5EcsGIpYBtniNbUn") + print("(Netscreen uses the username as the salt)") diff --git a/john/password.lst b/john/password.lst new file mode 100644 index 0000000..3c75bf2 --- /dev/null +++ b/john/password.lst @@ -0,0 +1,3557 @@ +#!comment: This list has been compiled by Solar Designer of Openwall Project, +#!comment: http://www.openwall.com/wordlists/ +#!comment: +#!comment: This list is based on passwords most commonly seen on a set of Unix +#!comment: systems in mid-1990's, sorted for decreasing number of occurrences +#!comment: (that is, more common passwords are listed first). It has been +#!comment: revised to also include common website passwords from public lists +#!comment: of "top N passwords" from major community website compromises that +#!comment: occurred in 2006 through 2010. +#!comment: +#!comment: Last update: 2011/11/20 (3546 entries) +123456 +12345 +password +password1 +123456789 +12345678 +1234567890 +abc123 +computer +tigger +1234 +qwerty +money +carmen +mickey +secret +summer +internet +a1b2c3 +123 +service + +canada +hello +ranger +shadow +baseball +donald +harley +hockey +letmein +maggie +mike +mustang +snoopy +buster +dragon +jordan +michael +michelle +mindy +patrick +123abc +andrew +bear +calvin +changeme +diamond +fuckme +fuckyou +matthew +miller +tiger +trustno1 +alex +apple +avalon +brandy +chelsea +coffee +falcon +freedom +gandalf +green +helpme +linda +magic +merlin +newyork +soccer +thomas +wizard +asdfgh +bandit +batman +boris +butthead +dorothy +eeyore +fishing +football +george +happy +iloveyou +jennifer +jonathan +love +marina +master +missy +monday +monkey +natasha +ncc1701 +pamela +pepper +piglet +poohbear +pookie +rabbit +rachel +rocket +rose +smile +sparky +spring +steven +success +sunshine +victoria +whatever +zapata +8675309 +amanda +andy +angel +august +barney +biteme +boomer +brian +casey +cowboy +delta +doctor +fisher +island +john +joshua +karen +marley +orange +please +rascal +richard +sarah +scooter +shalom +silver +skippy +stanley +taylor +welcome +zephyr +111111 +aaaaaa +access +albert +alexander +andrea +anna +anthony +asdfjkl; +ashley +basketball +beavis +black +bob +booboo +bradley +brandon +buddy +caitlin +camaro +charlie +chicken +chris +cindy +cricket +dakota +dallas +daniel +david +debbie +dolphin +elephant +emily +friend +fucker +ginger +goodluck +hammer +heather +iceman +jason +jessica +jesus +joseph +jupiter +justin +kevin +knight +lacrosse +lakers +lizard +madison +mary +mother +muffin +murphy +nirvana +paris +pentium +phoenix +picture +rainbow +sandy +saturn +scott +shannon +shithead +skeeter +sophie +special +stephanie +stephen +steve +sweetie +teacher +tennis +test +test123 +tommy +topgun +tristan +wally +william +wilson +1q2w3e +654321 +666666 +a12345 +a1b2c3d4 +alpha +amber +angela +angie +archie +asdf +blazer +bond007 +booger +charles +christin +claire +control +danny +david1 +dennis +digital +disney +edward +elvis +felix +flipper +franklin +frodo +honda +horses +hunter +indigo +james +jasper +jeremy +julian +kelsey +killer +lauren +marie +maryjane +matrix +maverick +mayday +mercury +mitchell +morgan +mountain +niners +nothing +oliver +peace +peanut +pearljam +phantom +popcorn +princess +psycho +pumpkin +purple +randy +rebecca +reddog +robert +rocky +roses +salmon +samson +sharon +sierra +smokey +startrek +steelers +stimpy +sunflower +superman +support +sydney +techno +walter +willie +willow +winner +ziggy +zxcvbnm +alaska +alexis +alice +animal +apples +barbara +benjamin +billy +blue +bluebird +bobby +bonnie +bubba +camera +chocolate +clark +claudia +cocacola +compton +connect +cookie +cruise +douglas +dreamer +dreams +duckie +eagles +eddie +einstein +enter +explorer +faith +family +ferrari +flamingo +flower +foxtrot +francis +freddy +friday +froggy +giants +gizmo +global +goofy +happy1 +hendrix +henry +herman +homer +honey +house +houston +iguana +indiana +insane +inside +irish +ironman +jake +jasmin +jeanne +jerry +joey +justice +katherine +kermit +kitty +koala +larry +leslie +logan +lucky +mark +martin +matt +minnie +misty +mitch +mouse +nancy +nascar +nelson +pantera +parker +penguin +peter +piano +pizza +prince +punkin +pyramid +raymond +robin +roger +rosebud +route66 +royal +running +sadie +sasha +security +sheena +sheila +skiing +snapple +snowball +sparrow +spencer +spike +star +stealth +student +sunny +sylvia +tamara +taurus +teresa +theresa +thunderbird +tigers +tony +toyota +travel +tuesday +victory +viper1 +wesley +whisky +winnie +winter +wolves +xyz123 +zorro +123123 +1234567 +696969 +888888 +Anthony +Joshua +Matthew +Tigger +aaron +abby +abcdef +adidas +adrian +alfred +arthur +athena +austin +awesome +badger +bamboo +beagle +bears +beatles +beautiful +beaver +benny +bigmac +bingo +bitch +blonde +boogie +boston +brenda +bright +bubba1 +bubbles +buffy +button +buttons +cactus +candy +captain +carlos +caroline +carrie +casper +catch22 +chance +charity +charlotte +cheese +cheryl +chloe +chris1 +clancy +compaq +conrad +cooper +cooter +copper +cosmos +cougar +cracker +crawford +crystal +curtis +cyclone +dance +diablo +dollars +dookie +dumbass +dundee +elizabeth +eric +europe +farmer +firebird +fletcher +fluffy +france +freak1 +friends +fuckoff +gabriel +galaxy +gambit +garden +garfield +garnet +genesis +genius +godzilla +golfer +goober +grace +greenday +groovy +grover +guitar +hacker +harry +hazel +hector +herbert +horizon +hornet +howard +icecream +imagine +impala +jack +janice +jasmine +jason1 +jeanette +jeffrey +jenifer +jenni +jesus1 +jewels +joker +julie +julie1 +junior +justin1 +kathleen +keith +kelly +kelly1 +kennedy +kevin1 +knicks +larry1 +leonard +lestat +library +lincoln +lionking +london +louise +lucky1 +lucy +maddog +margaret +mariposa +marlboro +martin1 +marty +master1 +mensuck +mercedes +metal +midori +mikey +millie +mirage +molly +monet +money1 +monica +monopoly +mookie +moose +moroni +music +naomi +nathan +nguyen +nicholas +nicole +nimrod +october +olive +olivia +online +oscar +oxford +pacific +painter +peaches +penelope +pepsi +petunia +philip +phoenix1 +photo +pickle +player +poiuyt +porsche +porter +puppy +python +quality +raquel +raven +remember +robbie +robert1 +roman +rugby +runner +russell +ryan +sailing +sailor +samantha +savage +scarlett +school +sean +seven +shadow1 +sheba +shelby +shit +shoes +simba +simple +skipper +smiley +snake +snickers +sniper +snoopdog +snowman +sonic +spitfire +sprite +spunky +starwars +station +stella +stingray +storm +stormy +stupid +sunny1 +sunrise +surfer +susan +tammy +tango +tanya +teddy1 +theboss +theking +thumper +tina +tintin +tomcat +trebor +trevor +tweety +unicorn +valentine +valerie +vanilla +veronica +victor +vincent +viper +warrior +warriors +weasel +wheels +wilbur +winston +wisdom +wombat +xavier +yellow +zeppelin +1111 +1212 +Andrew +Family +Friends +Michael +Michelle +Snoopy +abcd1234 +abcdefg +abigail +account +adam +alex1 +alice1 +allison +alpine +andre1 +andrea1 +angel1 +anita +annette +antares +apache +apollo +aragorn +arizona +arnold +arsenal +asdfasdf +asdfg +asdfghjk +avenger +baby +babydoll +bailey +banana +barry +basket +batman1 +beaner +beast +beatrice +bella +bertha +bigben +bigdog +biggles +bigman +binky +biology +bishop +blondie +bluefish +bobcat +bosco +braves +brazil +bruce +bruno +brutus +buffalo +bulldog +bullet +bullshit +bunny +business +butch +butler +butter +california +carebear +carol +carol1 +carole +cassie +castle +catalina +catherine +cccccc +celine +center +champion +chanel +chaos +chelsea1 +chester1 +chicago +chico +christian +christy +church +cinder +colleen +colorado +columbia +commander +connie +cookies +cooking +corona +cowboys +coyote +craig +creative +cuddles +cuervo +cutie +daddy +daisy +daniel1 +danielle +davids +death +denis +derek +design +destiny +diana +diane +dickhead +digger +dodger +donna +dougie +dragonfly +dylan +eagle +eclipse +electric +emerald +etoile +excalibur +express +fender +fiona +fireman +flash +florida +flowers +foster +francesco +francine +francois +frank +french +fuckface +gemini +general +gerald +germany +gilbert +goaway +golden +goldfish +goose +gordon +graham +grant +gregory +gretchen +gunner +hannah +harold +harrison +harvey +hawkeye +heaven +heidi +helen +helena +hithere +hobbit +ibanez +idontknow +integra +ireland +irene +isaac +isabel +jackass +jackie +jackson +jaguar +jamaica +japan +jenny1 +jessie +johan +johnny +joker1 +jordan23 +judith +julia +jumanji +kangaroo +karen1 +kathy +keepout +keith1 +kenneth +kimberly +kingdom +kitkat +kramer +kristen +laura +laurie +lawrence +lawyer +legend +liberty +light +lindsay +lindsey +lisa +liverpool +lola +lonely +louis +lovely +loveme +lucas +madonna +malcolm +malibu +marathon +marcel +maria1 +mariah +mariah1 +marilyn +mario +marvin +maurice +maxine +maxwell +me +meggie +melanie +melissa +melody +mexico +michael1 +michele +midnight +mike1 +miracle +misha +mishka +molly1 +monique +montreal +moocow +moore +morris +mouse1 +mulder +nautica +nellie +newton +nick +nirvana1 +nissan +norman +notebook +ocean +olivier +ollie +oranges +oregon +orion +panda +pandora +panther +passion +patricia +pearl +peewee +pencil +penny +people +percy +person +peter1 +petey +picasso +pierre +pinkfloyd +polaris +police +pookie1 +poppy +power +predator +preston +q1w2e3 +queen +queenie +quentin +ralph +random +rangers +raptor +reality +redrum +remote +reynolds +rhonda +ricardo +ricardo1 +ricky +river +roadrunner +robinhood +rocknroll +rocky1 +ronald +roxy +ruthie +sabrina +sakura +sally +sampson +samuel +sandra +santa +sapphire +scarlet +scorpio +scott1 +scottie +scruffy +seattle +serena +shanti +shark +shogun +simon +singer +skull +skywalker +slacker +smashing +smiles +snowflake +snuffy +soccer1 +soleil +sonny +spanky +speedy +spider +spooky +stacey +star69 +start +steven1 +stinky +strawberry +stuart +sugar +sundance +superfly +suzanne +suzuki +swimmer +swimming +system +taffy +tarzan +teddy +teddybear +terry +theatre +thunder +thursday +tinker +tootsie +tornado +tracy +tricia +trident +trojan +truman +trumpet +tucker +turtle +tyler +utopia +voyager +warcraft +warlock +warren +water +wayne +wendy +williams +willy +winona +woody +woofwoof +wrangler +wright +xfiles +xxxxxx +yankees +yvonne +zebra +zenith +zigzag +zombie +zxc123 +zxcvb +000000 +007007 +11111 +11111111 +123321 +171717 +181818 +1a2b3c +1chris +4runner +54321 +55555 +6969 +7777777 +789456 +88888888 +Alexis +Bailey +Charlie +Chris +Daniel +Dragon +Elizabeth +HARLEY +Heather +Jennifer +Jessica +Jordan +KILLER +Nicholas +Password +Princess +Purple +Rebecca +Robert +Shadow +Steven +Summer +Sunshine +Superman +Taylor +Thomas +Victoria +abcd123 +abcde +accord +active +africa +airborne +alfaro +alicia +aliens +alina +aline +alison +allen +aloha +alpha1 +althea +altima +amanda1 +amazing +america +amour +anderson +andre +andrew1 +andromeda +angels +angie1 +annie +anything +apple1 +apple2 +applepie +april +aquarius +ariane +ariel +arlene +artemis +asdf1234 +asdfjkl +ashley1 +ashraf +ashton +asterix +attila +autumn +avatar +babes +bambi +barbie +barney1 +barrett +bball +beaches +beanie +beans +beauty +becca +belize +belle +belmont +benji +benson +bernardo +berry +betsy +betty +bigboss +bigred +billy1 +birdie +birthday +biscuit +bitter +blackjack +blah +blanche +blood +blowjob +blowme +blueeyes +blues +bogart +bombay +boobie +boots +bootsie +boxers +brandi +brent +brewster +bridge +bronco +bronte +brooke +brother +bryan +bubble +buddha +budgie +burton +butterfly +byron +calendar +calvin1 +camel +camille +campbell +camping +cancer +canela +cannon +carbon +carnage +carolyn +carrot +cascade +catfish +cathy +catwoman +cecile +celica +change +chantal +charger +cherry +chiara +chiefs +china +chris123 +christ1 +christmas +christopher +chuck +cindy1 +cinema +civic +claude +clueless +cobain +cobra +cody +colette +college +colors +colt45 +confused +cool +corvette +cosmo +country +crusader +cunningham +cupcake +cynthia +dagger +dammit +dancer +daphne +darkstar +darren +darryl +darwin +deborah +december +deedee +deeznuts +delano +delete +demon +denise +denny +desert +deskjet +detroit +devil +devine +devon +dexter +dianne +diesel +director +dixie +dodgers +doggy +dollar +dolly +dominique +domino +dontknow +doogie +doudou +downtown +dragon1 +driver +dude +dudley +dutchess +dwight +eagle1 +easter +eastern +edith +edmund +eight +element +elissa +ellen +elliot +empire +enigma +enterprise +erin +escort +estelle +eugene +evelyn +explore +family1 +fatboy +felipe +ferguson +ferret +ferris +fireball +fishes +fishie +flight +florida1 +flowerpot +forward +freddie +freebird +freeman +frisco +fritz +froggie +froggies +frogs +fucku +future +gabby +games +garcia +gaston +gateway +george1 +georgia +german +germany1 +getout +ghost +gibson +giselle +gmoney +goblin +goblue +gollum +grandma +gremlin +grizzly +grumpy +guess +guitar1 +gustavo +haggis +haha +hailey +halloween +hamilton +hamlet +hanna +hanson +happy123 +happyday +hardcore +harley1 +harriet +harris +harvard +health +heart +heather1 +heather2 +hedgehog +helene +hello1 +hello123 +hellohello +hermes +heythere +highland +hilda +hillary +history +hitler +hobbes +holiday +holly +honda1 +hongkong +hootie +horse +hotrod +hudson +hummer +huskies +idiot +iforget +iloveu +impact +indonesia +irina +isabelle +israel +italia +italy +jackie1 +jacob +jakey +james1 +jamesbond +jamie +jamjam +jeffrey1 +jennie +jenny +jensen +jesse +jesse1 +jester +jethro +jimbob +jimmy +joanna +joelle +john316 +jordie +jorge +josh +journey +joyce +jubilee +jules +julien +juliet +junebug +juniper +justdoit +karin +karine +karma +katerina +katie +katie1 +kayla +keeper +keller +kendall +kenny +ketchup +kings +kissme +kitten +kittycat +kkkkkk +kristi +kristine +labtec +laddie +ladybug +lance +laurel +lawson +leader +leland +lemon +lester +letter +letters +lexus1 +libra +lights +lionel +little +lizzy +lolita +lonestar +longhorn +looney +loren +lorna +loser +lovers +loveyou +lucia +lucifer +lucky14 +maddie +madmax +magic1 +magnum +maiden +maine +management +manson +manuel +marcus +maria +marielle +marine +marino +marshall +martha +maxmax +meatloaf +medical +megan +melina +memphis +mermaid +miami +michel +michigan +mickey1 +microsoft +mikael +milano +miles +millenium +million +miranda +miriam +mission +mmmmmm +mobile +monkey1 +monroe +montana +monty +moomoo +moonbeam +morpheus +motorola +movies +mozart +munchkin +murray +mustang1 +nadia +nadine +napoleon +nation +national +nestle +newlife +newyork1 +nichole +nikita +nikki +nintendo +nokia +nomore +normal +norton +noway +nugget +number9 +numbers +nurse +nutmeg +ohshit +oicu812 +omega +openup +orchid +oreo +orlando +packard +packers +paloma +pancake +panic +parola +parrot +partner +pascal +patches +patriots +paula +pauline +payton +peach +peanuts +pedro1 +peggy +perfect +perry +peterpan +philips +phillips +phone +pierce +pigeon +pink +pioneer +piper1 +pirate +pisces +playboy +pluto +poetry +pontiac +pookey +popeye +prayer +precious +prelude +premier +puddin +pulsar +pussy +pussy1 +qwert +qwerty12 +qwertyui +rabbit1 +rachelle +racoon +rambo +randy1 +ravens +redman +redskins +reggae +reggie +renee +renegade +rescue +revolution +richard1 +richards +richmond +riley +ripper +robby +roberts +rock +rocket1 +rockie +rockon +roger1 +rogers +roland +rommel +rookie +rootbeer +rosie +rufus +rusty +ruthless +sabbath +sabina +safety +saint +samiam +sammie +sammy +samsam +sandi +sanjose +saphire +sarah1 +saskia +sassy +saturday +science +scooby +scoobydoo +scooter1 +scorpion +scotty +scouts +search +september +server +seven7 +sexy +shaggy +shanny +shaolin +shasta +shayne +shelly +sherry +shirley +shorty +shotgun +sidney +simba1 +sinatra +sirius +skate +skipper1 +skyler +slayer +sleepy +slider +smile1 +smitty +smoke +snakes +snapper +snoop +solomon +sophia +space +sparks +spartan +spike1 +sponge +spurs +squash +stargate +starlight +stars +steph1 +steve1 +stevens +stewart +stone +stranger +stretch +strong +studio +stumpy +sucker +suckme +sultan +summit +sunfire +sunset +super +superstar +surfing +susan1 +sutton +sweden +sweetpea +sweety +swordfish +tabatha +tacobell +taiwan +tamtam +tanner +target +tasha +tattoo +tequila +terry1 +texas +thankyou +theend +thompson +thrasher +tiger2 +timber +timothy +tinkerbell +topcat +topher +toshiba +tototo +travis +treasure +trees +tricky +trish +triton +trombone +trouble +trucker +turbo +twins +tyler1 +ultimate +unique +united +ursula +vacation +valley +vampire +vanessa +venice +venus +vermont +vicki +vicky +victor1 +vincent1 +violet +violin +virgil +virginia +vision +volley +voodoo +vortex +waiting +wanker +warner +water1 +wayne1 +webster +weezer +wendy1 +western +white +whitney +whocares +wildcat +william1 +wilma +window +winniethepooh +wolfgang +wolverine +wonder +xxxxxxxx +yamaha +yankee +yogibear +yolanda +yomama +yvette +zachary +zebras +zxcvbn +00000000 +121212 +1234qwer +131313 +13579 +90210 +99999999 +ABC123 +action +amelie +anaconda +apollo13 +artist +asshole +benoit +bernard +bernie +bigbird +blizzard +bluesky +bonjour +caesar +cardinal +carolina +cesar +chandler +chapman +charlie1 +chevy +chiquita +chocolat +coco +cougars +courtney +dolphins +dominic +donkey +dusty +eminem +energy +fearless +forest +forever +glenn +guinness +hotdog +indian +jared +jimbo +johnson +jojo +josie +kristin +lloyd +lorraine +lynn +maxime +memory +mimi +mirror +nebraska +nemesis +network +nigel +oatmeal +patton +pedro +planet +players +portland +praise +psalms +qwaszx +raiders +rambo1 +rancid +shawn +shelley +softball +speedo +sports +ssssss +steele +steph +stephani +sunday +tiffany +tigre +toronto +trixie +undead +valentin +velvet +viking +walker +watson +young +babygirl +pretty +hottie +teamo +987654321 +naruto +spongebob +daniela +princesa +christ +blessed +single +qazwsx +pokemon +iloveyou1 +iloveyou2 +fuckyou1 +hahaha +poop +blessing +blahblah +blink182 +123qwe +trinity +passw0rd +google +looking +spirit +iloveyou! +qwerty1 +onelove +mylove +222222 +ilovegod +football1 +loving +emmanuel +1q2w3e4r +red123 +blabla +112233 +hallo +spiderman +simpsons +monster +november +brooklyn +poopoo +darkness +159753 +pineapple +chester +1qaz2wsx +drowssap +monkey12 +wordpass +q1w2e3r4 +coolness +11235813 +something +alexandra +estrella +miguel +iloveme +sayang +princess1 +555555 +999999 +alejandro +brittany +alejandra +tequiero +antonio +987654 +00000 +fernando +corazon +cristina +kisses +myspace +rebelde +babygurl +alyssa +mahalkita +gabriela +pictures +hellokitty +babygirl1 +angelica +mahalko +mariana +eduardo +andres +ronaldo +inuyasha +adriana +celtic +samsung +angelo +456789 +sebastian +karina +hotmail +0123456789 +barcelona +cameron +slipknot +cutiepie +50cent +bonita +maganda +babyboy +natalie +cuteako +javier +789456123 +123654 +bowwow +portugal +777777 +volleyball +january +cristian +bianca +chrisbrown +101010 +sweet +panget +benfica +love123 +lollipop +camila +qwertyuiop +harrypotter +ihateyou +christine +lorena +andreea +charmed +rafael +brianna +aaliyah +johncena +lovelove +gangsta +333333 +hiphop +mybaby +sergio +metallica +myspace1 +babyblue +badboy +fernanda +westlife +sasuke +steaua +roberto +slideshow +asdfghjkl +santiago +jayson +5201314 +jerome +gandako +gatita +babyko +246810 +sweetheart +chivas +alberto +valeria +nicole1 +12345678910 +leonardo +jayjay +liliana +sexygirl +232323 +amores +anthony1 +bitch1 +fatima +miamor +lover +lalala +252525 +skittles +colombia +159357 +manutd +123456a +britney +katrina +christina +pasaway +mahal +tatiana +cantik +0123456 +teiubesc +147258369 +natalia +francisco +amorcito +paola +angelito +manchester +mommy1 +147258 +amigos +marlon +linkinpark +147852 +diego +444444 +iverson +andrei +justine +frankie +pimpin +fashion +bestfriend +england +hermosa +456123 +102030 +sporting +hearts +potter +iloveu2 +number1 +212121 +truelove +jayden +savannah +hottie1 +ganda +scotland +ilovehim +shakira +estrellita +brandon1 +sweets +familia +love12 +omarion +monkeys +loverboy +elijah +ronnie +mamita +999999999 +broken +rodrigo +westside +mauricio +amigas +preciosa +shopping +flores +isabella +martinez +elaine +friendster +cheche +gracie +connor +valentina +darling +santos +joanne +fuckyou2 +pebbles +sunshine1 +gangster +gloria +darkangel +bettyboop +jessica1 +cheyenne +dustin +iubire +a123456 +purple1 +bestfriends +inlove +batista +karla +chacha +marian +sexyme +pogiako +jordan1 +010203 +daddy1 +daddysgirl +billabong +pinky +erika +skater +nenita +tigger1 +gatito +lokita +maldita +buttercup +bambam +glitter +123789 +sister +zacefron +tokiohotel +loveya +lovebug +bubblegum +marissa +cecilia +lollypop +nicolas +puppies +ariana +chubby +sexybitch +roxana +mememe +susana +baller +hotstuff +carter +babylove +angelina +playgirl +sweet16 +012345 +bhebhe +marcos +loveme1 +milagros +lilmama +beyonce +lovely1 +catdog +armando +margarita +151515 +loves +202020 +gerard +undertaker +amistad +capricorn +delfin +cheerleader +password2 +PASSWORD +lizzie +matthew1 +enrique +badgirl +141414 +dancing +cuteme +amelia +skyline +angeles +janine +carlitos +justme +legolas +michelle1 +cinderella +jesuschrist +ilovejesus +tazmania +tekiero +thebest +princesita +lucky7 +jesucristo +buddy1 +regina +myself +lipgloss +jazmin +rosita +chichi +pangit +mierda +741852963 +hernandez +arturo +silvia +melvin +celeste +pussycat +gorgeous +honeyko +mylife +babyboo +loveu +lupita +panthers +hollywood +alfredo +musica +hawaii +sparkle +kristina +sexymama +crazy +scarface +098765 +hayden +micheal +242424 +0987654321 +marisol +jeremiah +mhine +isaiah +lolipop +butterfly1 +xbox360 +madalina +anamaria +yourmom +jasmine1 +bubbles1 +beatriz +diamonds +friendship +sweetness +desiree +741852 +hannah1 +bananas +julius +leanne +marie1 +lover1 +twinkle +february +bebita +87654321 +twilight +imissyou +pollito +ashlee +cookie1 +147852369 +beckham +simone +nursing +torres +damian +123123123 +joshua1 +babyface +dinamo +mommy +juliana +cassandra +redsox +gundam +0000 +ou812 +dave +golf +molson +Monday +newpass +thx1138 +1 +Internet +coke +foobar +abc +fish +fred +help +ncc1701d +newuser +none +pat +dog +duck +duke +floyd +guest +joe +kingfish +micro +sam +telecom +test1 +7777 +absolut +babylon5 +backup +bill +bird33 +deliver +fire +flip +galileo +gopher +hansolo +jane +jim +mom +passwd +phil +phish +porsche911 +rain +red +sergei +training +truck +video +volvo +007 +1969 +5683 +Bond007 +Friday +Hendrix +October +Taurus +aaa +alexandr +catalog +challenge +clipper +coltrane +cyrano +dan +dawn +dean +deutsch +dilbert +e-mail +export +ford +fountain +fox +frog +gabriell +garlic +goforit +grateful +hoops +lady +ledzep +lee +mailman +mantra +market +mazda1 +metallic +ncc1701e +nesbitt +open +pete +quest +republic +research +supra +tara +testing +xanadu +xxxx +zaphod +zeus +0007 +1022 +10sne1 +1973 +1978 +2000 +2222 +3bears +Broadway +Fisher +Jeanne +Killer +Knight +Master +Pepper +Sierra +Tennis +abacab +abcd +ace +acropolis +amy +anders +avenir +basil +bass +beer +ben +bliss +blowfish +boss +bridges +buck +bugsy +bull +cannondale +canon +catnip +chip +civil +content +cook +cordelia +crack1 +cyber +daisie +dark1 +database +deadhead +denali +depeche +dickens +emmitt +entropy +farout +farside +feedback +fidel +firenze +fish1 +fletch +fool +fozzie +fun +gargoyle +gasman +gold +graphic +hell +image +intern +intrepid +jeff +jkl123 +joel +johanna1 +kidder +kim +king +kirk +kris +lambda +leon +logical +lorrie +major +mariner +mark1 +max +media +merlot +midway +mine +mmouse +moon +mopar +mortimer +nermal +nina +olsen +opera +overkill +pacers +packer +picard +polar +polo +primus +prometheus +public +radio +rastafarian +reptile +rob +robotech +rodeo +rolex +rouge +roy +ruby +salasana +scarecrow +scout +scuba1 +sergey +skibum +skunk +sound +starter +sting1 +sunbird +tbird +teflon +temporal +terminal +the +thejudge +time +toby +today +tokyo +tree +trout +vader +val +valhalla +windsurf +wolf +wolf1 +xcountry +yoda +yukon +1213 +1214 +1225 +1313 +1818 +1975 +1977 +1991 +1kitty +2001 +2020 +2112 +2kids +333 +4444 +5050 +57chevy +7dwarfs +Animals +Ariel +Bismillah +Booboo +Boston +Carol +Computer +Creative +Curtis +Denise +Eagles +Esther +Fishing +Freddy +Gandalf +Golden +Goober +Hacker +Harley +Henry +Hershey +Jackson +Jersey +Joanna +Johnson +Katie +Kitten +Liberty +Lindsay +Lizard +Madeline +Margaret +Maxwell +Money +Monster +Pamela +Peaches +Peter +Phoenix +Piglet +Pookie +Rabbit +Raiders +Random +Russell +Sammy +Saturn +Skeeter +Smokey +Sparky +Speedy +Sterling +Theresa +Thunder +Vincent +Willow +Winnie +Wolverine +aaaa +aardvark +abbott +acura +admin +admin1 +adrock +aerobics +agent +airwolf +ali +alien +allegro +allstate +altamira +altima1 +andrew! +ann +anne +anneli +aptiva +arrow +asdf;lkj +assmunch +baraka +barnyard +bart +bartman +beasty +beavis1 +bebe +belgium +beowulf +beryl +best +bharat +bichon +bigal +biker +bilbo +bills +bimmer +biochem +birdy +blinds +blitz +bluejean +bogey +bogus +boulder +bourbon +boxer +brain +branch +britain +broker +bucks +buffett +bugs +bulls +burns +buzz +c00per +calgary +camay +carl +cat +cement +cessna +chad +chainsaw +chameleon +chang +chess +chinook +chouette +chronos +cicero +circuit +cirque +cirrus +clapton +clarkson +class +claudel +cleo +cliff +clock +color +comet +concept +concorde +coolbean +corky +cornflake +corwin +cows +crescent +cross +crowley +cthulhu +cunt +current +cutlass +daedalus +dagger1 +daily +dale +dana +daytek +dead +decker +dharma +dillweed +dipper +disco +dixon +doitnow +doors +dork +doug +dutch +effie +ella +elsie +engage +eric1 +ernie1 +escort1 +excel +faculty +fairview +faust +fenris +finance +first +fishhead +flanders +fleurs +flute +flyboy +flyer +franka +frederic +free +front242 +frontier +fugazi +funtime +gaby +gaelic +gambler +gammaphi +garfunkel +garth +gary +gateway2 +gator1 +gibbons +gigi +gilgamesh +goat +godiva +goethe +gofish +good +gramps +gravis +gray +greed +greg +greg1 +greta +gretzky +guido +gumby +h2opolo +hamid +hank +hawkeye1 +health1 +hello8 +help123 +helper +homerj +hoosier +hope +huang +hugo +hydrogen +ib6ub9 +insight +instructor +integral +iomega +iris +izzy +jazz +jean +jeepster +jetta1 +joanie +josee +joy +julia2 +jumbo +jump +justice4 +kalamazoo +kali +kat +kate +kerala +kids +kiwi +kleenex +kombat +lamer +laser +laserjet +lassie1 +leblanc +legal +leo +life +lions +liz +logger +logos +loislane +loki +longer +lori +lost +lotus +lou +macha +macross +madoka +makeitso +mallard +marc +math +mattingly +mechanic +meister +mercer +merde +merrill +michal +michou +mickel +minou +mobydick +modem +mojo +montana3 +montrose +motor +mowgli +mulder1 +muscle +neil +neutrino +newaccount +nicklaus +nightshade +nightwing +nike +none1 +nopass +nouveau +novell +oaxaca +obiwan +obsession +orville +otter +ozzy +packrat +paint +papa +paradigm +pass +pavel +peterk +phialpha +phishy +piano1 +pianoman +pianos +pipeline +plato +play +poetic +print +printing +provider +qqq111 +quebec +qwer +racer +racerx +radar +rafiki +raleigh +rasta1 +redcloud +redfish +redwing +redwood +reed +rene +reznor +rhino +ripple +rita +robocop +robotics +roche +roni +rossignol +rugger +safety1 +saigon +satori +saturn5 +schnapps +scotch +scuba +secret3 +seeker +services +sex +shanghai +shazam +shelter +sigmachi +signal +signature +simsim +skydive +slick +smegma +smiths +smurfy +snow +sober1 +sonics +sony +spazz +sphynx +spock +spoon +spot +sprocket +starbuck +steel +stephi +sting +stocks +storage +strat +strato +stud +student2 +susanna +swanson +swim +switzer +system5 +t-bone +talon +tarheel +tata +tazdevil +tester +testtest +thisisit +thorne +tightend +tim +tom +tool +total +toucan +transfer +transit +transport +trapper +trash +trophy +tucson +turbo2 +unity +upsilon +vedder +vette +vikram +virago +visual +volcano +walden +waldo +walleye +webmaster +wedge +whale1 +whit +whoville +wibble +will +wombat1 +word +world +x-files +xxx123 +zack +zepplin +zoltan +zoomer +123go +21122112 +5555 +911 +FuckYou +Fuckyou +Gizmo +Hello +Michel +Qwerty +Windows +angus +aspen +ass +bird +booster +byteme +cats +changeit +christia +christoph +classroom +cloclo +corrado +dasha +fiction +french1 +fubar +gator +gilles +gocougs +hilbert +hola +home +judy +koko +lulu +mac +macintosh +mailer +mars +meow +ne1469 +niki +paul +politics +pomme +property +ruth +sales +salut +scrooge +skidoo +spain +surf +sylvie +symbol +forum +rotimi +god +saved +2580 +1998 +xxx +1928 +777 +info +a +netware +sun +tech +doom +mmm +one +ppp +1911 +1948 +1996 +5252 +Champs +Tuesday +bach +crow +don +draft +hal9000 +herzog +huey +jethrotull +jussi +mail +miki +nicarao +snowski +1316 +1412 +1430 +1952 +1953 +1955 +1956 +1960 +1964 +1qw23e +22 +2200 +2252 +3010 +3112 +4788 +6262 +Alpha +Bastard +Beavis +Cardinal +Celtics +Cougar +Darkman +Figaro +Fortune +Geronimo +Hammer +Homer +Janet +Mellon +Merlot +Metallic +Montreal +Newton +Paladin +Peanuts +Service +Vernon +Waterloo +Webster +aki123 +aqua +aylmer +beta +bozo +car +chat +chinacat +cora +courier +dogbert +eieio +elina1 +fly +funguy +fuzz +ggeorge +glider1 +gone +hawk +heikki +histoire +hugh +if6was9 +ingvar +jan +jedi +jimi +juhani +khan +lima +midvale +neko +nesbit +nexus6 +nisse +notta1 +pam +park +pole +pope +pyro +ram +reliant +rex +rush +seoul +skip +stan +sue +suzy +tab +testi +thelorax +tika +tnt +toto1 +tre +wind +x-men +xyz +zxc +369 +Abcdef +Asdfgh +Changeme +NCC1701 +Zxcvbnm +demo +doom2 +e +good-luck +homebrew +m1911a1 +nat +ne1410s +ne14a69 +zhongguo +sample123 +0852 +basf +OU812 +!@#$% +informix +majordomo +news +temp +trek +!@#$%^ +!@#$%^&* +Pentium +Raistlin +adi +bmw +law +m +new +opus +plus +visa +www +y +zzz +1332 +1950 +3141 +3533 +4055 +4854 +6301 +Bonzo +ChangeMe +Front242 +Gretel +Michel1 +Noriko +Sidekick +Sverige +Swoosh +Woodrow +aa +ayelet +barn +betacam +biz +boat +cuda +doc +hal +hallowell +haro +hosehead +i +ilmari +irmeli +j1l2t3 +jer +kcin +kerrya +kissa2 +leaf +lissabon +mart +matti1 +mech +morecats +paagal +performa +prof +ratio +ship +slip +stivers +tapani +targas +test2 +test3 +tula +unix +user1 +xanth +!@#$%^& +1701d +@#$%^& +Qwert +allo +dirk +go +newcourt +nite +notused +sss diff --git a/john/sap2john.pl b/john/sap2john.pl new file mode 100644 index 0000000..ecf2d3d --- /dev/null +++ b/john/sap2john.pl @@ -0,0 +1,281 @@ +#!/usr/bin/perl -w +# +# Original code believed to be "(c) x7d8 sap loverz, public domain" (as noted in +# sapB_fmt_plug.c). Also Copyright (c) 2011, 2012 magnum, and hereby released to +# the general public under the following terms: Redistribution and use in +# source and binary forms, with or without modification, are permitted. +# +# This perl script converts password hashes downloaded from SAP systems +# into a format suitable for John the Ripper (written to stdout). +# +# Usage: ./sap2john.pl [A|B|D|E|F|H] +# +# To read from stdin instead, use: ./sap2john.pl - [A|B|D|E|F|H] +# +# If you omit the optional parameter, the script generates output +# for all codvn F and codvn H hashes, as well as for all the +# CODVN B hashes (including hashes where the script assumes CODVN B +# because the CODVN column is missing or empty). +# That means, the default implementation will mix up to 3 different +# hash formats into the output file, but since these formats +# are not ambiguous, that is not a problem. +# CODVN A, D, and E hashes will be skipped, because these hashes +# are currently not supported, and because these hashes would +# be considered as valid CODVN B hashes by the current sapB_fmt_plug.c. +# (And, by the way, CODVN A and CODVN D are obsolete.) +# +# By specifying the optional parameter, you can decide which +# SAP hash format will be written to stdout instead of the default +# hash formats. +# +# To generate a suitable input file for this script, download +# the SAP hashes from one of the database tables USR02, USH02, +# or USRPWDHISTORY. +# Download the data as a spreadsheet using SAP transaction code SE16. +# Make sure to check the user settings: pick field names instead of +# field descriptions as column headings. +# If the SAP user names (which work as salts for CODVN A, B, D, E, F) +# contain non-ascii characters, please download the data using a +# single byte code page if you want to crack CODVN A or CODVN B hashes. +# Download the data using utf-8 (SAP code page 4110), if you want +# to crack CODVN F, CODVN E, or CODVN D hashes (or if you want to crack +# CODVN H hashes. (For CODVN H, the user name ist't used as a salt +# anymore.) +# +# CODVN G just means, the system computes and stores CODVN B and +# CODVN F hashes. +# (In this case, the script will create two lines of output.) +# CODVN I means, the system computes and stores CODVN B, CODVN F, and +# CODVN H hashes. +# (In this case, the script will create three lines of output.) +# +# If CODVN is empty (or the column is missing), but BCODE is filled, +# the script assumes that the corresponding hash is a CODVN B hash, +# but for very old USH02 records (created before around 1996) +# probably CODVN was in use. +# +# Please note that currently John the Ripper (jumbo) only supports +# SAP CODVN B (--format=sapb) and CODVN F (--format=sapg) hashes. +# +# FIXME: should the script generate different lines of output +# for the current password (e.g. uid=0, gid=$mandt[$i]) +# and for older passwords (ocod1-ocod5, or USH02 +# (column MODDA or MODTI exists) or USRPWDHISTORY +# (column TIMESTAMP exists) +# +sub fill_field +{ + if ($_[0] == -1 || $_[0] > $#tmp) { + $_[1] = ""; + } + else { + $_[1] = $tmp[$_[0]]; + $_[1] =~ s/\s*$//; + } +} + +sub write_pwdsaltedhash +{ + if ($hashtypes =~ /H/ && $pwdsaltedhash[$i] ne "") { + print "$bname[$i]:$pwdsaltedhash[$i]\n"; + } +} + +sub write_passcode +{ +# FIXME: prefix hash with "sapF$", to avoid ambiguity with other hash formats? + if ($hashtypes =~ /F/ && $passcode[$i] ne "0000000000000000000000000000000000000000") { + print "$bname[$i]:$bname[$i]\$$passcode[$i]\n"; + } +} + +sub write_bcode +{ +# FIXME: prefix CODVN A/D/E(/B) hashes with "sap$"? + $vn = $_[1]; + $bc = $_[0]; + if ($vn eq "" || $vn eq "G" or $vn eq "I") { $vn = "B" } + if ($hashtypes =~ /$vn/) { + if ($bc ne "" && $bc ne "0000000000000000") { + print "$bname[$i]:$bname[$i]\$$bc\n"; + } + } +} +if ($#ARGV < 0 || $#ARGV > 1) { + die "Usage: $0 [A|B|D|E|F|H]\n"; +} + +open INPUT_FILE, "$ARGV[0]" or die "Can't open input-file ($ARGV[0])\n"; + +if ($#ARGV == 1) { + $hashtypes = $ARGV[1]; + if ($hashtypes =~ /^[^ABDEFH]$/) { + die "invalid optional parameter: \"$hashtypes\"\n"; + } +} +else { + $hashtypes = ""; +} + +$line = ""; +$count = 0; + +# USR01, USH02, USRPWDHISTORY +#$pos_mandt = -1; +$pos_bname = -1; +$pos_bcode = -1; +$pos_passcode = -1; +$pos_pwdsaltedhash = -1; + +# USR02 +$pos_codvn = -1; +$pos_ocod1 = -1; +$pos_codv1 = -1; +$pos_ocod2 = -1; +$pos_codv2 = -1; +$pos_ocod3 = -1; +$pos_codv3 = -1; +$pos_ocod4 = -1; +$pos_codv4 = -1; +$pos_ocod5 = -1; +$pos_codv5 = -1; + +# USH02 +#$pos_modda = -1; +#$pos_modti = -1; + +# USRPWDHISTORY +#$pos_timestamp = -1; + +until ($line =~ /\t/) { + $line=; + $count++; +} + +chomp($line); +$line =~ s/\r//; + +# column names can be either left-justified or right-justified, +# so let's remove spaces as well: +@tmp = split(/\s*\t\s*/, $line); + +$columns = $#tmp; + +for($i = 0; $i <= $columns; $i++) { + if ($tmp[$i] =~ /BNAME/) { $pos_bname = $i } +# elsif ($tmp[$i] =~ /MANDT/) { $pos_mandt = $i } + elsif ($tmp[$i] =~ /BCODE/) { $pos_bcode = $i } + elsif ($tmp[$i] =~ /CODVN/) { $pos_codvn = $i } + elsif ($tmp[$i] =~ /PASSCODE/) { $pos_passcode = $i } + elsif ($tmp[$i] =~ /PWDSALTEDHASH/) { $pos_pwdsaltedhash = $i } + elsif ($tmp[$i] =~ /OCOD1/) { $pos_ocod1 = $i } + elsif ($tmp[$i] =~ /CODV1/) { $pos_codv1 = $i } + elsif ($tmp[$i] =~ /OCOD2/) { $pos_ocod2 = $i } + elsif ($tmp[$i] =~ /CODV2/) { $pos_codv2 = $i } + elsif ($tmp[$i] =~ /OCOD3/) { $pos_ocod3 = $i } + elsif ($tmp[$i] =~ /CODV3/) { $pos_codv3 = $i } + elsif ($tmp[$i] =~ /OCOD4/) { $pos_ocod4 = $i } + elsif ($tmp[$i] =~ /CODV4/) { $pos_codv4 = $i } + elsif ($tmp[$i] =~ /OCOD5/) { $pos_ocod5 = $i } + elsif ($tmp[$i] =~ /CODV5/) { $pos_codv5 = $i } +# elsif ($tmp[$i] =~ /MODDA/) { $pos_modda = $i } +# elsif ($tmp[$i] =~ /MODTI/) { $pos_modti = $i } +# elsif ($tmp[$i] =~ /TIMESTAMP/) { $pos_timestamp = $i } +} + +if (-1 == $pos_bcode && + -1 == $pos_ocod1 && -1 == $pos_ocod2 && -1 == $pos_ocod3 && + -1 == $pos_ocod4 && -1 == $pos_ocod5) { + if (-1 == $pos_passcode && -1 == $pos_pwdsaltedhash) { + die "no password hash columns found\n"; + } + elsif ($hashtypes eq "B" || $hashtypes eq "E" || + $hashtypes eq "D" || $hashtypes eq "A") { + die "CODVN B, E, D, or A requested, but column BCODE/OCODV[1-5] not found\n"; + } +} + +if (-1 == $pos_bname && -1 == $pos_pwdsaltedhash) { + die "no BNAME column found, but required as salt for BCOCE and PASSCODE\n"; +} + +if (-1 == $pos_passcode && $hashtypes =~ /F/) { + die "CODVN F requested, but column PASSCODE not found\n"; +} + +if (-1 == $pos_pwdsaltedhash && $hashtypes =~ /H/) { + die "CODVN H requested, but column PWDSALTEDHASH not found\n"; +} + +if ($hashtypes eq "") { +# FIXME: Should I use ABDEFH as a default, and prefix +# the hashes with sapA$, sapD$, sapD$ for codvn A/D/E? +# OTOH, if user names contain non-ascii characters, +# the JtR user might want to split formats requiring utf-8 input +# and formats requiring iso-8859* input into different files +# anyway. + $hashtypes = "BFH"; +} +if (-1 == $pos_bname) { $hashtypes =~ s/[ABDEF]//g } +if (-1 == $pos_pwdsaltedhash) { $hashtypes =~ s/H// } + +if ($hashtypes eq "") { + die "not all required columns for requested hash types found\n"; +} + +$rows = -1; +while ($line = ) { + $count++; + chomp($line); + $line =~ s/\r//; + + @tmp = split(/\t/, $line); + if ($#tmp >= 0) { + $rows++; +# fill_field( $pos_mandt, $mandt[$rows]); + fill_field( $pos_bname, $bname[$rows]); + fill_field( $pos_codvn, $codvn[$rows]); + fill_field( $pos_bcode, $bcode[$rows]); + fill_field( $pos_passcode, $passcode[$rows]); + fill_field( $pos_pwdsaltedhash, $pwdsaltedhash[$rows]); + fill_field( $pos_ocod1, $ocod1[$rows]); + fill_field( $pos_codv1, $codv1[$rows]); + fill_field( $pos_ocod2, $ocod2[$rows]); + fill_field( $pos_codv2, $codv2[$rows]); + fill_field( $pos_ocod3, $ocod3[$rows]); + fill_field( $pos_codv3, $codv3[$rows]); + fill_field( $pos_ocod4, $ocod4[$rows]); + fill_field( $pos_codv4, $codv4[$rows]); + fill_field( $pos_ocod5, $ocod5[$rows]); + fill_field( $pos_codv5, $codv5[$rows]); +# fill_field( $pos_modda, $modda[$rows]); +# fill_field( $pos_modti, $modti[$rows]); +# fill_field( $pos_timestamp, $timestamp[$rows]); + } +} + +# Should the script count the number of valid hashes found/written to stdout, +# to write summary information to stderr? +# +#$codvn_a = 0; +#$codvn_b = 0; +#$codvn_d = 0; +#$codvn_e = 0; +#$codvn_f = 0; +#$codvn_h = 0; + +for ($i=0; $i<=$rows; $i++) { +# write BCODE first, so that hopefully codvn B (the easiest to crack +# hash algorithm) will be detected first... + write_bcode( $bcode[$i], $codvn[$i] ); + write_bcode( $ocod1[$i], $codv1[$i] ); + write_bcode( $ocod2[$i], $codv2[$i] ); + write_bcode( $ocod3[$i], $codv3[$i] ); + write_bcode( $ocod4[$i], $codv4[$i] ); + write_bcode( $ocod5[$i], $codv5[$i] ); + + write_passcode( ); +# even if this format is currently not supported by JtR, +# it might be in future: + write_pwdsaltedhash( ); +} diff --git a/john/stats b/john/stats new file mode 100644 index 0000000..170627e --- /dev/null +++ b/john/stats @@ -0,0 +1,4986 @@ +97=proba1[32] +51=proba2[32*256+35] +44=proba2[32*256+38] +51=proba2[32*256+39] +40=proba2[32*256+48] +35=proba2[32*256+49] +37=proba2[32*256+50] +51=proba2[32*256+51] +44=proba2[32*256+52] +44=proba2[32*256+53] +33=proba2[32*256+54] +44=proba2[32*256+55] +44=proba2[32*256+56] +44=proba2[32*256+57] +44=proba2[32*256+66] +44=proba2[32*256+67] +51=proba2[32*256+68] +44=proba2[32*256+69] +40=proba2[32*256+71] +51=proba2[32*256+73] +44=proba2[32*256+77] +44=proba2[32*256+78] +40=proba2[32*256+80] +51=proba2[32*256+82] +44=proba2[32*256+84] +51=proba2[32*256+86] +51=proba2[32*256+87] +33=proba2[32*256+97] +33=proba2[32*256+98] +25=proba2[32*256+99] +32=proba2[32*256+100] +37=proba2[32*256+101] +44=proba2[32*256+102] +37=proba2[32*256+103] +37=proba2[32*256+104] +40=proba2[32*256+105] +40=proba2[32*256+106] +51=proba2[32*256+107] +32=proba2[32*256+108] +24=proba2[32*256+109] +37=proba2[32*256+110] +37=proba2[32*256+111] +27=proba2[32*256+112] +51=proba2[32*256+113] +35=proba2[32*256+114] +32=proba2[32*256+115] +33=proba2[32*256+116] +40=proba2[32*256+117] +51=proba2[32*256+118] +44=proba2[32*256+121] +51=proba2[32*256+122] +80=proba1[33] +15=proba2[33*256+33] +51=proba2[33*256+34] +51=proba2[33*256+35] +51=proba2[33*256+40] +51=proba2[33*256+41] +51=proba2[33*256+42] +51=proba2[33*256+43] +51=proba2[33*256+48] +31=proba2[33*256+49] +37=proba2[33*256+50] +37=proba2[33*256+51] +51=proba2[33*256+52] +51=proba2[33*256+54] +35=proba2[33*256+55] +51=proba2[33*256+56] +44=proba2[33*256+57] +51=proba2[33*256+59] +51=proba2[33*256+61] +37=proba2[33*256+63] +51=proba2[33*256+64] +40=proba2[33*256+70] +51=proba2[33*256+71] +51=proba2[33*256+76] +37=proba2[33*256+78] +51=proba2[33*256+80] +51=proba2[33*256+83] +51=proba2[33*256+84] +51=proba2[33*256+87] +51=proba2[33*256+95] +40=proba2[33*256+97] +37=proba2[33*256+98] +37=proba2[33*256+99] +44=proba2[33*256+100] +37=proba2[33*256+101] +40=proba2[33*256+102] +40=proba2[33*256+103] +44=proba2[33*256+105] +44=proba2[33*256+106] +51=proba2[33*256+107] +33=proba2[33*256+108] +37=proba2[33*256+109] +35=proba2[33*256+110] +35=proba2[33*256+111] +37=proba2[33*256+112] +51=proba2[33*256+113] +31=proba2[33*256+114] +31=proba2[33*256+115] +31=proba2[33*256+116] +51=proba2[33*256+119] +51=proba2[33*256+120] +51=proba2[33*256+121] +44=proba2[33*256+122] +118=proba1[34] +17=proba2[34*256+38] +23=proba2[34*256+39] +23=proba2[34*256+40] +23=proba2[34*256+48] +23=proba2[34*256+54] +23=proba2[34*256+97] +23=proba2[34*256+99] +23=proba2[34*256+100] +23=proba2[34*256+101] +23=proba2[34*256+119] +86=proba1[35] +42=proba2[35*256+33] +26=proba2[35*256+35] +42=proba2[35*256+36] +35=proba2[35*256+38] +42=proba2[35*256+48] +24=proba2[35*256+49] +35=proba2[35*256+50] +26=proba2[35*256+51] +42=proba2[35*256+52] +42=proba2[35*256+53] +35=proba2[35*256+54] +35=proba2[35*256+55] +24=proba2[35*256+57] +42=proba2[35*256+63] +35=proba2[35*256+65] +42=proba2[35*256+83] +42=proba2[35*256+87] +28=proba2[35*256+97] +35=proba2[35*256+98] +42=proba2[35*256+99] +42=proba2[35*256+100] +42=proba2[35*256+102] +35=proba2[35*256+105] +35=proba2[35*256+106] +31=proba2[35*256+109] +31=proba2[35*256+110] +42=proba2[35*256+111] +42=proba2[35*256+112] +31=proba2[35*256+114] +42=proba2[35*256+115] +42=proba2[35*256+116] +42=proba2[35*256+118] +42=proba2[35*256+119] +42=proba2[35*256+121] +42=proba2[35*256+123] +82=proba1[36] +45=proba2[36*256+33] +45=proba2[36*256+35] +26=proba2[36*256+36] +45=proba2[36*256+37] +45=proba2[36*256+41] +34=proba2[36*256+42] +45=proba2[36*256+43] +39=proba2[36*256+48] +39=proba2[36*256+49] +34=proba2[36*256+50] +39=proba2[36*256+54] +45=proba2[36*256+55] +34=proba2[36*256+56] +34=proba2[36*256+57] +45=proba2[36*256+61] +45=proba2[36*256+65] +45=proba2[36*256+66] +45=proba2[36*256+67] +45=proba2[36*256+69] +45=proba2[36*256+84] +45=proba2[36*256+90] +45=proba2[36*256+94] +34=proba2[36*256+97] +39=proba2[36*256+98] +45=proba2[36*256+99] +32=proba2[36*256+100] +34=proba2[36*256+101] +32=proba2[36*256+102] +39=proba2[36*256+103] +39=proba2[36*256+104] +39=proba2[36*256+106] +39=proba2[36*256+107] +32=proba2[36*256+108] +29=proba2[36*256+109] +39=proba2[36*256+110] +45=proba2[36*256+111] +29=proba2[36*256+112] +45=proba2[36*256+114] +32=proba2[36*256+115] +29=proba2[36*256+116] +45=proba2[36*256+117] +39=proba2[36*256+118] +45=proba2[36*256+119] +45=proba2[36*256+120] +45=proba2[36*256+121] +39=proba2[36*256+122] +97=proba1[37] +32=proba2[37*256+35] +25=proba2[37*256+36] +32=proba2[37*256+38] +32=proba2[37*256+42] +32=proba2[37*256+43] +32=proba2[37*256+44] +32=proba2[37*256+49] +32=proba2[37*256+52] +32=proba2[37*256+71] +32=proba2[37*256+78] +18=proba2[37*256+97] +32=proba2[37*256+98] +32=proba2[37*256+99] +32=proba2[37*256+100] +32=proba2[37*256+109] +32=proba2[37*256+112] +18=proba2[37*256+115] +32=proba2[37*256+117] +86=proba1[38] +47=proba2[38*256+32] +47=proba2[38*256+34] +33=proba2[38*256+38] +40=proba2[38*256+39] +47=proba2[38*256+40] +40=proba2[38*256+43] +47=proba2[38*256+44] +40=proba2[38*256+45] +36=proba2[38*256+49] +47=proba2[38*256+50] +47=proba2[38*256+51] +47=proba2[38*256+52] +47=proba2[38*256+54] +40=proba2[38*256+55] +40=proba2[38*256+57] +47=proba2[38*256+66] +47=proba2[38*256+67] +47=proba2[38*256+69] +40=proba2[38*256+70] +47=proba2[38*256+71] +36=proba2[38*256+74] +47=proba2[38*256+77] +40=proba2[38*256+83] +40=proba2[38*256+87] +47=proba2[38*256+89] +29=proba2[38*256+97] +36=proba2[38*256+98] +22=proba2[38*256+99] +36=proba2[38*256+100] +31=proba2[38*256+101] +40=proba2[38*256+102] +36=proba2[38*256+103] +47=proba2[38*256+105] +40=proba2[38*256+106] +40=proba2[38*256+107] +29=proba2[38*256+108] +29=proba2[38*256+109] +36=proba2[38*256+110] +33=proba2[38*256+111] +36=proba2[38*256+112] +31=proba2[38*256+114] +36=proba2[38*256+115] +47=proba2[38*256+116] +47=proba2[38*256+117] +40=proba2[38*256+118] +40=proba2[38*256+119] +47=proba2[38*256+121] +47=proba2[38*256+122] +47=proba2[38*256+123] +118=proba1[39] +30=proba2[39*256+38] +30=proba2[39*256+39] +37=proba2[39*256+40] +37=proba2[39*256+44] +37=proba2[39*256+51] +37=proba2[39*256+52] +37=proba2[39*256+57] +30=proba2[39*256+83] +37=proba2[39*256+95] +18=proba2[39*256+97] +30=proba2[39*256+98] +26=proba2[39*256+99] +23=proba2[39*256+101] +37=proba2[39*256+103] +30=proba2[39*256+111] +26=proba2[39*256+114] +17=proba2[39*256+115] +37=proba2[39*256+119] +37=proba2[39*256+122] +91=proba1[40] +36=proba2[40*256+36] +36=proba2[40*256+37] +36=proba2[40*256+40] +25=proba2[40*256+41] +29=proba2[40*256+42] +22=proba2[40*256+45] +36=proba2[40*256+49] +36=proba2[40*256+54] +36=proba2[40*256+69] +36=proba2[40*256+94] +29=proba2[40*256+95] +29=proba2[40*256+97] +36=proba2[40*256+99] +36=proba2[40*256+100] +29=proba2[40*256+103] +29=proba2[40*256+105] +29=proba2[40*256+110] +36=proba2[40*256+112] +36=proba2[40*256+114] +29=proba2[40*256+115] +29=proba2[40*256+116] +36=proba2[40*256+118] +36=proba2[40*256+121] +36=proba2[40*256+124] +118=proba1[41] +13=proba2[41*256+40] +27=proba2[41*256+41] +27=proba2[41*256+54] +27=proba2[41*256+61] +27=proba2[41*256+103] +27=proba2[41*256+107] +27=proba2[41*256+108] +20=proba2[41*256+111] +20=proba2[41*256+112] +27=proba2[41*256+114] +78=proba1[42] +44=proba2[42*256+36] +44=proba2[42*256+38] +51=proba2[42*256+40] +51=proba2[42*256+41] +15=proba2[42*256+42] +51=proba2[42*256+44] +44=proba2[42*256+45] +44=proba2[42*256+46] +44=proba2[42*256+48] +33=proba2[42*256+49] +40=proba2[42*256+50] +34=proba2[42*256+51] +40=proba2[42*256+52] +37=proba2[42*256+54] +37=proba2[42*256+55] +51=proba2[42*256+56] +34=proba2[42*256+57] +51=proba2[42*256+59] +51=proba2[42*256+61] +51=proba2[42*256+63] +51=proba2[42*256+64] +51=proba2[42*256+65] +44=proba2[42*256+66] +51=proba2[42*256+67] +44=proba2[42*256+68] +51=proba2[42*256+69] +51=proba2[42*256+73] +51=proba2[42*256+77] +51=proba2[42*256+78] +51=proba2[42*256+80] +51=proba2[42*256+82] +51=proba2[42*256+95] +28=proba2[42*256+97] +40=proba2[42*256+98] +31=proba2[42*256+99] +40=proba2[42*256+100] +51=proba2[42*256+101] +51=proba2[42*256+102] +37=proba2[42*256+103] +37=proba2[42*256+105] +44=proba2[42*256+106] +37=proba2[42*256+108] +33=proba2[42*256+109] +44=proba2[42*256+110] +51=proba2[42*256+111] +37=proba2[42*256+112] +44=proba2[42*256+113] +51=proba2[42*256+114] +33=proba2[42*256+115] +51=proba2[42*256+116] +51=proba2[42*256+117] +37=proba2[42*256+118] +51=proba2[42*256+119] +51=proba2[42*256+120] +51=proba2[42*256+122] +96=proba1[43] +38=proba2[43*256+38] +19=proba2[43*256+43] +31=proba2[43*256+45] +29=proba2[43*256+49] +38=proba2[43*256+50] +45=proba2[43*256+51] +45=proba2[43*256+52] +31=proba2[43*256+53] +29=proba2[43*256+54] +34=proba2[43*256+55] +38=proba2[43*256+61] +45=proba2[43*256+66] +38=proba2[43*256+67] +45=proba2[43*256+72] +38=proba2[43*256+74] +38=proba2[43*256+75] +45=proba2[43*256+76] +45=proba2[43*256+80] +45=proba2[43*256+85] +45=proba2[43*256+89] +38=proba2[43*256+97] +29=proba2[43*256+98] +38=proba2[43*256+99] +45=proba2[43*256+101] +38=proba2[43*256+102] +45=proba2[43*256+103] +45=proba2[43*256+104] +45=proba2[43*256+105] +45=proba2[43*256+106] +45=proba2[43*256+107] +29=proba2[43*256+108] +38=proba2[43*256+109] +45=proba2[43*256+110] +38=proba2[43*256+111] +45=proba2[43*256+112] +38=proba2[43*256+113] +45=proba2[43*256+115] +31=proba2[43*256+116] +38=proba2[43*256+119] +38=proba2[43*256+120] +96=proba1[44] +24=proba2[44*256+44] +28=proba2[44*256+46] +44=proba2[44*256+48] +28=proba2[44*256+49] +33=proba2[44*256+50] +37=proba2[44*256+51] +33=proba2[44*256+55] +33=proba2[44*256+56] +37=proba2[44*256+57] +28=proba2[44*256+59] +37=proba2[44*256+65] +44=proba2[44*256+66] +44=proba2[44*256+73] +44=proba2[44*256+83] +44=proba2[44*256+84] +44=proba2[44*256+86] +37=proba2[44*256+97] +44=proba2[44*256+98] +37=proba2[44*256+99] +33=proba2[44*256+100] +37=proba2[44*256+102] +44=proba2[44*256+103] +44=proba2[44*256+105] +37=proba2[44*256+106] +44=proba2[44*256+107] +23=proba2[44*256+109] +37=proba2[44*256+110] +30=proba2[44*256+112] +37=proba2[44*256+115] +26=proba2[44*256+116] +37=proba2[44*256+118] +44=proba2[44*256+121] +44=proba2[44*256+122] +91=proba1[45] +57=proba2[45*256+34] +57=proba2[45*256+36] +43=proba2[45*256+38] +57=proba2[45*256+39] +57=proba2[45*256+40] +43=proba2[45*256+43] +27=proba2[45*256+45] +33=proba2[45*256+48] +23=proba2[45*256+49] +32=proba2[45*256+50] +43=proba2[45*256+51] +43=proba2[45*256+52] +46=proba2[45*256+53] +33=proba2[45*256+54] +36=proba2[45*256+55] +36=proba2[45*256+56] +30=proba2[45*256+57] +57=proba2[45*256+63] +57=proba2[45*256+65] +50=proba2[45*256+66] +50=proba2[45*256+67] +50=proba2[45*256+68] +57=proba2[45*256+69] +50=proba2[45*256+70] +50=proba2[45*256+71] +57=proba2[45*256+73] +57=proba2[45*256+74] +57=proba2[45*256+75] +50=proba2[45*256+76] +57=proba2[45*256+77] +57=proba2[45*256+78] +57=proba2[45*256+80] +50=proba2[45*256+84] +57=proba2[45*256+87] +46=proba2[45*256+88] +57=proba2[45*256+97] +39=proba2[45*256+98] +33=proba2[45*256+99] +41=proba2[45*256+100] +50=proba2[45*256+101] +35=proba2[45*256+102] +36=proba2[45*256+103] +41=proba2[45*256+104] +39=proba2[45*256+105] +36=proba2[45*256+106] +50=proba2[45*256+107] +30=proba2[45*256+108] +35=proba2[45*256+109] +37=proba2[45*256+110] +43=proba2[45*256+111] +39=proba2[45*256+112] +35=proba2[45*256+114] +36=proba2[45*256+115] +32=proba2[45*256+116] +57=proba2[45*256+117] +46=proba2[45*256+118] +41=proba2[45*256+119] +50=proba2[45*256+120] +57=proba2[45*256+121] +57=proba2[45*256+122] +93=proba1[46] +54=proba2[46*256+32] +54=proba2[46*256+35] +54=proba2[46*256+43] +41=proba2[46*256+44] +23=proba2[46*256+46] +24=proba2[46*256+48] +27=proba2[46*256+49] +32=proba2[46*256+50] +34=proba2[46*256+51] +41=proba2[46*256+52] +35=proba2[46*256+53] +41=proba2[46*256+54] +36=proba2[46*256+55] +29=proba2[46*256+56] +38=proba2[46*256+57] +43=proba2[46*256+65] +47=proba2[46*256+70] +54=proba2[46*256+71] +47=proba2[46*256+73] +54=proba2[46*256+74] +47=proba2[46*256+78] +54=proba2[46*256+79] +54=proba2[46*256+83] +41=proba2[46*256+84] +54=proba2[46*256+85] +54=proba2[46*256+87] +38=proba2[46*256+97] +35=proba2[46*256+98] +36=proba2[46*256+99] +35=proba2[46*256+100] +41=proba2[46*256+101] +38=proba2[46*256+102] +43=proba2[46*256+103] +41=proba2[46*256+104] +54=proba2[46*256+105] +38=proba2[46*256+106] +54=proba2[46*256+107] +34=proba2[46*256+108] +38=proba2[46*256+109] +34=proba2[46*256+110] +47=proba2[46*256+111] +47=proba2[46*256+112] +54=proba2[46*256+113] +54=proba2[46*256+114] +30=proba2[46*256+115] +38=proba2[46*256+117] +47=proba2[46*256+118] +43=proba2[46*256+119] +47=proba2[46*256+120] +54=proba2[46*256+121] +47=proba2[46*256+122] +46=proba1[48] +94=proba2[48*256+32] +83=proba2[48*256+33] +94=proba2[48*256+35] +78=proba2[48*256+36] +87=proba2[48*256+37] +87=proba2[48*256+41] +94=proba2[48*256+42] +83=proba2[48*256+43] +76=proba2[48*256+45] +73=proba2[48*256+46] +14=proba2[48*256+48] +20=proba2[48*256+49] +26=proba2[48*256+50] +27=proba2[48*256+51] +27=proba2[48*256+52] +27=proba2[48*256+53] +27=proba2[48*256+54] +22=proba2[48*256+55] +27=proba2[48*256+56] +29=proba2[48*256+57] +87=proba2[48*256+59] +94=proba2[48*256+60] +94=proba2[48*256+64] +75=proba2[48*256+65] +78=proba2[48*256+66] +87=proba2[48*256+67] +94=proba2[48*256+69] +83=proba2[48*256+70] +87=proba2[48*256+71] +87=proba2[48*256+72] +87=proba2[48*256+73] +94=proba2[48*256+74] +80=proba2[48*256+75] +80=proba2[48*256+76] +72=proba2[48*256+77] +83=proba2[48*256+78] +94=proba2[48*256+79] +94=proba2[48*256+80] +83=proba2[48*256+82] +76=proba2[48*256+83] +87=proba2[48*256+84] +83=proba2[48*256+86] +94=proba2[48*256+88] +80=proba2[48*256+90] +94=proba2[48*256+95] +53=proba2[48*256+97] +56=proba2[48*256+98] +52=proba2[48*256+99] +56=proba2[48*256+100] +60=proba2[48*256+101] +59=proba2[48*256+102] +63=proba2[48*256+103] +67=proba2[48*256+104] +69=proba2[48*256+105] +63=proba2[48*256+106] +63=proba2[48*256+107] +54=proba2[48*256+108] +51=proba2[48*256+109] +55=proba2[48*256+110] +62=proba2[48*256+111] +58=proba2[48*256+112] +78=proba2[48*256+113] +56=proba2[48*256+114] +54=proba2[48*256+115] +56=proba2[48*256+116] +60=proba2[48*256+117] +64=proba2[48*256+118] +65=proba2[48*256+119] +65=proba2[48*256+120] +72=proba2[48*256+121] +66=proba2[48*256+122] +38=proba1[49] +75=proba2[49*256+33] +95=proba2[49*256+35] +88=proba2[49*256+36] +84=proba2[49*256+38] +95=proba2[49*256+41] +75=proba2[49*256+42] +82=proba2[49*256+43] +79=proba2[49*256+44] +73=proba2[49*256+45] +69=proba2[49*256+46] +21=proba2[49*256+48] +21=proba2[49*256+49] +17=proba2[49*256+50] +26=proba2[49*256+51] +28=proba2[49*256+52] +28=proba2[49*256+53] +30=proba2[49*256+54] +27=proba2[49*256+55] +29=proba2[49*256+56] +20=proba2[49*256+57] +88=proba2[49*256+59] +84=proba2[49*256+61] +84=proba2[49*256+64] +67=proba2[49*256+65] +76=proba2[49*256+66] +76=proba2[49*256+67] +76=proba2[49*256+68] +82=proba2[49*256+69] +84=proba2[49*256+70] +79=proba2[49*256+71] +88=proba2[49*256+72] +84=proba2[49*256+73] +88=proba2[49*256+74] +82=proba2[49*256+75] +75=proba2[49*256+76] +72=proba2[49*256+77] +76=proba2[49*256+78] +79=proba2[49*256+79] +82=proba2[49*256+80] +82=proba2[49*256+82] +79=proba2[49*256+83] +75=proba2[49*256+84] +95=proba2[49*256+85] +88=proba2[49*256+86] +88=proba2[49*256+87] +95=proba2[49*256+88] +95=proba2[49*256+89] +84=proba2[49*256+90] +46=proba2[49*256+97] +50=proba2[49*256+98] +52=proba2[49*256+99] +54=proba2[49*256+100] +54=proba2[49*256+101] +58=proba2[49*256+102] +56=proba2[49*256+103] +64=proba2[49*256+104] +59=proba2[49*256+105] +56=proba2[49*256+106] +63=proba2[49*256+107] +55=proba2[49*256+108] +51=proba2[49*256+109] +53=proba2[49*256+110] +59=proba2[49*256+111] +56=proba2[49*256+112] +63=proba2[49*256+113] +56=proba2[49*256+114] +51=proba2[49*256+115] +54=proba2[49*256+116] +67=proba2[49*256+117] +60=proba2[49*256+118] +63=proba2[49*256+119] +65=proba2[49*256+120] +70=proba2[49*256+121] +69=proba2[49*256+122] +42=proba1[50] +82=proba2[50*256+32] +69=proba2[50*256+33] +82=proba2[50*256+35] +86=proba2[50*256+36] +86=proba2[50*256+37] +86=proba2[50*256+39] +71=proba2[50*256+42] +82=proba2[50*256+43] +93=proba2[50*256+44] +71=proba2[50*256+45] +65=proba2[50*256+46] +20=proba2[50*256+48] +22=proba2[50*256+49] +23=proba2[50*256+50] +18=proba2[50*256+51] +26=proba2[50*256+52] +25=proba2[50*256+53] +28=proba2[50*256+54] +26=proba2[50*256+55] +28=proba2[50*256+56] +30=proba2[50*256+57] +86=proba2[50*256+59] +86=proba2[50*256+61] +86=proba2[50*256+63] +82=proba2[50*256+64] +69=proba2[50*256+65] +69=proba2[50*256+66] +65=proba2[50*256+67] +77=proba2[50*256+68] +86=proba2[50*256+69] +79=proba2[50*256+70] +73=proba2[50*256+71] +75=proba2[50*256+72] +86=proba2[50*256+73] +82=proba2[50*256+74] +79=proba2[50*256+75] +82=proba2[50*256+76] +72=proba2[50*256+77] +71=proba2[50*256+78] +93=proba2[50*256+79] +75=proba2[50*256+80] +86=proba2[50*256+81] +75=proba2[50*256+82] +79=proba2[50*256+83] +71=proba2[50*256+84] +86=proba2[50*256+85] +79=proba2[50*256+86] +93=proba2[50*256+87] +86=proba2[50*256+88] +75=proba2[50*256+89] +73=proba2[50*256+90] +93=proba2[50*256+91] +93=proba2[50*256+95] +46=proba2[50*256+97] +45=proba2[50*256+98] +46=proba2[50*256+99] +49=proba2[50*256+100] +53=proba2[50*256+101] +50=proba2[50*256+102] +56=proba2[50*256+103] +57=proba2[50*256+104] +56=proba2[50*256+105] +56=proba2[50*256+106] +59=proba2[50*256+107] +51=proba2[50*256+108] +46=proba2[50*256+109] +56=proba2[50*256+110] +59=proba2[50*256+111] +50=proba2[50*256+112] +61=proba2[50*256+113] +48=proba2[50*256+114] +49=proba2[50*256+115] +53=proba2[50*256+116] +60=proba2[50*256+117] +57=proba2[50*256+118] +55=proba2[50*256+119] +63=proba2[50*256+120] +59=proba2[50*256+121] +58=proba2[50*256+122] +52=proba1[51] +69=proba2[51*256+33] +88=proba2[51*256+34] +77=proba2[51*256+35] +88=proba2[51*256+36] +88=proba2[51*256+37] +82=proba2[51*256+38] +71=proba2[51*256+42] +82=proba2[51*256+43] +88=proba2[51*256+44] +68=proba2[51*256+45] +60=proba2[51*256+46] +21=proba2[51*256+48] +22=proba2[51*256+49] +24=proba2[51*256+50] +23=proba2[51*256+51] +20=proba2[51*256+52] +26=proba2[51*256+53] +28=proba2[51*256+54] +28=proba2[51*256+55] +29=proba2[51*256+56] +32=proba2[51*256+57] +88=proba2[51*256+59] +88=proba2[51*256+61] +88=proba2[51*256+62] +77=proba2[51*256+63] +82=proba2[51*256+64] +61=proba2[51*256+65] +64=proba2[51*256+66] +68=proba2[51*256+67] +68=proba2[51*256+68] +72=proba2[51*256+69] +71=proba2[51*256+70] +64=proba2[51*256+71] +88=proba2[51*256+72] +82=proba2[51*256+73] +77=proba2[51*256+74] +69=proba2[51*256+75] +71=proba2[51*256+76] +68=proba2[51*256+77] +77=proba2[51*256+78] +88=proba2[51*256+79] +72=proba2[51*256+80] +88=proba2[51*256+81] +66=proba2[51*256+82] +77=proba2[51*256+83] +71=proba2[51*256+84] +88=proba2[51*256+85] +75=proba2[51*256+86] +88=proba2[51*256+87] +77=proba2[51*256+88] +69=proba2[51*256+90] +77=proba2[51*256+95] +43=proba2[51*256+97] +48=proba2[51*256+98] +45=proba2[51*256+99] +42=proba2[51*256+100] +48=proba2[51*256+101] +52=proba2[51*256+102] +50=proba2[51*256+103] +54=proba2[51*256+104] +55=proba2[51*256+105] +51=proba2[51*256+106] +57=proba2[51*256+107] +51=proba2[51*256+108] +44=proba2[51*256+109] +53=proba2[51*256+110] +54=proba2[51*256+111] +48=proba2[51*256+112] +61=proba2[51*256+113] +47=proba2[51*256+114] +49=proba2[51*256+115] +52=proba2[51*256+116] +60=proba2[51*256+117] +53=proba2[51*256+118] +58=proba2[51*256+119] +61=proba2[51*256+120] +61=proba2[51*256+121] +54=proba2[51*256+122] +56=proba1[52] +80=proba2[52*256+32] +87=proba2[52*256+33] +87=proba2[52*256+35] +80=proba2[52*256+36] +73=proba2[52*256+37] +87=proba2[52*256+39] +87=proba2[52*256+40] +87=proba2[52*256+42] +68=proba2[52*256+43] +87=proba2[52*256+44] +76=proba2[52*256+45] +69=proba2[52*256+46] +22=proba2[52*256+48] +23=proba2[52*256+49] +25=proba2[52*256+50] +29=proba2[52*256+51] +24=proba2[52*256+52] +19=proba2[52*256+53] +27=proba2[52*256+54] +25=proba2[52*256+55] +28=proba2[52*256+56] +30=proba2[52*256+57] +80=proba2[52*256+59] +87=proba2[52*256+61] +87=proba2[52*256+64] +69=proba2[52*256+65] +80=proba2[52*256+66] +69=proba2[52*256+67] +80=proba2[52*256+68] +80=proba2[52*256+69] +73=proba2[52*256+70] +71=proba2[52*256+71] +80=proba2[52*256+72] +87=proba2[52*256+73] +73=proba2[52*256+74] +80=proba2[52*256+75] +76=proba2[52*256+76] +73=proba2[52*256+77] +76=proba2[52*256+78] +87=proba2[52*256+79] +66=proba2[52*256+80] +87=proba2[52*256+81] +68=proba2[52*256+82] +87=proba2[52*256+83] +73=proba2[52*256+84] +76=proba2[52*256+85] +80=proba2[52*256+86] +76=proba2[52*256+87] +87=proba2[52*256+88] +76=proba2[52*256+89] +76=proba2[52*256+90] +80=proba2[52*256+95] +42=proba2[52*256+97] +47=proba2[52*256+98] +50=proba2[52*256+99] +48=proba2[52*256+100] +46=proba2[52*256+101] +48=proba2[52*256+102] +50=proba2[52*256+103] +53=proba2[52*256+104] +54=proba2[52*256+105] +52=proba2[52*256+106] +57=proba2[52*256+107] +49=proba2[52*256+108] +43=proba2[52*256+109] +52=proba2[52*256+110] +62=proba2[52*256+111] +49=proba2[52*256+112] +60=proba2[52*256+113] +51=proba2[52*256+114] +47=proba2[52*256+115] +48=proba2[52*256+116] +51=proba2[52*256+117] +57=proba2[52*256+118] +57=proba2[52*256+119] +58=proba2[52*256+120] +54=proba2[52*256+121] +57=proba2[52*256+122] +57=proba1[53] +80=proba2[53*256+32] +80=proba2[53*256+33] +76=proba2[53*256+35] +76=proba2[53*256+36] +80=proba2[53*256+37] +87=proba2[53*256+38] +87=proba2[53*256+39] +69=proba2[53*256+43] +87=proba2[53*256+44] +71=proba2[53*256+45] +71=proba2[53*256+46] +21=proba2[53*256+48] +23=proba2[53*256+49] +26=proba2[53*256+50] +28=proba2[53*256+51] +26=proba2[53*256+52] +24=proba2[53*256+53] +19=proba2[53*256+54] +24=proba2[53*256+55] +27=proba2[53*256+56] +26=proba2[53*256+57] +87=proba2[53*256+59] +87=proba2[53*256+61] +80=proba2[53*256+63] +68=proba2[53*256+65] +68=proba2[53*256+66] +64=proba2[53*256+67] +87=proba2[53*256+68] +87=proba2[53*256+69] +67=proba2[53*256+70] +68=proba2[53*256+71] +80=proba2[53*256+72] +80=proba2[53*256+73] +73=proba2[53*256+74] +87=proba2[53*256+75] +73=proba2[53*256+76] +73=proba2[53*256+77] +80=proba2[53*256+78] +80=proba2[53*256+79] +68=proba2[53*256+80] +87=proba2[53*256+81] +73=proba2[53*256+82] +71=proba2[53*256+83] +71=proba2[53*256+84] +76=proba2[53*256+85] +87=proba2[53*256+86] +76=proba2[53*256+87] +87=proba2[53*256+88] +80=proba2[53*256+89] +87=proba2[53*256+90] +45=proba2[53*256+97] +48=proba2[53*256+98] +49=proba2[53*256+99] +52=proba2[53*256+100] +50=proba2[53*256+101] +50=proba2[53*256+102] +50=proba2[53*256+103] +58=proba2[53*256+104] +56=proba2[53*256+105] +56=proba2[53*256+106] +55=proba2[53*256+107] +52=proba2[53*256+108] +46=proba2[53*256+109] +54=proba2[53*256+110] +58=proba2[53*256+111] +49=proba2[53*256+112] +57=proba2[53*256+113] +51=proba2[53*256+114] +49=proba2[53*256+115] +51=proba2[53*256+116] +62=proba2[53*256+117] +58=proba2[53*256+118] +60=proba2[53*256+119] +62=proba2[53*256+120] +54=proba2[53*256+121] +57=proba2[53*256+122] +56=proba1[54] +75=proba2[54*256+32] +70=proba2[54*256+33] +81=proba2[54*256+36] +81=proba2[54*256+42] +81=proba2[54*256+43] +68=proba2[54*256+45] +70=proba2[54*256+46] +23=proba2[54*256+48] +26=proba2[54*256+49] +30=proba2[54*256+50] +29=proba2[54*256+51] +26=proba2[54*256+52] +27=proba2[54*256+53] +15=proba2[54*256+54] +24=proba2[54*256+55] +26=proba2[54*256+56] +22=proba2[54*256+57] +88=proba2[54*256+59] +81=proba2[54*256+61] +88=proba2[54*256+63] +88=proba2[54*256+64] +68=proba2[54*256+65] +61=proba2[54*256+66] +81=proba2[54*256+67] +77=proba2[54*256+68] +77=proba2[54*256+69] +75=proba2[54*256+70] +77=proba2[54*256+71] +77=proba2[54*256+72] +66=proba2[54*256+73] +88=proba2[54*256+74] +68=proba2[54*256+75] +88=proba2[54*256+76] +77=proba2[54*256+77] +88=proba2[54*256+78] +88=proba2[54*256+79] +75=proba2[54*256+80] +81=proba2[54*256+81] +75=proba2[54*256+82] +77=proba2[54*256+83] +88=proba2[54*256+84] +88=proba2[54*256+85] +77=proba2[54*256+86] +75=proba2[54*256+87] +88=proba2[54*256+88] +88=proba2[54*256+89] +88=proba2[54*256+90] +88=proba2[54*256+93] +88=proba2[54*256+94] +47=proba2[54*256+97] +49=proba2[54*256+98] +52=proba2[54*256+99] +51=proba2[54*256+100] +53=proba2[54*256+101] +53=proba2[54*256+102] +55=proba2[54*256+103] +58=proba2[54*256+104] +55=proba2[54*256+105] +54=proba2[54*256+106] +54=proba2[54*256+107] +53=proba2[54*256+108] +48=proba2[54*256+109] +53=proba2[54*256+110] +59=proba2[54*256+111] +50=proba2[54*256+112] +64=proba2[54*256+113] +53=proba2[54*256+114] +47=proba2[54*256+115] +54=proba2[54*256+116] +64=proba2[54*256+117] +57=proba2[54*256+118] +65=proba2[54*256+119] +61=proba2[54*256+120] +58=proba2[54*256+121] +61=proba2[54*256+122] +55=proba1[55] +82=proba2[55*256+32] +71=proba2[55*256+33] +78=proba2[55*256+35] +78=proba2[55*256+36] +82=proba2[55*256+38] +71=proba2[55*256+42] +82=proba2[55*256+43] +82=proba2[55*256+44] +67=proba2[55*256+45] +67=proba2[55*256+46] +23=proba2[55*256+48] +24=proba2[55*256+49] +26=proba2[55*256+50] +26=proba2[55*256+51] +24=proba2[55*256+52] +23=proba2[55*256+53] +25=proba2[55*256+54] +20=proba2[55*256+55] +23=proba2[55*256+56] +26=proba2[55*256+57] +78=proba2[55*256+59] +82=proba2[55*256+64] +71=proba2[55*256+65] +71=proba2[55*256+66] +73=proba2[55*256+67] +71=proba2[55*256+68] +75=proba2[55*256+69] +75=proba2[55*256+70] +89=proba2[55*256+71] +78=proba2[55*256+72] +75=proba2[55*256+73] +78=proba2[55*256+74] +78=proba2[55*256+75] +71=proba2[55*256+76] +71=proba2[55*256+77] +75=proba2[55*256+78] +82=proba2[55*256+79] +78=proba2[55*256+80] +89=proba2[55*256+81] +78=proba2[55*256+82] +78=proba2[55*256+83] +78=proba2[55*256+84] +89=proba2[55*256+85] +75=proba2[55*256+86] +75=proba2[55*256+87] +78=proba2[55*256+88] +82=proba2[55*256+89] +82=proba2[55*256+90] +48=proba2[55*256+97] +50=proba2[55*256+98] +51=proba2[55*256+99] +53=proba2[55*256+100] +54=proba2[55*256+101] +56=proba2[55*256+102] +52=proba2[55*256+103] +60=proba2[55*256+104] +55=proba2[55*256+105] +53=proba2[55*256+106] +56=proba2[55*256+107] +50=proba2[55*256+108] +49=proba2[55*256+109] +55=proba2[55*256+110] +61=proba2[55*256+111] +53=proba2[55*256+112] +67=proba2[55*256+113] +58=proba2[55*256+114] +52=proba2[55*256+115] +53=proba2[55*256+116] +56=proba2[55*256+117] +54=proba2[55*256+118] +63=proba2[55*256+119] +62=proba2[55*256+120] +61=proba2[55*256+121] +58=proba2[55*256+122] +89=proba2[55*256+124] +60=proba1[56] +86=proba2[56*256+32] +75=proba2[56*256+33] +75=proba2[56*256+36] +86=proba2[56*256+38] +86=proba2[56*256+41] +66=proba2[56*256+42] +86=proba2[56*256+44] +68=proba2[56*256+45] +66=proba2[56*256+46] +19=proba2[56*256+48] +21=proba2[56*256+49] +24=proba2[56*256+50] +25=proba2[56*256+51] +27=proba2[56*256+52] +27=proba2[56*256+53] +27=proba2[56*256+54] +25=proba2[56*256+55] +25=proba2[56*256+56] +27=proba2[56*256+57] +86=proba2[56*256+59] +86=proba2[56*256+61] +72=proba2[56*256+63] +79=proba2[56*256+65] +68=proba2[56*256+66] +75=proba2[56*256+67] +79=proba2[56*256+68] +79=proba2[56*256+69] +68=proba2[56*256+70] +75=proba2[56*256+71] +79=proba2[56*256+72] +70=proba2[56*256+74] +75=proba2[56*256+75] +70=proba2[56*256+76] +66=proba2[56*256+77] +79=proba2[56*256+78] +75=proba2[56*256+79] +72=proba2[56*256+80] +79=proba2[56*256+81] +79=proba2[56*256+82] +68=proba2[56*256+83] +72=proba2[56*256+84] +86=proba2[56*256+85] +86=proba2[56*256+86] +86=proba2[56*256+87] +79=proba2[56*256+88] +79=proba2[56*256+89] +72=proba2[56*256+90] +79=proba2[56*256+94] +46=proba2[56*256+97] +46=proba2[56*256+98] +47=proba2[56*256+99] +52=proba2[56*256+100] +49=proba2[56*256+101] +54=proba2[56*256+102] +49=proba2[56*256+103] +50=proba2[56*256+104] +55=proba2[56*256+105] +49=proba2[56*256+106] +51=proba2[56*256+107] +53=proba2[56*256+108] +46=proba2[56*256+109] +56=proba2[56*256+110] +60=proba2[56*256+111] +50=proba2[56*256+112] +60=proba2[56*256+113] +53=proba2[56*256+114] +45=proba2[56*256+115] +50=proba2[56*256+116] +58=proba2[56*256+117] +58=proba2[56*256+118] +59=proba2[56*256+119] +64=proba2[56*256+120] +57=proba2[56*256+121] +55=proba2[56*256+122] +59=proba1[57] +82=proba2[57*256+32] +73=proba2[57*256+33] +89=proba2[57*256+36] +89=proba2[57*256+38] +78=proba2[57*256+42] +78=proba2[57*256+43] +71=proba2[57*256+45] +68=proba2[57*256+46] +26=proba2[57*256+48] +27=proba2[57*256+49] +30=proba2[57*256+50] +30=proba2[57*256+51] +29=proba2[57*256+52] +27=proba2[57*256+53] +24=proba2[57*256+54] +20=proba2[57*256+55] +15=proba2[57*256+56] +21=proba2[57*256+57] +89=proba2[57*256+61] +89=proba2[57*256+62] +67=proba2[57*256+65] +78=proba2[57*256+66] +75=proba2[57*256+68] +75=proba2[57*256+69] +82=proba2[57*256+71] +82=proba2[57*256+72] +78=proba2[57*256+73] +78=proba2[57*256+74] +71=proba2[57*256+75] +75=proba2[57*256+76] +71=proba2[57*256+77] +78=proba2[57*256+78] +82=proba2[57*256+79] +75=proba2[57*256+80] +70=proba2[57*256+82] +71=proba2[57*256+83] +75=proba2[57*256+84] +89=proba2[57*256+85] +82=proba2[57*256+86] +89=proba2[57*256+87] +75=proba2[57*256+89] +78=proba2[57*256+90] +49=proba2[57*256+97] +54=proba2[57*256+98] +49=proba2[57*256+99] +57=proba2[57*256+100] +58=proba2[57*256+101] +55=proba2[57*256+102] +55=proba2[57*256+103] +57=proba2[57*256+104] +57=proba2[57*256+105] +57=proba2[57*256+106] +61=proba2[57*256+107] +53=proba2[57*256+108] +51=proba2[57*256+109] +57=proba2[57*256+110] +63=proba2[57*256+111] +55=proba2[57*256+112] +66=proba2[57*256+113] +55=proba2[57*256+114] +51=proba2[57*256+115] +55=proba2[57*256+116] +63=proba2[57*256+117] +59=proba2[57*256+118] +61=proba2[57*256+119] +60=proba2[57*256+120] +64=proba2[57*256+121] +65=proba2[57*256+122] +97=proba1[59] +40=proba2[59*256+39] +40=proba2[59*256+42] +33=proba2[59*256+48] +40=proba2[59*256+50] +40=proba2[59*256+51] +33=proba2[59*256+52] +40=proba2[59*256+55] +33=proba2[59*256+57] +18=proba2[59*256+59] +40=proba2[59*256+61] +40=proba2[59*256+76] +33=proba2[59*256+77] +40=proba2[59*256+78] +40=proba2[59*256+80] +40=proba2[59*256+84] +40=proba2[59*256+97] +33=proba2[59*256+98] +33=proba2[59*256+100] +29=proba2[59*256+101] +33=proba2[59*256+102] +33=proba2[59*256+103] +40=proba2[59*256+104] +40=proba2[59*256+105] +33=proba2[59*256+108] +33=proba2[59*256+109] +26=proba2[59*256+110] +40=proba2[59*256+111] +40=proba2[59*256+112] +40=proba2[59*256+113] +33=proba2[59*256+114] +29=proba2[59*256+115] +111=proba1[60] +19=proba2[60*256+35] +19=proba2[60*256+49] +12=proba2[60*256+50] +19=proba2[60*256+51] +12=proba2[60*256+62] +95=proba1[61] +43=proba2[61*256+37] +43=proba2[61*256+40] +43=proba2[61*256+41] +32=proba2[61*256+42] +43=proba2[61*256+44] +43=proba2[61*256+45] +37=proba2[61*256+49] +24=proba2[61*256+50] +32=proba2[61*256+51] +37=proba2[61*256+53] +37=proba2[61*256+55] +43=proba2[61*256+56] +43=proba2[61*256+57] +43=proba2[61*256+59] +15=proba2[61*256+61] +43=proba2[61*256+63] +43=proba2[61*256+71] +43=proba2[61*256+83] +43=proba2[61*256+90] +43=proba2[61*256+94] +37=proba2[61*256+97] +37=proba2[61*256+98] +43=proba2[61*256+100] +43=proba2[61*256+102] +37=proba2[61*256+103] +43=proba2[61*256+107] +37=proba2[61*256+108] +20=proba2[61*256+109] +43=proba2[61*256+110] +43=proba2[61*256+111] +43=proba2[61*256+112] +43=proba2[61*256+113] +43=proba2[61*256+115] +32=proba2[61*256+116] +43=proba2[61*256+117] +43=proba2[61*256+119] +13=proba2[62*256+65] +13=proba2[62*256+98] +13=proba2[62*256+108] +13=proba2[62*256+115] +97=proba1[63] +25=proba2[63*256+33] +36=proba2[63*256+43] +29=proba2[63*256+46] +36=proba2[63*256+50] +36=proba2[63*256+54] +22=proba2[63*256+63] +36=proba2[63*256+65] +36=proba2[63*256+69] +36=proba2[63*256+73] +36=proba2[63*256+78] +36=proba2[63*256+89] +36=proba2[63*256+91] +36=proba2[63*256+98] +29=proba2[63*256+99] +36=proba2[63*256+101] +36=proba2[63*256+109] +29=proba2[63*256+110] +36=proba2[63*256+111] +36=proba2[63*256+113] +29=proba2[63*256+114] +29=proba2[63*256+115] +36=proba2[63*256+116] +36=proba2[63*256+119] +22=proba2[63*256+122] +82=proba1[64] +48=proba2[64*256+33] +37=proba2[64*256+35] +48=proba2[64*256+36] +48=proba2[64*256+46] +37=proba2[64*256+48] +32=proba2[64*256+49] +41=proba2[64*256+50] +37=proba2[64*256+51] +37=proba2[64*256+52] +48=proba2[64*256+53] +41=proba2[64*256+54] +41=proba2[64*256+55] +41=proba2[64*256+57] +48=proba2[64*256+63] +23=proba2[64*256+64] +48=proba2[64*256+66] +48=proba2[64*256+82] +41=proba2[64*256+91] +48=proba2[64*256+98] +34=proba2[64*256+99] +32=proba2[64*256+100] +48=proba2[64*256+101] +37=proba2[64*256+102] +34=proba2[64*256+103] +48=proba2[64*256+104] +41=proba2[64*256+106] +48=proba2[64*256+107] +25=proba2[64*256+108] +18=proba2[64*256+109] +34=proba2[64*256+110] +27=proba2[64*256+114] +32=proba2[64*256+115] +27=proba2[64*256+116] +37=proba2[64*256+118] +41=proba2[64*256+119] +48=proba2[64*256+120] +48=proba2[64*256+122] +59=proba1[65] +72=proba2[65*256+33] +65=proba2[65*256+43] +65=proba2[65*256+44] +65=proba2[65*256+45] +72=proba2[65*256+46] +54=proba2[65*256+48] +36=proba2[65*256+49] +39=proba2[65*256+50] +48=proba2[65*256+51] +51=proba2[65*256+52] +45=proba2[65*256+53] +47=proba2[65*256+54] +54=proba2[65*256+55] +51=proba2[65*256+56] +45=proba2[65*256+57] +72=proba2[65*256+59] +40=proba2[65*256+65] +35=proba2[65*256+66] +33=proba2[65*256+67] +35=proba2[65*256+68] +47=proba2[65*256+69] +43=proba2[65*256+70] +42=proba2[65*256+71] +49=proba2[65*256+72] +33=proba2[65*256+73] +56=proba2[65*256+74] +43=proba2[65*256+75] +25=proba2[65*256+76] +29=proba2[65*256+77] +22=proba2[65*256+78] +50=proba2[65*256+79] +40=proba2[65*256+80] +56=proba2[65*256+81] +25=proba2[65*256+82] +28=proba2[65*256+83] +30=proba2[65*256+84] +35=proba2[65*256+85] +43=proba2[65*256+86] +50=proba2[65*256+87] +49=proba2[65*256+88] +44=proba2[65*256+89] +35=proba2[65*256+90] +58=proba2[65*256+97] +49=proba2[65*256+98] +53=proba2[65*256+99] +44=proba2[65*256+100] +65=proba2[65*256+101] +72=proba2[65*256+102] +56=proba2[65*256+103] +65=proba2[65*256+104] +58=proba2[65*256+105] +58=proba2[65*256+107] +37=proba2[65*256+108] +56=proba2[65*256+109] +37=proba2[65*256+110] +54=proba2[65*256+112] +65=proba2[65*256+113] +43=proba2[65*256+114] +46=proba2[65*256+115] +51=proba2[65*256+116] +51=proba2[65*256+117] +61=proba2[65*256+118] +61=proba2[65*256+119] +65=proba2[65*256+120] +56=proba2[65*256+121] +72=proba2[65*256+122] +63=proba1[66] +63=proba2[66*256+35] +49=proba2[66*256+45] +43=proba2[66*256+48] +34=proba2[66*256+49] +40=proba2[66*256+50] +43=proba2[66*256+51] +41=proba2[66*256+52] +47=proba2[66*256+53] +39=proba2[66*256+54] +49=proba2[66*256+55] +41=proba2[66*256+56] +41=proba2[66*256+57] +63=proba2[66*256+64] +25=proba2[66*256+65] +38=proba2[66*256+66] +36=proba2[66*256+67] +33=proba2[66*256+68] +25=proba2[66*256+69] +49=proba2[66*256+70] +39=proba2[66*256+71] +63=proba2[66*256+72] +30=proba2[66*256+73] +47=proba2[66*256+74] +52=proba2[66*256+75] +35=proba2[66*256+76] +41=proba2[66*256+77] +43=proba2[66*256+78] +25=proba2[66*256+79] +63=proba2[66*256+80] +63=proba2[66*256+81] +34=proba2[66*256+82] +45=proba2[66*256+83] +52=proba2[66*256+84] +39=proba2[66*256+85] +47=proba2[66*256+86] +56=proba2[66*256+87] +56=proba2[66*256+88] +49=proba2[66*256+89] +43=proba2[66*256+90] +29=proba2[66*256+97] +63=proba2[66*256+98] +63=proba2[66*256+99] +35=proba2[66*256+101] +63=proba2[66*256+104] +35=proba2[66*256+105] +49=proba2[66*256+108] +63=proba2[66*256+110] +29=proba2[66*256+111] +52=proba2[66*256+112] +63=proba2[66*256+113] +35=proba2[66*256+114] +56=proba2[66*256+115] +56=proba2[66*256+116] +39=proba2[66*256+117] +56=proba2[66*256+118] +56=proba2[66*256+119] +56=proba2[66*256+120] +56=proba2[66*256+122] +61=proba1[67] +65=proba2[67*256+32] +65=proba2[67*256+39] +65=proba2[67*256+41] +59=proba2[67*256+46] +48=proba2[67*256+48] +37=proba2[67*256+49] +36=proba2[67*256+50] +39=proba2[67*256+51] +43=proba2[67*256+52] +42=proba2[67*256+53] +42=proba2[67*256+54] +65=proba2[67*256+55] +54=proba2[67*256+56] +48=proba2[67*256+57] +24=proba2[67*256+65] +42=proba2[67*256+66] +41=proba2[67*256+67] +43=proba2[67*256+68] +28=proba2[67*256+69] +49=proba2[67*256+70] +49=proba2[67*256+71] +23=proba2[67*256+72] +32=proba2[67*256+73] +65=proba2[67*256+74] +33=proba2[67*256+75] +38=proba2[67*256+76] +43=proba2[67*256+77] +49=proba2[67*256+78] +22=proba2[67*256+79] +42=proba2[67*256+80] +59=proba2[67*256+81] +31=proba2[67*256+82] +40=proba2[67*256+83] +41=proba2[67*256+84] +42=proba2[67*256+85] +54=proba2[67*256+86] +54=proba2[67*256+88] +54=proba2[67*256+89] +59=proba2[67*256+90] +65=proba2[67*256+94] +33=proba2[67*256+97] +65=proba2[67*256+98] +52=proba2[67*256+99] +41=proba2[67*256+101] +65=proba2[67*256+102] +54=proba2[67*256+103] +33=proba2[67*256+104] +45=proba2[67*256+105] +65=proba2[67*256+106] +65=proba2[67*256+107] +38=proba2[67*256+108] +48=proba2[67*256+109] +31=proba2[67*256+111] +65=proba2[67*256+112] +65=proba2[67*256+113] +43=proba2[67*256+114] +54=proba2[67*256+115] +65=proba2[67*256+116] +54=proba2[67*256+117] +41=proba2[67*256+121] +65=proba1[68] +56=proba2[68*256+38] +63=proba2[68*256+43] +40=proba2[68*256+48] +36=proba2[68*256+49] +41=proba2[68*256+50] +42=proba2[68*256+51] +49=proba2[68*256+52] +52=proba2[68*256+53] +49=proba2[68*256+54] +45=proba2[68*256+55] +43=proba2[68*256+56] +40=proba2[68*256+57] +63=proba2[68*256+59] +63=proba2[68*256+64] +24=proba2[68*256+65] +45=proba2[68*256+66] +45=proba2[68*256+67] +41=proba2[68*256+68] +23=proba2[68*256+69] +47=proba2[68*256+70] +52=proba2[68*256+71] +49=proba2[68*256+72] +25=proba2[68*256+73] +36=proba2[68*256+74] +47=proba2[68*256+75] +42=proba2[68*256+76] +40=proba2[68*256+77] +56=proba2[68*256+78] +27=proba2[68*256+79] +47=proba2[68*256+80] +30=proba2[68*256+82] +39=proba2[68*256+83] +47=proba2[68*256+84] +38=proba2[68*256+85] +49=proba2[68*256+86] +52=proba2[68*256+87] +49=proba2[68*256+89] +47=proba2[68*256+90] +63=proba2[68*256+95] +32=proba2[68*256+97] +49=proba2[68*256+100] +31=proba2[68*256+101] +63=proba2[68*256+102] +63=proba2[68*256+103] +63=proba2[68*256+104] +33=proba2[68*256+105] +49=proba2[68*256+106] +56=proba2[68*256+107] +63=proba2[68*256+108] +52=proba2[68*256+109] +56=proba2[68*256+110] +33=proba2[68*256+111] +49=proba2[68*256+112] +36=proba2[68*256+114] +47=proba2[68*256+115] +63=proba2[68*256+116] +38=proba2[68*256+117] +56=proba2[68*256+118] +63=proba2[68*256+119] +45=proba2[68*256+120] +56=proba2[68*256+121] +69=proba1[69] +68=proba2[69*256+42] +68=proba2[69*256+45] +68=proba2[69*256+46] +46=proba2[69*256+48] +35=proba2[69*256+49] +41=proba2[69*256+50] +52=proba2[69*256+51] +50=proba2[69*256+52] +43=proba2[69*256+53] +47=proba2[69*256+54] +57=proba2[69*256+55] +52=proba2[69*256+56] +39=proba2[69*256+57] +35=proba2[69*256+65] +39=proba2[69*256+66] +35=proba2[69*256+67] +35=proba2[69*256+68] +44=proba2[69*256+69] +49=proba2[69*256+70] +41=proba2[69*256+71] +52=proba2[69*256+72] +47=proba2[69*256+73] +52=proba2[69*256+74] +46=proba2[69*256+75] +22=proba2[69*256+76] +32=proba2[69*256+77] +26=proba2[69*256+78] +46=proba2[69*256+79] +38=proba2[69*256+80] +18=proba2[69*256+82] +27=proba2[69*256+83] +27=proba2[69*256+84] +39=proba2[69*256+85] +44=proba2[69*256+86] +50=proba2[69*256+87] +40=proba2[69*256+88] +45=proba2[69*256+89] +52=proba2[69*256+90] +54=proba2[69*256+97] +54=proba2[69*256+98] +50=proba2[69*256+99] +54=proba2[69*256+100] +57=proba2[69*256+101] +61=proba2[69*256+102] +61=proba2[69*256+103] +57=proba2[69*256+104] +57=proba2[69*256+105] +61=proba2[69*256+106] +61=proba2[69*256+107] +38=proba2[69*256+108] +49=proba2[69*256+109] +43=proba2[69*256+110] +61=proba2[69*256+111] +68=proba2[69*256+112] +57=proba2[69*256+114] +54=proba2[69*256+115] +50=proba2[69*256+116] +50=proba2[69*256+117] +57=proba2[69*256+118] +68=proba2[69*256+119] +54=proba2[69*256+120] +68=proba2[69*256+121] +68=proba2[69*256+122] +66=proba1[70] +59=proba2[70*256+35] +59=proba2[70*256+38] +59=proba2[70*256+44] +59=proba2[70*256+45] +59=proba2[70*256+46] +43=proba2[70*256+48] +35=proba2[70*256+49] +37=proba2[70*256+50] +40=proba2[70*256+51] +48=proba2[70*256+52] +45=proba2[70*256+53] +40=proba2[70*256+54] +48=proba2[70*256+55] +48=proba2[70*256+56] +40=proba2[70*256+57] +23=proba2[70*256+65] +41=proba2[70*256+66] +41=proba2[70*256+67] +37=proba2[70*256+68] +33=proba2[70*256+69] +35=proba2[70*256+70] +43=proba2[70*256+71] +59=proba2[70*256+72] +27=proba2[70*256+73] +41=proba2[70*256+74] +48=proba2[70*256+75] +32=proba2[70*256+76] +41=proba2[70*256+77] +59=proba2[70*256+78] +31=proba2[70*256+79] +48=proba2[70*256+80] +59=proba2[70*256+81] +29=proba2[70*256+82] +37=proba2[70*256+83] +41=proba2[70*256+84] +36=proba2[70*256+85] +43=proba2[70*256+86] +48=proba2[70*256+87] +48=proba2[70*256+88] +59=proba2[70*256+89] +59=proba2[70*256+90] +59=proba2[70*256+93] +59=proba2[70*256+95] +30=proba2[70*256+97] +48=proba2[70*256+99] +59=proba2[70*256+100] +36=proba2[70*256+101] +45=proba2[70*256+102] +52=proba2[70*256+103] +41=proba2[70*256+105] +59=proba2[70*256+107] +33=proba2[70*256+108] +52=proba2[70*256+109] +52=proba2[70*256+110] +38=proba2[70*256+111] +30=proba2[70*256+114] +52=proba2[70*256+116] +41=proba2[70*256+117] +59=proba2[70*256+121] +59=proba2[70*256+122] +66=proba1[71] +54=proba2[71*256+32] +54=proba2[71*256+33] +54=proba2[71*256+42] +61=proba2[71*256+45] +43=proba2[71*256+48] +37=proba2[71*256+49] +39=proba2[71*256+50] +41=proba2[71*256+51] +47=proba2[71*256+52] +47=proba2[71*256+53] +54=proba2[71*256+54] +37=proba2[71*256+55] +54=proba2[71*256+56] +37=proba2[71*256+57] +23=proba2[71*256+65] +38=proba2[71*256+66] +43=proba2[71*256+67] +45=proba2[71*256+68] +27=proba2[71*256+69] +47=proba2[71*256+70] +38=proba2[71*256+71] +39=proba2[71*256+72] +31=proba2[71*256+73] +50=proba2[71*256+74] +54=proba2[71*256+75] +41=proba2[71*256+76] +45=proba2[71*256+77] +41=proba2[71*256+78] +27=proba2[71*256+79] +40=proba2[71*256+80] +54=proba2[71*256+81] +35=proba2[71*256+82] +47=proba2[71*256+83] +43=proba2[71*256+84] +35=proba2[71*256+85] +50=proba2[71*256+86] +50=proba2[71*256+87] +45=proba2[71*256+88] +50=proba2[71*256+89] +61=proba2[71*256+90] +30=proba2[71*256+97] +54=proba2[71*256+98] +50=proba2[71*256+100] +47=proba2[71*256+101] +61=proba2[71*256+102] +47=proba2[71*256+103] +43=proba2[71*256+104] +35=proba2[71*256+105] +54=proba2[71*256+106] +50=proba2[71*256+107] +40=proba2[71*256+108] +54=proba2[71*256+109] +54=proba2[71*256+110] +30=proba2[71*256+111] +50=proba2[71*256+112] +41=proba2[71*256+114] +61=proba2[71*256+116] +31=proba2[71*256+117] +54=proba2[71*256+119] +54=proba2[71*256+120] +50=proba2[71*256+121] +72=proba1[72] +58=proba2[72*256+32] +58=proba2[72*256+33] +58=proba2[72*256+44] +58=proba2[72*256+45] +58=proba2[72*256+48] +37=proba2[72*256+49] +37=proba2[72*256+50] +40=proba2[72*256+51] +51=proba2[72*256+52] +58=proba2[72*256+53] +51=proba2[72*256+54] +44=proba2[72*256+55] +47=proba2[72*256+56] +42=proba2[72*256+57] +20=proba2[72*256+65] +42=proba2[72*256+66] +44=proba2[72*256+67] +42=proba2[72*256+68] +21=proba2[72*256+69] +42=proba2[72*256+70] +58=proba2[72*256+71] +42=proba2[72*256+72] +26=proba2[72*256+73] +51=proba2[72*256+74] +39=proba2[72*256+75] +47=proba2[72*256+76] +36=proba2[72*256+77] +47=proba2[72*256+78] +26=proba2[72*256+79] +51=proba2[72*256+80] +47=proba2[72*256+81] +35=proba2[72*256+82] +47=proba2[72*256+83] +47=proba2[72*256+84] +37=proba2[72*256+85] +58=proba2[72*256+86] +51=proba2[72*256+87] +44=proba2[72*256+88] +39=proba2[72*256+89] +42=proba2[72*256+90] +51=proba2[72*256+95] +32=proba2[72*256+97] +51=proba2[72*256+98] +58=proba2[72*256+99] +47=proba2[72*256+100] +32=proba2[72*256+101] +58=proba2[72*256+102] +37=proba2[72*256+105] +51=proba2[72*256+106] +58=proba2[72*256+107] +58=proba2[72*256+108] +58=proba2[72*256+110] +36=proba2[72*256+111] +51=proba2[72*256+114] +58=proba2[72*256+115] +58=proba2[72*256+116] +42=proba2[72*256+117] +51=proba2[72*256+121] +51=proba2[72*256+122] +58=proba2[72*256+125] +75=proba1[73] +67=proba2[73*256+36] +67=proba2[73*256+38] +67=proba2[73*256+46] +49=proba2[73*256+48] +41=proba2[73*256+49] +44=proba2[73*256+50] +51=proba2[73*256+51] +49=proba2[73*256+52] +60=proba2[73*256+53] +46=proba2[73*256+54] +46=proba2[73*256+55] +56=proba2[73*256+56] +53=proba2[73*256+57] +29=proba2[73*256+65] +45=proba2[73*256+66] +26=proba2[73*256+67] +35=proba2[73*256+68] +21=proba2[73*256+69] +44=proba2[73*256+70] +36=proba2[73*256+71] +67=proba2[73*256+72] +42=proba2[73*256+73] +60=proba2[73*256+74] +37=proba2[73*256+75] +28=proba2[73*256+76] +30=proba2[73*256+77] +21=proba2[73*256+78] +33=proba2[73*256+79] +43=proba2[73*256+80] +44=proba2[73*256+81] +31=proba2[73*256+82] +25=proba2[73*256+83] +27=proba2[73*256+84] +56=proba2[73*256+85] +39=proba2[73*256+86] +53=proba2[73*256+87] +42=proba2[73*256+88] +67=proba2[73*256+89] +45=proba2[73*256+90] +53=proba2[73*256+97] +56=proba2[73*256+99] +53=proba2[73*256+100] +60=proba2[73*256+102] +60=proba2[73*256+103] +67=proba2[73*256+104] +67=proba2[73*256+105] +67=proba2[73*256+107] +56=proba2[73*256+108] +53=proba2[73*256+109] +45=proba2[73*256+110] +60=proba2[73*256+112] +60=proba2[73*256+113] +53=proba2[73*256+114] +49=proba2[73*256+115] +67=proba2[73*256+116] +60=proba2[73*256+118] +67=proba2[73*256+119] +67=proba2[73*256+120] +60=proba2[73*256+122] +67=proba1[74] +57=proba2[74*256+42] +57=proba2[74*256+46] +37=proba2[74*256+48] +46=proba2[74*256+49] +37=proba2[74*256+50] +46=proba2[74*256+51] +57=proba2[74*256+52] +50=proba2[74*256+53] +57=proba2[74*256+54] +43=proba2[74*256+55] +57=proba2[74*256+56] +50=proba2[74*256+57] +50=proba2[74*256+64] +28=proba2[74*256+65] +39=proba2[74*256+66] +39=proba2[74*256+67] +46=proba2[74*256+68] +26=proba2[74*256+69] +36=proba2[74*256+70] +46=proba2[74*256+71] +43=proba2[74*256+72] +32=proba2[74*256+73] +36=proba2[74*256+74] +46=proba2[74*256+75] +39=proba2[74*256+76] +39=proba2[74*256+77] +57=proba2[74*256+78] +21=proba2[74*256+79] +30=proba2[74*256+80] +50=proba2[74*256+81] +39=proba2[74*256+82] +43=proba2[74*256+83] +46=proba2[74*256+84] +27=proba2[74*256+85] +57=proba2[74*256+87] +57=proba2[74*256+89] +50=proba2[74*256+90] +57=proba2[74*256+95] +31=proba2[74*256+97] +50=proba2[74*256+98] +43=proba2[74*256+99] +57=proba2[74*256+100] +34=proba2[74*256+101] +50=proba2[74*256+102] +46=proba2[74*256+104] +50=proba2[74*256+105] +50=proba2[74*256+106] +57=proba2[74*256+107] +50=proba2[74*256+109] +57=proba2[74*256+110] +32=proba2[74*256+111] +57=proba2[74*256+112] +57=proba2[74*256+114] +57=proba2[74*256+116] +30=proba2[74*256+117] +50=proba2[74*256+118] +50=proba2[74*256+119] +57=proba2[74*256+121] +70=proba1[75] +56=proba2[75*256+39] +56=proba2[75*256+46] +56=proba2[75*256+48] +35=proba2[75*256+49] +34=proba2[75*256+50] +49=proba2[75*256+51] +40=proba2[75*256+52] +45=proba2[75*256+53] +38=proba2[75*256+54] +49=proba2[75*256+55] +40=proba2[75*256+56] +45=proba2[75*256+57] +56=proba2[75*256+63] +56=proba2[75*256+64] +22=proba2[75*256+65] +42=proba2[75*256+66] +56=proba2[75*256+67] +49=proba2[75*256+68] +30=proba2[75*256+69] +45=proba2[75*256+70] +56=proba2[75*256+71] +45=proba2[75*256+72] +23=proba2[75*256+73] +45=proba2[75*256+74] +45=proba2[75*256+75] +35=proba2[75*256+76] +40=proba2[75*256+77] +49=proba2[75*256+78] +30=proba2[75*256+79] +56=proba2[75*256+80] +56=proba2[75*256+81] +37=proba2[75*256+82] +45=proba2[75*256+83] +45=proba2[75*256+84] +49=proba2[75*256+85] +56=proba2[75*256+86] +49=proba2[75*256+87] +56=proba2[75*256+88] +42=proba2[75*256+89] +56=proba2[75*256+90] +56=proba2[75*256+95] +26=proba2[75*256+97] +49=proba2[75*256+98] +45=proba2[75*256+100] +31=proba2[75*256+101] +49=proba2[75*256+102] +49=proba2[75*256+103] +40=proba2[75*256+104] +34=proba2[75*256+105] +49=proba2[75*256+107] +56=proba2[75*256+108] +56=proba2[75*256+110] +33=proba2[75*256+111] +49=proba2[75*256+112] +49=proba2[75*256+113] +42=proba2[75*256+114] +56=proba2[75*256+115] +56=proba2[75*256+116] +45=proba2[75*256+117] +56=proba2[75*256+118] +56=proba2[75*256+119] +49=proba2[75*256+120] +56=proba2[75*256+121] +49=proba2[75*256+122] +56=proba2[75*256+124] +65=proba1[76] +66=proba2[76*256+32] +66=proba2[76*256+41] +66=proba2[76*256+45] +55=proba2[76*256+46] +44=proba2[76*256+48] +41=proba2[76*256+49] +45=proba2[76*256+50] +52=proba2[76*256+51] +46=proba2[76*256+52] +46=proba2[76*256+53] +50=proba2[76*256+54] +55=proba2[76*256+55] +59=proba2[76*256+56] +48=proba2[76*256+57] +66=proba2[76*256+64] +21=proba2[76*256+65] +45=proba2[76*256+66] +44=proba2[76*256+67] +36=proba2[76*256+68] +21=proba2[76*256+69] +44=proba2[76*256+70] +45=proba2[76*256+71] +46=proba2[76*256+72] +20=proba2[76*256+73] +66=proba2[76*256+74] +52=proba2[76*256+75] +28=proba2[76*256+76] +36=proba2[76*256+77] +24=proba2[76*256+79] +39=proba2[76*256+80] +52=proba2[76*256+82] +43=proba2[76*256+83] +40=proba2[76*256+84] +36=proba2[76*256+85] +44=proba2[76*256+86] +59=proba2[76*256+87] +41=proba2[76*256+89] +66=proba2[76*256+90] +66=proba2[76*256+93] +32=proba2[76*256+97] +66=proba2[76*256+98] +55=proba2[76*256+99] +55=proba2[76*256+100] +36=proba2[76*256+101] +50=proba2[76*256+102] +66=proba2[76*256+103] +59=proba2[76*256+104] +38=proba2[76*256+105] +59=proba2[76*256+106] +55=proba2[76*256+109] +66=proba2[76*256+110] +35=proba2[76*256+111] +66=proba2[76*256+112] +66=proba2[76*256+113] +66=proba2[76*256+114] +66=proba2[76*256+115] +55=proba2[76*256+116] +41=proba2[76*256+117] +66=proba2[76*256+118] +66=proba2[76*256+119] +55=proba2[76*256+121] +50=proba2[76*256+122] +58=proba1[77] +60=proba2[77*256+32] +67=proba2[77*256+33] +60=proba2[77*256+42] +60=proba2[77*256+43] +60=proba2[77*256+44] +51=proba2[77*256+45] +46=proba2[77*256+48] +39=proba2[77*256+49] +44=proba2[77*256+50] +46=proba2[77*256+51] +60=proba2[77*256+52] +51=proba2[77*256+53] +49=proba2[77*256+54] +46=proba2[77*256+55] +47=proba2[77*256+56] +46=proba2[77*256+57] +60=proba2[77*256+63] +18=proba2[77*256+65] +39=proba2[77*256+66] +42=proba2[77*256+67] +45=proba2[77*256+68] +25=proba2[77*256+69] +49=proba2[77*256+70] +44=proba2[77*256+71] +60=proba2[77*256+72] +26=proba2[77*256+73] +53=proba2[77*256+74] +51=proba2[77*256+75] +46=proba2[77*256+76] +34=proba2[77*256+77] +45=proba2[77*256+78] +27=proba2[77*256+79] +38=proba2[77*256+80] +56=proba2[77*256+81] +46=proba2[77*256+82] +51=proba2[77*256+83] +47=proba2[77*256+84] +44=proba2[77*256+85] +51=proba2[77*256+86] +49=proba2[77*256+87] +67=proba2[77*256+88] +36=proba2[77*256+89] +53=proba2[77*256+90] +67=proba2[77*256+95] +22=proba2[77*256+97] +51=proba2[77*256+98] +51=proba2[77*256+99] +32=proba2[77*256+101] +60=proba2[77*256+102] +56=proba2[77*256+103] +67=proba2[77*256+104] +32=proba2[77*256+105] +56=proba2[77*256+106] +56=proba2[77*256+107] +60=proba2[77*256+108] +60=proba2[77*256+109] +56=proba2[77*256+110] +35=proba2[77*256+111] +67=proba2[77*256+112] +56=proba2[77*256+114] +67=proba2[77*256+115] +56=proba2[77*256+116] +46=proba2[77*256+117] +67=proba2[77*256+119] +67=proba2[77*256+120] +39=proba2[77*256+121] +67=proba2[77*256+122] +69=proba1[78] +64=proba2[78*256+33] +64=proba2[78*256+43] +53=proba2[78*256+45] +57=proba2[78*256+46] +57=proba2[78*256+48] +39=proba2[78*256+49] +40=proba2[78*256+50] +46=proba2[78*256+51] +45=proba2[78*256+52] +45=proba2[78*256+53] +48=proba2[78*256+54] +46=proba2[78*256+55] +50=proba2[78*256+56] +50=proba2[78*256+57] +64=proba2[78*256+61] +64=proba2[78*256+64] +26=proba2[78*256+65] +50=proba2[78*256+66] +33=proba2[78*256+67] +26=proba2[78*256+68] +19=proba2[78*256+69] +39=proba2[78*256+70] +34=proba2[78*256+71] +50=proba2[78*256+72] +25=proba2[78*256+73] +48=proba2[78*256+74] +57=proba2[78*256+75] +48=proba2[78*256+76] +50=proba2[78*256+77] +30=proba2[78*256+78] +28=proba2[78*256+79] +53=proba2[78*256+80] +64=proba2[78*256+81] +44=proba2[78*256+83] +26=proba2[78*256+84] +40=proba2[78*256+85] +64=proba2[78*256+87] +46=proba2[78*256+88] +41=proba2[78*256+89] +48=proba2[78*256+90] +33=proba2[78*256+97] +53=proba2[78*256+98] +57=proba2[78*256+99] +64=proba2[78*256+100] +39=proba2[78*256+101] +64=proba2[78*256+102] +48=proba2[78*256+103] +64=proba2[78*256+104] +34=proba2[78*256+105] +64=proba2[78*256+107] +64=proba2[78*256+109] +64=proba2[78*256+110] +37=proba2[78*256+111] +46=proba2[78*256+112] +57=proba2[78*256+115] +53=proba2[78*256+116] +48=proba2[78*256+117] +64=proba2[78*256+119] +64=proba2[78*256+121] +57=proba2[78*256+122] +64=proba2[78*256+125] +77=proba1[79] +66=proba2[79*256+32] +66=proba2[79*256+46] +45=proba2[79*256+48] +43=proba2[79*256+49] +44=proba2[79*256+50] +48=proba2[79*256+51] +66=proba2[79*256+52] +50=proba2[79*256+53] +50=proba2[79*256+54] +59=proba2[79*256+55] +55=proba2[79*256+56] +44=proba2[79*256+57] +55=proba2[79*256+61] +48=proba2[79*256+65] +38=proba2[79*256+66] +31=proba2[79*256+67] +44=proba2[79*256+68] +50=proba2[79*256+69] +50=proba2[79*256+70] +40=proba2[79*256+71] +50=proba2[79*256+72] +36=proba2[79*256+73] +44=proba2[79*256+74] +52=proba2[79*256+75] +26=proba2[79*256+76] +27=proba2[79*256+77] +20=proba2[79*256+78] +34=proba2[79*256+79] +35=proba2[79*256+80] +24=proba2[79*256+82] +30=proba2[79*256+83] +30=proba2[79*256+84] +18=proba2[79*256+85] +47=proba2[79*256+86] +55=proba2[79*256+87] +50=proba2[79*256+88] +42=proba2[79*256+89] +52=proba2[79*256+90] +66=proba2[79*256+93] +59=proba2[79*256+98] +59=proba2[79*256+99] +66=proba2[79*256+103] +66=proba2[79*256+104] +59=proba2[79*256+105] +66=proba2[79*256+106] +66=proba2[79*256+107] +52=proba2[79*256+108] +59=proba2[79*256+109] +50=proba2[79*256+110] +66=proba2[79*256+112] +59=proba2[79*256+114] +66=proba2[79*256+115] +55=proba2[79*256+116] +66=proba2[79*256+117] +66=proba2[79*256+120] +66=proba2[79*256+121] +55=proba2[79*256+122] +63=proba1[80] +56=proba2[80*256+45] +41=proba2[80*256+48] +36=proba2[80*256+49] +36=proba2[80*256+50] +43=proba2[80*256+51] +41=proba2[80*256+52] +52=proba2[80*256+53] +46=proba2[80*256+54] +52=proba2[80*256+55] +63=proba2[80*256+56] +46=proba2[80*256+57] +63=proba2[80*256+61] +63=proba2[80*256+63] +23=proba2[80*256+65] +49=proba2[80*256+66] +45=proba2[80*256+67] +42=proba2[80*256+68] +27=proba2[80*256+69] +49=proba2[80*256+70] +39=proba2[80*256+71] +29=proba2[80*256+72] +30=proba2[80*256+73] +45=proba2[80*256+74] +49=proba2[80*256+75] +36=proba2[80*256+76] +42=proba2[80*256+77] +46=proba2[80*256+78] +27=proba2[80*256+79] +38=proba2[80*256+80] +56=proba2[80*256+81] +32=proba2[80*256+82] +39=proba2[80*256+83] +39=proba2[80*256+84] +37=proba2[80*256+85] +42=proba2[80*256+86] +56=proba2[80*256+87] +63=proba2[80*256+88] +41=proba2[80*256+89] +63=proba2[80*256+90] +28=proba2[80*256+97] +63=proba2[80*256+98] +34=proba2[80*256+101] +63=proba2[80*256+103] +36=proba2[80*256+104] +36=proba2[80*256+105] +56=proba2[80*256+108] +56=proba2[80*256+109] +52=proba2[80*256+110] +29=proba2[80*256+111] +63=proba2[80*256+113] +42=proba2[80*256+114] +63=proba2[80*256+115] +63=proba2[80*256+116] +46=proba2[80*256+117] +63=proba2[80*256+118] +63=proba2[80*256+119] +56=proba2[80*256+120] +63=proba2[80*256+121] +84=proba1[81] +47=proba2[81*256+48] +47=proba2[81*256+49] +40=proba2[81*256+50] +47=proba2[81*256+51] +36=proba2[81*256+52] +33=proba2[81*256+53] +47=proba2[81*256+54] +33=proba2[81*256+55] +47=proba2[81*256+56] +33=proba2[81*256+57] +33=proba2[81*256+65] +47=proba2[81*256+67] +40=proba2[81*256+68] +40=proba2[81*256+69] +40=proba2[81*256+70] +33=proba2[81*256+71] +40=proba2[81*256+73] +40=proba2[81*256+74] +40=proba2[81*256+76] +40=proba2[81*256+77] +47=proba2[81*256+79] +40=proba2[81*256+80] +47=proba2[81*256+81] +40=proba2[81*256+82] +40=proba2[81*256+83] +40=proba2[81*256+84] +20=proba2[81*256+85] +33=proba2[81*256+87] +33=proba2[81*256+89] +47=proba2[81*256+90] +47=proba2[81*256+97] +40=proba2[81*256+98] +47=proba2[81*256+99] +40=proba2[81*256+102] +47=proba2[81*256+103] +40=proba2[81*256+104] +47=proba2[81*256+107] +47=proba2[81*256+109] +47=proba2[81*256+110] +47=proba2[81*256+112] +40=proba2[81*256+113] +47=proba2[81*256+114] +40=proba2[81*256+116] +26=proba2[81*256+117] +29=proba2[81*256+119] +47=proba2[81*256+122] +69=proba1[82] +55=proba2[82*256+32] +66=proba2[82*256+35] +66=proba2[82*256+42] +66=proba2[82*256+43] +55=proba2[82*256+48] +36=proba2[82*256+49] +38=proba2[82*256+50] +48=proba2[82*256+51] +45=proba2[82*256+52] +48=proba2[82*256+53] +59=proba2[82*256+54] +45=proba2[82*256+55] +52=proba2[82*256+56] +48=proba2[82*256+57] +21=proba2[82*256+65] +44=proba2[82*256+66] +38=proba2[82*256+67] +34=proba2[82*256+68] +22=proba2[82*256+69] +47=proba2[82*256+70] +38=proba2[82*256+71] +66=proba2[82*256+72] +20=proba2[82*256+73] +52=proba2[82*256+74] +52=proba2[82*256+75] +39=proba2[82*256+76] +39=proba2[82*256+77] +44=proba2[82*256+78] +24=proba2[82*256+79] +45=proba2[82*256+80] +52=proba2[82*256+81] +36=proba2[82*256+82] +33=proba2[82*256+83] +32=proba2[82*256+84] +36=proba2[82*256+85] +47=proba2[82*256+86] +59=proba2[82*256+87] +59=proba2[82*256+88] +41=proba2[82*256+89] +66=proba2[82*256+90] +66=proba2[82*256+93] +66=proba2[82*256+96] +40=proba2[82*256+97] +55=proba2[82*256+100] +37=proba2[82*256+101] +59=proba2[82*256+102] +66=proba2[82*256+103] +66=proba2[82*256+104] +41=proba2[82*256+105] +66=proba2[82*256+106] +66=proba2[82*256+107] +66=proba2[82*256+108] +36=proba2[82*256+111] +55=proba2[82*256+113] +55=proba2[82*256+114] +59=proba2[82*256+115] +59=proba2[82*256+116] +43=proba2[82*256+117] +66=proba2[82*256+118] +59=proba2[82*256+119] +66=proba2[82*256+121] +66=proba2[82*256+122] +61=proba1[83] +59=proba2[83*256+32] +66=proba2[83*256+35] +66=proba2[83*256+38] +66=proba2[83*256+41] +66=proba2[83*256+42] +66=proba2[83*256+45] +44=proba2[83*256+48] +33=proba2[83*256+49] +43=proba2[83*256+50] +48=proba2[83*256+51] +48=proba2[83*256+52] +50=proba2[83*256+53] +50=proba2[83*256+54] +46=proba2[83*256+55] +50=proba2[83*256+56] +42=proba2[83*256+57] +66=proba2[83*256+64] +25=proba2[83*256+65] +46=proba2[83*256+66] +33=proba2[83*256+67] +50=proba2[83*256+68] +25=proba2[83*256+69] +55=proba2[83*256+70] +66=proba2[83*256+71] +40=proba2[83*256+72] +32=proba2[83*256+73] +55=proba2[83*256+74] +50=proba2[83*256+75] +40=proba2[83*256+76] +45=proba2[83*256+77] +42=proba2[83*256+78] +35=proba2[83*256+79] +35=proba2[83*256+80] +46=proba2[83*256+81] +43=proba2[83*256+82] +27=proba2[83*256+83] +25=proba2[83*256+84] +38=proba2[83*256+85] +50=proba2[83*256+86] +42=proba2[83*256+87] +50=proba2[83*256+88] +39=proba2[83*256+89] +55=proba2[83*256+90] +31=proba2[83*256+97] +66=proba2[83*256+98] +44=proba2[83*256+99] +59=proba2[83*256+100] +36=proba2[83*256+101] +59=proba2[83*256+102] +66=proba2[83*256+103] +42=proba2[83*256+104] +40=proba2[83*256+105] +66=proba2[83*256+106] +50=proba2[83*256+107] +59=proba2[83*256+108] +48=proba2[83*256+109] +52=proba2[83*256+110] +33=proba2[83*256+111] +48=proba2[83*256+112] +55=proba2[83*256+113] +66=proba2[83*256+114] +66=proba2[83*256+115] +38=proba2[83*256+116] +41=proba2[83*256+117] +59=proba2[83*256+119] +66=proba2[83*256+120] +48=proba2[83*256+121] +64=proba1[84] +66=proba2[84*256+33] +66=proba2[84*256+39] +66=proba2[84*256+43] +66=proba2[84*256+44] +59=proba2[84*256+45] +52=proba2[84*256+48] +42=proba2[84*256+49] +39=proba2[84*256+50] +50=proba2[84*256+51] +46=proba2[84*256+52] +48=proba2[84*256+53] +44=proba2[84*256+54] +48=proba2[84*256+55] +48=proba2[84*256+56] +44=proba2[84*256+57] +24=proba2[84*256+65] +48=proba2[84*256+66] +37=proba2[84*256+67] +48=proba2[84*256+68] +22=proba2[84*256+69] +50=proba2[84*256+70] +48=proba2[84*256+71] +33=proba2[84*256+72] +24=proba2[84*256+73] +50=proba2[84*256+74] +66=proba2[84*256+75] +44=proba2[84*256+76] +43=proba2[84*256+77] +45=proba2[84*256+78] +23=proba2[84*256+79] +52=proba2[84*256+80] +31=proba2[84*256+82] +42=proba2[84*256+83] +31=proba2[84*256+84] +39=proba2[84*256+85] +55=proba2[84*256+86] +50=proba2[84*256+87] +59=proba2[84*256+88] +39=proba2[84*256+89] +52=proba2[84*256+90] +37=proba2[84*256+97] +50=proba2[84*256+98] +55=proba2[84*256+99] +66=proba2[84*256+100] +39=proba2[84*256+101] +52=proba2[84*256+102] +66=proba2[84*256+103] +33=proba2[84*256+104] +37=proba2[84*256+105] +66=proba2[84*256+106] +66=proba2[84*256+108] +59=proba2[84*256+110] +34=proba2[84*256+111] +48=proba2[84*256+112] +55=proba2[84*256+113] +41=proba2[84*256+114] +66=proba2[84*256+115] +55=proba2[84*256+116] +42=proba2[84*256+117] +66=proba2[84*256+118] +59=proba2[84*256+119] +59=proba2[84*256+120] +46=proba2[84*256+121] +81=proba1[85] +61=proba2[85*256+42] +61=proba2[85*256+45] +61=proba2[85*256+48] +37=proba2[85*256+49] +43=proba2[85*256+50] +50=proba2[85*256+51] +44=proba2[85*256+52] +54=proba2[85*256+53] +50=proba2[85*256+54] +40=proba2[85*256+55] +43=proba2[85*256+57] +61=proba2[85*256+64] +40=proba2[85*256+65] +32=proba2[85*256+66] +28=proba2[85*256+67] +28=proba2[85*256+68] +30=proba2[85*256+69] +44=proba2[85*256+70] +43=proba2[85*256+71] +54=proba2[85*256+72] +31=proba2[85*256+73] +54=proba2[85*256+74] +47=proba2[85*256+75] +25=proba2[85*256+76] +34=proba2[85*256+77] +28=proba2[85*256+78] +54=proba2[85*256+79] +39=proba2[85*256+80] +24=proba2[85*256+82] +24=proba2[85*256+83] +33=proba2[85*256+84] +50=proba2[85*256+85] +41=proba2[85*256+86] +54=proba2[85*256+87] +44=proba2[85*256+88] +39=proba2[85*256+90] +50=proba2[85*256+97] +61=proba2[85*256+98] +54=proba2[85*256+101] +61=proba2[85*256+102] +54=proba2[85*256+103] +61=proba2[85*256+104] +54=proba2[85*256+105] +61=proba2[85*256+106] +61=proba2[85*256+107] +47=proba2[85*256+108] +61=proba2[85*256+109] +36=proba2[85*256+110] +61=proba2[85*256+112] +50=proba2[85*256+114] +43=proba2[85*256+115] +61=proba2[85*256+116] +61=proba2[85*256+118] +50=proba2[85*256+120] +47=proba2[85*256+121] +50=proba2[85*256+122] +73=proba1[86] +55=proba2[86*256+33] +55=proba2[86*256+43] +55=proba2[86*256+46] +55=proba2[86*256+48] +31=proba2[86*256+49] +31=proba2[86*256+50] +37=proba2[86*256+51] +55=proba2[86*256+52] +48=proba2[86*256+53] +44=proba2[86*256+54] +48=proba2[86*256+55] +48=proba2[86*256+56] +48=proba2[86*256+57] +20=proba2[86*256+65] +44=proba2[86*256+66] +55=proba2[86*256+67] +35=proba2[86*256+68] +22=proba2[86*256+69] +48=proba2[86*256+70] +48=proba2[86*256+71] +48=proba2[86*256+72] +25=proba2[86*256+73] +44=proba2[86*256+74] +55=proba2[86*256+75] +44=proba2[86*256+76] +34=proba2[86*256+79] +44=proba2[86*256+80] +55=proba2[86*256+81] +41=proba2[86*256+82] +41=proba2[86*256+83] +38=proba2[86*256+84] +55=proba2[86*256+85] +44=proba2[86*256+86] +55=proba2[86*256+87] +55=proba2[86*256+89] +55=proba2[86*256+90] +26=proba2[86*256+97] +29=proba2[86*256+101] +44=proba2[86*256+102] +55=proba2[86*256+103] +55=proba2[86*256+104] +27=proba2[86*256+105] +48=proba2[86*256+107] +55=proba2[86*256+108] +48=proba2[86*256+109] +41=proba2[86*256+111] +48=proba2[86*256+112] +44=proba2[86*256+114] +55=proba2[86*256+117] +48=proba2[86*256+118] +55=proba2[86*256+122] +79=proba1[87] +51=proba2[87*256+33] +51=proba2[87*256+42] +40=proba2[87*256+46] +51=proba2[87*256+48] +35=proba2[87*256+49] +44=proba2[87*256+50] +35=proba2[87*256+51] +44=proba2[87*256+52] +51=proba2[87*256+53] +44=proba2[87*256+54] +37=proba2[87*256+55] +51=proba2[87*256+63] +22=proba2[87*256+65] +44=proba2[87*256+66] +40=proba2[87*256+67] +51=proba2[87*256+68] +33=proba2[87*256+69] +51=proba2[87*256+70] +51=proba2[87*256+71] +30=proba2[87*256+72] +31=proba2[87*256+73] +44=proba2[87*256+74] +40=proba2[87*256+75] +40=proba2[87*256+76] +37=proba2[87*256+77] +44=proba2[87*256+78] +33=proba2[87*256+79] +40=proba2[87*256+80] +35=proba2[87*256+81] +40=proba2[87*256+82] +40=proba2[87*256+83] +40=proba2[87*256+84] +51=proba2[87*256+85] +51=proba2[87*256+86] +44=proba2[87*256+87] +51=proba2[87*256+88] +44=proba2[87*256+90] +28=proba2[87*256+97] +51=proba2[87*256+100] +27=proba2[87*256+101] +40=proba2[87*256+104] +33=proba2[87*256+105] +51=proba2[87*256+106] +37=proba2[87*256+107] +51=proba2[87*256+110] +40=proba2[87*256+111] +37=proba2[87*256+113] +44=proba2[87*256+114] +51=proba2[87*256+115] +51=proba2[87*256+120] +80=proba1[88] +50=proba2[88*256+45] +50=proba2[88*256+46] +39=proba2[88*256+48] +30=proba2[88*256+49] +27=proba2[88*256+50] +43=proba2[88*256+51] +34=proba2[88*256+52] +50=proba2[88*256+53] +39=proba2[88*256+54] +34=proba2[88*256+55] +50=proba2[88*256+56] +50=proba2[88*256+57] +28=proba2[88*256+65] +50=proba2[88*256+66] +30=proba2[88*256+67] +32=proba2[88*256+68] +32=proba2[88*256+69] +36=proba2[88*256+70] +39=proba2[88*256+71] +34=proba2[88*256+73] +50=proba2[88*256+74] +50=proba2[88*256+75] +50=proba2[88*256+77] +43=proba2[88*256+78] +39=proba2[88*256+79] +34=proba2[88*256+80] +39=proba2[88*256+82] +39=proba2[88*256+83] +43=proba2[88*256+84] +50=proba2[88*256+85] +50=proba2[88*256+86] +39=proba2[88*256+87] +25=proba2[88*256+88] +39=proba2[88*256+89] +36=proba2[88*256+97] +50=proba2[88*256+99] +43=proba2[88*256+100] +43=proba2[88*256+101] +39=proba2[88*256+103] +50=proba2[88*256+104] +50=proba2[88*256+105] +50=proba2[88*256+106] +50=proba2[88*256+109] +50=proba2[88*256+111] +50=proba2[88*256+112] +50=proba2[88*256+113] +39=proba2[88*256+114] +50=proba2[88*256+116] +50=proba2[88*256+118] +39=proba2[88*256+119] +50=proba2[88*256+120] +50=proba2[88*256+121] +39=proba2[88*256+122] +78=proba1[89] +47=proba2[89*256+32] +54=proba2[89*256+38] +54=proba2[89*256+45] +43=proba2[89*256+48] +30=proba2[89*256+49] +43=proba2[89*256+50] +47=proba2[89*256+51] +47=proba2[89*256+52] +40=proba2[89*256+53] +36=proba2[89*256+54] +33=proba2[89*256+55] +54=proba2[89*256+56] +43=proba2[89*256+57] +28=proba2[89*256+65] +43=proba2[89*256+66] +35=proba2[89*256+67] +33=proba2[89*256+68] +38=proba2[89*256+69] +54=proba2[89*256+70] +28=proba2[89*256+71] +54=proba2[89*256+72] +43=proba2[89*256+73] +54=proba2[89*256+74] +47=proba2[89*256+75] +31=proba2[89*256+76] +31=proba2[89*256+77] +38=proba2[89*256+78] +28=proba2[89*256+79] +36=proba2[89*256+80] +40=proba2[89*256+81] +47=proba2[89*256+82] +31=proba2[89*256+83] +43=proba2[89*256+84] +47=proba2[89*256+85] +54=proba2[89*256+86] +54=proba2[89*256+87] +54=proba2[89*256+88] +54=proba2[89*256+89] +38=proba2[89*256+90] +36=proba2[89*256+97] +54=proba2[89*256+99] +47=proba2[89*256+100] +54=proba2[89*256+101] +38=proba2[89*256+103] +54=proba2[89*256+104] +47=proba2[89*256+105] +47=proba2[89*256+106] +43=proba2[89*256+107] +47=proba2[89*256+108] +54=proba2[89*256+110] +33=proba2[89*256+111] +47=proba2[89*256+112] +54=proba2[89*256+114] +47=proba2[89*256+115] +43=proba2[89*256+116] +54=proba2[89*256+117] +47=proba2[89*256+118] +35=proba2[89*256+119] +54=proba2[89*256+120] +47=proba2[89*256+122] +76=proba1[90] +54=proba2[90*256+32] +54=proba2[90*256+38] +54=proba2[90*256+42] +33=proba2[90*256+48] +34=proba2[90*256+49] +34=proba2[90*256+50] +47=proba2[90*256+51] +32=proba2[90*256+52] +40=proba2[90*256+53] +38=proba2[90*256+54] +40=proba2[90*256+55] +54=proba2[90*256+56] +54=proba2[90*256+57] +25=proba2[90*256+65] +38=proba2[90*256+66] +47=proba2[90*256+67] +47=proba2[90*256+68] +24=proba2[90*256+69] +38=proba2[90*256+70] +31=proba2[90*256+73] +43=proba2[90*256+74] +43=proba2[90*256+75] +47=proba2[90*256+76] +54=proba2[90*256+77] +25=proba2[90*256+79] +54=proba2[90*256+80] +47=proba2[90*256+81] +47=proba2[90*256+82] +43=proba2[90*256+83] +43=proba2[90*256+84] +43=proba2[90*256+85] +47=proba2[90*256+86] +47=proba2[90*256+87] +47=proba2[90*256+88] +47=proba2[90*256+89] +34=proba2[90*256+90] +36=proba2[90*256+97] +54=proba2[90*256+98] +54=proba2[90*256+99] +54=proba2[90*256+100] +34=proba2[90*256+101] +38=proba2[90*256+105] +54=proba2[90*256+106] +40=proba2[90*256+107] +47=proba2[90*256+109] +47=proba2[90*256+110] +32=proba2[90*256+111] +47=proba2[90*256+112] +47=proba2[90*256+115] +54=proba2[90*256+116] +33=proba2[90*256+117] +43=proba2[90*256+120] +54=proba2[90*256+121] +97=proba1[91] +23=proba2[91*256+48] +23=proba2[91*256+57] +17=proba2[91*256+77] +23=proba2[91*256+83] +23=proba2[91*256+93] +23=proba2[91*256+97] +17=proba2[91*256+98] +23=proba2[91*256+110] +23=proba2[91*256+117] +118=proba1[93] +12=proba2[93*256+48] +19=proba2[93*256+54] +19=proba2[93*256+59] +12=proba2[93*256+64] +19=proba2[93*256+125] +23=proba2[94*256+40] +23=proba2[94*256+41] +23=proba2[94*256+42] +23=proba2[94*256+49] +23=proba2[94*256+95] +23=proba2[94*256+98] +16=proba2[94*256+99] +23=proba2[94*256+109] +23=proba2[94*256+110] +98=proba1[95] +35=proba2[95*256+33] +49=proba2[95*256+41] +49=proba2[95*256+42] +49=proba2[95*256+43] +42=proba2[95*256+45] +33=proba2[95*256+48] +29=proba2[95*256+49] +31=proba2[95*256+50] +42=proba2[95*256+51] +42=proba2[95*256+52] +42=proba2[95*256+53] +35=proba2[95*256+54] +49=proba2[95*256+55] +49=proba2[95*256+56] +29=proba2[95*256+57] +49=proba2[95*256+64] +49=proba2[95*256+65] +49=proba2[95*256+68] +49=proba2[95*256+72] +49=proba2[95*256+77] +49=proba2[95*256+80] +49=proba2[95*256+85] +27=proba2[95*256+95] +35=proba2[95*256+97] +49=proba2[95*256+98] +33=proba2[95*256+99] +27=proba2[95*256+100] +38=proba2[95*256+101] +29=proba2[95*256+102] +49=proba2[95*256+103] +49=proba2[95*256+104] +49=proba2[95*256+105] +42=proba2[95*256+106] +42=proba2[95*256+107] +33=proba2[95*256+108] +49=proba2[95*256+109] +35=proba2[95*256+111] +42=proba2[95*256+112] +35=proba2[95*256+114] +38=proba2[95*256+115] +31=proba2[95*256+116] +49=proba2[95*256+117] +38=proba2[95*256+118] +42=proba2[95*256+119] +42=proba2[95*256+120] +42=proba2[95*256+121] +42=proba2[95*256+122] +49=proba2[95*256+126] +118=proba1[96] +10=proba2[96*256+49] +10=proba2[96*256+51] +10=proba2[96*256+100] +27=proba1[97] +85=proba2[97*256+32] +83=proba2[97*256+33] +112=proba2[97*256+34] +98=proba2[97*256+35] +98=proba2[97*256+36] +105=proba2[97*256+37] +86=proba2[97*256+38] +112=proba2[97*256+39] +105=proba2[97*256+40] +105=proba2[97*256+41] +98=proba2[97*256+42] +98=proba2[97*256+43] +98=proba2[97*256+44] +83=proba2[97*256+45] +84=proba2[97*256+46] +57=proba2[97*256+48] +46=proba2[97*256+49] +51=proba2[97*256+50] +59=proba2[97*256+51] +61=proba2[97*256+52] +62=proba2[97*256+53] +60=proba2[97*256+54] +58=proba2[97*256+55] +64=proba2[97*256+56] +55=proba2[97*256+57] +98=proba2[97*256+59] +112=proba2[97*256+60] +98=proba2[97*256+61] +101=proba2[97*256+62] +105=proba2[97*256+63] +105=proba2[97*256+64] +112=proba2[97*256+65] +98=proba2[97*256+66] +92=proba2[97*256+67] +105=proba2[97*256+68] +98=proba2[97*256+70] +98=proba2[97*256+71] +105=proba2[97*256+72] +112=proba2[97*256+73] +105=proba2[97*256+74] +92=proba2[97*256+75] +101=proba2[97*256+76] +88=proba2[97*256+77] +98=proba2[97*256+78] +105=proba2[97*256+79] +85=proba2[97*256+80] +105=proba2[97*256+81] +91=proba2[97*256+82] +94=proba2[97*256+83] +98=proba2[97*256+84] +101=proba2[97*256+86] +112=proba2[97*256+87] +112=proba2[97*256+88] +112=proba2[97*256+90] +112=proba2[97*256+93] +83=proba2[97*256+95] +44=proba2[97*256+97] +32=proba2[97*256+98] +31=proba2[97*256+99] +32=proba2[97*256+100] +45=proba2[97*256+101] +42=proba2[97*256+102] +34=proba2[97*256+103] +45=proba2[97*256+104] +32=proba2[97*256+105] +52=proba2[97*256+106] +41=proba2[97*256+107] +23=proba2[97*256+108] +28=proba2[97*256+109] +18=proba2[97*256+110] +49=proba2[97*256+111] +37=proba2[97*256+112] +57=proba2[97*256+113] +20=proba2[97*256+114] +28=proba2[97*256+115] +27=proba2[97*256+116] +30=proba2[97*256+117] +38=proba2[97*256+118] +52=proba2[97*256+119] +46=proba2[97*256+120] +41=proba2[97*256+121] +40=proba2[97*256+122] +28=proba1[98] +86=proba2[98*256+32] +89=proba2[98*256+33] +99=proba2[98*256+36] +93=proba2[98*256+38] +99=proba2[98*256+40] +99=proba2[98*256+41] +99=proba2[98*256+42] +93=proba2[98*256+43] +99=proba2[98*256+44] +89=proba2[98*256+45] +80=proba2[98*256+46] +52=proba2[98*256+48] +46=proba2[98*256+49] +48=proba2[98*256+50] +54=proba2[98*256+51] +59=proba2[98*256+52] +59=proba2[98*256+53] +56=proba2[98*256+54] +55=proba2[98*256+55] +59=proba2[98*256+56] +55=proba2[98*256+57] +99=proba2[98*256+59] +93=proba2[98*256+61] +99=proba2[98*256+63] +93=proba2[98*256+64] +83=proba2[98*256+65] +93=proba2[98*256+66] +99=proba2[98*256+67] +89=proba2[98*256+68] +99=proba2[98*256+69] +93=proba2[98*256+70] +83=proba2[98*256+71] +86=proba2[98*256+73] +93=proba2[98*256+74] +99=proba2[98*256+75] +93=proba2[98*256+78] +86=proba2[98*256+82] +93=proba2[98*256+83] +93=proba2[98*256+84] +99=proba2[98*256+90] +86=proba2[98*256+95] +18=proba2[98*256+97] +37=proba2[98*256+98] +40=proba2[98*256+99] +41=proba2[98*256+100] +16=proba2[98*256+101] +49=proba2[98*256+102] +49=proba2[98*256+103] +53=proba2[98*256+104] +22=proba2[98*256+105] +51=proba2[98*256+106] +56=proba2[98*256+107] +28=proba2[98*256+108] +45=proba2[98*256+109] +50=proba2[98*256+110] +18=proba2[98*256+111] +50=proba2[98*256+112] +63=proba2[98*256+113] +25=proba2[98*256+114] +40=proba2[98*256+115] +49=proba2[98*256+116] +31=proba2[98*256+117] +54=proba2[98*256+118] +56=proba2[98*256+119] +60=proba2[98*256+120] +40=proba2[98*256+121] +53=proba2[98*256+122] +25=proba1[99] +87=proba2[99*256+32] +81=proba2[99*256+33] +103=proba2[99*256+34] +92=proba2[99*256+36] +103=proba2[99*256+37] +85=proba2[99*256+38] +96=proba2[99*256+39] +89=proba2[99*256+42] +89=proba2[99*256+43] +92=proba2[99*256+44] +85=proba2[99*256+45] +89=proba2[99*256+46] +55=proba2[99*256+48] +45=proba2[99*256+49] +49=proba2[99*256+50] +56=proba2[99*256+51] +60=proba2[99*256+52] +62=proba2[99*256+53] +57=proba2[99*256+54] +60=proba2[99*256+55] +65=proba2[99*256+56] +56=proba2[99*256+57] +96=proba2[99*256+59] +85=proba2[99*256+61] +89=proba2[99*256+64] +89=proba2[99*256+65] +103=proba2[99*256+66] +96=proba2[99*256+67] +103=proba2[99*256+68] +92=proba2[99*256+69] +87=proba2[99*256+70] +87=proba2[99*256+72] +103=proba2[99*256+74] +103=proba2[99*256+75] +103=proba2[99*256+76] +103=proba2[99*256+80] +92=proba2[99*256+81] +103=proba2[99*256+82] +92=proba2[99*256+83] +96=proba2[99*256+84] +92=proba2[99*256+85] +103=proba2[99*256+86] +103=proba2[99*256+88] +87=proba2[99*256+89] +92=proba2[99*256+95] +19=proba2[99*256+97] +44=proba2[99*256+98] +39=proba2[99*256+99] +43=proba2[99*256+100] +24=proba2[99*256+101] +49=proba2[99*256+102] +48=proba2[99*256+103] +16=proba2[99*256+104] +31=proba2[99*256+105] +53=proba2[99*256+106] +28=proba2[99*256+107] +30=proba2[99*256+108] +43=proba2[99*256+109] +50=proba2[99*256+110] +18=proba2[99*256+111] +45=proba2[99*256+112] +50=proba2[99*256+113] +31=proba2[99*256+114] +43=proba2[99*256+115] +37=proba2[99*256+116] +39=proba2[99*256+117] +48=proba2[99*256+118] +58=proba2[99*256+119] +62=proba2[99*256+120] +38=proba2[99*256+121] +62=proba2[99*256+122] +103=proba2[99*256+124] +30=proba1[100] +100=proba2[100*256+32] +76=proba2[100*256+33] +86=proba2[100*256+35] +100=proba2[100*256+37] +86=proba2[100*256+38] +84=proba2[100*256+39] +86=proba2[100*256+42] +100=proba2[100*256+43] +79=proba2[100*256+45] +84=proba2[100*256+46] +49=proba2[100*256+48] +43=proba2[100*256+49] +47=proba2[100*256+50] +53=proba2[100*256+51] +55=proba2[100*256+52] +57=proba2[100*256+53] +54=proba2[100*256+54] +54=proba2[100*256+55] +61=proba2[100*256+56] +53=proba2[100*256+57] +89=proba2[100*256+59] +100=proba2[100*256+61] +100=proba2[100*256+64] +93=proba2[100*256+65] +93=proba2[100*256+66] +100=proba2[100*256+68] +84=proba2[100*256+69] +100=proba2[100*256+70] +93=proba2[100*256+71] +93=proba2[100*256+72] +100=proba2[100*256+73] +100=proba2[100*256+76] +84=proba2[100*256+77] +93=proba2[100*256+78] +100=proba2[100*256+79] +89=proba2[100*256+80] +100=proba2[100*256+81] +100=proba2[100*256+82] +93=proba2[100*256+83] +100=proba2[100*256+84] +93=proba2[100*256+85] +100=proba2[100*256+86] +93=proba2[100*256+87] +100=proba2[100*256+89] +89=proba2[100*256+90] +86=proba2[100*256+95] +20=proba2[100*256+97] +41=proba2[100*256+98] +41=proba2[100*256+99] +38=proba2[100*256+100] +15=proba2[100*256+101] +43=proba2[100*256+102] +43=proba2[100*256+103] +46=proba2[100*256+104] +21=proba2[100*256+105] +36=proba2[100*256+106] +52=proba2[100*256+107] +41=proba2[100*256+108] +40=proba2[100*256+109] +48=proba2[100*256+110] +21=proba2[100*256+111] +45=proba2[100*256+112] +64=proba2[100*256+113] +26=proba2[100*256+114] +38=proba2[100*256+115] +47=proba2[100*256+116] +29=proba2[100*256+117] +49=proba2[100*256+118] +50=proba2[100*256+119] +57=proba2[100*256+120] +37=proba2[100*256+121] +53=proba2[100*256+122] +36=proba1[101] +75=proba2[101*256+32] +82=proba2[101*256+33] +91=proba2[101*256+35] +91=proba2[101*256+36] +110=proba2[101*256+37] +89=proba2[101*256+38] +103=proba2[101*256+39] +103=proba2[101*256+40] +103=proba2[101*256+41] +84=proba2[101*256+42] +92=proba2[101*256+43] +96=proba2[101*256+44] +78=proba2[101*256+45] +87=proba2[101*256+46] +54=proba2[101*256+48] +42=proba2[101*256+49] +47=proba2[101*256+50] +54=proba2[101*256+51] +58=proba2[101*256+52] +58=proba2[101*256+53] +56=proba2[101*256+54] +54=proba2[101*256+55] +61=proba2[101*256+56] +52=proba2[101*256+57] +103=proba2[101*256+59] +92=proba2[101*256+61] +103=proba2[101*256+63] +91=proba2[101*256+64] +103=proba2[101*256+65] +92=proba2[101*256+66] +92=proba2[101*256+67] +89=proba2[101*256+68] +110=proba2[101*256+69] +99=proba2[101*256+70] +99=proba2[101*256+71] +99=proba2[101*256+72] +110=proba2[101*256+73] +103=proba2[101*256+74] +92=proba2[101*256+75] +91=proba2[101*256+76] +92=proba2[101*256+77] +96=proba2[101*256+78] +110=proba2[101*256+79] +110=proba2[101*256+80] +103=proba2[101*256+81] +87=proba2[101*256+82] +87=proba2[101*256+83] +94=proba2[101*256+84] +92=proba2[101*256+85] +103=proba2[101*256+86] +99=proba2[101*256+87] +96=proba2[101*256+88] +110=proba2[101*256+89] +94=proba2[101*256+90] +110=proba2[101*256+93] +103=proba2[101*256+94] +83=proba2[101*256+95] +32=proba2[101*256+97] +33=proba2[101*256+98] +33=proba2[101*256+99] +32=proba2[101*256+100] +38=proba2[101*256+101] +41=proba2[101*256+102] +38=proba2[101*256+103] +51=proba2[101*256+104] +40=proba2[101*256+105] +53=proba2[101*256+106] +47=proba2[101*256+107] +22=proba2[101*256+108] +33=proba2[101*256+109] +23=proba2[101*256+110] +44=proba2[101*256+111] +38=proba2[101*256+112] +62=proba2[101*256+113] +16=proba2[101*256+114] +25=proba2[101*256+115] +26=proba2[101*256+116] +35=proba2[101*256+117] +39=proba2[101*256+118] +49=proba2[101*256+119] +41=proba2[101*256+120] +43=proba2[101*256+121] +45=proba2[101*256+122] +110=proba2[101*256+126] +31=proba1[102] +84=proba2[102*256+32] +74=proba2[102*256+33] +88=proba2[102*256+38] +88=proba2[102*256+41] +95=proba2[102*256+42] +84=proba2[102*256+44] +84=proba2[102*256+45] +81=proba2[102*256+46] +52=proba2[102*256+48] +41=proba2[102*256+49] +46=proba2[102*256+50] +54=proba2[102*256+51] +53=proba2[102*256+52] +52=proba2[102*256+53] +53=proba2[102*256+54] +53=proba2[102*256+55] +57=proba2[102*256+56] +52=proba2[102*256+57] +88=proba2[102*256+64] +84=proba2[102*256+65] +84=proba2[102*256+66] +88=proba2[102*256+67] +88=proba2[102*256+68] +95=proba2[102*256+69] +95=proba2[102*256+70] +88=proba2[102*256+72] +95=proba2[102*256+73] +95=proba2[102*256+74] +95=proba2[102*256+75] +95=proba2[102*256+76] +81=proba2[102*256+78] +95=proba2[102*256+80] +95=proba2[102*256+84] +95=proba2[102*256+85] +88=proba2[102*256+86] +95=proba2[102*256+87] +88=proba2[102*256+90] +81=proba2[102*256+95] +20=proba2[102*256+97] +41=proba2[102*256+98] +40=proba2[102*256+99] +42=proba2[102*256+100] +25=proba2[102*256+101] +28=proba2[102*256+102] +40=proba2[102*256+103] +52=proba2[102*256+104] +24=proba2[102*256+105] +50=proba2[102*256+106] +51=proba2[102*256+107] +26=proba2[102*256+108] +40=proba2[102*256+109] +50=proba2[102*256+110] +22=proba2[102*256+111] +43=proba2[102*256+112] +64=proba2[102*256+113] +17=proba2[102*256+114] +40=proba2[102*256+115] +35=proba2[102*256+116] +31=proba2[102*256+117] +51=proba2[102*256+118] +54=proba2[102*256+119] +48=proba2[102*256+120] +48=proba2[102*256+121] +59=proba2[102*256+122] +32=proba1[103] +86=proba2[103*256+32] +81=proba2[103*256+33] +97=proba2[103*256+35] +90=proba2[103*256+36] +97=proba2[103*256+38] +83=proba2[103*256+39] +97=proba2[103*256+42] +90=proba2[103*256+43] +83=proba2[103*256+45] +90=proba2[103*256+46] +55=proba2[103*256+48] +46=proba2[103*256+49] +49=proba2[103*256+50] +56=proba2[103*256+51] +59=proba2[103*256+52] +57=proba2[103*256+53] +56=proba2[103*256+54] +56=proba2[103*256+55] +61=proba2[103*256+56] +56=proba2[103*256+57] +97=proba2[103*256+59] +97=proba2[103*256+60] +86=proba2[103*256+64] +81=proba2[103*256+65] +83=proba2[103*256+66] +97=proba2[103*256+67] +97=proba2[103*256+68] +86=proba2[103*256+69] +97=proba2[103*256+70] +97=proba2[103*256+71] +90=proba2[103*256+72] +97=proba2[103*256+74] +97=proba2[103*256+75] +97=proba2[103*256+76] +90=proba2[103*256+78] +90=proba2[103*256+79] +83=proba2[103*256+80] +97=proba2[103*256+84] +97=proba2[103*256+86] +83=proba2[103*256+87] +90=proba2[103*256+90] +97=proba2[103*256+94] +86=proba2[103*256+95] +18=proba2[103*256+97] +41=proba2[103*256+98] +46=proba2[103*256+99] +43=proba2[103*256+100] +18=proba2[103*256+101] +48=proba2[103*256+102] +38=proba2[103*256+103] +35=proba2[103*256+104] +24=proba2[103*256+105] +55=proba2[103*256+106] +54=proba2[103*256+107] +32=proba2[103*256+108] +42=proba2[103*256+109] +32=proba2[103*256+110] +21=proba2[103*256+111] +45=proba2[103*256+112] +67=proba2[103*256+113] +25=proba2[103*256+114] +41=proba2[103*256+115] +45=proba2[103*256+116] +23=proba2[103*256+117] +55=proba2[103*256+118] +47=proba2[103*256+119] +61=proba2[103*256+120] +43=proba2[103*256+121] +57=proba2[103*256+122] +38=proba1[104] +79=proba2[104*256+32] +90=proba2[104*256+33] +97=proba2[104*256+39] +97=proba2[104*256+42] +90=proba2[104*256+45] +84=proba2[104*256+46] +53=proba2[104*256+48] +47=proba2[104*256+49] +49=proba2[104*256+50] +56=proba2[104*256+51] +58=proba2[104*256+52] +59=proba2[104*256+53] +56=proba2[104*256+54] +55=proba2[104*256+55] +60=proba2[104*256+56] +55=proba2[104*256+57] +97=proba2[104*256+59] +97=proba2[104*256+60] +97=proba2[104*256+61] +86=proba2[104*256+64] +86=proba2[104*256+65] +86=proba2[104*256+66] +90=proba2[104*256+67] +97=proba2[104*256+68] +81=proba2[104*256+71] +97=proba2[104*256+74] +97=proba2[104*256+75] +97=proba2[104*256+79] +97=proba2[104*256+80] +97=proba2[104*256+81] +97=proba2[104*256+82] +86=proba2[104*256+83] +81=proba2[104*256+84] +97=proba2[104*256+87] +86=proba2[104*256+88] +84=proba2[104*256+89] +90=proba2[104*256+95] +14=proba2[104*256+97] +45=proba2[104*256+98] +47=proba2[104*256+99] +47=proba2[104*256+100] +16=proba2[104*256+101] +54=proba2[104*256+102] +53=proba2[104*256+103] +54=proba2[104*256+104] +19=proba2[104*256+105] +56=proba2[104*256+106] +54=proba2[104*256+107] +41=proba2[104*256+108] +42=proba2[104*256+109] +41=proba2[104*256+110] +20=proba2[104*256+111] +47=proba2[104*256+112] +59=proba2[104*256+113] +32=proba2[104*256+114] +48=proba2[104*256+115] +39=proba2[104*256+116] +31=proba2[104*256+117] +58=proba2[104*256+118] +56=proba2[104*256+119] +57=proba2[104*256+120] +39=proba2[104*256+121] +59=proba2[104*256+122] +42=proba1[105] +95=proba2[105*256+32] +90=proba2[105*256+33] +108=proba2[105*256+36] +97=proba2[105*256+38] +108=proba2[105*256+39] +108=proba2[105*256+41] +95=proba2[105*256+42] +92=proba2[105*256+43] +108=proba2[105*256+44] +81=proba2[105*256+45] +88=proba2[105*256+46] +59=proba2[105*256+48] +50=proba2[105*256+49] +54=proba2[105*256+50] +61=proba2[105*256+51] +65=proba2[105*256+52] +64=proba2[105*256+53] +62=proba2[105*256+54] +60=proba2[105*256+55] +66=proba2[105*256+56] +58=proba2[105*256+57] +101=proba2[105*256+59] +101=proba2[105*256+61] +101=proba2[105*256+63] +97=proba2[105*256+64] +95=proba2[105*256+65] +101=proba2[105*256+66] +97=proba2[105*256+67] +97=proba2[105*256+68] +97=proba2[105*256+69] +108=proba2[105*256+70] +90=proba2[105*256+71] +101=proba2[105*256+75] +92=proba2[105*256+76] +95=proba2[105*256+77] +90=proba2[105*256+78] +108=proba2[105*256+79] +95=proba2[105*256+80] +95=proba2[105*256+82] +108=proba2[105*256+83] +92=proba2[105*256+84] +108=proba2[105*256+86] +108=proba2[105*256+89] +108=proba2[105*256+90] +90=proba2[105*256+95] +30=proba2[105*256+97] +38=proba2[105*256+98] +24=proba2[105*256+99] +33=proba2[105*256+100] +22=proba2[105*256+101] +43=proba2[105*256+102] +35=proba2[105*256+103] +57=proba2[105*256+104] +54=proba2[105*256+105] +56=proba2[105*256+106] +38=proba2[105*256+107] +24=proba2[105*256+108] +32=proba2[105*256+109] +18=proba2[105*256+110] +32=proba2[105*256+111] +39=proba2[105*256+112] +50=proba2[105*256+113] +30=proba2[105*256+114] +24=proba2[105*256+115] +28=proba2[105*256+116] +50=proba2[105*256+117] +39=proba2[105*256+118] +59=proba2[105*256+119] +45=proba2[105*256+120] +65=proba2[105*256+121] +44=proba2[105*256+122] +108=proba2[105*256+123] +108=proba2[105*256+124] +32=proba1[106] +91=proba2[106*256+33] +91=proba2[106*256+36] +84=proba2[106*256+38] +84=proba2[106*256+39] +91=proba2[106*256+43] +80=proba2[106*256+44] +80=proba2[106*256+45] +80=proba2[106*256+46] +62=proba2[106*256+48] +48=proba2[106*256+49] +50=proba2[106*256+50] +57=proba2[106*256+51] +56=proba2[106*256+52] +58=proba2[106*256+53] +57=proba2[106*256+54] +56=proba2[106*256+55] +62=proba2[106*256+56] +57=proba2[106*256+57] +84=proba2[106*256+63] +84=proba2[106*256+64] +84=proba2[106*256+65] +91=proba2[106*256+68] +91=proba2[106*256+69] +91=proba2[106*256+70] +84=proba2[106*256+75] +91=proba2[106*256+77] +91=proba2[106*256+80] +80=proba2[106*256+81] +84=proba2[106*256+85] +84=proba2[106*256+87] +91=proba2[106*256+89] +84=proba2[106*256+95] +19=proba2[106*256+97] +35=proba2[106*256+98] +31=proba2[106*256+99] +38=proba2[106*256+100] +19=proba2[106*256+101] +36=proba2[106*256+102] +43=proba2[106*256+103] +48=proba2[106*256+104] +30=proba2[106*256+105] +39=proba2[106*256+106] +44=proba2[106*256+107] +35=proba2[106*256+108] +32=proba2[106*256+109] +46=proba2[106*256+110] +18=proba2[106*256+111] +30=proba2[106*256+112] +64=proba2[106*256+113] +41=proba2[106*256+114] +40=proba2[106*256+115] +44=proba2[106*256+116] +22=proba2[106*256+117] +48=proba2[106*256+118] +56=proba2[106*256+119] +61=proba2[106*256+120] +47=proba2[106*256+121] +59=proba2[106*256+122] +91=proba2[106*256+123] +37=proba1[107] +78=proba2[107*256+32] +78=proba2[107*256+33] +92=proba2[107*256+34] +92=proba2[107*256+36] +76=proba2[107*256+38] +92=proba2[107*256+39] +92=proba2[107*256+41] +92=proba2[107*256+42] +92=proba2[107*256+44] +76=proba2[107*256+45] +76=proba2[107*256+46] +50=proba2[107*256+48] +41=proba2[107*256+49] +45=proba2[107*256+50] +52=proba2[107*256+51] +55=proba2[107*256+52] +57=proba2[107*256+53] +51=proba2[107*256+54] +50=proba2[107*256+55] +50=proba2[107*256+56] +49=proba2[107*256+57] +92=proba2[107*256+59] +92=proba2[107*256+63] +81=proba2[107*256+64] +85=proba2[107*256+65] +92=proba2[107*256+68] +92=proba2[107*256+69] +92=proba2[107*256+70] +78=proba2[107*256+71] +92=proba2[107*256+72] +92=proba2[107*256+77] +92=proba2[107*256+78] +74=proba2[107*256+80] +85=proba2[107*256+81] +92=proba2[107*256+82] +81=proba2[107*256+84] +85=proba2[107*256+85] +92=proba2[107*256+87] +92=proba2[107*256+88] +92=proba2[107*256+95] +16=proba2[107*256+97] +45=proba2[107*256+98] +44=proba2[107*256+99] +46=proba2[107*256+100] +19=proba2[107*256+101] +47=proba2[107*256+102] +50=proba2[107*256+103] +35=proba2[107*256+104] +18=proba2[107*256+105] +50=proba2[107*256+106] +39=proba2[107*256+107] +36=proba2[107*256+108] +41=proba2[107*256+109] +43=proba2[107*256+110] +23=proba2[107*256+111] +46=proba2[107*256+112] +66=proba2[107*256+113] +32=proba2[107*256+114] +36=proba2[107*256+115] +44=proba2[107*256+116] +34=proba2[107*256+117] +58=proba2[107*256+118] +46=proba2[107*256+119] +63=proba2[107*256+120] +30=proba2[107*256+121] +50=proba2[107*256+122] +30=proba1[108] +92=proba2[108*256+32] +85=proba2[108*256+33] +106=proba2[108*256+35] +95=proba2[108*256+36] +83=proba2[108*256+38] +106=proba2[108*256+39] +106=proba2[108*256+40] +106=proba2[108*256+41] +95=proba2[108*256+42] +106=proba2[108*256+43] +86=proba2[108*256+44] +83=proba2[108*256+45] +83=proba2[108*256+46] +53=proba2[108*256+48] +47=proba2[108*256+49] +52=proba2[108*256+50] +57=proba2[108*256+51] +63=proba2[108*256+52] +62=proba2[108*256+53] +59=proba2[108*256+54] +60=proba2[108*256+55] +63=proba2[108*256+56] +55=proba2[108*256+57] +95=proba2[108*256+59] +106=proba2[108*256+61] +86=proba2[108*256+64] +86=proba2[108*256+65] +90=proba2[108*256+66] +95=proba2[108*256+67] +99=proba2[108*256+68] +88=proba2[108*256+69] +106=proba2[108*256+70] +99=proba2[108*256+71] +99=proba2[108*256+75] +106=proba2[108*256+76] +95=proba2[108*256+77] +106=proba2[108*256+78] +99=proba2[108*256+79] +92=proba2[108*256+80] +99=proba2[108*256+82] +90=proba2[108*256+84] +92=proba2[108*256+85] +106=proba2[108*256+86] +106=proba2[108*256+87] +106=proba2[108*256+88] +99=proba2[108*256+89] +106=proba2[108*256+90] +86=proba2[108*256+95] +18=proba2[108*256+97] +42=proba2[108*256+98] +43=proba2[108*256+99] +36=proba2[108*256+100] +16=proba2[108*256+101] +43=proba2[108*256+102] +47=proba2[108*256+103] +50=proba2[108*256+104] +19=proba2[108*256+105] +56=proba2[108*256+106] +49=proba2[108*256+107] +22=proba2[108*256+108] +41=proba2[108*256+109] +53=proba2[108*256+110] +20=proba2[108*256+111] +41=proba2[108*256+112] +74=proba2[108*256+113] +50=proba2[108*256+114] +41=proba2[108*256+115] +39=proba2[108*256+116] +31=proba2[108*256+117] +44=proba2[108*256+118] +59=proba2[108*256+119] +63=proba2[108*256+120] +37=proba2[108*256+121] +60=proba2[108*256+122] +25=proba1[109] +83=proba2[109*256+32] +84=proba2[109*256+33] +102=proba2[109*256+34] +102=proba2[109*256+35] +91=proba2[109*256+36] +102=proba2[109*256+37] +88=proba2[109*256+38] +88=proba2[109*256+39] +95=proba2[109*256+41] +86=proba2[109*256+42] +88=proba2[109*256+43] +88=proba2[109*256+44] +83=proba2[109*256+45] +79=proba2[109*256+46] +54=proba2[109*256+48] +45=proba2[109*256+49] +49=proba2[109*256+50] +57=proba2[109*256+51] +60=proba2[109*256+52] +59=proba2[109*256+53] +60=proba2[109*256+54] +58=proba2[109*256+55] +61=proba2[109*256+56] +54=proba2[109*256+57] +91=proba2[109*256+59] +102=proba2[109*256+60] +91=proba2[109*256+61] +95=proba2[109*256+63] +81=proba2[109*256+64] +88=proba2[109*256+65] +102=proba2[109*256+66] +102=proba2[109*256+67] +95=proba2[109*256+68] +102=proba2[109*256+70] +95=proba2[109*256+71] +91=proba2[109*256+72] +102=proba2[109*256+74] +102=proba2[109*256+76] +91=proba2[109*256+77] +102=proba2[109*256+78] +102=proba2[109*256+80] +102=proba2[109*256+81] +95=proba2[109*256+84] +95=proba2[109*256+85] +95=proba2[109*256+86] +102=proba2[109*256+88] +102=proba2[109*256+89] +91=proba2[109*256+95] +12=proba2[109*256+97] +34=proba2[109*256+98] +41=proba2[109*256+99] +45=proba2[109*256+100] +20=proba2[109*256+101] +50=proba2[109*256+102] +49=proba2[109*256+103] +53=proba2[109*256+104] +20=proba2[109*256+105] +51=proba2[109*256+106] +55=proba2[109*256+107] +44=proba2[109*256+108] +35=proba2[109*256+109] +50=proba2[109*256+110] +20=proba2[109*256+111] +33=proba2[109*256+112] +67=proba2[109*256+113] +46=proba2[109*256+114] +39=proba2[109*256+115] +47=proba2[109*256+116] +34=proba2[109*256+117] +57=proba2[109*256+118] +60=proba2[109*256+119] +60=proba2[109*256+120] +35=proba2[109*256+121] +59=proba2[109*256+122] +102=proba2[109*256+125] +35=proba1[110] +86=proba2[110*256+32] +84=proba2[110*256+33] +94=proba2[110*256+35] +94=proba2[110*256+36] +105=proba2[110*256+37] +84=proba2[110*256+38] +91=proba2[110*256+39] +105=proba2[110*256+40] +105=proba2[110*256+41] +79=proba2[110*256+42] +87=proba2[110*256+43] +87=proba2[110*256+44] +77=proba2[110*256+45] +87=proba2[110*256+46] +51=proba2[110*256+48] +42=proba2[110*256+49] +47=proba2[110*256+50] +56=proba2[110*256+51] +61=proba2[110*256+52] +60=proba2[110*256+53] +54=proba2[110*256+54] +56=proba2[110*256+55] +62=proba2[110*256+56] +55=proba2[110*256+57] +91=proba2[110*256+59] +105=proba2[110*256+61] +98=proba2[110*256+63] +86=proba2[110*256+64] +86=proba2[110*256+65] +98=proba2[110*256+66] +105=proba2[110*256+67] +91=proba2[110*256+68] +98=proba2[110*256+69] +105=proba2[110*256+70] +89=proba2[110*256+71] +105=proba2[110*256+72] +84=proba2[110*256+73] +98=proba2[110*256+74] +105=proba2[110*256+75] +98=proba2[110*256+76] +98=proba2[110*256+77] +91=proba2[110*256+79] +98=proba2[110*256+80] +98=proba2[110*256+82] +83=proba2[110*256+83] +105=proba2[110*256+84] +105=proba2[110*256+85] +105=proba2[110*256+87] +89=proba2[110*256+89] +94=proba2[110*256+90] +105=proba2[110*256+94] +84=proba2[110*256+95] +22=proba2[110*256+97] +45=proba2[110*256+98] +30=proba2[110*256+99] +26=proba2[110*256+100] +17=proba2[110*256+101] +43=proba2[110*256+102] +29=proba2[110*256+103] +50=proba2[110*256+104] +22=proba2[110*256+105] +45=proba2[110*256+106] +41=proba2[110*256+107] +48=proba2[110*256+108] +48=proba2[110*256+109] +30=proba2[110*256+110] +24=proba2[110*256+111] +48=proba2[110*256+112] +64=proba2[110*256+113] +48=proba2[110*256+114] +33=proba2[110*256+115] +25=proba2[110*256+116] +39=proba2[110*256+117] +54=proba2[110*256+118] +58=proba2[110*256+119] +60=proba2[110*256+120] +40=proba2[110*256+121] +47=proba2[110*256+122] +105=proba2[110*256+125] +41=proba1[111] +90=proba2[111*256+32] +85=proba2[111*256+33] +108=proba2[111*256+35] +97=proba2[111*256+36] +108=proba2[111*256+37] +101=proba2[111*256+38] +101=proba2[111*256+39] +108=proba2[111*256+40] +89=proba2[111*256+42] +90=proba2[111*256+43] +94=proba2[111*256+44] +89=proba2[111*256+45] +83=proba2[111*256+46] +55=proba2[111*256+48] +45=proba2[111*256+49] +50=proba2[111*256+50] +57=proba2[111*256+51] +61=proba2[111*256+52] +62=proba2[111*256+53] +59=proba2[111*256+54] +56=proba2[111*256+55] +64=proba2[111*256+56] +55=proba2[111*256+57] +94=proba2[111*256+59] +97=proba2[111*256+61] +108=proba2[111*256+62] +108=proba2[111*256+63] +97=proba2[111*256+64] +92=proba2[111*256+66] +94=proba2[111*256+67] +108=proba2[111*256+68] +108=proba2[111*256+69] +94=proba2[111*256+70] +94=proba2[111*256+71] +108=proba2[111*256+72] +101=proba2[111*256+73] +97=proba2[111*256+74] +101=proba2[111*256+76] +97=proba2[111*256+77] +101=proba2[111*256+78] +94=proba2[111*256+80] +101=proba2[111*256+81] +92=proba2[111*256+82] +89=proba2[111*256+83] +89=proba2[111*256+84] +92=proba2[111*256+85] +101=proba2[111*256+88] +108=proba2[111*256+90] +92=proba2[111*256+95] +46=proba2[111*256+97] +36=proba2[111*256+98] +34=proba2[111*256+99] +36=proba2[111*256+100] +44=proba2[111*256+101] +41=proba2[111*256+102] +39=proba2[111*256+103] +47=proba2[111*256+104] +33=proba2[111*256+105] +53=proba2[111*256+106] +42=proba2[111*256+107] +25=proba2[111*256+108] +29=proba2[111*256+109] +19=proba2[111*256+110] +33=proba2[111*256+111] +34=proba2[111*256+112] +60=proba2[111*256+113] +23=proba2[111*256+114] +31=proba2[111*256+115] +30=proba2[111*256+116] +17=proba2[111*256+117] +42=proba2[111*256+118] +43=proba2[111*256+119] +48=proba2[111*256+120] +42=proba2[111*256+121] +48=proba2[111*256+122] +28=proba1[112] +92=proba2[112*256+32] +76=proba2[112*256+33] +85=proba2[112*256+36] +88=proba2[112*256+38] +85=proba2[112*256+43] +88=proba2[112*256+44] +85=proba2[112*256+45] +78=proba2[112*256+46] +55=proba2[112*256+48] +47=proba2[112*256+49] +49=proba2[112*256+50] +51=proba2[112*256+51] +58=proba2[112*256+52] +58=proba2[112*256+53] +58=proba2[112*256+54] +56=proba2[112*256+55] +65=proba2[112*256+56] +55=proba2[112*256+57] +92=proba2[112*256+59] +99=proba2[112*256+61] +99=proba2[112*256+63] +92=proba2[112*256+64] +85=proba2[112*256+67] +99=proba2[112*256+68] +99=proba2[112*256+69] +99=proba2[112*256+71] +92=proba2[112*256+72] +92=proba2[112*256+73] +99=proba2[112*256+75] +99=proba2[112*256+76] +88=proba2[112*256+77] +85=proba2[112*256+78] +92=proba2[112*256+79] +88=proba2[112*256+80] +88=proba2[112*256+82] +92=proba2[112*256+83] +83=proba2[112*256+84] +99=proba2[112*256+86] +99=proba2[112*256+87] +85=proba2[112*256+89] +99=proba2[112*256+90] +83=proba2[112*256+95] +17=proba2[112*256+97] +45=proba2[112*256+98] +40=proba2[112*256+99] +48=proba2[112*256+100] +20=proba2[112*256+101] +47=proba2[112*256+102] +48=proba2[112*256+103] +23=proba2[112*256+104] +21=proba2[112*256+105] +51=proba2[112*256+106] +53=proba2[112*256+107] +31=proba2[112*256+108] +42=proba2[112*256+109] +52=proba2[112*256+110] +21=proba2[112*256+111] +34=proba2[112*256+112] +60=proba2[112*256+113] +28=proba2[112*256+114] +33=proba2[112*256+115] +38=proba2[112*256+116] +36=proba2[112*256+117] +52=proba2[112*256+118] +54=proba2[112*256+119] +63=proba2[112*256+120] +39=proba2[112*256+121] +58=proba2[112*256+122] +54=proba1[113] +77=proba2[113*256+32] +77=proba2[113*256+44] +70=proba2[113*256+45] +70=proba2[113*256+46] +61=proba2[113*256+48] +39=proba2[113*256+49] +42=proba2[113*256+50] +50=proba2[113*256+51] +52=proba2[113*256+52] +45=proba2[113*256+53] +50=proba2[113*256+54] +46=proba2[113*256+55] +54=proba2[113*256+56] +44=proba2[113*256+57] +77=proba2[113*256+66] +77=proba2[113*256+68] +66=proba2[113*256+69] +77=proba2[113*256+70] +77=proba2[113*256+72] +77=proba2[113*256+74] +77=proba2[113*256+75] +77=proba2[113*256+79] +70=proba2[113*256+80] +77=proba2[113*256+81] +77=proba2[113*256+82] +66=proba2[113*256+83] +77=proba2[113*256+84] +77=proba2[113*256+85] +70=proba2[113*256+87] +70=proba2[113*256+88] +63=proba2[113*256+90] +35=proba2[113*256+97] +41=proba2[113*256+98] +37=proba2[113*256+99] +43=proba2[113*256+100] +44=proba2[113*256+101] +42=proba2[113*256+102] +50=proba2[113*256+103] +50=proba2[113*256+104] +43=proba2[113*256+105] +46=proba2[113*256+106] +52=proba2[113*256+107] +48=proba2[113*256+108] +41=proba2[113*256+109] +48=proba2[113*256+110] +53=proba2[113*256+111] +41=proba2[113*256+112] +40=proba2[113*256+113] +43=proba2[113*256+114] +35=proba2[113*256+115] +41=proba2[113*256+116] +6=proba2[113*256+117] +45=proba2[113*256+118] +30=proba2[113*256+119] +49=proba2[113*256+120] +53=proba2[113*256+121] +46=proba2[113*256+122] +34=proba1[114] +88=proba2[114*256+32] +82=proba2[114*256+33] +100=proba2[114*256+35] +89=proba2[114*256+36] +107=proba2[114*256+37] +88=proba2[114*256+38] +107=proba2[114*256+39] +100=proba2[114*256+41] +89=proba2[114*256+42] +89=proba2[114*256+43] +107=proba2[114*256+44] +84=proba2[114*256+45] +84=proba2[114*256+46] +56=proba2[114*256+48] +45=proba2[114*256+49] +50=proba2[114*256+50] +58=proba2[114*256+51] +60=proba2[114*256+52] +60=proba2[114*256+53] +59=proba2[114*256+54] +57=proba2[114*256+55] +62=proba2[114*256+56] +56=proba2[114*256+57] +107=proba2[114*256+59] +107=proba2[114*256+61] +107=proba2[114*256+63] +83=proba2[114*256+64] +107=proba2[114*256+65] +100=proba2[114*256+66] +107=proba2[114*256+67] +107=proba2[114*256+68] +100=proba2[114*256+69] +100=proba2[114*256+70] +100=proba2[114*256+71] +100=proba2[114*256+72] +100=proba2[114*256+73] +107=proba2[114*256+74] +96=proba2[114*256+75] +96=proba2[114*256+76] +93=proba2[114*256+77] +107=proba2[114*256+78] +100=proba2[114*256+79] +100=proba2[114*256+80] +96=proba2[114*256+81] +107=proba2[114*256+82] +89=proba2[114*256+83] +96=proba2[114*256+84] +96=proba2[114*256+85] +100=proba2[114*256+86] +107=proba2[114*256+87] +107=proba2[114*256+91] +96=proba2[114*256+95] +20=proba2[114*256+97] +41=proba2[114*256+98] +35=proba2[114*256+99] +30=proba2[114*256+100] +18=proba2[114*256+101] +45=proba2[114*256+102] +37=proba2[114*256+103] +54=proba2[114*256+104] +19=proba2[114*256+105] +56=proba2[114*256+106] +44=proba2[114*256+107] +38=proba2[114*256+108] +39=proba2[114*256+109] +36=proba2[114*256+110] +21=proba2[114*256+111] +44=proba2[114*256+112] +62=proba2[114*256+113] +35=proba2[114*256+114] +35=proba2[114*256+115] +28=proba2[114*256+116] +35=proba2[114*256+117] +46=proba2[114*256+118] +54=proba2[114*256+119] +66=proba2[114*256+120] +39=proba2[114*256+121] +57=proba2[114*256+122] +96=proba2[114*256+125] +26=proba1[115] +84=proba2[115*256+32] +84=proba2[115*256+33] +93=proba2[115*256+35] +93=proba2[115*256+36] +90=proba2[115*256+37] +86=proba2[115*256+38] +104=proba2[115*256+39] +104=proba2[115*256+41] +86=proba2[115*256+42] +84=proba2[115*256+43] +90=proba2[115*256+44] +83=proba2[115*256+45] +79=proba2[115*256+46] +50=proba2[115*256+48] +41=proba2[115*256+49] +45=proba2[115*256+50] +54=proba2[115*256+51] +56=proba2[115*256+52] +55=proba2[115*256+53] +55=proba2[115*256+54] +53=proba2[115*256+55] +59=proba2[115*256+56] +51=proba2[115*256+57] +104=proba2[115*256+59] +104=proba2[115*256+60] +104=proba2[115*256+61] +97=proba2[115*256+63] +88=proba2[115*256+64] +97=proba2[115*256+65] +104=proba2[115*256+66] +104=proba2[115*256+67] +83=proba2[115*256+68] +104=proba2[115*256+69] +93=proba2[115*256+70] +104=proba2[115*256+71] +97=proba2[115*256+72] +97=proba2[115*256+73] +104=proba2[115*256+75] +104=proba2[115*256+76] +86=proba2[115*256+77] +97=proba2[115*256+81] +97=proba2[115*256+82] +104=proba2[115*256+83] +97=proba2[115*256+84] +104=proba2[115*256+86] +104=proba2[115*256+87] +104=proba2[115*256+89] +81=proba2[115*256+95] +104=proba2[115*256+96] +22=proba2[115*256+97] +43=proba2[115*256+98] +30=proba2[115*256+99] +43=proba2[115*256+100] +21=proba2[115*256+101] +48=proba2[115*256+102] +47=proba2[115*256+103] +33=proba2[115*256+104] +25=proba2[115*256+105] +54=proba2[115*256+106] +38=proba2[115*256+107] +40=proba2[115*256+108] +37=proba2[115*256+109] +41=proba2[115*256+110] +26=proba2[115*256+111] +33=proba2[115*256+112] +53=proba2[115*256+113] +48=proba2[115*256+114] +23=proba2[115*256+115] +19=proba2[115*256+116] +34=proba2[115*256+117] +53=proba2[115*256+118] +46=proba2[115*256+119] +56=proba2[115*256+120] +37=proba2[115*256+121] +60=proba2[115*256+122] +31=proba1[116] +87=proba2[116*256+32] +77=proba2[116*256+33] +92=proba2[116*256+36] +83=proba2[116*256+38] +92=proba2[116*256+39] +90=proba2[116*256+42] +97=proba2[116*256+43] +103=proba2[116*256+44] +79=proba2[116*256+45] +90=proba2[116*256+46] +54=proba2[116*256+48] +44=proba2[116*256+49] +48=proba2[116*256+50] +56=proba2[116*256+51] +57=proba2[116*256+52] +60=proba2[116*256+53] +57=proba2[116*256+54] +57=proba2[116*256+55] +61=proba2[116*256+56] +54=proba2[116*256+57] +103=proba2[116*256+59] +97=proba2[116*256+61] +86=proba2[116*256+64] +87=proba2[116*256+65] +92=proba2[116*256+66] +97=proba2[116*256+68] +92=proba2[116*256+69] +103=proba2[116*256+71] +103=proba2[116*256+72] +97=proba2[116*256+73] +97=proba2[116*256+74] +103=proba2[116*256+76] +90=proba2[116*256+77] +92=proba2[116*256+78] +97=proba2[116*256+79] +103=proba2[116*256+80] +103=proba2[116*256+81] +87=proba2[116*256+82] +92=proba2[116*256+84] +103=proba2[116*256+85] +103=proba2[116*256+86] +97=proba2[116*256+88] +92=proba2[116*256+89] +81=proba2[116*256+95] +21=proba2[116*256+97] +46=proba2[116*256+98] +38=proba2[116*256+99] +48=proba2[116*256+100] +17=proba2[116*256+101] +50=proba2[116*256+102] +51=proba2[116*256+103] +24=proba2[116*256+104] +21=proba2[116*256+105] +55=proba2[116*256+106] +58=proba2[116*256+107] +43=proba2[116*256+108] +42=proba2[116*256+109] +47=proba2[116*256+110] +20=proba2[116*256+111] +47=proba2[116*256+112] +67=proba2[116*256+113] +25=proba2[116*256+114] +37=proba2[116*256+115] +29=proba2[116*256+116] +34=proba2[116*256+117] +54=proba2[116*256+118] +49=proba2[116*256+119] +60=proba2[116*256+120] +37=proba2[116*256+121] +48=proba2[116*256+122] +103=proba2[116*256+124] +51=proba1[117] +102=proba2[117*256+32] +81=proba2[117*256+33] +95=proba2[117*256+35] +91=proba2[117*256+36] +102=proba2[117*256+37] +88=proba2[117*256+38] +102=proba2[117*256+40] +86=proba2[117*256+42] +102=proba2[117*256+43] +95=proba2[117*256+44] +81=proba2[117*256+45] +84=proba2[117*256+46] +58=proba2[117*256+48] +47=proba2[117*256+49] +50=proba2[117*256+50] +58=proba2[117*256+51] +61=proba2[117*256+52] +60=proba2[117*256+53] +57=proba2[117*256+54] +58=proba2[117*256+55] +63=proba2[117*256+56] +57=proba2[117*256+57] +102=proba2[117*256+59] +102=proba2[117*256+61] +102=proba2[117*256+63] +102=proba2[117*256+64] +102=proba2[117*256+65] +91=proba2[117*256+66] +91=proba2[117*256+68] +88=proba2[117*256+70] +95=proba2[117*256+71] +102=proba2[117*256+72] +102=proba2[117*256+73] +86=proba2[117*256+75] +88=proba2[117*256+76] +102=proba2[117*256+77] +102=proba2[117*256+78] +91=proba2[117*256+79] +91=proba2[117*256+80] +86=proba2[117*256+82] +88=proba2[117*256+83] +88=proba2[117*256+84] +102=proba2[117*256+85] +102=proba2[117*256+87] +91=proba2[117*256+88] +102=proba2[117*256+90] +102=proba2[117*256+91] +102=proba2[117*256+93] +84=proba2[117*256+95] +35=proba2[117*256+97] +32=proba2[117*256+98] +29=proba2[117*256+99] +28=proba2[117*256+100] +27=proba2[117*256+101] +40=proba2[117*256+102] +36=proba2[117*256+103] +51=proba2[117*256+104] +27=proba2[117*256+105] +49=proba2[117*256+106] +42=proba2[117*256+107] +23=proba2[117*256+108] +32=proba2[117*256+109] +26=proba2[117*256+110] +51=proba2[117*256+111] +33=proba2[117*256+112] +60=proba2[117*256+113] +20=proba2[117*256+114] +23=proba2[117*256+115] +29=proba2[117*256+116] +59=proba2[117*256+117] +43=proba2[117*256+118] +61=proba2[117*256+119] +37=proba2[117*256+120] +45=proba2[117*256+121] +43=proba2[117*256+122] +38=proba1[118] +72=proba2[118*256+33] +85=proba2[118*256+35] +85=proba2[118*256+36] +85=proba2[118*256+38] +85=proba2[118*256+42] +85=proba2[118*256+43] +92=proba2[118*256+44] +92=proba2[118*256+45] +74=proba2[118*256+46] +57=proba2[118*256+48] +47=proba2[118*256+49] +50=proba2[118*256+50] +57=proba2[118*256+51] +56=proba2[118*256+52] +54=proba2[118*256+53] +57=proba2[118*256+54] +56=proba2[118*256+55] +55=proba2[118*256+56] +55=proba2[118*256+57] +85=proba2[118*256+61] +81=proba2[118*256+64] +81=proba2[118*256+65] +85=proba2[118*256+66] +92=proba2[118*256+67] +92=proba2[118*256+68] +85=proba2[118*256+69] +92=proba2[118*256+71] +78=proba2[118*256+72] +85=proba2[118*256+75] +92=proba2[118*256+76] +92=proba2[118*256+77] +92=proba2[118*256+79] +92=proba2[118*256+80] +85=proba2[118*256+81] +92=proba2[118*256+84] +81=proba2[118*256+85] +85=proba2[118*256+95] +16=proba2[118*256+97] +42=proba2[118*256+98] +44=proba2[118*256+99] +42=proba2[118*256+100] +14=proba2[118*256+101] +50=proba2[118*256+102] +50=proba2[118*256+103] +51=proba2[118*256+104] +13=proba2[118*256+105] +55=proba2[118*256+106] +56=proba2[118*256+107] +42=proba2[118*256+108] +45=proba2[118*256+109] +49=proba2[118*256+110] +27=proba2[118*256+111] +47=proba2[118*256+112] +59=proba2[118*256+113] +34=proba2[118*256+114] +45=proba2[118*256+115] +46=proba2[118*256+116] +46=proba2[118*256+117] +48=proba2[118*256+118] +58=proba2[118*256+119] +57=proba2[118*256+120] +44=proba2[118*256+121] +61=proba2[118*256+122] +43=proba1[119] +86=proba2[119*256+32] +86=proba2[119*256+33] +86=proba2[119*256+34] +72=proba2[119*256+37] +86=proba2[119*256+38] +79=proba2[119*256+42] +86=proba2[119*256+44] +79=proba2[119*256+45] +79=proba2[119*256+46] +56=proba2[119*256+48] +47=proba2[119*256+49] +45=proba2[119*256+50] +50=proba2[119*256+51] +52=proba2[119*256+52] +57=proba2[119*256+53] +55=proba2[119*256+54] +52=proba2[119*256+55] +55=proba2[119*256+56] +53=proba2[119*256+57] +79=proba2[119*256+65] +86=proba2[119*256+68] +86=proba2[119*256+69] +79=proba2[119*256+70] +86=proba2[119*256+71] +86=proba2[119*256+72] +86=proba2[119*256+73] +79=proba2[119*256+74] +86=proba2[119*256+77] +79=proba2[119*256+81] +79=proba2[119*256+83] +86=proba2[119*256+84] +75=proba2[119*256+86] +86=proba2[119*256+89] +86=proba2[119*256+90] +79=proba2[119*256+95] +16=proba2[119*256+97] +42=proba2[119*256+98] +46=proba2[119*256+99] +43=proba2[119*256+100] +14=proba2[119*256+101] +46=proba2[119*256+102] +47=proba2[119*256+103] +38=proba2[119*256+104] +20=proba2[119*256+105] +53=proba2[119*256+106] +46=proba2[119*256+107] +44=proba2[119*256+108] +47=proba2[119*256+109] +39=proba2[119*256+110] +22=proba2[119*256+111] +49=proba2[119*256+112] +55=proba2[119*256+113] +42=proba2[119*256+114] +34=proba2[119*256+115] +46=proba2[119*256+116] +45=proba2[119*256+117] +59=proba2[119*256+118] +36=proba2[119*256+119] +43=proba2[119*256+120] +40=proba2[119*256+121] +49=proba2[119*256+122] +51=proba1[120] +82=proba2[120*256+37] +76=proba2[120*256+38] +82=proba2[120*256+39] +82=proba2[120*256+42] +82=proba2[120*256+43] +76=proba2[120*256+44] +61=proba2[120*256+45] +66=proba2[120*256+46] +40=proba2[120*256+48] +31=proba2[120*256+49] +35=proba2[120*256+50] +39=proba2[120*256+51] +44=proba2[120*256+52] +47=proba2[120*256+53] +42=proba2[120*256+54] +42=proba2[120*256+55] +45=proba2[120*256+56] +41=proba2[120*256+57] +82=proba2[120*256+59] +82=proba2[120*256+63] +82=proba2[120*256+64] +82=proba2[120*256+65] +82=proba2[120*256+68] +82=proba2[120*256+70] +76=proba2[120*256+71] +76=proba2[120*256+72] +82=proba2[120*256+76] +76=proba2[120*256+77] +76=proba2[120*256+80] +76=proba2[120*256+81] +82=proba2[120*256+82] +82=proba2[120*256+83] +82=proba2[120*256+84] +76=proba2[120*256+85] +82=proba2[120*256+86] +82=proba2[120*256+87] +82=proba2[120*256+88] +82=proba2[120*256+90] +82=proba2[120*256+93] +82=proba2[120*256+95] +24=proba2[120*256+97] +38=proba2[120*256+98] +32=proba2[120*256+99] +40=proba2[120*256+100] +25=proba2[120*256+101] +37=proba2[120*256+102] +44=proba2[120*256+103] +48=proba2[120*256+104] +24=proba2[120*256+105] +48=proba2[120*256+106] +49=proba2[120*256+107] +38=proba2[120*256+108] +34=proba2[120*256+109] +45=proba2[120*256+110] +31=proba2[120*256+111] +32=proba2[120*256+112] +51=proba2[120*256+113] +41=proba2[120*256+114] +36=proba2[120*256+115] +31=proba2[120*256+116] +40=proba2[120*256+117] +45=proba2[120*256+118] +42=proba2[120*256+119] +24=proba2[120*256+120] +33=proba2[120*256+121] +45=proba2[120*256+122] +45=proba1[121] +75=proba2[121*256+32] +72=proba2[121*256+33] +91=proba2[121*256+34] +80=proba2[121*256+36] +78=proba2[121*256+38] +91=proba2[121*256+39] +91=proba2[121*256+41] +69=proba2[121*256+42] +78=proba2[121*256+44] +69=proba2[121*256+45] +84=proba2[121*256+46] +43=proba2[121*256+48] +34=proba2[121*256+49] +38=proba2[121*256+50] +48=proba2[121*256+51] +46=proba2[121*256+52] +51=proba2[121*256+53] +47=proba2[121*256+54] +44=proba2[121*256+55] +49=proba2[121*256+56] +43=proba2[121*256+57] +91=proba2[121*256+59] +78=proba2[121*256+63] +91=proba2[121*256+64] +84=proba2[121*256+65] +84=proba2[121*256+66] +80=proba2[121*256+67] +73=proba2[121*256+68] +91=proba2[121*256+69] +91=proba2[121*256+72] +84=proba2[121*256+74] +84=proba2[121*256+76] +78=proba2[121*256+77] +91=proba2[121*256+78] +84=proba2[121*256+80] +91=proba2[121*256+82] +80=proba2[121*256+83] +66=proba2[121*256+84] +78=proba2[121*256+85] +80=proba2[121*256+88] +91=proba2[121*256+89] +91=proba2[121*256+93] +78=proba2[121*256+95] +22=proba2[121*256+97] +28=proba2[121*256+98] +33=proba2[121*256+99] +35=proba2[121*256+100] +27=proba2[121*256+101] +44=proba2[121*256+102] +32=proba2[121*256+103] +49=proba2[121*256+104] +48=proba2[121*256+105] +47=proba2[121*256+106] +44=proba2[121*256+107] +27=proba2[121*256+108] +32=proba2[121*256+109] +31=proba2[121*256+110] +24=proba2[121*256+111] +35=proba2[121*256+112] +63=proba2[121*256+113] +30=proba2[121*256+114] +25=proba2[121*256+115] +37=proba2[121*256+116] +39=proba2[121*256+117] +37=proba2[121*256+118] +48=proba2[121*256+119] +48=proba2[121*256+120] +47=proba2[121*256+121] +45=proba2[121*256+122] +44=proba1[122] +80=proba2[122*256+33] +87=proba2[122*256+34] +87=proba2[122*256+35] +87=proba2[122*256+36] +87=proba2[122*256+37] +80=proba2[122*256+38] +76=proba2[122*256+40] +87=proba2[122*256+42] +76=proba2[122*256+44] +73=proba2[122*256+45] +53=proba2[122*256+48] +46=proba2[122*256+49] +46=proba2[122*256+50] +46=proba2[122*256+51] +49=proba2[122*256+52] +53=proba2[122*256+53] +49=proba2[122*256+54] +52=proba2[122*256+55] +49=proba2[122*256+56] +52=proba2[122*256+57] +87=proba2[122*256+59] +80=proba2[122*256+64] +80=proba2[122*256+65] +87=proba2[122*256+66] +87=proba2[122*256+67] +87=proba2[122*256+68] +87=proba2[122*256+70] +80=proba2[122*256+71] +80=proba2[122*256+73] +80=proba2[122*256+75] +87=proba2[122*256+76] +73=proba2[122*256+77] +87=proba2[122*256+78] +87=proba2[122*256+81] +87=proba2[122*256+83] +87=proba2[122*256+85] +87=proba2[122*256+87] +80=proba2[122*256+88] +73=proba2[122*256+89] +80=proba2[122*256+95] +18=proba2[122*256+97] +44=proba2[122*256+98] +48=proba2[122*256+99] +46=proba2[122*256+100] +17=proba2[122*256+101] +51=proba2[122*256+102] +47=proba2[122*256+103] +41=proba2[122*256+104] +21=proba2[122*256+105] +60=proba2[122*256+106] +50=proba2[122*256+107] +44=proba2[122*256+108] +38=proba2[122*256+109] +48=proba2[122*256+110] +18=proba2[122*256+111] +50=proba2[122*256+112] +53=proba2[122*256+113] +46=proba2[122*256+114] +49=proba2[122*256+115] +45=proba2[122*256+116] +34=proba2[122*256+117] +54=proba2[122*256+118] +47=proba2[122*256+119] +45=proba2[122*256+120] +35=proba2[122*256+121] +24=proba2[122*256+122] +87=proba2[122*256+126] +104=proba1[123] +19=proba2[123*256+75] +19=proba2[123*256+91] +19=proba2[123*256+97] +19=proba2[123*256+102] +19=proba2[123*256+114] +19=proba2[123*256+122] +19=proba2[123*256+124] +111=proba1[124] +20=proba2[124*256+38] +20=proba2[124*256+41] +20=proba2[124*256+45] +20=proba2[124*256+53] +20=proba2[124*256+82] +20=proba2[124*256+106] +20=proba2[124*256+108] +20=proba2[124*256+109] +118=proba1[125] +13=proba2[125*256+54] +13=proba2[125*256+66] +13=proba2[125*256+101] +13=proba2[125*256+115] +111=proba1[126] +13=proba2[126*256+86] +13=proba2[126*256+98] +13=proba2[126*256+115] +13=proba2[126*256+122]