/*
 * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package sun.awt;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.awt.event.KeyEvent;

public class ExtendedKeyCodes {
    /**
     * ATTN: These are the readonly hashes with load factor == 1;
     * adding a value, please set the inital capacity to exact number of items
     * or higher.
     */
     // Keycodes declared in KeyEvent.java with corresponding Unicode values.
     private final static HashMap<Integer, Integer>  regularKeyCodesMap =
                                          new HashMap<Integer,Integer>(98, 1.0f);

     // Keycodes derived from Unicode values. Here should be collected codes
     // for characters appearing on the primary layer of at least one
     // known keyboard layout. For instance, sterling sign is on the primary layer
     // of the Mac Italian layout.
     private final static HashSet<Integer> extendedKeyCodesSet =
                                                  new HashSet<Integer>(501, 1.0f);
     final public static int getExtendedKeyCodeForChar( int c ) {
         int uc = Character.toUpperCase( c );
         int lc = Character.toLowerCase( c );
         if (regularKeyCodesMap.containsKey( c )) {
             if(regularKeyCodesMap.containsKey(uc)) {
                 return regularKeyCodesMap.get( uc );
             }
             return regularKeyCodesMap.get( c );
         }
         uc += 0x01000000;
         lc += 0x01000000;
         if (extendedKeyCodesSet.contains( uc )) {
             return uc;
         }else if (extendedKeyCodesSet.contains( lc )) {
             return lc;
         }
         return KeyEvent.VK_UNDEFINED;
     }
     static {
         regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE);
         regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB);
         regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER);
         regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE);
         regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN);
         regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE);
         regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK);
         regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL);
         regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN);
         regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR);
         regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND);
         regularKeyCodesMap.put(0x27, KeyEvent.VK_QUOTE);
         regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS);
         regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS);
         regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK);
         regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS);
         regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA);
         regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS);
         regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD);
         regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH);
         regularKeyCodesMap.put(0x30, KeyEvent.VK_0);
         regularKeyCodesMap.put(0x31, KeyEvent.VK_1);
         regularKeyCodesMap.put(0x32, KeyEvent.VK_2);
         regularKeyCodesMap.put(0x33, KeyEvent.VK_3);
         regularKeyCodesMap.put(0x34, KeyEvent.VK_4);
         regularKeyCodesMap.put(0x35, KeyEvent.VK_5);
         regularKeyCodesMap.put(0x36, KeyEvent.VK_6);
         regularKeyCodesMap.put(0x37, KeyEvent.VK_7);
         regularKeyCodesMap.put(0x38, KeyEvent.VK_8);
         regularKeyCodesMap.put(0x39, KeyEvent.VK_9);
         regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON);
         regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON);
         regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS);
         regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS);
         regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER);
         regularKeyCodesMap.put(0x40, KeyEvent.VK_AT);
         regularKeyCodesMap.put(0x41, KeyEvent.VK_A);
         regularKeyCodesMap.put(0x42, KeyEvent.VK_B);
         regularKeyCodesMap.put(0x43, KeyEvent.VK_C);
         regularKeyCodesMap.put(0x44, KeyEvent.VK_D);
         regularKeyCodesMap.put(0x45, KeyEvent.VK_E);
         regularKeyCodesMap.put(0x46, KeyEvent.VK_F);
         regularKeyCodesMap.put(0x47, KeyEvent.VK_G);
         regularKeyCodesMap.put(0x48, KeyEvent.VK_H);
         regularKeyCodesMap.put(0x49, KeyEvent.VK_I);
         regularKeyCodesMap.put(0x4A, KeyEvent.VK_J);
         regularKeyCodesMap.put(0x4B, KeyEvent.VK_K);
         regularKeyCodesMap.put(0x4C, KeyEvent.VK_L);
         regularKeyCodesMap.put(0x4D, KeyEvent.VK_M);
         regularKeyCodesMap.put(0x4E, KeyEvent.VK_N);
         regularKeyCodesMap.put(0x4F, KeyEvent.VK_O);
         regularKeyCodesMap.put(0x50, KeyEvent.VK_P);
         regularKeyCodesMap.put(0x51, KeyEvent.VK_Q);
         regularKeyCodesMap.put(0x52, KeyEvent.VK_R);
         regularKeyCodesMap.put(0x53, KeyEvent.VK_S);
         regularKeyCodesMap.put(0x54, KeyEvent.VK_T);
         regularKeyCodesMap.put(0x55, KeyEvent.VK_U);
         regularKeyCodesMap.put(0x56, KeyEvent.VK_V);
         regularKeyCodesMap.put(0x57, KeyEvent.VK_W);
         regularKeyCodesMap.put(0x58, KeyEvent.VK_X);
         regularKeyCodesMap.put(0x59, KeyEvent.VK_Y);
         regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z);
         regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET);
         regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH);
         regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET);
         regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX);
         regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE);
         regularKeyCodesMap.put(0x60, KeyEvent.VK_BACK_QUOTE);
         regularKeyCodesMap.put(0x61, KeyEvent.VK_A);
         regularKeyCodesMap.put(0x62, KeyEvent.VK_B);
         regularKeyCodesMap.put(0x63, KeyEvent.VK_C);
         regularKeyCodesMap.put(0x64, KeyEvent.VK_D);
         regularKeyCodesMap.put(0x65, KeyEvent.VK_E);
         regularKeyCodesMap.put(0x66, KeyEvent.VK_F);
         regularKeyCodesMap.put(0x67, KeyEvent.VK_G);
         regularKeyCodesMap.put(0x68, KeyEvent.VK_H);
         regularKeyCodesMap.put(0x69, KeyEvent.VK_I);
         regularKeyCodesMap.put(0x6A, KeyEvent.VK_J);
         regularKeyCodesMap.put(0x6B, KeyEvent.VK_K);
         regularKeyCodesMap.put(0x6C, KeyEvent.VK_L);
         regularKeyCodesMap.put(0x6D, KeyEvent.VK_M);
         regularKeyCodesMap.put(0x6E, KeyEvent.VK_N);
         regularKeyCodesMap.put(0x6F, KeyEvent.VK_O);
         regularKeyCodesMap.put(0x70, KeyEvent.VK_P);
         regularKeyCodesMap.put(0x71, KeyEvent.VK_Q);
         regularKeyCodesMap.put(0x72, KeyEvent.VK_R);
         regularKeyCodesMap.put(0x73, KeyEvent.VK_S);
         regularKeyCodesMap.put(0x74, KeyEvent.VK_T);
         regularKeyCodesMap.put(0x75, KeyEvent.VK_U);
         regularKeyCodesMap.put(0x76, KeyEvent.VK_V);
         regularKeyCodesMap.put(0x77, KeyEvent.VK_W);
         regularKeyCodesMap.put(0x78, KeyEvent.VK_X);
         regularKeyCodesMap.put(0x79, KeyEvent.VK_Y);
         regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z);
         regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT);
         regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT);
         regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
         regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);

         extendedKeyCodesSet.add(0x01000000+0x0060);
         extendedKeyCodesSet.add(0x01000000+0x007C);
         extendedKeyCodesSet.add(0x01000000+0x007E);
         extendedKeyCodesSet.add(0x01000000+0x00A2);
         extendedKeyCodesSet.add(0x01000000+0x00A3);
         extendedKeyCodesSet.add(0x01000000+0x00A5);
         extendedKeyCodesSet.add(0x01000000+0x00A7);
         extendedKeyCodesSet.add(0x01000000+0x00A8);
         extendedKeyCodesSet.add(0x01000000+0x00AB);
         extendedKeyCodesSet.add(0x01000000+0x00B0);
         extendedKeyCodesSet.add(0x01000000+0x00B1);
         extendedKeyCodesSet.add(0x01000000+0x00B2);
         extendedKeyCodesSet.add(0x01000000+0x00B3);
         extendedKeyCodesSet.add(0x01000000+0x00B4);
         extendedKeyCodesSet.add(0x01000000+0x00B5);
         extendedKeyCodesSet.add(0x01000000+0x00B6);
         extendedKeyCodesSet.add(0x01000000+0x00B7);
         extendedKeyCodesSet.add(0x01000000+0x00B9);
         extendedKeyCodesSet.add(0x01000000+0x00BA);
         extendedKeyCodesSet.add(0x01000000+0x00BB);
         extendedKeyCodesSet.add(0x01000000+0x00BC);
         extendedKeyCodesSet.add(0x01000000+0x00BD);
         extendedKeyCodesSet.add(0x01000000+0x00BE);
         extendedKeyCodesSet.add(0x01000000+0x00BF);
         extendedKeyCodesSet.add(0x01000000+0x00C4);
         extendedKeyCodesSet.add(0x01000000+0x00C5);
         extendedKeyCodesSet.add(0x01000000+0x00C6);
         extendedKeyCodesSet.add(0x01000000+0x00C7);
         extendedKeyCodesSet.add(0x01000000+0x00D1);
         extendedKeyCodesSet.add(0x01000000+0x00D6);
         extendedKeyCodesSet.add(0x01000000+0x00D7);
         extendedKeyCodesSet.add(0x01000000+0x00D8);
         extendedKeyCodesSet.add(0x01000000+0x00DF);
         extendedKeyCodesSet.add(0x01000000+0x00E0);
         extendedKeyCodesSet.add(0x01000000+0x00E1);
         extendedKeyCodesSet.add(0x01000000+0x00E2);
         extendedKeyCodesSet.add(0x01000000+0x00E4);
         extendedKeyCodesSet.add(0x01000000+0x00E5);
         extendedKeyCodesSet.add(0x01000000+0x00E6);
         extendedKeyCodesSet.add(0x01000000+0x00E7);
         extendedKeyCodesSet.add(0x01000000+0x00E8);
         extendedKeyCodesSet.add(0x01000000+0x00E9);
         extendedKeyCodesSet.add(0x01000000+0x00EA);
         extendedKeyCodesSet.add(0x01000000+0x00EB);
         extendedKeyCodesSet.add(0x01000000+0x00EC);
         extendedKeyCodesSet.add(0x01000000+0x00ED);
         extendedKeyCodesSet.add(0x01000000+0x00EE);
         extendedKeyCodesSet.add(0x01000000+0x00F0);
         extendedKeyCodesSet.add(0x01000000+0x00F1);
         extendedKeyCodesSet.add(0x01000000+0x00F2);
         extendedKeyCodesSet.add(0x01000000+0x00F3);
         extendedKeyCodesSet.add(0x01000000+0x00F4);
         extendedKeyCodesSet.add(0x01000000+0x00F5);
         extendedKeyCodesSet.add(0x01000000+0x00F6);
         extendedKeyCodesSet.add(0x01000000+0x00F7);
         extendedKeyCodesSet.add(0x01000000+0x00F8);
         extendedKeyCodesSet.add(0x01000000+0x00F9);
         extendedKeyCodesSet.add(0x01000000+0x00FA);
         extendedKeyCodesSet.add(0x01000000+0x00FB);
         extendedKeyCodesSet.add(0x01000000+0x00FC);
         extendedKeyCodesSet.add(0x01000000+0x00FD);
         extendedKeyCodesSet.add(0x01000000+0x00FE);
         extendedKeyCodesSet.add(0x01000000+0x0105);
         extendedKeyCodesSet.add(0x01000000+0x02DB);
         extendedKeyCodesSet.add(0x01000000+0x0142);
         extendedKeyCodesSet.add(0x01000000+0x013E);
         extendedKeyCodesSet.add(0x01000000+0x015B);
         extendedKeyCodesSet.add(0x01000000+0x0161);
         extendedKeyCodesSet.add(0x01000000+0x015F);
         extendedKeyCodesSet.add(0x01000000+0x0165);
         extendedKeyCodesSet.add(0x01000000+0x017E);
         extendedKeyCodesSet.add(0x01000000+0x017C);
         extendedKeyCodesSet.add(0x01000000+0x0103);
         extendedKeyCodesSet.add(0x01000000+0x0107);
         extendedKeyCodesSet.add(0x01000000+0x010D);
         extendedKeyCodesSet.add(0x01000000+0x0119);
         extendedKeyCodesSet.add(0x01000000+0x011B);
         extendedKeyCodesSet.add(0x01000000+0x0111);
         extendedKeyCodesSet.add(0x01000000+0x0148);
         extendedKeyCodesSet.add(0x01000000+0x0151);
         extendedKeyCodesSet.add(0x01000000+0x0171);
         extendedKeyCodesSet.add(0x01000000+0x0159);
         extendedKeyCodesSet.add(0x01000000+0x016F);
         extendedKeyCodesSet.add(0x01000000+0x0163);
         extendedKeyCodesSet.add(0x01000000+0x02D9);
         extendedKeyCodesSet.add(0x01000000+0x0130);
         extendedKeyCodesSet.add(0x01000000+0x0127);
         extendedKeyCodesSet.add(0x01000000+0x0125);
         extendedKeyCodesSet.add(0x01000000+0x0131);
         extendedKeyCodesSet.add(0x01000000+0x011F);
         extendedKeyCodesSet.add(0x01000000+0x0135);
         extendedKeyCodesSet.add(0x01000000+0x010B);
         extendedKeyCodesSet.add(0x01000000+0x0109);
         extendedKeyCodesSet.add(0x01000000+0x0121);
         extendedKeyCodesSet.add(0x01000000+0x011D);
         extendedKeyCodesSet.add(0x01000000+0x016D);
         extendedKeyCodesSet.add(0x01000000+0x015D);
         extendedKeyCodesSet.add(0x01000000+0x0138);
         extendedKeyCodesSet.add(0x01000000+0x0157);
         extendedKeyCodesSet.add(0x01000000+0x013C);
         extendedKeyCodesSet.add(0x01000000+0x0113);
         extendedKeyCodesSet.add(0x01000000+0x0123);
         extendedKeyCodesSet.add(0x01000000+0x0167);
         extendedKeyCodesSet.add(0x01000000+0x014B);
         extendedKeyCodesSet.add(0x01000000+0x0101);
         extendedKeyCodesSet.add(0x01000000+0x012F);
         extendedKeyCodesSet.add(0x01000000+0x0117);
         extendedKeyCodesSet.add(0x01000000+0x012B);
         extendedKeyCodesSet.add(0x01000000+0x0146);
         extendedKeyCodesSet.add(0x01000000+0x014D);
         extendedKeyCodesSet.add(0x01000000+0x0137);
         extendedKeyCodesSet.add(0x01000000+0x0173);
         extendedKeyCodesSet.add(0x01000000+0x016B);
         extendedKeyCodesSet.add(0x01000000+0x0153);
         extendedKeyCodesSet.add(0x01000000+0x30FC);
         extendedKeyCodesSet.add(0x01000000+0x30A2);
         extendedKeyCodesSet.add(0x01000000+0x30A4);
         extendedKeyCodesSet.add(0x01000000+0x30A6);
         extendedKeyCodesSet.add(0x01000000+0x30A8);
         extendedKeyCodesSet.add(0x01000000+0x30AA);
         extendedKeyCodesSet.add(0x01000000+0x30AB);
         extendedKeyCodesSet.add(0x01000000+0x30AD);
         extendedKeyCodesSet.add(0x01000000+0x30AF);
         extendedKeyCodesSet.add(0x01000000+0x30B1);
         extendedKeyCodesSet.add(0x01000000+0x30B3);
         extendedKeyCodesSet.add(0x01000000+0x30B5);
         extendedKeyCodesSet.add(0x01000000+0x30B7);
         extendedKeyCodesSet.add(0x01000000+0x30B9);
         extendedKeyCodesSet.add(0x01000000+0x30BB);
         extendedKeyCodesSet.add(0x01000000+0x30BD);
         extendedKeyCodesSet.add(0x01000000+0x30BF);
         extendedKeyCodesSet.add(0x01000000+0x30C1);
         extendedKeyCodesSet.add(0x01000000+0x30C4);
         extendedKeyCodesSet.add(0x01000000+0x30C6);
         extendedKeyCodesSet.add(0x01000000+0x30C8);
         extendedKeyCodesSet.add(0x01000000+0x30CA);
         extendedKeyCodesSet.add(0x01000000+0x30CB);
         extendedKeyCodesSet.add(0x01000000+0x30CC);
         extendedKeyCodesSet.add(0x01000000+0x30CD);
         extendedKeyCodesSet.add(0x01000000+0x30CE);
         extendedKeyCodesSet.add(0x01000000+0x30CF);
         extendedKeyCodesSet.add(0x01000000+0x30D2);
         extendedKeyCodesSet.add(0x01000000+0x30D5);
         extendedKeyCodesSet.add(0x01000000+0x30D8);
         extendedKeyCodesSet.add(0x01000000+0x30DB);
         extendedKeyCodesSet.add(0x01000000+0x30DE);
         extendedKeyCodesSet.add(0x01000000+0x30DF);
         extendedKeyCodesSet.add(0x01000000+0x30E0);
         extendedKeyCodesSet.add(0x01000000+0x30E1);
         extendedKeyCodesSet.add(0x01000000+0x30E2);
         extendedKeyCodesSet.add(0x01000000+0x30E4);
         extendedKeyCodesSet.add(0x01000000+0x30E6);
         extendedKeyCodesSet.add(0x01000000+0x30E8);
         extendedKeyCodesSet.add(0x01000000+0x30E9);
         extendedKeyCodesSet.add(0x01000000+0x30EA);
         extendedKeyCodesSet.add(0x01000000+0x30EB);
         extendedKeyCodesSet.add(0x01000000+0x30EC);
         extendedKeyCodesSet.add(0x01000000+0x30ED);
         extendedKeyCodesSet.add(0x01000000+0x30EF);
         extendedKeyCodesSet.add(0x01000000+0x30F3);
         extendedKeyCodesSet.add(0x01000000+0x309B);
         extendedKeyCodesSet.add(0x01000000+0x309C);
         extendedKeyCodesSet.add(0x01000000+0x06F0);
         extendedKeyCodesSet.add(0x01000000+0x06F1);
         extendedKeyCodesSet.add(0x01000000+0x06F2);
         extendedKeyCodesSet.add(0x01000000+0x06F3);
         extendedKeyCodesSet.add(0x01000000+0x06F4);
         extendedKeyCodesSet.add(0x01000000+0x06F5);
         extendedKeyCodesSet.add(0x01000000+0x06F6);
         extendedKeyCodesSet.add(0x01000000+0x06F7);
         extendedKeyCodesSet.add(0x01000000+0x06F8);
         extendedKeyCodesSet.add(0x01000000+0x06F9);
         extendedKeyCodesSet.add(0x01000000+0x0670);
         extendedKeyCodesSet.add(0x01000000+0x067E);
         extendedKeyCodesSet.add(0x01000000+0x0686);
         extendedKeyCodesSet.add(0x01000000+0x060C);
         extendedKeyCodesSet.add(0x01000000+0x06D4);
         extendedKeyCodesSet.add(0x01000000+0x0660);
         extendedKeyCodesSet.add(0x01000000+0x0661);
         extendedKeyCodesSet.add(0x01000000+0x0662);
         extendedKeyCodesSet.add(0x01000000+0x0663);
         extendedKeyCodesSet.add(0x01000000+0x0664);
         extendedKeyCodesSet.add(0x01000000+0x0665);
         extendedKeyCodesSet.add(0x01000000+0x0666);
         extendedKeyCodesSet.add(0x01000000+0x0667);
         extendedKeyCodesSet.add(0x01000000+0x0668);
         extendedKeyCodesSet.add(0x01000000+0x0669);
         extendedKeyCodesSet.add(0x01000000+0x061B);
         extendedKeyCodesSet.add(0x01000000+0x0621);
         extendedKeyCodesSet.add(0x01000000+0x0624);
         extendedKeyCodesSet.add(0x01000000+0x0626);
         extendedKeyCodesSet.add(0x01000000+0x0627);
         extendedKeyCodesSet.add(0x01000000+0x0628);
         extendedKeyCodesSet.add(0x01000000+0x0629);
         extendedKeyCodesSet.add(0x01000000+0x062A);
         extendedKeyCodesSet.add(0x01000000+0x062B);
         extendedKeyCodesSet.add(0x01000000+0x062C);
         extendedKeyCodesSet.add(0x01000000+0x062D);
         extendedKeyCodesSet.add(0x01000000+0x062E);
         extendedKeyCodesSet.add(0x01000000+0x062F);
         extendedKeyCodesSet.add(0x01000000+0x0630);
         extendedKeyCodesSet.add(0x01000000+0x0631);
         extendedKeyCodesSet.add(0x01000000+0x0632);
         extendedKeyCodesSet.add(0x01000000+0x0633);
         extendedKeyCodesSet.add(0x01000000+0x0634);
         extendedKeyCodesSet.add(0x01000000+0x0635);
         extendedKeyCodesSet.add(0x01000000+0x0636);
         extendedKeyCodesSet.add(0x01000000+0x0637);
         extendedKeyCodesSet.add(0x01000000+0x0638);
         extendedKeyCodesSet.add(0x01000000+0x0639);
         extendedKeyCodesSet.add(0x01000000+0x063A);
         extendedKeyCodesSet.add(0x01000000+0x0641);
         extendedKeyCodesSet.add(0x01000000+0x0642);
         extendedKeyCodesSet.add(0x01000000+0x0643);
         extendedKeyCodesSet.add(0x01000000+0x0644);
         extendedKeyCodesSet.add(0x01000000+0x0645);
         extendedKeyCodesSet.add(0x01000000+0x0646);
         extendedKeyCodesSet.add(0x01000000+0x0647);
         extendedKeyCodesSet.add(0x01000000+0x0648);
         extendedKeyCodesSet.add(0x01000000+0x0649);
         extendedKeyCodesSet.add(0x01000000+0x064A);
         extendedKeyCodesSet.add(0x01000000+0x064E);
         extendedKeyCodesSet.add(0x01000000+0x064F);
         extendedKeyCodesSet.add(0x01000000+0x0650);
         extendedKeyCodesSet.add(0x01000000+0x0652);
         extendedKeyCodesSet.add(0x01000000+0x0698);
         extendedKeyCodesSet.add(0x01000000+0x06A4);
         extendedKeyCodesSet.add(0x01000000+0x06A9);
         extendedKeyCodesSet.add(0x01000000+0x06AF);
         extendedKeyCodesSet.add(0x01000000+0x06BE);
         extendedKeyCodesSet.add(0x01000000+0x06CC);
         extendedKeyCodesSet.add(0x01000000+0x06CC);
         extendedKeyCodesSet.add(0x01000000+0x06D2);
         extendedKeyCodesSet.add(0x01000000+0x0493);
         extendedKeyCodesSet.add(0x01000000+0x0497);
         extendedKeyCodesSet.add(0x01000000+0x049B);
         extendedKeyCodesSet.add(0x01000000+0x049D);
         extendedKeyCodesSet.add(0x01000000+0x04A3);
         extendedKeyCodesSet.add(0x01000000+0x04AF);
         extendedKeyCodesSet.add(0x01000000+0x04B1);
         extendedKeyCodesSet.add(0x01000000+0x04B3);
         extendedKeyCodesSet.add(0x01000000+0x04B9);
         extendedKeyCodesSet.add(0x01000000+0x04BB);
         extendedKeyCodesSet.add(0x01000000+0x04D9);
         extendedKeyCodesSet.add(0x01000000+0x04E9);
         extendedKeyCodesSet.add(0x01000000+0x0452);
         extendedKeyCodesSet.add(0x01000000+0x0453);
         extendedKeyCodesSet.add(0x01000000+0x0451);
         extendedKeyCodesSet.add(0x01000000+0x0454);
         extendedKeyCodesSet.add(0x01000000+0x0455);
         extendedKeyCodesSet.add(0x01000000+0x0456);
         extendedKeyCodesSet.add(0x01000000+0x0457);
         extendedKeyCodesSet.add(0x01000000+0x0458);
         extendedKeyCodesSet.add(0x01000000+0x0459);
         extendedKeyCodesSet.add(0x01000000+0x045A);
         extendedKeyCodesSet.add(0x01000000+0x045B);
         extendedKeyCodesSet.add(0x01000000+0x045C);
         extendedKeyCodesSet.add(0x01000000+0x0491);
         extendedKeyCodesSet.add(0x01000000+0x045E);
         extendedKeyCodesSet.add(0x01000000+0x045F);
         extendedKeyCodesSet.add(0x01000000+0x2116);
         extendedKeyCodesSet.add(0x01000000+0x044E);
         extendedKeyCodesSet.add(0x01000000+0x0430);
         extendedKeyCodesSet.add(0x01000000+0x0431);
         extendedKeyCodesSet.add(0x01000000+0x0446);
         extendedKeyCodesSet.add(0x01000000+0x0434);
         extendedKeyCodesSet.add(0x01000000+0x0435);
         extendedKeyCodesSet.add(0x01000000+0x0444);
         extendedKeyCodesSet.add(0x01000000+0x0433);
         extendedKeyCodesSet.add(0x01000000+0x0445);
         extendedKeyCodesSet.add(0x01000000+0x0438);
         extendedKeyCodesSet.add(0x01000000+0x0439);
         extendedKeyCodesSet.add(0x01000000+0x043A);
         extendedKeyCodesSet.add(0x01000000+0x043B);
         extendedKeyCodesSet.add(0x01000000+0x043C);
         extendedKeyCodesSet.add(0x01000000+0x043D);
         extendedKeyCodesSet.add(0x01000000+0x043E);
         extendedKeyCodesSet.add(0x01000000+0x043F);
         extendedKeyCodesSet.add(0x01000000+0x044F);
         extendedKeyCodesSet.add(0x01000000+0x0440);
         extendedKeyCodesSet.add(0x01000000+0x0441);
         extendedKeyCodesSet.add(0x01000000+0x0442);
         extendedKeyCodesSet.add(0x01000000+0x0443);
         extendedKeyCodesSet.add(0x01000000+0x0436);
         extendedKeyCodesSet.add(0x01000000+0x0432);
         extendedKeyCodesSet.add(0x01000000+0x044C);
         extendedKeyCodesSet.add(0x01000000+0x044B);
         extendedKeyCodesSet.add(0x01000000+0x0437);
         extendedKeyCodesSet.add(0x01000000+0x0448);
         extendedKeyCodesSet.add(0x01000000+0x044D);
         extendedKeyCodesSet.add(0x01000000+0x0449);
         extendedKeyCodesSet.add(0x01000000+0x0447);
         extendedKeyCodesSet.add(0x01000000+0x044A);
         extendedKeyCodesSet.add(0x01000000+0x2015);
         extendedKeyCodesSet.add(0x01000000+0x03B1);
         extendedKeyCodesSet.add(0x01000000+0x03B2);
         extendedKeyCodesSet.add(0x01000000+0x03B3);
         extendedKeyCodesSet.add(0x01000000+0x03B4);
         extendedKeyCodesSet.add(0x01000000+0x03B5);
         extendedKeyCodesSet.add(0x01000000+0x03B6);
         extendedKeyCodesSet.add(0x01000000+0x03B7);
         extendedKeyCodesSet.add(0x01000000+0x03B8);
         extendedKeyCodesSet.add(0x01000000+0x03B9);
         extendedKeyCodesSet.add(0x01000000+0x03BA);
         extendedKeyCodesSet.add(0x01000000+0x03BB);
         extendedKeyCodesSet.add(0x01000000+0x03BC);
         extendedKeyCodesSet.add(0x01000000+0x03BD);
         extendedKeyCodesSet.add(0x01000000+0x03BE);
         extendedKeyCodesSet.add(0x01000000+0x03BF);
         extendedKeyCodesSet.add(0x01000000+0x03C0);
         extendedKeyCodesSet.add(0x01000000+0x03C1);
         extendedKeyCodesSet.add(0x01000000+0x03C3);
         extendedKeyCodesSet.add(0x01000000+0x03C2);
         extendedKeyCodesSet.add(0x01000000+0x03C4);
         extendedKeyCodesSet.add(0x01000000+0x03C5);
         extendedKeyCodesSet.add(0x01000000+0x03C6);
         extendedKeyCodesSet.add(0x01000000+0x03C7);
         extendedKeyCodesSet.add(0x01000000+0x03C8);
         extendedKeyCodesSet.add(0x01000000+0x03C9);
         extendedKeyCodesSet.add(0x01000000+0x2190);
         extendedKeyCodesSet.add(0x01000000+0x2192);
         extendedKeyCodesSet.add(0x01000000+0x2193);
         extendedKeyCodesSet.add(0x01000000+0x2013);
         extendedKeyCodesSet.add(0x01000000+0x201C);
         extendedKeyCodesSet.add(0x01000000+0x201D);
         extendedKeyCodesSet.add(0x01000000+0x201E);
         extendedKeyCodesSet.add(0x01000000+0x05D0);
         extendedKeyCodesSet.add(0x01000000+0x05D1);
         extendedKeyCodesSet.add(0x01000000+0x05D2);
         extendedKeyCodesSet.add(0x01000000+0x05D3);
         extendedKeyCodesSet.add(0x01000000+0x05D4);
         extendedKeyCodesSet.add(0x01000000+0x05D5);
         extendedKeyCodesSet.add(0x01000000+0x05D6);
         extendedKeyCodesSet.add(0x01000000+0x05D7);
         extendedKeyCodesSet.add(0x01000000+0x05D8);
         extendedKeyCodesSet.add(0x01000000+0x05D9);
         extendedKeyCodesSet.add(0x01000000+0x05DA);
         extendedKeyCodesSet.add(0x01000000+0x05DB);
         extendedKeyCodesSet.add(0x01000000+0x05DC);
         extendedKeyCodesSet.add(0x01000000+0x05DD);
         extendedKeyCodesSet.add(0x01000000+0x05DE);
         extendedKeyCodesSet.add(0x01000000+0x05DF);
         extendedKeyCodesSet.add(0x01000000+0x05E0);
         extendedKeyCodesSet.add(0x01000000+0x05E1);
         extendedKeyCodesSet.add(0x01000000+0x05E2);
         extendedKeyCodesSet.add(0x01000000+0x05E3);
         extendedKeyCodesSet.add(0x01000000+0x05E4);
         extendedKeyCodesSet.add(0x01000000+0x05E5);
         extendedKeyCodesSet.add(0x01000000+0x05E6);
         extendedKeyCodesSet.add(0x01000000+0x05E7);
         extendedKeyCodesSet.add(0x01000000+0x05E8);
         extendedKeyCodesSet.add(0x01000000+0x05E9);
         extendedKeyCodesSet.add(0x01000000+0x05EA);
         extendedKeyCodesSet.add(0x01000000+0x0E01);
         extendedKeyCodesSet.add(0x01000000+0x0E02);
         extendedKeyCodesSet.add(0x01000000+0x0E03);
         extendedKeyCodesSet.add(0x01000000+0x0E04);
         extendedKeyCodesSet.add(0x01000000+0x0E05);
         extendedKeyCodesSet.add(0x01000000+0x0E07);
         extendedKeyCodesSet.add(0x01000000+0x0E08);
         extendedKeyCodesSet.add(0x01000000+0x0E0A);
         extendedKeyCodesSet.add(0x01000000+0x0E0C);
         extendedKeyCodesSet.add(0x01000000+0x0E14);
         extendedKeyCodesSet.add(0x01000000+0x0E15);
         extendedKeyCodesSet.add(0x01000000+0x0E16);
         extendedKeyCodesSet.add(0x01000000+0x0E17);
         extendedKeyCodesSet.add(0x01000000+0x0E19);
         extendedKeyCodesSet.add(0x01000000+0x0E1A);
         extendedKeyCodesSet.add(0x01000000+0x0E1B);
         extendedKeyCodesSet.add(0x01000000+0x0E1C);
         extendedKeyCodesSet.add(0x01000000+0x0E1D);
         extendedKeyCodesSet.add(0x01000000+0x0E1E);
         extendedKeyCodesSet.add(0x01000000+0x0E1F);
         extendedKeyCodesSet.add(0x01000000+0x0E20);
         extendedKeyCodesSet.add(0x01000000+0x0E21);
         extendedKeyCodesSet.add(0x01000000+0x0E22);
         extendedKeyCodesSet.add(0x01000000+0x0E23);
         extendedKeyCodesSet.add(0x01000000+0x0E25);
         extendedKeyCodesSet.add(0x01000000+0x0E27);
         extendedKeyCodesSet.add(0x01000000+0x0E2A);
         extendedKeyCodesSet.add(0x01000000+0x0E2B);
         extendedKeyCodesSet.add(0x01000000+0x0E2D);
         extendedKeyCodesSet.add(0x01000000+0x0E30);
         extendedKeyCodesSet.add(0x01000000+0x0E31);
         extendedKeyCodesSet.add(0x01000000+0x0E32);
         extendedKeyCodesSet.add(0x01000000+0x0E33);
         extendedKeyCodesSet.add(0x01000000+0x0E34);
         extendedKeyCodesSet.add(0x01000000+0x0E35);
         extendedKeyCodesSet.add(0x01000000+0x0E36);
         extendedKeyCodesSet.add(0x01000000+0x0E37);
         extendedKeyCodesSet.add(0x01000000+0x0E38);
         extendedKeyCodesSet.add(0x01000000+0x0E39);
         extendedKeyCodesSet.add(0x01000000+0x0E3F);
         extendedKeyCodesSet.add(0x01000000+0x0E40);
         extendedKeyCodesSet.add(0x01000000+0x0E41);
         extendedKeyCodesSet.add(0x01000000+0x0E43);
         extendedKeyCodesSet.add(0x01000000+0x0E44);
         extendedKeyCodesSet.add(0x01000000+0x0E45);
         extendedKeyCodesSet.add(0x01000000+0x0E46);
         extendedKeyCodesSet.add(0x01000000+0x0E47);
         extendedKeyCodesSet.add(0x01000000+0x0E48);
         extendedKeyCodesSet.add(0x01000000+0x0E49);
         extendedKeyCodesSet.add(0x01000000+0x0E50);
         extendedKeyCodesSet.add(0x01000000+0x0E51);
         extendedKeyCodesSet.add(0x01000000+0x0E52);
         extendedKeyCodesSet.add(0x01000000+0x0E53);
         extendedKeyCodesSet.add(0x01000000+0x0E54);
         extendedKeyCodesSet.add(0x01000000+0x0E55);
         extendedKeyCodesSet.add(0x01000000+0x0E56);
         extendedKeyCodesSet.add(0x01000000+0x0E57);
         extendedKeyCodesSet.add(0x01000000+0x0E58);
         extendedKeyCodesSet.add(0x01000000+0x0E59);
         extendedKeyCodesSet.add(0x01000000+0x0587);
         extendedKeyCodesSet.add(0x01000000+0x0589);
         extendedKeyCodesSet.add(0x01000000+0x0589);
         extendedKeyCodesSet.add(0x01000000+0x055D);
         extendedKeyCodesSet.add(0x01000000+0x055D);
         extendedKeyCodesSet.add(0x01000000+0x055B);
         extendedKeyCodesSet.add(0x01000000+0x055B);
         extendedKeyCodesSet.add(0x01000000+0x055E);
         extendedKeyCodesSet.add(0x01000000+0x055E);
         extendedKeyCodesSet.add(0x01000000+0x0561);
         extendedKeyCodesSet.add(0x01000000+0x0562);
         extendedKeyCodesSet.add(0x01000000+0x0563);
         extendedKeyCodesSet.add(0x01000000+0x0564);
         extendedKeyCodesSet.add(0x01000000+0x0565);
         extendedKeyCodesSet.add(0x01000000+0x0566);
         extendedKeyCodesSet.add(0x01000000+0x0567);
         extendedKeyCodesSet.add(0x01000000+0x0568);
         extendedKeyCodesSet.add(0x01000000+0x0569);
         extendedKeyCodesSet.add(0x01000000+0x056A);
         extendedKeyCodesSet.add(0x01000000+0x056B);
         extendedKeyCodesSet.add(0x01000000+0x056C);
         extendedKeyCodesSet.add(0x01000000+0x056D);
         extendedKeyCodesSet.add(0x01000000+0x056E);
         extendedKeyCodesSet.add(0x01000000+0x056F);
         extendedKeyCodesSet.add(0x01000000+0x0570);
         extendedKeyCodesSet.add(0x01000000+0x0571);
         extendedKeyCodesSet.add(0x01000000+0x0572);
         extendedKeyCodesSet.add(0x01000000+0x0573);
         extendedKeyCodesSet.add(0x01000000+0x0574);
         extendedKeyCodesSet.add(0x01000000+0x0575);
         extendedKeyCodesSet.add(0x01000000+0x0576);
         extendedKeyCodesSet.add(0x01000000+0x0577);
         extendedKeyCodesSet.add(0x01000000+0x0578);
         extendedKeyCodesSet.add(0x01000000+0x0579);
         extendedKeyCodesSet.add(0x01000000+0x057A);
         extendedKeyCodesSet.add(0x01000000+0x057B);
         extendedKeyCodesSet.add(0x01000000+0x057C);
         extendedKeyCodesSet.add(0x01000000+0x057D);
         extendedKeyCodesSet.add(0x01000000+0x057E);
         extendedKeyCodesSet.add(0x01000000+0x057F);
         extendedKeyCodesSet.add(0x01000000+0x0580);
         extendedKeyCodesSet.add(0x01000000+0x0581);
         extendedKeyCodesSet.add(0x01000000+0x0582);
         extendedKeyCodesSet.add(0x01000000+0x0583);
         extendedKeyCodesSet.add(0x01000000+0x0584);
         extendedKeyCodesSet.add(0x01000000+0x0585);
         extendedKeyCodesSet.add(0x01000000+0x0586);
         extendedKeyCodesSet.add(0x01000000+0x10D0);
         extendedKeyCodesSet.add(0x01000000+0x10D1);
         extendedKeyCodesSet.add(0x01000000+0x10D2);
         extendedKeyCodesSet.add(0x01000000+0x10D3);
         extendedKeyCodesSet.add(0x01000000+0x10D4);
         extendedKeyCodesSet.add(0x01000000+0x10D5);
         extendedKeyCodesSet.add(0x01000000+0x10D6);
         extendedKeyCodesSet.add(0x01000000+0x10D7);
         extendedKeyCodesSet.add(0x01000000+0x10D8);
         extendedKeyCodesSet.add(0x01000000+0x10D9);
         extendedKeyCodesSet.add(0x01000000+0x10DA);
         extendedKeyCodesSet.add(0x01000000+0x10DB);
         extendedKeyCodesSet.add(0x01000000+0x10DC);
         extendedKeyCodesSet.add(0x01000000+0x10DD);
         extendedKeyCodesSet.add(0x01000000+0x10DE);
         extendedKeyCodesSet.add(0x01000000+0x10DF);
         extendedKeyCodesSet.add(0x01000000+0x10E0);
         extendedKeyCodesSet.add(0x01000000+0x10E1);
         extendedKeyCodesSet.add(0x01000000+0x10E2);
         extendedKeyCodesSet.add(0x01000000+0x10E3);
         extendedKeyCodesSet.add(0x01000000+0x10E4);
         extendedKeyCodesSet.add(0x01000000+0x10E5);
         extendedKeyCodesSet.add(0x01000000+0x10E6);
         extendedKeyCodesSet.add(0x01000000+0x10E7);
         extendedKeyCodesSet.add(0x01000000+0x10E8);
         extendedKeyCodesSet.add(0x01000000+0x10E9);
         extendedKeyCodesSet.add(0x01000000+0x10EA);
         extendedKeyCodesSet.add(0x01000000+0x10EB);
         extendedKeyCodesSet.add(0x01000000+0x10EC);
         extendedKeyCodesSet.add(0x01000000+0x10ED);
         extendedKeyCodesSet.add(0x01000000+0x10EE);
         extendedKeyCodesSet.add(0x01000000+0x10EF);
         extendedKeyCodesSet.add(0x01000000+0x10F0);
         extendedKeyCodesSet.add(0x01000000+0x01E7);
         extendedKeyCodesSet.add(0x01000000+0x0259);
         extendedKeyCodesSet.add(0x01000000+0x1EB9);
         extendedKeyCodesSet.add(0x01000000+0x1ECB);
         extendedKeyCodesSet.add(0x01000000+0x1ECD);
         extendedKeyCodesSet.add(0x01000000+0x1EE5);
         extendedKeyCodesSet.add(0x01000000+0x01A1);
         extendedKeyCodesSet.add(0x01000000+0x01B0);
         extendedKeyCodesSet.add(0x01000000+0x20AB);
     }
}
