Full Code of trustcrypto/OnlyKey-Firmware for AI

master 9600daa8ffc8 cached
12 files
475.3 KB
171.2k tokens
48 symbols
1 requests
Download .txt
Showing preview only (491K chars total). Download the full file or copy to clipboard to get everything.
Repository: trustcrypto/OnlyKey-Firmware
Branch: master
Commit: 9600daa8ffc8
Files: 12
Total size: 475.3 KB

Directory structure:
gitextract_wrctxzzj/

├── .gitignore
├── OnlyKey/
│   └── OnlyKey.ino
├── README.md
├── keylayouts.c
├── keylayouts.h
├── usb_desc.c
├── usb_desc.h
├── usb_dev.c
├── usb_dev.h
├── usb_keyboard.c
├── usb_rawhid.c
└── usb_rawhid.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# =========================
# Operating System Files
# =========================

# OSX
# =========================

.DS_Store
.AppleDouble
.LSOverride

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
OnlyKey_NOPIN/OnlyKey_NOPIN.ino


================================================
FILE: OnlyKey/OnlyKey.ino
================================================
/* 
 * Copyright (c) 2015-2022, CryptoTrust LLC.
 * All rights reserved.
 * 
 * Author : Tim Steiner <t@crp.to>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * 
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by CryptoTrust LLC. for
 *    the OnlyKey Project (https://crp.to/ok)"
 *
 * 4. The names "OnlyKey" and "CryptoTrust" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    admin@crp.to.
 *
 * 5. Products derived from this software may not be called "OnlyKey"
 *    nor may "OnlyKey" or "CryptoTrust" appear in their names without
 *    specific prior written permission. For written permission, please
 *    contact admin@crp.to.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by CryptoTrust LLC. for
 *    the OnlyKey Project (https://crp.to/ok)"
 *
 * 7. Redistributions in any form must be accompanied by information on
 *    how to obtain complete source code for this software and any
 *    accompanying software that uses this software. The source code
 *    must either be included in the distribution or be available for
 *    no more than the cost of distribution plus a nominal fee, and must
 *    be freely redistributable under reasonable conditions. For a
 *    binary file, complete source code means the source code for all
 *    modules it contains.
 *
 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS
 * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT
 * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM
 * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE
 * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE
 * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY
 * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF
 * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER
 * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE
 * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION
 * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM
 * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL
 * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT
 * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS
 * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF
 * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS
 * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*************************************/
//Firmware Build Options
/*************************************/
#define DEBUG //Enable Serial Monitor, debug firmware
#define STD_VERSION //Define for STD edition firmare, undefine for IN TRVL edition firmware
#define OK_Color //Define for hardware with color LED
//#define FACTORYKEYS2 // Attestation key and other keys encrypted using CHIP ID and RNG for unique per device
#ifndef STD_VERSION
#undef FACTORYKEYS2
#endif
/*************************************/
//Standard Libraries 
/*************************************/
#include "sha256.h"
#include "EEPROM.h"
#include "T3MacLib.h"
#include "SoftTimer.h"
#include "password.h"
#include "sha1.h"
#include "totp.h"
#include "Time.h"
#include "onlykey.h"
#include "flashkinetis.h"
#include "RNG.h"
#include "base64.h"
#include "ADC.h"
#include "usb_dev.h"
/*************************************/
//Color LED Libraries 
/*************************************/
#ifdef OK_Color
#include "Adafruit_NeoPixel.h"
#endif
/*************************************/
//Additional Libraries to Load for STD firmware version
//These libraries will only be used if STD_VERSION is defined
/*************************************/
extern uint8_t profilemode;
#ifdef STD_VERSION
#define OKSOLO //Using FIDO2 from SOLO
#include "yksim.h"
#include "uECC.h"
#include "ykcore.h"
#include "AES.h"
#include "GCM.h"
#include "rsa.h"
#include "tweetnacl.h"
/*************************************/
//FIDO2 Libraries
/*************************************/
#ifdef OKSOLO
#include "ctap.h"
#include "ctaphid.h"
#include "cbor.h"
#include "ctap_parse.h"
#include "ctap_errors.h"
#include "device.h"
#include "storage.h"
#include "wallet.h"
#include "solo.h"
#include "extensions.h"
#include "ok_extension.h"
#include "crypto.h"
#include "u2f.h"
#endif
#endif
/*************************************/
//LED Assignments
/*************************************/
extern uint8_t NEO_Color;
extern uint8_t NEO_Brightness[1];
extern uint8_t touchoffset;
extern uint8_t Profile_Offset;
/*************************************/
//RNG Assignments
/*************************************/
bool calibrating = false;
extern char ID[36];
/*************************************/
//PIN Assigment Variables
/*************************************/
extern uint8_t BLINKPIN;
extern uint8_t TOUCHPIN1;
extern uint8_t TOUCHPIN2;
extern uint8_t TOUCHPIN3;
extern uint8_t TOUCHPIN4;
extern uint8_t TOUCHPIN5;
extern uint8_t TOUCHPIN6;
extern uint8_t ANALOGPIN1;
extern uint8_t ANALOGPIN2;
extern unsigned int sumofall;
/*************************************/
//Keypad / Password Assignments
/*************************************/
extern int button_selected;    //Key selected 1-6
static int pass_keypress = 1;  //The number key presses in current password attempt
static int session_attempts = 0; //The number of password attempts this session
static bool firsttime = true;
extern Password password;
extern uint8_t TIMEOUT[1];
extern uint8_t TYPESPEED[1];
extern uint8_t KeyboardLayout[1];
extern uint8_t mod_keys_enabled;
/*************************************/
//Capacitive Touch Variables
/*************************************/
extern unsigned int touchread1;
extern unsigned int touchread2;
extern unsigned int touchread3;
extern unsigned int touchread4;
extern unsigned int touchread5;
extern unsigned int touchread6;
extern unsigned int touchread1ref;
extern unsigned int touchread2ref;
extern unsigned int touchread3ref;
extern unsigned int touchread4ref;
extern unsigned int touchread5ref;
extern unsigned int touchread6ref;
/*************************************/
//Keys, Hashes, Integrity Counters
/*************************************/
extern uint8_t profilekey[32];
extern uint8_t p1hash[32];
extern uint8_t sdhash[32];
extern uint8_t p2hash[32];
extern uint8_t nonce[32];
extern int initcheck;
extern int integrityctr1;
extern int integrityctr2;
/*************************************/
//SoftTimer Tasks
/*************************************/
#define TIME_POLL 50 // poll "key" every 50 ms
Task taskKey(TIME_POLL, checkKey);
Task taskKB(50, sendKey); // Default send kb codes every 50 ms
Task taskInitialized(1000, sendInitialized);
/*************************************/
//CRYPTO
/*************************************/
extern uint8_t Challenge_button1;
extern uint8_t Challenge_button2;
extern uint8_t Challenge_button3;
extern uint8_t CRYPTO_AUTH;
extern int packet_buffer_offset;
extern uint8_t packet_buffer_details[5];
extern uint8_t outputmode;
extern uint8_t derived_key_challenge_mode;
extern uint8_t stored_key_challenge_mode;
/*************************************/
//Other
/*************************************/
extern uint8_t recv_buffer[64];
char keybuffer[EElen_url+EElen_addchar+EElen_delay+EElen_addchar+EElen_username+EElen_delay+EElen_addchar+EElen_password+EElen_addchar+EElen_2FAtype+64+EElen_addchar+EElen_addchar+10]; //Buffer to hold all keystrokes
char *pos;
extern uint8_t isfade;
#ifdef STD_VERSION
extern uint8_t ctap_buffer[CTAPHID_BUFFER_SIZE];
#endif
extern uint8_t pending_operation;
uint8_t modkey;
extern uint8_t onlykeyhw;
extern uint8_t Duo_config[2];

extern "C" {
  int _getpid(){ return -1;}
  int _kill(int pid, int sig){ return -1; }
  int _write(){return -1;}
}

/*************************************/
//Arduino Setup
/*************************************/
void setup() {
  // Delay may be needed for serial debug
  // delay(3000);
  analogReadResolution(16);
  #ifdef DEBUG
  Serial.begin(9600);
  #endif
  #ifdef STD_VERSION
  profilemode = STDPROFILE1;
  #else
  profilemode = NONENCRYPTEDPROFILE; 
  #endif
  /*************************************/
  //PIN Assigments
  /*************************************/
  BLINKPIN=6;
  TOUCHPIN1=1; // #define CORE_PIN1_CONFIG  PORTB_PCR17
  TOUCHPIN2=22; //#define CORE_PIN22_CONFIG  PORTC_PCR1
  TOUCHPIN3=23; //#define CORE_PIN23_CONFIG  PORTC_PCR2 OnlyKey DUO Button #1
  TOUCHPIN4=17; //#define CORE_PIN17_CONFIG  PORTB_PCR1
  TOUCHPIN5=15; //#define CORE_PIN15_CONFIG  PORTC_PCR0 OnlyKey DUO Button #2
  TOUCHPIN6=16; //#define CORE_PIN16_CONFIG  PORTB_PCR0
  ANALOGPIN1=A0; //#define CORE_PIN14_CONFIG PORTD_PCR1
  ANALOGPIN2=A7; //#define CORE_PIN21_CONFIG PORTD_PCR6
  /*************************************/
  initcheck = okcore_flashget_noncehash ((uint8_t*)nonce, 32); //Check if first time use
  CHIP_ID(); // Get Unique chip ID from ROM
  unsigned int analog1 = analogRead(ANALOGPIN1);
  unsigned int analog2 = analogRead(ANALOGPIN2);
  integrityctr1++;
  /* 
  //dump flash storage, useful for verifying contents
  Serial.println(initcheck);
  char temp[32];
  wipeEEPROM();
  unsigned long readadr = flashstorestart;
  while (readadr <= flashend) {
    for(int i =0; i<=2048; i=i+4){
      sprintf (temp, "%.8X", *((unsigned int*)readadr));
      Serial.print(temp);
      readadr = readadr + 4;
    }
    Serial.println();
  }
  */  
  //FSEC currently set to 0x44, everything disabled except mass erase https://forum.pjrc.com/threads/28783-Upload-Hex-file-from-Teensy-3-1
  if (FTFL_FSEC!=0x44) {
    // First time starting up, three steps to complete:
    // 1) Read factory loaded device keys and generate custom device keys
    // Get factory default flash contents
    #ifdef FACTORYKEYS2
    okcore_flashget_common(ctap_buffer, (unsigned long *)factorysectoradr, 1025);
    #ifdef DEBUG
    Serial.println("Factory Key Values");
    byteprint(ctap_buffer, 1025);
    #endif
    if (ctap_buffer[480] != 0xFF) { // Attestation key loaded
      // Hash factory bytes with unique chip ID and random 
      SHA256_CTX hash;
      for (int i=0; i<=14; i++) {
        analog1 = analogRead(ANALOGPIN1);
        analog2 = analogRead(ANALOGPIN1);
        sha256_init(&hash);
        sha256_update(&hash, ctap_buffer+(32*i), 32);
        sha256_update(&hash, ctap_buffer+(32*(i+1)), 32);
        sha256_update(&hash, (uint8_t*)ID, 36);
        sha256_update(&hash, (uint8_t*)&analog1, 4);
        sha256_update(&hash, (uint8_t*)&analog2, 4);
        sha256_final(&hash, ctap_buffer+(32*i));
      }
      #ifdef DEBUG
      Serial.println("KDF Hashed Factory Values");
      byteprint(ctap_buffer, 512);
      #endif
      // Write everything to flash
      if (*certified_hw != 1) {
        // Encrypt attestation key with generated KEK
        ctap_buffer[435]=3;
        //Write keys
        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 436); 
        okcrypto_aes_gcm_encrypt2(ctap_buffer+480, ctap_buffer+436, ctap_buffer+448, 32, true);
        //Write encrypted contents to flash
        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513); 
        // Set write flag 
        ctap_buffer[435]=1;
        // Write flag to flash
        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513); 
      }
      // Erase factory keys
      memset(ctap_buffer, 0, 2048);
      okcore_flashset_common(ctap_buffer, (unsigned long *)factorysectoradr, 512); 
    } 
    #endif // end FACTORYKEYS
    // 2) Store factory firmware hash for integrity verification
    //create hash of firmware in hash buffer
    #ifdef STD_VERSION
    fw_hash(ctap_buffer); 
    for (int i = 0; i < crypto_hash_BYTES; i++) { //write 64byte hash to eeprom
      eeprom_write_byte((unsigned char*)(2+i), ctap_buffer[i]); // 2-65 used for fw integrity hash
    }
    memset(ctap_buffer, 0, 2048);
    #endif
    // 3) Enable flash security after writing
    int nn = 0;
    nn=flashSecurityLockBits();
    #ifdef DEBUG
    Serial.print("Flash security bits ");
    if(nn) Serial.print("not ");
    Serial.println("written successfully");
    #endif
  }
  if(!initcheck) {
      wipeEEPROM();
      eeprom_write_byte((unsigned char *)1984, (OKversionmaj[0] - '0')); //write fwvermaj, prevents downgrade to previous majver
      okeeprom_eeset_timeout((uint8_t*)TIMEOUT); //Default lockout 30 min
      unlocked = true; //Flash is not protected, First time use
      initialized = false;
      #ifdef DEBUG
      Serial.println("UNLOCKED, NO PIN SET");
      #endif
  } else if(FTFL_FSEC==0x44 && initcheck) {
        okcore_flashget_pinhashpublic ((uint8_t*)p1hash, 32); //store PIN hash
        okcore_flashget_selfdestructhash ((uint8_t*)sdhash); //store self destruct PIN hash
        okcore_flashget_2ndpinhashpublic ((uint8_t*)p2hash); //store plausible deniability PIN hash
        okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
        okeeprom_eeget_modkey(&mod_keys_enabled);
        #ifdef DEBUG
        Serial.println("typespeed = ");
        Serial.println(TYPESPEED[0]);
        #endif
        if (TYPESPEED[0] == 0) {
          TYPESPEED[0] = 4;
         } else if (TYPESPEED[0] <= 10) {
         }
        okeeprom_eeget_ledbrightness((uint8_t*)NEO_Brightness);
        okeeprom_eeget_touchoffset(&touchoffset);
        okeeprom_eeget_timeout((uint8_t*)TIMEOUT);
        okeeprom_eeget_keyboardlayout((uint8_t*)KeyboardLayout);
        #ifdef DEBUG
        Serial.println("KeyboardLayout = ");
        Serial.println(KeyboardLayout[0]);
        #endif
        update_keyboard_layout();
        unlocked = false;
        initialized = true;
        #ifdef DEBUG
        Serial.println("INITIALIZED");
        #endif
        SoftTimer.add(&taskInitialized);
  } else { //Glitch detect, somehow device is initialized but flash security is not on
    CPU_RESTART();
  }
  integrityctr2++;
  /*************************************/
  //Initialize the random number generator with analog noise, stored NONCE, and chip ID
  /*************************************/
  RNG.begin(OKversion, 2045); //Start RNG with the device version
  RNG.stir((uint8_t *)&analog1, 2, 4);
  RNG.stir((uint8_t *)&analog2, 2, 4);
  #ifdef DEBUG
  Serial.print("EEPROM Used ");
  Serial.println(EEpos_slottypespeed+12);
  Serial.println(FTFL_FSEC, HEX);
  #endif
  rngloop(); //Start RNG
  #ifdef OK_Color
  initColor();
  rainbowCycle();
  #else
  pinMode(BLINKPIN, OUTPUT);
  fadein();//Additional delay to make sure button is not pressed during plug into USB
  fadeout();
  fadein();
  fadeout();
  #endif
  SoftTimer.add(&taskKey);

   if (!initcheck) {
    //Default set to no challenge code required for OnlyKey Agent
    //User can enable challenge code in OnlyKey app preferences
    derived_key_challenge_mode = 1;
    stored_key_challenge_mode = 1;
    okeeprom_eeset_derived_key_challenge_mode(&derived_key_challenge_mode); 
    okeeprom_eeset_stored_key_challenge_mode(&stored_key_challenge_mode);
  } 
  
  if (onlykeyhw==OK_HW_DUO) {
      if (initialized == true && password.profile1hashevaluate()) {
          payload(10); 
      }
  }
}

extern elapsedMillis idletimer;

/*************************************/
//Main Loop, Read Key Press Using Capacitive Touch
//Called every 50ms
/*************************************/
void checkKey(Task* me) {
  
  //Check for bootloader trigger
  if (!digitalRead(33)) { //Trigger bootloader to load firmware by PTA4 low for 3 sec
    elapsedMillis waiting;
    int jumptobootloader = 0;
    while (waiting < 3000) {
    delay(100);
    jumptobootloader = jumptobootloader + digitalRead(33);
    }
    if (jumptobootloader==0) {
    eeprom_write_byte(0x00, 1); //Go to bootloader
    eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load
    CPU_RESTART(); //Reboot
    }
  }

  #ifndef STD_VERSION
  // Disable OK_HW_DUO hardware for IN_TRVL firmware
  if (onlykeyhw==OK_HW_DUO) {
    eeprom_write_byte(0x00, 1); //Go to bootloader
    eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load
    CPU_RESTART(); //Reboot
  }
  #endif

  if (setBuffer[8] == 1 && (!isfade || configmode)) //Done receiving packets
  {                 
    if (outputmode != KEYBOARD_USB) changeoutputmode(KEYBOARD_USB); //Keyboard USB
    process_setreport();
  }
  //Check integrity counters and recv usb data
  integrityctr1++;
  delay(sumofall % 6); //delay 0 - 5 ms
  if (unlocked) {
    integrityctr2++;
    recvmsg(0);
    if(initialized && initcheck) {
    #ifdef STD_VERSION
    yubikey_incr_time();
    #endif
    if (TIMEOUT[0] && idletimer >= (TIMEOUT[0]*60000)) {
      unlocked = false;
      firsttime = true;
      password.reset(); //reset the guessed password to NULL
      pass_keypress=1;
      memset(profilekey, 0, 32);  
      SoftTimer.add(&taskInitialized);
      CPU_RESTART();
    }
    }
  } else{
    integrityctr2++;
  }

  if(configmode && unlocked && !isfade) {
    #ifdef OK_Color
    NEO_Color = 1; //Red
    #endif
    fadeon(1);
  }

  #ifdef DEBUG
  // Auto set default PINs and passphrase for testing
  //if (!initialized) {
  // okeeprom_eeset_timeout(0); //Disable lockout
  //  okcore_quick_setup(AUTO_PIN_SET);  
  //}
  #endif
  

  int press_duration = touch_sense_loop();
  if (pending_operation==0xF6 || pending_operation==0xF7) { //CTAP2_ERR_DATA_READY or CTAP2_ERR_DATA_WIPE
    setcolor(45); //yellow
  } else {
    if (press_duration) payload(press_duration);
  }

}
/*************************************/
//Type out on Keyboard the contents of Keybuffer
/*************************************/
void sendKey(Task* me) {
    while ( isfade && NEO_Color == 170 && (uint8_t)*pos != 00 && (uint8_t)*pos != 9 ) {
       pos++;
    }
    int delay1 = (TYPESPEED[0]*TYPESPEED[0]/3)*8;
    int delay2 = ((TYPESPEED[0]*TYPESPEED[0])*2);
    if ((uint8_t)*pos == 00) {
      #ifdef DEBUG
      Serial.print(pos);
      #endif
      Keyboard.end();
      SoftTimer.remove(&taskKB);
      SoftTimer.add(&taskKey);
      // Set back to default type speed
      okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
      if (TYPESPEED[0]==0) TYPESPEED[0] = 4;
      return;
    }
    else if ((uint8_t)*pos == 1) {
        if (!isfade) {
          Keyboard.press(KEY_TAB);
          delay(delay1);
          Keyboard.releaseAll();
          delay(delay2);
        }
        pos++;
    }
    else if ((uint8_t)*pos == 2) {
        if (!isfade) {
          Keyboard.press(KEY_RETURN);
          delay(delay1);
          Keyboard.releaseAll();
          delay(delay2);
        }
        pos++;
    }
    else if ((uint8_t)*pos == 9) {
        if(profilemode==NONENCRYPTEDPROFILE) return;
        #ifdef STD_VERSION
        #ifdef DEBUG
        Serial.println("Starting U2F...");
        #endif
        u2f_button = 1;
        unsigned long u2fwait = millis() + 4000;
        while(u2f_button && millis() < u2fwait) {
        recvmsg(0);
        }
        u2f_button = 0;
        Keyboard.end();
        SoftTimer.remove(&taskKB);
        SoftTimer.add(&taskKey);
        #endif
        return;
    }
    else if ((uint8_t)*pos >= 10 && (uint8_t)*pos <= 31) {
        if (!isfade) {    
          delay((*pos - 10)*1000);
          pos++;       
        }       
    }
    else if ((uint8_t)*pos == ' ' && (uint8_t)*(pos+1) == 0x5c) {
        pos++; 
        if (!isfade) {
          while(*pos) {
            if ((uint8_t)*pos == 0x5c) { //modifier/special key comes next
              pos++;
              keymap_press(0);
              delay(delay1);
            } else { //regular key
              keymap_press(1);
              delay(delay1);
            }
            pos++;
            if ((uint8_t)*pos == ' ' || (uint8_t)*pos == 0) {
              if ((uint8_t)*pos == ' ') pos++;
              Keyboard.releaseAll();
              delay(delay1);  
              Keyboard.releaseAll();
              resetkeys();
              delay(delay2);
              return;
            } 
          }
        }   
    }
    else if (*pos){
        if (!isfade) {
          Keyboard.press(*pos);
          delay(delay1);
          Keyboard.releaseAll();
          delay(delay2);
        }
        pos++;
    }
}
/*************************************/
//Password Checking Loop
/*************************************/
void payload(int duration) {   
    if (!unlocked) {
      // OnlyKey Go has only 3 buttons, longer press to enter PIN of 4 - 6
      if (onlykeyhw==OK_HW_DUO && duration >= 21) { 
        // <1 sec OK_HW_DUO buttons 1,2,3 = 4,5,6
        button_selected = button_selected + 3;
      }
      #ifdef OK_Color
      setcolor(45); // NEO Pixel ON Yellow
      #else
      analogWrite(BLINKPIN, 255); //LED ON
      #endif
    }
    else {
      #ifdef OK_Color
      setcolor(0); // NEO Pixel OFF
      #else
      analogWrite(BLINKPIN, 0); //LED OFF
      #endif
    }
    uint8_t pass_attempts[1];
    uint8_t sincelastregularlogin[1];
    if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device
      exceeded_login_attempts();
    return;
    }
    integrityctr1++;
    if (firsttime) //Get failed login counter from eeprom and increment for new login attempt
    {
      okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);
      if (pass_attempts[0]) {
        okeeprom_eeget_sincelastregularlogin ((uint8_t*)sincelastregularlogin);
        if (sincelastregularlogin[0] >= 20) {
          for (int i =0; i<32; i++) {
            p1hash[i] = 0xFF;
          }
          okcore_flashset_pinhashpublic ((uint8_t*)p1hash); //permanently wipe pinhash
          okeeprom_eeset_sincelastregularlogin (0);
       } else {
        sincelastregularlogin[0]++;
        okeeprom_eeset_sincelastregularlogin ((uint8_t*)sincelastregularlogin);
       }
       #ifdef DEBUG
       Serial.println("Failed PIN attempts since last successful regular PIN entry");
       Serial.println(sincelastregularlogin[0]);
       #endif
     }
     integrityctr2++;
     pass_attempts[0]++;
     integrityctr1++;
     if (pass_attempts[0] > 10) {
        #ifdef DEBUG
        Serial.println("Password attempts exhausted");
        Serial.println(pass_attempts[0]);
        #endif
        factorydefault();
        pass_attempts[0] = 0;
        return;
     }
     okeeprom_eeset_failedlogins ((uint8_t*)pass_attempts);
     firsttime = false;
   }
   integrityctr2++;
   password.append(button_selected);
   integrityctr1++;
   delay((sumofall % 4)+(sumofall % 3)); //delay 0 - 5 ms
   if (unlocked || password.profile1hashevaluate() || password.profile2hashevaluate()) {
    integrityctr2++;
    if (unlocked != true) { //A correct PIN was just entered do the following for first login
      okeeprom_eeset_failedlogins(0); //Set failed login counter to 0
      password.reset(); //reset the guessed password to NULL
      session_attempts=0;
      if (!configmode) hidprint(HW_MODEL(UNLOCKED));
      SoftTimer.remove(&taskInitialized);
      #ifdef DEBUG
      Serial.println("UNLOCKED"); 
      #endif      
      fadeon(NEO_Color);
      fadeoff(85);  
      if (profilemode!=NONENCRYPTEDPROFILE) {
        #ifdef STD_VERSION
        U2Finit();
        okeeprom_eeset_sincelastregularlogin(0); //Set failed logins since last regular login to 0
        fw_version_changes();
        #endif
      }
      idletimer=0;
      unlocked = true;
      if (configmode) {
        #ifdef OK_Color
        NEO_Color = 1; //Red
        #endif
        fadeon(1);
      }

      unsigned long wait = millis() + 200;
      while(millis() < wait) { //Process waiting messages
          recvmsg(0);
      }
      
      wipe_usb_buffer(); // Wipe old responses
      return;
    } else if (!initialized && duration >= 85 && button_selected=='1' && profilemode!=NONENCRYPTEDPROFILE) {
      if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_NO_BACKUP);
      else okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET);
      return;
    } else if (!initialized && duration >= 85 && button_selected=='2' && profilemode!=NONENCRYPTEDPROFILE) {
      if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_BACKUP);
      else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET);
      return;
    } else if (!initialized && duration >= 85 && button_selected=='3' && profilemode!=NONENCRYPTEDPROFILE) {
      okcore_quick_setup(0); //Setup with keyboard prompt
      return;
    } else if (pin_set==0 && !initcheck) {
      return;
    }
    else if (pin_set==0) {
    }
    else if (pin_set<=3) { 
      #ifdef DEBUG
      Serial.print("password appended with ");
      Serial.println(button_selected-'0');
      #endif
      if (configmode) {
        NEO_Color = 45;
        blink(1);
        NEO_Color = 1;
      }
      return;
    }
    else if (pin_set<=6) {
        #ifdef DEBUG
        Serial.print("SD password appended with ");
        Serial.println(button_selected-'0');
        #endif
        if (configmode) {
          NEO_Color = 45;
          blink(1);
          NEO_Color = 1;
        }
        return;
    }
    else if (pin_set<=9) {
        if(profilemode!=NONENCRYPTEDPROFILE){
        #ifdef STD_VERSION
        #ifdef DEBUG
        Serial.print("2nd profile password appended with ");
        Serial.println(button_selected-'0');
        #endif
        #endif
        }
        if (configmode) {
          NEO_Color = 45;
          blink(1);
          NEO_Color = 1;
        }
        return;
    } else if (pin_set==10) {
        cancelfadeoffafter20();
        if (button_selected=='1') okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET); //Manual
        else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET); //Manual
        return;
    }
    Keyboard.begin();
    *keybuffer = '\0';
    #ifdef DEBUG
    Serial.print("Button selected ");
    Serial.println(button_selected-'0');
    #endif
    idletimer=0;
    if (profilemode!=NONENCRYPTEDPROFILE) {
      #ifdef STD_VERSION
      if (CRYPTO_AUTH == 1 && button_selected==Challenge_button1 && isfade) {
          #ifdef DEBUG
          Serial.print("Challenge1 entered");
          Serial.println(button_selected-'0');
          #endif
          CRYPTO_AUTH++;
          return;
      } else if (CRYPTO_AUTH == 2 && button_selected==Challenge_button2 && isfade) {
        #ifdef DEBUG
        Serial.print("Challenge2 entered");
        Serial.println(button_selected-'0');
        #endif
        CRYPTO_AUTH++;
        return;
      } else if ((CRYPTO_AUTH == 3 && button_selected==Challenge_button3 && isfade && packet_buffer_details[0]) || (derived_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (stored_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (CRYPTO_AUTH == 3 && packet_buffer_details[0] == OKHMAC && isfade) || (packet_buffer_details[0] == OKWEBAUTHN && isfade)) {
        #ifdef DEBUG
        Serial.print("Challenge3 entered");
        Serial.println(button_selected-'0');
        #endif
        CRYPTO_AUTH = 4;
        derived_key_challenge_mode = 0;
        stored_key_challenge_mode = 0;
        if(packet_buffer_details[0] == OKSIGN) {
          recv_buffer[4] = packet_buffer_details[0];
          recv_buffer[5] = packet_buffer_details[1];
          okcrypto_sign(recv_buffer);
        } else if (packet_buffer_details[0] == OKDECRYPT) {
          recv_buffer[4] = packet_buffer_details[0];
          recv_buffer[5] = packet_buffer_details[1];
          okcrypto_decrypt(recv_buffer);
        } else if (packet_buffer_details[0] == OKHMAC) {
          okcrypto_hmacsha1();
        } else if (packet_buffer_details[0] == OKWEBAUTHN) {
          u2f_button = 1;
          unsigned long u2fwait = millis() + 4000;
          while(u2f_button && millis() < u2fwait) {
          recvmsg(0);
          }
          u2f_button = 0;
        }
          CRYPTO_AUTH = 0;
          packet_buffer_details[0]=0;
          fadeoff(0);
          return;
        } else if (CRYPTO_AUTH) { //Wrong challenge was entered
            CRYPTO_AUTH = 0;
            Challenge_button1 = 0;
            Challenge_button2 = 0;
            Challenge_button3 = 0;
            fadeoff(1);
            hidprint("Error incorrect challenge was entered");
            analogWrite(BLINKPIN, 255); //LED ON
            return;
        } else if (duration < 180 && duration >= 72 && button_selected=='1' && !isfade) {
            // Backup <4 sec 
            SoftTimer.remove(&taskKey);
            backup();
            SoftTimer.add(&taskKey);
            return;
        } else if (onlykeyhw==OK_HW_DUO && duration >= 360 && button_selected=='2' && configmode==true) {
          factorydefault();
        } else if (duration >= 72 && button_selected=='2' && !isfade) {
            // Slot Labels <4 sec 
            get_slot_labels(1);
            if (duration >= 140) get_key_labels(1);
            return;
        } else if (duration >= 72 && button_selected=='3' && !isfade) {
            // Lock and/or switch profiles <4 sec
            if (onlykeyhw==OK_HW_DUO && duration < 180) {
              if (Duo_config[1] == 0){ // Profile 1
                Profile_Offset = 84; //Profile 2 Blue
                Duo_config[1] = 1;
              } else if (Duo_config[1] == 1){ // Profile 2 
                Profile_Offset = -42; //Profile 3 Yellow
                Duo_config[1] = 2;
              } else if (Duo_config[1] == 2){ // Profile 3
                Profile_Offset = 128; //Profile 4 Purple
                Duo_config[1] = 3;
              } else if (Duo_config[1] == 3){ // Profile 4
                Profile_Offset = 0; //Profile 1 Green
                Duo_config[1] = 0;
              }
              return;
            }
            unlocked = false;
            firsttime = true;
            password.reset(); //reset the guessed password to NULL
            pass_keypress=1;
            memset(profilekey, 0, 32);        
            SoftTimer.add(&taskInitialized);
            button_selected=0;
            CPU_RESTART(); 
            return;
        } 
        else if (((onlykeyhw==OK_HW_DUO && duration >= 180 && button_selected=='1') || (onlykeyhw!=OK_HW_DUO && duration >= 72 && button_selected=='6')) && !isfade) {
          // Config mode 
          integrityctr1++;
          configmode=true;
          if (Duo_config[0]!=1) {
            unlocked = false;
            firsttime = true;
            password.reset(); //reset the guessed password to NULL
            pass_keypress=1;
            SoftTimer.add(&taskInitialized);
          }
          integrityctr2++;
          return;
        }
      #endif
     }
    #ifdef OK_Color
    setcolor(0); // NEO Pixel OFF
    #else
    analogWrite(BLINKPIN, 0); //LED OFF
    #endif
      
    if (duration <= 20 && !configmode) {
      gen_press();
    }
    else if (duration >= 21 && duration < 90 && !configmode) {
      gen_hold();
    }
    else if (duration >= 90 && !configmode) {
      NEO_Color = 1;
      blink(2);
    }
    pos = keybuffer;
    SoftTimer.remove(&taskKey);
    SoftTimer.add(&taskKB, (unsigned long)TYPESPEED[0]);
    return;
  }
  else if (password.sdhashevaluate()) {
    #ifdef DEBUG
    Serial.println("Self Destruct PIN entered");
    #endif
    factorydefault();
  }
  else {
    integrityctr2++;
    if (pass_keypress < 10) {
      #ifdef DEBUG
      Serial.print("password appended with ");
      Serial.println(button_selected-'0');
      Serial.print("Number of keys entered for this passcode = ");
      Serial.println(pass_keypress);
      #endif
      pass_keypress++;
      return;
    } else {
      firsttime = true;
      session_attempts++;
      #ifdef OK_Color
      NEO_Color = 1;
      #endif
      blink(3);
      #ifdef DEBUG
      Serial.print("Login Failed, there are ");
      #endif
      okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);
      #ifdef DEBUG
      Serial.print(10 - pass_attempts[0]);
      Serial.println(" remaining attempts before a factory reset will occur");
      Serial.println("WARNING: This will render all device information unrecoverable");
      #endif
      password.reset(); //reset the guessed password to NULL
      pass_keypress=1;
      if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device
        exceeded_login_attempts();
      }
      return;
    }
 }
}
/*************************************/
//Trigger on short button press
/*************************************/
void gen_press(void) {
  int slot;

  if (profilemode || Duo_config[1] == 2) {
    slot=(button_selected-'0')+12;
  } else if (Duo_config[1] == 1) {
    slot=(button_selected-'0')+6;
  } else if (Duo_config[1] == 3) {
    slot=(button_selected-'0')+18;
  } else {
    slot=button_selected-'0';
  }
      process_slot(slot);
}
/*************************************/
//Trigger on long button press
/*************************************/
void gen_hold(void) {
  int slot;
  if (profilemode || Duo_config[1] == 2) {
    slot=(button_selected-'0')+12;
  } else if (Duo_config[1] == 1) {
    slot=(button_selected-'0')+6;
  } else if (Duo_config[1] == 3) {
    slot=(button_selected-'0')+18;
  } else {
    slot=button_selected-'0';
  }

  if (onlykeyhw==OK_HW_DUO){
    process_slot(slot+3);
  } else {
    process_slot(slot+6);
  }
      
}
/*************************************/
//Load Set Values to Keybuffer
/*************************************/
void process_slot(int s) {
      long GMT;
      char* newcode;
      static uint8_t index;
      uint8_t temp[64];
      int urllength;
      int usernamelength;
      int passwordlength;
      int otplength;
      uint8_t addchar1;
      uint8_t addchar2;
      uint8_t addchar3;
      uint8_t addchar4;
      uint8_t addchar5;
      uint8_t addchar6;
      uint8_t autolockslot;
      int delay1 = 0;
      int delay2 = 0;
      int delay3 = 0;
      uint8_t *ptr;
      int slot=s;
      bool scripted_mode = false;
      index = 0;
      
      okeeprom_eeget_autolockslot(&autolockslot);
      if ((profilemode==STDPROFILE1 && (slot==(autolockslot & 0xF))) || (profilemode==STDPROFILE2 && slot==((autolockslot >> 4) & 0xF)+12)) {
        lock_ok_and_screen ();
        return;
      }
      okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, slot);
      if (TYPESPEED[0]==0) okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);
      if (TYPESPEED[0]==0) TYPESPEED[0] = 4;
      
      okeeprom_eeget_addchar(&addchar5, slot);
      #ifdef DEBUG
      Serial.println("Additional Character");
      Serial.println(addchar5); 
      #endif
      addchar1 = addchar5 & 0x3; //After Username
      addchar2 = (addchar5 >> 4) & 0x3; //After Password
      addchar3 = (addchar5 >> 6) & 0x1; //After OTP
      addchar6 = (addchar5 >> 7) & 0x1; //After OTP 2
      addchar4 = (addchar5 >> 2) & 0x1; //Before Username
      addchar5 = (addchar5 >> 3) & 0x1; //Before OTP
      
      if (isfade) return; 
      #ifdef DEBUG
      Serial.print("Slot Number ");
      Serial.println(button_selected-'0');
      #endif
      memset(temp, 0, 64); //Wipe all data from buffer
      memset(keybuffer, 0, sizeof(keybuffer)); //Wipe all data from keybuffer
      ptr = temp;
      urllength = okcore_flashget_url(ptr, slot);
      if(urllength > 0)
      {
        #ifdef DEBUG
        Serial.println("Reading URL from Flash...");
        Serial.print("URL Length = ");
        Serial.println(urllength);
        #endif
        #ifdef DEBUG
        Serial.println("Encrypted");
        byteprint(temp, urllength);
        #endif
        okcore_aes_gcm_decrypt(temp, slot, 15, profilekey, urllength);
        if (temp[0]==0x08) { // Scripted Mode
          scripted_mode=true;
          ByteToChar2(temp+1, keybuffer, urllength-1, index);
          index=urllength-1;
        } else {
          ByteToChar2(temp, keybuffer, urllength, index);
          index=urllength;
          keybuffer[index] = 2;
          index++;
          #ifdef DEBUG
          Serial.println("Unencrypted");
          byteprint(temp, urllength);
          Serial.println("Setting RETURN after URL");
          #endif
        }
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      okeeprom_eeget_delay1(ptr, slot);
      if(temp[0] > 0 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading Delay1 from EEPROM...");
        Serial.print("Delay ");
        Serial.print(temp[0]);
        Serial.println(" Seconds before entering username");
        #endif
        if (temp[0] <= 30)
        {
        delay1=temp[0];
        keybuffer[index] = temp[0] + 10;
        index++;
        }
      }
      if(addchar4 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading before Username addchar...");
        #endif
        keybuffer[index] = 1;
        #ifdef DEBUG
        Serial.println("TAB");
        #endif
        index++;
      }
      usernamelength = okcore_flashget_username(ptr, slot);
      if(usernamelength > 0)
      {
        #ifdef DEBUG
        Serial.println("Reading Username from Flash...");
        Serial.print("Username Length = ");
        Serial.println(usernamelength);
        byteprint(temp, usernamelength);
        #endif
        okcore_aes_gcm_decrypt(temp, slot, 2, profilekey, usernamelength);
        
        ByteToChar2(temp, keybuffer, usernamelength, index);
        #ifdef DEBUG
        byteprint(temp, usernamelength);
        #endif
        index=usernamelength+index;
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      if(addchar1 && !scripted_mode)
      {
        if(addchar1 == 1) {
        #ifdef DEBUG
        Serial.println("Reading after username addchar...");
        #endif
        keybuffer[index] = 1;
        #ifdef DEBUG
        Serial.println("TAB");
        #endif
        index++;
        }
        else if(addchar1 == 2) {
        #ifdef DEBUG
        Serial.println("Reading after username addchar...");
        #endif
        keybuffer[index] = 2;
        #ifdef DEBUG
        Serial.println("RETURN");
        #endif
        index++;
        }
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      okeeprom_eeget_delay2(ptr, slot);
      if(temp[0] > 0 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading Delay2 from EEPROM...");
        Serial.print("Delay ");
        Serial.print(temp[0]);
        Serial.println(" Seconds before entering password");
        #endif
        if (temp[0] <= 30)
        {
        delay2=temp[0];
        keybuffer[index] = temp[0] + 10;
        index++;
        }
      }
      passwordlength = okeeprom_eeget_password(ptr, slot);
      if(passwordlength > 0)
      {
        #ifdef DEBUG
        Serial.println("Reading Password from EEPROM...");
        Serial.print("Password Length = ");
        Serial.println(passwordlength);
        Serial.println("Encrypted");
        byteprint(temp, passwordlength);
        #endif
        okcore_aes_gcm_decrypt(temp, slot, 5, profilekey, passwordlength);
        ByteToChar2(temp, keybuffer, passwordlength, index);
        #ifdef DEBUG
        Serial.println("Unencrypted");
        byteprint(temp, passwordlength);
        #endif
        index=passwordlength+index;
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      if(addchar2 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading after password addchar...");
        #endif
        if(addchar2 == 1) {
        keybuffer[index] = 1;
        #ifdef DEBUG
        Serial.println("TAB");
        #endif
        index++;
        }
        else if(addchar2 == 2) {
        keybuffer[index] = 2;
        #ifdef DEBUG
        Serial.println("RETURN");
        #endif
        index++;
        }
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      okeeprom_eeget_delay3(ptr, slot);
      if(temp[0] > 0 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading Delay3 from EEPROM...");
        Serial.print("Delay ");
        Serial.print(temp[0]);
        Serial.println(" Seconds before entering 2FA");
        #endif
        if (temp[0] <= 30)
        {
        delay3=temp[0];
        keybuffer[index] = temp[0] + 10;
        index++;
        }
      }
      memset(temp, 0, 64); //Wipe all data from buffer
      if(addchar5 && !scripted_mode)
      {
        #ifdef DEBUG
        Serial.println("Reading before OTP addchar...");
        #endif
        keybuffer[index] = 1;
        #ifdef DEBUG
        Serial.println("TAB");
        #endif
        index++;
      }
      otplength = okeeprom_eeget_2FAtype(ptr, slot);
      if(temp[0] > 0)
      {
        if(temp[0] == MFAGOOGLEAUTH) { //Google Auth
          #ifdef DEBUG
          Serial.println("Reading TOTP Key from Flash...");
          #endif
          otplength = okcore_flashget_2fa_key(ptr, slot);
        #ifdef DEBUG
        Serial.println("Encrypted");
        byteprint(temp, otplength);
        Serial.print("TOTP Key Length = ");
        Serial.println(otplength);
        #endif  
        okcore_aes_gcm_decrypt(temp, slot, 9, profilekey, otplength); 
        ByteToChar2(temp, keybuffer, otplength, index);
        #ifdef DEBUG
        Serial.println("Unencrypted");
        byteprint(temp, otplength);
        #endif
          TOTP totp1 = TOTP(temp, otplength);
          GMT = now();
          GMT = GMT + delay1 + delay2 + delay3;
          #ifdef DEBUG
          Serial.println(GMT);
          #endif
          newcode = totp1.getCode(GMT);
          if (timeStatus() == timeNotSet) {
            keybuffer[index]='N';
            keybuffer[index+1]='O';
            keybuffer[index+2]='T';
            keybuffer[index+3]='S';
            keybuffer[index+4]='E';
            keybuffer[index+5]='T';
          } else {
            keybuffer[index]=*newcode;
            keybuffer[index+1]=*(newcode+1);
            keybuffer[index+2]=*(newcode+2);
            keybuffer[index+3]=*(newcode+3);
            keybuffer[index+4]=*(newcode+4);
            keybuffer[index+5]=*(newcode+5);
          }
          index=index+6;
          memset(temp, 0, 64); //Wipe all data from buffer
        }
        if(temp[0] == MFAOLDYUBIOTP && profilemode!=NONENCRYPTEDPROFILE) {
          #ifdef DEBUG
          Serial.println("Generating Yubico OTP Legacy...");
          #endif
          #ifdef STD_VERSION
          yubikeysim(keybuffer + index, 0);
          index=index+44;
          #endif
        }
        if((temp[0] == MFAYUBIOTPandHMACSHA1 || temp[0] == MFAYUBIOTP) && profilemode!=NONENCRYPTEDPROFILE) {
          #ifdef DEBUG
          Serial.println("Generating Yubico OTP...");
          #endif
          #ifdef STD_VERSION
          int publen;
          publen = yubikeysim(keybuffer + index, slot);
          index=index+32+(publen*2);
          #endif
        }
        if(temp[0] == MFAOLDU2F && profilemode!=NONENCRYPTEDPROFILE) { //U2F
          keybuffer[index] = 9;
          index++;
        }
      }
      if(addchar6)
      {
        #ifdef DEBUG
        Serial.println("Reading after OTP addchar...");
        #endif
        keybuffer[index] = 1;
        #ifdef DEBUG
        Serial.println("TAB");
        #endif
        index++;
      }
      if(addchar3)
      {
        #ifdef DEBUG
        Serial.println("Reading after OTP addchar...");
        #endif
        keybuffer[index] = 2;
        #ifdef DEBUG
        Serial.println("RETURN");
        #endif
        index++;
      }
      keybuffer[index] = 0;
          #ifdef DEBUG
          Serial.println("Displaying Full Keybuffer");
          for (int i=0; keybuffer[i]!=0x00; i++) {
            Serial.print
            (keybuffer[i]);
          }
          #endif
}

void sendInitialized(Task* me) {
    if (onlykeyhw==OK_HW_DUO){
      int n = RawHID.recv(recv_buffer, 0); // 0 timeout = do not wait
      if (n && recv_buffer[4] == OKPIN && recv_buffer[5]>='0' && initialized == true && unlocked == false && onlykeyhw==OK_HW_DUO) {
        unlocked = false;
        firsttime = true;
        password.reset(); //reset the guessed password to NULL
        okcore_pin_login(); // Received PIN Login Attempt for OnlyKey Duo
        pass_keypress=10;
        button_selected=0;
        payload(10); // Try the PIN
        memset(recv_buffer, 0, sizeof(recv_buffer));
        if (unlocked == true) {
          hidprint(HW_MODEL(UNLOCKED));
        }
      } else {
        hidprint("INITIALIZED-D");
      }
    } else hidprint("INITIALIZED");
    #ifdef DEBUG
    Serial.println("INITIALIZED");
    #endif
}

void resetkeys () {
  delay(200);
  Keyboard.set_key1(0);
  Keyboard.set_key2(0);
  Keyboard.set_key3(0);
  Keyboard.set_key4(0);
  Keyboard.set_key5(0);
  Keyboard.set_key6(0);
  Keyboard.set_modifier(0);
  Keyboard.set_media(0);
  Keyboard.send_now();
}

void ctrl_alt_del () {
  //Keyboard.set_modifier(MODIFIERKEY_CTRL);  
 // Keyboard.send_now();
 // Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_ALT);  
  Keyboard.send_now();
 // Keyboard.set_key1(KEY_DELETE);  
  Keyboard.send_now();
  resetkeys();
 // Keyboard.set_key1(KEY_ESC);  
  Keyboard.send_now();
  resetkeys();
}

void lock_ok_and_screen () {
    unlocked = false;
    firsttime = true;
    password.reset(); //reset the guessed password to NULL
    pass_keypress=1;
    memset(profilekey, 0, 32);
    //Lock Windows and Linux (Gnome Super+L to lock)
    Keyboard.set_modifier(MODIFIERKEY_GUI);  
    Keyboard.send_now();
    Keyboard.set_key1(KEY_L);  
    Keyboard.send_now();
    resetkeys();
    //Lock Mac
    Keyboard.set_modifier(MODIFIERKEY_CTRL);  
    Keyboard.send_now();
    Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_GUI); 
    Keyboard.send_now();
    Keyboard.set_key1(KEY_Q); 
    Keyboard.send_now();  
    delay(500);  // Mac OS-X will not recognize a very short eject press
    Keyboard.set_media(0);
    Keyboard.send_now(); 
    resetkeys();
    CPU_RESTART();
}

void fw_hash(unsigned char* hashptr) {
  #ifdef STD_VERSION
   unsigned char smesg[17000];
   unsigned long adr = fwstartadr;
   //Hash current fw in hashptr   
   while (adr <= 0x36060) { //13 blocks of 16384 bytes, last block 0x36060 - 0x3A060
     okcore_flashget_common (smesg, (unsigned long*)adr, 16384); //Read each block
     if (adr == (unsigned long)fwstartadr) { 
       crypto_hash(hashptr,smesg,16384); //hash this block
     }
     else { //if not first block, hash with previous block hash
     memcpy(smesg + 16384, hashptr, crypto_hash_BYTES);
     crypto_hash(hashptr,smesg,(16384+crypto_hash_BYTES)); 
     }
     adr = adr + 16384;
  }
  return;
  #endif
}

void keymap_press (char key) {
  extern uint8_t keyboard_modifier_keys;
  extern uint8_t keyboard_keys[6];
  if ((uint8_t)*pos>'0' && (uint8_t)*pos<='9') {
    delay((*(pos)-'0')*1000);
  } else if ((uint8_t)*pos=='t' || (uint8_t)*pos=='r') {
    if (key) {
      Keyboard.press(*pos);
      key=0;
    }
    else if ((uint8_t)*pos=='t') {
      key = KEY_TAB;
    }
    else if ((uint8_t)*pos=='r') {
      key = KEY_RETURN;
    }
  } else if (mod_keys_enabled) {
    if (key) {
      Keyboard.press(*pos);
      key=0;
    } else {  
      if ((uint8_t)*pos=='p') key = KEY_PRINTSCREEN;
      else if ((uint8_t)*pos=='h') key = KEY_HOME;
      else if ((uint8_t)*pos=='u') key = KEY_PAGE_UP;
      else if ((uint8_t)*pos=='o') key = KEY_PAGE_DOWN;
      else if ((uint8_t)*pos=='e') key = KEY_END;
      else if ((uint8_t)*pos=='d') key = KEY_DELETE;
      else if ((uint8_t)*pos=='b') key = KEY_BACKSPACE;
      else if ((uint8_t)*pos=='L') key = KEY_LEFT;
      else if ((uint8_t)*pos=='R') key = KEY_RIGHT;
      else if ((uint8_t)*pos=='U') key = KEY_UP;
      else if ((uint8_t)*pos=='D') key = KEY_DOWN;
      else if ((uint8_t)*pos=='E') key = KEY_ESC;

      if ((uint8_t)*pos=='c') keyboard_modifier_keys |= MODIFIERKEY_CTRL;
      else if ((uint8_t)*pos=='s') keyboard_modifier_keys |= MODIFIERKEY_SHIFT;
      else if ((uint8_t)*pos=='a') keyboard_modifier_keys |= MODIFIERKEY_ALT;
      else if ((uint8_t)*pos=='g') keyboard_modifier_keys |= MODIFIERKEY_GUI; 
    }
  } 
  
  if (keyboard_keys[0] == 0) keyboard_keys[0] = key;
  else if (keyboard_keys[1] == 0) keyboard_keys[1] = key;
  else if (keyboard_keys[2] == 0) keyboard_keys[2] = key;
  else if (keyboard_keys[3] == 0) keyboard_keys[3] = key;
  else if (keyboard_keys[4] == 0) keyboard_keys[4] = key;
  else if (keyboard_keys[5] == 0) keyboard_keys[5] = key;
  Keyboard.send_now();
}

void exceeded_login_attempts() {
  #ifdef DEBUG
  Serial.print("password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login");
  #endif
  while(1==1)
    {
    hidprint("Error password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login");
    #ifdef OK_Color
    NEO_Color = 1; //Red
    #endif
    blink(5);
    }
}





================================================
FILE: README.md
================================================
# OnlyKey Firmware

This is the official firmware for **OnlyKey**

OnlyKey can be purchased here: [OnlyKey order](https://onlykey.io)

## Getting Started

Just getting started with OnlyKey?

[Start here](https://onlykey.io/start)

## About

The firmware is the software that runs on the OnlyKey itself. In order to load firmware follow the instructions in the [User's Guide here](https://docs.crp.to/usersguide.html#loading-onlykey-firmware)

## Development

OnlyKey firmware is open source and new features are added with each firmware release. A list of of supported features are available [here](https://docs.crp.to/features.html)

## Support

Check out the [OnlyKey Support Forum](https://forum.onlykey.io)

Check out the [OnlyKey Documentation](https://docs.crp.to)

## Libraries

OnlyKey firmware uses additional libraries that are available [here](https://github.com/trustcrypto/libraries).

# Legal things
## Cryptography Notice

This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software.
BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
See <http://www.wassenaar.org/> for more information.

The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms.
The form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.

The following cryptographic software is included in this distribution:

                      "MBED TLS PROJECT" - https://github.com/ARMmbed/mbedtls
                      "MICRO-ECC PROJECT" - https://github.com/kmackay/micro-ecc
                      "ARDUINOLIBS PROJECT" - https://rweather.github.io/arduinolibs/crypto.html
                      "YUBICO-C PROJECT" - https://github.com/Yubico/yubico-c

For more information on export restrictions see: http://www.apache.org/licenses/exports/

## Source

[OnlyKey Firmware on Github](https://github.com/trustcrypto/OnlyKey-Firmware)


================================================
FILE: keylayouts.c
================================================
/* Modifications
 * Copyright (c) 2015-2020, CryptoTrust LLC.
 * All rights reserved.
 * 
 * Author : Tim Steiner <t@crp.to>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by CryptoTrust LLC. for
 *    the OnlyKey Project (https://www.crp.to/ok)"
 *
 * 4. The names "OnlyKey" and "CryptoTrust" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    admin@crp.to.
 *
 * 5. Products derived from this software may not be called "OnlyKey"
 *    nor may "OnlyKey" or "CryptoTrust" appear in their names without
 *    specific prior written permission. For written permission, please
 *    contact admin@crp.to.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by CryptoTrust LLC. for
 *    the OnlyKey Project (https://www.crp.to/ok)"
 *
 * 7. Redistributions in any form must be accompanied by information on
 *    how to obtain complete source code for this software and any
 *    accompanying software that uses this software. The source code
 *    must either be included in the distribution or be available for
 *    no more than the cost of distribution plus a nominal fee, and must
 *    be freely redistributable under reasonable conditions. For a
 *    binary file, complete source code means the source code for all
 *    modules it contains.
 *
 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS
 * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT
 * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM
 * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE
 * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE
 * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY
 * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF
 * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER
 * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE
 * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION
 * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM
 * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL
 * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT
 * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS
 * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF
 * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS
 * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/* Original Teensyduino Core Library
 * http://www.pjrc.com/teensy/
 * Copyright (c) 2013 PJRC.COM, LLC.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * 1. The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * 2. If the Software is incorporated into a build system that allows
 * selection among a list of target devices, then similar target
 * devices manufactured by PJRC.COM must be included in the list of
 * target devices and selectable in the same manner.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <avr/pgmspace.h>
#include <stdint.h>

#include "keylayouts.h"

#ifdef M
#undef M
#endif
#define M(n) ((n) & KEYCODE_MASK)

KEYCODE_TYPE keycodes_ascii[96] = {0};

KEYCODE_TYPE keycodes_iso_8859_1[96] = {0};

uint8_t KeyboardLayout[1];
uint16_t SHIFT_MASK = 0;
uint16_t ALTGR_MASK = 0;
uint16_t RCTRL_MASK = 0;
uint16_t KEY_NON_US_100 = 0;
uint16_t DEADKEYS_MASK = 0;
uint16_t CIRCUMFLEX_BITS = 0;
uint16_t ACUTE_ACCENT_BITS = 0;
uint16_t GRAVE_ACCENT_BITS = 0;
uint16_t TILDE_BITS = 0;
uint16_t DIAERESIS_BITS = 0;
uint16_t DEADKEY_CIRCUMFLEX = 0;
uint16_t DEADKEY_ACUTE_ACCENT = 0;
uint16_t DEADKEY_GRAVE_ACCENT = 0;
uint16_t DEADKEY_TILDE = 0;
uint16_t DEADKEY_DIAERESIS = 0;
uint16_t UNICODE_20AC = 0;
uint16_t CEDILLA_BITS = 0;
uint16_t DEADKEY_CEDILLA = 0;
uint16_t RING_ABOVE_BITS = 0;
uint16_t DEADKEY_RING_ABOVE = 0;
uint16_t DEGREE_SIGN_BITS = 0;
uint16_t CARON_BITS = 0;
uint16_t BREVE_BITS = 0;
uint16_t OGONEK_BITS = 0;
uint16_t DOT_ABOVE_BITS = 0;
uint16_t DOUBLE_ACUTE_BITS = 0;
uint16_t DEADKEY_DEGREE_SIGN = 0;
uint16_t DEADKEY_CARON = 0;
uint16_t DEADKEY_BREVE = 0;
uint16_t DEADKEY_OGONEK = 0;
uint16_t DEADKEY_DOT_ABOVE = 0;
uint16_t DEADKEY_DOUBLE_ACUTE = 0;
uint16_t UNICODE_EXTRA0A = 0;
uint16_t KEYCODE_EXTRA0A = 0;
uint16_t ISO_8859_1_A0 = 0;
uint16_t UNICODE_EXTRA00 = 0;
uint16_t UNICODE_EXTRA01 = 0;
uint16_t UNICODE_EXTRA02 = 0;
uint16_t UNICODE_EXTRA03 = 0;
uint16_t UNICODE_EXTRA04 = 0;
uint16_t UNICODE_EXTRA05 = 0;
uint16_t UNICODE_EXTRA06 = 0;
uint16_t UNICODE_EXTRA07 = 0;
uint16_t UNICODE_EXTRA08 = 0;
uint16_t UNICODE_EXTRA09 = 0;
uint16_t KEYCODE_EXTRA00 = 0;
uint16_t KEYCODE_EXTRA01 = 0;
uint16_t KEYCODE_EXTRA02 = 0;
uint16_t KEYCODE_EXTRA03 = 0;
uint16_t KEYCODE_EXTRA04 = 0;
uint16_t KEYCODE_EXTRA05 = 0;
uint16_t KEYCODE_EXTRA06 = 0;
uint16_t KEYCODE_EXTRA07 = 0;
uint16_t KEYCODE_EXTRA08 = 0;
uint16_t KEYCODE_EXTRA09 = 0;
uint16_t KEYCODE_MASK = 0;

void update_keyboard_layout() {

SHIFT_MASK = 0;
ALTGR_MASK = 0;
RCTRL_MASK = 0;
KEY_NON_US_100 = 0;
DEADKEYS_MASK = 0;
CIRCUMFLEX_BITS = 0;
ACUTE_ACCENT_BITS = 0;
GRAVE_ACCENT_BITS = 0;
TILDE_BITS = 0;
DIAERESIS_BITS = 0;
DEADKEY_CIRCUMFLEX = 0;
DEADKEY_ACUTE_ACCENT = 0;
DEADKEY_GRAVE_ACCENT = 0;
DEADKEY_TILDE = 0;
DEADKEY_DIAERESIS = 0;
UNICODE_20AC = 0;
CEDILLA_BITS = 0;
DEADKEY_CEDILLA = 0;
RING_ABOVE_BITS = 0;
DEADKEY_RING_ABOVE = 0;
DEGREE_SIGN_BITS = 0;
CARON_BITS = 0;
BREVE_BITS = 0;
OGONEK_BITS = 0;
DOT_ABOVE_BITS = 0;
DOUBLE_ACUTE_BITS = 0;
DEADKEY_DEGREE_SIGN = 0;
DEADKEY_CARON = 0;
DEADKEY_BREVE = 0;
DEADKEY_OGONEK = 0;
DEADKEY_DOT_ABOVE = 0;
DEADKEY_DOUBLE_ACUTE = 0;
UNICODE_EXTRA0A = 0;
KEYCODE_EXTRA0A = 0;

uint16_t ASCII_20 = 0;
uint16_t ASCII_21 = 0;
uint16_t ASCII_22 = 0;
uint16_t ASCII_23 = 0;
uint16_t ASCII_24 = 0;
uint16_t ASCII_25 = 0;
uint16_t ASCII_26 = 0;
uint16_t ASCII_27 = 0;
uint16_t ASCII_28 = 0;
uint16_t ASCII_29 = 0;
uint16_t ASCII_2A = 0;
uint16_t ASCII_2B = 0;
uint16_t ASCII_2C = 0;
uint16_t ASCII_2D = 0;
uint16_t ASCII_2E = 0;
uint16_t ASCII_2F = 0;
uint16_t ASCII_30 = 0;
uint16_t ASCII_31 = 0;
uint16_t ASCII_32 = 0;
uint16_t ASCII_33 = 0;
uint16_t ASCII_34 = 0;
uint16_t ASCII_35 = 0;
uint16_t ASCII_36 = 0;
uint16_t ASCII_37 = 0;
uint16_t ASCII_38 = 0;
uint16_t ASCII_39 = 0;
uint16_t ASCII_3A = 0;
uint16_t ASCII_3B = 0;
uint16_t ASCII_3C = 0;
uint16_t ASCII_3D = 0;
uint16_t ASCII_3E = 0;
uint16_t ASCII_3F = 0;
uint16_t ASCII_40 = 0;
uint16_t ASCII_41 = 0;
uint16_t ASCII_42 = 0;
uint16_t ASCII_43 = 0;
uint16_t ASCII_44 = 0;
uint16_t ASCII_45 = 0;
uint16_t ASCII_46 = 0;
uint16_t ASCII_47 = 0;
uint16_t ASCII_48 = 0;
uint16_t ASCII_49 = 0;
uint16_t ASCII_4A = 0;
uint16_t ASCII_4B = 0;
uint16_t ASCII_4C = 0;
uint16_t ASCII_4D = 0;
uint16_t ASCII_4E = 0;
uint16_t ASCII_4F = 0;
uint16_t ASCII_50 = 0;
uint16_t ASCII_51 = 0;
uint16_t ASCII_52 = 0;
uint16_t ASCII_53 = 0;
uint16_t ASCII_54 = 0;
uint16_t ASCII_55 = 0;
uint16_t ASCII_56 = 0;
uint16_t ASCII_57 = 0;
uint16_t ASCII_58 = 0;
uint16_t ASCII_59 = 0;
uint16_t ASCII_5A = 0;
uint16_t ASCII_5B = 0;
uint16_t ASCII_5C = 0;
uint16_t ASCII_5D = 0;
uint16_t ASCII_5E = 0;
uint16_t ASCII_5F = 0;
uint16_t ASCII_60 = 0;
uint16_t ASCII_61 = 0;
uint16_t ASCII_62 = 0;
uint16_t ASCII_63 = 0;
uint16_t ASCII_64 = 0;
uint16_t ASCII_65 = 0;
uint16_t ASCII_66 = 0;
uint16_t ASCII_67 = 0;
uint16_t ASCII_68 = 0;
uint16_t ASCII_69 = 0;
uint16_t ASCII_6A = 0;
uint16_t ASCII_6B = 0;
uint16_t ASCII_6C = 0;
uint16_t ASCII_6D = 0;
uint16_t ASCII_6E = 0;
uint16_t ASCII_6F = 0;
uint16_t ASCII_70 = 0;
uint16_t ASCII_71 = 0;
uint16_t ASCII_72 = 0;
uint16_t ASCII_73 = 0;
uint16_t ASCII_74 = 0;
uint16_t ASCII_75 = 0;
uint16_t ASCII_76 = 0;
uint16_t ASCII_77 = 0;
uint16_t ASCII_78 = 0;
uint16_t ASCII_79 = 0;
uint16_t ASCII_7A = 0;
uint16_t ASCII_7B = 0;
uint16_t ASCII_7C = 0;
uint16_t ASCII_7D = 0;
uint16_t ASCII_7E = 0;
uint16_t ASCII_7F = 0;

ISO_8859_1_A0 = 0;
uint16_t ISO_8859_1_A1 = 0;
uint16_t ISO_8859_1_A2 = 0;
uint16_t ISO_8859_1_A3 = 0;
uint16_t ISO_8859_1_A4 = 0;
uint16_t ISO_8859_1_A5 = 0;
uint16_t ISO_8859_1_A6 = 0;
uint16_t ISO_8859_1_A7 = 0;
uint16_t ISO_8859_1_A8 = 0;
uint16_t ISO_8859_1_A9 = 0;
uint16_t ISO_8859_1_AA = 0;
uint16_t ISO_8859_1_AB = 0;
uint16_t ISO_8859_1_AC = 0;
uint16_t ISO_8859_1_AD = 0;
uint16_t ISO_8859_1_AE = 0;
uint16_t ISO_8859_1_AF = 0;
uint16_t ISO_8859_1_B0 = 0;
uint16_t ISO_8859_1_B1 = 0;
uint16_t ISO_8859_1_B2 = 0;
uint16_t ISO_8859_1_B3 = 0;
uint16_t ISO_8859_1_B4 = 0;
uint16_t ISO_8859_1_B5 = 0;
uint16_t ISO_8859_1_B6 = 0;
uint16_t ISO_8859_1_B7 = 0;
uint16_t ISO_8859_1_B8 = 0;
uint16_t ISO_8859_1_B9 = 0;
uint16_t ISO_8859_1_BA = 0;
uint16_t ISO_8859_1_BB = 0;
uint16_t ISO_8859_1_BC = 0;
uint16_t ISO_8859_1_BD = 0;
uint16_t ISO_8859_1_BE = 0;
uint16_t ISO_8859_1_BF = 0;
uint16_t ISO_8859_1_C0 = 0;
uint16_t ISO_8859_1_C1 = 0;
uint16_t ISO_8859_1_C2 = 0;
uint16_t ISO_8859_1_C3 = 0;
uint16_t ISO_8859_1_C4 = 0;
uint16_t ISO_8859_1_C5 = 0;
uint16_t ISO_8859_1_C6 = 0;
uint16_t ISO_8859_1_C7 = 0;
uint16_t ISO_8859_1_C8 = 0;
uint16_t ISO_8859_1_C9 = 0;
uint16_t ISO_8859_1_CA = 0;
uint16_t ISO_8859_1_CB = 0;
uint16_t ISO_8859_1_CC = 0;
uint16_t ISO_8859_1_CD = 0;
uint16_t ISO_8859_1_CE = 0;
uint16_t ISO_8859_1_CF = 0;
uint16_t ISO_8859_1_D0 = 0;
uint16_t ISO_8859_1_D1 = 0;
uint16_t ISO_8859_1_D2 = 0;
uint16_t ISO_8859_1_D3 = 0;
uint16_t ISO_8859_1_D4 = 0;
uint16_t ISO_8859_1_D5 = 0;
uint16_t ISO_8859_1_D6 = 0;
uint16_t ISO_8859_1_D7 = 0;
uint16_t ISO_8859_1_D8 = 0;
uint16_t ISO_8859_1_D9 = 0;
uint16_t ISO_8859_1_DA = 0;
uint16_t ISO_8859_1_DB = 0;
uint16_t ISO_8859_1_DC = 0;
uint16_t ISO_8859_1_DD = 0;
uint16_t ISO_8859_1_DE = 0;
uint16_t ISO_8859_1_DF = 0;
uint16_t ISO_8859_1_E0 = 0;
uint16_t ISO_8859_1_E1 = 0;
uint16_t ISO_8859_1_E2 = 0;
uint16_t ISO_8859_1_E3 = 0;
uint16_t ISO_8859_1_E4 = 0;
uint16_t ISO_8859_1_E5 = 0;
uint16_t ISO_8859_1_E6 = 0;
uint16_t ISO_8859_1_E7 = 0;
uint16_t ISO_8859_1_E8 = 0;
uint16_t ISO_8859_1_E9 = 0;
uint16_t ISO_8859_1_EA = 0;
uint16_t ISO_8859_1_EB = 0;
uint16_t ISO_8859_1_EC = 0;
uint16_t ISO_8859_1_ED = 0;
uint16_t ISO_8859_1_EE = 0;
uint16_t ISO_8859_1_EF = 0;
uint16_t ISO_8859_1_F0 = 0;
uint16_t ISO_8859_1_F1 = 0;
uint16_t ISO_8859_1_F2 = 0;
uint16_t ISO_8859_1_F3 = 0;
uint16_t ISO_8859_1_F4 = 0;
uint16_t ISO_8859_1_F5 = 0;
uint16_t ISO_8859_1_F6 = 0;
uint16_t ISO_8859_1_F7 = 0;
uint16_t ISO_8859_1_F8 = 0;
uint16_t ISO_8859_1_F9 = 0;
uint16_t ISO_8859_1_FA = 0;
uint16_t ISO_8859_1_FB = 0;
uint16_t ISO_8859_1_FC = 0;
uint16_t ISO_8859_1_FD = 0;
uint16_t ISO_8859_1_FE = 0;
uint16_t ISO_8859_1_FF = 0;

UNICODE_EXTRA00 = 0;
UNICODE_EXTRA01 = 0;
UNICODE_EXTRA02 = 0;
UNICODE_EXTRA03 = 0;
UNICODE_EXTRA04 = 0;
UNICODE_EXTRA05 = 0;
UNICODE_EXTRA06 = 0;
UNICODE_EXTRA07 = 0;
UNICODE_EXTRA08 = 0;
UNICODE_EXTRA09 = 0;
uint16_t UNICODE_EXTRA10 = 0;
uint16_t UNICODE_EXTRA11 = 0;
uint16_t UNICODE_EXTRA12 = 0;
uint16_t UNICODE_EXTRA13 = 0;
uint16_t UNICODE_EXTRA14 = 0;
uint16_t UNICODE_EXTRA15 = 0;
uint16_t UNICODE_EXTRA16 = 0;
uint16_t UNICODE_EXTRA17 = 0;
uint16_t UNICODE_EXTRA18 = 0;
uint16_t UNICODE_EXTRA19 = 0;
uint16_t UNICODE_EXTRA20 = 0;
uint16_t UNICODE_EXTRA21 = 0;
uint16_t UNICODE_EXTRA22 = 0;
uint16_t UNICODE_EXTRA23 = 0;
uint16_t UNICODE_EXTRA24 = 0;
uint16_t UNICODE_EXTRA25 = 0;
uint16_t UNICODE_EXTRA26 = 0;
uint16_t UNICODE_EXTRA27 = 0;
uint16_t UNICODE_EXTRA28 = 0;
uint16_t UNICODE_EXTRA29 = 0;
uint16_t UNICODE_EXTRA30 = 0;
uint16_t UNICODE_EXTRA31 = 0;
uint16_t UNICODE_EXTRA32 = 0;
uint16_t UNICODE_EXTRA33 = 0;
uint16_t UNICODE_EXTRA34 = 0;
uint16_t UNICODE_EXTRA35 = 0;
uint16_t UNICODE_EXTRA36 = 0;
uint16_t UNICODE_EXTRA37 = 0;
uint16_t UNICODE_EXTRA38 = 0;
uint16_t UNICODE_EXTRA39 = 0;
uint16_t UNICODE_EXTRA40 = 0;
uint16_t UNICODE_EXTRA41 = 0;
uint16_t UNICODE_EXTRA42 = 0;
uint16_t UNICODE_EXTRA43 = 0;
uint16_t UNICODE_EXTRA44 = 0;
uint16_t UNICODE_EXTRA45 = 0;
uint16_t UNICODE_EXTRA46 = 0;
uint16_t UNICODE_EXTRA47 = 0;
uint16_t UNICODE_EXTRA48 = 0;
uint16_t UNICODE_EXTRA49 = 0;
uint16_t UNICODE_EXTRA50 = 0;
uint16_t UNICODE_EXTRA51 = 0;

KEYCODE_EXTRA00 = 0;
KEYCODE_EXTRA01 = 0;
KEYCODE_EXTRA02 = 0;
KEYCODE_EXTRA03 = 0;
KEYCODE_EXTRA04 = 0;
KEYCODE_EXTRA05 = 0;
KEYCODE_EXTRA06 = 0;
KEYCODE_EXTRA07 = 0;
KEYCODE_EXTRA08 = 0;
KEYCODE_EXTRA09 = 0;
uint16_t KEYCODE_EXTRA10 = 0;
uint16_t KEYCODE_EXTRA11 = 0;
uint16_t KEYCODE_EXTRA12 = 0;
uint16_t KEYCODE_EXTRA13 = 0;
uint16_t KEYCODE_EXTRA14 = 0;
uint16_t KEYCODE_EXTRA15 = 0;
uint16_t KEYCODE_EXTRA16 = 0;
uint16_t KEYCODE_EXTRA17 = 0;
uint16_t KEYCODE_EXTRA18 = 0;
uint16_t KEYCODE_EXTRA19 = 0;
uint16_t KEYCODE_EXTRA20 = 0;
uint16_t KEYCODE_EXTRA21 = 0;
uint16_t KEYCODE_EXTRA22 = 0;
uint16_t KEYCODE_EXTRA23 = 0;
uint16_t KEYCODE_EXTRA24 = 0;
uint16_t KEYCODE_EXTRA25 = 0;
uint16_t KEYCODE_EXTRA26 = 0;
uint16_t KEYCODE_EXTRA27 = 0;
uint16_t KEYCODE_EXTRA28 = 0;
uint16_t KEYCODE_EXTRA29 = 0;
uint16_t KEYCODE_EXTRA30 = 0;
uint16_t KEYCODE_EXTRA31 = 0;
uint16_t KEYCODE_EXTRA32 = 0;
uint16_t KEYCODE_EXTRA33 = 0;
uint16_t KEYCODE_EXTRA34 = 0;
uint16_t KEYCODE_EXTRA35 = 0;
uint16_t KEYCODE_EXTRA36 = 0;
uint16_t KEYCODE_EXTRA37 = 0;
uint16_t KEYCODE_EXTRA38 = 0;
uint16_t KEYCODE_EXTRA39 = 0;
uint16_t KEYCODE_EXTRA40 = 0;
uint16_t KEYCODE_EXTRA41 = 0;
uint16_t KEYCODE_EXTRA42 = 0;
uint16_t KEYCODE_EXTRA43 = 0;
uint16_t KEYCODE_EXTRA44 = 0;
uint16_t KEYCODE_EXTRA45 = 0;
uint16_t KEYCODE_EXTRA46 = 0;
uint16_t KEYCODE_EXTRA47 = 0;
uint16_t KEYCODE_EXTRA48 = 0;
uint16_t KEYCODE_EXTRA49 = 0;
uint16_t KEYCODE_EXTRA50 = 0;
uint16_t KEYCODE_EXTRA51 = 0;


if (KeyboardLayout[0] == LAYOUT_USA_ENGLISH || KeyboardLayout[0] == LAYOUT_DVORAK || KeyboardLayout[0] == 0x00) {
SHIFT_MASK=0x0040;
//KEYCODE_TYPE=uint8_t
KEYCODE_MASK=0x007F;
ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_QUOTE + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_QUOTE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 )=
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_BACKSLASH;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=KEY_TILDE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=KEY_TILDE + SHIFT_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

if (KeyboardLayout[0] == LAYOUT_DVORAK) {
    ASCII_2D=KEY_QUOTE; // -
    ASCII_5F=KEY_QUOTE + SHIFT_MASK; // _
    ASCII_3D=KEY_RIGHT_BRACE; // =
    ASCII_2B=KEY_RIGHT_BRACE + SHIFT_MASK; // +
    ASCII_71=KEY_X; // q
    ASCII_51=KEY_X + SHIFT_MASK;// Q
    ASCII_77=KEY_COMMA; // w
    ASCII_57=KEY_COMMA + SHIFT_MASK; // W
    ASCII_65=KEY_D; // e
    ASCII_45=KEY_D + SHIFT_MASK; // E
    ASCII_72=KEY_O; // r
    ASCII_52=KEY_O + SHIFT_MASK; // R
    ASCII_74=KEY_K; // t
    ASCII_54=KEY_K + SHIFT_MASK; // T
    ASCII_79=KEY_T; // y
    ASCII_59=KEY_T + SHIFT_MASK; // Y
    ASCII_75=KEY_F; // u
    ASCII_55=KEY_F + SHIFT_MASK; // U
    ASCII_69=KEY_G; // i
    ASCII_49=KEY_G + SHIFT_MASK; // I
    ASCII_6F=KEY_S; // o
    ASCII_4F=KEY_S + SHIFT_MASK; // O
    ASCII_70=KEY_R; // p
    ASCII_50=KEY_R + SHIFT_MASK; // P
    ASCII_5B=KEY_MINUS; // [
    ASCII_7B=KEY_MINUS + SHIFT_MASK; // {
    ASCII_5D=KEY_EQUAL; // ]
    ASCII_7D=KEY_EQUAL + SHIFT_MASK; // }
    ASCII_73=KEY_SEMICOLON; // s
    ASCII_53=KEY_SEMICOLON + SHIFT_MASK; // S
    ASCII_64=KEY_H; // d
    ASCII_44=KEY_H + SHIFT_MASK; // D
    ASCII_66=KEY_Y; // f 
    ASCII_46=KEY_Y + SHIFT_MASK; // F
    ASCII_67=KEY_U; // g
    ASCII_47=KEY_U + SHIFT_MASK; // G
    ASCII_68=KEY_J; // h
    ASCII_48=KEY_J + SHIFT_MASK; // H
    ASCII_6A=KEY_C; // j
    ASCII_4A=KEY_C + SHIFT_MASK; // J
    ASCII_6B=KEY_V; // k
    ASCII_4B=KEY_V + SHIFT_MASK; // K
    ASCII_6C=KEY_P; // l
    ASCII_4C=KEY_P + SHIFT_MASK; // L
    ASCII_3B=KEY_Z; // ;
    ASCII_3A=KEY_Z + SHIFT_MASK; // :
    ASCII_27=KEY_Q; // '
    ASCII_22=KEY_Q + SHIFT_MASK; // "
    ASCII_7A=KEY_SLASH; // z
    ASCII_5A=KEY_SLASH + SHIFT_MASK; // Z
    ASCII_78=KEY_B; // x
    ASCII_58=KEY_B + SHIFT_MASK; // X
    ASCII_63=KEY_I; // c
    ASCII_43=KEY_I + SHIFT_MASK; // C
    ASCII_76=KEY_PERIOD; // v
    ASCII_56=KEY_PERIOD + SHIFT_MASK; // V
    ASCII_62=KEY_N; // b
    ASCII_42=KEY_N + SHIFT_MASK; // B
    ASCII_6E=KEY_L; // n
    ASCII_4E=KEY_L + SHIFT_MASK; // N
    ASCII_2C=KEY_W; // ,
    ASCII_3C=KEY_W + SHIFT_MASK; // <
    ASCII_2E=KEY_E; // .
    ASCII_3E=KEY_E + SHIFT_MASK; // >
    ASCII_2F=KEY_LEFT_BRACE; // /
    ASCII_3F=KEY_LEFT_BRACE + SHIFT_MASK; // ?
}

// LAYOUT_USA_ENGLISH
}

else if (KeyboardLayout[0] == LAYOUT_US_INTERNATIONAL) {
SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
//KEYCODE_TYPE=uint16_t
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_QUOTE;
DEADKEY_GRAVE_ACCENT=KEY_TILDE;
DEADKEY_TILDE=KEY_TILDE + SHIFT_MASK;
DEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=DIAERESIS_BITS + KEY_SPACE;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_BACKSLASH;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=KEY_C + ALTGR_MASK + SHIFT_MASK;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + ALTGR_MASK;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=KEY_MINUS + ALTGR_MASK;// 165 ¥     YEN SIGN
ISO_8859_1_A6=KEY_BACKSLASH + ALTGR_MASK + SHIFT_MASK;// 166 ¦     BROKEN BAR;??
ISO_8859_1_A7=KEY_S + ALTGR_MASK + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 168 ¨     DIAERESIS
ISO_8859_1_A9=KEY_C + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_LEFT_BRACE + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_BACKSLASH + ALTGR_MASK;// 172 ¬     NOT SIGN;??
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=KEY_QUOTE + ALTGR_MASK;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=KEY_SEMICOLON + ALTGR_MASK;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=KEY_1 + ALTGR_MASK + SHIFT_MASK;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_RIGHT_BRACE + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_6 + ALTGR_MASK;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_7 + ALTGR_MASK;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=KEY_8 + ALTGR_MASK;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_SLASH + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=KEY_Q + ALTGR_MASK + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_W + ALTGR_MASK + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_Z + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE
ISO_8859_1_C7=KEY_COMMA + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH
ISO_8859_1_D1=KEY_N + ALTGR_MASK + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=KEY_P + ALTGR_MASK + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=KEY_EQUAL + ALTGR_MASK;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_L + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=KEY_Y + ALTGR_MASK + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_W + ALTGR_MASK;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_Z + ALTGR_MASK;// 230 æ     ae
ISO_8859_1_E7=KEY_COMMA + ALTGR_MASK;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH
ISO_8859_1_F1=KEY_N + ALTGR_MASK;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O ;// 245 õ     o TILDE
ISO_8859_1_F6=KEY_P + ALTGR_MASK;// 246 ö     o DIAERESIS
ISO_8859_1_F7=KEY_EQUAL + ALTGR_MASK + SHIFT_MASK;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_L + ALTGR_MASK;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=KEY_Y + ALTGR_MASK;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_5 + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_US_INTERNATIONAL

}

else if (KeyboardLayout[0] == LAYOUT_GERMAN) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0300;
ACUTE_ACCENT_BITS=0x0400;
GRAVE_ACCENT_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_TILDE;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #=??
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_Q + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Z + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Z;// 121 y
ASCII_7A=KEY_Y;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=KEY_RIGHT_BRACE + ALTGR_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent Sign
ISO_8859_1_A3=0;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_TILDE + SHIFT_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã     A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=0;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=0;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=0;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ     O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=KEY_MINUS;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã     a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=0;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=0;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=0;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ     o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_GERMAN

}

else if (KeyboardLayout[0] == LAYOUT_GERMAN_MAC) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
ACUTE_ACCENT_BITS=0x0100;
GRAVE_ACCENT_BITS=0x0200;
CIRCUMFLEX_BITS=0x0300;
DIAERESIS_BITS=0x0400;
TILDE_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_U + ALTGR_MASK;
DEADKEY_TILDE=KEY_N + ALTGR_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #=??
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_TILDE;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_L + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Z + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_5 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92
ASCII_5D=KEY_6 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Z;// 121 y
ASCII_7A=KEY_Y;// 122 z
ASCII_7B=KEY_8 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_7 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_9 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢     Cent Sign
ISO_8859_1_A3=KEY_4 + SHIFT_MASK + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤     Currency Sign
ISO_8859_1_A5=KEY_Z + ALTGR_MASK;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=KEY_H + ALTGR_MASK;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_Q + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_LEFT_BRACE + ALTGR_MASK + SHIFT_MASK; // 176 °     DEGREE SIGN
ISO_8859_1_B1=KEY_RIGHT_BRACE + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=KEY_3 + ALTGR_MASK;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=KEY_9 + SHIFT_MASK + ALTGR_MASK;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_J + ALTGR_MASK;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_Q + SHIFT_MASK + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_A + ALTGR_MASK + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE
ISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_O + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=KEY_MINUS;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_A + ALTGR_MASK;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ     ae
ISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_O + ALTGR_MASK;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Z;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_GERMAN_MAC

}

else if (KeyboardLayout[0] == LAYOUT_CANADIAN_FRENCH) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
DIAERESIS_BITS=0x0400;
CEDILLA_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_ACUTE_ACCENT=KEY_SLASH + ALTGR_MASK;
DEADKEY_GRAVE_ACCENT=KEY_QUOTE;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_CEDILLA=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_TILDE + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '
//ASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_3 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_BACKSLASH;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_BACKSLASH + SHIFT_MASK;// 62 >
ASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }
ASCII_7E=KEY_SEMICOLON + ALTGR_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_5 + ALTGR_MASK;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=KEY_7 + ALTGR_MASK;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_O + ALTGR_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_NON_US_100;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN
ISO_8859_1_AD=KEY_PERIOD + ALTGR_MASK;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=KEY_COMMA + ALTGR_MASK;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_NON_US_100 + ALTGR_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=KEY_1 + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_8 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_9 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=KEY_P + ALTGR_MASK;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_NON_US_100 + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_0 + ALTGR_MASK;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_MINUS + ALTGR_MASK;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=KEY_EQUAL + ALTGR_MASK;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=0;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=0;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=KEY_SLASH;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=0;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS

// LAYOUT_CANADIAN_FRENCH

}

else if (KeyboardLayout[0] == LAYOUT_CANADIAN_MULTILINGUAL) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
RCTRL_MASK=0x0800;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
DIAERESIS_BITS=0x0200;
ACUTE_ACCENT_BITS=0x0300;
CEDILLA_BITS=0x0400;
GRAVE_ACCENT_BITS=0x0500;
TILDE_BITS=0x0600;
RING_ABOVE_BITS=0x0700;
KEYCODE_MASK=0x0FFF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_SEMICOLON + RCTRL_MASK;
DEADKEY_CEDILLA=KEY_EQUAL + RCTRL_MASK;
DEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE + ALTGR_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_RING_ABOVE=KEY_LEFT_BRACE + SHIFT_MASK + RCTRL_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_PERIOD + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_TILDE;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + ALTGR_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + ALTGR_MASK;// 62 >
ASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_9 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + SHIFT_MASK;// 92
ASCII_5D=KEY_0 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + ALTGR_MASK;// 124 |
ASCII_7D=KEY_8 + ALTGR_MASK;// 125 }
ASCII_7E=KEY_RIGHT_BRACE + RCTRL_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160       Nonbreakng Space
ISO_8859_1_A1=KEY_1 + SHIFT_MASK + RCTRL_MASK;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=KEY_C + RCTRL_MASK;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + SHIFT_MASK + RCTRL_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK + RCTRL_MASK;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=KEY_Y + SHIFT_MASK + RCTRL_MASK;// 165 ¥     YEN SIGN
ISO_8859_1_A6=KEY_NON_US_100 + SHIFT_MASK + RCTRL_MASK; // 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_S + SHIFT_MASK + RCTRL_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=KEY_C + SHIFT_MASK + RCTRL_MASK;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=KEY_F + SHIFT_MASK + RCTRL_MASK;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_Z + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_EQUAL + ALTGR_MASK;// 172 ¬     NOT SIGN
ISO_8859_1_AD=KEY_TILDE + SHIFT_MASK + RCTRL_MASK;// 173       SOFT HYPHEN
ISO_8859_1_AE=KEY_R + SHIFT_MASK + RCTRL_MASK;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;  // special dead key - no implemented=// 175 ¯     MACRON
ISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=KEY_9 + SHIFT_MASK + RCTRL_MASK;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_2 + RCTRL_MASK;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=KEY_3 + RCTRL_MASK;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + RCTRL_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=KEY_R + RCTRL_MASK;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸     CEDILLA
ISO_8859_1_B9=KEY_1 + RCTRL_MASK;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_M + SHIFT_MASK + RCTRL_MASK;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_X + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=KEY_4 + RCTRL_MASK;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_5 + RCTRL_MASK;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=KEY_6 + RCTRL_MASK;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + RCTRL_MASK;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=KEY_BACKSLASH + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=RING_ABOVE_BITS + KEY_A + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_A + SHIFT_MASK + RCTRL_MASK;// 198 Æ     AE
ISO_8859_1_C7=KEY_RIGHT_BRACE + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=KEY_QUOTE + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + SHIFT_MASK + RCTRL_MASK;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=KEY_COMMA + SHIFT_MASK + RCTRL_MASK;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_O + SHIFT_MASK + RCTRL_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=KEY_NON_US_100 + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_P + RCTRL_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + RCTRL_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=KEY_BACKSLASH;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=RING_ABOVE_BITS + KEY_A;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_A + RCTRL_MASK;// 230 æ     ae
ISO_8859_1_E7=KEY_RIGHT_BRACE;// 231 ç     c CEDILLA
ISO_8859_1_E8=KEY_QUOTE;// 232 è     e GRAVE
ISO_8859_1_E9=KEY_SLASH;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + RCTRL_MASK;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=KEY_PERIOD + SHIFT_MASK + RCTRL_MASK;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_O + RCTRL_MASK;// 248 ø     o STROKE
ISO_8859_1_F9=KEY_NON_US_100;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_P + RCTRL_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS

// LAYOUT_CANADIAN_MULTILINGUAL

}

else if (KeyboardLayout[0] == LAYOUT_UNITED_KINGDOM) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
KEYCODE_MASK=0x00FF;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_BACKSLASH;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_7 + SHIFT_MASK;// 38 &
ASCII_27=KEY_QUOTE;// 39 '
ASCII_28=KEY_9 + SHIFT_MASK;// 40 (
ASCII_29=KEY_0 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_8 + SHIFT_MASK;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_MINUS;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_SLASH;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :
ASCII_3B=KEY_SEMICOLON;// 59 ;
ASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >
ASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?
ASCII_40=KEY_QUOTE + SHIFT_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE;// 91 [
ASCII_5C=KEY_NON_US_100;// 92
ASCII_5D=KEY_RIGHT_BRACE;// 93 ]
ASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _
ASCII_60=KEY_TILDE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }
ASCII_7E=KEY_BACKSLASH + SHIFT_MASK;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=KEY_TILDE + ALTGR_MASK;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=0;// 167 §     SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_TILDE + SHIFT_MASK;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=0;// 192 À     A GRAVE
ISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=0;// 195 Ã     A TILDE
ISO_8859_1_C4=0;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=0;// 200 È     E GRAVE
ISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=0;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=0;// 204 Ì     I GRAVE
ISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=0;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=0;// 209 Ñ     N TILDE
ISO_8859_1_D2=0;// 210 Ò     O GRAVE
ISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=0;// 213 Õ     O TILDE
ISO_8859_1_D6=0;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=0;// 217 Ù     U GRAVE
ISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=0;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=0;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=0;// 223 ß     SHARP S
ISO_8859_1_E0=0;// 224 à     a GRAVE
ISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á     a ACUTE
ISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=0;// 227 ã     a TILDE
ISO_8859_1_E4=0;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=0;// 232 è     e GRAVE
ISO_8859_1_E9=KEY_E + ALTGR_MASK;// 233 é     e ACUTE
ISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=0;// 235 ë     e DIAERESIS
ISO_8859_1_EC=0;// 236 ì     i GRAVE
ISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í     i ACUTE
ISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=0;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=0;// 241 ñ     n TILDE
ISO_8859_1_F2=0;// 242 ò     o GRAVE
ISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó     o ACUTE
ISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=0;// 245 õ     o TILDE
ISO_8859_1_F6=0;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=0;// 249 ù     u GRAVE
ISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú     u ACUTE
ISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=0;// 252 ü     u DIAERESIS
ISO_8859_1_FD=0;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_4 + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_4 + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_UNITED_KINGDOM

}

else if (KeyboardLayout[0] == LAYOUT_FINNISH) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160       Nonbreakng Space
ISO_8859_1_A1=KEY_1 + SHIFT_MASK + ALTGR_MASK;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_TILDE;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=KEY_SLASH + ALTGR_MASK;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_0 + ALTGR_MASK + SHIFT_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=KEY_X + ALTGR_MASK + SHIFT_MASK;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_3 + ALTGR_MASK + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_MINUS + ALTGR_MASK + SHIFT_MASK;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=KEY_X + ALTGR_MASK;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_SEMICOLON + ALTGR_MASK;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign
// TODO: Finnish Multilingual layout can type many more glyphs
// but we currently don't have tables tables to store them...

// LAYOUT_FINNISH

}

else if (KeyboardLayout[0] == LAYOUT_FRENCH) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
GRAVE_ACCENT_BITS=0x0200;
DIAERESIS_BITS=0x0300;
TILDE_BITS=0x0400;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;
DEADKEY_GRAVE_ACCENT=KEY_7 + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_TILDE=KEY_2 + ALTGR_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_SLASH;// 33 !
ASCII_22=KEY_3;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_RIGHT_BRACE;// 36 $
ASCII_25=KEY_QUOTE + SHIFT_MASK;// 37 %
ASCII_26=KEY_1;// 38 &
ASCII_27=KEY_4;// 39 '
ASCII_28=KEY_5;// 40 (
ASCII_29=KEY_MINUS;// 41 )
ASCII_2A=KEY_BACKSLASH;// 42 *
ASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +
ASCII_2C=KEY_M;// 44 ,
ASCII_2D=KEY_6;// 45 -
ASCII_2E=KEY_COMMA + SHIFT_MASK;// 46 .
ASCII_2F=KEY_PERIOD + SHIFT_MASK;// 47 /
ASCII_30=KEY_0 + SHIFT_MASK;// 48 0
ASCII_31=KEY_1 + SHIFT_MASK;// 49 1
ASCII_32=KEY_2 + SHIFT_MASK;// 50 2
ASCII_33=KEY_3 + SHIFT_MASK;// 51 3
ASCII_34=KEY_4 + SHIFT_MASK;// 52 4
ASCII_35=KEY_5 + SHIFT_MASK;// 53 5
ASCII_36=KEY_6 + SHIFT_MASK;// 54 6
ASCII_37=KEY_7 + SHIFT_MASK;// 55 7
ASCII_38=KEY_8 + SHIFT_MASK;// 55 8
ASCII_39=KEY_9 + SHIFT_MASK;// 57 9
ASCII_3A=KEY_PERIOD;// 58 :
ASCII_3B=KEY_COMMA;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_EQUAL;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_M + SHIFT_MASK;// 63 ?
ASCII_40=KEY_0 + ALTGR_MASK;// 64 @
ASCII_41=KEY_Q + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_SEMICOLON + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_A + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_Z + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_W + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_5 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_8 + ALTGR_MASK;// 92
ASCII_5D=KEY_MINUS + ALTGR_MASK;// 93 ]
ASCII_5E=KEY_9 + ALTGR_MASK;// 94 ^
ASCII_5F=KEY_8;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_Q;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_SEMICOLON;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_A;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_Z;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_W;// 122 z
ASCII_7B=KEY_4 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_6 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_EQUAL + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127
ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_RIGHT_BRACE + SHIFT_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_RIGHT_BRACE + ALTGR_MASK;// 164 ¤     Currency or Euro Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_SLASH + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=KEY_MINUS + SHIFT_MASK;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=KEY_TILDE;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_BACKSLASH + SHIFT_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_Q + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=0;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_Q + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_Q + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_Q + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=0;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=0;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=0;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=0;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=0;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=0;// 223 ß     SHARP S
ISO_8859_1_E0=KEY_0;// 224 à     a GRAVE
ISO_8859_1_E1=0;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_Q;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_Q;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_Q;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=KEY_9;// 231 ç     c CEDILLA
ISO_8859_1_E8=KEY_7;// 232 è     e GRAVE
ISO_8859_1_E9=KEY_2;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=0;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=0;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=KEY_SEMICOLON;// 249 ù     u GRAVE
ISO_8859_1_FA=0;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=0;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_FRENCH

}

else if (KeyboardLayout[0] == LAYOUT_DANISH || KeyboardLayout[0] == LAYOUT_DANISH_MAC) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_EQUAL + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_SEMICOLON + SHIFT_MASK;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_QUOTE + SHIFT_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_SEMICOLON;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_QUOTE;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

 if (KeyboardLayout[0] == LAYOUT_DANISH_MAC) {
    ASCII_24=KEY_3 + SHIFT_MASK + ALTGR_MASK;// 36 $
    ASCII_3C=KEY_TILDE;// 60 <
	ASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >
    ASCII_40=KEY_BACKSLASH + ALTGR_MASK;// 64 @
	ASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92 \
	ASCII_7B=KEY_8 + ALTGR_MASK + SHIFT_MASK;// 123 {
	ASCII_7D=KEY_9 + ALTGR_MASK + SHIFT_MASK;// 125 }
    ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation
    ISO_8859_1_A2=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 162 ¢     Cent SIGN
    ISO_8859_1_A3=KEY_4 + ALTGR_MASK;// 163 £     Pound Sign
    ISO_8859_1_A5=KEY_Y + ALTGR_MASK;// 165 ¥     YEN SIGN
    ISO_8859_1_A7=0;// 167 §     SECTION SIGN??
    ISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN
    ISO_8859_1_AA=KEY_A + ALTGR_MASK;// 170 ª     FEMININE ORDINAL
    ISO_8859_1_AB=KEY_H + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE
    ISO_8859_1_AC=KEY_L + ALTGR_MASK;// 172 ¬     NOT SIGN
    ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN
    ISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯     MACRON
    ISO_8859_1_B0=KEY_Q + ALTGR_MASK;// 176 °     DEGREE SIGN
    ISO_8859_1_B1=KEY_MINUS + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN
    ISO_8859_1_B6=KEY_7 + ALTGR_MASK;// 182 ¶     PILCROW SIGN
    ISO_8859_1_B7=KEY_PERIOD + ALTGR_MASK;// 183 ·     MIDDLE DOT
    ISO_8859_1_BA=KEY_BACKSLASH + SHIFT_MASK + ALTGR_MASK;// 186 º     MASCULINE ORDINAL
    ISO_8859_1_BB=KEY_H + SHIFT_MASK + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
    ISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK
    ISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA
    ISO_8859_1_D0=0;// 208 Ð     ETH
    ISO_8859_1_DE=0;// 222 Þ     THORN
    ISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç     c CEDILLA
    ISO_8859_1_FE=0;// 254 þ     THORN
 }
// LAYOUT_DANISH
}

else if (KeyboardLayout[0] == LAYOUT_NORWEGIAN) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL + ALTGR_MASK;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_EQUAL;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=KEY_QUOTE + SHIFT_MASK;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=KEY_SEMICOLON + SHIFT_MASK;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE
ISO_8859_1_E6=KEY_QUOTE;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=KEY_SEMICOLON;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_NORWEGIAN

}

else if (KeyboardLayout[0] == LAYOUT_SWEDISH) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_EQUAL;
DEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;
DEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_RIGHT_BRACE;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + SHIFT_MASK;// 35 #
ASCII_24=KEY_4 + ALTGR_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_BACKSLASH;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *
ASCII_2B=KEY_MINUS;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_MINUS + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_TILDE;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=0;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN
ISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS
ISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=0;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_SWEDISH

}

else if (KeyboardLayout[0] == LAYOUT_SPANISH) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE + SHIFT_MASK;
DEADKEY_ACUTE_ACCENT=KEY_QUOTE;
DEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE;
DEADKEY_TILDE=KEY_4 + ALTGR_MASK;
DEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {
ASCII_7C=KEY_1 + ALTGR_MASK;// 124 |
ASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=KEY_EQUAL;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=0;// 163 £     Pound Sign
ISO_8859_1_A4=0;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=0;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=KEY_TILDE + SHIFT_MASK;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=KEY_3 + SHIFT_MASK;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_TILDE;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=KEY_EQUAL;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=KEY_BACKSLASH + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=KEY_SEMICOLON + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=0;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=KEY_BACKSLASH;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=KEY_SEMICOLON;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_5 + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_SPANISH

}

else if (KeyboardLayout[0] == LAYOUT_PORTUGUESE) {

SHIFT_MASK=0x0040;
ALTGR_MASK=0x0080;
DEADKEYS_MASK=0x0700;
CIRCUMFLEX_BITS=0x0100;
ACUTE_ACCENT_BITS=0x0200;
GRAVE_ACCENT_BITS=0x0300;
TILDE_BITS=0x0400;
DIAERESIS_BITS=0x0500;
KEYCODE_MASK=0x07FF;
DEADKEY_CIRCUMFLEX=KEY_BACKSLASH;
DEADKEY_ACUTE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_GRAVE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;
DEADKEY_TILDE=KEY_BACKSLASH;
DEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_3 + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_LEFT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_LEFT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_2 + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_8 + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE + ALTGR_MASK;// 92
ASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]
ASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_7 + ALTGR_MASK;// 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_0 + ALTGR_MASK;// 125 }
ASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent SIGN
ISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=0;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_4 + ALTGR_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_AA=KEY_QUOTE + SHIFT_MASK;// 170 ª     FEMININE ORDINAL
ISO_8859_1_AB=KEY_EQUAL;// 171 «     LEFT DOUBLE ANGLE QUOTE
ISO_8859_1_AC=0;// 172 ¬     NOT SIGN
ISO_8859_1_AD=0;// 173       SOFT HYPHEN
ISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN
ISO_8859_1_AF=0;// 175 ¯     MACRON
ISO_8859_1_B0=0;// 176 °     DEGREE SIGN
ISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN
ISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO
ISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE
ISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT
ISO_8859_1_B5=0;// 181 µ     MICRO SIGN
ISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN
ISO_8859_1_B7=0;// 183 ·     MIDDLE DOT
ISO_8859_1_B8=0;// 184 ¸     CEDILLA
ISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE
ISO_8859_1_BA=KEY_QUOTE;// 186 º     MASCULINE ORDINAL
ISO_8859_1_BB=KEY_EQUAL + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE
ISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER
ISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF
ISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS
ISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK
ISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE
ISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE
ISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX
ISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE
ISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS
ISO_8859_1_C5=0;// 197 Å     A RING ABOVE
ISO_8859_1_C6=0;// 198 Æ     AE
ISO_8859_1_C7=KEY_SEMICOLON + SHIFT_MASK;// 199 Ç     C CEDILLA
ISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE
ISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE
ISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX
ISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS
ISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE
ISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE
ISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX
ISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS
ISO_8859_1_D0=0;// 208 Ð     ETH
ISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE
ISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE
ISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE
ISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX
ISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE
ISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS
ISO_8859_1_D7=0;// 215 ×     MULTIPLICATION
ISO_8859_1_D8=0;// 216 Ø     O STROKE
ISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE
ISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE
ISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX
ISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS
ISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE
ISO_8859_1_DE=0;// 222 Þ     THORN
ISO_8859_1_DF=0;// 223 ß     SHARP S
ISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE
ISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE
ISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX
ISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE
ISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS
ISO_8859_1_E5=0;// 229 å     a RING ABOVE
ISO_8859_1_E6=0;// 230 æ     ae
ISO_8859_1_E7=KEY_SEMICOLON;// 231 ç     c CEDILLA
ISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE
ISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE
ISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX
ISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS
ISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE
ISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE
ISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX
ISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS
ISO_8859_1_F0=0;// 240 ð     ETH
ISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE
ISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE
ISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE
ISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX
ISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE
ISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS
ISO_8859_1_F7=0;// 247 ÷     DIVISION
ISO_8859_1_F8=0;// 248 ø     o STROKE
ISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE
ISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE
ISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX
ISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS
ISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE
ISO_8859_1_FE=0;// 254 þ     THORN
ISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS
UNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign
// not yet implemented
UNICODE_EXTRA00=0x20AC;
KEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign

// LAYOUT_PORTUGUESE

}

else if (KeyboardLayout[0] == LAYOUT_ITALIAN) {

SHIFT_MASK=0x40;
ALTGR_MASK=0x80;
KEYCODE_MASK=0x00FF;
KEY_NON_US_100=63;

ASCII_20=KEY_SPACE;// 32  
ASCII_21=KEY_1 + SHIFT_MASK;// 33 !
ASCII_22=KEY_2 + SHIFT_MASK;// 34 "
ASCII_23=KEY_QUOTE + ALTGR_MASK;// 35 #
ASCII_24=KEY_4 + SHIFT_MASK;// 36 $
ASCII_25=KEY_5 + SHIFT_MASK;// 37 %
ASCII_26=KEY_6 + SHIFT_MASK;// 38 &
ASCII_27=KEY_MINUS;// 39 '
ASCII_28=KEY_8 + SHIFT_MASK;// 40 (
ASCII_29=KEY_9 + SHIFT_MASK;// 41 )
ASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *
ASCII_2B=KEY_RIGHT_BRACE;// 43 +
ASCII_2C=KEY_COMMA;// 44 ,
ASCII_2D=KEY_SLASH;// 45 -
ASCII_2E=KEY_PERIOD;// 46 .
ASCII_2F=KEY_7 + SHIFT_MASK;// 47 /
ASCII_30=KEY_0;// 48 0
ASCII_31=KEY_1;// 49 1
ASCII_32=KEY_2;// 50 2
ASCII_33=KEY_3;// 51 3
ASCII_34=KEY_4;// 52 4
ASCII_35=KEY_5;// 53 5
ASCII_36=KEY_6;// 54 6
ASCII_37=KEY_7;// 55 7
ASCII_38=KEY_8;// 55 8
ASCII_39=KEY_9;// 57 9
ASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :
ASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;
ASCII_3C=KEY_NON_US_100;// 60 <
ASCII_3D=KEY_0 + SHIFT_MASK;// 61 =
ASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >
ASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?
ASCII_40=KEY_SEMICOLON + ALTGR_MASK;// 64 @
ASCII_41=KEY_A + SHIFT_MASK;// 65 A
ASCII_42=KEY_B + SHIFT_MASK;// 66 B
ASCII_43=KEY_C + SHIFT_MASK;// 67 C
ASCII_44=KEY_D + SHIFT_MASK;// 68 D
ASCII_45=KEY_E + SHIFT_MASK;// 69 E
ASCII_46=KEY_F + SHIFT_MASK;// 70 F
ASCII_47=KEY_G + SHIFT_MASK;// 71 G
ASCII_48=KEY_H + SHIFT_MASK;// 72 H
ASCII_49=KEY_I + SHIFT_MASK;// 73 I
ASCII_4A=KEY_J + SHIFT_MASK;// 74 J
ASCII_4B=KEY_K + SHIFT_MASK;// 75 K
ASCII_4C=KEY_L + SHIFT_MASK;// 76 L
ASCII_4D=KEY_M + SHIFT_MASK;// 77 M
ASCII_4E=KEY_N + SHIFT_MASK;// 78 N
ASCII_4F=KEY_O + SHIFT_MASK;// 79 O
ASCII_50=KEY_P + SHIFT_MASK;// 80 P
ASCII_51=KEY_Q + SHIFT_MASK;// 81 Q
ASCII_52=KEY_R + SHIFT_MASK;// 82 R
ASCII_53=KEY_S + SHIFT_MASK;// 83 S
ASCII_54=KEY_T + SHIFT_MASK;// 84 T
ASCII_55=KEY_U + SHIFT_MASK;// 85 U
ASCII_56=KEY_V + SHIFT_MASK;// 86 V
ASCII_57=KEY_W + SHIFT_MASK;// 87 W
ASCII_58=KEY_X + SHIFT_MASK;// 88 X
ASCII_59=KEY_Y + SHIFT_MASK;// 89 Y
ASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z
ASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [
ASCII_5C=KEY_TILDE;// 92
ASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]
ASCII_5E=KEY_EQUAL + SHIFT_MASK;// 94 ^
ASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _
ASCII_60=0;// 96 `  (how to type this on Italian?)
ASCII_61=KEY_A;// 97 a
ASCII_62=KEY_B;// 98 b
ASCII_63=KEY_C;// 99 c
ASCII_64=KEY_D;// 100 d
ASCII_65=KEY_E;// 101 e
ASCII_66=KEY_F;// 102 f
ASCII_67=KEY_G;// 103 g
ASCII_68=KEY_H;// 104 h
ASCII_69=KEY_I;// 105 i
ASCII_6A=KEY_J;// 106 j
ASCII_6B=KEY_K;// 107 k
ASCII_6C=KEY_L;// 108 l
ASCII_6D=KEY_M;// 109 m
ASCII_6E=KEY_N;// 110 n
ASCII_6F=KEY_O;// 111 o
ASCII_70=KEY_P;// 112 p
ASCII_71=KEY_Q;// 113 q
ASCII_72=KEY_R;// 114 r
ASCII_73=KEY_S;// 115 s
ASCII_74=KEY_T;// 116 t
ASCII_75=KEY_U;// 117 u
ASCII_76=KEY_V;// 118 v
ASCII_77=KEY_W;// 119 w
ASCII_78=KEY_X;// 120 x
ASCII_79=KEY_Y;// 121 y
ASCII_7A=KEY_Z;// 122 z
ASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK + ALTGR_MASK; // 123 {
ASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |
ASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK + ALTGR_MASK; // 125 }
ASCII_7E=0;// 126 ~   (how to type this on Italian?)
ASCII_7F=KEY_BACKSPACE;// 127

ISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space
ISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation
ISO_8859_1_A2=0;// 162 ¢     Cent Sign
ISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £     Pound Sign
ISO_8859_1_A4=0;// 164 ¤     Currency Sign
ISO_8859_1_A5=0;// 165 ¥     YEN SIGN
ISO_8859_1_A6=0;// 166 ¦     BROKEN BAR
ISO_8859_1_A7=KEY_BACKSLASH + SHIFT_MASK;// 167 §     SECTION SIGN
ISO_8859_1_A8=0;// 168 ¨     DIAERESIS
ISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN
ISO_8859_1_A
Download .txt
gitextract_wrctxzzj/

├── .gitignore
├── OnlyKey/
│   └── OnlyKey.ino
├── README.md
├── keylayouts.c
├── keylayouts.h
├── usb_desc.c
├── usb_desc.h
├── usb_dev.c
├── usb_dev.h
├── usb_keyboard.c
├── usb_rawhid.c
└── usb_rawhid.h
Download .txt
SYMBOL INDEX (48 symbols across 8 files)

FILE: keylayouts.c
  function update_keyboard_layout (line 179) | void update_keyboard_layout() {

FILE: usb_desc.c
  type usb_string_descriptor_struct (line 1002) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1004) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1006) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1009) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1015) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1020) | struct usb_string_descriptor_struct
  type usb_string_descriptor_struct (line 1025) | struct usb_string_descriptor_struct
  function usb_init_serialnumber (line 1031) | void usb_init_serialnumber(void)

FILE: usb_desc.h
  type usb_descriptor_list_t (line 458) | typedef struct {

FILE: usb_dev.c
  type bdt_t (line 116) | typedef struct {
  function endpoint0_stall (line 213) | static void endpoint0_stall(void)
  function endpoint0_receive (line 218) | static uint8_t endpoint0_receive(uint8_t *data) {
  function endpoint0_transmit (line 237) | static void endpoint0_transmit(const void *data, uint32_t len)
  function endpoint0_ack (line 255) | static void endpoint0_ack(void)
  function wipe_usb_buffer (line 264) | void wipe_usb_buffer() {
  function usb_setup (line 338) | static void usb_setup(void)
  function usb_control (line 671) | static void usb_control(uint32_t stat)
  function usb_packet_t (line 826) | usb_packet_t *usb_rx(uint32_t endpoint)
  function usb_queue_byte_count (line 846) | static uint32_t usb_queue_byte_count(const usb_packet_t *p)
  function usb_tx_byte_count (line 869) | uint32_t usb_tx_byte_count(uint32_t endpoint)
  function usb_tx_packet_count (line 876) | uint32_t usb_tx_packet_count(uint32_t endpoint)
  function usb_rx_memory (line 898) | void usb_rx_memory(usb_packet_t *packet)
  function usb_tx (line 940) | void usb_tx(uint32_t endpoint, usb_packet_t *packet)
  function _reboot_Teensyduino_ (line 986) | void _reboot_Teensyduino_(void)
  function usb_isr (line 994) | void usb_isr(void)
  function usb_init (line 1217) | void usb_init(void)
  function usb_init (line 1275) | void usb_init(void)

FILE: usb_dev.h
  function usb_rx_byte_count (line 147) | static inline uint32_t usb_rx_byte_count(uint32_t endpoint)

FILE: usb_keyboard.c
  function usb_keyboard_write (line 213) | void usb_keyboard_write(uint8_t c)
  function KEYCODE_TYPE (line 251) | static KEYCODE_TYPE unicode_to_keycode(uint16_t cpoint)
  function KEYCODE_TYPE (line 288) | static KEYCODE_TYPE deadkey_to_keycode(KEYCODE_TYPE keycode)
  function usb_keyboard_write_unicode (line 311) | void usb_keyboard_write_unicode(uint16_t cpoint)
  function write_key (line 328) | static void write_key(KEYCODE_TYPE keycode)
  function keycode_to_modifier (line 351) | static uint8_t keycode_to_modifier(KEYCODE_TYPE keycode)
  function keycode_to_key (line 364) | static uint8_t keycode_to_key(KEYCODE_TYPE keycode)
  function usb_keyboard_press_keycode (line 380) | void usb_keyboard_press_keycode(uint16_t n)
  function usb_keyboard_release_keycode (line 432) | void usb_keyboard_release_keycode(uint16_t n)
  function usb_keyboard_press_key (line 466) | static void usb_keyboard_press_key(uint8_t key, uint8_t modifier)
  function usb_keyboard_release_key (line 499) | static void usb_keyboard_release_key(uint8_t key, uint8_t modifier)
  function usb_keyboard_release_all (line 526) | void usb_keyboard_release_all(void)
  function usb_keyboard_press (line 542) | int usb_keyboard_press(uint8_t key, uint8_t modifier)
  function usb_keyboard_send (line 586) | int usb_keyboard_send(void)

FILE: usb_rawhid.c
  function usb_rawhid_recv (line 117) | int usb_rawhid_recv(void *buffer, uint32_t timeout)
  function usb_rawhid_available (line 143) | int usb_rawhid_available(void)
  function usb_rawhid_send (line 155) | int usb_rawhid_send(const void *buffer, uint32_t timeout)
  function usb_rawhid_send2 (line 175) | int usb_rawhid_send2(const void *buffer, uint32_t timeout)

FILE: usb_rawhid.h
  function class (line 132) | class usb_rawhid_class
Condensed preview — 12 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (506K chars).
[
  {
    "path": ".gitignore",
    "chars": 681,
    "preview": "# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$"
  },
  {
    "path": "OnlyKey/OnlyKey.ino",
    "chars": 50303,
    "preview": "/* \n * Copyright (c) 2015-2022, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Re"
  },
  {
    "path": "README.md",
    "chars": 2530,
    "preview": "# OnlyKey Firmware\n\nThis is the official firmware for **OnlyKey**\n\nOnlyKey can be purchased here: [OnlyKey order](https:"
  },
  {
    "path": "keylayouts.c",
    "chars": 262019,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "keylayouts.h",
    "chars": 13676,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_desc.c",
    "chars": 59851,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_desc.h",
    "chars": 19825,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_dev.c",
    "chars": 35767,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_dev.h",
    "chars": 7838,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_keyboard.c",
    "chars": 20230,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_rawhid.c",
    "chars": 7611,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  },
  {
    "path": "usb_rawhid.h",
    "chars": 6427,
    "preview": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp"
  }
]

About this extraction

This page contains the full source code of the trustcrypto/OnlyKey-Firmware GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 12 files (475.3 KB), approximately 171.2k tokens, and a symbol index with 48 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!