1c Created by Lorna A. Priest, SIL International 2c Any changes to be made should be able to be 3c made in the "stores" rather than in the rules 4c This keyboard uses both "virtual keys" (ALT, CTRL) and deadkeys 5c and will only work on US keyboards 6c This keyboard was written to normalize to NFC. If you wish to 7c use NFD then you should go through the keyboard and 8c remove "use(NFC)" 9c 2009-08-31 LP updated all PUA characters to their official Unicode codepoints 10c Distributed under X11 license 11c Added TSF store and rule 12 13NAME "Pan Africa (for US Keyboards)" 14VERSION 6.0 15BITMAP AFR.bmp 16HOTKEY "^+A" 17COPYRIGHT "� 2003-2009 SIL International. Distributed under the X11 free software license (http://scripts.sil.org/X11License)." 18 19begin Unicode > use(MainU) 20 21store(&mnemoniclayout) "0" 22store(&message) "This keyboard was written to normalize to NFC." \ 23 " If you wish to use NFD then you should go" \ 24 " through the keyboard and remove 'use(NFC)'" 25 26c This new store is a fix for the problem of fast typing reordering keystrokes when using Keyman with TSF 27store(chars) 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]\{}|;:",./<>?' "'`~" 28 29c deadkey for first set 30store(K_1) "[" 31 32c deadkey for second set 33store(K_2) "]" 34 35c reassigned characters (these need to be changed if the above deadkeys are changed) 36store(deadkeys_KV) [LALT K_SLASH] [SHIFT LALT K_COMMA] [SHIFT LALT K_PERIOD] \ 37 [SHIFT LALT K_2] [LALT K_LBRKT] [LALT K_RBRKT] \ 38 [SHIFT LALT K_6] [SHIFT LALT K_HYPHEN] [LALT K_BKQUOTE] \ 39 [SHIFT LALT K_LBRKT] [SHIFT LALT K_BKSLASH] [SHIFT LALT K_RBRKT] \ 40 [SHIFT LALT K_BKQUOTE] 41store(deadkeys_K) "/" "<" ">" \ 42 "@" "[" "]" \ 43 "^" "_" "`" \ 44 "{" "|" "}" \ 45 "~" 46store(deadkeys) U+002F U+003C U+003E \ 47 U+0040 U+005B U+005D \ 48 U+005E U+005F U+0060 \ 49 U+007B U+007C U+007D \ 50 U+007E 51 52 53c using first deadkey 54c hand a hook b hook c hook d 55c schwa hook f hook g hook h 56c bar i hook d hook k ipsilon 57c left n eng open o hook p 58c slash o bar r epsilon hook t 59c bar u hook v hook w gamma 60c hook y ezh glottal semi-colon 61c opening chevron closing chevron 62 63store(KV_lc1) [RALT K_A] [RALT K_B] [RALT K_C] [RALT K_D] \ 64 [RALT K_E] [RALT K_F] [RALT K_G] [RALT K_H] \ 65 [RALT K_I] [RALT K_J] [RALT K_K] [RALT K_L] \ 66 [RALT K_M] [RALT K_N] [RALT K_O] [RALT K_P] \ 67 [RALT K_Q] [RALT K_R] [RALT K_S] [RALT K_T] \ 68 [RALT K_U] [RALT K_V] [RALT K_W] [RALT K_X] \ 69 [RALT K_Y] [RALT K_Z] [RALT K_QUOTE] 70 71 72store(K_lc1) "a" "b" "c" "d" \ 73 "e" "f" "g" "h" \ 74 "i" "j" "k" "l" \ 75 "m" "n" "o" "p" \ 76 "q" "r" "s" "t" \ 77 "u" "v" "w" "x" \ 78 "y" "z" "'" 79 80 81store(lc1) U+0251 U+0253 U+0188 U+0257 \ 82 U+01DD U+0192 U+0260 U+0266 \ 83 U+0268 U+0256 U+0199 U+0269 \ 84 U+0272 U+014B U+0254 U+01A5 \ 85 U+00F8 U+024D U+025B U+01AD \ 86 U+0289 U+028B U+2C73 U+0263 \ 87 U+01B4 U+0292 U+02BC 88 89store(K_UC1) "A" "B" "C" "D" \ 90 "E" "F" "G" "H" \ 91 "I" "J" "K" "L" \ 92 "M" "N" "O" "P" \ 93 "Q" "R" "S" "T" \ 94 "U" "V" "W" "X" \ 95 "Y" "Z" "?" 96 97store(KV_UC1) [SHIFT RALT K_A] [SHIFT RALT K_B] [SHIFT RALT K_C] [SHIFT RALT K_D] \ 98 [SHIFT RALT K_E] [SHIFT RALT K_F] [SHIFT RALT K_G] [SHIFT RALT K_H] \ 99 [SHIFT RALT K_I] [SHIFT RALT K_J] [SHIFT RALT K_K] [SHIFT RALT K_L] \ 100 [SHIFT RALT K_M] [SHIFT RALT K_N] [SHIFT RALT K_O] [SHIFT RALT K_P] \ 101 [SHIFT RALT K_Q] [SHIFT RALT K_R] [SHIFT RALT K_S] [SHIFT RALT K_T] \ 102 [SHIFT RALT K_U] [SHIFT RALT K_V] [SHIFT RALT K_W] [SHIFT RALT K_X] \ 103 [SHIFT RALT K_Y] [SHIFT RALT K_Z] [SHIFT RALT K_SLASH] 104 105store(UC1) U+2C6D U+0181 U+0187 U+018A \ 106 U+018E U+0191 U+0193 U+021E \ 107 U+0197 U+0189 U+0198 U+0196 \ 108 U+019D U+014A U+0186 U+01A4 \ 109 U+00D8 U+024C U+0190 U+01AC \ 110 U+0244 U+01B2 U+2C72 U+0194 \ 111 U+01B3 U+01B7 U+0294 112 113 114 115c using second deadkey 116c optional schwa hook r esh \ 117c bar t upside v barred z 118c reverse glottal 119 120store(KV_lc2) [LALT K_E] [LALT K_R] [LALT K_S] \ 121 [LALT K_T] [LALT K_V] [LALT K_Z] 122 123store(K_lc2) "e" "r" "s" \ 124 "t" "v" "z" 125 126store(lc2) U+0259 U+027D U+0283 \ 127 U+0167 U+028C U+01B6 128 129store(KV_UC2) [SHIFT LALT K_E] [SHIFT LALT K_R] [SHIFT LALT K_S] \ 130 [SHIFT LALT K_T] [SHIFT LALT K_V] [SHIFT LALT K_Z] \ 131 [SHIFT LALT K_SLASH] 132 133store(K_UC2) "E" "R" "S" \ 134 "T" "V" "Z" \ 135 "?" 136 137store(UC2) U+018F U+2C64 U+01A9 \ 138 U+0166 U+0245 U+01B5 \ 139 U+0295 140store(unused2) "abcdfghijklmnopquwxy" \ 141 "ABCDFGHIJKLMNOPQUWXY" 142 143c DIACRITICS 144store(DAgrave) U+0300 145store(DAacute) U+0301 146store(DAcirc) U+0302 147store(DAtilde) U+0303 148store(DAmacron) U+0304 149store(DAdot) U+0307 150store(DAdiaeresis) U+0308 151store(DAhachek) U+030C 152store(DAvert) U+030D 153store(DAcircle) U+030A 154store(DUtilde) U+0330 155store(DUmacron) U+0331 156store(DUdot) U+0323 157store(DUvert) U+0329 158store(DUcircle) U+0325 159store(DUcedilla) U+0327 160 161c DIACRITICS - using first deadkey 162c grave acute circumflex 163c tilde macron dot over 164c diaeresis caron vert 165c ring over 166 167 168store(K_diacritics1) "`" "/" "^" \ 169 "~" "_" "}" \ 170 '"' "{" "|" \ 171 "@" 172 173 174store(diacritics1) outs(DAgrave) outs(DAacute) outs(DAcirc) \ 175 outs(DAtilde) outs(DAmacron) outs(DAdot) \ 176 outs(DAdiaeresis) outs(DAhachek) outs(DAvert) \ 177 outs(DAcircle) 178 179c DIACRITICS - using second deadkey 180c tilde Under macron Under dot Under 181c vertical Under ring Under cedilla 182 183store(K_diacritics2) "~" "_" "}" \ 184 "|" "@" "," 185 186 187store(KV_dia2) [SHIFT RALT K_BKQUOTE] [SHIFT RALT K_HYPHEN] [RALT K_PERIOD] \ 188 [SHIFT RALT K_BKSLASH] [SHIFT RALT K_2] [RALT K_COMMA] 189 190store(diacritics2) outs(DUtilde) outs(DUmacron) outs(DUdot) \ 191 outs(DUvert) outs(DUcircle) outs(DUcedilla) 192 193C Stores used to create composed characters 194store(Vowels) "a" "A" "e" "E" "i" "I" "o" "O" "u" "U" 195store(graveA) U+00E0 U+00C0 U+00E8 U+00C8 U+00EC U+00CC U+00F2 U+00D2 U+00F9 U+00D9 196store(acuteA) U+00E1 U+00C1 U+00E9 U+00C9 U+00ED U+00CD U+00F3 U+00D3 U+00FA U+00DA 197store(circA) U+00E2 U+00C2 U+00EA U+00CA U+00EE U+00CE U+00F4 U+00D4 U+00FB U+00DC 198store(tildeA) U+00E3 U+00C3 U+1EBD U+1EBC U+0129 U+0128 U+00F5 U+00D5 U+0169 U+0168 199store(diaeresisA) U+00E4 U+00C4 U+00EB U+00CB U+00EF U+00CF U+00F6 U+00D6 U+00FC U+00DC 200store(macronA) U+0101 U+0100 U+0113 U+0112 U+012B U+012A U+014D U+014C U+016B U+016A 201store(hachekA) U+01CE U+01CD U+011B U+011A U+01D0 U+01CF U+01D2 U+01D1 U+01D4 U+01D3 202store(dotU) U+1EA1 U+1EA0 U+1EB9 U+1EB8 U+1ECB U+1ECA U+1ECD U+1ECC U+1EE5 U+1EE4 203 204store(circle_K) "a" "A" "u" "U" 205store(circleA) U+00E5 U+00C5 U+016F U+016E 206store(circleU_K) "a" "A" 207store(circleU) U+1E01 U+1E00 208store(tildeU_K) "e" "E" "i" "I" "u" "U" 209store(tildeU) U+1E1B U+1E1A U+1E2D U+1E2C U+1E75 U+1E74 210 211store(dot_K) "a" "A" "b" "B" "c" "C" "d" "D" \ 212 "e" "E" "f" "F" "g" "G" "h" "H" \ 213 "m" "M" "n" "N" "o" "O" "p" "P" \ 214 "r" "R" "s" "S" "t" "T" "w" "W" \ 215 "x" "X" "y" "Y" "z" "Z" 216store(dotA) U+0227 U+0226 U+1E03 U+1E02 U+010B U+010A U+1E0B U+1E0A \ 217 U+0117 U+0116 U+1E1F U+1E1E U+0121 U+0120 U+1E23 U+1E22 \ 218 U+1E41 U+1E40 U+1E45 U+1E44 U+022F U+022E U+1E57 U+1E56 \ 219 U+1E59 U+1E58 U+1E61 U+1E60 U+1E6B U+1E6A U+1E87 U+1E86 \ 220 U+1E8B U+1E8A U+1E8F U+1E8E U+017C U+017B 221store(ConsHachek_K) "C" "c" "D" "d" "G" "g" "H" "h" \ 222 "K" "k" "N" "n" "R" "r" "S" "s" \ 223 "T" "t" "Z" "z" U+01B7 U+0292 224store(ConsHachekA) U+010C U+010D U+010E U+010F U+01E6 U+01E7 U+021E U+021F \ 225 U+01E8 U+01E9 U+0147 U+0148 U+0158 U+0159 U+0160 U+0161 \ 226 U+0164 U+0165 U+017D U+017E U+01EE U+01EF 227store(ConsMacron_K) U+00C6 U+00E6 "G" "g" "Y" "y" 228store(ConsMacronA) U+01E2 U+01E3 U+1E20 U+1E21 U+0232 U+0233 229 230store(ConsGrave_K) "N" "n" "W" "w" "Y" "y" 231store(ConsGraveA) U+01F8 U+01F9 U+1E80 U+1E81 U+1EF2 U+1EF3 232 233store(ConsAcute_K) U+00C6 U+00E6 "C" "c" U+00C7 U+00E7 "G" "g" "K" "k" \ 234 "L" "l" "M" "m" "N" "n" U+00D8 U+00F8 "P" "p" \ 235 "R" "r" "S" "s" "W" "w" "Y" "y" "Z" "z" 236store(ConsAcuteA) U+01FC U+01FD U+0106 U+0107 U+1E08 U+1E09 U+01F4 U+01F5 U+1E30 U+1E31 \ 237 U+0139 U+013A U+1E3E U+1E3F U+0143 U+0144 U+01FE U+01FF U+1E54 U+1E55 \ 238 U+0154 U+0155 U+015A U+015B U+1E82 U+1E83 U+00DD U+00FD U+0179 U+017A 239 240store(ConsTilde_K) "N" "n" "V" "v" "Y" "y" 241store(ConsTildeA) U+00D1 U+00F1 U+1E7C U+1E7D U+1EF8 U+1EF9 242 243store(ConsCirc_K) "C" "c" "G" "g" "H" "h" "J" "j" "S" "s" \ 244 "W" "w" "Y" "y" "Z" "z" 245store(ConsCircA) U+0108 U+0109 U+011C U+011D U+0124 U+0125 U+0134 U+0135 U+015C U+015D \ 246 U+0174 U+0175 U+0176 U+0177 U+1E90 U+1E91 247 248store(ConsDiaeresis_K) "H" "h" "W" "w" "X" "x" "Y" "y" 249store(ConsDiaeresisA) U+1E26 U+1E27 U+1E84 U+1E85 U+1E8C U+1E8D U+0178 U+00FF 250 251store(cedilla_K) "c" "C" "e" "E" "h" "H" "s" "S" "t" "T" 252store(cedillaU) U+00E7 U+00C7 U+0229 U+0228 U+1E29 U+1E28 U+015F U+015E U+0163 U+0162 253 254store(ConsDotU_K) "B" "b" "D" "d" "H" "h" "K" "k" \ 255 "L" "l" "M" "m" "N" "n" "R" "r" \ 256 "S" "s" "T" "t" "V" "v" "W" "w" \ 257 "Y" "y" "Z" "z" 258store(ConsDotU) U+1E04 U+1E05 U+1E0C U+1E0D U+1E24 U+1E25 U+1E32 U+1E33 \ 259 U+1E36 U+1E37 U+1E42 U+1E43 U+1E46 U+1E47 U+1E5A U+1E5B \ 260 U+1E62 U+1E63 U+1E6C U+1E6D U+1E7E U+1E7F U+1E88 U+1E89 \ 261 U+1EF4 U+1EF5 U+1E92 U+1E93 262 263store(ConsbarU_K) "B" "b" "D" "d" "K" "k" "L" "l" \ 264 "N" "n" "R" "r" "T" "t" "Z" "z" 265store(ConsbarU) U+1E06 U+1E07 U+1E0E U+1E0F U+1E34 U+1E35 U+1E3A U+1E3B \ 266 U+1E48 U+1E49 U+1E5E U+1E5F U+1E6E U+1E6F U+1E94 U+1E95 267 268store(StackingBM) U+00E4 U+00C4 U+00F6 U+00D6 U+00FC U+00DC \ 269 U+0227 U+0226 U+022F U+022E \ 270 U+00F5 U+00D5 271store(StackingMacron) U+01DF U+01DE U+022B U+022A U+01D6 U+01D5 \ 272 U+01E1 U+01E0 U+0231 U+0230 \ 273 U+022D U+022C 274store(StackingBA) U+0113 U+0112 U+00EF U+00CF U+014D U+014C U+00FC U+00DC \ 275 U+00E5 U+00C5 U+00F5 U+00D5 U+0169 U+0168 276store(StackingAcute) U+1E17 U+1E16 U+1E2F U+1E2E U+1E53 U+1E52 U+01D8 U+01D7 \ 277 U+01FB U+01FA U+1E4D U+1E4C U+1E79 U+1E78 278 279store(StackingBH) U+00FC U+00DC 280store(StackingHachek) U+01DA U+01D9 281 282store(StackingBG) U+0113 U+0112 U+014D U+014C U+00FC U+00DC 283store(StackingGrave) U+1E15 U+1E14 U+1E51 U+1E50 U+01DC U+01DB 284 285store(StackingBT) U+00E2 U+00C2 U+00EA U+00CA U+00F4 U+00D4 286store(StackingTilde) U+1EAB U+1EAA U+1EC5 U+1EC4 U+1ED7 U+1ED6 287store(StackingBDot1) U+00E2 U+00C2 U+00EA U+00CA U+00F4 U+00D4 288store(StackingBDot2) U+1EA1 U+1EA0 U+1EB9 U+1EB8 U+1ECD U+1ECC 289store(StackingDot) U+1EAD U+1EAC U+1EC7 U+1EC6 U+1ED9 U+1ED8 290 291store(StackingBDiar) U+1E4F U+1E4E U+016B U+016A 292store(StackingDiaresis) U+00F5 U+00D5 U+1E7B U+1E7A 293 294 295c chevron quotation marks. If curly quotes are desired use stores below. 296 297store(opSglQ_K) "<" 298store(opSglQ) U+2039 299store(opDblQ) U+00AB 300store(clSglQ_K) ">" 301store(clSglQ) U+203A 302store(clDblQ) U+00BB 303 304c curly quotation marks. 305store(opSglQ2) U+2018 306store(opDblQ2) U+201C 307store(clSglQ2) U+2019 308store(clDblQ2) U+201D 309 310c end of STORES 311c *************************************************** 312 313c begin groups 314c *************************************************** 315 316c begin MainU group 317c *************************************************** 318 319 320group(MainU) using keys 321 322c deadkeys 323 + any(K_1) > dk(1) 324 + any(K_2) > dk(2) 325 326c reassigned characters 327dk(2) + any(deadkeys_K) > index(deadkeys,2) 328 + any(deadkeys_KV) > index(deadkeys,1) 329c PUNCTUATION 330c chevrons 331 + any(opSglQ_K) > outs(opSglQ) use(Quotes) 332 + any(clSglQ_K) > outs(clSglQ) use(Quotes) 333c curly quotes 334dk(1) + any(opSglQ_K) > outs(opSglQ2) use(Quotes) 335dk(1) + any(clSglQ_K) > outs(clSglQ2) use(Quotes) 336 337c special characters - using deadkey 338dk(1) + any(K_lc1) > index(lc1,2) 339dk(2) + any(K_lc2) > index(lc2,2) 340dk(1) + any(K_UC1) > index(UC1,2) 341dk(2) + any(K_UC2) > index(UC2,2) 342dk(2) + any(unused2) > beep 343 344c special characters - using shift keys 345 + any(KV_lc1) > index(lc1,1) 346 + any(KV_UC1) > index(UC1,1) 347 + any(KV_lc2) > index(lc2,1) 348 + any(KV_UC2) > index(UC2,1) 349 350c diacritics - using deadkey 351 + any(K_diacritics1) > index(diacritics1,1) use(NFC) 352dk(1) + any(K_diacritics2) > index(diacritics2,2) use(NFC) 353 354c diacritics - using shift keys 355 + any(KV_dia2) > index(diacritics2,1) use(NFC) 356 357c group(2) using keys 358c housekeeping 359any(graveA) + [K_BKSP] > index(Vowels,1) 360any(ConsGraveA) + [K_BKSP] > index(ConsGrave_K,1) 361any(acuteA) + [K_BKSP] > index(Vowels,1) 362any(ConsAcuteA) + [K_BKSP] > index(ConsAcute_K,1) 363any(circA) + [K_BKSP] > index(Vowels,1) 364any(ConsCircA) + [K_BKSP] > index(ConsCirc_K,1) 365any(tildeA) + [K_BKSP] > index(Vowels,1) 366any(ConsTildeA) + [K_BKSP] > index(ConsTilde_K,1) 367any(macronA) + [K_BKSP] > index(Vowels,1) 368any(ConsMacronA) + [K_BKSP] > index(ConsMacron_K,1) 369any(diaeresisA) + [K_BKSP] > index(Vowels,1) 370any(ConsDiaeresisA) + [K_BKSP] > index(ConsDiaeresis_K,1) 371any(hachekA) + [K_BKSP] > index(Vowels,1) 372any(ConsHachekA) + [K_BKSP] > index(ConsHachek_K,1) 373any(dotU) + [K_BKSP] > index(Vowels,1) 374any(ConsDotU) + [K_BKSP] > index(ConsDotU_K,1) 375any(circleA) + [K_BKSP] > index(circle_K,1) 376any(circleU) + [K_BKSP] > index(circleU_K,1) 377any(tildeU) + [K_BKSP] > index(tildeU_K,1) 378any(dotA) + [K_BKSP] > index(Dot_K,1) 379any(cedillaU) + [K_BKSP] > index(cedilla_K,1) 380any(ConsbarU) + [K_BKSP] > index(ConsbarU_K,1) 381any(StackingMacron) + [K_BKSP] > index(StackingBM,1) 382any(StackingAcute) + [K_BKSP] > index(StackingBA,1) 383any(StackingHachek) + [K_BKSP] > index(StackingBH,1) 384any(StackingGrave) + [K_BKSP] > index(StackingBG,1) 385any(StackingTilde) + [K_BKSP] > index(StackingBT,1) 386any(StackingDot) + [K_BKSP] > index(StackingBDot2,1) 387any(StackingDiaresis) + [K_BKSP] > index(StackingBDiar,1) 388 389c This new rule is a fix for the problem of fast typing reordering keystrokes when using Keyman with TSF. 390c It apparently must be the last rule in the group. 391 392 + any(chars) > index(chars, 1) 393 394c end MainU group 395c *************************************************** 396 397c begin Quotes group 398c *************************************************** 399 400group(Quotes) 401 402any(opSglQ) any(opSglQ) > outs(opDblQ) 403any(clSglQ) any(clSglQ) > outs(clDblQ) 404any(opSglQ2) any(opSglQ2) > outs(opDblQ2) 405any(clSglQ2) any(clSglQ2) > outs(clDblQ2) 406 407 408 409c end Quotes group 410c *************************************************** 411 412c begin NFC group 413c *************************************************** 414 415group(NFC) 416 417c Diacritics (single) 418any(Vowels) any(DAgrave) > index(graveA,1) 419any(ConsGrave_K) any(DAgrave) > index(ConsGraveA,1) 420 421any(Vowels) any(DAacute) > index(acuteA,1) 422any(ConsAcute_K) any(DAacute) > index(ConsAcuteA,1) 423 424any(Vowels) any(DAcirc) > index(circA,1) 425any(ConsCirc_K) any(DAcirc) > index(ConsCircA,1) 426 427any(Vowels) any(DAtilde) > index(tildeA,1) 428any(ConsTilde_K) any(DAtilde) > index(ConsTildeA,1) 429 430any(Vowels) any(DAmacron) > index(macronA,1) 431any(ConsMacron_K) any(DAmacron) > index(ConsMacronA,1) 432 433any(Vowels) any(DAdiaeresis) > index(diaeresisA,1) 434any(ConsDiaeresis_K) any(DAdiaeresis) > index(ConsDiaeresisA,1) 435 436any(Vowels) any(DAhachek) > index(hachekA,1) 437any(ConsHachek_K) any(DAhachek) > index(ConsHachekA,1) 438 439any(Vowels) any(DUdot) > index(dotU,1) 440any(ConsDotU_K) any(DUdot) > index(ConsDotU,1) 441 442any(circle_K) any(DAcircle) > index(circleA,1) 443any(circleU_K) any(DUcircle) > index(circleU,1) 444 445any(tildeU_K) any(DUtilde) > index(tildeU,1) 446any(dot_K) any(DAdot) > index(dotA,1) 447any(cedilla_K) any(DUcedilla) > index(cedillaU,1) 448any(ConsbarU_K) any(DUmacron) > index(ConsbarU,1) 449 450C Stacking diacritics (multi) 451 452any(StackingBM) any(DAmacron) > index(StackingMacron,1) 453any(StackingBA) any(DAacute) > index(StackingAcute,1) 454any(StackingBH) any(DAhachek) > index(StackingHachek,1) 455any(StackingBG) any(DAgrave) > index(StackingGrave,1) 456any(StackingBT) any(DAtilde) > index(StackingTilde,1) 457any(StackingBDot1) any(DUdot) > index(StackingDot,1) 458any(StackingBDot2) any(DAcirc) > index(StackingDot,1) 459any(StackingBDiar) any(DAdiaeresis) > index(StackingDiaresis,1) 460 461c end COMPOSITE groups 462c ************************************************************************************ 463 464c end groups 465c ************************************************************************************ 466 467 468 469 470