diff --git a/README.md b/README.md index c570434c..03ada60f 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Currently if no options are supplied for the CLI mode selection then a default i ## Implemented - [X] Setting/modifying built-in LED modes -- [ ] Per-key LED setting +- [X] Per-key LED setting (PARTIALLY COMPLETE) - [ ] Fancy LED modes (custom programs) - [X] Daemon mode - [X] Saving settings for reload diff --git a/src/aura.rs b/src/aura.rs index fe9981d9..370d2301 100644 --- a/src/aura.rs +++ b/src/aura.rs @@ -319,3 +319,259 @@ impl From for u8 { } } } + +#[derive(Clone)] +pub struct KeyColourArray([[u8; 64]; 10]); +impl KeyColourArray { + pub fn new() -> Self { + let mut set = [[0u8; 64]; 10]; + for (count, row) in set.iter_mut().enumerate() { + row[0] = 0x5d; // Report ID + row[1] = 0xbc; // Mode = custom??, 0xb3 is builtin + row[2] = 0x00; + row[3] = 0x01; // ?? + row[4] = 0x01; // ??, 4,5,6 are normally RGB for builtin mode colours + row[5] = 0x01; // ?? + row[6] = (count as u8) << 4; // Key group + row[7] = 0x10; // 0b00010000 addressing? flips for group a0 + if count == 9 { + row[7] = 0x08; // 0b00001000 + } + row[8] = 0x00; + } + KeyColourArray(set) + } + + pub fn set(&mut self, key: Key, r: u8, g: u8, b: u8) { + let (rr, gg, bb) = self.key(key); + *rr = r; + *gg = g; + *bb = b; + } + + pub fn key(&mut self, key: Key) -> (&mut u8, &mut u8, &mut u8) { + // Tuples are indexes in to array + let (row, col) = match key { + Key::VolUp => (0, 15), + Key::VolDown => (0, 18), + Key::MicMute => (0, 21), + Key::ROG => (0, 24), + // + Key::Esc => (1, 24), + Key::F1 => (1, 30), + Key::F2 => (1, 33), + Key::F3 => (1, 36), + Key::F4 => (1, 39), + Key::F5 => (1, 45), + Key::F6 => (1, 48), + Key::F7 => (1, 51), + Key::F8 => (1, 54), + // + Key::F9 => (2, 12), + Key::F10 => (2, 15), + Key::F11 => (2, 18), + Key::F12 => (2, 21), + Key::Del => (2, 24), + Key::Tilde => (2, 39), + Key::N1 => (2, 42), + Key::N2 => (2, 45), + Key::N3 => (2, 48), + Key::N4 => (2, 51), + Key::N5 => (2, 54), + // + Key::N6 => (3, 9), + Key::N7 => (3, 12), + Key::N8 => (3, 15), + Key::N9 => (3, 18), + Key::N0 => (3, 21), + Key::Hyphen => (3, 24), + Key::Equals => (3, 27), + Key::BkSpc1 => (3, 30), + Key::BkSpc2 => (3, 33), + Key::BkSpc3 => (3, 36), + Key::Home => (3, 39), + Key::Tab => (3, 54), + // + Key::Q => (4, 9), + Key::W => (4, 12), + Key::E => (4, 15), + Key::R => (4, 18), + Key::T => (4, 21), + Key::Y => (4, 24), + Key::U => (4, 27), + Key::I => (4, 30), + Key::O => (4, 33), + Key::P => (4, 36), + Key::LBracket => (4, 39), + Key::RBracket => (4, 42), + Key::BackSlash => (4, 45), + Key::PgUp => (4, 54), + // + Key::Caps => (5, 21), + Key::A => (5, 24), + Key::S => (5, 27), + Key::D => (5, 30), + Key::F => (5, 33), + Key::G => (5, 36), + Key::H => (5, 39), + Key::J => (5, 42), + Key::K => (5, 45), + Key::L => (5, 48), + Key::SemiColon => (5, 51), + Key::Quote => (5, 54), + // + Key::Ret1 => (6, 12), + Key::Ret2 => (6, 15), + Key::Ret3 => (6, 18), + Key::PgDn => (6, 21), + Key::LShift => (6, 36), + Key::Z => (6, 42), + Key::X => (6, 45), + Key::C => (6, 48), + Key::V => (6, 51), + Key::B => (6, 54), + // + Key::N => (7, 9), + Key::M => (7, 12), + Key::Comma => (7, 15), + Key::Period => (7, 18), + Key::FwdSlash => (7, 21), + Key::Rshift1 => (7, 27), + Key::Rshift2 => (7, 30), + Key::Rshift3 => (7, 33), + Key::End => (7, 36), + Key::LCtrl => (7, 51), + Key::LFn => (7, 54), + // + Key::Meta => (8, 9), + Key::LAlt => (8, 12), + Key::Space1 => (8, 15), + Key::Space2 => (8, 18), + Key::Space3 => (8, 21), + Key::Space4 => (8, 24), + Key::RAlt => (8, 30), + Key::PrtSc => (8, 33), + Key::RCtrl => (8, 36), + Key::Up => (8, 42), + Key::RFn => (8, 51), + // + Key::Left => (9, 54), + + Key::Down => (10, 9), + Key::Right => (10, 12), + //_ => (0, 24), + }; + // LOLOLOLOLOLOLOL! Look it's safe okay + unsafe { + ( + &mut *(&mut self.0[row][col] as *mut u8), + &mut *(&mut self.0[row][col + 1] as *mut u8), + &mut *(&mut self.0[row][col + 2] as *mut u8), + ) + } + } + + pub fn get(&self) -> &[[u8; 64]; 10] { + &self.0 + } +} + +pub enum Key { + VolUp, + VolDown, + MicMute, + ROG, + Esc, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Del, + Tilde, + N1, + N2, + N3, + N4, + N5, + N6, + N7, + N8, + N9, + N0, + Hyphen, + Equals, + BkSpc1, + BkSpc2, + BkSpc3, + Home, + Tab, + Q, + W, + E, + R, + T, + Y, + U, + I, + O, + P, + LBracket, + RBracket, + BackSlash, + PgUp, + Caps, + A, + S, + D, + F, + G, + H, + J, + K, + L, + SemiColon, + Quote, + Ret1, + Ret2, + Ret3, + PgDn, + LShift, + Z, + X, + C, + V, + B, + N, + M, + Comma, + Period, + FwdSlash, + Rshift1, + Rshift2, + Rshift3, + End, + LCtrl, + LFn, + Meta, + LAlt, + Space1, + Space2, + Space3, + Space4, + RAlt, + PrtSc, + RCtrl, + Up, + Down, + Left, + Right, + RFn, +} diff --git a/src/core.rs b/src/core.rs index e01ca3ff..f0108014 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,7 +1,7 @@ // Return show-stopping errors, otherwise map error to a log level use crate::{ - aura::{aura_brightness_bytes, BuiltInModeByte}, + aura::{aura_brightness_bytes, BuiltInModeByte, KeyColourArray}, config::Config, error::AuraError, laptops::*, @@ -52,15 +52,12 @@ impl RogCore { let dev_config = dev_handle.device().config_descriptor(0).unwrap(); // Interface with outputs - let mut led_interface_num = 0; - let mut keys_interface_num = 0; + let mut interface = 0; for iface in dev_config.interfaces() { for desc in iface.descriptors() { for endpoint in desc.endpoint_descriptors() { if endpoint.address() == laptop.key_endpoint() { - keys_interface_num = desc.interface_number(); - } else if endpoint.address() == laptop.led_endpoint() { - led_interface_num = desc.interface_number(); + interface = desc.interface_number(); break; } } @@ -69,13 +66,13 @@ impl RogCore { dev_handle.set_auto_detach_kernel_driver(true).unwrap(); dev_handle - .claim_interface(keys_interface_num) + .claim_interface(interface) .map_err(|err| AuraError::UsbError(err))?; Ok(RogCore { handle: dev_handle, initialised: false, - led_endpoint: led_interface_num, + led_endpoint: laptop.led_endpoint(), keys_endpoint: laptop.key_endpoint(), config: Config::default().read(), virt_keys: VirtKeys::new(), @@ -101,16 +98,12 @@ impl RogCore { fn aura_write(&mut self, message: &[u8]) -> Result<(), AuraError> { self.handle - .write_control(0x21, 0x09, 0x035D, 0, message, Duration::new(0, 5)) - .map_err(|err| AuraError::UsbError(err))?; + .write_interrupt(self.led_endpoint, message, Duration::from_micros(1)) + .unwrap(); Ok(()) } fn aura_write_messages(&mut self, messages: &[&[u8]]) -> Result<(), AuraError> { - self.handle - .claim_interface(self.led_endpoint) - .map_err(|err| AuraError::UsbError(err))?; - if !self.initialised { self.aura_write(&LED_INIT1)?; self.aura_write(LED_INIT2.as_bytes())?; @@ -126,10 +119,29 @@ impl RogCore { } // Changes won't persist unless apply is set self.aura_write(&LED_APPLY)?; + Ok(()) + } - self.handle - .release_interface(self.led_endpoint) - .map_err(|err| AuraError::UsbError(err))?; + /// Initialise and clear the keyboard for custom effects + pub fn aura_effect_init(&mut self) -> Result<(), AuraError> { + let mut init = [0u8; 64]; + init[0] = 0x5d; // Report ID + init[1] = 0xbc; // Mode = custom??, 0xb3 is builtin + self.aura_write(&init)?; + self.initialised = true; + + Ok(()) + } + + /// Write an effect block + /// + /// `aura_effect_init` must be called any effect routine, and called only once. + pub fn aura_write_effect(&mut self, effect: &[KeyColourArray]) -> Result<(), AuraError> { + for key_colours in effect { + for row in key_colours.get() { + self.aura_write(row)?; + } + } Ok(()) } diff --git a/src/laptops/gx502gw.rs b/src/laptops/gx502gw.rs new file mode 100644 index 00000000..3d393aac --- /dev/null +++ b/src/laptops/gx502gw.rs @@ -0,0 +1,203 @@ +use crate::aura::{BuiltInModeByte, Key, KeyColourArray}; +use crate::core::{Backlight, RogCore}; +use crate::error::AuraError; +use crate::virt_device::ConsumerKeys; +//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState}; +use super::Laptop; +use log::info; + +pub(super) struct LaptopGX502GW { + usb_vendor: u16, + usb_product: u16, + board_name: &'static str, + prod_family: &'static str, + report_filter_bytes: [u8; 2], + min_led_bright: u8, + max_led_bright: u8, + led_endpoint: u8, + key_endpoint: u8, + supported_modes: [BuiltInModeByte; 12], + backlight: Backlight, + per_key_led: Vec, +} + +impl LaptopGX502GW { + pub(super) fn new() -> Self { + // Setting up a sample effect to run when ROG pressed + let mut per_key_led = Vec::new(); + let mut key_colours = KeyColourArray::new(); + key_colours.set(Key::ROG, 255, 0, 0); + key_colours.set(Key::L, 255, 0, 0); + key_colours.set(Key::I, 255, 0, 0); + key_colours.set(Key::N, 255, 0, 0); + key_colours.set(Key::U, 255, 0, 0); + key_colours.set(Key::X, 255, 0, 0); + per_key_led.push(key_colours.clone()); + + for _ in 0..3 { + for _ in 0..50 { + *key_colours.key(Key::ROG).0 -= 5; + *key_colours.key(Key::L).0 -= 5; + *key_colours.key(Key::I).0 -= 5; + *key_colours.key(Key::N).0 -= 5; + *key_colours.key(Key::U).0 -= 5; + *key_colours.key(Key::X).0 -= 5; + per_key_led.push(key_colours.clone()); + } + for _ in 0..50 { + *key_colours.key(Key::ROG).0 += 5; + *key_colours.key(Key::L).0 += 5; + *key_colours.key(Key::I).0 += 5; + *key_colours.key(Key::N).0 += 5; + *key_colours.key(Key::U).0 += 5; + *key_colours.key(Key::X).0 += 5; + per_key_led.push(key_colours.clone()); + } + } + + // Find backlight + LaptopGX502GW { + usb_vendor: 0x0B05, + usb_product: 0x1866, + // from `cat /sys/class/dmi/id/board_name` + board_name: "GX502GW", + // from `cat /sys/class/dmi/id/product_family` + prod_family: "Zephyrus S", + report_filter_bytes: [0x5a, 0x02], + min_led_bright: 0x00, + max_led_bright: 0x03, + //from `lsusb -vd 0b05:1866` + led_endpoint: 0x04, + //from `lsusb -vd 0b05:1866` + key_endpoint: 0x83, + supported_modes: [ + BuiltInModeByte::Stable, + BuiltInModeByte::Breathe, + BuiltInModeByte::Cycle, + BuiltInModeByte::Rainbow, + BuiltInModeByte::Rain, + BuiltInModeByte::Random, + BuiltInModeByte::Highlight, + BuiltInModeByte::Laser, + BuiltInModeByte::Ripple, + BuiltInModeByte::Pulse, + BuiltInModeByte::ThinZoomy, + BuiltInModeByte::WideZoomy, + ], + backlight: Backlight::new("intel_backlight").unwrap(), + per_key_led, + } + } +} + +impl LaptopGX502GW { + fn do_keypress_actions(&self, rogcore: &mut RogCore) -> Result<(), AuraError> { + if let Some(key_buf) = rogcore.poll_keyboard(&self.report_filter_bytes) { + match GX502GWKeys::from(key_buf[1]) { + GX502GWKeys::LedBrightUp => { + rogcore.aura_bright_inc(&self.supported_modes, self.max_led_bright)?; + } + GX502GWKeys::LedBrightDown => { + rogcore.aura_bright_dec(&self.supported_modes, self.min_led_bright)?; + } + GX502GWKeys::AuraNext => rogcore.aura_mode_next(&self.supported_modes)?, + GX502GWKeys::AuraPrevious => rogcore.aura_mode_prev(&self.supported_modes)?, + GX502GWKeys::ScreenBrightUp => self.backlight.step_up(), + GX502GWKeys::ScreenBrightDown => self.backlight.step_down(), + GX502GWKeys::Sleep => rogcore.suspend_with_systemd(), + GX502GWKeys::AirplaneMode => rogcore.toggle_airplane_mode(), + GX502GWKeys::MicToggle => {} + GX502GWKeys::Fan => {} + GX502GWKeys::ScreenToggle => { + rogcore.virt_keys().press(ConsumerKeys::BacklightTog.into()); + } + GX502GWKeys::TouchPadToggle => { + let mut key = [0u8; 32]; + key[0] = 0x01; + key[3] = 0x070; + rogcore.virt_keys().press(key); + } + GX502GWKeys::Rog => { + rogcore.aura_effect_init()?; + rogcore.aura_write_effect(&self.per_key_led)?; + // let mut key = [0u8; 32]; + // key[0] = 0x01; + // key[3] = 0x68; // XF86Tools? F13 + // rogcore.virt_keys().press(key); + } + GX502GWKeys::None => { + if key_buf[0] != 0x5A { + info!("Unmapped key, attempt passthrough: {:X?}", &key_buf[1]); + rogcore.virt_keys().press(key_buf); + } + } + } + } + Ok(()) + } +} + +impl Laptop for LaptopGX502GW { + fn run(&self, rogcore: &mut RogCore) -> Result<(), AuraError> { + self.do_keypress_actions(rogcore) + } + fn led_endpoint(&self) -> u8 { + self.led_endpoint + } + fn key_endpoint(&self) -> u8 { + self.key_endpoint + } + fn usb_vendor(&self) -> u16 { + self.usb_vendor + } + fn usb_product(&self) -> u16 { + self.usb_product + } + fn supported_modes(&self) -> &[BuiltInModeByte] { + &self.supported_modes + } + fn board_name(&self) -> &str { + &self.board_name + } + fn prod_family(&self) -> &str { + &self.prod_family + } +} + +enum GX502GWKeys { + Rog = 0x38, + MicToggle = 0x7C, + Fan = 0xAE, + ScreenToggle = 0x35, + ScreenBrightDown = 0x10, + ScreenBrightUp = 0x20, + TouchPadToggle = 0x6b, + Sleep = 0x6C, + AirplaneMode = 0x88, + LedBrightUp = 0xC4, + LedBrightDown = 0xC5, + AuraPrevious = 0xB2, + AuraNext = 0xB3, + None, +} + +impl From for GX502GWKeys { + fn from(byte: u8) -> Self { + match byte { + 0x38 => GX502GWKeys::Rog, + 0x7C => GX502GWKeys::MicToggle, + 0xAE => GX502GWKeys::Fan, + 0x35 => GX502GWKeys::ScreenToggle, + 0x10 => GX502GWKeys::ScreenBrightDown, + 0x20 => GX502GWKeys::ScreenBrightUp, + 0x6b => GX502GWKeys::TouchPadToggle, + 0x6C => GX502GWKeys::Sleep, + 0x88 => GX502GWKeys::AirplaneMode, + 0xC4 => GX502GWKeys::LedBrightUp, + 0xC5 => GX502GWKeys::LedBrightDown, + 0xB2 => GX502GWKeys::AuraPrevious, + 0xB3 => GX502GWKeys::AuraNext, + _ => GX502GWKeys::None, + } + } +} diff --git a/src/laptops/mod.rs b/src/laptops/mod.rs new file mode 100644 index 00000000..18e111b1 --- /dev/null +++ b/src/laptops/mod.rs @@ -0,0 +1,45 @@ +use crate::aura::BuiltInModeByte; +use crate::core::RogCore; +use crate::error::AuraError; +//use keycode::{KeyMap, KeyMappingId, KeyState, KeyboardState}; +use log::info; + +mod gx502gw; +use gx502gw::LaptopGX502GW; + +pub(crate) fn match_laptop() -> Box { + let dmi = sysfs_class::DmiId::default(); + let board_name = dmi.board_name().unwrap(); + match board_name.as_str() { + // The hell does it have a \n for anyway? + "GX502GW\n" => { + info!("Found GX502GW"); + Box::new(LaptopGX502GW::new()) + } + _ => { + panic!("could not match laptop"); + } + } +} + +/// All laptop models should implement this trait. The role of a `Laptop` is to +/// "drive" the `RogCore`. +/// +/// `do_hotkey_action` is passed the byte that a hotkey emits, and is expected to +/// perform whichever action matches that. For now the only key bytes passed in are +/// the ones which match `byte[0] == hotkey_group_byte`. On the GX502GW the keyboard +/// has 3 explicit groups: main, vol+media, and the ones that the Linux kernel doesn't +/// map. +/// +/// If using the `keycode` crate to build keyboard input, the report must be prefixed +/// with the report ID (usually `0x01` for the virtual keyboard). +pub(crate) trait Laptop { + fn board_name(&self) -> &str; + fn prod_family(&self) -> &str; + fn run(&self, core: &mut RogCore) -> Result<(), AuraError>; + fn led_endpoint(&self) -> u8; + fn key_endpoint(&self) -> u8; + fn usb_vendor(&self) -> u16; + fn usb_product(&self) -> u16; + fn supported_modes(&self) -> &[BuiltInModeByte]; +} diff --git a/wireshark_data/per_key_raw_bytes b/wireshark_data/per_key_raw_bytes index 8b99e534..7949d6ca 100755 --- a/wireshark_data/per_key_raw_bytes +++ b/wireshark_data/per_key_raw_bytes @@ -1,97 +1,107 @@ -VOL_DN = 5dbc00010101001000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -VOL_UP = 5dbc00010101001000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - MIC = 5dbc00010101001000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - ROG = 5dbc00010101001000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - ESC = 5dbc00010101101000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - F1 = 5dbc00010101101000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - F2 = 5dbc00010101101000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - F3 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - F4 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - F5 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - F6 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - F7 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - F8 = 5dbc00010101101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - F9 = 5dbc00010101201000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F10 = 5dbc00010101201000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F11 = 5dbc00010101201000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - F12 = 5dbc00010101201000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - Del = 5dbc00010101201000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - ~ = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - 1 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - 2 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - 3 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - 4 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - 5 = 5dbc00010101201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - 6 = 5dbc00010101301000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 7 = 5dbc00010101301000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 8 = 5dbc00010101301000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 9 = 5dbc00010101301000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 0 = 5dbc00010101301000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - - = 5dbc00010101301000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - = = 5dbc00010101301000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 -BkSpc1 = 5dbc00010101301000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -BkSpc2 = 5dbc00010101301000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 -BkSpc3 = 5dbc00010101301000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Home = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - Tab = 5dbc00010101301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Q = 5dbc00010101401000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - W = 5dbc00010101401000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - E = 5dbc00010101401000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - R = 5dbc00010101401000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - T = 5dbc00010101401000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - Y = 5dbc00010101401000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - U = 5dbc00010101401000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 - I = 5dbc00010101401000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - O = 5dbc00010101401000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - P = 5dbc00010101401000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - [ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - ] = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - \ = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - PgUp = 5dbc00010101401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Caps = 5dbc00010101501000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 - A = 5dbc00010101501000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - S = 5dbc00010101501000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 - D = 5dbc00010101501000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 - F = 5dbc00010101501000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - G = 5dbc00010101501000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - H = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000 - J = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - K = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - L = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - ; = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - ' = 5dbc00010101501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 -Enter1 = 5dbc00010101601000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Enter2 = 5dbc00010101601000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Enter3 = 5dbc00010101601000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - PgDn = 5dbc00010101601000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -LShfit = 5dbc00010101601000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Z = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - X = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000 - C = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000 - V = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - B = 5dbc00010101601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - N = 5dbc00010101701000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - M = 5dbc00010101701000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - , = 5dbc00010101701000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - . = 5dbc00010101701000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - / = 5dbc00010101701000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -Rshft1 = 5dbc00010101701000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - End = 5dbc00010101701000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Ctrl = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - LFn = 5dbc00010101701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Meta = 5dbc00010101801000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - LAlt = 5dbc00010101801000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space1 = 5dbc00010101801000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space2 = 5dbc00010101801000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space3 = 5dbc00010101801000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000 -Space4 = 5dbc00010101801000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000 - RAlt = 5dbc00010101801000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000000000 -PrtScn = 5dbc00010101801000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000000000 - RCtrl = 5dbc00010101801000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000 - Up = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000 - RFn = 5dbc00010101801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000 - Left = 5dbc00010101901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000 - Down = 5dbc00010101a00800ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - Right = 5dbc00010101a00800000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +VOL_DN = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +VOL_UP = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + MIC = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ROG = 5d,bc,00,01,01,01,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + + ESC = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F1 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F2 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F3 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F4 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F5 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F6 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + F7 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + F8 = 5d,bc,00,01,01,01,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + F9 = 5d,bc,00,01,01,01,20,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F10 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F11 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F12 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Del = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ~ = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 1 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 2 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 3 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + 4 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + 5 = 5d,bc,00,01,01,01,20,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + 6 = 5d,bc,00,01,01,01,30,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 7 = 5d,bc,00,01,01,01,30,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 8 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 9 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 0 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + - = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + = = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc1 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc2 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +BkSpc3 = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Home = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Tab = 5d,bc,00,01,01,01,30,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Q = 5d,bc,00,01,01,01,40,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + W = 5d,bc,00,01,01,01,40,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + E = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + R = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + T = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Y = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + U = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + I = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + O = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + P = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + [ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + ] = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + \ = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + PgUp = 5d,bc,00,01,01,01,40,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Caps = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + A = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + S = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + D = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + F = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + G = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + H = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + J = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + K = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + L = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + ; = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + ' = 5d,bc,00,01,01,01,50,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + +Enter1 = 5d,bc,00,01,01,01,60,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Enter2 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Enter3 = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + PgDn = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +LShfit = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Z = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + X = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + C = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00, + V = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + B = 5d,bc,00,01,01,01,60,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + N = 5d,bc,00,01,01,01,70,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + M = 5d,bc,00,01,01,01,70,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + , = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + . = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + / = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Rshft1 = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + End = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Ctrl = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + LFn = 5d,bc,00,01,01,01,70,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Meta = 5d,bc,00,01,01,01,80,10,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + LAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space1 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space2 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space3 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +Space4 = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RAlt = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, +PrtScn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RCtrl = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Up = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + RFn = 5d,bc,00,01,01,01,80,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00, + + Left = 5d,bc,00,01,01,01,90,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00, + + Down = 5d,bc,00,01,01,01,a0,08,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + Right = 5d,bc,00,01,01,01,a0,08,00,00,00,00,ff,ff,ff,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \ No newline at end of file diff --git a/wireshark_data/per_key_raw_bytes.ods b/wireshark_data/per_key_raw_bytes.ods new file mode 100644 index 00000000..3d905f2f Binary files /dev/null and b/wireshark_data/per_key_raw_bytes.ods differ