// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) braces deadcode fieldsfirst 
// Source File Name:   CharacterSetUTFE.java
// Class Version:      45.3

package oracle.sql;

import java.sql.SQLException;

// Referenced classes of package oracle.sql:
//            CharacterSet, CharacterBuffer, CharacterRepConstants, CharacterWalker

// flag ACC_SUPER is set
class CharacterSetUTFE extends CharacterSet
    implements CharacterRepConstants
{
    // Constants:          120
    // Interfaces:         1
    // Fields:             3
    // Methods:            14
    // Class Attributes:   1


    static final int MAXBYTEPERCHAR = 4;
    static int utf8m2utfe[][] = {
        {
            0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 
            21, 11, 12, 13, 14, 15
        }, {
            16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 
            63, 39, 28, 29, 30, 31
        }, {
            64, 90, 127, 123, 91, 108, 80, 125, 77, 93, 
            92, 78, 107, 96, 75, 97
        }, {
            -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, 
            122, 94, 76, 126, 110, 111
        }, {
            124, -63, -62, -61, -60, -59, -58, -57, -56, -55, 
            -47, -46, -45, -44, -43, -42
        }, {
            -41, -40, -39, -30, -29, -28, -27, -26, -25, -24, 
            -23, -83, -32, -67, 95, 109
        }, {
            121, -127, -126, -125, -124, -123, -122, -121, -120, -119, 
            -111, -110, -109, -108, -107, -106
        }, {
            -105, -104, -103, -94, -93, -92, -91, -90, -89, -88, 
            -87, -64, 79, -48, -95, 7
        }, {
            32, 33, 34, 35, 36, 37, 6, 23, 40, 41, 
            42, 43, 44, 9, 10, 27
        }, {
            48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 
            58, 59, 4, 20, 62, -1
        }, {
            65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
            81, 82, 83, 84, 85, 86
        }, {
            87, 88, 89, 98, 99, 100, 101, 102, 103, 104, 
            105, 106, 112, 113, 114, 115
        }, {
            116, 117, 118, 119, 120, -128, -118, -117, -116, -115, 
            -114, -113, -112, -102, -101, -100
        }, {
            -99, -98, -97, -96, -86, -85, -84, -82, -81, -80, 
            -79, -78, -77, -76, -75, -74
        }, {
            -73, -72, -71, -70, -69, -68, -66, -65, -54, -53, 
            -52, -51, -50, -49, -38, -37
        }, {
            -36, -35, -34, -33, -31, -22, -21, -20, -19, -18, 
            -17, -6, -5, -4, -3, -2
        }
    };
    static byte utfe2utf8m[][] = {
        {
            0, 1, 2, 3, -100, 9, -122, 127, -105, -115, 
            -114, 11, 12, 13, 14, 15
        }, {
            16, 17, 18, 19, -99, 10, 8, -121, 24, 25, 
            -110, -113, 28, 29, 30, 31
        }, {
            -128, -127, -126, -125, -124, -123, 23, 27, -120, -119, 
            -118, -117, -116, 5, 6, 7
        }, {
            -112, -111, 22, -109, -108, -107, -106, 4, -104, -103, 
            -102, -101, 20, 21, -98, 26
        }, {
            32, -96, -95, -94, -93, -92, -91, -90, -89, -88, 
            -87, 46, 60, 40, 43, 124
        }, {
            38, -86, -85, -84, -83, -82, -81, -80, -79, -78, 
            33, 36, 42, 41, 59, 94
        }, {
            45, 47, -77, -76, -75, -74, -73, -72, -71, -70, 
            -69, 44, 37, 95, 62, 63
        }, {
            -68, -67, -66, -65, -64, -63, -62, -61, -60, 96, 
            58, 35, 64, 39, 61, 34
        }, {
            -59, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
            -58, -57, -56, -55, -54, -53
        }, {
            -52, 106, 107, 108, 109, 110, 111, 112, 113, 114, 
            -51, -50, -49, -48, -47, -46
        }, {
            -45, 126, 115, 116, 117, 118, 119, 120, 121, 122, 
            -44, -43, -42, 88, -41, -40
        }, {
            -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, 
            -29, -28, -27, 93, -26, -25
        }, {
            123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
            -24, -23, -22, -21, -20, -19
        }, {
            13, 74, 75, 76, 77, 78, 79, 80, 81, 82, 
            -18, -17, -16, -15, -14, -13
        }, {
            92, -12, 83, 84, 85, 86, 87, 88, 89, 90, 
            -11, -10, -9, -8, -7, -6
        }, {
            48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
            -5, -4, -3, -2, -1, -97
        }
    };

    // Decompiling method: <init>  Signature: (I)V
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 11 bytes, Code offset: 7574
    // Line Number Table found: 3 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 11 Range 0 10 Init 0 fixed
    // Parameter  1 added: Name i Type I At 0 11 Range 0 10 Init 0
    // RetValue   2 added: Name <returnValue> Type V At 0 11 Range 0 10 Init 0 fixed
    CharacterSetUTFE(int i)
    {
        super(i);
        rep = 3;
        return;
    }

    // Decompiling method: convert  Signature: (Ljava/lang/String;)[B
    // Max stack: 5, #locals: 10, #params: 2
    // Code length: 526 bytes, Code offset: 7631
    // Line Number Table found: 70 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 526 Range 0 525 Init 0 fixed
    // Parameter  1 added: Name s Type Ljava/lang/String; At 0 526 Range 0 525 Init 0
    // RetValue  10 added: Name <returnValue> Type [B At 0 526 Range 0 525 Init 0 fixed
    // LocalVar   2 added: Name i Type I At 6 496 Range 6 501 Init 6
    // LocalVar   3 added: Name abyte0 Type [B At 10 515 Range 10 524 Init 10
    // LocalVar   4 added: Name flag Type Z At 12 506 Range 12 517 Init 12
    // LocalVar   7 added: Name j Type I At 18 478 Range 18 495 Init 18
    // LocalVar   8 added: Name flag1 Type Z At 21 473 Range 21 493 Init 21
    // LocalVar   8 chged: Name k Oname flag1 Type I At 492 2 Range 21 493 Init 21
    // LocalVar   4 chged: Name l Oname flag Type I At 499 2 Range 12 517 Init 12
    // LocalVar   9 added: Name abyte1 Type [B At 509 14 Range 509 522 Init 509
    // LocalVar   5 added: Name c Type C At 32 423 Range 32 454 Init 32
    // LocalVar   6 added: Name i1 Type I At 58 21 Range 58 78 Init 58
    // LocalVar   6 added: Name j1 Type I At 143 21 Range 143 163 Init 143
    // LocalVar   6 added: Name k1 Type I At 179 21 Range 179 199 Init 179
    // LocalVar   6 added: Name l1 Type I At 230 21 Range 230 250 Init 230
    // LocalVar   6 added: Name i2 Type I At 269 21 Range 269 289 Init 269
    // LocalVar   6 added: Name j2 Type I At 305 21 Range 305 325 Init 305
    // LocalVar   6 added: Name k2 Type I At 347 21 Range 347 367 Init 347
    // LocalVar   6 added: Name l2 Type I At 387 21 Range 387 407 Init 387
    // LocalVar   6 added: Name i3 Type I At 426 21 Range 426 446 Init 426
    // LocalVar   6 added: Name j3 Type I At 462 21 Range 462 482 Init 462
    // LocalVar   6 name k1(I) merged out into j1(I)
    // LocalVar   6 name i2(I) merged out into l1(I)
    // LocalVar   6 name j2(I) merged out into l1(I)
    // LocalVar   6 name l2(I) merged out into k2(I)
    // LocalVar   6 name i3(I) merged out into k2(I)
    // LocalVar   6 name j3(I) merged out into k2(I)
    public byte[] convert(String s)
        throws SQLException
    {
        int i = s.length() * 4;
        byte abyte0[] = new byte[i];
        int j = 0;
        int k1 = s.length();
        for(int l1 = 0; l1 < k1; l1++)
        {
            char c = s.charAt(l1);
            if(c > '\uFFFF')
            {
                CharacterSet.failCharacterConversion(this);
            }
            if(c <= '\037')
            {
                int k = c | 0x80;
                abyte0[j++] = (byte)utf8m2utfe[high(k)][low(k)];
            } else
            if(c <= '\177')
            {
                abyte0[j++] = (byte)utf8m2utfe[high(c)][low(c)];
            } else
            if(c <= '\u03FF')
            {
                int l = (c & 0x3e0) >> 5 | 0xc0;
                abyte0[j++] = (byte)utf8m2utfe[high(l)][low(l)];
                l = c & 0x1f | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(l)][low(l)];
            } else
            if(c <= '\u3FFF')
            {
                int i1 = (c & 0x3c00) >> 10 | 0xe0;
                abyte0[j++] = (byte)utf8m2utfe[high(i1)][low(i1)];
                i1 = (c & 0x3e0) >> 5 | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(i1)][low(i1)];
                i1 = c & 0x1f | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(i1)][low(i1)];
            } else
            {
                int j1 = (c & 0x8000) >> 15 | 0xf0;
                abyte0[j++] = (byte)utf8m2utfe[high(j1)][low(j1)];
                j1 = (c & 0x7c00) >> 10 | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(j1)][low(j1)];
                j1 = (c & 0x3e0) >> 5 | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(j1)][low(j1)];
                j1 = c & 0x1f | 0xa0;
                abyte0[j++] = (byte)utf8m2utfe[high(j1)][low(j1)];
            }
        }

        if(j < i)
        {
            byte abyte1[] = new byte[j];
            System.arraycopy(abyte0, 0, abyte1, 0, j);
            return abyte1;
        } else
        {
            return abyte0;
        }
    }

    // Decompiling method: convert  Signature: (Loracle/sql/CharacterSet;[BII)[B
    // Max stack: 4, #locals: 7, #params: 5
    // Code length: 41 bytes, Code offset: 8481
    // Line Number Table found: 6 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 41 Range 0 40 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 41 Range 0 40 Init 0
    // Parameter  2 added: Name abyte0 Type [B At 0 41 Range 0 40 Init 0
    // Parameter  3 added: Name i Type I At 0 41 Range 0 40 Init 0
    // Parameter  4 added: Name j Type I At 0 41 Range 0 40 Init 0
    // RetValue   7 added: Name <returnValue> Type [B At 0 41 Range 0 40 Init 0 fixed
    // LocalVar   5 added: Name abyte1 Type [B At 15 25 Range 15 39 Init 15
    // LocalVar   6 added: Name s Type Ljava/lang/String; At 28 5 Range 28 32 Init 28
    public byte[] convert(CharacterSet characterset, byte abyte0[], int i, int j)
        throws SQLException
    {
        byte abyte1[];
        if(characterset.rep == 3)
        {
            abyte1 = CharacterSet.useOrCopy(abyte0, i, j);
        } else
        {
            String s = characterset.toString(abyte0, i, j);
            abyte1 = convert(s);
        }
        return abyte1;
    }

    // Decompiling method: convertWithReplacement  Signature: (Ljava/lang/String;)[B
    // Max stack: 4, #locals: 3, #params: 2
    // Code length: 31 bytes, Code offset: 8590
    // Exception table: 1 entries
    //           start  0 end 6 handler 9 type SQLException
    // Line Number Table found: 6 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 31 Range 0 30 Init 0 fixed
    // Parameter  1 added: Name s Type Ljava/lang/String; At 0 31 Range 0 30 Init 0
    // RetValue   3 added: Name <returnValue> Type [B At 0 31 Range 0 30 Init 0 fixed
    // LocalVar   2 added: Name abyte0 Type [B At 5 25 Range 5 29 Init 5
    public byte[] convertWithReplacement(String s)
    {
        byte abyte0[];
        try
        {
            abyte0 = convert(s);
        }
        catch(SQLException _ex)
        {
            abyte0 = (new byte[] {
                63, 63, 63
            });
        }
        return abyte0;
    }

    // Decompiling method: decode  Signature: (Loracle/sql/CharacterWalker;)I
    // Max stack: 4, #locals: 10, #params: 2
    // Code length: 510 bytes, Code offset: 8687
    // Line Number Table found: 48 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 510 Range 0 509 Init 0 fixed
    // Parameter  1 added: Name characterwalker Type Loracle/sql/CharacterWalker; At 0 510 Range 0 509 Init 0
    // RetValue  10 added: Name <returnValue> Type I At 0 510 Range 0 509 Init 0 fixed
    // LocalVar   6 added: Name abyte0 Type [B At 4 435 Range 4 438 Init 4
    // LocalVar   7 added: Name i Type I At 10 494 Range 10 503 Init 10
    // LocalVar   8 added: Name j Type I At 16 9 Range 16 24 Init 16
    // LocalVar   9 added: Name flag Type Z At 19 490 Range 19 508 Init 19
    // LocalVar   2 added: Name byte0 Type B At 57 278 Range 57 334 Init 57
    // LocalVar   9 chged: Name k Oname flag Type I At 148 361 Range 19 508 Init 19
    // LocalVar   3 added: Name byte1 Type B At 194 19 Range 194 212 Init 194
    // LocalVar   3 added: Name byte2 Type B At 254 63 Range 254 316 Init 254
    // LocalVar   4 added: Name byte3 Type B At 295 30 Range 295 324 Init 295
    // LocalVar   2 added: Name byte4 Type B At 338 129 Range 338 466 Init 338
    // LocalVar   3 added: Name byte5 Type B At 365 106 Range 365 470 Init 365
    // LocalVar   4 added: Name byte6 Type B At 406 74 Range 406 479 Init 406
    // LocalVar   5 added: Name byte7 Type B At 449 39 Range 449 487 Init 449
    // LocalVar   2 name byte4(B) merged out into byte0(B)
    int decode(CharacterWalker characterwalker)
        throws SQLException
    {
        byte abyte0[] = characterwalker.bytes;
        int i = characterwalker.next;
        int j = characterwalker.end;
        int k = 0;
        if(i >= j)
        {
            CharacterSet.failUTFConversion();
        }
        byte byte0 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
        switch(byte0 >> 4 & 0xf)
        {
        case 0: // '\0'
        case 1: // '\001'
        case 2: // '\002'
        case 3: // '\003'
        case 4: // '\004'
        case 5: // '\005'
        case 6: // '\006'
        case 7: // '\007'
            k = byte0 & 0x7f;
            break;

        case 8: // '\b'
        case 9: // '\t'
            k = byte0 & 0x1f;
            break;

        case 12: // '\f'
        case 13: // '\r'
            byte0 &= 0x1f;
            byte byte1 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte1 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            k = byte0 << 5 | byte1 & 0x1f;
            break;

        case 14: // '\016'
            byte0 &= 0xf;
            byte byte2 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte2 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            byte byte4 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte4 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            k = byte0 << 10 | (byte2 & 0x1f) << 5 | byte4 & 0x1f;
            break;

        case 15: // '\017'
            byte0 &= 0x1;
            byte byte3 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte3 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            byte byte5 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte5 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            byte byte6 = utfe2utf8m[high(abyte0[i])][low(abyte0[i++])];
            if((byte6 >> 5 & 0x7) != 5)
            {
                CharacterSet.failCharacterConversion(this);
            }
            k = byte0 << 15 | (byte3 & 0x1f) << 10 | (byte5 & 0x1f) << 5 | byte6 & 0x1f;
            break;

        case 10: // '\n'
        case 11: // '\013'
        default:
            CharacterSet.failCharacterConversion(this);
            break;
        }
        characterwalker.next = i;
        return k;
    }

    // Decompiling method: encode  Signature: (Loracle/sql/CharacterBuffer;I)V
    // Max stack: 5, #locals: 5, #params: 3
    // Code length: 555 bytes, Code offset: 9433
    // Line Number Table found: 63 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 555 Range 0 554 Init 0 fixed
    // Parameter  1 added: Name characterbuffer Type Loracle/sql/CharacterBuffer; At 0 555 Range 0 554 Init 0
    // Parameter  2 added: Name i Type I At 0 555 Range 0 554 Init 0
    // RetValue   5 added: Name <returnValue> Type V At 0 555 Range 0 554 Init 0 fixed
    // LocalVar   4 added: Name ac Type [C At 20 2 Range 20 21 Init 20
    // LocalVar   3 added: Name j Type I At 48 27 Range 48 74 Init 48
    // LocalVar   3 added: Name k Type I At 153 27 Range 153 179 Init 153
    // LocalVar   3 added: Name l Type I At 194 27 Range 194 220 Init 194
    // LocalVar   3 added: Name i1 Type I At 254 27 Range 254 280 Init 254
    // LocalVar   3 added: Name j1 Type I At 298 27 Range 298 324 Init 298
    // LocalVar   3 added: Name k1 Type I At 339 27 Range 339 365 Init 339
    // LocalVar   3 added: Name l1 Type I At 391 27 Range 391 417 Init 391
    // LocalVar   3 added: Name i2 Type I At 436 27 Range 436 462 Init 436
    // LocalVar   3 added: Name j2 Type I At 480 27 Range 480 506 Init 480
    // LocalVar   3 added: Name k2 Type I At 521 27 Range 521 547 Init 521
    // LocalVar   3 name l(I) merged out into k(I)
    // LocalVar   3 name j1(I) merged out into i1(I)
    // LocalVar   3 name k1(I) merged out into i1(I)
    // LocalVar   3 name i2(I) merged out into l1(I)
    // LocalVar   3 name j2(I) merged out into l1(I)
    // LocalVar   3 name k2(I) merged out into l1(I)
    void encode(CharacterBuffer characterbuffer, int i)
        throws SQLException
    {
        if(i > 65535)
        {
            CharacterSet.failUTFConversion();
        } else
        {
            char ac[] = {
                (char)i
            };
            if(i > 65535)
            {
                CharacterSet.failCharacterConversion(this);
            }
            if(i <= 31)
            {
                CharacterSet.need(characterbuffer, 1);
                int j = i | 0x80;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(j)][low(j)];
            } else
            if(i <= 127)
            {
                CharacterSet.need(characterbuffer, 1);
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(i)][low(i)];
            } else
            if(i <= 1023)
            {
                CharacterSet.need(characterbuffer, 2);
                int k = (i & 0x3e0) >> 5 | 0xc0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(k)][low(k)];
                k = i & 0x1f | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(k)][low(k)];
            } else
            if(i <= 16383)
            {
                CharacterSet.need(characterbuffer, 3);
                int l = (i & 0x3c00) >> 10 | 0xe0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(l)][low(l)];
                l = (i & 0x3e0) >> 5 | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(l)][low(l)];
                l = i & 0x1f | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(l)][low(l)];
            } else
            {
                CharacterSet.need(characterbuffer, 4);
                int i1 = (i & 0x8000) >> 15 | 0xf0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(i1)][low(i1)];
                i1 = (i & 0x7c00) >> 10 | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(i1)][low(i1)];
                i1 = (i & 0x3e0) >> 5 | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(i1)][low(i1)];
                i1 = i & 0x1f | 0xa0;
                characterbuffer.bytes[characterbuffer.next++] = (byte)utf8m2utfe[high(i1)][low(i1)];
            }
        }
        return;
    }

    // Decompiling method: high  Signature: (I)I
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 7 bytes, Code offset: 10284
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 7 Range 0 6 Init 0 fixed
    // Parameter  1 added: Name i Type I At 0 7 Range 0 6 Init 0
    // RetValue   2 added: Name <returnValue> Type I At 0 7 Range 0 6 Init 0 fixed
    private int high(int i)
    {
        return i >> 4 & 0xf;
    }

    // Decompiling method: isConvertibleFrom  Signature: (Loracle/sql/CharacterSet;)Z
    // Max stack: 2, #locals: 3, #params: 2
    // Code length: 18 bytes, Code offset: 10329
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 18 Range 0 17 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 18 Range 0 17 Init 0
    // RetValue   3 added: Name <returnValue> Type Z At 0 18 Range 0 17 Init 0 fixed
    // LocalVar   2 added: Name flag Type Z At 15 2 Range 15 16 Init 15
    public boolean isConvertibleFrom(CharacterSet characterset)
    {
        boolean flag = characterset.rep <= 1024;
        return flag;
    }

    // Decompiling method: isLossyFrom  Signature: (Loracle/sql/CharacterSet;)Z
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 7 bytes, Code offset: 10389
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 7 Range 0 6 Init 0 fixed
    // Parameter  1 added: Name characterset Type Loracle/sql/CharacterSet; At 0 7 Range 0 6 Init 0
    // RetValue   2 added: Name <returnValue> Type Z At 0 7 Range 0 6 Init 0 fixed
    public boolean isLossyFrom(CharacterSet characterset)
    {
        return characterset.isUnicode() ^ true;
    }

    // Decompiling method: isUnicode  Signature: ()Z
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 2 bytes, Code offset: 10434
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 2 Range 0 1 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Z At 0 2 Range 0 1 Init 0 fixed
    public boolean isUnicode()
    {
        return true;
    }

    // Decompiling method: low  Signature: (I)I
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 5 bytes, Code offset: 10474
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 5 Range 0 4 Init 0 fixed
    // Parameter  1 added: Name i Type I At 0 5 Range 0 4 Init 0
    // RetValue   2 added: Name <returnValue> Type I At 0 5 Range 0 4 Init 0 fixed
    private int low(int i)
    {
        return i & 0xf;
    }

    // Decompiling method: toString  Signature: ([BII)Ljava/lang/String;
    // Max stack: 4, #locals: 4, #params: 4
    // Code length: 8 bytes, Code offset: 10517
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 8 Range 0 7 Init 0 fixed
    // Parameter  1 added: Name abyte0 Type [B At 0 8 Range 0 7 Init 0
    // Parameter  2 added: Name i Type I At 0 8 Range 0 7 Init 0
    // Parameter  3 added: Name j Type I At 0 8 Range 0 7 Init 0
    // RetValue   4 added: Name <returnValue> Type Ljava/lang/String; At 0 8 Range 0 7 Init 0 fixed
    public String toString(byte abyte0[], int i, int j)
        throws SQLException
    {
        return toStringWithReplacement(abyte0, i, j);
    }

    // Decompiling method: toStringWithReplacement  Signature: ([BII)Ljava/lang/String;
    // Max stack: 5, #locals: 12, #params: 4
    // Code length: 576 bytes, Code offset: 10573
    // Exception table: 1 entries
    //           start  16 end 539 handler 542 type SQLException
    // Line Number Table found: 51 entries
    // Parameter  0 added: Name this Type Loracle/sql/CharacterSetUTFE; At 0 576 Range 0 575 Init 0 fixed
    // Parameter  1 added: Name abyte0 Type [B At 0 576 Range 0 575 Init 0
    // Parameter  2 added: Name i Type I At 0 576 Range 0 575 Init 0
    // Parameter  3 added: Name j Type I At 0 576 Range 0 575 Init 0
    // RetValue  12 added: Name <returnValue> Type Ljava/lang/String; At 0 576 Range 0 575 Init 0 fixed
    // LocalVar   4 added: Name ac Type [C At 3 566 Range 3 568 Init 3
    // LocalVar   5 added: Name k Type I At 6 528 Range 6 533 Init 6
    // LocalVar   6 added: Name l Type I At 11 525 Range 11 535 Init 11
    // LocalVar   7 added: Name flag Type Z At 14 558 Range 14 571 Init 14
    // LocalVar   7 chged: Name i1 Oname flag Type I At 570 2 Range 14 571 Init 14
    // LocalVar   8 added: Name byte0 Type B At 43 317 Range 43 359 Init 43
    // LocalVar   9 added: Name byte1 Type B At 198 30 Range 198 227 Init 198
    // LocalVar   9 added: Name byte2 Type B At 269 72 Range 269 340 Init 269
    // LocalVar  10 added: Name byte3 Type B At 310 39 Range 310 348 Init 310
    // LocalVar   8 added: Name byte4 Type B At 363 134 Range 363 496 Init 363
    // LocalVar   9 added: Name byte5 Type B At 389 113 Range 389 501 Init 389
    // LocalVar  10 added: Name byte6 Type B At 430 81 Range 430 510 Init 430
    // LocalVar  11 added: Name byte7 Type B At 471 48 Range 471 518 Init 471
    // LocalVar   8 name byte4(B) merged out into byte0(B)
    public String toStringWithReplacement(byte abyte0[], int i, int j)
    {
        char ac[] = new char[j];
        int k = i;
        int l = i + j;
        int i1 = 0;
        try
        {
            while(k < l) 
            {
                byte byte0 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                switch(byte0 >> 4 & 0xf)
                {
                case 0: // '\0'
                case 1: // '\001'
                case 2: // '\002'
                case 3: // '\003'
                case 4: // '\004'
                case 5: // '\005'
                case 6: // '\006'
                case 7: // '\007'
                    ac[i1++] = (char)(byte0 & 0x7f);
                    break;

                case 8: // '\b'
                case 9: // '\t'
                    ac[i1++] = (char)(byte0 & 0x1f);
                    break;

                case 12: // '\f'
                case 13: // '\r'
                    byte0 &= 0x1f;
                    byte byte1 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte1 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    ac[i1++] = (char)(byte0 << 5 | byte1 & 0x1f);
                    break;

                case 14: // '\016'
                    byte0 &= 0xf;
                    byte byte2 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte2 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    byte byte4 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte4 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    ac[i1++] = (char)(byte0 << 10 | (byte2 & 0x1f) << 5 | byte4 & 0x1f);
                    break;

                case 15: // '\017'
                    byte0 &= 0x1;
                    byte byte3 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte3 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    byte byte5 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte5 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    byte byte6 = utfe2utf8m[high(abyte0[k])][low(abyte0[k++])];
                    if((byte6 >> 5 & 0x7) != 5)
                    {
                        CharacterSet.failCharacterConversion(this);
                    }
                    ac[i1++] = (char)(byte0 << 15 | (byte3 & 0x1f) << 10 | (byte5 & 0x1f) << 5 | byte6 & 0x1f);
                    break;

                case 10: // '\n'
                case 11: // '\013'
                default:
                    CharacterSet.failCharacterConversion(this);
                    break;
                }
            }
        }
        catch(SQLException _ex)
        {
            ac = (new char[] {
                '?', '?', '?'
            });
        }
        return new String(ac, 0, i1);
    }

    // Decompiling method: <clinit>  Signature: ()V
    // Max stack: 7, #locals: 0, #params: 0
    // Code length: 3119 bytes, Code offset: 1329
    // Line Number Table found: 773 entries
    // RetValue   0 added: Name <returnValue> Type V At 0 3119 Range 0 3118 Init 0 fixed
    static 
    {
        /* utf8m2utfe = (new int[][] {
            new int[] {
                0, 1, 2, 3, 55, 45, 46, 47, 22, 5, 
                21, 11, 12, 13, 14, 15
            }, new int[] {
                16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 
                63, 39, 28, 29, 30, 31
            }, new int[] {
                64, 90, 127, 123, 91, 108, 80, 125, 77, 93, 
                92, 78, 107, 96, 75, 97
            }, new int[] {
                -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, 
                122, 94, 76, 126, 110, 111
            }, new int[] {
                124, -63, -62, -61, -60, -59, -58, -57, -56, -55, 
                -47, -46, -45, -44, -43, -42
            }, new int[] {
                -41, -40, -39, -30, -29, -28, -27, -26, -25, -24, 
                -23, -83, -32, -67, 95, 109
            }, new int[] {
                121, -127, -126, -125, -124, -123, -122, -121, -120, -119, 
                -111, -110, -109, -108, -107, -106
            }, new int[] {
                -105, -104, -103, -94, -93, -92, -91, -90, -89, -88, 
                -87, -64, 79, -48, -95, 7
            }, new int[] {
                32, 33, 34, 35, 36, 37, 6, 23, 40, 41, 
                42, 43, 44, 9, 10, 27
            }, new int[] {
                48, 49, 26, 51, 52, 53, 54, 8, 56, 57, 
                58, 59, 4, 20, 62, -1
            }, new int[] {
                65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 
                81, 82, 83, 84, 85, 86
            }, new int[] {
                87, 88, 89, 98, 99, 100, 101, 102, 103, 104, 
                105, 106, 112, 113, 114, 115
            }, new int[] {
                116, 117, 118, 119, 120, -128, -118, -117, -116, -115, 
                -114, -113, -112, -102, -101, -100
            }, new int[] {
                -99, -98, -97, -96, -86, -85, -84, -82, -81, -80, 
                -79, -78, -77, -76, -75, -74
            }, new int[] {
                -73, -72, -71, -70, -69, -68, -66, -65, -54, -53, 
                -52, -51, -50, -49, -38, -37
            }, new int[] {
                -36, -35, -34, -33, -31, -22, -21, -20, -19, -18, 
                -17, -6, -5, -4, -3, -2
            }
        }); */
        /* utfe2utf8m = (new byte[][] {
            new byte[] {
                0, 1, 2, 3, -100, 9, -122, 127, -105, -115, 
                -114, 11, 12, 13, 14, 15
            }, new byte[] {
                16, 17, 18, 19, -99, 10, 8, -121, 24, 25, 
                -110, -113, 28, 29, 30, 31
            }, new byte[] {
                -128, -127, -126, -125, -124, -123, 23, 27, -120, -119, 
                -118, -117, -116, 5, 6, 7
            }, new byte[] {
                -112, -111, 22, -109, -108, -107, -106, 4, -104, -103, 
                -102, -101, 20, 21, -98, 26
            }, new byte[] {
                32, -96, -95, -94, -93, -92, -91, -90, -89, -88, 
                -87, 46, 60, 40, 43, 124
            }, new byte[] {
                38, -86, -85, -84, -83, -82, -81, -80, -79, -78, 
                33, 36, 42, 41, 59, 94
            }, new byte[] {
                45, 47, -77, -76, -75, -74, -73, -72, -71, -70, 
                -69, 44, 37, 95, 62, 63
            }, new byte[] {
                -68, -67, -66, -65, -64, -63, -62, -61, -60, 96, 
                58, 35, 64, 39, 61, 34
            }, new byte[] {
                -59, 97, 98, 99, 100, 101, 102, 103, 104, 105, 
                -58, -57, -56, -55, -54, -53
            }, new byte[] {
                -52, 106, 107, 108, 109, 110, 111, 112, 113, 114, 
                -51, -50, -49, -48, -47, -46
            }, new byte[] {
                -45, 126, 115, 116, 117, 118, 119, 120, 121, 122, 
                -44, -43, -42, 88, -41, -40
            }, new byte[] {
                -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, 
                -29, -28, -27, 93, -26, -25
            }, new byte[] {
                123, 65, 66, 67, 68, 69, 70, 71, 72, 73, 
                -24, -23, -22, -21, -20, -19
            }, new byte[] {
                13, 74, 75, 76, 77, 78, 79, 80, 81, 82, 
                -18, -17, -16, -15, -14, -13
            }, new byte[] {
                92, -12, 83, 84, 85, 86, 87, 88, 89, 90, 
                -11, -10, -9, -8, -7, -6
            }, new byte[] {
                48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
                -5, -4, -3, -2, -1, -97
            }
        }); */
    }
}
