diff options
| author | tmk <nobody@nowhere> | 2012-10-09 14:36:13 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2012-10-17 15:55:37 +0900 |
| commit | 373ab0e7192811944786c095facb80938c33f1d5 (patch) | |
| tree | af609b1318ebb8e08897460af7dc894c389cea02 /common/keycode.h | |
| parent | 16ba9bda5601ebef6e4db04a5ad079af32370815 (diff) | |
| download | qmk_firmware-373ab0e7192811944786c095facb80938c33f1d5.tar.gz qmk_firmware-373ab0e7192811944786c095facb80938c33f1d5.zip | |
Add keycode.h and remove usb_keycodes.h.
Diffstat (limited to 'common/keycode.h')
| -rw-r--r-- | common/keycode.h | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/common/keycode.h b/common/keycode.h new file mode 100644 index 000000000..4ed78a46a --- /dev/null +++ b/common/keycode.h | |||
| @@ -0,0 +1,441 @@ | |||
| 1 | /* | ||
| 2 | Copyright 2011,2012 Jun Wako <wakojun@gmail.com> | ||
| 3 | |||
| 4 | This program is free software: you can redistribute it and/or modify | ||
| 5 | it under the terms of the GNU General Public License as published by | ||
| 6 | the Free Software Foundation, either version 2 of the License, or | ||
| 7 | (at your option) any later version. | ||
| 8 | |||
| 9 | This program is distributed in the hope that it will be useful, | ||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | GNU General Public License for more details. | ||
| 13 | |||
| 14 | You should have received a copy of the GNU General Public License | ||
| 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 16 | */ | ||
| 17 | |||
| 18 | /* | ||
| 19 | * Keycodes based on HID Usage Keyboard/Keypad Page(0x07) plus special codes | ||
| 20 | * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf | ||
| 21 | */ | ||
| 22 | #ifndef KEYCODE_H | ||
| 23 | #define KEYCODE_H | ||
| 24 | |||
| 25 | |||
| 26 | #define IS_ERROR(code) (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED) | ||
| 27 | #define IS_ANY(code) (KC_A <= (code) && (code) <= 0xFF) | ||
| 28 | #define IS_KEY(code) (KC_A <= (code) && (code) <= KC_EXSEL) | ||
| 29 | #define IS_MOD(code) (KC_LCTRL <= (code) && (code) <= KC_RGUI) | ||
| 30 | |||
| 31 | #define IS_FN(code) (KC_FN0 <= (code) && (code) <= KC_FN7) | ||
| 32 | #define IS_MOUSEKEY(code) (KC_MS_UP <= (code) && (code) <= KC_MS_WH_RIGHT) | ||
| 33 | #define IS_MOUSEKEY_MOVE(code) (KC_MS_UP <= (code) && (code) <= KC_MS_RIGHT) | ||
| 34 | #define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1 <= (code) && (code) <= KC_MS_BTN5) | ||
| 35 | #define IS_MOUSEKEY_WHEEL(code) (KC_MS_WH_UP <= (code) && (code) <= KC_MS_WH_RIGHT) | ||
| 36 | |||
| 37 | #define IS_SPECIAL(code) ((0xB0 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF)) | ||
| 38 | #define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_WFAV) | ||
| 39 | #define IS_SYSTEM(code) (KC_POWER <= (code) && (code) <= KC_WAKE) | ||
| 40 | |||
| 41 | #define MOD_BIT(code) (1<<MOD_INDEX(code)) | ||
| 42 | #define MOD_INDEX(code) ((code) & 0x07) | ||
| 43 | #define FN_BIT(code) (1<<FN_INDEX(code)) | ||
| 44 | #define FN_INDEX(code) ((code) - KC_FN0) | ||
| 45 | |||
| 46 | |||
| 47 | /* | ||
| 48 | * Short names for ease of definition of keymap | ||
| 49 | */ | ||
| 50 | #define KC_LCTL KC_LCTRL | ||
| 51 | #define KC_RCTL KC_RCTRL | ||
| 52 | #define KC_LSFT KC_LSHIFT | ||
| 53 | #define KC_RSFT KC_RSHIFT | ||
| 54 | #define KC_ESC KC_ESCAPE | ||
| 55 | #define KC_BSPC KC_BSPACE | ||
| 56 | #define KC_ENT KC_ENTER | ||
| 57 | #define KC_DEL KC_DELETE | ||
| 58 | #define KC_INS KC_INSERT | ||
| 59 | #define KC_CAPS KC_CAPSLOCK | ||
| 60 | #define KC_RGHT KC_RIGHT | ||
| 61 | #define KC_PGDN KC_PGDOWN | ||
| 62 | #define KC_PSCR KC_PSCREEN | ||
| 63 | #define KC_SLCK KC_SCKLOCK | ||
| 64 | #define KC_PAUS KC_PAUSE | ||
| 65 | #define KC_BRK KC_PAUSE | ||
| 66 | #define KC_NLCK KC_NUMLOCK | ||
| 67 | #define KC_SPC KC_SPACE | ||
| 68 | #define KC_MINS KC_MINUS | ||
| 69 | #define KC_EQL KC_EQUAL | ||
| 70 | #define KC_GRV KC_GRAVE | ||
| 71 | #define KC_RBRC KC_RBRACKET | ||
| 72 | #define KC_LBRC KC_LBRACKET | ||
| 73 | #define KC_COMM KC_COMMA | ||
| 74 | #define KC_BSLS KC_BSLASH | ||
| 75 | #define KC_SLSH KC_SLASH | ||
| 76 | #define KC_SCLN KC_SCOLON | ||
| 77 | #define KC_QUOT KC_QUOTE | ||
| 78 | #define KC_APP KC_APPLICATION | ||
| 79 | #define KC_NUHS KC_NONUS_HASH | ||
| 80 | #define KC_NUBS KC_NONUS_BSLASH | ||
| 81 | #define KC_ERAS KC_ALT_ERASE, | ||
| 82 | #define KC_CLR KC_CLEAR | ||
| 83 | /* Japanese specific */ | ||
| 84 | #define KC_ZKHK KC_GRAVE | ||
| 85 | #define KC_RO KC_INT1 | ||
| 86 | #define KC_KANA KC_INT2 | ||
| 87 | #define KC_JYEN KC_INT3 | ||
| 88 | #define KC_HENK KC_INT4 | ||
| 89 | #define KC_MHEN KC_INT5 | ||
| 90 | /* Keypad */ | ||
| 91 | #define KC_P1 KC_KP_1 | ||
| 92 | #define KC_P2 KC_KP_2 | ||
| 93 | #define KC_P3 KC_KP_3 | ||
| 94 | #define KC_P4 KC_KP_4 | ||
| 95 | #define KC_P5 KC_KP_5 | ||
| 96 | #define KC_P6 KC_KP_6 | ||
| 97 | #define KC_P7 KC_KP_7 | ||
| 98 | #define KC_P8 KC_KP_8 | ||
| 99 | #define KC_P9 KC_KP_9 | ||
| 100 | #define KC_P0 KC_KP_0 | ||
| 101 | #define KC_PDOT KC_KP_DOT | ||
| 102 | #define KC_PCMM KC_KP_COMMA | ||
| 103 | #define KC_PSLS KC_KP_SLASH | ||
| 104 | #define KC_PAST KC_KP_ASTERISK | ||
| 105 | #define KC_PMNS KC_KP_MINUS | ||
| 106 | #define KC_PPLS KC_KP_PLUS | ||
| 107 | #define KC_PEQL KC_KP_EQUAL | ||
| 108 | #define KC_PENT KC_KP_ENTER | ||
| 109 | /* Mousekey */ | ||
| 110 | #define KC_MS_U KC_MS_UP | ||
| 111 | #define KC_MS_D KC_MS_DOWN | ||
| 112 | #define KC_MS_L KC_MS_LEFT | ||
| 113 | #define KC_MS_R KC_MS_RIGHT | ||
| 114 | #define KC_BTN1 KC_MS_BTN1 | ||
| 115 | #define KC_BTN2 KC_MS_BTN2 | ||
| 116 | #define KC_BTN3 KC_MS_BTN3 | ||
| 117 | #define KC_BTN4 KC_MS_BTN4 | ||
| 118 | #define KC_BTN5 KC_MS_BTN5 | ||
| 119 | #define KC_WH_U KC_MS_WH_UP | ||
| 120 | #define KC_WH_D KC_MS_WH_DOWN | ||
| 121 | #define KC_WH_L KC_MS_WH_LEFT | ||
| 122 | #define KC_WH_R KC_MS_WH_RIGHT | ||
| 123 | /* Sytem Control */ | ||
| 124 | #define KC_PWR KC_SYSTEM_POWER | ||
| 125 | #define KC_SLEP KC_SYSTEM_SLEEP | ||
| 126 | #define KC_WAKE KC_SYSTEM_WAKE | ||
| 127 | /* Consumer Page */ | ||
| 128 | #define KC_MUTE KC_AUDIO_MUTE | ||
| 129 | #define KC_VOLU KC_AUDIO_VOL_UP | ||
| 130 | #define KC_VOLD KC_AUDIO_VOL_DOWN | ||
| 131 | #define KC_MNXT KC_MEDIA_NEXT_TRACK | ||
| 132 | #define KC_MPRV KC_MEDIA_PREV_TRACK | ||
| 133 | #define KC_MSTP KC_MEDIA_STOP | ||
| 134 | #define KC_MPLY KC_MEDIA_PLAY_PAUSE | ||
| 135 | #define KC_MSEL KC_MEDIA_SELECT | ||
| 136 | #define KC_MAIL KC_MAIL | ||
| 137 | #define KC_CALC KC_CALCULATOR | ||
| 138 | #define KC_MYCM KC_MY_COMPUTER | ||
| 139 | #define KC_WSCH KC_WWW_SEARCH | ||
| 140 | #define KC_WHOM KC_WWW_HOME | ||
| 141 | #define KC_WBAK KC_WWW_BACK | ||
| 142 | #define KC_WFWD KC_WWW_FORWARD | ||
| 143 | #define KC_WSTP KC_WWW_STOP | ||
| 144 | #define KC_WREF KC_WWW_REFRESH | ||
| 145 | #define KC_WFAV KC_WWW_FAVORITES | ||
| 146 | |||
| 147 | |||
| 148 | /* USB HID Keyboard/Keypad Usage(0x07) */ | ||
| 149 | enum hid_keyboard_keypad_usage { | ||
| 150 | KC_NO = 0x00, | ||
| 151 | KC_ROLL_OVER, | ||
| 152 | KC_POST_FAIL, | ||
| 153 | KC_UNDEFINED, | ||
| 154 | KC_A, | ||
| 155 | KC_B, | ||
| 156 | KC_C, | ||
| 157 | KC_D, | ||
| 158 | KC_E, | ||
| 159 | KC_F, | ||
| 160 | KC_G, | ||
| 161 | KC_H, | ||
| 162 | KC_I, | ||
| 163 | KC_J, | ||
| 164 | KC_K, | ||
| 165 | KC_L, | ||
| 166 | KC_M, /* 0x10 */ | ||
| 167 | KC_N, | ||
| 168 | KC_O, | ||
| 169 | KC_P, | ||
| 170 | KC_Q, | ||
| 171 | KC_R, | ||
| 172 | KC_S, | ||
| 173 | KC_T, | ||
| 174 | KC_U, | ||
| 175 | KC_V, | ||
| 176 | KC_W, | ||
| 177 | KC_X, | ||
| 178 | KC_Y, | ||
| 179 | KC_Z, | ||
| 180 | KC_1, | ||
| 181 | KC_2, | ||
| 182 | KC_3, /* 0x20 */ | ||
| 183 | KC_4, | ||
| 184 | KC_5, | ||
| 185 | KC_6, | ||
| 186 | KC_7, | ||
| 187 | KC_8, | ||
| 188 | KC_9, | ||
| 189 | KC_0, | ||
| 190 | KC_ENTER, | ||
| 191 | KC_ESCAPE, | ||
| 192 | KC_BSPACE, | ||
| 193 | KC_TAB, | ||
| 194 | KC_SPACE, | ||
| 195 | KC_MINUS, | ||
| 196 | KC_EQUAL, | ||
| 197 | KC_LBRACKET, | ||
| 198 | KC_RBRACKET, /* 0x30 */ | ||
| 199 | KC_BSLASH, /* \ (and |) */ | ||
| 200 | KC_NONUS_HASH, /* Non-US # and ~ */ | ||
| 201 | KC_SCOLON, /* ; (and :) */ | ||
| 202 | KC_QUOTE, /* ' and " */ | ||
| 203 | KC_GRAVE, /* Grave accent and tilde */ | ||
| 204 | KC_COMMA, /* , and < */ | ||
| 205 | KC_DOT, /* . and > */ | ||
| 206 | KC_SLASH, /* / and ? */ | ||
| 207 | KC_CAPSLOCK, | ||
| 208 | KC_F1, | ||
| 209 | KC_F2, | ||
| 210 | KC_F3, | ||
| 211 | KC_F4, | ||
| 212 | KC_F5, | ||
| 213 | KC_F6, | ||
| 214 | KC_F7, /* 0x40 */ | ||
| 215 | KC_F8, | ||
| 216 | KC_F9, | ||
| 217 | KC_F10, | ||
| 218 | KC_F11, | ||
| 219 | KC_F12, | ||
| 220 | KC_PSCREEN, | ||
| 221 | KC_SCKLOCK, | ||
| 222 | KC_PAUSE, | ||
| 223 | KC_INSERT, | ||
| 224 | KC_HOME, | ||
| 225 | KC_PGUP, | ||
| 226 | KC_DELETE, | ||
| 227 | KC_END, | ||
| 228 | KC_PGDOWN, | ||
| 229 | KC_RIGHT, | ||
| 230 | KC_LEFT, /* 0x50 */ | ||
| 231 | KC_DOWN, | ||
| 232 | KC_UP, | ||
| 233 | KC_NUMLOCK, | ||
| 234 | KC_KP_SLASH, | ||
| 235 | KC_KP_ASTERISK, | ||
| 236 | KC_KP_MINUS, | ||
| 237 | KC_KP_PLUS, | ||
| 238 | KC_KP_ENTER, | ||
| 239 | KC_KP_1, | ||
| 240 | KC_KP_2, | ||
| 241 | KC_KP_3, | ||
| 242 | KC_KP_4, | ||
| 243 | KC_KP_5, | ||
| 244 | KC_KP_6, | ||
| 245 | KC_KP_7, | ||
| 246 | KC_KP_8, /* 0x60 */ | ||
| 247 | KC_KP_9, | ||
| 248 | KC_KP_0, | ||
| 249 | KC_KP_DOT, | ||
| 250 | KC_NONUS_BSLASH, /* Non-US \ and | */ | ||
| 251 | KC_APPLICATION, | ||
| 252 | KC_POWER, | ||
| 253 | KC_KP_EQUAL, | ||
| 254 | KC_F13, | ||
| 255 | KC_F14, | ||
| 256 | KC_F15, | ||
| 257 | KC_F16, | ||
| 258 | KC_F17, | ||
| 259 | KC_F18, | ||
| 260 | KC_F19, | ||
| 261 | KC_F20, | ||
| 262 | KC_F21, /* 0x70 */ | ||
| 263 | KC_F22, | ||
| 264 | KC_F23, | ||
| 265 | KC_F24, | ||
| 266 | KC_EXECUTE, | ||
| 267 | KC_HELP, | ||
| 268 | KC_MENU, | ||
| 269 | KC_SELECT, | ||
| 270 | KC_STOP, | ||
| 271 | KC_AGAIN, | ||
| 272 | KC_UNDO, | ||
| 273 | KC_CUT, | ||
| 274 | KC_COPY, | ||
| 275 | KC_PASTE, | ||
| 276 | KC_FIND, | ||
| 277 | KC__MUTE, | ||
| 278 | KC__VOLUP, /* 0x80 */ | ||
| 279 | KC__VOLDOWN, | ||
| 280 | KC_LOCKING_CAPS, /* locking Caps Lock */ | ||
| 281 | KC_LOCKING_NUM, /* locking Num Lock */ | ||
| 282 | KC_LOCKING_SCROLL, /* locking Scroll Lock */ | ||
| 283 | KC_KP_COMMA, | ||
| 284 | KC_KP_EQUAL_AS400, /* equal sign on AS/400 */ | ||
| 285 | KC_INT1, | ||
| 286 | KC_INT2, | ||
| 287 | KC_INT3, | ||
| 288 | KC_INT4, | ||
| 289 | KC_INT5, | ||
| 290 | KC_INT6, | ||
| 291 | KC_INT7, | ||
| 292 | KC_INT8, | ||
| 293 | KC_INT9, | ||
| 294 | KC_LANG1, /* 0x90 */ | ||
| 295 | KC_LANG2, | ||
| 296 | KC_LANG3, | ||
| 297 | KC_LANG4, | ||
| 298 | KC_LANG5, | ||
| 299 | KC_LANG6, | ||
| 300 | KC_LANG7, | ||
| 301 | KC_LANG8, | ||
| 302 | KC_LANG9, | ||
| 303 | KC_ALT_ERASE, | ||
| 304 | KC_SYSREQ, | ||
| 305 | KC_CANCEL, | ||
| 306 | KC_CLEAR, | ||
| 307 | KC_PRIOR, | ||
| 308 | KC_RETURN, | ||
| 309 | KC_SEPARATOR, | ||
| 310 | KC_OUT, /* 0xA0 */ | ||
| 311 | KC_OPER, | ||
| 312 | KC_CLEAR_AGAIN, | ||
| 313 | KC_CRSEL, | ||
| 314 | KC_EXSEL, /* 0xA4 */ | ||
| 315 | |||
| 316 | /* NOTE: 0xA5-DF are used for internal special purpose */ | ||
| 317 | |||
| 318 | #if 0 | ||
| 319 | /* NOTE: Following codes(0xB0-DD) are not used. Leave them for reference. */ | ||
| 320 | KC_KP_00 = 0xB0, | ||
| 321 | KC_KP_000, | ||
| 322 | KC_THOUSANDS_SEPARATOR, | ||
| 323 | KC_DECIMAL_SEPARATOR, | ||
| 324 | KC_CURRENCY_UNIT, | ||
| 325 | KC_CURRENCY_SUB_UNIT, | ||
| 326 | KC_KP_LPAREN, | ||
| 327 | KC_KP_RPAREN, | ||
| 328 | KC_KP_LCBRACKET, /* { */ | ||
| 329 | KC_KP_RCBRACKET, /* } */ | ||
| 330 | KC_KP_TAB, | ||
| 331 | KC_KP_BSPACE, | ||
| 332 | KC_KP_A, | ||
| 333 | KC_KP_B, | ||
| 334 | KC_KP_C, | ||
| 335 | KC_KP_D, | ||
| 336 | KC_KP_E, /* 0xC0 */ | ||
| 337 | KC_KP_F, | ||
| 338 | KC_KP_XOR, | ||
| 339 | KC_KP_HAT, | ||
| 340 | KC_KP_PERC, | ||
| 341 | KC_KP_LT, | ||
| 342 | KC_KP_GT, | ||
| 343 | KC_KP_AND, | ||
| 344 | KC_KP_LAZYAND, | ||
| 345 | KC_KP_OR, | ||
| 346 | KC_KP_LAZYOR, | ||
| 347 | KC_KP_COLON, | ||
| 348 | KC_KP_HASH, | ||
| 349 | KC_KP_SPACE, | ||
| 350 | KC_KP_ATMARK, | ||
| 351 | KC_KP_EXCLAMATION, | ||
| 352 | KC_KP_MEM_STORE, /* 0xD0 */ | ||
| 353 | KC_KP_MEM_RECALL, | ||
| 354 | KC_KP_MEM_CLEAR, | ||
| 355 | KC_KP_MEM_ADD, | ||
| 356 | KC_KP_MEM_SUB, | ||
| 357 | KC_KP_MEM_MUL, | ||
| 358 | KC_KP_MEM_DIV, | ||
| 359 | KC_KP_PLUS_MINUS, | ||
| 360 | KC_KP_CLEAR, | ||
| 361 | KC_KP_CLEAR_ENTRY, | ||
| 362 | KC_KP_BINARY, | ||
| 363 | KC_KP_OCTAL, | ||
| 364 | KC_KP_DECIMAL, | ||
| 365 | KC_KP_HEXADECIMAL, /* 0xDD */ | ||
| 366 | #endif | ||
| 367 | |||
| 368 | /* Modifiers */ | ||
| 369 | KC_LCTRL = 0xE0, | ||
| 370 | KC_LSHIFT, | ||
| 371 | KC_LALT, | ||
| 372 | KC_LGUI, | ||
| 373 | KC_RCTRL, | ||
| 374 | KC_RSHIFT, | ||
| 375 | KC_RALT, | ||
| 376 | KC_RGUI, | ||
| 377 | |||
| 378 | /* NOTE: 0xE8-FF are used for internal special purpose */ | ||
| 379 | }; | ||
| 380 | |||
| 381 | /* Special keycodes */ | ||
| 382 | /* NOTE: 0xA5-DF and 0xE8-FF are used for internal special purpose */ | ||
| 383 | enum internal_special_keycodes { | ||
| 384 | /* System Control */ | ||
| 385 | KC_SYSTEM_POWER = 0xA5, | ||
| 386 | KC_SYSTEM_SLEEP, | ||
| 387 | KC_SYSTEM_WAKE, /* 0xA7 */ | ||
| 388 | /* 0xA8-AF */ | ||
| 389 | |||
| 390 | /* Consumer Page */ | ||
| 391 | KC_AUDIO_MUTE = 0xB0, | ||
| 392 | KC_AUDIO_VOL_UP, | ||
| 393 | KC_AUDIO_VOL_DOWN, | ||
| 394 | KC_MEDIA_NEXT_TRACK, | ||
| 395 | KC_MEDIA_PREV_TRACK, | ||
| 396 | KC_MEDIA_STOP, | ||
| 397 | KC_MEDIA_PLAY_PAUSE, | ||
| 398 | KC_MEDIA_SELECT, | ||
| 399 | KC_MAIL, | ||
| 400 | KC_CALCULATOR, | ||
| 401 | KC_MY_COMPUTER, | ||
| 402 | KC_WWW_SEARCH, | ||
| 403 | KC_WWW_HOME, | ||
| 404 | KC_WWW_BACK, | ||
| 405 | KC_WWW_FORWARD, | ||
| 406 | KC_WWW_STOP, | ||
| 407 | KC_WWW_REFRESH, /* 0xC0 */ | ||
| 408 | KC_WWW_FAVORITES, /* 0xC1 */ | ||
| 409 | /* 0xC2-DF vacant for future use */ | ||
| 410 | |||
| 411 | /* 0xE0-E7 for Modifiers. DO NOT USE. */ | ||
| 412 | |||
| 413 | /* Layer Switching */ | ||
| 414 | KC_FN0 = 0xE8, | ||
| 415 | KC_FN1, | ||
| 416 | KC_FN2, | ||
| 417 | KC_FN3, | ||
| 418 | KC_FN4, | ||
| 419 | KC_FN5, | ||
| 420 | KC_FN6, | ||
| 421 | KC_FN7, /* 0xEF */ | ||
| 422 | |||
| 423 | /* Mousekey */ | ||
| 424 | KC_MS_UP = 0xF0, | ||
| 425 | KC_MS_DOWN, | ||
| 426 | KC_MS_LEFT, | ||
| 427 | KC_MS_RIGHT, | ||
| 428 | KC_MS_BTN1, | ||
| 429 | KC_MS_BTN2, | ||
| 430 | KC_MS_BTN3, | ||
| 431 | KC_MS_BTN4, | ||
| 432 | KC_MS_BTN5, | ||
| 433 | /* Mousekey wheel */ | ||
| 434 | KC_MS_WH_UP, | ||
| 435 | KC_MS_WH_DOWN, | ||
| 436 | KC_MS_WH_LEFT, | ||
| 437 | KC_MS_WH_RIGHT, /* 0xFC */ | ||
| 438 | /* 0xFD-FF vacant for future use */ | ||
| 439 | }; | ||
| 440 | |||
| 441 | #endif /* KEYCODE_H */ | ||
