From 062fb2bd92324706eed1fba8d5f7b4015ef2b058 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Sun, 19 Apr 2009 09:44:15 -0700 Subject: [PATCH] changes from H.G. Muller; version 4.3.7 --- backend.c | 416 +++- backend.h | 1 + bitmaps/260px-Hanzi.svg | Bin 0 -> 12655 bytes bitmaps/65px-Zhongwen.svg | Bin 0 -> 1759 bytes bitmaps/ANALYZE2_14.ICO | Bin 0 -> 294 bytes bitmaps/ANALYZE_14.ICO | Bin 0 -> 294 bytes bitmaps/BALOON_14.ICO | Bin 0 -> 294 bytes bitmaps/BLACK_14.ICO | Bin 0 -> 294 bytes bitmaps/CLOCK_14.ICO | Bin 0 -> 294 bytes bitmaps/PONDER_14.ICO | Bin 0 -> 294 bytes bitmaps/README.bitmaps | 114 +- bitmaps/TRANS_14.ICO | Bin 0 -> 294 bytes bitmaps/UNKNOWN_14.ICO | Bin 0 -> 294 bytes bitmaps/WHITE_14.ICO | Bin 0 -> 294 bytes bitmaps/a49c.bmp | Bin 0 -> 1490 bytes bitmaps/b108o.bmp | Bin 0 -> 1790 bytes bitmaps/b108s.bmp | Bin 0 -> 1790 bytes bitmaps/b108w.bmp | Bin 0 -> 1790 bytes bitmaps/b116o.bmp | Bin 0 -> 1918 bytes bitmaps/b116s.bmp | Bin 0 -> 1918 bytes bitmaps/b116w.bmp | Bin 0 -> 1918 bytes bitmaps/b129o.bmp | Bin 0 -> 2642 bytes bitmaps/b129s.bmp | Bin 0 -> 2642 bytes bitmaps/b129w.bmp | Bin 0 -> 2642 bytes bitmaps/b21o.bmp | Bin 0 -> 146 bytes bitmaps/b21s.bmp | Bin 0 -> 146 bytes bitmaps/b21w.bmp | Bin 0 -> 146 bytes bitmaps/b25o.bmp | Bin 0 -> 162 bytes bitmaps/b25s.bmp | Bin 0 -> 162 bytes bitmaps/b25w.bmp | Bin 0 -> 162 bytes bitmaps/b29o.bmp | Bin 0 -> 178 bytes bitmaps/b29s.bmp | Bin 0 -> 178 bytes bitmaps/b29w.bmp | Bin 0 -> 178 bytes bitmaps/b33o.bmp | Bin 0 -> 326 bytes bitmaps/b33s.bmp | Bin 0 -> 326 bytes bitmaps/b33w.bmp | Bin 0 -> 326 bytes bitmaps/b37o.bmp | Bin 0 -> 358 bytes bitmaps/b37s.bmp | Bin 0 -> 358 bytes bitmaps/b37w.bmp | Bin 0 -> 358 bytes bitmaps/b40o.bmp | Bin 0 -> 382 bytes bitmaps/b40s.bmp | Bin 0 -> 382 bytes bitmaps/b40w.bmp | Bin 0 -> 382 bytes bitmaps/b45o.bmp | Bin 0 -> 422 bytes bitmaps/b45s.bmp | Bin 0 -> 422 bytes bitmaps/b45w.bmp | Bin 0 -> 422 bytes bitmaps/b49o.bmp | Bin 0 -> 454 bytes bitmaps/b49s.bmp | Bin 0 -> 454 bytes bitmaps/b49w.bmp | Bin 0 -> 454 bytes bitmaps/b54o.bmp | Bin 0 -> 494 bytes bitmaps/b54s.bmp | Bin 0 -> 494 bytes bitmaps/b54w.bmp | Bin 0 -> 494 bytes bitmaps/b58o.bmp | Bin 0 -> 526 bytes bitmaps/b58s.bmp | Bin 0 -> 526 bytes bitmaps/b58w.bmp | Bin 0 -> 526 bytes bitmaps/b64o.bmp | Bin 0 -> 574 bytes bitmaps/b64s.bmp | Bin 0 -> 574 bytes bitmaps/b64w.bmp | Bin 0 -> 574 bytes bitmaps/b72o.bmp | Bin 0 -> 926 bytes bitmaps/b72s.bmp | Bin 0 -> 926 bytes bitmaps/b72w.bmp | Bin 0 -> 926 bytes bitmaps/b80o.bmp | Bin 0 -> 1022 bytes bitmaps/b80s.bmp | Bin 0 -> 1022 bytes bitmaps/b80w.bmp | Bin 0 -> 1022 bytes bitmaps/b87o.bmp | Bin 0 -> 1106 bytes bitmaps/b87s.bmp | Bin 0 -> 1106 bytes bitmaps/b87w.bmp | Bin 0 -> 1106 bytes bitmaps/b95o.bmp | Bin 0 -> 1202 bytes bitmaps/b95s.bmp | Bin 0 -> 1202 bytes bitmaps/b95w.bmp | Bin 0 -> 1202 bytes bitmaps/board.ico | Bin 0 -> 1086 bytes bitmaps/dk49o.bmp | Bin 0 -> 454 bytes bitmaps/dk49s.bmp | Bin 0 -> 454 bytes bitmaps/dk49w.bmp | Bin 0 -> 454 bytes bitmaps/dk72o.bmp | Bin 0 -> 926 bytes bitmaps/dk72s.bmp | Bin 0 -> 926 bytes bitmaps/dk72w.bmp | Bin 0 -> 926 bytes bitmaps/e129o.bmp | Bin 0 -> 2642 bytes bitmaps/g49o.bmp | Bin 0 -> 454 bytes bitmaps/g49s.bmp | Bin 0 -> 454 bytes bitmaps/g49w.bmp | Bin 0 -> 454 bytes bitmaps/g72o.bmp | Bin 0 -> 926 bytes bitmaps/g72s.bmp | Bin 0 -> 926 bytes bitmaps/g72w.bmp | Bin 0 -> 926 bytes bitmaps/galactic.bmp | Bin 0 -> 96142 bytes bitmaps/h129o.bmp | Bin 0 -> 2642 bytes bitmaps/h49o.bmp | Bin 454 -> 454 bytes bitmaps/h49s.bmp | Bin 454 -> 454 bytes bitmaps/h49w.bmp | Bin 454 -> 454 bytes bitmaps/h72o.bmp | Bin 926 -> 926 bytes bitmaps/h72s.bmp | Bin 926 -> 926 bytes bitmaps/h72w.bmp | Bin 926 -> 926 bytes bitmaps/icon_b.bmp | Bin 0 -> 190 bytes bitmaps/icon_b.ico | Bin 0 -> 1086 bytes bitmaps/icon_o.ico | Bin 0 -> 326 bytes bitmaps/icon_ob.ico | Bin 0 -> 1086 bytes bitmaps/icon_ow.ico | Bin 0 -> 1086 bytes bitmaps/icon_w.bmp | Bin 0 -> 190 bytes bitmaps/icon_w.ico | Bin 0 -> 326 bytes bitmaps/icon_whi.ico | Bin 0 -> 1086 bytes bitmaps/k108o.bmp | Bin 0 -> 1790 bytes bitmaps/k108s.bmp | Bin 0 -> 1790 bytes bitmaps/k108w.bmp | Bin 0 -> 1790 bytes bitmaps/k116o.bmp | Bin 0 -> 1918 bytes bitmaps/k116s.bmp | Bin 0 -> 1918 bytes bitmaps/k116w.bmp | Bin 0 -> 1918 bytes bitmaps/k129o.bmp | Bin 0 -> 2642 bytes bitmaps/k129s.bmp | Bin 0 -> 2642 bytes bitmaps/k129w.bmp | Bin 0 -> 2642 bytes bitmaps/k21o.bmp | Bin 0 -> 146 bytes bitmaps/k21s.bmp | Bin 0 -> 146 bytes bitmaps/k21w.bmp | Bin 0 -> 146 bytes bitmaps/k25o.bmp | Bin 0 -> 162 bytes bitmaps/k25s.bmp | Bin 0 -> 162 bytes bitmaps/k25w.bmp | Bin 0 -> 162 bytes bitmaps/k29o.bmp | Bin 0 -> 178 bytes bitmaps/k29s.bmp | Bin 0 -> 178 bytes bitmaps/k29w.bmp | Bin 0 -> 178 bytes bitmaps/k33o.bmp | Bin 0 -> 326 bytes bitmaps/k33s.bmp | Bin 0 -> 326 bytes bitmaps/k33w.bmp | Bin 0 -> 326 bytes bitmaps/k37o.bmp | Bin 0 -> 358 bytes bitmaps/k37s.bmp | Bin 0 -> 358 bytes bitmaps/k37w.bmp | Bin 0 -> 358 bytes bitmaps/k40o.bmp | Bin 0 -> 382 bytes bitmaps/k40s.bmp | Bin 0 -> 382 bytes bitmaps/k40w.bmp | Bin 0 -> 382 bytes bitmaps/k45o.bmp | Bin 0 -> 422 bytes bitmaps/k45s.bmp | Bin 0 -> 422 bytes bitmaps/k45w.bmp | Bin 0 -> 422 bytes bitmaps/k49o.bmp | Bin 0 -> 454 bytes bitmaps/k49s.bmp | Bin 0 -> 454 bytes bitmaps/k49w.bmp | Bin 0 -> 454 bytes bitmaps/k54o.bmp | Bin 0 -> 494 bytes bitmaps/k54s.bmp | Bin 0 -> 494 bytes bitmaps/k54w.bmp | Bin 0 -> 494 bytes bitmaps/k58o.bmp | Bin 0 -> 526 bytes bitmaps/k58s.bmp | Bin 0 -> 526 bytes bitmaps/k58w.bmp | Bin 0 -> 526 bytes bitmaps/k64o.bmp | Bin 0 -> 574 bytes bitmaps/k64s.bmp | Bin 0 -> 574 bytes bitmaps/k64w.bmp | Bin 0 -> 574 bytes bitmaps/k72o.bmp | Bin 0 -> 926 bytes bitmaps/k72s.bmp | Bin 0 -> 926 bytes bitmaps/k72w.bmp | Bin 0 -> 926 bytes bitmaps/k80o.bmp | Bin 0 -> 1022 bytes bitmaps/k80s.bmp | Bin 0 -> 1022 bytes bitmaps/k80w.bmp | Bin 0 -> 1022 bytes bitmaps/k87o.bmp | Bin 0 -> 1106 bytes bitmaps/k87s.bmp | Bin 0 -> 1106 bytes bitmaps/k87w.bmp | Bin 0 -> 1106 bytes bitmaps/k95o.bmp | Bin 0 -> 1202 bytes bitmaps/k95s.bmp | Bin 0 -> 1202 bytes bitmaps/k95w.bmp | Bin 0 -> 1202 bytes bitmaps/l49o.bmp | Bin 0 -> 454 bytes bitmaps/l49s.bmp | Bin 0 -> 454 bytes bitmaps/l49w.bmp | Bin 0 -> 454 bytes bitmaps/l72o.bmp | Bin 0 -> 926 bytes bitmaps/l72s.bmp | Bin 0 -> 926 bytes bitmaps/l72w.bmp | Bin 0 -> 926 bytes bitmaps/m129o.bmp | Bin 0 -> 2642 bytes bitmaps/n108o.bmp | Bin 0 -> 1790 bytes bitmaps/n108s.bmp | Bin 0 -> 1790 bytes bitmaps/n108w.bmp | Bin 0 -> 1790 bytes bitmaps/n116o.bmp | Bin 0 -> 1918 bytes bitmaps/n116s.bmp | Bin 0 -> 1918 bytes bitmaps/n116w.bmp | Bin 0 -> 1918 bytes bitmaps/n129o.bmp | Bin 0 -> 2642 bytes bitmaps/n129s.bmp | Bin 0 -> 2642 bytes bitmaps/n129w.bmp | Bin 0 -> 2642 bytes bitmaps/n21o.bmp | Bin 0 -> 146 bytes bitmaps/n21s.bmp | Bin 0 -> 146 bytes bitmaps/n21w.bmp | Bin 0 -> 146 bytes bitmaps/n25o.bmp | Bin 0 -> 162 bytes bitmaps/n25s.bmp | Bin 0 -> 162 bytes bitmaps/n25w.bmp | Bin 0 -> 162 bytes bitmaps/n29o.bmp | Bin 0 -> 178 bytes bitmaps/n29s.bmp | Bin 0 -> 178 bytes bitmaps/n29w.bmp | Bin 0 -> 178 bytes bitmaps/n33o.bmp | Bin 0 -> 326 bytes bitmaps/n33s.bmp | Bin 0 -> 326 bytes bitmaps/n33w.bmp | Bin 0 -> 326 bytes bitmaps/n37o.bmp | Bin 0 -> 358 bytes bitmaps/n37s.bmp | Bin 0 -> 358 bytes bitmaps/n37w.bmp | Bin 0 -> 358 bytes bitmaps/n40o.bmp | Bin 0 -> 382 bytes bitmaps/n40s.bmp | Bin 0 -> 382 bytes bitmaps/n40w.bmp | Bin 0 -> 382 bytes bitmaps/n45o.bmp | Bin 0 -> 422 bytes bitmaps/n45s.bmp | Bin 0 -> 422 bytes bitmaps/n45w.bmp | Bin 0 -> 422 bytes bitmaps/n49o.bmp | Bin 0 -> 454 bytes bitmaps/n49s.bmp | Bin 0 -> 454 bytes bitmaps/n49w.bmp | Bin 0 -> 454 bytes bitmaps/n54o.bmp | Bin 0 -> 494 bytes bitmaps/n54s.bmp | Bin 0 -> 494 bytes bitmaps/n54w.bmp | Bin 0 -> 494 bytes bitmaps/n58o.bmp | Bin 0 -> 526 bytes bitmaps/n58s.bmp | Bin 0 -> 526 bytes bitmaps/n58w.bmp | Bin 0 -> 526 bytes bitmaps/n64o.bmp | Bin 0 -> 574 bytes bitmaps/n64s.bmp | Bin 0 -> 574 bytes bitmaps/n64w.bmp | Bin 0 -> 574 bytes bitmaps/n72o.bmp | Bin 0 -> 926 bytes bitmaps/n72s.bmp | Bin 0 -> 926 bytes bitmaps/n72w.bmp | Bin 0 -> 926 bytes bitmaps/n80o.bmp | Bin 0 -> 1022 bytes bitmaps/n80s.bmp | Bin 0 -> 1022 bytes bitmaps/n80w.bmp | Bin 0 -> 1022 bytes bitmaps/n87o.bmp | Bin 0 -> 1106 bytes bitmaps/n87s.bmp | Bin 0 -> 1106 bytes bitmaps/n87w.bmp | Bin 0 -> 1106 bytes bitmaps/n95o.bmp | Bin 0 -> 1202 bytes bitmaps/n95s.bmp | Bin 0 -> 1202 bytes bitmaps/n95w.bmp | Bin 0 -> 1202 bytes bitmaps/ni49o.bmp | Bin 0 -> 454 bytes bitmaps/ni49s.bmp | Bin 0 -> 454 bytes bitmaps/ni49w.bmp | Bin 0 -> 454 bytes bitmaps/ni72o.bmp | Bin 0 -> 926 bytes bitmaps/ni72s.bmp | Bin 0 -> 926 bytes bitmaps/ni72w.bmp | Bin 0 -> 926 bytes bitmaps/p108o.bmp | Bin 0 -> 1790 bytes bitmaps/p108s.bmp | Bin 0 -> 1790 bytes bitmaps/p108w.bmp | Bin 0 -> 1790 bytes bitmaps/p116o.bmp | Bin 0 -> 1918 bytes bitmaps/p116s.bmp | Bin 0 -> 1918 bytes bitmaps/p116w.bmp | Bin 0 -> 1918 bytes bitmaps/p129o.bmp | Bin 0 -> 2642 bytes bitmaps/p129s.bmp | Bin 0 -> 2642 bytes bitmaps/p129w.bmp | Bin 0 -> 2642 bytes bitmaps/p21o.bmp | Bin 0 -> 146 bytes bitmaps/p21s.bmp | Bin 0 -> 146 bytes bitmaps/p21w.bmp | Bin 0 -> 146 bytes bitmaps/p25o.bmp | Bin 0 -> 162 bytes bitmaps/p25s.bmp | Bin 0 -> 162 bytes bitmaps/p25w.bmp | Bin 0 -> 162 bytes bitmaps/p29o.bmp | Bin 0 -> 178 bytes bitmaps/p29s.bmp | Bin 0 -> 178 bytes bitmaps/p29w.bmp | Bin 0 -> 178 bytes bitmaps/p33o.bmp | Bin 0 -> 326 bytes bitmaps/p33s.bmp | Bin 0 -> 326 bytes bitmaps/p33w.bmp | Bin 0 -> 326 bytes bitmaps/p37o.bmp | Bin 0 -> 358 bytes bitmaps/p37s.bmp | Bin 0 -> 358 bytes bitmaps/p37w.bmp | Bin 0 -> 358 bytes bitmaps/p40o.bmp | Bin 0 -> 382 bytes bitmaps/p40s.bmp | Bin 0 -> 382 bytes bitmaps/p40w.bmp | Bin 0 -> 382 bytes bitmaps/p45o.bmp | Bin 0 -> 422 bytes bitmaps/p45s.bmp | Bin 0 -> 422 bytes bitmaps/p45w.bmp | Bin 0 -> 422 bytes bitmaps/p49o.bmp | Bin 0 -> 454 bytes bitmaps/p49s.bmp | Bin 0 -> 454 bytes bitmaps/p49w.bmp | Bin 0 -> 454 bytes bitmaps/p54o.bmp | Bin 0 -> 494 bytes bitmaps/p54s.bmp | Bin 0 -> 494 bytes bitmaps/p54w.bmp | Bin 0 -> 494 bytes bitmaps/p58o.bmp | Bin 0 -> 526 bytes bitmaps/p58s.bmp | Bin 0 -> 526 bytes bitmaps/p58w.bmp | Bin 0 -> 526 bytes bitmaps/p64o.bmp | Bin 0 -> 574 bytes bitmaps/p64s.bmp | Bin 0 -> 574 bytes bitmaps/p64w.bmp | Bin 0 -> 574 bytes bitmaps/p72o.bmp | Bin 0 -> 926 bytes bitmaps/p72s.bmp | Bin 0 -> 926 bytes bitmaps/p72w.bmp | Bin 0 -> 926 bytes bitmaps/p80o.bmp | Bin 0 -> 1022 bytes bitmaps/p80s.bmp | Bin 0 -> 1022 bytes bitmaps/p80w.bmp | Bin 0 -> 1022 bytes bitmaps/p87o.bmp | Bin 0 -> 1106 bytes bitmaps/p87s.bmp | Bin 0 -> 1106 bytes bitmaps/p87w.bmp | Bin 0 -> 1106 bytes bitmaps/p95o.bmp | Bin 0 -> 1202 bytes bitmaps/p95s.bmp | Bin 0 -> 1202 bytes bitmaps/p95w.bmp | Bin 0 -> 1202 bytes bitmaps/q108o.bmp | Bin 0 -> 1790 bytes bitmaps/q108s.bmp | Bin 0 -> 1790 bytes bitmaps/q108w.bmp | Bin 0 -> 1790 bytes bitmaps/q116o.bmp | Bin 0 -> 1918 bytes bitmaps/q116s.bmp | Bin 0 -> 1918 bytes bitmaps/q116w.bmp | Bin 0 -> 1918 bytes bitmaps/q129o.bmp | Bin 0 -> 2642 bytes bitmaps/q129s.bmp | Bin 0 -> 2642 bytes bitmaps/q129w.bmp | Bin 0 -> 2642 bytes bitmaps/q21o.bmp | Bin 0 -> 146 bytes bitmaps/q21s.bmp | Bin 0 -> 146 bytes bitmaps/q21w.bmp | Bin 0 -> 146 bytes bitmaps/q25o.bmp | Bin 0 -> 162 bytes bitmaps/q25s.bmp | Bin 0 -> 162 bytes bitmaps/q25w.bmp | Bin 0 -> 162 bytes bitmaps/q29o.bmp | Bin 0 -> 178 bytes bitmaps/q29s.bmp | Bin 0 -> 178 bytes bitmaps/q29w.bmp | Bin 0 -> 178 bytes bitmaps/q33o.bmp | Bin 0 -> 326 bytes bitmaps/q33s.bmp | Bin 0 -> 326 bytes bitmaps/q33w.bmp | Bin 0 -> 326 bytes bitmaps/q37o.bmp | Bin 0 -> 358 bytes bitmaps/q37s.bmp | Bin 0 -> 358 bytes bitmaps/q37w.bmp | Bin 0 -> 358 bytes bitmaps/q40o.bmp | Bin 0 -> 382 bytes bitmaps/q40s.bmp | Bin 0 -> 382 bytes bitmaps/q40w.bmp | Bin 0 -> 382 bytes bitmaps/q45o.bmp | Bin 0 -> 422 bytes bitmaps/q45s.bmp | Bin 0 -> 422 bytes bitmaps/q45w.bmp | Bin 0 -> 422 bytes bitmaps/q49o.bmp | Bin 0 -> 454 bytes bitmaps/q49s.bmp | Bin 0 -> 454 bytes bitmaps/q49w.bmp | Bin 0 -> 454 bytes bitmaps/q54o.bmp | Bin 0 -> 494 bytes bitmaps/q54s.bmp | Bin 0 -> 494 bytes bitmaps/q54w.bmp | Bin 0 -> 494 bytes bitmaps/q58o.bmp | Bin 0 -> 526 bytes bitmaps/q58s.bmp | Bin 0 -> 526 bytes bitmaps/q58w.bmp | Bin 0 -> 526 bytes bitmaps/q64o.bmp | Bin 0 -> 574 bytes bitmaps/q64s.bmp | Bin 0 -> 574 bytes bitmaps/q64w.bmp | Bin 0 -> 574 bytes bitmaps/q72o.bmp | Bin 0 -> 926 bytes bitmaps/q72s.bmp | Bin 0 -> 926 bytes bitmaps/q72w.bmp | Bin 0 -> 926 bytes bitmaps/q80o.bmp | Bin 0 -> 1022 bytes bitmaps/q80s.bmp | Bin 0 -> 1022 bytes bitmaps/q80w.bmp | Bin 0 -> 1022 bytes bitmaps/q87o.bmp | Bin 0 -> 1106 bytes bitmaps/q87s.bmp | Bin 0 -> 1106 bytes bitmaps/q87w.bmp | Bin 0 -> 1106 bytes bitmaps/q95o.bmp | Bin 0 -> 1202 bytes bitmaps/q95s.bmp | Bin 0 -> 1202 bytes bitmaps/q95w.bmp | Bin 0 -> 1202 bytes bitmaps/r108o.bmp | Bin 0 -> 1790 bytes bitmaps/r108s.bmp | Bin 0 -> 1790 bytes bitmaps/r108w.bmp | Bin 0 -> 1790 bytes bitmaps/r116o.bmp | Bin 0 -> 1918 bytes bitmaps/r116s.bmp | Bin 0 -> 1918 bytes bitmaps/r116w.bmp | Bin 0 -> 1918 bytes bitmaps/r129o.bmp | Bin 0 -> 2642 bytes bitmaps/r129s.bmp | Bin 0 -> 2642 bytes bitmaps/r129w.bmp | Bin 0 -> 2642 bytes bitmaps/r21o.bmp | Bin 0 -> 146 bytes bitmaps/r21s.bmp | Bin 0 -> 146 bytes bitmaps/r21w.bmp | Bin 0 -> 146 bytes bitmaps/r25o.bmp | Bin 0 -> 162 bytes bitmaps/r25s.bmp | Bin 0 -> 162 bytes bitmaps/r25w.bmp | Bin 0 -> 162 bytes bitmaps/r29o.bmp | Bin 0 -> 178 bytes bitmaps/r29s.bmp | Bin 0 -> 178 bytes bitmaps/r29w.bmp | Bin 0 -> 178 bytes bitmaps/r33o.bmp | Bin 0 -> 326 bytes bitmaps/r33s.bmp | Bin 0 -> 326 bytes bitmaps/r33w.bmp | Bin 0 -> 326 bytes bitmaps/r37o.bmp | Bin 0 -> 358 bytes bitmaps/r37s.bmp | Bin 0 -> 358 bytes bitmaps/r37w.bmp | Bin 0 -> 358 bytes bitmaps/r40o.bmp | Bin 0 -> 382 bytes bitmaps/r40s.bmp | Bin 0 -> 382 bytes bitmaps/r40w.bmp | Bin 0 -> 382 bytes bitmaps/r45o.bmp | Bin 0 -> 422 bytes bitmaps/r45s.bmp | Bin 0 -> 422 bytes bitmaps/r45w.bmp | Bin 0 -> 422 bytes bitmaps/r49o.bmp | Bin 0 -> 454 bytes bitmaps/r49s.bmp | Bin 0 -> 454 bytes bitmaps/r49w.bmp | Bin 0 -> 454 bytes bitmaps/r54o.bmp | Bin 0 -> 494 bytes bitmaps/r54s.bmp | Bin 0 -> 494 bytes bitmaps/r54w.bmp | Bin 0 -> 494 bytes bitmaps/r58o.bmp | Bin 0 -> 526 bytes bitmaps/r58s.bmp | Bin 0 -> 526 bytes bitmaps/r58w.bmp | Bin 0 -> 526 bytes bitmaps/r64o.bmp | Bin 0 -> 574 bytes bitmaps/r64s.bmp | Bin 0 -> 574 bytes bitmaps/r64w.bmp | Bin 0 -> 574 bytes bitmaps/r72o.bmp | Bin 0 -> 926 bytes bitmaps/r72s.bmp | Bin 0 -> 926 bytes bitmaps/r72w.bmp | Bin 0 -> 926 bytes bitmaps/r80o.bmp | Bin 0 -> 1022 bytes bitmaps/r80s.bmp | Bin 0 -> 1022 bytes bitmaps/r80w.bmp | Bin 0 -> 1022 bytes bitmaps/r87o.bmp | Bin 0 -> 1106 bytes bitmaps/r87s.bmp | Bin 0 -> 1106 bytes bitmaps/r87w.bmp | Bin 0 -> 1106 bytes bitmaps/r95o.bmp | Bin 0 -> 1202 bytes bitmaps/r95s.bmp | Bin 0 -> 1202 bytes bitmaps/r95w.bmp | Bin 0 -> 1202 bytes bitmaps/tim.bmp | Bin 0 -> 7478 bytes bitmaps/w49o.bmp | Bin 454 -> 454 bytes bitmaps/w49s.bmp | Bin 454 -> 454 bytes bitmaps/w54o.bmp | Bin 0 -> 454 bytes bitmaps/w54s.bmp | Bin 0 -> 454 bytes bitmaps/w54w.bmp | Bin 0 -> 454 bytes bitmaps/w72s.bmp | Bin 926 -> 926 bytes bitmaps/wl49o.bmp | Bin 0 -> 454 bytes bitmaps/wl49s.bmp | Bin 0 -> 454 bytes bitmaps/wl72o.bmp | Bin 0 -> 926 bytes bitmaps/wl72s.bmp | Bin 0 -> 926 bytes bitmaps/wn49o.bmp | Bin 0 -> 454 bytes bitmaps/wn49s.bmp | Bin 0 -> 454 bytes bitmaps/wn72o.bmp | Bin 0 -> 926 bytes bitmaps/wn72s.bmp | Bin 0 -> 926 bytes bitmaps/wp49o.bmp | Bin 0 -> 454 bytes bitmaps/wp49s.bmp | Bin 0 -> 454 bytes bitmaps/wp72o.bmp | Bin 0 -> 926 bytes bitmaps/wp72s.bmp | Bin 0 -> 926 bytes bitmaps/ws49o.bmp | Bin 0 -> 454 bytes bitmaps/ws49s.bmp | Bin 0 -> 454 bytes bitmaps/ws72o.bmp | Bin 0 -> 926 bytes bitmaps/ws72s.bmp | Bin 0 -> 926 bytes common.h | 38 +- config.h | 2 +- moves.c | 261 ++- moves.h | 1 + parser.l | 5149 ++++++++++----------------------------------- readme_HGM.txt | 94 + winboard/resource.h | 19 + winboard/winboard.c | 387 +++-- winboard/winboard.rc | 62 + winboard/woptions.c | 24 +- 415 files changed, 2026 insertions(+), 4542 deletions(-) create mode 100644 bitmaps/260px-Hanzi.svg create mode 100644 bitmaps/65px-Zhongwen.svg create mode 100644 bitmaps/ANALYZE2_14.ICO create mode 100644 bitmaps/ANALYZE_14.ICO create mode 100644 bitmaps/BALOON_14.ICO create mode 100644 bitmaps/BLACK_14.ICO create mode 100644 bitmaps/CLOCK_14.ICO create mode 100644 bitmaps/PONDER_14.ICO create mode 100644 bitmaps/TRANS_14.ICO create mode 100644 bitmaps/UNKNOWN_14.ICO create mode 100644 bitmaps/WHITE_14.ICO create mode 100644 bitmaps/a49c.bmp create mode 100644 bitmaps/b108o.bmp create mode 100644 bitmaps/b108s.bmp create mode 100644 bitmaps/b108w.bmp create mode 100644 bitmaps/b116o.bmp create mode 100644 bitmaps/b116s.bmp create mode 100644 bitmaps/b116w.bmp create mode 100644 bitmaps/b129o.bmp create mode 100644 bitmaps/b129s.bmp create mode 100644 bitmaps/b129w.bmp create mode 100644 bitmaps/b21o.bmp create mode 100644 bitmaps/b21s.bmp create mode 100644 bitmaps/b21w.bmp create mode 100644 bitmaps/b25o.bmp create mode 100644 bitmaps/b25s.bmp create mode 100644 bitmaps/b25w.bmp create mode 100644 bitmaps/b29o.bmp create mode 100644 bitmaps/b29s.bmp create mode 100644 bitmaps/b29w.bmp create mode 100644 bitmaps/b33o.bmp create mode 100644 bitmaps/b33s.bmp create mode 100644 bitmaps/b33w.bmp create mode 100644 bitmaps/b37o.bmp create mode 100644 bitmaps/b37s.bmp create mode 100644 bitmaps/b37w.bmp create mode 100644 bitmaps/b40o.bmp create mode 100644 bitmaps/b40s.bmp create mode 100644 bitmaps/b40w.bmp create mode 100644 bitmaps/b45o.bmp create mode 100644 bitmaps/b45s.bmp create mode 100644 bitmaps/b45w.bmp create mode 100644 bitmaps/b49o.bmp create mode 100644 bitmaps/b49s.bmp create mode 100644 bitmaps/b49w.bmp create mode 100644 bitmaps/b54o.bmp create mode 100644 bitmaps/b54s.bmp create mode 100644 bitmaps/b54w.bmp create mode 100644 bitmaps/b58o.bmp create mode 100644 bitmaps/b58s.bmp create mode 100644 bitmaps/b58w.bmp create mode 100644 bitmaps/b64o.bmp create mode 100644 bitmaps/b64s.bmp create mode 100644 bitmaps/b64w.bmp create mode 100644 bitmaps/b72o.bmp create mode 100644 bitmaps/b72s.bmp create mode 100644 bitmaps/b72w.bmp create mode 100644 bitmaps/b80o.bmp create mode 100644 bitmaps/b80s.bmp create mode 100644 bitmaps/b80w.bmp create mode 100644 bitmaps/b87o.bmp create mode 100644 bitmaps/b87s.bmp create mode 100644 bitmaps/b87w.bmp create mode 100644 bitmaps/b95o.bmp create mode 100644 bitmaps/b95s.bmp create mode 100644 bitmaps/b95w.bmp create mode 100644 bitmaps/board.ico create mode 100644 bitmaps/dk49o.bmp create mode 100644 bitmaps/dk49s.bmp create mode 100644 bitmaps/dk49w.bmp create mode 100644 bitmaps/dk72o.bmp create mode 100644 bitmaps/dk72s.bmp create mode 100644 bitmaps/dk72w.bmp create mode 100644 bitmaps/e129o.bmp create mode 100644 bitmaps/g49o.bmp create mode 100644 bitmaps/g49s.bmp create mode 100644 bitmaps/g49w.bmp create mode 100644 bitmaps/g72o.bmp create mode 100644 bitmaps/g72s.bmp create mode 100644 bitmaps/g72w.bmp create mode 100644 bitmaps/galactic.bmp create mode 100644 bitmaps/h129o.bmp create mode 100644 bitmaps/icon_b.bmp create mode 100644 bitmaps/icon_b.ico create mode 100644 bitmaps/icon_o.ico create mode 100644 bitmaps/icon_ob.ico create mode 100644 bitmaps/icon_ow.ico create mode 100644 bitmaps/icon_w.bmp create mode 100644 bitmaps/icon_w.ico create mode 100644 bitmaps/icon_whi.ico create mode 100644 bitmaps/k108o.bmp create mode 100644 bitmaps/k108s.bmp create mode 100644 bitmaps/k108w.bmp create mode 100644 bitmaps/k116o.bmp create mode 100644 bitmaps/k116s.bmp create mode 100644 bitmaps/k116w.bmp create mode 100644 bitmaps/k129o.bmp create mode 100644 bitmaps/k129s.bmp create mode 100644 bitmaps/k129w.bmp create mode 100644 bitmaps/k21o.bmp create mode 100644 bitmaps/k21s.bmp create mode 100644 bitmaps/k21w.bmp create mode 100644 bitmaps/k25o.bmp create mode 100644 bitmaps/k25s.bmp create mode 100644 bitmaps/k25w.bmp create mode 100644 bitmaps/k29o.bmp create mode 100644 bitmaps/k29s.bmp create mode 100644 bitmaps/k29w.bmp create mode 100644 bitmaps/k33o.bmp create mode 100644 bitmaps/k33s.bmp create mode 100644 bitmaps/k33w.bmp create mode 100644 bitmaps/k37o.bmp create mode 100644 bitmaps/k37s.bmp create mode 100644 bitmaps/k37w.bmp create mode 100644 bitmaps/k40o.bmp create mode 100644 bitmaps/k40s.bmp create mode 100644 bitmaps/k40w.bmp create mode 100644 bitmaps/k45o.bmp create mode 100644 bitmaps/k45s.bmp create mode 100644 bitmaps/k45w.bmp create mode 100644 bitmaps/k49o.bmp create mode 100644 bitmaps/k49s.bmp create mode 100644 bitmaps/k49w.bmp create mode 100644 bitmaps/k54o.bmp create mode 100644 bitmaps/k54s.bmp create mode 100644 bitmaps/k54w.bmp create mode 100644 bitmaps/k58o.bmp create mode 100644 bitmaps/k58s.bmp create mode 100644 bitmaps/k58w.bmp create mode 100644 bitmaps/k64o.bmp create mode 100644 bitmaps/k64s.bmp create mode 100644 bitmaps/k64w.bmp create mode 100644 bitmaps/k72o.bmp create mode 100644 bitmaps/k72s.bmp create mode 100644 bitmaps/k72w.bmp create mode 100644 bitmaps/k80o.bmp create mode 100644 bitmaps/k80s.bmp create mode 100644 bitmaps/k80w.bmp create mode 100644 bitmaps/k87o.bmp create mode 100644 bitmaps/k87s.bmp create mode 100644 bitmaps/k87w.bmp create mode 100644 bitmaps/k95o.bmp create mode 100644 bitmaps/k95s.bmp create mode 100644 bitmaps/k95w.bmp create mode 100644 bitmaps/l49o.bmp create mode 100644 bitmaps/l49s.bmp create mode 100644 bitmaps/l49w.bmp create mode 100644 bitmaps/l72o.bmp create mode 100644 bitmaps/l72s.bmp create mode 100644 bitmaps/l72w.bmp create mode 100644 bitmaps/m129o.bmp create mode 100644 bitmaps/n108o.bmp create mode 100644 bitmaps/n108s.bmp create mode 100644 bitmaps/n108w.bmp create mode 100644 bitmaps/n116o.bmp create mode 100644 bitmaps/n116s.bmp create mode 100644 bitmaps/n116w.bmp create mode 100644 bitmaps/n129o.bmp create mode 100644 bitmaps/n129s.bmp create mode 100644 bitmaps/n129w.bmp create mode 100644 bitmaps/n21o.bmp create mode 100644 bitmaps/n21s.bmp create mode 100644 bitmaps/n21w.bmp create mode 100644 bitmaps/n25o.bmp create mode 100644 bitmaps/n25s.bmp create mode 100644 bitmaps/n25w.bmp create mode 100644 bitmaps/n29o.bmp create mode 100644 bitmaps/n29s.bmp create mode 100644 bitmaps/n29w.bmp create mode 100644 bitmaps/n33o.bmp create mode 100644 bitmaps/n33s.bmp create mode 100644 bitmaps/n33w.bmp create mode 100644 bitmaps/n37o.bmp create mode 100644 bitmaps/n37s.bmp create mode 100644 bitmaps/n37w.bmp create mode 100644 bitmaps/n40o.bmp create mode 100644 bitmaps/n40s.bmp create mode 100644 bitmaps/n40w.bmp create mode 100644 bitmaps/n45o.bmp create mode 100644 bitmaps/n45s.bmp create mode 100644 bitmaps/n45w.bmp create mode 100644 bitmaps/n49o.bmp create mode 100644 bitmaps/n49s.bmp create mode 100644 bitmaps/n49w.bmp create mode 100644 bitmaps/n54o.bmp create mode 100644 bitmaps/n54s.bmp create mode 100644 bitmaps/n54w.bmp create mode 100644 bitmaps/n58o.bmp create mode 100644 bitmaps/n58s.bmp create mode 100644 bitmaps/n58w.bmp create mode 100644 bitmaps/n64o.bmp create mode 100644 bitmaps/n64s.bmp create mode 100644 bitmaps/n64w.bmp create mode 100644 bitmaps/n72o.bmp create mode 100644 bitmaps/n72s.bmp create mode 100644 bitmaps/n72w.bmp create mode 100644 bitmaps/n80o.bmp create mode 100644 bitmaps/n80s.bmp create mode 100644 bitmaps/n80w.bmp create mode 100644 bitmaps/n87o.bmp create mode 100644 bitmaps/n87s.bmp create mode 100644 bitmaps/n87w.bmp create mode 100644 bitmaps/n95o.bmp create mode 100644 bitmaps/n95s.bmp create mode 100644 bitmaps/n95w.bmp create mode 100644 bitmaps/ni49o.bmp create mode 100644 bitmaps/ni49s.bmp create mode 100644 bitmaps/ni49w.bmp create mode 100644 bitmaps/ni72o.bmp create mode 100644 bitmaps/ni72s.bmp create mode 100644 bitmaps/ni72w.bmp create mode 100644 bitmaps/p108o.bmp create mode 100644 bitmaps/p108s.bmp create mode 100644 bitmaps/p108w.bmp create mode 100644 bitmaps/p116o.bmp create mode 100644 bitmaps/p116s.bmp create mode 100644 bitmaps/p116w.bmp create mode 100644 bitmaps/p129o.bmp create mode 100644 bitmaps/p129s.bmp create mode 100644 bitmaps/p129w.bmp create mode 100644 bitmaps/p21o.bmp create mode 100644 bitmaps/p21s.bmp create mode 100644 bitmaps/p21w.bmp create mode 100644 bitmaps/p25o.bmp create mode 100644 bitmaps/p25s.bmp create mode 100644 bitmaps/p25w.bmp create mode 100644 bitmaps/p29o.bmp create mode 100644 bitmaps/p29s.bmp create mode 100644 bitmaps/p29w.bmp create mode 100644 bitmaps/p33o.bmp create mode 100644 bitmaps/p33s.bmp create mode 100644 bitmaps/p33w.bmp create mode 100644 bitmaps/p37o.bmp create mode 100644 bitmaps/p37s.bmp create mode 100644 bitmaps/p37w.bmp create mode 100644 bitmaps/p40o.bmp create mode 100644 bitmaps/p40s.bmp create mode 100644 bitmaps/p40w.bmp create mode 100644 bitmaps/p45o.bmp create mode 100644 bitmaps/p45s.bmp create mode 100644 bitmaps/p45w.bmp create mode 100644 bitmaps/p49o.bmp create mode 100644 bitmaps/p49s.bmp create mode 100644 bitmaps/p49w.bmp create mode 100644 bitmaps/p54o.bmp create mode 100644 bitmaps/p54s.bmp create mode 100644 bitmaps/p54w.bmp create mode 100644 bitmaps/p58o.bmp create mode 100644 bitmaps/p58s.bmp create mode 100644 bitmaps/p58w.bmp create mode 100644 bitmaps/p64o.bmp create mode 100644 bitmaps/p64s.bmp create mode 100644 bitmaps/p64w.bmp create mode 100644 bitmaps/p72o.bmp create mode 100644 bitmaps/p72s.bmp create mode 100644 bitmaps/p72w.bmp create mode 100644 bitmaps/p80o.bmp create mode 100644 bitmaps/p80s.bmp create mode 100644 bitmaps/p80w.bmp create mode 100644 bitmaps/p87o.bmp create mode 100644 bitmaps/p87s.bmp create mode 100644 bitmaps/p87w.bmp create mode 100644 bitmaps/p95o.bmp create mode 100644 bitmaps/p95s.bmp create mode 100644 bitmaps/p95w.bmp create mode 100644 bitmaps/q108o.bmp create mode 100644 bitmaps/q108s.bmp create mode 100644 bitmaps/q108w.bmp create mode 100644 bitmaps/q116o.bmp create mode 100644 bitmaps/q116s.bmp create mode 100644 bitmaps/q116w.bmp create mode 100644 bitmaps/q129o.bmp create mode 100644 bitmaps/q129s.bmp create mode 100644 bitmaps/q129w.bmp create mode 100644 bitmaps/q21o.bmp create mode 100644 bitmaps/q21s.bmp create mode 100644 bitmaps/q21w.bmp create mode 100644 bitmaps/q25o.bmp create mode 100644 bitmaps/q25s.bmp create mode 100644 bitmaps/q25w.bmp create mode 100644 bitmaps/q29o.bmp create mode 100644 bitmaps/q29s.bmp create mode 100644 bitmaps/q29w.bmp create mode 100644 bitmaps/q33o.bmp create mode 100644 bitmaps/q33s.bmp create mode 100644 bitmaps/q33w.bmp create mode 100644 bitmaps/q37o.bmp create mode 100644 bitmaps/q37s.bmp create mode 100644 bitmaps/q37w.bmp create mode 100644 bitmaps/q40o.bmp create mode 100644 bitmaps/q40s.bmp create mode 100644 bitmaps/q40w.bmp create mode 100644 bitmaps/q45o.bmp create mode 100644 bitmaps/q45s.bmp create mode 100644 bitmaps/q45w.bmp create mode 100644 bitmaps/q49o.bmp create mode 100644 bitmaps/q49s.bmp create mode 100644 bitmaps/q49w.bmp create mode 100644 bitmaps/q54o.bmp create mode 100644 bitmaps/q54s.bmp create mode 100644 bitmaps/q54w.bmp create mode 100644 bitmaps/q58o.bmp create mode 100644 bitmaps/q58s.bmp create mode 100644 bitmaps/q58w.bmp create mode 100644 bitmaps/q64o.bmp create mode 100644 bitmaps/q64s.bmp create mode 100644 bitmaps/q64w.bmp create mode 100644 bitmaps/q72o.bmp create mode 100644 bitmaps/q72s.bmp create mode 100644 bitmaps/q72w.bmp create mode 100644 bitmaps/q80o.bmp create mode 100644 bitmaps/q80s.bmp create mode 100644 bitmaps/q80w.bmp create mode 100644 bitmaps/q87o.bmp create mode 100644 bitmaps/q87s.bmp create mode 100644 bitmaps/q87w.bmp create mode 100644 bitmaps/q95o.bmp create mode 100644 bitmaps/q95s.bmp create mode 100644 bitmaps/q95w.bmp create mode 100644 bitmaps/r108o.bmp create mode 100644 bitmaps/r108s.bmp create mode 100644 bitmaps/r108w.bmp create mode 100644 bitmaps/r116o.bmp create mode 100644 bitmaps/r116s.bmp create mode 100644 bitmaps/r116w.bmp create mode 100644 bitmaps/r129o.bmp create mode 100644 bitmaps/r129s.bmp create mode 100644 bitmaps/r129w.bmp create mode 100644 bitmaps/r21o.bmp create mode 100644 bitmaps/r21s.bmp create mode 100644 bitmaps/r21w.bmp create mode 100644 bitmaps/r25o.bmp create mode 100644 bitmaps/r25s.bmp create mode 100644 bitmaps/r25w.bmp create mode 100644 bitmaps/r29o.bmp create mode 100644 bitmaps/r29s.bmp create mode 100644 bitmaps/r29w.bmp create mode 100644 bitmaps/r33o.bmp create mode 100644 bitmaps/r33s.bmp create mode 100644 bitmaps/r33w.bmp create mode 100644 bitmaps/r37o.bmp create mode 100644 bitmaps/r37s.bmp create mode 100644 bitmaps/r37w.bmp create mode 100644 bitmaps/r40o.bmp create mode 100644 bitmaps/r40s.bmp create mode 100644 bitmaps/r40w.bmp create mode 100644 bitmaps/r45o.bmp create mode 100644 bitmaps/r45s.bmp create mode 100644 bitmaps/r45w.bmp create mode 100644 bitmaps/r49o.bmp create mode 100644 bitmaps/r49s.bmp create mode 100644 bitmaps/r49w.bmp create mode 100644 bitmaps/r54o.bmp create mode 100644 bitmaps/r54s.bmp create mode 100644 bitmaps/r54w.bmp create mode 100644 bitmaps/r58o.bmp create mode 100644 bitmaps/r58s.bmp create mode 100644 bitmaps/r58w.bmp create mode 100644 bitmaps/r64o.bmp create mode 100644 bitmaps/r64s.bmp create mode 100644 bitmaps/r64w.bmp create mode 100644 bitmaps/r72o.bmp create mode 100644 bitmaps/r72s.bmp create mode 100644 bitmaps/r72w.bmp create mode 100644 bitmaps/r80o.bmp create mode 100644 bitmaps/r80s.bmp create mode 100644 bitmaps/r80w.bmp create mode 100644 bitmaps/r87o.bmp create mode 100644 bitmaps/r87s.bmp create mode 100644 bitmaps/r87w.bmp create mode 100644 bitmaps/r95o.bmp create mode 100644 bitmaps/r95s.bmp create mode 100644 bitmaps/r95w.bmp create mode 100644 bitmaps/tim.bmp create mode 100644 bitmaps/w54o.bmp create mode 100644 bitmaps/w54s.bmp create mode 100644 bitmaps/w54w.bmp create mode 100644 bitmaps/wl49o.bmp create mode 100644 bitmaps/wl49s.bmp create mode 100644 bitmaps/wl72o.bmp create mode 100644 bitmaps/wl72s.bmp create mode 100644 bitmaps/wn49o.bmp create mode 100644 bitmaps/wn49s.bmp create mode 100644 bitmaps/wn72o.bmp create mode 100644 bitmaps/wn72s.bmp create mode 100644 bitmaps/wp49o.bmp create mode 100644 bitmaps/wp49s.bmp create mode 100644 bitmaps/wp72o.bmp create mode 100644 bitmaps/wp72s.bmp create mode 100644 bitmaps/ws49o.bmp create mode 100644 bitmaps/ws49s.bmp create mode 100644 bitmaps/ws72o.bmp create mode 100644 bitmaps/ws72s.bmp diff --git a/backend.c b/backend.c index f3cffc5..6c79b03 100644 --- a/backend.c +++ b/backend.c @@ -1702,13 +1702,13 @@ CopyHoldings(Board board, char *holdings, ChessSquare lowestPiece) char p; ChessSquare piece; - if(gameInfo.holdingsWidth < 1) return; + if(gameInfo.holdingsWidth < 2) return; if( (int)lowestPiece >= BlackPawn ) { holdingsColumn = 0; countsColumn = 1; holdingsStartRow = BOARD_HEIGHT-1; - direction = 1; + direction = -1; } else { holdingsColumn = BOARD_WIDTH-1; countsColumn = BOARD_WIDTH-2; @@ -1723,12 +1723,13 @@ CopyHoldings(Board board, char *holdings, ChessSquare lowestPiece) while( (p=*holdings++) != NULLCHAR ) { piece = CharToPiece( ToUpper(p) ); if(piece == EmptySquare) continue; - j = (int) piece - (int) WhitePawn; + /*j = (int) piece - (int) WhitePawn;*/ + j = PieceToNumber(piece); if(j >= gameInfo.holdingsSize) continue; /* ignore pieces that do not fit */ if(j < 0) continue; /* should not happen */ - piece = (ChessSquare) ( (int)piece + (int)lowestPiece ); - board[holdingsStartRow+i*direction][holdingsColumn] = piece; - board[holdingsStartRow+i*direction][countsColumn]++; + piece = (ChessSquare) ( j + (int)lowestPiece ); + board[holdingsStartRow+j*direction][holdingsColumn] = piece; + board[holdingsStartRow+j*direction][countsColumn]++; } } @@ -2336,6 +2337,7 @@ read_from_ics(isr, closure, data, count, error) sprintf(str, "ICS %s %s match", star_match[0], star_match[1]); gameInfo.event = StrSave(str); gameInfo.variant = StringToVariant(gameInfo.event); + Reset(TRUE,TRUE); /* [HGM] possibly change board or holdings size */ continue; } @@ -2804,7 +2806,27 @@ read_from_ics(isr, closure, data, count, error) if (sscanf(parse, " game %d", &gamenum) == 1 && gamenum == ics_gamenum) { if (gameInfo.variant == VariantNormal) { + /* [HGM] We seem to switch variant during a game! + * Presumably no holdings were displayed, so we have + * to move the position two files to the right to + * create room for them! + */ + int i, j; + if(gameInfo.holdingsWidth == 0) /* to be sure */ + for(i=0; i=0; j--) + boards[currentMove][i][j+2] = boards[currentMove][i][j]; + + if (appData.debugMode) { + fprintf(debugFP, "Switch board to Crazy\n"); + setbuf(debugFP, NULL); + } gameInfo.variant = VariantCrazyhouse; /*temp guess*/ + gameInfo.boardWidth = 8; /* [HGM] guess board size as well */ + gameInfo.boardHeight = 8; + gameInfo.holdingsSize = 5; + gameInfo.holdingsWidth = 2; + InitDrawingSizes(-2, 0); /* Get a move list just to see the header, which will tell us whether this is really bug or zh */ if (ics_getting_history == H_FALSE) { @@ -2819,6 +2841,9 @@ read_from_ics(isr, closure, data, count, error) new_piece); white_holding[strlen(white_holding)-1] = NULLCHAR; black_holding[strlen(black_holding)-1] = NULLCHAR; + /* [HGM] copy holdings to board holdings area */ + CopyHoldings(boards[currentMove], white_holding, WhitePawn); + CopyHoldings(boards[currentMove], black_holding, BlackPawn); #if ZIPPY if (appData.zippyPlay && first.initDone) { ZippyHoldings(white_holding, black_holding, @@ -2837,9 +2862,6 @@ read_from_ics(isr, closure, data, count, error) gameInfo.black, black_holding); } - /* [HGM] copy holdings to board holdings area */ - CopyHoldings(boards[currentMove], white_holding, WhitePawn); - CopyHoldings(boards[currentMove], black_holding, BlackPawn); DrawPosition(FALSE, NULL); DisplayTitle(str); } @@ -3057,20 +3079,26 @@ ParseBoard12(string) movesPerSession = 0; gameInfo.timeControl = TimeControlTagValue(); gameInfo.variant = StringToVariant(gameInfo.event); + if (appData.debugMode) { + fprintf(debugFP, "ParseBoard says variant = '%s'\n", gameInfo.event); + fprintf(debugFP, "recognized as %s\n", VariantName(gameInfo.variant)); + setbuf(debugFP, NULL); + } + gameInfo.holdingsSize = 5; /* [HGM] prepare holdings */ + gameInfo.boardWidth = gameInfo.boardHeight = 8; switch(gameInfo.variant) { case VariantShogi: case VariantShowgi: - gameInfo.boardWidth = gameInfo.boardHeight = 9; - gameInfo.holdingsSize += 2; + gameInfo.boardWidth = 9; gameInfo.boardHeight = 9; + gameInfo.holdingsSize = 7; case VariantBughouse: case VariantCrazyhouse: - gameInfo.boardWidth = gameInfo.boardHeight = 8; gameInfo.holdingsWidth = 2; break; default: - gameInfo.boardWidth = gameInfo.boardHeight = 8; - gameInfo.holdingsWidth = 0; + gameInfo.holdingsWidth = gameInfo.holdingsSize = 0; } + InitDrawingSizes(-2, 0); gameInfo.outOfBook = NULL; /* Do we have the ratings? */ @@ -3132,9 +3160,14 @@ ParseBoard12(string) } /* Parse the board */ - for (k = 0; k < 8; k++) + for (k = 0; k < 8; k++) { for (j = 0; j < 8; j++) - board[k][j] = CharToPiece(board_chars[(7-k)*9 + j]); + board[k][j+gameInfo.holdingsWidth] = CharToPiece(board_chars[(7-k)*9 + j]); + if(gameInfo.holdingsWidth > 1) { + board[k][0] = board[k][BOARD_WIDTH-1] = EmptySquare; + board[k][1] = board[k][BOARD_WIDTH-2] = (ChessSquare) 0;; + } + } CopyBoard(boards[moveNum], board); if (moveNum == 0) { startedFromSetupPosition = @@ -3202,6 +3235,11 @@ ParseBoard12(string) /* Put the move on the move list, first converting to canonical algebraic form. */ if (moveNum > 0) { + if (appData.debugMode) { + fprintf(debugFP, "accepted move %s from ICS, parse it.\n", move_str); + fprintf(debugFP, "board = %d-d x%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT); + setbuf(debugFP, NULL); + } if (moveNum <= backwardMostMove) { /* We don't know what the board looked like before this move. Punt. */ @@ -3222,7 +3260,8 @@ ParseBoard12(string) default: break; case MT_CHECK: - strcat(parseList[moveNum - 1], "+"); + if(gameInfo.variant != VariantShogi) + strcat(parseList[moveNum - 1], "+"); break; case MT_CHECKMATE: strcat(parseList[moveNum - 1], "#"); @@ -3255,6 +3294,10 @@ ParseBoard12(string) moveList[moveNum - 1][0] = NULLCHAR; fromX = fromY = toX = toY = -1; } + if (appData.debugMode) { + fprintf(debugFP, "Move parsed to '%s'\n", parseList[moveNum - 1]); + setbuf(debugFP, NULL); + } #if ZIPPY /* Send move to chess program (BEFORE animating it). */ @@ -3407,7 +3450,7 @@ SendMoveToProgram(moveNum, cps) sprintf(buf, "%s\n", parseList[moveNum]); } /* [HGM] decrement all digits to code ranks starting from 0 */ - if(BOARD_HEIGHT>8) { + if(BOARD_HEIGHT>9) { char *p = buf; while(*p) { if(*p < 'A') (*p)--; p++; } } @@ -3737,6 +3780,30 @@ static void SetupFRC( Board board, int pos_index ) } } +BOOL SetCharTable( char *table, const char * map ) +/* [HGM] moved here from winboard.c because of its general usefulness */ +/* Basically a safe strcpy that uses the last character as King */ +{ + BOOL result = FALSE; int NrPieces; + + if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare + && NrPieces >= 12 && !(NrPieces&1)) { + int i; /* [HGM] Accept even length from 12 to 34 */ + + for( i=0; i<(int) EmptySquare; i++ ) table[i] = '.'; + for( i=0; i>1; - castlingRights[0][3] = initialRights[3] = BOARD_RGHT-1; - castlingRights[0][4] = initialRights[4] = BOARD_LEFT; - castlingRights[0][5] = initialRights[5] = BOARD_WIDTH>>1; - - castlingRank[0] = castlingRank[1] = castlingRank[2] = 0; - castlingRank[3] = castlingRank[4] = castlingRank[5] = BOARD_HEIGHT-1; - initialRulePlies = 0; /* 50-move counter start */ } @@ -3785,6 +3840,9 @@ InitPosition(redraw) gameInfo.boardWidth = 8; gameInfo.boardHeight = 8; gameInfo.holdingsSize = 0; + nrCastlingRights = -1; /* [HGM] Kludge to indicate default should be used */ + for(i=0; i= 0) { - if(gameInfo.boardHeight != appData.NrRanks) overrule++; gameInfo.boardHeight = appData.NrRanks; } if(appData.holdingsSize >= 0) { @@ -3889,11 +3945,12 @@ InitPosition(redraw) if(BOARD_HEIGHT > BOARD_SIZE || BOARD_WIDTH > BOARD_SIZE) DisplayFatalError("Recompile to support this BOARD_SIZE!", 0, 2); - pawnRow = gameInfo.boardHeight - 7; /* seems to work in all variants */ + pawnRow = gameInfo.boardHeight - 7; /* seems to work in all common variants */ + if(pawnRow < 1) pawnRow = 1; /* User pieceToChar list overrules defaults */ if(appData.pieceToCharTable != NULL) - strcpy(pieceToChar, appData.pieceToCharTable); + SetCharTable(pieceToChar, appData.pieceToCharTable); for( j=0; j>1; + castlingRights[0][3] = initialRights[3] = BOARD_RGHT-1; + castlingRights[0][4] = initialRights[4] = BOARD_LEFT; + castlingRights[0][5] = initialRights[5] = BOARD_WIDTH>>1; + + castlingRank[0] = castlingRank[1] = castlingRank[2] = 0; + castlingRank[3] = castlingRank[4] = castlingRank[5] = BOARD_HEIGHT-1; + } + if(gameInfo.variant == VariantFischeRandom) { if( appData.defaultFrcPosition < 0 ) { ShuffleFRC( initialPosition ); @@ -3942,8 +4016,13 @@ InitPosition(redraw) if(oldx != gameInfo.boardWidth || oldy != gameInfo.boardHeight || - oldh != gameInfo.holdingsWidth ) - InitDrawingSizes(-1 ,0); + oldh != gameInfo.holdingsWidth +#ifdef GOTHIC + || oldv == VariantGothic || + gameInfo.variant == VariantGothic +#endif + ) + InitDrawingSizes(-2 ,0); if (redraw) DrawPosition(TRUE, boards[currentMove]); @@ -4014,7 +4093,10 @@ IsPromotion(fromX, fromY, toX, toY) piece = boards[currentMove][fromY][fromX]; if(gameInfo.variant == VariantShogi) { promotionZoneSize = 3; - highestPromotingPiece = (int)WhiteFerz; /* Silver */ + highestPromotingPiece = (int)WhiteKing; + /* [HGM] Should be Silver = Ferz, really, but legality testing is off, + and if in normal chess we then allow promotion to King, why not + allow promotion of other piece in Shogi? */ } if((int)piece >= BlackPawn) { if(toY >= promotionZoneSize && fromY >= promotionZoneSize) @@ -4165,14 +4247,13 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar) int promoChar; { ChessMove moveType; + ChessSquare pdown, pup; if (fromX < 0 || fromY < 0) return ImpossibleMove; if ((fromX == toX) && (fromY == toY)) { return ImpossibleMove; } - /* [HGM] suppress all moves into holdings area and guard band */ - if( toX < BOARD_LEFT || toX >= BOARD_RGHT ) return ImpossibleMove; - + /* Check if the user is playing in turn. This is complicated because we let the user "pick up" a piece before it is his turn. So the piece he tried to pick up may have been captured by the time he puts it down! @@ -4278,6 +4359,8 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar) break; case EditPosition: + /* EditPosition, empty square, or different color piece; + click-click move is possible */ if (toX == -2 || toY == -2) { boards[0][fromY][fromX] = EmptySquare; DrawPosition(FALSE, boards[currentMove]); @@ -4289,26 +4372,49 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar) return ImpossibleMove; } - if (toX < 0 || toY < 0) return ImpossibleMove; + /* [HGM] suppress all moves into holdings area and guard band */ + if( toX < BOARD_LEFT || toX >= BOARD_RGHT || toY < 0 ) + return ImpossibleMove; + + /* [HGM] moved to here from winboard.c */ + /* note: EditPosition already filtered out and performed! */ + pdown = boards[currentMove][fromY][fromX]; + pup = boards[currentMove][toY][toX]; + if ( + (WhitePawn <= pdown && pdown < BlackPawn && + WhitePawn <= pup && pup < BlackPawn) || + (BlackPawn <= pdown && pdown < EmptySquare && + BlackPawn <= pup && pup < EmptySquare) ) + return ImpossibleMove; /* [HGM] If move started in holdings, it means a drop */ - if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) { - if( boards[currentMove][toY][toX] != EmptySquare ) return ImpossibleMove; + if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) { + if( pup != EmptySquare ) return ImpossibleMove; + if(appData.testLegality) { + /* it would be more logical if LegalityTest() also figured out + * which drops are legal. For now we forbid pawns on back rank. + * Shogi is on its own here... + */ + if( (pdown == WhitePawn || pdown == BlackPawn) && + (toY == 0 || toY == BOARD_HEIGHT -1 ) ) + return(ImpossibleMove); /* no pawn drops on 1st/8th */ + } return WhiteDrop; /* Not needed to specify white or black yet */ } userOfferedDraw = FALSE; - if (appData.testLegality) { - moveType = LegalityTest(boards[currentMove], PosFlags(currentMove), - EP_UNKNOWN, castlingRights[currentMove], + /* [HGM] always test for legality, to get promotion info */ + moveType = LegalityTest(boards[currentMove], PosFlags(currentMove), + epStatus[currentMove], castlingRights[currentMove], fromY, fromX, toY, toX, promoChar); + + /* [HGM] but possibly ignore an IllegalMove result */ + if (appData.testLegality) { if (moveType == IllegalMove || moveType == ImpossibleMove) { DisplayMoveError("Illegal move"); return ImpossibleMove; } - } else { - moveType = PromoCharToMoveType(WhiteOnMove(currentMove), promoChar); } return moveType; @@ -4643,23 +4749,40 @@ HandleMachineMove(message, cps) /* to make sure an illegal e.p. capture does not slip through, */ /* to cause a forfeit on a justified illegal-move complaint */ /* of the opponent. */ - if(gameMode==TwoMachinesPlay && appData.testLegality && - fromY != DROP_RANK && /* [HGM] temporary; should still add legality test for drops */ - LegalityTest(boards[forwardMostMove], PosFlags(forwardMostMove), + if( gameMode==TwoMachinesPlay && appData.testLegality + && fromY != DROP_RANK /* [HGM] temporary; should still add legality test for drops */ + ) { + ChessMove moveType; + moveType = LegalityTest(boards[forwardMostMove], PosFlags(forwardMostMove), epStatus[forwardMostMove], castlingRights[forwardMostMove], - fromY, fromX, toY, toX, promoChar) == IllegalMove) - { + fromY, fromX, toY, toX, promoChar); if (appData.debugMode) { int i; for(i=0; i< nrCastlingRights; i++) fprintf(debugFP, "(%d,%d) ", castlingRights[forwardMostMove][i], castlingRank[i]); fprintf(debugFP, "castling rights\n"); } - sprintf(buf1, "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c", - machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0); - GameEnds(machineWhite ? BlackWins : WhiteWins, - buf1, GE_XBOARD); + if(moveType == IllegalMove) { + sprintf(buf1, "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c", + machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0); + GameEnds(machineWhite ? BlackWins : WhiteWins, + buf1, GE_XBOARD); + } else if(gameInfo.variant != VariantFischeRandom) + /* [HGM] Kludge to handle engines that send FRC-style castling + when they shouldn't (like TSCP-Gothic) */ + switch(moveType) { + case WhiteASideCastleFR: + case BlackASideCastleFR: + toY++; + currentMoveString[2]++; + break; + case WhiteHSideCastleFR: + case BlackHSideCastleFR: + toY--; + currentMoveString[2]--; + break; } + } hintRequested = FALSE; lastHint[0] = NULLCHAR; bookRequested = FALSE; @@ -4946,6 +5069,31 @@ HandleMachineMove(message, cps) cps->useSigterm = FALSE; } + /* [HGM] Allow engine to set up a position. Don't ask me why one would + * want this, I was asked to put it in, and obliged. + */ + if (!strncmp(message, "setboard ", 9)) { + Board initial_position; int i; + + GameEnds(GameIsDrawn, "Engine aborts game", GE_XBOARD); + + if (!ParseFEN(initial_position, &blackPlaysFirst, message + 9)) { + DisplayError("Bad FEN received from engine", 0); + return ; + } else { + Reset(FALSE, FALSE); + CopyBoard(boards[0], initial_position); + initialRulePlies = FENrulePlies; + epStatus[0] = FENepStatus; + for( i=0; i= gameInfo.holdingsSize) { p = 0; captured = BlackPawn; } board[p][BOARD_WIDTH-2]++; board[p][BOARD_WIDTH-1] = @@ -5972,6 +6125,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) captured = (ChessSquare) (DEMOTED captured); p = DEMOTED p; } + p = PieceToNumber((ChessSquare)p); if(p >= gameInfo.holdingsSize) { p = 0; captured = WhitePawn; } board[BOARD_HEIGHT-1-p][1]++; board[BOARD_HEIGHT-1-p][0] = @@ -5993,7 +6147,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[toY][toX] = EmptySquare; } } - if(gameInfo.variant == VariantShogi && promoChar != NULLCHAR) { + if(gameInfo.variant == VariantShogi && promoChar != NULLCHAR && promoChar != '=') { /* [HGM] Shogi promotions */ board[toY][toX] = (ChessSquare) (PROMOTED piece); } @@ -6073,12 +6227,17 @@ MakeMove(fromX, fromY, toX, toY, promoChar) default: break; case MT_CHECK: - strcat(parseList[forwardMostMove - 1], "+"); + if(gameInfo.variant != VariantShogi) + strcat(parseList[forwardMostMove - 1], "+"); break; case MT_CHECKMATE: strcat(parseList[forwardMostMove - 1], "#"); break; } + if (appData.debugMode) { + fprintf(debugFP, "move: %s, parse: %s (%c)\n", moveList[forwardMostMove-1], parseList[forwardMostMove-1], moveList[forwardMostMove-1][4]); + } + } /* Updates currentMove if not pausing */ @@ -6124,7 +6283,8 @@ InitChessProgram(cps) || gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 ) { char *v = VariantName(gameInfo.variant); - if (StrStr(cps->variants, v) == NULL) { + if (cps->protocolVersion != 1 && StrStr(cps->variants, v) == NULL) { + /* [HGM] in protocol 1 we have to assume all variants valid */ sprintf(buf, "Variant %s not supported by %s", v, cps->tidy); DisplayFatalError(buf, 0, 1); return; @@ -6144,15 +6304,13 @@ InitChessProgram(cps) overruled = gameInfo.boardWidth != 12 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0; if(overruled) { -#if 0 - // doesn't work in protocol 1 - if (StrStr(cps->variants, "boardsize") == NULL,) { + if (cps->protocolVersion != 1 && StrStr(cps->variants, "boardsize") == NULL) { sprintf(buf, "Board size %dx%d+%d not supported by %s", gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, cps->tidy); DisplayFatalError(buf, 0, 1); return; } -#endif + /* [HGM] here we really should compare with the maximum supported board size */ sprintf(buf, "%dx%d+%d_", gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize ); while(*b++ != '_'); @@ -6802,12 +6960,10 @@ LoadGameOneMove(readAhead) case WhiteCapturesEnPassant: case BlackCapturesEnPassant: -#ifdef FAIRY case WhitePromotionChancellor: case BlackPromotionChancellor: case WhitePromotionArchbishop: case BlackPromotionArchbishop: -#endif case WhitePromotionQueen: case BlackPromotionQueen: case WhitePromotionRook: @@ -9336,6 +9492,7 @@ EditPositionMenuEvent(selection, x, y) int x, y; { char buf[MSG_SIZ]; + ChessSquare piece = boards[0][y][x]; if (gameMode != EditPosition && gameMode != IcsExamining) return; @@ -9385,7 +9542,40 @@ EditPositionMenuEvent(selection, x, y) } break; + case PromotePiece: + if(piece >= (int)WhitePawn && piece < (int)WhiteWazir || + piece >= (int)BlackPawn && piece < (int)BlackWazir ) { + selection = (ChessSquare) (PROMOTED piece); + } else if(piece == EmptySquare) selection = WhiteWazir; + else selection = (ChessSquare)((int)piece - 1); + goto defaultlabel; + + case DemotePiece: + if(piece >= (int)WhiteUnicorn && piece < (int)WhiteKing || + piece >= (int)BlackUnicorn && piece < (int)BlackKing ) { + selection = (ChessSquare) (DEMOTED piece); + } else if( piece == WhiteKing || piece == BlackKing ) + selection = (ChessSquare)((int)piece - (int)WhiteKing + (int)WhiteMan); + else if(piece == EmptySquare) selection = BlackWazir; + else selection = (ChessSquare)((int)piece + 1); + goto defaultlabel; + + case WhiteQueen: + case BlackQueen: + if(gameInfo.variant == VariantShatranj || + gameInfo.variant == VariantXiangqi || + gameInfo.variant == VariantCourier ) + selection = (ChessSquare)((int)selection - (int)WhiteQueen + (int)WhiteFerz); + goto defaultlabel; + + case WhiteKing: + case BlackKing: + if(gameInfo.variant == VariantXiangqi) + selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteWazir); + if(gameInfo.variant == VariantKnightmate) + selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteUnicorn); default: + defaultlabel: if (gameMode == IcsExamining) { sprintf(buf, "%s%c@%c%c\n", ics_prefix, PieceToChar(selection), AAA + x, ONE + y); @@ -11116,6 +11306,15 @@ NextTickLength(timeRemaining) return nextTickLength; } +/* Adjust clock one minute up or down */ +void +AdjustClock(Boolean which, int dir) +{ + if(which) blackTimeRemaining += 60000*dir; + else whiteTimeRemaining += 60000*dir; + DisplayBothClocks(); +} + /* Stop clocks and reset to a fresh time control */ void ResetClocks() @@ -11468,19 +11667,27 @@ PositionToFEN(move, useFEN960) for (j = BOARD_LEFT; j < BOARD_RGHT; j++) { if (boards[move][i][j] == EmptySquare) { emptycount++; - } else { + } else { ChessSquare piece = boards[move][i][j]; if (emptycount > 0) { if(emptycount<10) /* [HGM] can be >= 10 */ *p++ = '0' + emptycount; else { *p++ = '0' + emptycount/10; *p++ = '0' + emptycount%10; } emptycount = 0; } - *p++ = PieceToChar(boards[move][i][j]); - if(gameInfo.variant == VariantCrazyhouse) { + if(gameInfo.variant == VariantShogi) { + /* [HGM] write Shogi promoted pieces as + */ + if( (int)piece > (int) WhiteCannon && (int)piece < (int) WhiteKing || + (int)piece > (int) BlackCannon && (int)piece < (int) BlackKing ) { + *p++ = '+'; + piece = (ChessSquare)(DEMOTED piece); + } + } + *p++ = PieceToChar(piece); + if(gameInfo.variant == VariantCrazyhouse || gameInfo.variant == VariantBughouse) { /* [HGM] flag Crazyhouse promoted pieces */ - if( (int)boards[move][i][j] > (int) WhiteQueen && (int)boards[move][i][j] < (int) WhiteKing || - (int)boards[move][i][j] > (int) BlackQueen && (int)boards[move][i][j] < (int) BlackKing ) { - p[-1] = PieceToChar((ChessSquare)((int)boards[move][i][j]-(int)WhiteAlfil+(int)WhitePawn)); + if( (int)piece > (int) WhiteQueen && (int)piece < (int) WhiteKing || + (int)piece > (int) BlackQueen && (int)piece < (int) BlackKing ) { + p[-1] = PieceToChar((ChessSquare)(DEMOTED piece)); *p++ = '~'; } } @@ -11698,11 +11905,12 @@ ParseFEN(board, blackPlaysFirst, fen) if (j + emptycount > gameInfo.boardWidth) return FALSE; while (emptycount--) board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare; - } else if (isalpha(*p)) { + } else if (*p == '+' || isalpha(*p)) { if (j >= gameInfo.boardWidth) return FALSE; - piece = CharToPiece(*p++); + if(*p=='+') { piece = (ChessSquare) (PROMOTED CharToPiece(*++p) ); p++; } + else piece = CharToPiece(*p++); if(*p == '~') { /* [HGM] make it a promoted piece for Crazyhouse */ - piece = (ChessSquare) ((int)piece + (int)WhiteAlfil - (int)WhitePawn); + piece = (ChessSquare) (PROMOTED piece); p++; } board[i][(j++)+gameInfo.holdingsWidth] = piece; diff --git a/backend.h b/backend.h index 0057b9d..8ef5bf3 100644 --- a/backend.h +++ b/backend.h @@ -131,6 +131,7 @@ void UserMoveEvent P((int fromX, int fromY, int toX, int toY, int promoChar)); void DecrementClocks P((void)); char *TimeString P((long millisec)); void AutoPlayGameLoop P((void)); +void AdjustClock P((Boolean which, int dir)); void DisplayBothClocks P((void)); void EditPositionMenuEvent P((ChessSquare selection, int x, int y)); void DropMenuEvent P((ChessSquare selection, int x, int y)); diff --git a/bitmaps/260px-Hanzi.svg b/bitmaps/260px-Hanzi.svg new file mode 100644 index 0000000000000000000000000000000000000000..ab2e9ca5797e475210feac403bb35a04dea611eb GIT binary patch literal 12655 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 literal 0 HcmV?d00001 diff --git a/bitmaps/65px-Zhongwen.svg b/bitmaps/65px-Zhongwen.svg new file mode 100644 index 0000000000000000000000000000000000000000..a1e4ad003439b2e0baeb9ffd1ab0bb4278f1935e GIT binary patch literal 1759 zcmV<51|a!~P)S z>)D-Md)8^7Rip$|mzIjJNCAW(DYOz%DWLLD5Ne)^TGXiY0g1Lxd_EMSzC?;pc}N)B5y&X*g<_Rjoy@FvC0+IYuy1N@|Y*tzHa&$(yk-h1v{ zSR^;~^{p)w)~#Et{r?iqVhyKzoI5n#d&c+NmwnH>WhH}pudyy{lfLJ^4fGhiRID~W zyHY_dL^_>b^S+exT04%vOWIqiH4g%ctGVbm0cZi^0FmsixDJ=f*x1+v()WO@U0Dfg%R#Bud^QTX9e5K!up^=AhvMpWnFN~zaKweU4wsA3 zM&p?EtiA=~31EiE*2mRKc4_}MfXvRvb-0`qi^a>pqxpP#Zz@bq$JOaJ2>_Ty^DRP7 z!E<+5ONUN1n~k_ZbxRP8{qtRqtdPn0N-z{!I2r_FBMbG9m4ryn+I-&K>l`8e$#?g<%2G1J|2|o>d2G}N)Mv#z$pY7jYsx@~q&kkY$ezyNE z8JiPu$Vi@$(^{vHtjuyk1BMM?@{oNTSo6|rF+(;0(empBje+97D?Z8Cx9D(gk;0ZG2nDMy=F~sVp9}piy0r0Y%8HYc(uwA0!{(P z1;;SGiF7iwo?@j^sm%^*ev$yiYU3H-bMFPV1HXzw9#5>E3W~*ZbGAa?bDsxp1f3|? z8^=57IY18pW(P`@`nTc?x{ynMIKtV9*ks0L#84E;03;?rM}Ze5{$>teHF2Tkq`naZ z!FU{hSJwoY?K5dRMr*XuIM&hHYzhgQ-oYm=xj*K&{VfJ{LEjcT@1(NBms>3!P4`8*+Ug0M-FW&Vjf- z=F|y_bi|CWj|J`kG)`V)EA?Q8WS{VJ{aM2X5S}1+x~4&3J=RI40gAi*1lD%)}J038JSv20NpT@&)gP8 zdKT1xdnGMi=`y#j1BcrJ8OHzVx_zLFw59QOja zt0WkjiQ{BB7|iy6%^bZ7+>Erp<)rQjf?%>#YuM$2x7f% zOTY#^_s+qr`>M?j^t{2nrCM`m5CoHLo3K==-v{<{ASL4o-*aCtc>P~uk+FgvC&*G#)qcATZgX*#mpP;3eO4%YHud`R=BJr~)LX z=rk|?t0>kQKN-qq56YrDBH@~GQDzsA&MC6zCId6vYR4E0wMQx>8?FFQbO#VkdwVOUo?c6=lFKpav lUDK6*!0m&(hSl0{Twc-86%@GLP`px<1RE5NMQT!IgX9mJ$wf;5Pl6RX~MW-;k?C?_Kl-XMuDlDLu0N4z@P;GO{_qZ4n;}!>nX% dW(3Cv+cB7RCSrI`pXoiHz*X9%uIc?xy#P{EKIZ@c literal 0 HcmV?d00001 diff --git a/bitmaps/BALOON_14.ICO b/bitmaps/BALOON_14.ICO new file mode 100644 index 0000000000000000000000000000000000000000..dfe056f5badd502171e0f57bcbafa5b3a7cfff33 GIT binary patch literal 294 zcmb78xeb6Y47^AwQ9?z<01QcyaTp^VbFe`MKr(kBiYU@x`ySbrY``%?n4y>*uuwN5 z5G&!}$-q&0L_M}d*-}>izqw) OoA|Qt4-Adw+Is+O161w+ literal 0 HcmV?d00001 diff --git a/bitmaps/BLACK_14.ICO b/bitmaps/BLACK_14.ICO new file mode 100644 index 0000000000000000000000000000000000000000..9661f7c67d9da6ece9eb9bca0ec61a12c483a1d9 GIT binary patch literal 294 zcmZ{f$qmCG6hsG!qXjX>@x^Z3PTyu|mJ@W<+fiN)u literal 0 HcmV?d00001 diff --git a/bitmaps/CLOCK_14.ICO b/bitmaps/CLOCK_14.ICO new file mode 100644 index 0000000000000000000000000000000000000000..0785d5c745a42a4250e8ddc393d7bf1876acb208 GIT binary patch literal 294 zcmZvX%MHRX5Jbl!N95$hi2^7BiN-j%oRr~GC?OJ8q~*=VIf3n&S(2Z5Ts!a3M8Uw}Iqy2xe*s#$NW%aC literal 0 HcmV?d00001 diff --git a/bitmaps/PONDER_14.ICO b/bitmaps/PONDER_14.ICO new file mode 100644 index 0000000000000000000000000000000000000000..484deaa49d303ff6d2ddee221324347b040478d1 GIT binary patch literal 294 zcmZvX%L&6U5JX4dqmg~eDFwI-HJQ3WGSp0T_ba$T)0420>y0Bq%88!X0#o8r$#A@&|%4#u`T*ppkbX zidFal8%(X_J^SY(1uo3*Xf(ADk%)m@#6kiopBlx{W3gEizS zK)Qk~@bum4IoRyEW}Tk87oMhbV}!{JO=@d)B^~!mYirhgMe4*L>2&DV%wWZL(s2!i zzh#jfE#&@s^)&QOo{0Xg2Sn%)4jpA|ey|~fkSt`r!zW<)7ea0SNH8G8=n8|eSROb- zM*R#yWyu+L(^Ip)>X2TGL1(4yi^4&}MHWI-(>EBQsl6q#45Qn@2E;)m#{A49-C7B) g?Tcfcn167bQOapzIWU}=`edC>QDA0?OuD~iPp}M7OaK4? literal 0 HcmV?d00001 diff --git a/bitmaps/b108o.bmp b/bitmaps/b108o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a02c11f507617b4640fbdc0471d31de4a2fb341b GIT binary patch literal 1790 zcmcJPK~BRk5Jl4#(FIa_0VHoZ1(w)z6Rv<9i3RL>rBq$?8bMqjh)obthX2Q|?Yb&e zr4rSS-^}EDJhuDrI9^x!+@rrkdkSq*P1N4N|9s=y6c#oX@{9fs zikY8_*EEA3uwsou{8%l8EixBBWNg8*LJQv;GP}SUpK(n+oBTEB%lHjA&3KD^2bbcv z82-f{@b_rD`A>0YM6@6wU%Y&Q0=Hm2xPdn?^e*YYVmR2uERCKEAMcOI@p|b}gp2a= zCF@dzi}3!EKSh2-&<8(8{&$3-1V2^0-sPF+E7w28`}v&8zw~1!n6mmf@+PitP)_w7 zE$fxeYq>vC?4OkTOX+<7dAs$7`+7>}MAoo{`s&%B#*Rmvf6lRE!F@M5uT>)XTi4JX x5N-cqT z%y{NAfZyJyMHGhH6 zmEBwH&w$CK*HhmW4z$C4_P@m=^c*XHj^&ul`M_b|q=sd6t9q^0%k&05$-k|q?s%8& zEz8-H4bptK7+$C_PlWoTf4;^j2kb16`rn`T5o@mEU*}tTTRZ9j{XD>`zh%@D_EKMH z0WZ!o>Q#8Pe-72D_t%q$oG%74Fy-e)ZV3w7tmqEd7*w=Q^DaVn08z-^mO*T1pAMwMplGmp^N`uY~wh<#*-SC)bM* zc_;@FcAqZL=iv`_DPkPJqrPzj1Dzx%trwp4?Lo(5Wkm<3KN2l)GD-{J^=aWD1QVo8ey$@yEh>x1|&^^D-5eGj;!e%$dxU2j>>rfv}RS%zFD zK>HR)^+$o||KE5^zqQ+XShn@teSSw2Y_Y!q>}&l}1Phk)27!9PSYN%;*xq7?0KK5u zjtkN+?5q17^F1&Ad+&P+9^uRPnHd5Cg+-#NAu3xO&S zMD^J}pYKoZ;$B_fS1WxkAkQ&wr%|j5-Csk0ck0Ipb~yNm2*>QPf6qe-|0am)Qp}OU0n&n&g!6fPwg}CMdWUY*8pPXc zs4rMk(AWkIkPi>wi;y(8@+eY)y=M zf=y&(*2vICeieBZmpJdI#YvgKj zZ7VN49vA`Cec-Y7?gLBZ-A8_bhncP# V&*SI$<@rzLiSO&PP5J#Fe*h1O0Wtsp literal 0 HcmV?d00001 diff --git a/bitmaps/b116s.bmp b/bitmaps/b116s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..12d70e3426f820f938b2bc22c2cc228d6fd500dc GIT binary patch literal 1918 zcmd6nF>b^l5JhoZY>{G*;5Mg-SLt(`w26H*ABC;bI-Lv45Audw_@%NjgWPX;(Jh&R`Iz~at9 zjPO_IPTB?Mvy86SH?vRUnX$El?p#;%2>U$;;(TqUDLg@DG+7_T{mzrP=$5^7Oi%VL zUm5>g^bdB`qe$|c=)BYEXbftvF`QNdQ1li91whr-CympXu0LeeO@;{@$ zRQdDtuM>&$El-rI{8}C<>ww~V%aV1XQ8&!(TyTdGq;#^sftfDM=Z3ZZ7dYUzs_Y?G zbIr)rK|lJxHU1Fe=OOL+!F~#lvfuBzCXaJ~JFJySom9-GOnR4{YCyS+}>Wx9^A5?Rv|TvQ_N;l&yWsHa;8w RroXwwqhz3o_aoDP;7>8#2Ydhk literal 0 HcmV?d00001 diff --git a/bitmaps/b116w.bmp b/bitmaps/b116w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f11ec1145f35334db3a5e82ad22a541d1002f16f GIT binary patch literal 1918 zcmc(fJx;_h5QQC5q+^eemQ#=wJ-4AIk+_%-!2#0IrcAL~^X5(LEN>;O6%uR7i9gSb z=f^)UukT%8d&c(({cY<_XgGg_{PWTK17@sSODS2uXv_ceX?OpX;C~&;#0R;}ytc** z0>{*fUt>ID5XKbkSNL!?Bu5*xrVcgePc~?5l@Nx^;aE6w-Q|Y2o$}Vyj7Bug0^fGg7y&vHGhq zE5dE`^=r%$vtX`YV{Z0guZObQtACBZmVZRGeyi_9`B3VwOfgS@=O^rEH&{ZH-^xta zPaN&<&9}zC-Kak2f5lqQ$O4W-x$XpT>Xo@|1i%+fv_*caVPr D0rJpg literal 0 HcmV?d00001 diff --git a/bitmaps/b129o.bmp b/bitmaps/b129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..243ef28e92edeef9ca2a500d28011134f968003f GIT binary patch literal 2642 zcmd6oJuz zTJa6|);O6X^GK#?MHPrK!aQZ%^)W=Yax~~vAKAJ$ovhu`%hHU!>D}lSD@Q)xjNSPz zGrU0V#@=+W_WHOPvw?RuWy}_ZN!e^{wvnRH8e2N#=0rQZ&j{A?=mgP0V$7Blc9jxq z5C>^$#taR0vN(^9W{uIK?^lc|Ckx#&Dau&NH`hb4-9=BGjtUQZeBquz60_K>s);c| zi|*9(x@>m&T0e5MJNC!gk)x9B#qKIxft^K>vOh^Y6(EHbNhVpd_%YA0sZ#D#_=hVt=V z;!!Xjqo)jpsHbL=Jvby&_kWM+9lZG9`Mdh9vB$NwJdpfLH9+#zgNd_#2#l<#J@$x9 z4`8YbZVOqlm)LW#a?ianCy=xjXD9#{takot=d^k+H3MXm`LLbUiNmj~6Hbh#aWedy zB>t;XeBvGMAR6Rg{1Dk^=w#C2`=@Fdn?>3yTc!Y2%3)77=e2q{^TXy;Ez_%h+go^1 zIqeDlIuC5MY;zw~z4&h|^tzZ@77Mu*@pRdsO2oS+K7cH!LM@?RimUL;+Q51kzp;ZFl1m$RIxlAs99R6Sj8ND^l_l% z$p-ABHOxYxV6;umyLvb=O9L-@VxFAGJR2_CNDfdyXp@a&FRT4l#*2)e?Hai(2|c#) zBBRno-ANxOQkVZ>N!00$M9iopVRFX4LU^9biSz;%MQ-Mw6Pvyvt)d7Iq~Kxm)E!ZAoh&w6WY7ACN#nyG5_(P?GA*EmUCvSEGoYpb{SSJ=P`@EbGNeNV64ff z0DcU8j>b+%CNxAfwS(7qmHK>AUDKaY6=ESWM%A#7Nq9_>dX%V~V=n}%Hqm|`|s*0`5 zSu1*m+K&tPOknd`lRcD79-XO~{jOnN438mO+E{AY%dFH~y5zQ-MTV{GBAe`CiEGOmadGt5_1G1&kQe z?;6HEU{b7z0rz7M`}ZtK8o#U6q-(3%d(3;59@~3fytC$=Q})O|Vb(DV;_D literal 0 HcmV?d00001 diff --git a/bitmaps/b21o.bmp b/bitmaps/b21o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4a5dc5fd09399a8ca06485dbcae0f12b5cd639b0 GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKIxgnSd$Od5$`2YVu5dUB}pdi68zyAcojDiyk z$CxD;{{H>J@P`qIfBs3_c=^bds}3}E~NN(1>Ib^n-uF#Kl+;(jOwng;;bH!yVo literal 0 HcmV?d00001 diff --git a/bitmaps/b21w.bmp b/bitmaps/b21w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0b8b1eed64a76d189e8fba918534c97322e56132 GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKy@If#WkPX5h@c;jRApXH{KtY0`fq?^zk1>mu65Tp(y|DPR*`=JsUAA~_{p!opT CjZgak literal 0 HcmV?d00001 diff --git a/bitmaps/b25s.bmp b/bitmaps/b25s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c9c41afe55b73f998e7e1793e6a0d7c0286c8aed GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2sga9t8RF}!Q60wff0=V zKmOnFpP|0tAA^0v|N43``@bE8|A#}q0gUaSG>{Kg2UP$6AW$DjFARSNvVrCU0B>AB A*8l(j literal 0 HcmV?d00001 diff --git a/bitmaps/b25w.bmp b/bitmaps/b25w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d79b9d3b2b7384ecc341fc9beb6ab6c1d71efd0 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd*I@If#WkPX5h@c;jR5N>#HSKaV{gSp`V10xv! pfBe7UKSO=PKL&d+4PwLie;DK&&@o)yL7=|xKn&6k!XP%#d;o_@KZF1P literal 0 HcmV?d00001 diff --git a/bitmaps/b29o.bmp b/bitmaps/b29o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cb1ef888023542b811eae291de8d2e3a0427c12f GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>$@#NBm6|Z$H)Uxc~S6 zjR*V<7XLrh|M-7E{>Oj&=Rf{8@c;O~|NW2u_wWDszd--T|N8G>{O|AYA7K2U8chGM Z1&V{zouB{X|97B%5c~zje}OdAE&v$@#NBm6|511G%4lpoC zJYZn3`2V5)$NvNJKmIeY|M0#QzwWQ7~LBNF7K&GW-kVLG1zn>5WvS literal 0 HcmV?d00001 diff --git a/bitmaps/b33o.bmp b/bitmaps/b33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8a2779a6441e3bf97d52b5ea7652980323d50b82 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@u)*~A|Np;(_#c=b zu!HFLf9C%N)Bo$iG)(;epZO4d511kJ{l5_U{7(pdffYi({|%wh)xp&7{|AxZUx!NX nkwfL*uZ8eoG|b%Z-yz~Z&qL^c`=PWwg#LRUmHr16NAouThIWW~ literal 0 HcmV?d00001 diff --git a/bitmaps/b33s.bmp b/bitmaps/b33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1955f6b5dd7ec9d04dec3b6699da3051fcc81edd GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@u)*~A|Np;(_#c=b zu!HCa3=PZ>ngL9IU|;}?|NkQo(f5EELLXp+(D!U1^x=o7^6!76s)MO-V1S4>G@#P$ jA5i%R8ln23G|b))>=5xE{1Ez|Jt_@zCya*4qxl;EVK8{| literal 0 HcmV?d00001 diff --git a/bitmaps/b33w.bmp b/bitmaps/b33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3d34cbce1c6faba210597d9b311a62dfad81531c GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dur_#l`GC zU<^9VT0+<|NsB10P?>u z{9pvp@Bgd+-vOjQ9KI(3;{Uh#`TPfn{;v|`opPvvK=zcK&e?OEi$3es7QNsfkJ^=da BrSbp( literal 0 HcmV?d00001 diff --git a/bitmaps/b37s.bmp b/bitmaps/b37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..de6f7c5b5563c5ef31cc09dadd1d1d0713241695 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VT0+<|NsB10P;UD z{9pjl4;T~}EWmsQF#o>|<8z35eu%yw3=sMOgFRRrMt}cb59WVhK&3zbL*>KN!{`GF t@?d@F^ua%<;tv$;QS5`+19Q(G#{XdX|Ljn@AB_(ahtV*3)bN0X4**fgjIICx literal 0 HcmV?d00001 diff --git a/bitmaps/b37w.bmp b/bitmaps/b37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..432212c9711a6bda0303a26cf7a4f9ea481e577d GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U|b_#l`GC=1oF7$Ecm279nLjQ+q-59Sl1Vd`P@0S0-nK0-81 hJ&cCg19Q(GMu@xqL*4nmAB_(ahtV*3)bN0X4*=2fiM9X$ literal 0 HcmV?d00001 diff --git a/bitmaps/b40o.bmp b/bitmaps/b40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bb0c4572c23e99130571d4f4a688682a1224e5ea GIT binary patch literal 382 zcmZY5u?hk)3Ryj z9%@fZ>G#B0Y|)5snurlz{NN^bIBK4@MLqCEsejgoDEmM6Wj+KuXAbY{agsi8wR(kW O@5kNtIX^Vl_20e#F1jiJ literal 0 HcmV?d00001 diff --git a/bitmaps/b40s.bmp b/bitmaps/b40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4664ff2c381f9457d15b220300c8b8bc4ccf4335 GIT binary patch literal 382 zcmZXQF%H5o3`KwG&`1mnJwR7ZQ4l*rA9-M6BXetRDwil-+j%lpY_`JPtSf7<}-$&^n3 literal 0 HcmV?d00001 diff --git a/bitmaps/b40w.bmp b/bitmaps/b40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..239e2fe4050158a903569456054c3552b1a69bee GIT binary patch literal 382 zcmaiwK@NgI3`IY(z?B|>EvG=^-YcP3^9~+>gag2mL}LB(OO4FNCckgmPCLz9u3Z6H zOW*vcfEUih^WfUCo|MeYlIV5b@Wu4V{Dc-2*<+7VF%&O6*Ob|P?HinLoHTDjwc(7T q;^2Z>aWL}1yuU}O`~R5t#k_bY_A}fx&mO+Ft^0o&`J8dj|Lp^fT#+{b literal 0 HcmV?d00001 diff --git a/bitmaps/b45o.bmp b/bitmaps/b45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5cd37651409bff122ffc882599d187075bf454bf GIT binary patch literal 422 zcmZ{gu?@m75Jk@*M8ObgX&3<_(X$65&>)XO#|(7I28;k*8l;F&BtY!XozE^3iL<_6 z&i`K$dAmCs3bo;V$y!AjQe)3JE>sitL{b1mKo_0^U)=fw(Sx$mT!?Da1(;7Xw&!zC z>-)5m{Pm=BjaAY-umdmlzwm)Q-hqy0O1MDJ3CSh)WCnhkZviX0#M+^d{x8dH;I}T$ jN2d3>(SIPX!uN5zDXU!hfwGHit@dLke|VpAy^{X{C*k>f literal 0 HcmV?d00001 diff --git a/bitmaps/b45s.bmp b/bitmaps/b45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..285e968c2b3856462cfa35ead7fa663e56f4905c GIT binary patch literal 422 zcmZ{gF%H5o3`KuhAqEDH(3ORqiAe0+gCnq@a2n3hqvQxdEE$@*wv!-IiAX;$&W|m} zm+Q+w*O~VN>sVxvjT_^!%j(z@$s!^VQPi{Y!{K}fJcbb`;r=NMlEwEk=k-zEk3-H2 zE)!d&c)v>6Xq+f1Cm7|7zTxEFjbCd7z{$DNcd!!wrS**;x{_a5>#qBt(*O5g-fBM- TbuPRW*8i?q{dS%*Ua7MH8EnR> literal 0 HcmV?d00001 diff --git a/bitmaps/b45w.bmp b/bitmaps/b45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dec307a2169e751f26dc4e0c82e00778b8e0ebe2 GIT binary patch literal 422 zcma)&u?+$-3`Kvqf(}NwmWG~+ljzxl5$KL-nB#_EfQ%4{CIyP|cVYyoi1hQ~{Mbo+ zI^P3q9ChBQ_DuoRxF{Z*s+D>ahlo%j+1AFVhUE%Gj0+Cr_C_XV>3-3?A@lq)*1R-V zVr``NtrvpDJqrfgclN&5NWjdsGXfLif9ZKnuj}{u{nFn5`B$9meUhy&IyL%#d%FMI IPqvqJ-aMJYzyJUM literal 0 HcmV?d00001 diff --git a/bitmaps/b49o.bmp b/bitmaps/b49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b643dc3c834d1cf8400d9a4e98edcfb45539d229 GIT binary patch literal 454 zcmZ{fJr2S!424}77#KK0S5_`SC3fz>Enq?E1{+7soWcHAx8ok{sy|OObCW)wF5o%tV!=PN_ln#Dn{3 zb0H@_)`Oq*z*iL5B||Lt9`M2e$O4Iy(C6T08F#9mmVsa2=(l;s7Os#ve_5_(>ph$o npV9X4t8{DC7hnK$JJyzC=G literal 0 HcmV?d00001 diff --git a/bitmaps/b49s.bmp b/bitmaps/b49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1a7f30c26ec41c2bceb2b57188a86ddaa7320458 GIT binary patch literal 454 zcmZ{gI}XAy5JV?Qk%GcU2qi5SAQC-CisBA#1r_JW5nQ^6Y<9ffNc>isJk5GNTIYOu zHYjzH??H5|YM=)ct{-F9r`H6O+NS}YHc~SoFdvP~v-KUO?=OsF|@7!;5)y2;~J}iB= Fd;!ZZ;(`DG literal 0 HcmV?d00001 diff --git a/bitmaps/b54o.bmp b/bitmaps/b54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5020224b8a3a9b949bdbda2e93e71bc3658d2549 GIT binary patch literal 494 zcmZvYF>V4u3`PGyks<|cib#}6xinOWmD1-FoC1kxxdAy!u7D`EoHHQ$D2QewP5iMv zJ5t1A$@66U?;p>;y?+OIEcJZVoc9@!2VaVh$DAXbSz3^^)JOx0wf_sDKU5 zlt5YFLPm0dqv_;X=VRL3#lieim3@CuyFXN+eVK6Yb~l&o&8t4$70AU&q+cU literal 0 HcmV?d00001 diff --git a/bitmaps/b54s.bmp b/bitmaps/b54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cb770e5746d93e46cbfc94ba77674cd92e0ac9e4 GIT binary patch literal 494 zcmZ{hF%H5o3`Kv)z`y`EC?jJhCPXE6?!!=2ZqTc61h$S`0f`-TEK(F>yG=w8vGntl z*!lWt5672*)}Gf5YdgtcY+M=V#i$wgL{dZ~;&NH~#(4X7aKH(?4nPUiLarLUau@d= zE3A$9c{BRXaAE6Lz*u`j!&E;2Y>Tr_5(*`SH>Z{F(PC kHD_SV8FJmQ)I1Lq$^ng1-Y(*J3B&iuG0xwodw>7S2Nr(}*Z=?k literal 0 HcmV?d00001 diff --git a/bitmaps/b54w.bmp b/bitmaps/b54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..011e8a9c0e356e7073201eeb3e50889fa3d4e16f GIT binary patch literal 494 zcmbV}y$!-Z427RbK?e&U(Na=TA&}_VC=!gs2y8&Z0GR-#OmW26zIzcO&|vA^7yrt+ zI~*T^u$`SN)22v}6BomMmNl`Q%S}~XW@*IU!_R~S>0xIFtbrPBbZ!SW;V(RIR>O(` z@p)8>eS8Cz(+cF>*AgFi#x(Ne74z^(#y|QvmrS;Y_x(%GAxHahp9ag=ufr+G|JEws R0ohCTf01>1D}7(zloQVR_obM@4Lt62_ z^<4P|48VnZGdQRYEIODzsP8lsf4xg&ni~^Q)cgm%affX5I*XIOACZl}xErr1vrp7m z?(}!}=`aTEZ!5z9%|~IYj03v2q)_V4s;hmdK4^#H@AG{A1+o*F+v8x&q5LmC>mE|H YI?iPusStcb)9p^nzDD03H;5-T(jq literal 0 HcmV?d00001 diff --git a/bitmaps/b58s.bmp b/bitmaps/b58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7c9220a0c175383fbf4419ff0ccecb34a35fc8b GIT binary patch literal 526 zcmaiwK@NgI3`IY>U?Gtsu=NZsBysPN%*@dy@c?=RjTgYUVL_O|VC4)9L}KSm$xV6{AAx}bzzr&~FjNh;^P>{f1xv4AZN0p@ zxm<@Gw9foIvQAkBM&~!ieMk~(wj;(UlA?rPEhMG6;r0NcF63epF864j~H6Y`Y+E?oKxGF-TooMrjct5;HSMPvQtd2yGnaslA}*v!irSqDvZvRR}aM4EZfQmTeE34w*CjdHw#~I)s_E_*`nVeTlBwV zCf&m51#l6;vwXNzRv_SKCdl zx1l4|z~hButYOITjK$~YV+pZVI{}dRPhM;p*+!fCIfvu3sx|Sndl^wiRd7VocWVa;4bSI@DMhCBUiSvpT@2bP|iMU-fg~CXQc^R zH<;4UF5RLHhsKS6s(Bit319!Q?U!%LaohX`^%3fQtoJl)`@m9cNEWKLzsKgwzW9HR EZ|B)}-2eap literal 0 HcmV?d00001 diff --git a/bitmaps/b64w.bmp b/bitmaps/b64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..acf8351991d6246f892f7685fcdbe82815ad640d GIT binary patch literal 574 zcmbVJ!41P83^eT{zh(r!og%6F?@TaShUfr{kSC9bt8K6z(s4GEm?Z2lwB%o)j$JzF+?-Q~tf(+TN zQh|N$nDrF=r5+TXEDev=_sBOz;r~M8`*|CY3h|hS%zx3(EABm}$Mmv;tLO)fpD_GD XQ5(KK9i4_6p<(|0LgTg6`KR>*1yf$& literal 0 HcmV?d00001 diff --git a/bitmaps/b72o.bmp b/bitmaps/b72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e0010bbcd119fa33fc485b773324cad35dcc16b7 GIT binary patch literal 926 zcma))F;2rk5JktNNP&b~I=37mVkIgX?!Xba0CuP-a|5^v5`{}&A;?8qTWJ=_+RvZe zvDru|vhp}@zkgB z$b%#Mt*r1RMMWM5ky@nOk&nQ1>wr#m+TR$e`wBP!Uj0F2jlGEG=`^o$4>1oZwN$Ip=-JDyh^hLcRbJ~})mum6noaM>$AE?hg z^rY5m9m$>XNS^1MpOM1}&O8KeZC0E=j~08zJAM}KHNEMhrZm3fKH!^n^XK;@zdxaF U7SBbz`S<5JPiisaQuiGH0Tl%>eEkVTp={J8+RzvKQejATHt~q;wH^cwgq6f_s692lP0Sq0p@!&KgKWz8!XxcwU9vj$k!tvm{4Gm&t?B`_ z7Dkepr=FuzADh#1M4n!KUbv%f(H$dI?qR}w=A5<%+nZ&N{Ef!0@eT8=)#qbIKTE9T zm7E@W>8J1rz0A3=J>%Nk^fqx)#`RK#J@ZYDrEKn(gIt~JQO2*Ff8HF+e~{nk*8dxR Nsr4|m1n0W%_z5)wzzP5W literal 0 HcmV?d00001 diff --git a/bitmaps/b72w.bmp b/bitmaps/b72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..76f2128e769f496fb544a92f0e1e13106e280bf5 GIT binary patch literal 926 zcmcJNy$!-Z422z1q$4d|TBaZp6%9Ku31JduiNp#FkP%W+pqOW$gC0^&LPA*b={uj# ze)qFKUQ2P?VcfzG;e`|)KVkj8PQF6K+)P!?lco70Po0OS4mr=-d2GQCky3k+20X&g z@H%)y4D>ki-7J3!wwgNlq*7zmhcp-yPtv_PiB0iQOo#ImV;gKLu;6iK>)b><$6SZm zlyVk?)5ZY2J_FG+?t#GpBjZ>w7Jx0tTRNW$F*T&)#kAE?W9GNF znUAZP^K2TaMB$Vlr5Or)?OJriDC}5KQ=2;os#Pt71LZ|&?aU^;X&Ch=X{G_&f!fr=eIoTwECm;YYicW zS{sR1-Z%OfRCoGEuK8Y`rl}8Y57|t<=6s$2{p_@MO!Aqd8z`9>y<`fv=j6m4YJ6}r ax94ZCt;*WN;XH2Fwwj}#bwpMF9R3ADU&0Fj literal 0 HcmV?d00001 diff --git a/bitmaps/b80s.bmp b/bitmaps/b80s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c9eef7ae119454ab1acdf41565ceff22a63c653b GIT binary patch literal 1022 zcmbu7OHRZv42B)Lm<0C~qcZak&WN)ekB$NKpZBQXGUO0pf)r)~2C*PIsM6Od^sX@yJ9JzB4|SglamE z(aklN_sk!SBeQFqdVQI?^;+>nv}y5gX?SgXV8){-iXoqCVjMZ@kbAD>pKC7C>pV~AEdHP~SYGWv;&yO7douf+%nnaP^0Ui+aA34j#)3j) f^;B!`$t1s``scB;y+1bQKWu9*zV{MpGhD-8N^3#^ literal 0 HcmV?d00001 diff --git a/bitmaps/b80w.bmp b/bitmaps/b80w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ecaf14720e0c45e3abc25b23f641a02a70ab0d64 GIT binary patch literal 1022 zcmcJNO^(7a429k4f*o@Nww!`Uvqzd6HJpGeg_(>O zvoT#mgbC&cWA6+kj)Og3e`SXH;{a24Kth2J1PjhdE-u!p_k8Tgi?Q?cJJc;nI r^ODdEzix~MQ)P`jI`eDqo?KQf#^0Zr$5nFQVPEqaT1`@|{|x^F2z)Ot literal 0 HcmV?d00001 diff --git a/bitmaps/b87o.bmp b/bitmaps/b87o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..202994b5d70d2e8a2fa5c349d3f2c533e0072b81 GIT binary patch literal 1106 zcmbu7u};G<5QZI!6eNarU?yVY5txX?&cedWgr-u5j(w#dhK_xOpbm_rTZYKTXZzxK zC{httF8Or+?>}FXr{|YTW=);)09|w?xE+F8e?JQky+K@3NXp zJCht<8IuXkX7ClyinxPsP2DYu!5pozr3e|3-kJfHwc};ry>iaet!8PQT_GLDR5e(; zCazb{h9yexCT%sRAn>rLBey2zT}7#y2BwSGukfEKZz%jw-ob>|kQ4Six6F%aV0=#T zu`@-Xnj^KRxM#mqOQg>6Cf}+iJrC!KXJ%gxs=-6(?a!I8>nW}`Ujg2o z;-Mzb&1ueK=8gK_c=EKr^pyh5bmob-ACL!z2AZy%=oP}Na$4yU!LXWEN*5M E06e`bumAu6 literal 0 HcmV?d00001 diff --git a/bitmaps/b87s.bmp b/bitmaps/b87s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5baa5c228d81e56cceb2f48cc55f33cd5631934 GIT binary patch literal 1106 zcmbu7Jx;_h5QQfMDM%FAfUB6j^Bz zBTe$@W&S+z!{gH>CA-J-4*sm(P?PiXjG4vN*1z+QrhXy!z^-TCau1$~ z8b*T-?C^epx5_(ZyplC5t%X6SSjr_sywp!7^#e_wx=14!7HGgT^GZ`?PkrHl+)-m@ zaHs6R?FQQz%b$V9ca8r>@ekz#7|qfQe&D6>g8GB%r#RfwRhey>IF@)1E_M9Kp|G9D zq5jtVknub6Jcje8vkuA2?8ojoKrg$+VK73DM>DKP*-1%db7ydpq3TgmH70f3U>jo@cc$i^ S!#3Bl?aOZ{sWS-umwy4}pPMrP literal 0 HcmV?d00001 diff --git a/bitmaps/b87w.bmp b/bitmaps/b87w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..540b4c9900bd0805ce496248f6198e2c4127c938 GIT binary patch literal 1106 zcmcJNJr2S!424sQ#6}s|Svdtr>?|x?20@QjCPo$x(2bRmp{jX~U3ddgK?qBZKDp07 zjk8*Bh9TMl=N!Iu&q5aCQ+&US%?F66tBHuZTl*Vdz04VPj#3s<=Q0A9A!LGPIar(S z;FobXe{iaA-1eK9^=0+$sD`H7 z3*RB%t^N!ihrN?{JI0Khp!3Mci50E2p2TqVmNV!I;UceO_FDwuL z$DT9`x~N1{&%BOjzQ>dH>E-L%OwS|iJ=SYkm8quq8}>hL^SVNWi;swK>5~-TFXtbv z{!B7DzYn7H{8&`)U4Qe;2kbM#hH!^Tcsf7!ZNr|E4 zV8$esWPPc!zND;A={E3?gisTk(T%3uWwk+V;axp5DrZJvRdT3gY|i%x&dmK1KZ4mV zXBDv6?!-{zTV$Q|PccHcCc%eU#|LEbs_}u@AkBr;g zn+NNA4DK`^&WYdIKleR77Js69<*f)lIldFAmHkwb)2=gXcy n@WS4nc=|7tc+aB>54gEtaUd#VqDnD-=6W`Gz-iwc(g zfg&G&te4mGqonnW_YwQ8>_(bof5-X9Q{E4-aC50Dx2Bl6DJT`=|pyBVN1AsZ=m5c{MQ_id@-~PCA3mY);5k19JUAq_4dQs<6JsePx7H zh7z6Fds1!x#>+|M)aBTvR}F;&8Jqf{MGj+jP&jpfbNXyCM`U&CLG`Qn2k=yMJagdE zWli7LL_1=b%kxM(CPe!d53<9PeYP0Cc3`2@xr^aj{kPa@Zsi^6Q|n)OqP_OJvY&~c z6|T?C|8h0|0iB^g_Q)YZJ~KpHV}B3*eba%V*~k&M LnwMlX`~zPA3%@T6 literal 0 HcmV?d00001 diff --git a/bitmaps/b95w.bmp b/bitmaps/b95w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..565deb04018fa33ede0d8015d9654495a5523152 GIT binary patch literal 1202 zcmcJN%}oO_5QS}mlp9-uuT;TG+^K;kxO+RHhg9GqD8MDG#3hHw!+YbMWFo~qVo5c{-|AGI%p1M82L*o(=nyqGl^Y{F1w?CWIyzWGnbeftJ zB+4gj`_5_YyznU4c1^JNQe$WS4zV>ob-QBKs~h@aBE)BCU8zY66SC$Swq8PHfxWM? zKQnTi8CNNyMkA&B`N*_$*N>P(2)S!UtSuuyYZx)xw>mw0y^lYtXVhb5ol~#DbD=gh{?qV~u^@G-GpKAL2VptCW8W@GX1 maABB!S1KwtUekrWzcAIN_w3``!~U*kpX)eZa*-_WAMg**YYW!^ literal 0 HcmV?d00001 diff --git a/bitmaps/board.ico b/bitmaps/board.ico new file mode 100644 index 0000000000000000000000000000000000000000..62f071429350549ca7e9907a437db4e83c23b5c5 GIT binary patch literal 1086 zcmeH_F%p9y6ht2;b<7c{GAVO}+>3@=*>aqec9vwnWJaL1pvmIyU;pCZ=m*Dy_je4R z2_CB6%Lp$Aw+lS2C%#3;RSL0e*?lWfp*k^^B9#>*DJ2DYzsT8~sAVk^wxwkVP;=R! uW}Ss_?r9zWKY#G|w|_7W?VM})4Zl)u4z+omJFFeLc<$o$Y<|4W821H_qyvHg literal 0 HcmV?d00001 diff --git a/bitmaps/dk49o.bmp b/bitmaps/dk49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e3f6f3aba2721cd3671d5479e7e1a70c87145df6 GIT binary patch literal 454 zcmb`DJr2S!424~>(`&GDfmUMYOwGtGdXts`aShlQGcdGL+PwPZM|5a6EWLbkZ285x zT%U!6sPsIk&Pj#D!cFlwMuo<701%ai*`;T1ZN#&!-(afa1Dq literal 0 HcmV?d00001 diff --git a/bitmaps/dk49s.bmp b/bitmaps/dk49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..46b05b1d1823a03a48e7c5ed0974df30a79e58bb GIT binary patch literal 454 zcmb`Du?@m75JkV0B2;9Aw6rWhBzk7Tbm%gVG$P`-f3``3J1qTsKK;{u z%lpI4!Ol+WMzu|Hh(@otuA^))6%m0-k1z7g+0LWLR%BLR2EcJoiFc7F{Sm0hX<^O& zCGsEx(EO8mujW}!&d=|>==+)H0hWcK@z(dNpFEwzKz{~WQa`98zZ$D}pX$h2e~P{w J6ZLAn@dGqc)nRLa*?0%RgKSRXSp>zsMj(Z4N{f*3?aU;Mg^*afFvG{& z`N_@|EaPRMPIpJ158H1Or0u%9crd27sQd+@vR`+p&vc_TadV5Ab6 zK8pv6Q@rN~ohSVZmx0^GuPIo!C<;l}!NXbj&V Jk9x+r{04?4pYQ+x literal 0 HcmV?d00001 diff --git a/bitmaps/dk72w.bmp b/bitmaps/dk72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..66ee835e0a1cb088f3dad82c227578a7c529ae72 GIT binary patch literal 926 zcmds!F%H5o3`HGvV1pyDatbOjv2X`&()1#nr2_})#@ew1s`>f(K^d4(2Sg-WPmW{d zf1fV5#(0j%2gF$sEUBjE6bEpb42BNX(2l`3reh#W0>TH~I&|qbDOqALy@U)}Li7bf^hG+jq*P0Z zzCjyT1uY%qsDlKTdwox`bx$V~GGyq14F385?xef(*>B%}c;Pi|imz|*I$K{OZ`Al} z{QT?7_G)1L0stOfy>^P9^#I@er)Ea$8)f%bcz%n_mK3Z!#h)XD3ZMpV#s{q&Ll_tq z8aG$tpwg*bZL!jLGInyA_JnIm1!3ys(iJ4GMHytdlZz85T@&fhWCXRFqnj)H{Tb!h z89l#*2cEl=pm72;H$4W86QyUoKMyK2)3Xb|c5DpG^V;D21-5np#m7?jtq?jmc1-Vp ze?WEx+g2{u2N*m+8?v4C0YR1ewzRU z?wS*3f6XTqqRp5UXkUPKk*%$8KJZa{R)Yj1pvqaU#xWs;RnKWa5}duC-5iuu3)w_LYHdtbOu5|)vTBa2)a42y`hqZP$1q0#d6#R) zfLB}We2d|FmR;>V%>fO-tZ2{3p5duRE#kR$4ruA>u0OOGCrdik_BhC4kD$9+O>dj_ zxEZyMvD$40a+rJEjOu{z_O@GXSrlxaMLsGd-#82*)u#1 eu*XXBS{xRe@rOn;-R;vhh8=7%{A`eW2KxsPfO}B@ literal 0 HcmV?d00001 diff --git a/bitmaps/g49o.bmp b/bitmaps/g49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2930420709352813868199b48a6b90c2e5db5f55 GIT binary patch literal 454 zcmZ|Lzixt16bA5XIC%Zm zNu!`#?$>(`l3=1YIro?EJC}vG(Pkj{*!q6a^Lm+qXctq>*JC^U@NxkVdi3#bSQy+_ zW@Xa;5BTld^-W z562&5V%wi&9EJfI1##4OAH*qTKZrAO1XG@^W8yG?sRqs<$6N7+Y=m5G~~M{ f>h<=d^1ew!S-P_`Ed4zurHfn6DsX@AKezoqM0y@D literal 0 HcmV?d00001 diff --git a/bitmaps/g49s.bmp b/bitmaps/g49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..835cd415b1faa7e61c8dc24e3ecf9cfd25d27de8 GIT binary patch literal 454 zcmZ{gK@Ng25Jf*>!NLVc=+>VA=NJFAauK?+Sr5H9Co7PTC6HH)| zKQDj&WSVq;xCgMcHGOTg85O_<7lYHv$u5pfYYih)*$ju+&J~bQJ^=BQ5@6(g?x~Ma zYVR@W2>j9SDamfMC!>y8j`#dK9T3rci8T;XUhe|OGB{gb=9W#FSLAt_b7IALLws=l yp7JTghrH)i2uVI^dzEHTtnFozLB?%AFyiYwrD8=#xz=Hw>Nysjw)3TbcJm(sMe->C literal 0 HcmV?d00001 diff --git a/bitmaps/g49w.bmp b/bitmaps/g49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4cf34ace39105d609a7673e7a666ddf43429e44d GIT binary patch literal 454 zcmZ{gu?@m75Ji7Pk&cW&OUnXSqGu-CN&#I)U=>G5q)bDP*}&->DcJa&SaOk^^zZ5Z zKb<9CuCD^I&Y>TJPKyf6!9C!;pA{FE=DkNyD6v9QM&AMz3qdQwvKtZ_@LK0i4+MG|RzBJcTYvQfehS=2F=6rO+L~|nR2FC>)?*`8V iCf<+!AYfTPx+>@ANAtuROS$)@;eL%FkN(y_&;B3zc^yHwZX63Qh&}L>yeiSMUv_V+Wgxpqm+-gwlHvhn5bZP{=E! zo=G`ZSQ|MT z>??hallWZYfz+UX?``F)oG4ZI8V#98?n(^|y-%s3a7F2|mPGc`4}giXBZeLUll z&COLv`JUt&^L;FC9-YmpIF#NO(=YEzPOHe}I+|!@U6pF4lZgB1wffYVvM$t6r_L!{ zIA`h{b+#r^m%Y-uRIpAsUq_>Uuga_?Y^+yu6nD%$=c{-~o!WXC&*`jgbDqJ+xZphH{Dr3YO&a5KX*`Z$(`CQQ#+p)mChAXjDWL^%eceK*am;-vL8n()HvREV cG`i3ZchSYwa35#%$E&t$@!t&YY58CO0PD6Bg#Z8m literal 0 HcmV?d00001 diff --git a/bitmaps/g72s.bmp b/bitmaps/g72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..751be7993be07594f9bdf6d65054380f137a96a0 GIT binary patch literal 926 zcmb7?Jx;_h6ojAUA_YabL0XPLfrvy!vv=SiK)l+5a&G`vSwykdNR*Z$h$cvphw-x= zWu;wd*OH$;jpvPjl84p16&?4iH=K`Y8ZoLrasA~gP8CuCAe?bf%ZMXv!eZ2&*vtc! zD(O3NaRGnRUnYOM;AQ4Wy-uDbPcXj8I^buIg`4?A?=t5{#8fHg7X}}RI{^7?J7(s4 zIcDO&=W zW~j9HfNOa+W72E)YBM+FDd~;#nOitmUusSlm=71u(_uYxPu^gwx>a5W_Lk~~J><#Y w3vZAn^M2+%j&p&}=<$|GF6Lm%Bx!ox3(7d3H7EIb-k!ffxJw>q^54S$4{|`LYybcN literal 0 HcmV?d00001 diff --git a/bitmaps/g72w.bmp b/bitmaps/g72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..aaae0c483598af0c65e4ea6cb6d56df32457f244 GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/bitmaps/h129o.bmp b/bitmaps/h129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..563da93cac64764bf856b1a72ecb25c72f53c2e1 GIT binary patch literal 2642 zcmds&zi!k(5XNm;!U&duG)2A?^KBR>i&FW3Lh$ZnMv2WToz%Y-F9XENX#P zS@H&>vZNV?$dZ;>*_gCU%04A6ixb!s=%)<73(u2t3ph>@hFb|6N!QhLy57F2X6J;?4GP|+W`2R=J8prSum(z0fE z(1nO@xbAXXBH$@`>A~b$biqb^#c?x?=t4wSBjp=lKp>(k?!gE%f`uFS&`=yQbRkCW za=sBR(S;b1d5rrX=)&8uS$i@KfJj3)MZYm<{0{a@6xy}&5C8!qYngDRk z*k8%l)r??7OUio3u)}jAtnDqc-667Z5?0{=ByL=U9h=1Df!R)6WCI@pm~x0L$O>x; zCqnYcbBe=SBa`P8aNvo#uoK4~4wCHEvSm2N!n`>PVVmjkE^IS&1lN;LURgz2CVX#2 z21N_rK~2#T2hH%!TaUx|C2p7w-ja*7cUTI4LfH}<*TU<+z2+mv=~N4}OTNn1$hxIj z-%!<*ubXE5w@7i#bek26yw}p+_vP|d(#5@XwLZGVEWTiF)UBN~0J-|W*P6IUtc~yS V#Jb(njKUM$$ literal 0 HcmV?d00001 diff --git a/bitmaps/h49o.bmp b/bitmaps/h49o.bmp index dd279cf931595ec5c95d4478390166e2b554aeff..8ae9967d2bfa5667abe6e3e3c11f3c1e92fcaa22 100644 GIT binary patch literal 454 zcmZ|Lv2MaJ5C&jpVk3{h%2dP)G!i@Sz!P-tP{~F@Ri?f|9)qES8BkZApknC2Qe+`S z(#j!!|Fhiz0haDQ-T8EmGMRp4Dx62=A!D2(Q}LoC>wb(dm=XZR;4#;>9Lm{0^Llr~ zF7^L~j&rcd?WG$BIHP_>4X`n)S^A)R=L4+WCl`qw7tuYm#@48BR2CKI;gZLo$JxRf z<Z+IAE#Mf7=KTdgwVQV~(n5s99wa0R=Aik33Rh@wci0MX_I(JD$o1FTSB9m$SA ze?0CGmc~!(8O@CL`sQ^a^<42jV_dYDh$ZgH%ZWuTY!?7w@c6%G7M=3_$n4purw6GE9e!#ihdwIt^V8eP0 zLHkGS13E7W$B=_s0+wFb#o^8iySO~7hP~rl$Ay~Z&AxL-7aRw=0@9i;fy0bGaZP>i kxu%J^%JrQ(BG>ttwpwS zLAm%%lHx=IlOLJP&W1TYd#Xt5Nc+CxphQK!xDk(&9I3EuF-8-`cQeI ziDT)oXI4^Ob}QvqBiZPkW2nuUW2Agscs9-3jt%o(oz1(BE%U*%W44aD`3kN1LA^A4 fCTU*7%XKnrPqUYKjv-|GKKuFg|9q8A-xYrVs_Doy literal 454 zcmZ|Lv1$TA5C-7?T){>ZYmp<^*oIUg5Fsh7#8p6{ZxxFWOUV=D&?2RKRSp!_ ze|FYNJed91*p4$YvTjJ{z?0_J9MeRu h7Hp%Ii2oR>9~a-vcXD%T@94c*mgfJ_@}hA`*!3o*l%0)cBKA*Ri_Y z9i8Y}BQCL5Z9B0SBRDK8)K-(FGF;hcsa-rD)Y+H&;L`Z~RPO4_eRdtlN=gRK_hh#>6s(o$vjlOTEs=!L_rsoV>0JBGCbv2%+>m06miU<|1dD0Fh;Yd d32i9G*Z)=UndQB?xBr;4InU<#Vj^nYAMd(XwX^^L literal 454 zcmZ{gF%H5o3`HFksatyjl$Di{1tfOvz)hNwV|75Ry+StDbRrUn@V}jk0TIc5^0)hK z^?15D(YHt5AhtD}SmOd*I}07GsgxoJyzt8xhI;7as=)GR!%Oute#!n6 zwV(T>zNyX1*kC~yBsv&6P+)|;Q3erDBCUfYittZNkTQo4qy*Uo;hEgav#2Wv>}9?1 xUTY5qtV1H3$;j`trat0~N>4`EkT_reSC&SZ#2e4{A5${Uv+?mXBJ12AegF+*vi$%6 diff --git a/bitmaps/h72o.bmp b/bitmaps/h72o.bmp index 3ad890494c54498d68501e4317be656a06b71d5d..cdef69af373cc93d102479093aaccc2279120770 100644 GIT binary patch literal 926 zcma*lu};G<5C-5x5rU~1x?@ImR@6vLEW87+fOr5Gb?AcBH-J}ZRYVvNc?GHrSrcV( zB`e2&cW&whge6y>{$6|+w>Nh$St4tO&r9svu+t=!{2t%GO>|2TK8Ps6)`jdq`nR2& zWTZa!o{t(dkL{w||7Lr9b|{Xf*e1$XkxSTXUuq)P?1Ja?wi|s`@IaFL)OZ{0x)nE; zymJ*d7Wcj+GrA@;c6?@UI;vnRc7!3+xwjZX+~tG85aRtSEqkJt>v20fHo+LiJqF`; zhUvi=Y(ezRH9XiB&#-wgoT*fwn{W zHwW$H)c>0sZ8cZj_|ZJ7Pn9FN?f-DFKG8!jthUX-rLmCZN&Vu;6XO~Az_GEtGNUK@3M@nNVHU_dzSwmfta(B;iy^u;+96oPZDHMZL7Q@BN~ZID2= z&bR*S1qJa8JIToO5&1At zc5ORlR=?YaTQw)0eh<`p?mDDqDaR$zteN4C3+`jq0@q{ zq?n65250byu7{Fvh+7(cbmA=|ktl;X%z;Q(gL#?eU@ehvnhSQbjcp$ehI}h$z7)Z$ zf3SKumS}07o1gi-YL+;qF-$Ddv0m?ctFMl6)h*0*A5LGr`PH@i1)|nnL>YSHuHqtJ zgAY*B%xtf{u{Wspk1xIXV3K(29_xdj#v)npv}{QcT-Gh;zXa9tu7h&hU(5XtN`lXr e4jyf}&er+qmS;`A&QDews}}1#fddnI?Dj7f@=S9Ai zLg3_w?=yLnU*C_7aJ}I9jCv~-BryNL_ur4X7?g*q3MwyT7wVrqbEnAu|9Wx1-SWxx z*i<6+|C)p`J*gr|@+-P6(paYyx*xWmf zYaTDgp{)&J{cteb#;_cUZI~x#kUja0NU(k@tXucY8}TSbFzO>#ta!(r+ ze}!}BoHne?`Iduolg*2@+17{=*w42diwERsHMYq;$kASnmg2p|#Rum(*8I!)XX$GG Qd0MTSYHq;7BpLU82Dth{VE_OC literal 926 zcma))F;2uV6hv*UM5qW76_r~`Bw9oyDjM#v9qr!0djoF3S%QSL2`nM*BBUIw{G2neQqO zC9-_FvJH69LdZN4m(srG0ZKB4gE!& z{YB8Qtl<+6EBia_Az*YUg@H%@o+^T4vVjcqtL(eNm{Q6LgmxO&`SPDN)OmV}TB1OgPP#32wHOq<|21Kgk&fb`#lo0JAs#}U{gtgP7dGn?%s z@6UI0xpqjYSO+R+28JIXv?-E|e-xvtQHo%xf-PC?XO8V*-3Z%1aQswghCQv(xSW8S m2Yw#%8e!g42g%zYSsU&Pov_lWJgM%!T&mfeI@2>v#`^~#noSn~ literal 0 HcmV?d00001 diff --git a/bitmaps/icon_b.ico b/bitmaps/icon_b.ico new file mode 100644 index 0000000000000000000000000000000000000000..8555e722399adb9da78980d130124039bb93bd45 GIT binary patch literal 1086 zcmcJNzfQw25Ql$hkizDQDHCKuj9ppUJ_U0h1VkRqkCKtGV}}a!o$a_GEexPu^xfI# z`xnbnrG>g~A(K@lJz~3V8TTK!U+_Jd54KS8neCn^7U|9ph?8p$29pzd=eh_9z(yIw0p0zQ+Ud?b&<6q_c8t%c#4K+v)`^-Vw7)R+n z6FyZz&0jj$gwWFJ8QxM$)8FsQW=0tQvh@5LC;VatC;fQ#y4)(-ncQqmEZXneyP2W literal 0 HcmV?d00001 diff --git a/bitmaps/icon_o.ico b/bitmaps/icon_o.ico new file mode 100644 index 0000000000000000000000000000000000000000..e3051fd02f1164aa97f6d9a4726102cc669cb796 GIT binary patch literal 326 zcmchRu?@mN3`H*tL7kG44PYC#z?mc|>7Yjf7YvXJAt9kuC}oN(qEnQ6_y}Ekp7p*Z zyRez=YGpUK?WxKO$pym9>?hVy^H*u(PBjk+8m* zT@H{KO9$S}y_tDCyL$&XWGKrFYC{K{GnQq~_$Sl%%ndY0RD|QtEQLrmK7_C#)3Bl_ zr#PaAyz7x4b&;QC$giJ}-%e0G^raZ&Qj|`L9;EQ7d>2(;k)ax9RW)>DjNK4p2pYUN z!ObafaS7a2z(jy6BJGKLh$e7B(Im{^zUFWr3%F(pCy&H2I&y$c;|QQLBj&)tB4G&} zDptUWf~Ol1(;zN{_f81UqYz%FA-oZ*ICl5Gx-iRP*!KdSiI5oR`AG1fO~V4G>6P+c zEzs)~a}tw(o3C3F?e?w28@HjB`-Qgxtt*K#J`4XT$Fy?sTMb@Fwi?KpP?dHAHM}iJ zS>o0m7qxmSXjkM(+46OR)ioO%%$w>bj{?iqQKZjX+_t2ZG}LpOW{IbXy8CDn3+po1 n;wjfh(iVM@^}3tuT0;^uP}piU%f0OIn9|C=#jlP2pT6^NnbpSS literal 0 HcmV?d00001 diff --git a/bitmaps/icon_ow.ico b/bitmaps/icon_ow.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ba56316a16a8f985b96904d30edc04e86a81312 GIT binary patch literal 1086 zcmc&yJ5Izf6dZ3>N@=K&DA=ul4r(N{oPsNG3*r-S1h_&@KwQvs0gBL3y0pY$2DMuUTykD6PYVCx_9OSMb&q%;9G_x!GO`;*WJh$hl8i-# z=iEx3Hh=mYF-$is9ZZ0o4BV>P4m5G?EF4y5G&}zrN~|Yd2d;k&q#i4ZEF%VQ)?&q(!W&F z+8RY8hh>@q<>pCSKdiHkz4}dC@v{%Dq*BH(6bi4t;x~@Ip5M}0pdQcCYk_S#xv87n el$d()d*8-WWUXB$MozW&w~twuW9#rw|M?#%VSXn7 literal 0 HcmV?d00001 diff --git a/bitmaps/icon_w.bmp b/bitmaps/icon_w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c1a7c03faffdc10dcc9952e9f07504b53924a1ed GIT binary patch literal 190 zcmXZVu?@m76a>(3T%@3I!2nK4NkVX~gUBrUwP7Gs`vzwm_&47^*Xx<&B`1`L l0HuN375J^G({A+IeZ4+@MByds+Kb#5eAcn~=R$kR`2)z*JeIYnPPis8BKro7jQ{vH^?|8svh44G>i*sSpx@&ksUM!2q1~ z?w`)Z0Y)!`35F^SFjdYZNG-$vQ0dcu8_97Qc}L_$GO91Hbj-eBuGTy*c5LQnxw7%S okXuIv$G9x`s-?BDPc}Z2-8^7;gE<|5t_0XBb#5=K@$A2+H&$>wuK)l5 literal 0 HcmV?d00001 diff --git a/bitmaps/icon_whi.ico b/bitmaps/icon_whi.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd7b2dbad95a0c12cb780e9ae290185b29967a7e GIT binary patch literal 1086 zcmc&yJ5Izf5Pc>qr8HDX6l^M>gBl4fr{D_Qg7^d+0d7KE&~pKb&{4Xy#A=5(9`7bw zP(Z_Mo;}a=dvO+UI6&7OK<&x_XWYB)u<%bF-|_51&xl*X@mH*FMy6FnCZgU-GL{vd zdnre@KmQ4=?hZEM`L z6s}6Dwiz!4g_khA`ZHc6X*VlpgZg?~ZWE`=_oi+eWqPa-gxhzff!~NU#SNhd<_|2pnIozn-9XuHCAiGEl6Uae|o4*f`KQ4vn`CufkF7bKM&Tg=s008`Bb6V`Is5P}YCdt%s+T zuZsW1E-*gnoPpy3i{{sK-Ckr|_bc(mm6LJwzioW0`I*%|J*fXpV?WWq?_BEFx%hvr z{*veRA|Ga}%LON*_0US=9Z@LOP)MeQO}NV zFP`JmZ~4(3>pxET+#c)pn6n*MUE@hkvuN?1a`ew!uR8Oa{T^euj^#~LqW!Rhanqmyti%Ovt$8K2v*$TC}8Xs*Xi*nn{-%X!OW zEEvP1{s^89~#l0O8kv}kY-kWZkOnDN2UJMKI!mp z@pO=U%|qUg2Hr;L=rZ%KoF@%Q@AG%GCr-Xg+&BwXM=Ly=5e1CuV1$F^-Fn9z=N|Jh zh#Z&&!Tw|Rw`XC3I{cc1pDDBQ!e7~?E-)SktbZ66zU#mzFcClY!Y%(xytVM-bhL>PH%z+Oyu~U|r&G~)=6~VOJPre&q3|Y^= z6Qw)!OTMiAVR%}t58Y|SGhQ|x%YKn_Tk+VfnFMS6<^SRt9~T}=J@`Id^Q}Mr>HI~l L>SrwZ{6+o&hV2#c literal 0 HcmV?d00001 diff --git a/bitmaps/k108w.bmp b/bitmaps/k108w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fa8e67f49d26797206483bb68357201d2945ee4 GIT binary patch literal 1790 zcmd6n&27Ul427u{Xl`vc$hA|{K=0iohi+hxrXf0jMo4ct7-rw2L=#a97%0*pMCjln zEs1~D+xzk$Ca-wDKo3omB(rDuKOd{!!9t~|DmCP2w(Ijr?(NWa{*2gmG&If(c3hcm zk*Af5aawsYmZ7a*DsqACck5i!vji>POED^Xw%=d*)ar?r*?y%lM#(rkkCi9qp|Ydw zjlCUAnCm@VjsV$@6U+!1+9Vkl$LiCbbNENDpMrB~do%p; zCI(yt!Dbee_TvmWPmhv6f4$#0jV-PpFuvunax0zxg#7onHr`-{gCQau7ZLsw9$l}h zvYr`Y2Tm9#ir+Mzk>tqvMHi1<;jm_DTos;svW!En|DhbWm;U$%G2(Vr&!g#iSMt-WdhRR#rJf1R z5mnzUrqPJtO>e@pGI(OtA3x#(!&Z1sa#$Qz1lOI6PwV=hto~H zGS68&#^TAiBJ|RcQB`=SJXAiABhl)g$>>`6L_QN2ZE_|*H;&i%(DG?Oy>j}(S!H$4 zcJK@yB3)#x0((Bcs%tUyYx_@FIWA n`AS`MT(7#@^ki&)y;}Yk&A;P~ literal 0 HcmV?d00001 diff --git a/bitmaps/k116s.bmp b/bitmaps/k116s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5fce825b28bf656700ae1edd4f7b5e4ad5ad7ff6 GIT binary patch literal 1918 zcmd6nF^=0X5Jjm7SQZJS96+$z96^O)1?h8_4Uj^`CgQ?{n_zvNEoHdaGFOn{3&@=c zL6iT75^ci>QUpPE08)JXL-Lan_386>Ycy7`EEmze z5_YCkSCgLxW@~nM9%$a4nX*q%eN;5*oZoqlW^O!lM$LBnd297Pj{+ENAjr!rwdf(q}&AlLOzm{1eK|j zUEqTJLS>P%&gz*ny`jomRg@Pc^e6JtI@C$v;&{!KUp46Whvq8(q^`sG=+JRj%0JPF z_RsftEM`CP{+XxX{W)xZlP$qZ>RdUs84sWka)W_M!VOhquJn*37TtP2U2md3vvFtQ z1NHvF*e?_?tzcz=;M;m&=LG#c0+>1Qmp!JD3L2ts(>c<44kqw?-H1@|7TrXQ>0g$Q$#@eG&#v$Ah3fe_F5jyMeG~6RAHF;pOie*VuJud znjyxr=8=-9Ps!iD|M(EpzM}nt=T~{U&?)~6|Id&1yaVAw6A?a*jm95He z@?lVTu!-#4FpQ*W;D`>LbLd3I(6e8edFVLU79#(xx^#(KH2_-DRhdqNY59J|R>$U2 z0A0Am&9+ANY$>@ktmJ%l^DQa?_U4&P0d|sx6|EX3rm16dLjJIg3fBBiie&Q4YO(qJ zG(C=T^DQItKt7#kndyZPJ=4V?y<1~pdMx_OJ(ooUqocfHmS7wA&uq4l;&YjpD{Q3} zBeKHFN`yDhgE5G#VoiG5jBQT}fu2*1%W)2B=Nv0rhg!=Gi;ZyOIO%qE!{^GbSj{w$ zOJ(SwW{EA_HWmXa!!*iv-G#-igRw2%<8mr2-5H{FEPOB~I^K`W%o@A0jV}u@zT=Yzq8H7{ev+$>2+s;cg`|_~c;oNywV-5WLFpKH|s* zJL;b0VULXZD@%4IeB74o;5V$)$g}+nnbd4=+SNU<=hz6D)Et{wBAR36E;OvB;^Q8X my`c-ffP+fl_VyM#zP&E4e4ASR{{(mOU z+P7CCq#G$~=bQ0(JTuOI`TFfmBXYp+CpAT}577U3tIsPCK9rOapGqd>FM!QW zGiaDw%nO2VMu8i1WPQc3k|Kr^CRBQi5X1R|2}c4*Td;MhZaqN>U7!)g;$^~EGCIuc zGjx!T1@oh_rDEdIRBWJ^HqE6S_L~q~ELn&BAg*MZr&$gMFO1JOV(4ndH|$-l)%Ys5 zSGF(hMn~9HF^`hLRIx#0uFgR}kWl)Q0-yw}+yu`Uyaa&&E5@uxt?*_CdrEEhPnpA( z6w5SDm|$pSf+F2)Z0XY4lWxp*GsDsY4Vgvz6AkPW-+!^UC7+!p>Ih!s)^e zW@VBoU29kNC=Gtx(c0Xpow8_4_Tc%Ztbb5DWx-IB*)NBeHkb)R_gn4mO7>W=?om`- zX0k|GTeANC*27=T9%TE9ncI6FXJZa8=1z{Y?LlUH&s1b4F&~ViEXOR)&n7Un`E0^w z8(D(P=)8@)qn$4Kqw_8tPR4O7J#Rp37{A}M^h2)4h`Bo*I_PjS;h{-!@J*VIyB7Ct zUTZnq*(?oeG=?Gf0dMlmdJMR&qpnS8y6`@j*U-7NvI+C=!MuYGA1K))IlD9=7}Jb# z>r=$lks;=-#~CvjW6o<6=48;J`_*6aT_Q`47iwjgg@`s2DcEs$#o}>ipW4OK;hGId ziO9tt>v6?QxMEB1$ES8Ui=rZC`Hl;{?2#PO^pwdrlCZGDjZ}Hz?3uhQ`R}|q?{ns}D`_ee4CqYgVI9YU0eb>if?Un%(u6b^!34Ls zIAaD+W2v#<-bd{j|A0lj7Pa<}mlC02i4HnL(@0h0LHASqjcJrmL~& zWZ0Zw>bJ`cFETocHKvmSFt{*_K9-ez)O5+OUCH0M@1yoEYjxntxzvlEk`E!=GN!rK z1mpJ*@XtBaU&I6fb?8c+V&0O$hl4}l$}GT+3~iVh9x{-@clh2?%cHl;(VYkIDnnn^ zE--Amr^@TjWr$*nhJ*h{XqTqffz;u%>w`w CfG;rs literal 0 HcmV?d00001 diff --git a/bitmaps/k21w.bmp b/bitmaps/k21w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ea0ad5080dd86150a5802b768dec65ef492e7015 GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKy@If#WkPX5h@c;jRApQZye;9u-d|;?R!4DWL c7!EKE0A|6t&6`27EU!xItlh8H5-4HraM8!l);@QF~)hUZg0H+%?XZ}@)_XwG9G L{tm@3Hqd+kYK=!u literal 0 HcmV?d00001 diff --git a/bitmaps/k25w.bmp b/bitmaps/k25w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bcc798679ad53fba579ec0d743eac06d3b03a74f GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd*I@If#WkPX5h@c;jR5N-hDhW`zJ80>*qzTpQ0 oKMMW;*cN1N=Y!*?;`;$Nu4u zzXxRD^xyw~fBdk2@Z*cN1N=Y!F);r4b3pRP zANz+8y8h#jKR~gc2V{PHs{d5+gq6|a1S`Xg3mgp*7r1~}$RXlIs=+f`6g-1CS461MLF<9x+=C literal 0 HcmV?d00001 diff --git a/bitmaps/k29w.bmp b/bitmaps/k29w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9bea2c59d44221ba8a8644f82636e0a3b8781463 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q352d@If#WkPX5h@c;jR5dHzj2l#*dV_^L82Mhke t!0_V(14G3F1_p}*3=9&;7$gRg`(cpqt;y_b(KK#9(ZoeE?+dP%{7k literal 0 HcmV?d00001 diff --git a/bitmaps/k33o.bmp b/bitmaps/k33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ef6bd2a4db9b9e06bfe5cf7b5e0fc97e0ba5b902 GIT binary patch literal 326 zcmZwCy$!-J5C!0b6hWe301AtaDTqWt#|%t@%m$3WC>bS@(jqxsBKhaxyO#!(lb%2O z>??e^UCTo2oYzy%aYK{a8D3f}KPM>($gOwlutH?9|CSeeZ`s=fmM+WDedzjU7!5g%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@up#sZW(eKDP!ASo zV6X?%1?&)-{|AIlV2054|G@M=s5%(^=L7qEkiMV%Km0-TCq@T#5dDSGK^R28V07RH z(@YCcY1RNR|BIB4I7t5YBjxuX`j3>3Jc$1POaDKZ{(B!n|FehC|Ld{Sf8?=?qxl;E D_n&A} literal 0 HcmV?d00001 diff --git a/bitmaps/k33w.bmp b/bitmaps/k33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..465875694daeefffbfeb0bbf0621e6b69c2ede76 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dur_#l`GCHj0a12*sf5B~ok{r~^SL+F3@ Q5c+>Tb{eJ*Lmt)N028%bYybcN literal 0 HcmV?d00001 diff --git a/bitmaps/k37o.bmp b/bitmaps/k37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..34b1702c72ed1647b44fbf00ab5f1ba4261c86a7 GIT binary patch literal 358 zcmZ|Lp$@_@5C-5D!~_XQB#LBD0SRbc1C1+U1c5;EC|KTr$C#WX!L*}rKfUWEK*BEj z`|a-1i7i%ZYouoBEK{Z$Yx1H@>;^f#wBv9A;2`ApUxUs4l_s*EqY;-h7Axz;5su=< zIB}0WSE)ds=dZwzF%dPf9yPXK-f+ex^&g$~Dn;r2vz2@8{Za9EXc!MH(q4p9Pioy^ J(J}x3Ki=`+rHKFl literal 0 HcmV?d00001 diff --git a/bitmaps/k37s.bmp b/bitmaps/k37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5ac9acafb0b9eadb8b10c88dd18479f37ed0c7d GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZMN7$N)v4Dw)k z1_pL8ZNvB+Of&z3@C_K!!F>7u$5GTl)&Hwt_zV*N)BnE{ME_(6U;)ve7y_6ofbG)?BM|b@ydsW literal 0 HcmV?d00001 diff --git a/bitmaps/k37w.bmp b/bitmaps/k37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5be036f34fe3e480a4d744837e0359af35172f32 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U|b_#l`GCH9cnm^yTM?BM|bso8a@ literal 0 HcmV?d00001 diff --git a/bitmaps/k40o.bmp b/bitmaps/k40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..52b02a314a34756efe7c74ffb86fe811d04c0b7d GIT binary patch literal 382 zcmajbKMKMy6bA6r#lg{CS5HyJ-7B?&;OYg0Ucm!Mia0rWf?~zdp>9zc`}yT1Vg<#( z%P%i4e@LdYBvR61_M=ur$`>Z2-}BL7-GyraT(Fn%cN;a9`UyKRgB6#!iEAvxTqWWh zrMOW8Kab|aA#BR~8lIQa2hTs!8U__L)U>Q{LCyT_UUGvXtXqjS;?(W8cYVkxy87zw U0d#oR%Od3Gp!wtWN8SJ16St(fF#rGn literal 0 HcmV?d00001 diff --git a/bitmaps/k40s.bmp b/bitmaps/k40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5965e8c0240d1cef03e1c72a1a4b8e91aec61b88 GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhnSk;j3RG{=WfC&tZ@O)9wF1K*XWyVfqXh*y@4$|HU)Z+5_pojsFka2hzV7 zL>Tme^cNs44y6Aum@&u$=@$%23_zy?>1-(N38sHAOljZ;sb>^%0IC1Yreu&0r2qU} kbbdaN{?ESXLp_N8zX<9t7=0JYe+;F+6QB>`kcWgD04AG_kpKVy literal 0 HcmV?d00001 diff --git a/bitmaps/k40w.bmp b/bitmaps/k40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..098cc61167a239bef48e837209f2785bdb3a2ce4 GIT binary patch literal 382 zcmbV|O$vY@5Jt5Y?dk|^J4HtOu2dea?$7~*F5s>f(e#Z!5E29l&!@~ciuS`Og&QsA z=7AKx&_QeI$xvr_5D|mft>1kKrz==BDD112wEF?M6@XfrY*h7ug- z+{-|4lfPfj`EQq2n==dgl=zwF6rQnQiXJmennbvh$RQ#LQK;WPRJPu8=SuGbIdKha z#HDid?7Mqy0CZ))fvtN*p(C>b-t>T)?EA`@vv;4uEPF!?QTD<{2Ed86UKW8J;tC5f z@ibjAb4GhYek%8msC)ALdF(Y(A#feF+6R`bpks>^bm`62#LU~Waqk*$^xt3izW>h$ D#D=_Z literal 0 HcmV?d00001 diff --git a/bitmaps/k45w.bmp b/bitmaps/k45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f6ef58f7cd4c1fe6603a322c97c819f28cb4a8ba GIT binary patch literal 422 zcmaKoF%E+;3`KunU@I#VtX;ZyDpL2}gClf<)ASrUL=V6b7#S$$JEjsKAj;2+{hdVd z^Yw8ErI@BoXAQ8t_J{6r8%{p9B{ z^O>3HY^zn&ME-$z__S6jSP15wPz@0n*8}elQm@LY6 zL+*eJdCWpL_SZW03*eKUd0+PCRt290v$CqeTBES4269wZInupYv97JE5LWN>%TzZ7 y>2Tktxw;~2ILCbrb{Fms`RJNwa^E^^{(TpZDunWp*E#t9{cDBD`yL+e_qX5sAGC7U6aWAK literal 0 HcmV?d00001 diff --git a/bitmaps/k49w.bmp b/bitmaps/k49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..985b67592f8437c3473c49f9803bf6313927d424 GIT binary patch literal 454 zcmb`DF%H5o3`KvaL^gVau8eR2kl1^sdhD^7H~|O95i)kDYW!;=q^gC5Fa12lcI?Qv z_7O1aV&~C(emlSuz2SLq?<_}Cs!E$=g(=MO5onlCKtoR9kyn9@vw?zv vtOc2jA12-_!7nb~m42oFgwvk$RB{wGYL32#C5PJMW8>8BJ4^j$-RizyJGR3W literal 0 HcmV?d00001 diff --git a/bitmaps/k54o.bmp b/bitmaps/k54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f3e9047ab1f9a6d2ac62e28d805d13fcab7e0520 GIT binary patch literal 494 zcma*kF$%&!5CzbQ7AX`wLRwo9ti*u5_fd!>osD?FZvg<;44lPwff zTrzoV{?6_~=8Ib-&6wdmL`_0P(gu65?zPoH#^NwD7KZ-NN#5ilU8=Dav_e<?j9|m~f78g9iq>}Wa;!`_Wt)e+}D$by0@}NGG+H7Nf zDtBsccEfy3Yx5(ndzdcS=gcj0?4x<5slz!*q462#7JWU$u*}r)UR-a~uY#ji!~Xn^ Qd;F!3LVxgU-^c&*1czQf2><{9 literal 0 HcmV?d00001 diff --git a/bitmaps/k54s.bmp b/bitmaps/k54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..287d70bd503a58c58c0023403b3de8b1d1a56f55 GIT binary patch literal 494 zcma*ku}T9$5C-7?TyP5|zQDn?wjzWS!GOK*qTLCn*-Fd2N*-amG>g8%hV*ihW&`W3 z|Lm<@6c_&cIOb+%;co9fD&%v+=Or^OsW2ASys->54LVS`$FHwcHSW_y=wyZG{)&I_nLEO hHT9hfa<3E}Lx->8<7iUF_y0LmrN5Yd>pS{iz5x<`7LNb` literal 0 HcmV?d00001 diff --git a/bitmaps/k54w.bmp b/bitmaps/k54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0923c9b68eeefe48899ca4f179d62342b2529efa GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nY3;e%i%pd1K;!2kdMK^O@B;Guso)Pv<27??ry zACN{M{Q*eZlR!TJs+R|Wg~uLmK6IYG#he(Hj$kI zU$XA$>z$l)b~W(iEd61>5m`6~slvyT582ZH$bF+<$QAv|+K}kaYFX(O&Cz@W1`g08Ah9r@nE#Uqsi;LTVCm;cvHkOv z)6i}t*AeFy+E+Po`Th)C+9HnDaWONBr3Fh&(&xSkhSd@bdhiN1f8YdP2VVsRjO3_B zNKihH0Q$)6^gg3k#zL^4S$ur;^DqA-jqLEA#ZC^)F$D?ChrbKu-{LqYd(`bqzVEN? J!7lrLm2jQgxjp zbt2d&dZ38kbf8H$Gb^{8&8uticr|7@00WG{2%J$oo`4mzR*;its1MgpEIE!N;c}yW z0hv=TGTlp7e8oq;^>2RDw`qUkFOqAqWB>pF literal 0 HcmV?d00001 diff --git a/bitmaps/k64s.bmp b/bitmaps/k64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d257d779e3f64ee2b3c798b115c06baa7e4f091d GIT binary patch literal 574 zcmbV|u};J=42B&l(ScJtuvT%J5!;l;}#E81)&Ur}2#2dnC~ zU4rBPNIBqWRz(UIac`Ez1*k8s`N{Tbob1{S4FV;7&*DouWg;) NGwOq%>RY#$^#SAUE}Z}X literal 0 HcmV?d00001 diff --git a/bitmaps/k72o.bmp b/bitmaps/k72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1e0ad8f0d27a400752db3558308a8e9e666b7d81 GIT binary patch literal 926 zcmb`Fu}T9$5Qg`1MGC=dwYt`a2wAbR@f~~wTS2n~iVUjQZ&ipgX-Nn_ibb7}8K4V;36s}PHn)mldIR;cD1xJL463Ydj}^kY$Un2Y9ikpX~9-m_BI~0P&%JnvlhxedEOEzMQ8+o#%-G zEvh_c^4MSoouBtpembxg5AhU_{z-Z5Zn1PjeP literal 0 HcmV?d00001 diff --git a/bitmaps/k72s.bmp b/bitmaps/k72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2df1e5dd2baeb18c149f02777e9f302f096d88a1 GIT binary patch literal 926 zcmb`FF-yZx6oqdLm_cY(gH{#`rwJocReTPT}Si&xx>G z^}8uI-fwj`(+=PA1g3rGX{2qT&XK=(Uj;ySpFh7$-#D} zJjjGA32 zdoKD6O+wlSJ!=z__Uy*d+RUq~93433vMjk~;ki93@3XaXMVIA*B4r!4<#Ofjjkz^T vT#@*h8PA=ZTW4PIqc$R`!@BrOh9Xpi9KYv_AoGnD; z#Q1-4#~Mo3@C~<&FBspD=j584kt=c{6EOpv-Xaza7xXm%z7aINlXm Mf6Z^@jCFqE2MZHo&j0`b literal 0 HcmV?d00001 diff --git a/bitmaps/k80o.bmp b/bitmaps/k80o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d9bc797b97838fc7144a2765cd935dd371d410e1 GIT binary patch literal 1022 zcmcJNL2AP=5Jlyt5K0$bX9SDIOW!ggj#t`KTG8md7`|vSTj@J85hkdGc`NqMqVrF3uAB2zflJh>%LRxM)`v} z&&r-Ud9T0F@!WgPf6uTe0<+MMcMFl>+L4DB)HCx1ImpVGiCFU4E%<;=IFSwW8|4GJ zQSQiAIgqK&0LQ`(>@*+212|ahS%5`ZGWQ;d%pGbJKJ7+6z(>kEk>gQylE>s#>oz#U zfLioZx9SHzW8FF&HTe%VSR57nDV^^dJix6ieZQ8P98B%|)})@`F8Ds(3G__FqvPmZ qV%93W!(T7FfuF+3b6(%pW1hV#Yj}pg=KXZkyyV~3qDt}h6Mq3eh`z%B literal 0 HcmV?d00001 diff --git a/bitmaps/k80s.bmp b/bitmaps/k80s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e5848e4a887f86ae335dc0bd6026a6c0107c6adc GIT binary patch literal 1022 zcmcK2F-yZh7zW@k2HL^W3@!}>yE@jbT@1Jj{sh54P|4CQDGpgg*9`qJ5y5WtFQhnR zjksh8Ip6p0YB~riXyDQ(*Sq)o(%$(+>x#b4a6iGgw8Ifc&*%95=+KM<%y95hN^#gr zKmWT;6@4#6`lv^@Y$rCZXwNvOUE?+VYK=vnb*>Ue*){oCsoF7X66DIKvDZ3f&ep6+ znPa_V&eHDvK~BOPo4M~}&M$OM8y0xSCgwXf5%V`8T^FHJO@B3kaz~>moz5wfbaDxu$ehB9xBiOZ`A@?gssIBL*m)3jX zvNT35=lL4FvesPO`oj zFv?;kjXD+vQ!kbu;MshF>$n(LJz2hkqdCB0X4qKa-AZXOBJWm~Xdv3l{{OvwKX3N^ zM`B^okE$ai3c}H5pQ#s4RNqOVQ8?Q>)Dt556$|!%IO@q*^WGDVRokERB&}YCm-D#4 PeO>RZwb0qx^EW>M1n}cd literal 0 HcmV?d00001 diff --git a/bitmaps/k87o.bmp b/bitmaps/k87o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..929fa117597c0d5604c106f985fcb9a8e869eef7 GIT binary patch literal 1106 zcmb`GzfQw25XK#Xlz|~2F|cK2WbA|`b`};MfY&HEh#?D7Uny0GyhckNfOPX<`S|X9 zO+$r*_+#nZUoM~TbI$I~?cK4FagF&Baj%h?O!DV=|9Fz(2pJ9@M8u&Z{woirL|v&F zU}cqCaGp3qF&HPB0Xb?*;We}rChV12Qzw4I+O=7TzUP{SGJ82?RIjKLP3yR3k+=Z2 z%1{g@aaUt)p7fmuTV*(vTBpNO`i5(k#9X{k8eWDuUWnI~0|$%pCJPqqop{9xJdk)% z3EqeiQ3GBnufUCR4_+v5!PNo3;MqqLEq)IgD-wq4lTv PAJ>1M?2U1^=U?&%V`D0_ literal 0 HcmV?d00001 diff --git a/bitmaps/k87s.bmp b/bitmaps/k87s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a0131481cda40682f19b45d299c95a0a4d3ee8d8 GIT binary patch literal 1106 zcmb`_v2NQi5C-5=RDeSOGX*jl_L@h~V1z*SE?x2fc>#|aoY;YeECKRL)TGy7(cM)y z4hAp(9cjx$mIM(%;nRt{JCVBk_4^0ub&LBA#(fzTRT{s>`^U>XE)bC+7cEM^0y6$0%q640>O+1qZ&_+m<7R4hxN55E4>nA#_ z;0kWxhRFU5L{0YWYVxAN*_8OaS)aVxwCaRB?M7}n|F}oNwbre}-tGu>(VOW9FzbBsDbQVx@65s5(BxIwq76y@D1wGgJJdYM~Mo=Lt3LW zD14w~l6vCq{o@&GZ(O(Zy?cQ|)AHJ*2f#}W-So`1sk=i3}t$XM7?Rg1c$0^Vn{P-Akg(-Ykk zX6xJKd}>svbr#DpcA%cER{Q82jHk>Ct?A!&Xg8DbYU_HGW zw*%}`djLyNV51XwjxYv$+zA3MEu!FCW(lH)!rF?CmA9h%%6rib7=x?sM7Nbkf$x$( zeq+prar~qF%cG0sny$ivZlw*Va3)c6`GGwy;1Mh!+D(f8-T^b^yYYv_P z&sQ^(QM>HZ6WI$Vt=kpdD_5CWQNKWbP9bVDe^⁢hplXa2N3DRJfIXA*ry|5novA zOvNYCLZqKreJ*_C89R?Yi)Xy?j5nU~|DKKZ9J4+B#UZ~~W&J2fGGaA~8!mSLBB8@x&Nwk12VjH!zCwh8UPa>Njv!ze6E=mh;6nee}{ zN*|o_ZNMB7(b75iV?MZ68|R=1X4?}x$G8Z3MiwkSpM{7r0y?6;)4g!>eC5OW%6pvI ioa52X%mKG~=G0z!>fWAl=MkmPfAMSTs{8E!#{35=D;#YA literal 0 HcmV?d00001 diff --git a/bitmaps/k95w.bmp b/bitmaps/k95w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..15a98c86a34c24998faa0ff5152dc4d80cf6d34c GIT binary patch literal 1202 zcmcJNu@S;B3`KtkM>-gRmMP$lo*7tzKADLLJOl$|1WF1{;!BRefukb$PT}QS$nuZ& zhw~i1wtQ|F#~~_IuAjJnS>~8gv9P787O^CNzdy5}vT|Oh1Db(vc5a*XWV~_~L;DBw zJq6fJ$ycwRYyOef*7H#RgZtcr>nU?%`CaDPI3tY^&6ZFg-v=G7ggrD!;wWG(+DFc6 z%qjFn;wYdVbEKe>Xn|ito-F{Aaan)FT{Q95TMC{1m)wWW`_l3Sz+L*l@!_a*m;Ueq zTY!qX&wLfQ&)0^m$-jkK+H+R5nA;I|^(&|3WTS2Mxq41>@NM_vdpkXsJ$&O|&b5x? HE)(+uFFB_8 literal 0 HcmV?d00001 diff --git a/bitmaps/l49o.bmp b/bitmaps/l49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4a830075c1468e07d91194f196c3618e0a58afc5 GIT binary patch literal 454 zcma*ju?@m75Cu?Y0T_XnmIbgx&q^F6TVxbBh}I*xOz9#;uoC<5`Nt>;4VLbn{`n+J zzFc38D(9U0G1qCXM&aU-dG1hUac<14a^-Vhm^AXgP6zA<3;PasJ+uL~6V!?1z1+1p zF|}e~vf{|(#mMBAruW`RPE186BFR6R8<)9BYh6UH`Vo2SFkoICJ@VG*FyERC=Jo%W KkiYVrSAGES1}#AV literal 0 HcmV?d00001 diff --git a/bitmaps/l49s.bmp b/bitmaps/l49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9dbea2668c9abda4c5f3ed156dc64aa01e3db653 GIT binary patch literal 454 zcma*jJr2S!3(^}lYD*RP|y4DS2jK8mY%Xn?9VU{*KKq^_W` wH}=CeELPt@CWETh|478PuV;Otk1+bnM*m^FD;w|5=6~breSA&-ElcV10~~V-NdN!< literal 0 HcmV?d00001 diff --git a/bitmaps/l49w.bmp b/bitmaps/l49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da13b661e8309336dab5bf61d6ec964a26d2ab5d GIT binary patch literal 454 zcma*ju?>ST5Czb0rAP-O(57VpkmxfLDKl1zh&eI>B?ZFV@%ac{QpD2tli_5a-Q9_16Sa literal 0 HcmV?d00001 diff --git a/bitmaps/l72o.bmp b/bitmaps/l72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..130cbfd166bf08b3c5ffb57d394665d71eda3158 GIT binary patch literal 926 zcmbu-F>1sx5Cu>z>2n1`s+?jCsnX;QfgD7+!CoN5X9)zBRC|K3g$mckg>BIK=Sw@9 zOd*pZ2ARkAXyn0uczVBa`P%b-&-Ey4=XN=N=JU_n>&k)L064De#jFq&f24c@uZ#B1u_nKqB;Ww5@PgsAO{A7FmExAX;e~Ke#ZOzdKng^NmT`7d5~r58{gu~l>g&E>qzHo&a!t;(z-|4 zxCdFed#T-5socT-VyP2zmujA+i5plx!EN#gV*|?v7#o;-7#n;ve_!%gYoFI=Psno( zTo0RTW-DsT|5bEo;%Qp_8mK4StCG35Z0>)_d|qrm(~|iPu$Asf(R{DizueUaT9taG N>?h^y80YW5`334X2pIqX literal 0 HcmV?d00001 diff --git a/bitmaps/l72w.bmp b/bitmaps/l72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6914cb1cb887006002902bfbcb073fe29555c85e GIT binary patch literal 926 zcmbu-yA8rH5C-6jQqaK&X_RRujaqP8I%?sQX&u~*b!Po#%bwtDl$pa!b_-LN*nb&7?4W7AXcC2bW zm+L_Hz~;O1%y-M?`}fT6#pXBl%zuEb^iN##zheLLS09R&-ddIYq&z#O*ZJT40`J8D AdjJ3c literal 0 HcmV?d00001 diff --git a/bitmaps/m129o.bmp b/bitmaps/m129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..243ef28e92edeef9ca2a500d28011134f968003f GIT binary patch literal 2642 zcmd6oJuz zTJa6|);O6X^GK#?MHPrK!aQZ%^)W=Yax~~vAKAJ$ovhu`%hHU!>D}lSD@Q)xjNSPz zGrU0V#@=+W_WHOPvw?RuWy}_ZN!e^{wvnRH8e2N#=0rQZ&j{A?=mgP0V$7Blc9jxq z5C>^$#taR0vN(^9W{uIK?^lc|Ckx#&Dau&NH`hb4-9=BGjtUQZeBquz60_K>s);c| zi|*9(x@>m&T0e5MJNC!gk)x9B#qKIxft^K>vOh^Y6(EHbNhVpd_%YA0sZ#D#_=hVt=V z;!!Xjqo)jpsHbL=Jvby&_kWM+9lZG9`Mdh9vB$NwJdpfLH9+#zgNd_#2#l<#J@$x9 z4`8YbZVOqlm)LW#a?ianCy=xjXD9#{takot=d^k+H3MXm`LLbUiNmj~6Hbh#aWedy zB>t;XeBvGMAR6Rg{1Dk^=w#C2`=@Fdn?>3yTc!Y2%3)77=e2q{^TXy;Ez_%h+go^1 zIqeDlIuC5MY;zw~z4&h|^tzZ@77Mu&(RNR4%hGG|*6pPF%#dez`aFs-_$Tbq}1-zme zB;#S`AN%D!ORMb=mi*+;|Ja`S?d09Z{IWw^%lD1+FQqTK1?Kmne}85Dh0JKz#?0C; zEn@DU^B&oBT`1@ODD0l#on=T>e~yn${B!)!#JBv|=q*#DQ^3TSZ}P^z)R*0yxn(Ob z)_A@{{Dp@p%Wmf>r=H`CS8NHD_1(ahka6lB*b*|1-8FNs8^oabp6H4#ffIO0o4|0? z_?X{%hGWLNyej-6Qd-+3OUe6Oohkn{J@@1>kDXY$#P`myKSPx&YF z5`4gVP4&P|zPDgaHHJBpyRfF3SIS$&BlWHF5==7UbHh=21w92BlE1JH)$nXOyw1u} znEw8p=u^h!%cS0;>bQJmXAJKr4DV$T6@6rH@hCv_*m5wPSeodkmSu^aPrppx7f#=F zftqT1`WnEum9HFlTX|!=8o5_p>?rGRjOB~-@)|7V7WPYxS4&Ozs8Gr=hJi@GFqX^f zsrpVvdi#}OpxkEVK_|rR%I7oxVR9qKPfY4g)oJsYcp+HMOE<6SB-K==yrj-GtXSeH zy~leQnXYk1Bge-%9|#qX`gYE-Pam*-*+063Y-)TA^3>4apZ+_{__w{mF+Ypduf_jY F{1?dZGd%zR literal 0 HcmV?d00001 diff --git a/bitmaps/n108s.bmp b/bitmaps/n108s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..62691df6866501f1fb03d7e7598d616fa7a8da02 GIT binary patch literal 1790 zcmd7RKaSKe6bA6;jYJAS<^Zb=C5J!>qUR2C018TqMahbSk|S^xqb<0G5f?CBkfJf) z`(tNfA+Z(0l1KB)=W(9jB(L9`ACZg^pD!@q+H~aPdO-f+vCb=8;mITC%yS<}uKjZd zsfK8>`!5gkb+i6ujs0$H zhYc|OH(4*{_sV|~YcK!g&yw4pPc+D}t=CJn_8Pt!WWDw}5RGO;M6Vj3`0>;A0Wn=T zn%`S4#P3>9gX&DZU=JlXtdYzCwv3yznVAmeeu(UbN{i}NA}Pc_u?C0EftN` zo%nXJ{OrW*R7~7bmv&#nU7Rh~2KFHz?C+`*^PFK(Ic literal 0 HcmV?d00001 diff --git a/bitmaps/n108w.bmp b/bitmaps/n108w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..248dff02dde4fb986dbc3a1ee1590fea6f7a2b6d GIT binary patch literal 1790 zcmd6n%}vBG5QQBqksB$&SE?Y0JDqT#1E;hUK>;Zt#~?)+-u&ffq}5&!VkBGp`AwWR zV`tyqx5p&$g83Qa!$y-DSs$T)J?VJB3J(q<;&H?*Yk$t8xJjwn`v>FlOYHmme)o6^ z?~e>y624#LCFqe?(|fCL3rvv*UGRL0Jf8Kf&~)atBQvPauPvD&<&?<`39n!?Bs`}E z*F>VSU+hh0KzPKt5hjFlZw7>il-!WB8*+9-#QP&Zn?dKs3_7Q(hIj7OuwDNo2xm8TPzgQa&ZbC&0Y^TEEC2)U(?Xu!lsvl?k zt%*Ooys&FLax-wcSH|m2pF}S^YXj@fdINx#FAYF-&Z3vVjF!KoSDf9MKiM2Y{Vr*~ oaF9Y|C#8*-$X@Z)Acvcn*Xo(2U2H7CjbBd literal 0 HcmV?d00001 diff --git a/bitmaps/n116o.bmp b/bitmaps/n116o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..61e037de94f10cb9ddc8047ef8d14e10b9aa3353 GIT binary patch literal 1918 zcmdUuy^hmB6oqXfkpgKgI*L`MrChqLGKe1WEJ&2VBnna}R`?Nkl|+k_a$mu#6x%x8 zAgnpuKYPa(Qd)MTvF_({=la~4@w@k5=Y@)d^2$J6sDKVv`>Yd zMM)fm;V1-|L{yem$t0rZd_5cXXDqEUx2kgp_R|K*m$S*3L(v=6BQrl5T0->)-YIv% z^!$Xl;rzZd?1qTQ+6|DXL_wn?WLsc zd#c~D!iR2rkPg9BxPQCsbX$y%6v*itYdJbyW4-Lr^&CG_M0cp??wUi|P0LU8!~8@! zFzAP=JK7D?Q9loL;~v?q!uKL%ybCMc1Mv&D^D9YL|8O^6Q91dGF)y7P>DPYYAw%k= mtMFsQCBB7RpW)YtE5151biErhyj(Xc&25Czat6odg{L@8aFZAu*=SOw{Gha4hB3df?6BBigABgk-(Ysl~g&8TkmBmg*RvpOJA8gb|DJm#6@UMX_|JFVU*Q+))>PH{L7QHL zXD<&0dOg!K-EQ*dwX5Phe>LU!Q@->2FZo;FZ{l0)CjP*Q3CsLCxNmcPIzH-piTeia z?F-u53ogD=FR=I=$G}=~Qcd(V?|+FiF&tQ=_k!vhi(~E%-)QbxhNvvSJ;}H1!2C(t z#s-PFM`?o>6s~N(QI2abs937(zl^tbaFdO9|FD7vxLMpC`VmS6eSMb-k6Rr z>k>C|c+NLROD}$(neQiCV}7QWc!$3*o1HJ5$Ud!HY3doy`Lzx!jr#M<{ UoF7;JHqP|%1^6!c<)@eD|F4xpBLDyZ literal 0 HcmV?d00001 diff --git a/bitmaps/n116w.bmp b/bitmaps/n116w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a6299b1bd8db2936ebfe298122d1e3e93d9c41a1 GIT binary patch literal 1918 zcmd6mK~4iP3`H|^F&ot32HCRY1Po%&U0ARt;bw!l0tc8QlwGAFjO}lyGp;H&EE*|Q z-h3zicGAbE*FNdE=ighNFE+c>>GucLKew1y{6(e=B9gfnyNlpG?4^$2XJ?$s|FEC$ z=l#XsA%Enbphu>lpK!GRtB)pQtN(=OpnHQn-V1Ve!{85cgWxxQ1{mN?- zN`+=+y&pb%Tr%g*e2xs&d6@}@oCks-DKxNYS$S8mV_!=aCWPeP29jc$@9(pS<@(}dM+4QPr zrCiO|8WOn#os1{!=W?+B40AcqXT-DJ6|+6CH8eY01B2Qs?y{ Nu%Y>P^7<~Be*r5q@5TTC literal 0 HcmV?d00001 diff --git a/bitmaps/n129o.bmp b/bitmaps/n129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..857a82fe46a4ee18a38e641942c274623bf0925e GIT binary patch literal 2642 zcmds&&#Kih5XMsr7F0YN*T$twpTL59H@=9zfV8DTm-i9wtF(0CW7y)tZN!BIL&y1- zq`9ZUbteYW!};}_Nxqq;ee?F+Bg5l0USHzubQY#y{tWMbd@S<;5}GssfMzyY;r~7( z13WCW_)8n!1>m*(duG+LKg8abU9Mx{zN|Wl9Zpz(!sZh;ov`(UEho%10uMESP1#n( zn!;9#?#R5oX1f;Qr~@^eF*TPlHJ2E=P;-fm0BR($wgEK~*=Xvp>B!6z3%Y4{5pUi+ zwV<00Y%>qhg={)7_q;+NT?%YzdUPR10$X857qaQVCYTV&rURQ{Mc}xAi$2fD(1jRD z>^qiTsvp_sU+BWu6dYMkF2vk{K?%EMT`hj+4xm#uDw~jvjT9lU6&dE?ZbpXAu$DRd z2H*=R7IuNpB|A0EK6hbXPPU&ts|IqIP7!8i0k(j6n;yl(pG zYe&^fY+Anhy5*!%H@VWkGIge#x6(_N6w6G~#n|2zn}$XC?yTE3Qg_0!F0iYM#QN|aKj?-N_66XEa?uF+?&viTj;lY+t;<2%y{NHCB zs92K%-V(3^JnKJa&4F+Gb-$i37ze=C{Uz4RYTNaWSUk`jvB7jjZsQ}_WV)ix^DkH` zbSdjLEGXQt{(!|(Hl&mjS$$)daw041{fI_yRR4Co;F%UrZa^2{B_6UDQcF zlQTBbO_fs5x`hpN{DT-}_=%C0zQNu*kI zw|oWm3;}X{)oAN^%#3w;4`x2=G8>q+^1U97U4!X)TGD;Oc8`dIShvp)MaBJGWalvMX`La3r&@vhxkogoU-H(}bU**f=iPHy2^UmV~+G zS$D_+wq&c(Hq!+mC+xMt2JJ9iZ>--lF8!k8Qv~yOB@4=MpB9}Q3@zWvqUdIn)L3kk zO(@^OYGH0{3swoM2465IWvyeu2Kq#>rtemr+*5=cfNT$K5_N9J+{|g1P8(NE9I~-l z_GktU*;t|u+jgu)bQacl)#ka2~@}q>Zu;@lyIN5e(*y57fjc)|Q#(SpA zExtX=)U{wANOve=p^y0IPz!M3Up)Tc`HkMLHmh`@O!)xbVqzqp7_??uY44-ewDxwT&>|!=9V)52^(i+PO zvZS@2nYodQxsi&wk&5ljT*Y=~t}lN1j3!`d(8{T9f(|#sbHYt#%;nnKfHlg7N|y$X zVMDyC(~kdMv39{qpEZS1i7hNGn3WM<9@E+c2h`%GGsdMd~VM1?dAe zR7{H`$J!aPO7lUOVSx1`R%wv?;n6SQRFV%BB;T))(1`~sf~^4Odv{K8kdCSbec zR@WXScaG-sWZi#lS$`@QQ0s=1W<19p=)7SsL{f|TjMspD5WTU6hvib<%KYEiH)^(x AdjJ3c literal 0 HcmV?d00001 diff --git a/bitmaps/n21o.bmp b/bitmaps/n21o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ae7a73d03627203538e50f939234607e25facfd GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKIxgnSd$Od5$`2YVu5dQ$Q68nwm-peasCO06ZcOr-1EP|aDM#^hWF=ZFg$-hgW>ag3x-esEEsG|c++etH0EiW5FdSgq!SFy3h=q4Bd||F&_`+7f@SEoc!_SF77=Ew=u{@ByA7T~& DC*vB5)20vBp4nrK=20!3kDGW!BD~Q3rPNC{=x7=9!T$pm<0eF&L`3U literal 0 HcmV?d00001 diff --git a/bitmaps/n25o.bmp b/bitmaps/n25o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9ebffd697e5b9b1c4caa64fe94cfa0be5932f91c GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2seN+17pMg`kxTIA4mi7 z&-*_c9=`wCaO?ZehV#{*8;*B>Zg~G0h<|@>`2PDj82|YHzTs#6`G!CB^Bew_+c*51 Q@W0_-I1s;wnhP`^03J0{A^-pY literal 0 HcmV?d00001 diff --git a/bitmaps/n25s.bmp b/bitmaps/n25s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c4f4ab5e4b59f0e5985031d5295e13d010433bc6 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2seN+17pK~Fy?Le-vGo1 zcpH8`;B9#LfV1Ji2g!yD719kiB%~W2FbD&&al;1|^M(%$>J7gc@*93N_&5A*nBVZ{ UxP8MvhW`!!+=2K#)LfwX0Mcqd#sB~S literal 0 HcmV?d00001 diff --git a/bitmaps/n25w.bmp b/bitmaps/n25w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..493f9b581cec7fff8ee37b20f0e214cf3262fd08 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd*I@If#WkPX5h@c;jR5N-ft2F8Z}Fx&uS1M$xT zj13PTFg6_c0K^r{4F@=w8y+w~@COF=1`z(izz@cM7~~uNFxWTzWBA|j&mD;0L(K)6 F4*+$CJK+ET literal 0 HcmV?d00001 diff --git a/bitmaps/n29o.bmp b/bitmaps/n29o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5b787835eba6f2328fcd40f2a990c5094d0303ae GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>*a%1_q1&_5UGwKajo; z#P9!GJpBIO;@0>773Zt}RUF^@uj2mQe--ba0`bp3KfeEk;9q}#{`mF(_m98!pMU)Q b|NO^4`}05kov{D$Z}tBl|B8Y5JHj3S|7B*cN1_q1&4GcT}H!$w_ ze*lOd0PzRL9Up!$?s!zexZ{Nl>qm@7UofH2dKAB=22elW27_|w1(#GF6= eB?$lc$Dsb>zv1~G{~6?e{1*h8ZwSQI2zvloFi|xC literal 0 HcmV?d00001 diff --git a/bitmaps/n29w.bmp b/bitmaps/n29w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d075211ce38539aa501d533134fd6f4b8c526019 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q352d@If#WkPX5h@c;jR5dHzj3=9_kVYmUvJ^;iI z7%U!sV6ZswfuZ6+1rXZ+u?$1S0~R1=VEFL?ihnRL{`kSb{NoQ8v;X+Vzz@XsKmIBI N|M9OFh`%H30RVZ5N_hYP literal 0 HcmV?d00001 diff --git a/bitmaps/n33o.bmp b/bitmaps/n33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..267792296adf8ac2bf238babaed4d1d2fcf3de92 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@uu3es-{yB(#{T@nx-Vf$~{|lx6*`Ei=|Ng%pO5X?5 zfB)Z~4-$vb|MuUv2l4;y{|~1B`~Ry4@&DKV`46Vo|Af$s(;@U`c?i9_9zxH-;ZLal E0o2Wj3jhEB literal 0 HcmV?d00001 diff --git a/bitmaps/n33s.bmp b/bitmaps/n33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..85d2f83f9e83119f5d02bc4ed026d41f05c49896 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@up#sT24*lHK}&=A z4;WDC4^aLO2>qdkK^Ua&fgOW5n3iWS2hmUXp)`8~nE!#XK^-Lifq@|(ME`)(4*nqi z9|nf|PG;x^%*X(d-~dur_#l`GCypwZV3!JHM5vhiCXj^ODs5jB2 zqAd$U_uEm$ev&Gt`WwBw+{cl1SR_=}Kt~)8$p+}FGj&4xH8$)NE4GINTcBjGCTAaW Tc~@n`dn!J2@umLz2krj=;)i!^ literal 0 HcmV?d00001 diff --git a/bitmaps/n37w.bmp b/bitmaps/n37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..89d157e4370f4148bfed0a1ed62e15a1141ad396 GIT binary patch literal 358 zcmZ{gF%H5o3`K1ive6@Ss?<|Z#LhK10~5`_%$48}9H2+&$bbmn{*F|Ti1hRPZO2No zKO9wjZL#-I7gAxN2Ob-0g__A$DaBNtjK4XFoGky#Ir5b_?0v7`nVfMMlw@jyO{Pyl xz0=E1tq_hrnG`wl4k`j9)@kUL@Ze42{Q z=7O5;ySTuOtdm-NIJIh=ct5aXXS zBQ7z?nQu=1xg^sc&J<*HIk!Ga!3I4NRBaWQn=(UdZHlw3|C<9PlheAhW4r@jK3xBj zmr5Qj#CtPF$a8ruL7Qd+>($FJVSiIjOr_7!z{u=J87Io;oIVa*^BEOU{nneCeh2Fw kMP|?&_~Hr`F-G7Vi|KMJW(dV(ZU5oyOpms|IDh`@3Al=Qr2qf` literal 0 HcmV?d00001 diff --git a/bitmaps/n40w.bmp b/bitmaps/n40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..84eeea199a6ed03ef7745b1066f50c92342c78a3 GIT binary patch literal 382 zcmZwDKMukm6bA4Q8Q5fX>*^7l)VO;k+pWiHZ{XqqYCM393{CO#MMP360x6X#|`pnYg%q)&DDK< E0CHb%8vpfj07U5u-fChi`=-6ObYZ=#zQa9}XTBX|J~BZClPNGJyA?|XgK zfK47Bf8QJ0E|$kYxizEjh-&OBP|{cv+rCtfdR)8!Z~>+J?^@Hql=d6yx3xZhg_i!$ ztIv^m%Ycni<;1{}Caj#<+52c*POX?=2U{wYV2_$Kh_zTbE7WLcpQiC{NypJSWje;s ym~#m2JOMY(7w;K3aJ~a`HiFe`MmJ`QCU=_EKpe{Z6sh=niYD*A8$FMk|MLTG0`=_x literal 0 HcmV?d00001 diff --git a/bitmaps/n45s.bmp b/bitmaps/n45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..67752a18bcd01cdb4ab05ddf713efe9019ab4950 GIT binary patch literal 422 zcmZ|LF%E(-6b9hG5@m2;bTX_i#v7<{aqK*(jDv&c@ET$~fL9=L0SJQ(g!;d} z4r*e<>&N@sgwn<8V&KM<^N2O}WuOZivg>PgxF#jTS}SF3?cTp_xM9njnonEb(?D|j zYvS`%ePqr$DiH8H#jXPLg71!8rs_fy=|GFPig{dbQ(e*+9! Bq~ZVo literal 0 HcmV?d00001 diff --git a/bitmaps/n45w.bmp b/bitmaps/n45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e200f895b5cfe06c313626fa2f7ec36fb0806d88 GIT binary patch literal 422 zcmZ|LyA8rH5C-7ixJZXLfR=`y3M6{=U<4}2G|Z6=Xc)kV1&k<2fjI7EM3As_{&GG$ zwr;&S2IyGwJmZ*q1Xy9qoW~X;u1UxsA_<~izlT0~!-Cg;effHoJpb6*IqJ+)26jN7 zidq`JjPo4bz!yl4>Yg`CK2ZxAH>zAh;7OkKtvpA5DbJ|NRn!92Y7rt%f;F+>Env%Mz}ixf7>5{}#{d*1Iq zv#StH7G^(YXP6sqI@|V)o-yw?#wbV6q{1he_fx#ECLsra1dn^RWy65)SC$Wd*yZ=T zu&EC|yZ>z&fZ)vey#Y#Rnq^eOnjc^ub{r&j97IpB7JFxoC_D=GBV;Qz;_Bg@iRe5g z&TxtqImN=NzN5?@wn(|U1TK=VfhewkO5AX5k?WV)Lge~ZtkLTKio-9pS-d7cpw@Nr N`zP7NByX+%;|+>;Dfs{Z literal 0 HcmV?d00001 diff --git a/bitmaps/n49s.bmp b/bitmaps/n49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7a5200bb4e97caa7460ee2085bff7df371d144de GIT binary patch literal 454 zcmZwDu?_)25C-7??t(%>sio81sdR|mGk64rMkBYSx4I4DHR!ab+r)AH*&PXClezD9 zc6Kt^`QjA8uL-|H#z-SVIM|VGJ4DPg30ZYrOK_QApDbuG|LIujnE%q~{;k#hMJ#D zD^X*~bKew?KttREUGV_4MQhL#Iex01#S%#&I@|H@Rb^|h<8`0U^58~w;a%^K|L@DJ GuUB7a9>ezl literal 0 HcmV?d00001 diff --git a/bitmaps/n49w.bmp b/bitmaps/n49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f3f731128578a8b37c0426f64d851d824ceb0c68 GIT binary patch literal 454 zcmZ|LJq`jP5Cz~titXGZ(As(dP3*mcH(5%LwUw=n2jB>7C5c9SZwBK(+2P9oJ51PY z4^DKfFfS0x7EWwq4^DH78TJ?)wN?g3{Pv0iJ=SUW!&_T_SX+)-dcKbD9+TE9eO7Z< z)Z}pi?nw@XsGyKKhy>=C@MSKlUM=FHtfQcc$~Kv^9T}doE#_){F^V|m(0|x5AJIlL e(1bD+?dy9L{APJDclM4so6}^TFD7O^_s2W*Z?)I} literal 0 HcmV?d00001 diff --git a/bitmaps/n54o.bmp b/bitmaps/n54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..738c72b0da548dbc3e4f9bcf07fc654e04b742cd GIT binary patch literal 494 zcma*iF>1pw6b4|W1Uhu^&^=na7c!M7bT7F=?$9+w1rJ>cK7y~%BNQ@tXu(&gF~nPN z>O}>iKmU_7bSd<~?~kV^$>{#!I8(7!{N6CjoS904H}Z6qa>1EI3V?*=|KT%F?6^<7 zqcxBHw#t2*ZL&kQ&z`a_dGZ#H_o!gtcFND8MfYWE@#ouA(Oca_bv0n*x^8-mUb(uP zL=X2Ewc%O}79~1ruoq!4L^XQs*;kmNEiKtM^o1VirD%Xc)CfB1#lC0 z@4W~`5DdJ2{LM>9+S|Ji2OTY+*Q}dd4mR;jp3bdKI430|r6k1>|KY$DJN7L+%eh`U z0-ApeIZwZwEq_K6N1%;}>jZ2f=8Jw%t8P@s#tc4a4n@G0efMs{Bi8{B*|o^s0Pd}R z@qWMxX64?P2b{Wh%3~I<3lBiKXFiN5y%^vdv+ih^un~EkZ7*KAkm$TCU&L7ZLOf#S aP4xO6rGDpFdGj*cHkSKNmER%#fA|eTA;_`NGY)};vaT+qs2UW_+fAT*}?Mc-SVhDqAC+? z1v|-(5<2El8nfy(`#~*XMBib-h)d4qhH^D=FS#mnwtyWn?cXes2jp3Ax%#j{<}rfF j?}y_!ij5Q$8}Me(=ga(^VBvxYR=z_z+q4$4ibcwMguKdvV9NLg<~&H+Y_4#H zWk0`}+kll>nENq%JF|ao?k6Xej%$7|8CNAn)kx<*$kX`{va~F(07%I21ONHV$}!g+ zT(D%${9se^RdHGDihVH@BW1skoS3U@f!fD27%_OqhPCg%EF00@Y{k86I%H~>J+h%~ z5QB}6;t%qL$nGyl)+eA<9fHVR0;2QWC8`S~wV^xSfAz}N zqP$)B34|=XTUuwe%6=l)^6q`<8xNc1wG} zYyNX!erGQK94(j0M5ad>k@sr3OwwF+ee*mH2%MKdU!?TDn4qsx9`LAg)iq+Lu2ilL z#AI%gR6V}RzhIMv$8p#$N{0<(y2A5hn)mk~YW#yX_R(jO^GF#o-+4AMXRrBX27Ai30m8!T< znmAu*$ZDL`V0vsAG4D*ea*kaOCK1;1?yYeF-_gm>(25=8PxkY*bm4%n0g7hl6bExV?~M`e$_J?4&)v@JZy` zk-L%oFUBzJOMChumm672(J6*C^m_JfX6Z1FKAkogM;~u$jA2}32$wB}u-+!GKE$e5 z<|KMYo-Q?Oj9#loow0+Gvu3cd%R{<5eMod~jGwjyxy42+iD&-sEcKK7q_N zlX_}6DsqMniY@Z!np&WSXeTaW_R_J$5$Qe!j!UnLD{p+84xhA~;!Zp+LgvHEz}xqn NsxmjCwh#Dod;?tvv_1d; literal 0 HcmV?d00001 diff --git a/bitmaps/n64s.bmp b/bitmaps/n64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e0a25e161bc3c309729de2efc6c320fda3408efc GIT binary patch literal 574 zcmbW!Jx;_x3r~c>y&^rmk40KM=^F^IoH`!=g4(wbs4F}PC%R#E4TZt1mFgd8}HCnF% zwg`_0egO^Ye;x5H5`a5(1}>}SGat8VKXR=eMxc446W8zQV?K7=>RKZ4f@`Q7U=qmYoEJOEx1IB) zKZse+^+X@sg9PqqJbxUk>s7xl0M!4qS(PL3jW0jnbMgGTBRs~)O~jH5nNZSXl&FQ$ zDp3W~BAv5ULB@>=l0li7R6%7@GTDuljZ;YefElc+#!QL?pg5;bHa_m2Ens7A>^$c8 sY~vb}#~HBkQOR=F2xYASKDP#vQ^Cflt{ie@sk}}W;x<>_pOwF@Z}Das_y7O^ literal 0 HcmV?d00001 diff --git a/bitmaps/n72o.bmp b/bitmaps/n72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..be3f303bb3fb7a182eeb8c135efa6dc99bb05f07 GIT binary patch literal 926 zcmb7?y-EW?6onJh2o_tUmTB$nU9ht89ef3`mO)aa5%LE5DhUDCLfl8tkYd|i(oA63 z>pAyMHq$70;f60K_vg$^u5Vu^BaJJ3ULbE$jz?qF@9_KMndJ!-CPPG+7WVz09CVJ; z-kkTG)0>`i$n^Ld`(tlk9$9jBnZC%l0!P~`O~zYtNuSYo1D}>Oq2^dgz!%=D}b`Sb2(2;vi+=zq C5jFY% literal 0 HcmV?d00001 diff --git a/bitmaps/n72s.bmp b/bitmaps/n72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d641b8e9977394da3614da4b2d1e85ec07369d2a GIT binary patch literal 926 zcmb8tu}Z{15C-7M1>8a~mRDU`OG}HxfR&B!;3HU`aFT=*EPVs-Q4CmI=_>@TusyN4 zB4qq$W|M3@6bx+m@@IB;a(h=dFEQzLiTfGGwI2~hn&0C6!?BGC5*czavkbfJ`JZld zomA%@I9?CAJ9H~^eg2y{sNrI$AGt!F*!ohLPBt?~tHD%qMKsG%xW6OWxO3inK^dB`d_hU)=A0awn9E!=5Q$|&X=dRq%}fL1 z@m^|V;4&9u9}#_NO{HgSu8DB`z44#;&>H!5Mvga{qZ!P2AMBpZr^ww}-OS)5HK*`N zW=`N)Zg%k8J1X#HthpZb=iq2-mY4C9cZuZ_@3)GUnRnf|UEX=_N}MvLG1q7Nh z&C{>3Y0oB@!;$8~a5z@8nR{nYHRVP^WIZRwrAOtRYNj2}%5@;~W;3B2+Af{6CL6_- zI}grz$EIAj9G$yj9jq^AAzDzqZaGy?$n)7)rqm!uc{56?9~oC4o!8XzPv@^~X!-l; OY_r^Q0t1~C{O=z%fkK4< literal 0 HcmV?d00001 diff --git a/bitmaps/n80o.bmp b/bitmaps/n80o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..05b1a33626c2ccfc2b530843f6b9689e2764f2d2 GIT binary patch literal 1022 zcmcK2zfJ-{5C-r&DJ(1qvDRyC39Vrhd!z5*6WH0U2?dSeT1^yQ1%k;n#(M<_1?>@= zGr8ROeY3l;*2X1EemnbTW*4rm+fJfwi0=#ZTi??p)%YCqrzfr-A;QikBJ95D_`m(A ziLK^}J!9h9#bf7Dyo_8#-bUU;-bMb7Tt{v!29?X(nu8^yg>~lmcvl@^VvWxS!er{a zCrqZ!o`nh2=E*jDe;OuR@k~=@Otz*6I6ko1j(r>tX#XHUv*IcywzyQV@Y!8l H@n`=4{RPK9 literal 0 HcmV?d00001 diff --git a/bitmaps/n80s.bmp b/bitmaps/n80s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..873c833d42b06d8e43079a0023c8c844cf2d024d GIT binary patch literal 1022 zcmcK2u};G<5C-5gM#=ypl~_^Jk+EZkfPo!}N9bdK7!p8&v5&y3cw^)hf*4qfx^$>& z?)TaCNo+`1a{J})Id`dYb-lF|*ExTl^1eyikcqkH-;WPu?{R{S6+*yHD_;M%dubed zMem2=6Xo`|J_C%CDurJ8Ip$6u% zcR2nd%5$m~$T9GQs#h2TPnAbhH^?zO+hr4tqxqWGxI->(#qo`6k%jPxnp^RcXMc+y z2KGm>`4oH3dHi_R&xop*WG=63F^-O#;+YfUA(x$a-BRWG{l*NN#ygw5wSL35k(}#Y hv0+MXsN320#g%f6yQg|L6nFekIS;FyBU1i%{{SWa@?ih~ literal 0 HcmV?d00001 diff --git a/bitmaps/n80w.bmp b/bitmaps/n80w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ff874d461b6eff528d6f9733a0dcc60ad60c100b GIT binary patch literal 1022 zcmcK1y=}uV5Cvc|EYw*esLd2%kUl^*A~(oN93lhI8yIktBJkzjJyN<9E?k5#rBBbt zA5m}bw-l_s==E9q$LKLc%bWiHbz*>vjn;YxhUG9Bx`S%_F zxcufUX1$7hO2q?wNz$fUl0IFd*kY*BpDjigTY%2a8y1VqSG`Ry&Jhcbny_25+(Jkg zt6rVcwBEyXSHFgUiMiono(}V2Y=oQFd10Q;A8*KcQo%bT*N*00TuxW3L9Os)ZQO8l z`EWyhVs2iXSGuESbI!EASfTkyot&3;kIAHi2yQB3J8L{ivp zDz_Nsdd{8w84xRRV8XX2v-jpsj!(}w2f8NsJixwab}~pb-^KU0+hK1Y;pP$%?q>P_ za;eQytsk8H@IrsYRP)%YDF4mt=uGT7%Iks;p}w=dy`g7e_Slci!*7=R&I@^IUCrd9 zb(u)j`fe!NjPK@KqRnVCFSJ?a2j0F~F?d1!W(3VVefXJo-bY*9gyti(?Y$J-gwIiP zC{+PFdQY6e^lF3GTBG)qHaG(>uSIGa_3EA8K55Kbp28MqI3NbDXw+a|HE$NrRe_wt z!b{pU7T8-9K_0oJ#c2KbWi3+A;Ap21ZS%*mF) zq?DpLhvdY3xB7z9;QCU_Ywkw!UYn5n;n|`r8jmyl_l+l6$=0mn$Jw22>~2nQ?;&?r jtKLT|)8*;9cV5{pHy8wqHJ#=4Hua@9GcKNK*WdgN)J8Y) literal 0 HcmV?d00001 diff --git a/bitmaps/n87s.bmp b/bitmaps/n87s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..59b715b4f886a1df118fdbadfb7c0c098e09cb60 GIT binary patch literal 1106 zcmcK3F;2rU6b9gDj2a{mUKqNWk&zQLf}MqhYcMhtC5WLTSK$aj9k@oSULb59qL}}G zcA5-`1!2k6*T1jt*-?9YcYiFpR(QR_e#qO1(fk6RKcA+3goK+b#>k!5@L%q9n9=_2 zul|~9OtOC0{_en@xn}NO^PTpbdzj^M?iz3GK0Sx#NAF`h=HVvta0TmIi5#qMq~b7j zeO+=`u|-Y2^c<#^rHeKEiCoT#*kmun9_++$m}8BrIYZngxx`@i25)NdqhHYjhtM3o z4eT9i&|98hpS{dRKRFRuF{iQA`ov+JTrY^<&YDI)S!DBqbcLL@B7x>*NAt39hY&wA zE|XlVcbcp1+*{2*_(75V4!cdtc?wsk8&39a^2)2*HS%?t%)dm)KIaiC&3Q@N#$?>k zy(9-GQrhI+b+#{(2OEmulcRL5DMzDGoQ$t(PhJ@1>On5iW%T3Bojc?vOx8)c-u3=a SUcRFu4ktw6rDzlCKznoEQ!ue|VYZvU*_1CT+h@3d!ZbWa*nZFOlOspva9+B46qp_eyV`-ST s;vC7nacth`iBIY0lwnuGIiJ?yd5z~hoQC6;dcN0T$z;fT_VG7=0gD6|-T(jq literal 0 HcmV?d00001 diff --git a/bitmaps/n95o.bmp b/bitmaps/n95o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f826a19cafe33136f091dbc9700ce79e7eaeb6ed GIT binary patch literal 1202 zcmcK2KTg9i6bA4>5k&&2D?^c2R(6CXcFw>h7`lL4RiX@4dxYMB6SV5U$Q6oufn+n1 z<;V9uJ54BJgGg?F{^Iz({JFh*Ju39L!S5x;eI5tJf#wf5|9G0lArcNABEnH0u?GJC z%RW`^a{uhk52rp--g0m{(fl_@+pK9@Op|}}yp>N{UaPfF`DnSMW6J%`l>}Gk8woZ$ z6fTQFUov7muqAXy1H87-Qzy9U6^t-fbL{7tCXi`Bqo&(7z)!enDWA7_vBfBKx#g{Zv66ewabUG@kqFPT0d#Ir{7`97xKPaqsZ(3++QU{ B)0qGO literal 0 HcmV?d00001 diff --git a/bitmaps/n95s.bmp b/bitmaps/n95s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6104c31e8acc4aa8adcbc75f3d2093fc005a0809 GIT binary patch literal 1202 zcmcK3F;2rU6b9hu8r1^`a{|oB*aM(iV&@ES2nL3tr0UR-yKn-d4vbtOh=Db18Bomo z-*cL*^4&f7??ZpE*XcN5D29P&;NBW^3XP`IZk z7vb3*gsA%cr2{Tcl)AxpL|w*x;Bldr z8?qqNaz6MAuDRxn%=>67PMj0j9dfl3H;Bn?k*mFWf!urK?G+r<5ncw#1AJ9nvsY1a z4|f&ZxkR{3v0>Xr%@yQc#ByN28NGDk9`)Z|oJ~uv4eE8Km@0LORNo00NmfdlK=n! literal 0 HcmV?d00001 diff --git a/bitmaps/n95w.bmp b/bitmaps/n95w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..68f74889f616fc41041cc4a68c93315df60f672a GIT binary patch literal 1202 zcmcJOy-mbG5QWDW$r)|{$tgu3ERjwU9?O~+!1KTOOO+eXU%37) zAGDYLb36x6 zv~_M(3~bh5k94y-aHW%@$5c!_unBR;!ky=h|2Yg8$H0&T}~s=wKblF;~#p3*-|{5V30aB%*i}H?IG{t?QFKk-MPxXLxYE z492@4u1;7(*3`ufSzkj-*1$bkLk{BP&6T@00+Gh+a>y<)aM6*y@U?C({kMUi(d6Qp ZH-5>UU3+(d+q_%#*ZjURq4@utzX7K2eYgMs literal 0 HcmV?d00001 diff --git a/bitmaps/ni49o.bmp b/bitmaps/ni49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..42f9021ba0aafa49ca0100ea6df449321b0beac3 GIT binary patch literal 454 zcmaLTp^gGE5C-7#0>>j@u{abYc%B7$vX#68g2y0%gc<@4xN0I$Gy$!zB_DvTSOQ0J2b{%e1niUjoJG&~mJf|$Ax4jqA{JtectDj5 z*%}jP?)RR3m?^RpM;d5iDm Hw(-FSmX$4N literal 0 HcmV?d00001 diff --git a/bitmaps/ni49s.bmp b/bitmaps/ni49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dbb439726a0d3cf59fa69d34045dd17b7f229c59 GIT binary patch literal 454 zcmaLTF%AJi6b9gbY(i(_1RI^!1*~XP?!Za*>2$8(2uh`h(7J)`=tzich*|&48=_&7 zH{ZVZW;Qd^8*B{x=x}Z^+93?IF(K=^hF=(_vMj;ikbmw^+MiC8+Z*h3Ys9_%=bTLA%B}PKf7ao H`Rl!39$&$S literal 0 HcmV?d00001 diff --git a/bitmaps/ni49w.bmp b/bitmaps/ni49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7964c143f0bbc67545ddbd96457613b5a614680e GIT binary patch literal 454 zcmaLTO$x#=5Cz~Dy6DaxpF83^L!jyzm) z*_b^i8rlEKs9Egz-F=H~0!?VtEb_R5TAkb(mF6h&8Znt&Hrrx0BmZN+p12RKUc3aa Y8{~af@~t!@y4}Xs^IGl)$-mzF1K8EJ<^TWy literal 0 HcmV?d00001 diff --git a/bitmaps/ni72o.bmp b/bitmaps/ni72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fe4bd69df0604b37ccaa9a7e34be43a342bce3b7 GIT binary patch literal 926 zcma*lKTg9i6bA5A9oQ%m2k^>@*s;XK!X1z}0tX1FLpO2*at%hRBBcW&XQ(n{O_aqI zmOsAdKWR`0h~(s_FE7uIlbgHOdFGF6o-a6Vv=z;txA1 zj5Rjz57y0Sqn4xh<@xCTE3Gb9(`TllTzi%IUc xww<_%&Uxi;s?09aw`{QYplI z@A*$WfQltMzkYdk?Id>(`yAR<9Bpy>rjyv2{Kf`l8gipJF(FwUdwPLTf%6$)overuiGtCSC)1$T!@b zdJk!-k>sd(({lTBUW0iuR6Z{oXE|bNa4Gr7BNiPNW$-Y0HsUJe++=iacaVJGW611t zGugDkux4HP8q}TcN9s}aH#X$uP)8T;`_US2eaw8-Qgf2IxwoOSKP+FY)JqLt?|D~A Vjdv?^oqORgwxRKEp#0Z=`~zngaXSD2 literal 0 HcmV?d00001 diff --git a/bitmaps/ni72w.bmp b/bitmaps/ni72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..81cc086fb145a8a52c0ca6c28666863ab52e5dc0 GIT binary patch literal 926 zcma*l&27XW5Cz~tJ~)SHNe5iFiXi2bOL|BrAf=Dg;=>kVDGfL`A1t#okH3jFt2Gkn z(_?Hf`0e9+AhcH=&)nZjH)N21^8DqLJAyK#l!$w7oK>a=-leeAY~i=t|1_`eOL=Hs zPRh^CJ5lqZ9J{%s)vRn&-pS>%bqupOWKUwB9hHUTkjpFo^QLlHs@7y%Jd0)N)-&oy z)M!u02jsUl$Rld#o&!(IoHWl}{G`lROs?cMX3HnqxqIYqu$)Og@=z@s>yEG-gGo~} zrCE9D4hz=BvH2BygWdKbdxY(dyMV|1|KK>a`4^CSUmnfFuW!q}iT1+JXZH8xo$2EK$ok^ulW{rJVl=) ze--uvHqM2E1Ai1=EcmG~J@7Kv$|qiWSNXzAc)E{fOVq76^b`;y>(rCCjF}hKab0HI zwLXu8k#5#e5X#AnQe)9lFQFl5Pu5#J@lmuppZ{yz%3tfcAG%+ZWjsZ{$#@E1WjsIfB;zRh-rTxh=d0`S?zE{lnE1Pve9732PUEoU NNVR_n>-Yah{|5Hwj9UNz literal 0 HcmV?d00001 diff --git a/bitmaps/p108s.bmp b/bitmaps/p108s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..099f9eea4449d475bca0a415c508a5ef7a24be63 GIT binary patch literal 1790 zcmds#L2AQ53`Ol0(nS|Jg10?I4Bhu8y+W{$Hb?Ohyv!n4(H}`O&JV?#fJ+8scq3W* zlIHtoIW+m4^!ugu>((}HzEA2uf117N4Gc#_VD-%TZfCxlxaM6X>$&XAq36T(JewEq z@96orSUkS-_y-;>pbtNDGXD^M=E?l}4D3BH>#d%)_?c~Cx<3Ek2Bzb4wg$CbXKSFV zJR*Nzc>*g&JPM+GFbW`jFcNkvMnRMdKgUBb#uzIKWj=)IeC2YWOP(E&Vyk2wTp_(f83eh~N)z(oYmz!Pcm zlhpUma%l27>GwnTyPf%B;+l7ntmnKlhn^4D^K4$c zzoX~hV)6LSGqCr-thajF;%Byn>H7SC8<>vI*&5V#ovnec z@`(I>t<8 literal 0 HcmV?d00001 diff --git a/bitmaps/p116o.bmp b/bitmaps/p116o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d9950a32328fdc391cf06621ff2ff5f853bc0e87 GIT binary patch literal 1918 zcmds&F-`+95Jh*{A_YZ`;FeQhM9*z#!9f(1xl#}X*9hVQo6d#h;s3Fn^;!zs1c9(L zYrp+o&-d6-ZtosfowjQ{uMqb+`mWdaH_#t0Q(WK;gH1#jRU7{TCv#o57NMWG#5QkW zo9CaI#pLzTYkkhm@XZ!&UVn+-b-DzX=P&VRn(xu6|CSF)XQz70{1AO=46=rDer*jtRBCyq$PDEXwv z$W*+uvU3%WR-TC2pX{w{YDO;2S#%gyyM>w0RNr%4u@+=I=`9BbO;0iHcZofh;&J5s zzs*a2TRmD>|E3;dpfgU@x2=DBKJEGWAq-rutQQBb*Q2lu!OV1%?r70rSnU=LE*;k? w_W5{<{?okVCpP|ZS?Bv-&G#>x&ervieg0oa_Y*(PRL-(Loy$kj%ZvZdUq`i55dZ)H literal 0 HcmV?d00001 diff --git a/bitmaps/p116s.bmp b/bitmaps/p116s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7fcf7aac450e6a32e46bc1b17130e6285b770901 GIT binary patch literal 1918 zcmds&Jx;_h5QQBmwxHk$ZaD=;^xTFPlB4A)KEjq;taf{7=p4rW8rYL7$}vWVQ8QGF-HMw>ay4Y?aZt3eCBQp z^z*P{Xu83ckfs-GhH4*dhIQZ-&(8znKszquJ9L$kIevlO1|3-H@67oyTLHCv;kU(n z-%ImWzO3{8nSb<)>$_m1eb-A?@H}t_D`x*tAbUNMVQ8;MG7Re&&pI#o>1V12}Vi8+gZ zpr3~oL(>hmgfzWiGgSLvGpqxzczzxj2ikEN-=V9V%<&8KHt4`oe`d~y*$SxT3%@Pq z`(B&3@@1Xx&-|@lT;By7?W@43`2W8l3`fKc-EP5A!}DY&&+;* k&Fs(2`7`tV@kO?=9@68#kpG9Xmox8gvAU$58~>j_0Y<#q!vFvP literal 0 HcmV?d00001 diff --git a/bitmaps/p129o.bmp b/bitmaps/p129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5a3713a05ae205d274f4920c70176111f5d08629 GIT binary patch literal 2642 zcmeH|Jx;_h5QP)AK!Rc$dbgYcOY}6{2PKGNueGbaNVtJZ7g2^c&vxu&Eq){xfy78o zvR~eK#?OxS{^9YeVcg+*i}4&s+qC32c>i=A#s!ED4H40?h(7SY$o6QRu|fAep5l$H z{W{wv6JB%fPq3F%_mJxz6Vr#dw(n+Ij-d_28oG3bF8m!fM44P>ol9){0qcTrDs(|@oGX1NGVw)b115BwATzfS z*#{?5FES#pw>n+cX_1~Nvq^J1!knu$?2>sSq60DObSL7jWTuK$FEnt~^Q-D;bDr-| zVMk@WWL=GMDo&7fJI!UG-^pq{*Vgt~R`ajsJ-?RK9@X~Jo6|iXv5$j=uf;i-8vHYL zOD2u+z#8+}z#-M6x@2zaLMw&N8*fxq<~kd`rIKNB;aC;9*zX$SStxU17X2?7jHcJ; zWVO2J`J_Lrt;SB)R`bPgouPe&FJsf#HJh5aZG}$yHpogg#Ihxes?w_&{p(;wKKJMK Fb>!3`OO32+$5)x_iwjYM^_U-lwp7Gabc8=$IiWOMXfw9T0_(A%%eokYc=$ z(&rbQyuQ6ZB#akck32u?9MS;(%-?@J>bzqjQw9;q+>ESzkF2nCjC)p}`Kf+@4f|#V zMeyQky9Ha?xd-#FmwmO|C(G?+r90Fu< z5HoM%qFfX=ZsVeJBNk}}gY~ARBpz3?EV&n6?U5C!<4O;r+(q{5=$Gi;qC1azBkG~3 z*N6pbX?Ewt2W#s(#s_PwITponaax*->t&Iazhb?bqqxYI$UnZg39qm7iZ5=yWR&$S aa=$}FOSReMYM!h);lJC!KZ6&y^5qBfDEb>!3`OO3DA1u@vU}|*YM^_UUdYPLbci0nN66TrC`*1yCLIukkRgSE2#{jD zkkaQDoxHt&JSL1+USD_~>m1Sme&FvvpLE_aktu_SWNt=QzDHJAI>tS#&-_$Bz=nOZ zf+BcvwOxZP?c4|Rua})#?z83gvagmqT5d1%@#+EF={;&vaEs9R%={Q zCRg+)TQp8AUE``TV%5rO!J}ujkjb-J$n04aEoj{j4+)ZuK@6lAgBVCLhJ&Z=emDfk z;vi<;#zna(ZrsL2=SD2j3OG!K~WLa|0yxJoxQpbfJM7fLX*U>N0y+wB(^+wb~ zQLhmT)Y9zEi4WG+b&Linc XlxK(Ff6PA^Kp4b_v0;3eIUpJU;^Z>r literal 0 HcmV?d00001 diff --git a/bitmaps/p25o.bmp b/bitmaps/p25o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7cf801458e1c8574ca95fb6f2eba69a353ffe2e6 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2sgm+4+j2*-~Zpk@!$XV n8$kHq|NRaB>+2i-&jG642gD#Y41>f@0`Xlaehj3M%mlFka+_5m literal 0 HcmV?d00001 diff --git a/bitmaps/p25s.bmp b/bitmaps/p25s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1a59190be71857b13c2df6382d6766334d752c71 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2sgm+4+j1QWc-Igz5#^) eG1xc!XQ*!gs)Rrg8-_t52a)h&AREa{5E}sR6GzJc literal 0 HcmV?d00001 diff --git a/bitmaps/p25w.bmp b/bitmaps/p25w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd7b65b641b420ef8a215a1c59cd149e38d97f43 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd*I@If#WkPX5h@c;jR5N?3s9}N5r$oLO~d;lKsJ(@AT|I**cLKMagN{{H`qg8%*h v{R4*o*MI-S8^*{cDAd)=*@O5#A literal 0 HcmV?d00001 diff --git a/bitmaps/p29s.bmp b/bitmaps/p29s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e3f5f872bc26b6220286aa311616cfe2607e27a4 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>*cLKMagN(D6S8<{vQp ipMm|y{|5da{}0GRFo=zeLE;bWQSpcRAOArR$sPb0saT}| literal 0 HcmV?d00001 diff --git a/bitmaps/p29w.bmp b/bitmaps/p29w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..55169f6f8ca3093d9d0777c1c5f0c9a16ced567b GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q352d@If#WkPX5h@c;jR5dHzfe;62lpyPiG%s*iG iKLh)Z{|)><{vVKsU=SM_gTx=$qv8+sKmLOtl05)%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@uuP_Yi%5??Y%9ADxED N|Fegv!{JYu{{hxhkskm6 literal 0 HcmV?d00001 diff --git a/bitmaps/p33s.bmp b/bitmaps/p33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..88c9dd2affc784d35992646b35283a2078ef9652 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@uuw?0jmE8RR14&h&ey_vC}a5fA$c09R7s) F9{}X4a)AH< literal 0 HcmV?d00001 diff --git a/bitmaps/p33w.bmp b/bitmaps/p33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0de8f7f5e74cace3ea31b222778e1013f1797e93 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dur_#l`GCz>% literal 0 HcmV?d00001 diff --git a/bitmaps/p37o.bmp b/bitmaps/p37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0d165cf460e59d2c98033b92a107d27ce5ed6a48 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZIh7#NsA;{X2t z|Ba9SU;qC*SU)Onh&Zt{OyA$X a5dHs(q4aP3^#5{*{QrI^jXfM-;R68Cb+O|B literal 0 HcmV?d00001 diff --git a/bitmaps/p37s.bmp b/bitmaps/p37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dd957923ace195469678b7470a0121ec0aeed4d8 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZIh7#NsA;)Lk` z3=HgG{pfT913y?CMjv312lF2=*n{a04E1384A2Y-pLiB%j Ph`Rs%P#SwUz`_Rr5w3?l literal 0 HcmV?d00001 diff --git a/bitmaps/p37w.bmp b/bitmaps/p37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..48e0dc791272e5d47a6b660b3919ede2c1f51d51 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U|b_#l`GCW13Mt8frJ?uAQBEh>IxqOGXdp67zFx1^{{z|tvhVNz`(PTTj#wI|?_a$= a#N0XmA@n{dU0)C3qth_?gHUz&!v_Grh{4SO literal 0 HcmV?d00001 diff --git a/bitmaps/p40s.bmp b/bitmaps/p40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..438d1428cdf171985e9ad1a8a1ac67ae96c62bbd GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhnSk;j3Il&X7#P9o z(CG&Z%wTaC{egiU%>Ti_52pVx$b;$s4E138AA>!LI7}U}G|W7hIsY4={sVd$>|dxo QF#F&%Ox;1KI{e`S082uY2LJ#7 literal 0 HcmV?d00001 diff --git a/bitmaps/p40w.bmp b/bitmaps/p40w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..44567d9b30b3c36b1c38d12840810ebb798cfabc GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEh>IxqOGXdp67zFG2g&dM z|NlKc`u_j__d)XL^!xw+_k+Y?^!NY&>p^@N{rmqvu>F7k{{_?k{{IHk|Lvbc==1YY m_%L~xdSYpqJ{S!*|F}HF{P+7I^!@w9(J=KN>LKd!ha&*{o&-n$ literal 0 HcmV?d00001 diff --git a/bitmaps/p45s.bmp b/bitmaps/p45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c44efa7447c10da6ebeb7b7d1c7135cc652b52cb GIT binary patch literal 422 zcmZ?rUB<`&26jMF1Bi8@n2`Y@kpZM?xgnSdCG2gwtn z4=^yugVdqZ4;UEiLE}7 a2ct2}e_)SlAIx4{G)(=6dWb&!;RpaXc*NcS literal 0 HcmV?d00001 diff --git a/bitmaps/p45w.bmp b/bitmaps/p45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d1cb6688c3bbd8bf4d68a22e9e33c85372f6215c GIT binary patch literal 422 zcmZ?rUB<`&26jMF1Bi8@n2`Y@kpZNx@If#WP!5Da;Q#;sApHOT4=@`$-N3-W50WQD zA7EgR2dP7+A22Z3gT!I<2L^_E5FbW^*dY9efe}pqV_*i;{~6dJ^Z|JkK1?2_o>&^D a4@P5{|G*yAKA63@XqfsB^$>md!w~>P8O4$S literal 0 HcmV?d00001 diff --git a/bitmaps/p49o.bmp b/bitmaps/p49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..74fb2335ea812bae45a4cd6aeaca66d0e6505a44 GIT binary patch literal 454 zcma)&F%H5o5Cm;n9+8%o4^X7%NfDI%f~O=EZJv;lG6jVdIbqr5auSM!lC#z$`_|{P z%kv|KZ=5(EsN<{{EO8^My=ljsqyQi>uK(GD5S8zMX$yNG%eQ0#lJ=b$v~ca5z$>_Z z1GR_?hj<^Yzvs)?(W(8K&R@EJjmvXh&+8AZ)lKYF^?P=>h3?OMx%^{cT=`$6>Hh!* CJTC0 z#M{==RGkWNqc?mq*ULPL5o4q*zSkUpK>sNxAYuJKXCURdxBxkGaRmzI8&H!G=nisE oO^I^|PMwRYzoY6!&C~oP_xW@Bd$0T}s$TtT;r%!NOWWSJ12Wq1Q~&?~ literal 0 HcmV?d00001 diff --git a/bitmaps/p49w.bmp b/bitmaps/p49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e34cb97b619f58280d2b61559f2d57688fccbe47 GIT binary patch literal 454 zcma)&u?>VU3`KvAf(}NYrDcIbqGzU~ys@a5fB_hRk^&L@F~7Kz5Lo(oalY*+Y1$#+ zh_|h!sX7(l#@8@ru9tZfBgRNsbl2>GK>sNxAYuJKXCURdxBxkGaRmzI8&H!G_#EV( oni6LpoH`d(e@E4eny2|o?(^sL_g?u|RK5Dw!uxOjm$toc2UYv=2mk;8 literal 0 HcmV?d00001 diff --git a/bitmaps/p54o.bmp b/bitmaps/p54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc0a928115555b8c9041b28cca327b694657bb6f GIT binary patch literal 494 zcmb8pJr06E5Cve+(nHXC0!ufs_dYa+l9D5E1#dyg6*LrfMq&fWW}oj3Y@&sKn+zYr z%q+9pU(>|Smd`a~Ge??Cg(EqvrdY71&;g*}@xOcGV8;IFh2u5zcXq6+|4!YLJrIb%7 literal 0 HcmV?d00001 diff --git a/bitmaps/p54s.bmp b/bitmaps/p54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7bd3fba2e4957543b732df4409f84b8052cc78fa GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nZcazii^P!5Da;Q#;sAPfY5h^HR_HOd3klS+R8 z>az#xL#KZL#p{9MF!~RW4{{HT{>Q+;2;%=|U|JH3VncqAIyi*FmEJ2ajEv#=Cx literal 0 HcmV?d00001 diff --git a/bitmaps/p54w.bmp b/bitmaps/p54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ca35eda091be3591865b7f26b9d61e45812832f1 GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nY3;e%i%pd1K;!2kdMK^O@B5Klh1#NH#BwX@_1T*Z!3uV5%>B{WMy82{NvqJ>6XvimW+ zv%|34FK3AxTh=vm6K0yEZvP60g`b)l(i0KUspIVV!aD`#@AEt@7m%s;3YrRZhiqej#8}v literal 0 HcmV?d00001 diff --git a/bitmaps/p58w.bmp b/bitmaps/p58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8a4565088ac338bddf8ae5e5d23bb74e34b22397 GIT binary patch literal 526 zcmbV`u?>Sj3`KpUNCzXN%?v3LiJqBYG)72~0g??UDG<*4ceqIvu;hFCmi_OyU0qqO zJMWdgZJjLT`4hbA(puft&E3_ivEUC*7@XMK%bB|~cfVYiH_U@8`hpHR`hoVrtQSWk tG<;jioUxS-PQ;TA#@E|c;ZUzJ&Zda`r`A!OMa@u`~r|qQ(*uA literal 0 HcmV?d00001 diff --git a/bitmaps/p64o.bmp b/bitmaps/p64o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..336c228ac4d1264458a44a3a4afc0a246df398e2 GIT binary patch literal 574 zcmbu4F%H5o3`JWQ7#KQm0I!^)LF}9-py{?d2e8-)D;#WO6It?knUPKh9S&NXM2M9D(Hc1su%@IGHnWF*UfD vYG?>*VD&@fgZe=B`wkZO$2_q*);>cznoJ4q9GiS{E2DpE-<9C3;s4qf5t(mS literal 0 HcmV?d00001 diff --git a/bitmaps/p64w.bmp b/bitmaps/p64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ebdd7e4002a7452c7ad926146e39992d4979d4a5 GIT binary patch literal 574 zcmbu4yAi@L5JXovAcGQ=Qia8kQZujwkW~0uF z{MtPs=_XVDdHT6adpStj_u0z}GP#v+_Z4!DALlC>q+?4BPC#<}00wggj^+ZKO${!l v8XAHcSp5+BpgxfOzJta6F;A?Hwa<`_CR2htrzW4=%IKflcO^J$_`miALvV24 literal 0 HcmV?d00001 diff --git a/bitmaps/p72o.bmp b/bitmaps/p72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7436520cd5bb8b0d5fb649abcc6e8d23796d81f3 GIT binary patch literal 926 zcmcJLF$w}f3`JKhEj+@u9zqDVdZ=i>ar$&Pv-HBg4?AGoBZw)}>CGhUG|#yj%S_(W#tewYLAl&J-4l<9}knEit@4khZ! z7)u-|Q$1<6QA`d|Vq*!wF`eS`N z?)mzxs~9JoN908rsu1-X?(e&l8z@YMnK4tO@Bev@mW|P;1TWFQjsD*-3;D$L$a06< zpc>CT^ji7=-e!1&zL!3M4`M#P5p&R1Y#m#rd2FC%hI_V^?(5<6)*XBQ(yXam_spDr i{*miZ&CHdEC$1{PzW!JKt)%>6QA|HYTNU`MT^~d^l z-1GHOS20dFkI0KMR3Yj&+&_0IH&B=iGh?Pm-~aO*EgPdx30|Uq8~wjw7V?Sfk>w7z zK{cLx=(Y3#yv^_keJ_0iAH;loBj%v3*gCdK^VmSk4EJm+-PgnCtvmMqrCC$C?wL9L i{3F++nwcvRPh3@oef_We$8YD literal 0 HcmV?d00001 diff --git a/bitmaps/p80o.bmp b/bitmaps/p80o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..096c445ae8223ed412e94b3ac8005233ffa7417c GIT binary patch literal 1022 zcmchVJ#NB46omOHQc$Ge0NZkkSW1tS8&Rg@2)+su1!b-flp-yNW+Pc1X5RD4PjZAn zAXZ-c+wuFEUHg66PDeK0cwcaSbaOl!o4(=u`ON2pilznt&2HHGiCjFWZ{$iI8fn0- zoRphAw-*0h=Cxvu9`hwW4S6U1$Ms(^Z}LV7;7c(}04yeEOQ3e96(Bh`E1<2M_0(GN zNM_mj6WCKSoefyt`2f5YZc?uPC~8`Pn9Uam)GBkjlHc@R8?`#IK(z1WD$ zp||Kc?j`OQ(+yKS7u#*mYx@M|AGLh~=al=Hihotfy@q3MtQmXlbZniU@0Xr)>RD7` G9?fT3)A8K^ literal 0 HcmV?d00001 diff --git a/bitmaps/p80s.bmp b/bitmaps/p80s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0883c08b23acacff46ef624cea1addb77f72ae6d GIT binary patch literal 1022 zcmchVF%H5o3`H9{FfcH1fUcYZBz7cjM2?oDU+~i^04G5^|R>{`EIPko$kxK-Ed qzGpv+pVvApd%|s%bC8Iee#iEzzu#N_zK4vLQF|DNnMqauHNOC)-bL#G literal 0 HcmV?d00001 diff --git a/bitmaps/p80w.bmp b/bitmaps/p80w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..21683851916331b4d3d2eded1cbbe185ce6845f0 GIT binary patch literal 1022 zcmchV!41MN3`HAy;07b)$`l}RM`9x~T83bNj=-@8RP(=`sFq43Bq)&_z5ZI?c9QdD z>N{OW><7fPMCgL*8UOD)iwzV8mxwUR((gZV?SXaI;6&3vZ;?+pGrza|77xtXT8`%j z^}XpMIWGB0{bc$?z8UNAICnk&q%9i{TFMv&U~dc~*en@^W7U1W_i1s~(am!WZq@a= p@7d4d=d}*Yo^e~{93w@AsC!?_t2ps6C8vW>VFE%`b%FM{@uG literal 0 HcmV?d00001 diff --git a/bitmaps/p87o.bmp b/bitmaps/p87o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..de4374c85aa2be728ea75d8036f58c653042e03e GIT binary patch literal 1106 zcmd6lJx;_h5QP&!NhF&5UK$3) zoXVYYJLR6rgL3!EJ;oo335r?rWd6C8e~RRkIftFPo87CfFOu;!d=%X_lyuo>HtYnU-7PfMZFny{+EvD~_P2Uf;Lk9PsgQ?-yzA1kD zsh`WNjTcw+^Sr#4?8ok@F5GXL!s8|sKIp1-MhvjGmAQkxmA~_{=CapP!&J4USE^!R LJQH1m(SPAjVlZ>6 literal 0 HcmV?d00001 diff --git a/bitmaps/p87s.bmp b/bitmaps/p87s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c8b6e3aae5fcd33b1d4fb8d2e4817aa7b0f3f733 GIT binary patch literal 1106 zcmd6jF$%&!5JeLsq_9Y1pVm_tu(z@CG?IW9%Te|SDN}@u^Z(A00ZkziaAB6m-`SZz zbGhF38P8eolg8a5&vNQVeSaKc>{LPEhzP>Yyb<^8RS4>L8*r>&vi`Rm=%?b}H6EB# zGsp8ty`k=TqTW)U$@0bmJ&!t{wU$2FclXRaCqv>uuPxa3@(iEJkN1ovCeK)$q}jV=UI|!R+=C2Qm2todKXC8zf8n+I-ouEo%)^9H MjOD4A82Bgr0t7CsihE$W2XuNM??^I=8d>#uR>72+kj*JlJ&pkKtC1#uJOQ} znmL|F>J4?z6ZMw*OqMqm=y}w+l)|`Iy)+KWl`$IE#%RzQYauPe`g$#loTU4F7)^h{ zjs5lPdu_qKmuL7)e!OQaF?q(~B+cF}^Gd+l;vQtcs*D3x_Y3d8%wjk#W~nu z=--RCa<#g+wNB1#slV;3?YEst8lp$N+HV;yz{+vq>{FGP;@%@L~L`c3!m2gF7d3tJ*$QPx;M-z)NfVzuQ=KjvI3TCH#S32%+v zUE&wcw04Ghgzj@=7T1I86Ygwd3!S+)eGfeu*I;iZg56vLb`vew3TP?wCenF&aPl;B z?!DCfJm(?y#&Z58W^Gtq%Ixi8VAikJzrHq#cJneVQ}oS&Kf Wh<|GMlwSXs>{*8RVWXn|5x)UUPAF{v literal 0 HcmV?d00001 diff --git a/bitmaps/p95w.bmp b/bitmaps/p95w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..274c521eec7aa8e90fade2eb5befd16d61851c99 GIT binary patch literal 1202 zcmd6l!41MN3`JW&;zmd4l_`kCof%kydpi>oWC#Yx2t9H@HMV~uepU5=R3sv~efml4 zZ@1^meOLK9>GP;@%~4mi>o?th91t5-ENqF0MOkA3eXqy^iZzxq{g`vD)@psrPk0M< zcZpv()7cs35xUQfSzNDOpKxy*Tj7XOW4(qsaL_BgH59LG_{3Lt#WJ^`f!N zrcyl`-Y^rVjo7PN)sySQ?!EHp2pdFOWs-8lxBR?$=H0|KKTyL1P+jVC)67=b&P+9r zgta*&rXV*KbDPv9& z@G1GL!d7^kc$K-ri$TP-vVKdA$(*juTSMK-ELu6AHqE)Q_~x&a{k}FYjk)xN?{<5$ zzTUXP)$d(5+(er>QboHk_-K2n7sq#WOM{EsCpcYYy;U8&rryTFF$jk~>tRrS2vR?U zFkVu>#XWPcj69xC=tH{kZ5s-=%IRCyPZ*VA@~u?i{J+?SIJ#}mE?EC%VZfn1oo9B1 ze+VCZ;e+S%;GV37o6HRyX6{5k8BgtQ*>Pae&WQOmNPHG!;+%K zdAy~x0C&~I(SR{!=m!ryMsOQYml=KVsr(arKEI#Od+Mk#*C%G&xjyoa&Jgp8rpBF}TY0VUEwk YqH?x`>&%>d%$$78oP5j~=ltj6KLOOSGynhq literal 0 HcmV?d00001 diff --git a/bitmaps/q108s.bmp b/bitmaps/q108s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..084050632abf3753920e3f89a7df7e109289d20a GIT binary patch literal 1790 zcmcJPF>W3q5QT@V`3GPWZ1Udw+%E70pbC@)&?zRA@2?B~pfuHQ8O%yp9nmsa&^ zYvOYsj6}pS7{(BJuv}82M=TvXpZmR*ixYqDm-;KN`Rly9DsiiNR)78c67hswg*>9T z!^5{psm^omd1gt%ir(!LZ7cPJ@w){IsclOfIx0)7fS^XiEnF z1+v~|NE^B-yUs!MIN9_1=<|a0aD!jWH7}JcI6cdEHLuXwt>`}|JI=oyym#JeaEGbF z1-GhPuv0=Yd>O%2QwvT?PE~oQ!O=q(j$8*;xetBEt-OFeum3&Q`%mJu_zRYqocJpin-{i~{o_-?i=FC$S#$v7FnPatPA2Yn9rsvoF`sNYa=IU&e_rKzfgPDLm|5mJlJ5OK2cki$SiMoq z^jnUC>O}Q9BefQfO&!iS8sjP&e=gVgCd=1YzM5-4H7|C)v-5215Am1-&;a#+H2z4w zy8gLb->2rfA9eqt`77@u6dv;ZY95Q;XT2bK3!UrS${41C15;dA{qMPh+ zJj9!E4%HNSG|cll`6bEpJNCb%?uyv?vBo@xS`aoZs<}eU+Jo=$k#~m z!0K!sEIt*cH9FY)E!8Td_qR z?vK2Z6)c%M!zjG9~a ztgGoI+Z%YE5yu{89~11VZK}SJ_(M~A%l+p84;02vY?Ka9>`THtY}_5=RleJ8E*yt2x@m<*xO;V;eeqs w{?4%j|4+ppmBHAk?9j1eTaA?=KUP)ZeCE!4=6cZTJG&b7ORLV>_y2$V3w29$`~Uy| literal 0 HcmV?d00001 diff --git a/bitmaps/q116s.bmp b/bitmaps/q116s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e52636298af15ff094eb4598a4cfa2b3777f6167 GIT binary patch literal 1918 zcmc(fJ#O4E5QRsP5f%x+lqn3T%^?EIaPQls%}TCP=1THS2>1dlSqPlG`61U9Ho+DF zOo+Ss_=dyBKRrC20%^I!?>E#RUI!Yq{T}+yPgXymMXD5LminsX_u-u=s0$mvh`CW3 zl&c_7Y`iKG&8DNX6{L`O?JX_HAe>#M;W|F{-;*cs{70_$uEU`Eb)@Mpyn2B9=goQX z_#?mQ3`1epUl=PAx$`pw(U#UH^B?(l(tz6Z$hx0(viPcY z;K0{s_cNB-dg@N{Do5a&{jX(Rm-CNHz%2}S8)%=21@_`%zm0BYn1$z zZft~`#-EKpo*CEp3w6Gwk?1RhroZK#zPr8#$uErie@mh939o33o9joe6j!>Vm`ooU zXXPTi(TQRnC4U(!O&cu~%ViFgX6S3&O&3nYonzywdIm4hw^#?spQpxrndge2fm7rs zjbA!HU*g1)7f<9Qy0TbzeiGd{&zS)51uodFm0eH%#I1+Kr*Z(8rD)A38_e~+#I!iaQf%q;y`%iqH*QLkCp`dO0eWI(wH z5(Q^NqQUegYk?1t?$1k4Up(;y$ocI#`Fg4`FB?x9KW{vKinr+~NY?){ADF{| z`BmCDihrde(+_Fmp6G-&J|*Sg`k8Tbz978crxa(MUkE(YIXH-aq1(nw;|d8uF}=+l z^aYb*HXS@HG&!%m^V*C5D-M-L#LuyqE}V!rj?UF|@C1E{#(8k&PWByH+zoOsvCUwonK`cI!ngyXG}S-L7uhSOPQ;zn-d!n+v;i9sB5PlOYY~`bl-31jXQ76 zgpG@AFxy4ru39r^RvAau7@Jvb+}j2}v+V3Lv)eeHyVPcVtMN1IZ4>5j{Bx)ALsMcH zJTgobb#P*#uBJMy*mY(< z6FZ8Tq_WZ*8566-7#U{1ZDiP?%)+q{+%%@AZZfRbB!v#tCL>{>Qti9!yMX_5Vj#hYT~m&w&2p( znNu~H{py*msB`ZsvKa>%QzJq+vNry(%=pY?);`W~>*Cm>Z`5(TorUo%@@B->L-Ulo zOFu9DLnvelUmx!u;=pkxLlNUZybe+@7RtwqQPy(+U=*WY7ZE}B(H9ny*m743;$@K; zF7WXv$hK2tqte|a4efkKT>t<8 literal 0 HcmV?d00001 diff --git a/bitmaps/q129s.bmp b/bitmaps/q129s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e058bf62ff01fa14722f7c3ddea6cf5463a6db13 GIT binary patch literal 2642 zcmd6pF^<(R5QZm2;vpzPK|!%nT8^*<+DO~ea2_B=NVIz;znkO;DN{t5{r?%;@nf@q zV2d3k8T-q4JTrFu-tDK)uf^mB&kwl2r@N8H_&dD+`o`}UAiOE6%KJis^Jm5;k&}m1 z;)@7WT7#KQM9DIsftND@r9&q`Lq#YPjt*!gWvtnm_3csEwzDyh{U4?;i^DR9b_eV( zvnsxy2P|e*19&9dA2-QO}Q>VQYh2E2!?JsxS^nQh2Y z`I{LKq+TP;VCWa-!CZ`WRNGAn*_H|Dz|&u|#RvCQtFH?Drr)R-k;;>9}Y|;dICGwVf^xTeF8|1y{(cdXs*VzvW=CwN68vH8SafY(;1&gVE}oyHUGrdH={*Y6Cc ziN%N0rPviVXvA;~Y;{d`Q_bL*b&lh1w;?F74Qqu^F?MP3xsPNkzmQ(16Pe0DhVt!f zlb($07YEv{n3wB%%qD>|w}VT;o)9rMGSltf7=HI~MwYRR1!0qMKjm1M-qJI%#E=KK z4j5F*1Nklp5sb?7-5Tq_A6c-vV73{DF!D8}%tQJ6>$Qi{nqe*Z>W>UgF6=A_52=hj zV$1_$sfr!*1*0mAbwMotKPbh_Go9=Vvm7&<*at4z4n5@ifU(XdmEAf#WQknN@hsRq DnqTLK literal 0 HcmV?d00001 diff --git a/bitmaps/q129w.bmp b/bitmaps/q129w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bbb98f525e34af676d46628807ff9d102d30595b GIT binary patch literal 2642 zcmd6oJFe9*5QZnX2%_LnP*5P9mL*UiBGJ>Zpc^ALX7<1WvV@c_q746Udu&H1+Rd(NlNUtUORAMt*N=WBTe84`bu`5!Oy^9+O!o2v3TG@tnsV?o4am#Tjp z$dI71KvX0>2AB-!QsZ)uQRx!n>cY}@dR4YJHk;i4VA||fUy_@NcRmLb>|#4(i^+{m z-x*s??$YGWSTwn7llv2PX5(+Ovv?oNg2nqlp1sL+dt|5{Jk`gZp{=c*?EKX@m#mf6a>i)S2DKGoM9K z7~5Je&qZFbSXMR|^Tu}R*qr0t#d&!n__-jJjX~auycf6J&n`he2!3vDa<^=gtI0)~ zvfae)MDE0OYzhEmTa%lO?FWW4IE$++3JN9aj-txqU@=E}$_5Ps<-AjGa;~v(9~(7b z6*M?qirm_>OSZdSnjFT-7qXFS7pIk78;d44k^;~rY8?4jNx2OS?i-uPBKB{Y$hHyJ`%1PV-<550AzO}Y%nZtAMg^l$exIQL;MyP8 z-mpo7YDCFE4zdmUhfv4_Ecu5xc7y_kuEc?Od7Qx5Ns1R*q5uG+3n?!OUHE`6?9|wb znuNTtJ22$=hGBmnWD$z6S!-{D2GfD{77QSK gfI$L`J32ZTV7Rvz$iC6R@S_800ucZ22V$Uk0CvhM!2kdN literal 0 HcmV?d00001 diff --git a/bitmaps/q25o.bmp b/bitmaps/q25o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..caf5bee710f2336f5deb9a7489faef581045c759 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2seQ69|rk`-~Zn?{9xd3 z`1}7p3jh26?+qXBA8+`^VBYZN?(BwFt5$>YwN+ai&ShIR^krK#_?25SYq3>(fRTQ>A1TQu+`TQKl_-@!1aT&Ceq QvV6n8$NL-pe}|Y208G3(8vpKN$GI7{o^A ze_&v5fZ+!W%ngr}l)?Czl3~NSWXp!WWQzvAatj8&?>iXgB+E4XNtSQ;_kBOuT#(rS DrCT>& literal 0 HcmV?d00001 diff --git a/bitmaps/q29o.bmp b/bitmaps/q29o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd08feba8a8b0319f08006d952a0dc558ebea6e5 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>$?M2KFC+{{IByzYMHD z{?&i}@vnjV$KU^dfBdn3_~Z8hxgX#E|F8J)$fn|(sB^`a=av<3o?GsC^=j9SSGR8M ucpi1#;#Es_#Gk|ApEEv=0Ez1YctS literal 0 HcmV?d00001 diff --git a/bitmaps/q29s.bmp b/bitmaps/q29s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f97f1904d9844b270df03f1b60b3cb4d5f8dd6ab GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>$?M2KFC+7#P9$FOdG% z!2RP-{YNnW=K+}?KkOg;_`twWfs7w8Fjzd|XtH=DameDC#Bqz~KzQEb`HXgp=NxUd apE=H0Je={zAo0h)iqAj(|ApEEv=0CzgG}TA literal 0 HcmV?d00001 diff --git a/bitmaps/q29w.bmp b/bitmaps/q29w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..929c7d4d5d33879a98ee16be4b2c4416b0d18244 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q352d@If#WkPX5h@c;jR5dHzi4D3JtFfhXLKL+L> zAPf`x!NBn20|P?^GJe3oVDX5f$>Nd3A&ch{$1R=%;dzVaGumyRbF|lf=QwBkc*Z}A R$3Om8eE;$PFVr5OeE?A4N>Ts- literal 0 HcmV?d00001 diff --git a/bitmaps/q33o.bmp b/bitmaps/q33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d1c7e0aaeae0146ea8f488c8a3f041706819befa GIT binary patch literal 326 zcmY+Pi6b4|<%IFZrjumVmv9L3a;0R8DxPv_#poJkMh5!?2hY1axlokjHBKPEf z2ZfjXeEjc@Y{xWk&NjJiDpi--_9sCQ*7*sm#Pn72e39J-7} zgifZk;m{=!&xdnuEcm;I=!J8&NgMb%zR$4HCp%bOo<8d(Z0RKr^wLe)!cBAZ{B$i? lCt&YRP^0@{Sh3Nby=|=py38zfPb1`el8gv*BD?qhzkgyVd)5E| literal 0 HcmV?d00001 diff --git a/bitmaps/q33s.bmp b/bitmaps/q33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..34798a258c971305bb392ef554bfd5eb3e569644 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@up#sTMlk({fk7T5 z4x|4wFxZ3m|Dg2$1m=1$-~Jzp_@4ue^FiW&?ElGw=pPIW{P^e(4Gird`424uVESW= zz;O`&V~+%w{@f$+9K?U#XYm%*X(d-~dur_#l`GCG_c4N z{krcv8#?&k@Ba6li~Ye^VzhL=t32I05)%WJvuKGl_zZ&!05Fh=^S=*f(|sFOXa!JE zmq8{i_9h*0$Q_%IHi&xzV(it4b;$br5}?FhYSSm0FV{`9(2F~%eaQSUyV5+Y4NU5< zzzi+^{%0C&Z`f1c9ig%B8a?hgcJ(1QNZjLvjL6uF6r96;lVqeR^yUh6a6tI~U%s7h Bm(>6O literal 0 HcmV?d00001 diff --git a/bitmaps/q37s.bmp b/bitmaps/q37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..76f72824d74236d68047a77108ebfcc9fa336df9 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZMN7$AHG26mAA zKL!S7Fx>#5|3k(98!)7U_0Ru*9!$f;VfyO-e@52-hk=0+#D~!!Hdfro!T}aP$RYuv zKOAP0r~uL*53|W2)1MFb$$|KvkN1P==g0fyEr9&P&-?8pkm>jL_ksA&kKYH&|8MT& Y{{iIxZ)Stg$Jyn<{Qv!^;Q$RE0QVVk{r~^~ literal 0 HcmV?d00001 diff --git a/bitmaps/q37w.bmp b/bitmaps/q37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4ef25b05806dfc6bdc6e2be76fbc8f11174c4f7d GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U|b_#l`GC z^gjj$W@P?4WM2!@$4@QV*mVKr~L=$RYujI|!u@vw`^^53|Ws z0QJG>&xiZuK>W|g`@!_{p$9{dN){`hEXC2z?(+KR|nI9m^u#LJ)x1 z_8Rb@9_Fm2^q~amPY@}OtgF;>?GPfhzhXA2|EDd+owbeg&;GExkb$$P=uVc@zo*=r z8Rj?cx!C6k56Rb4h5_a1olIp+#%PM3(S*#h%rurlQVyJRFcn;=9z^wh{_pk$_P?rO literal 0 HcmV?d00001 diff --git a/bitmaps/q40s.bmp b/bitmaps/q40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2952764a08327f0c2a45b6986bb2083dcb4aa9ad GIT binary patch literal 382 zcmY+AF%H5o3`Ns+WME)MW#klvvU3Mc0!SGcIa8)wf+3QJu2dbuP+`8E2DO%cp1;2p zMLC_Xh0$to?q@1Y3XZ^Ll~f`ZNinksr}j&Zrq(&K8}x+^vUg8jGMS5)o?m9Gv>cRq zp4pg2_bU#3cnU?=E{o4!JAtzTur#TGA3$@C*y;y&qbtDti+V Q{$sC-hS_v{KkdDJ0lkWYjsO4v literal 0 HcmV?d00001 diff --git a/bitmaps/q45o.bmp b/bitmaps/q45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e04239ed789a6a5e49e693a8c46ba0a66b985306 GIT binary patch literal 422 zcmY+=ze~eF6bJAZ3ubWW>gMXw-N}NxxcVo!Wfe*i|B<=~j?HGF3XWZb;^Yq~9XjY_ zhY&BMz5Duomj=^=mruU$9Y-!_=l6m5b;{>4tGBH{>cJI>59-?EOiLF4Eui%8wN5%d z2iSz{JC4^a(Sg%Go+MbQ3t*v6fg|-@#OJ2p_zd{{Hz>QhFO|^H=6nmlGH)(`S8DIV z{hs>r`7xyH*>HBNW?43B8%5&>&0DKgG@dY5KW3m7zh)3$|C<*kPMGtevg#L2Pek7G q%B7bgk2LviX)H8Pm)7+U`Q7u<`uojIyyMa&{gQK(yZ@8-0{ed(v*N4( literal 0 HcmV?d00001 diff --git a/bitmaps/q45s.bmp b/bitmaps/q45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4a0b728820ddd5bdafda62bf8a5d78131716657f GIT binary patch literal 422 zcmZ9Ip$@_@5QeWzj0Azjfy9tZA_ydS-eHnQm>2_|1jlo*AdtKO2}=;zE(j{R9shNV zY+Um9>wkaSq_VlOVDeOcU525 zmwPpDr0(J`%tPUcsKxr+f&8oFif!|KOGFC&f1*W%<;M|9e9bTn0`WDoFqn$ZbR^8d zSp;ew#o#N~anj&3H+DNEI=@Vr42bq%+->k(u=w+%DCfvIHP-zr)p3gtoh%G;Htl(S G=lcP^d8eQN literal 0 HcmV?d00001 diff --git a/bitmaps/q45w.bmp b/bitmaps/q45w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..30b954b736da076a20bd83df08986a5577a1a87c GIT binary patch literal 422 zcma)&F%E)25Jd+mw9?j2OB)kPDoO0U1EoixAYkHMJcm?VfCG?F*e;=P3)u0`0uc%m zC;9vK@86wd=X`lMWb1_W038Q8)CX6fSoc~W6G<_%h*{fxPeZQt$d@=bpgSQC=X@jD z$h#-e?jMf#N7B513-6%MFCrqsqW7pN!_f1@k1Rva7hkGKSSuC9(U(oF;sm~_bt`;< rsZW$Q+N4{eJD98{e0MB9uR0ST=S;WuznO|>tW*+cnWLW1bC~Z3AakQr literal 0 HcmV?d00001 diff --git a/bitmaps/q49o.bmp b/bitmaps/q49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f0d9395580a88fcf041bf0ca9b1830506ad4d8a4 GIT binary patch literal 454 zcmZwDu}T9$5C-6h58yl4+1jKLJh1mUEK^uY+_m#%B%RG7Ya*C3O(5Wbi`5m!-4Tuy z$#MHT|Ha@58Tj{OW{!j1>zj{(bakcYx#r?G1KBU0l;!C@C%R);02nQML=nTe)h$hc zXnG#zL1fH*09yJDywg(Tl2$;|_wd~t@W{CrdFa&tQv<+Qi3+@W2Fw!mb2@!yUk_hy z)wa&=vY_T#G|ls(Gc7t@T9n#1&Xr}Q-oJiTBP+W`ozQU@sav}Ev))BN$*g3wwzAqr mzt~uDwCvfyRNBusFsn818@&TPR?s8Y zkGo3~$ZCD^P{&fg6U}Lx9-6^H*$tZP>5Rz`5vGRyArP~l03PKJaYw6lcb>HS?!cV= zo9I%nK)>sI-^Jp|zSY}n+w&CO#d%~=`G8MD-w$fTpmr7pL#<0XQa6k7h?eS+ zZX^1j=Z{6{%rUpfXfO4n71euEm)@aNByfftW_XhR4u0dYQQE%+}|L2!=%efDzo1(A6oC;1c=MlQ_ z4N|IvrKLV;2bZ*dA*t=Zl;<8Cig>gKPvI6k<8g2e55AIM0*_u3XC_J7@7_%To!Y-* zFgWxl9EKe$X4CQ4_y2E>2c#yRu!C(b!3l3e*7B_{GewF89mty@0 z6^E`Zx8xvP{J*qChlb1jj+ggdNbdaN=s<+g#QPNUY&#eEINVH5-KGogJx?CA zVV^5e<8_Nd2^Y${2rf}k{&N>!A+Lt`8g)OgMBWlw$MPlI_Wv)dQ$zj`i%67G9Cl z??k=$yV89c2FIxhnl#T4S9wZS6;2WrCH7htIRCt#g?pHrpj9U0dvbC9sNm+`u*LQp Ig!o>60mw^ARR910 literal 0 HcmV?d00001 diff --git a/bitmaps/q58s.bmp b/bitmaps/q58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ff10ec8b295b78492a2a8153b5c2ea33d9b6b718 GIT binary patch literal 526 zcmaLUv2MaJ5C-52k?NrmW@M;v$38;`jJoqKj2&omTVLxoRvw|K11rdjD_JrBIkAvh zT1%JDzB@aL^Rk{!sEj3^Pl)F+8fr>@58m#F(AKe?a?Tn$WZ;%3YPBA*(ZEmG{NoAr z7WHb~_npWd^&Grur`nwKyjrjQA(9Emf1&RT#pRwL<6P>l>XN+VANFPKef71(02Ml`v literal 0 HcmV?d00001 diff --git a/bitmaps/q58w.bmp b/bitmaps/q58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9370ff4851759be63086ba3832f762ff1f3f5302 GIT binary patch literal 526 zcmajcI}XAy3KO3{HIVstW0QEHv;8^$)M;7wBj6 zx_{>R*?bOTKZX5BtY1p1Dh_YnV($2>^7B2%ZC9&N-@Yt0EeFWUf>z=X4xux&o?7;m zNl}YC_BDE95D$Eg?wMjGG~qv>K^j|bpyH6Su2E6poShKx9?)N584|cTBuuw z{i1QX#2lvw7fz44b2o3oj1Nh9ba@FJU0$Lq(Nkf5*zg9Io6LLrLabjiH~p{?H$ipx zX2D~}U1ncZXC`KD$b*j}WIjs3SEhQuJ_<&fuKJy6@Tuv{@mNGN4dRQozX5!!(V>q zsXw#BmsDrUnrO{dn*{rV>Uh+jee;|qL>z67TG+f1epA7{{=kgdss1Lm@#ClHXt|)Q z;=#h=^K#*gL%u(EBlvI$2C#xPfDvrmC#Ie@EpGaOj9OCV#};2Cj1z~FUb`({(zd6M vV?Oot-u=kFry|3bIN{9CDz3%M_GYezW2&#A;BDS&_yn~@OBTXA{GWaR1gIz{ literal 0 HcmV?d00001 diff --git a/bitmaps/q64w.bmp b/bitmaps/q64w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4aeba74e3d39d0c5d11dde7b843dc71f62246b31 GIT binary patch literal 574 zcmajb!A-?53BjE90l-GJgAU@+ATw{h7Rdi=#oK|Xs0eEUm?)Jv&rIus#Ch8lRbAyzDR~Z zO0|^eD=5g=t86VQi2L{5JEerCp$B*T{PgsfjQ#Gz`ABiaIA3DFAGW7F=Eu1HdDrb7 zBzD^+B6hpwK0oFwHNqu!DxAJ^rxNK^$h-+r=mNUsnDT))%oof%%#h06YiHP5c78v@ zId(R>Qohm5O@e;!EPSrG9Cf9Jj>dc5^)>qcanG5FdoE^};T^gwj2wl`HEtP%^{RIcrl<49IS!h2(4@@cqeg-) zZK9(}{B5Lhmr2W|9JDb#E5FN&c1%yppV{knPM?%F*-3jte=O(OwEbb-Ps;P`Q@cv6 z3%aJuVjRutmR_urs9$gBixoWiMTaXLnMr5eC3GKJ>!sc^2WGH*lfkmI7MoX6!M^x# zF1KhZ^znl;7tFyLe0|TBclp2k8*feE&;S4c literal 0 HcmV?d00001 diff --git a/bitmaps/q72s.bmp b/bitmaps/q72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71ed54818bbee1fda08903edf17716149229e373 GIT binary patch literal 926 zcma))K~BUl3`Ly@QWr?{29zbIAR|_6xC2LE$p)o}#oU6k1hJTFbkqyXvJz3ux1EX# zhGAUUef{}y6D7CzZ=N)6P_L19H61zCA29xWZn=UYDZ$K=7WVxYC-N9l&w$z(XCP5f zeXrb}%%AG-)ITkF*|Vq~)w5&{SWmV!lz@fh*&~abStcLnyoO~Jw0~yVqwy5cr*w5M z($n@ez%H9dfm^~W_sZ@ls|EA$mXtW1*Kn`YU&uH@DU{CW%F{1)s`sk9bU}~a*efT| zbCWLV$q(Ttx2o?|Z&RS`jXUK@^#xC1h*X-~q0bbROJ#oH#+V0T7Clv#E8Fu9`iAwE zM&)|SJO1EJQPFcO1g5wJGZ;@~<3jNtW(QA?Z0lZ2V!#86` zm_@*1X(lhv_BcPYd3d#?;|}=-u`OZ9sDH%#ew||lBO!yCCGyDkKXD+7DP0qhUFHc$ z)T%!!H)nIbchXoifl-a{13Kw*3=^LAHNw>CFZ^N3NY&hlFg)4ftu|u6N+^9dQZ!kT( z%&qdIzKx!eQ=U5Ixka7HE2qNz!Y(sMVHO_?J8;hj_#JDP`UAi5uKdB8NBE)mng{q% yeb0v985uQUz~l!odIR-o=^r%vAB;NqnYpic0FQ+kb(a2TocqawEN3m_gg*d8d`+eR literal 0 HcmV?d00001 diff --git a/bitmaps/q80o.bmp b/bitmaps/q80o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d462baee565363bc93b9af13dd0f9732a1c22d99 GIT binary patch literal 1022 zcmbu-F>6&Z6bJCUc6furMO-R~Sse>qbn%G0=y&iVxF`s>(xG;cOX=bRF`vP2&@P68 zn6Ge4hOGBCO9CPB{FD2vO9%15x&7VKlk<}I^5SLQ6*Zpm^D*b^C0Alq>*xIc`*&LI za0Q7dr68B6@Bia0M9=Hn++{q^KVOw{$jS9wKaRWD3B4szHCRgX8XT*$;Fq!WmpyEG zuhjV}2q9zhfd08z!?t*@VWy46TJs8rm DMWcj5 literal 0 HcmV?d00001 diff --git a/bitmaps/q80s.bmp b/bitmaps/q80s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..456c99a301e2492e26a32d2f2cd08249eb478c54 GIT binary patch literal 1022 zcmbu7K}rNM5Jl5wkpUMG+{{9(tw(TW#J%8gX4gHq@EBetuDnLX3uIYB=vY6MaatWg zv7nll-#@<+$j$9+O{**UUP#~d9?a16DF087wU0zWqiU__UTys!o{br0zvlLM$&VN{ zG+i915uTzPzVUVY(eybsZhrBhYRg~pgoWnoEUTVpnGjw(<6fO3)ymxyvG)K^(0k^R zAECc#CgHxUEY@15#xwHb_d7DS8bdh$lC$a_`cItH4aiyYmR)j*w$SgDpT6<~`|LBlKz9Wk64)zeWy+pI zV=BbNfkkI3LED(@m9sY{IpyRUk4$seaS4Z*N6`tM>{BSAIOLQNX&%{@Am^zOb9Zk8 j=lS5|4snv1#p!$Cnp`F23YJ187&- zHNjJa=^T%K_Ms$y21;ffIY2k!iD3Ja1N82>glG6qoCSHk&%ooI$2Vs2c)WMyB)WtC z8%Ob2crM}%Hr$ARqh{SXY{6TD9A=)2&JQ}6`BwCiU!dQKo=q^pH=eVJHh7JkeYVj? zzdtfHJ{0Km2K`W6a!L4A_yf8Xj$l`Oa+%V1_QhwPDYIUDp^PS_(#lS$=tNJp@l z*xeS^4*$&V9pO$Vkg&AQ=gI89lgQ_9-#sC{D%@XSy-#aF3#~uL_n)4|wM0dhT+A#h zUE#moP=+kcX%LSG@hC@8p>|aBOh(<*Xr425t1}D_+(gp3^xSM9Lo_|3mITbE7VF&Pg0( zD>jSgB7@bNalp(XS7kxriR^;ivJ1 z)<=t+O*oXKH62-_)h&reXYJy59)PQhSE>>eXOci+Y9eIm`+)$<$J zsXxv}%&U2Oxe4L}uR<9%EZ!w&@Se{?$!EO3=dY=Lje5%&I(9q+3VCuL$ltl5(Xc_! zf!&&>F1cINFmR4DZn(XA)aWnJGco!{gVa6u7CAmgYR9hVD++e(;A7!24;kL_YqzGsPe( z72(Rxm#h89iTwEVd`a4BjCbfSsTWje{RaQPUR%FFMY=R*mY!Ptw_7Tar8zC)aU&k( zQM6F^>Pp?J%d zsBCQ&!_jex85{PI!qGL26<4V5xSxNsFH^mp5$y1cH~!(VLTbm})*=;dkP{qIJMI_0 zrr5v(9IzioQo(IHOY#=Kc&sK`_vsvF4i0tSu;fHN336`aOywi;j}<)k%fd8Md8R)A Dd1phf literal 0 HcmV?d00001 diff --git a/bitmaps/q87w.bmp b/bitmaps/q87w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9ee8e9114f9041148acbfc8212f5bb46ec6cf63f GIT binary patch literal 1106 zcmbu;u};G<5C-5gL1ar72Bv0ZWMn{z#LmLPt1zI}RR_ktk}C#YfCn(*1;Umg^6}r< zDsBKN6^@*Kz1Y7KE4jV9KP7D~&X?#9sT(p{KgadAD)tjpq)TIF>8XW(+fson&9R8b zA8{{BQKNS1Qf<}6Z0B=xd(EjeCwIQ?vCebm*pamOT)C~3u@SNlN-|T2SSP8E$t!qB z?q)hZA~qW1k9K?`tjzVvwfKxK=!)DAS6cU4U(hvR#6lM8sm24};YiJw#b1@$c#7_sILB-F`1(6Dz)eaR)p?AR?1>`*Ng}i{D7@p+?XXNiIxQA~G(|F}fe*tC2B@h4r literal 0 HcmV?d00001 diff --git a/bitmaps/q95o.bmp b/bitmaps/q95o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9789e101e3c931bb6d05b5d821f3ae57b299a42b GIT binary patch literal 1202 zcmb``L2lGA6b4|2R!XH-`+OZ@CO&b#+tPnDD&?Hkk&OKnsm@sGIw>Acogh_JGhQdrlL zSK#_jo|V$eSWr616G^2Eb55$O4LpMAw2V8Fm%sS<`Qtn?6(_^kQ0EoL!u4dCH%j{I z)Uq=Ud_F03MzvVhS$#)eizDB_{F&!C=dowQ{82OijAcm!Pm&%R0Q-@h*3yo5y87-r zj6~TpF56Sefz}c(0mee4L^!P;;ETGSx3p?zJ!_@l_!bk5N}U?`hvJcFzR>yg+3m&U zl*Qe4yS=JTUF@To?io+rY@!y2Xz6F8Gq$-})4_VpO8aX2yPb79IPVbmt1WD;v)*}6 zch*|({ejli0e&{sv06J99Q`ynak|O)nBR?a(WMqH)fxV_xQL$yZ_^F^SQbCNaBeXg zYr!SQ4h|Zg`k8U@xCwh?4Z5^txAA_p{p`bPP47!IWmjH0_%&`f^GQD8GY{oq6Wi3# zY8d;h(`89RJ{x9y_lQHRb8iZrhN(;Us}DzZZi%P6;#|I#bDI=h&vtHL{_MzuWqFH* Xh;c0C*f5Ths@Ybj;g_j3{vZ4kyoqZ= literal 0 HcmV?d00001 diff --git a/bitmaps/q95s.bmp b/bitmaps/q95s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..69eac493922a83ec5f1571a8ab3b49c4438977ba GIT binary patch literal 1202 zcmb`G%}vBG5QQfg;R6!sfLy6!BXOq&n&1eEr9IFO6&P(JMl@i=#Rtpgy>YUH<>#=% z(yTwf^^9Mf$@R_Csp#0?_X=@4M<<=?cliI|yu}F=21l)xv5c|+=A$@?jB{>g{YmR6 za)FwWvdBOViqeyPWBV7suJ*q=U1;um)3xThKHPAOthwfVPx)T`s;Z>vN-L{j-7RzVYO-D!;H~t?D^U#5_Mc7FqP!9aBXNa~n!`z%bkf^!aLW zxxe#l6E@0n4M%Yl$8%3)D0q!4?i~8b8Pz+?4DK_;~^6HT(<$qn8{lMlJN(c5GS^%XyZL!V5AzD0KEv#r}NTr4u+1yf0% zyom;S9H6^P@H4oQL$|P89Po~N9;@oRnnq>hZpmA%Q#!JMlg$DyGWkszz--GYq6ZQt y2y^ez^N;LNK=&ZmTjW;ct{G=}%a0v8tc1Sq8l$t(-3!C>p7BxanY8Tr2mS!7rLVsL literal 0 HcmV?d00001 diff --git a/bitmaps/q95w.bmp b/bitmaps/q95w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bb4a847a83656e97e89c930369999133b86fca91 GIT binary patch literal 1202 zcmb``v2DXJ5Czbq8GxO+fz@UT3rL?CvP60kaFKm7!39|%18@YEDg-kBj#Nw=31Aoz zK2bvCBi2h_hK%N~`21_%)((j*Iclx4wxevo`7URosn>$~27MMG z(JVcalDwFk-8~-r=vJ~BdX66V9lf@FgIs@$$J$#w&M2N!m3V!CnCR&muxowWucF~bx%gEDa5Bun%Wt*CPw5fTD z>MZ%(yfjbjvJ-P)_3G3!yTz$1s|)gv?%EuZU!C}bYW3;D#Z|^kaw?05^8}}3mR!w; zY|%AO)zx@NXYZ5QauR>mWv*}a(x~luM4w{inutCa+=wagu}mw~H53XN|AB>M-}dY* tBs2eNc0ETeJJeRxjxGkdJnYCZR`M7`jYrZW>c;o_@fyw+ZP)yRzX2(GkAeUI literal 0 HcmV?d00001 diff --git a/bitmaps/r108o.bmp b/bitmaps/r108o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bb23012afa0c6667d3debc2c57861feba09563aa GIT binary patch literal 1790 zcmeH`F%H5o3`Jd#U|{GGSUCli*trQ;KtW<)u1J(*EgV`lZ*3e0_&!(Jq&to?l(XSTm>sPD>c z?{DO}a-rdY(eLvdH#D^V4YmtQW1i(f%#V#X;3_lTgG*<80v8g)_m?P^+_(hyUo+O9 z>-?YP2EO<{TJ+G=&klMhoat)~E;HkXURAhire_tdn#dUX400qAL4rd&2=*yo!g7`o u`R<$(A1SNXugK-^cw4!HzpL-Y1*H`Yz5amlJda!=&$oO$o(`!0ExrN>^c2%fppVf~O?6g1BercI}&srR%aS-;#cVRSc=n3)BbIbgkW`2J=#Q#hu@Wbcv zVIIcw6L=oL+kDl+rLiCs%60+RJdgjsmJ%ho>H5Yq;&qBOe`fL7*>#Xd80vkOTS)n^ O&o8@YyUP8&Zv7YFRPUw$ literal 0 HcmV?d00001 diff --git a/bitmaps/r108w.bmp b/bitmaps/r108w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..196f913ef305fb46705dc5b41526441ecb3152a5 GIT binary patch literal 1790 zcmeH`%?ZOW429(unp-_WuAQQR-n&V6NJjGz8K5Kdm_x9tUl$C$m0)NDa`+Um9`e)e zo=+fgrSn4hunZ8Sp6LI4);v&!lLHYsKk<^<#;jWCjL7|SV~nc_>QMAG$3C!V`q1?D z&XX1f=cGJ3Kb7g(_5JCj2!$8nh($ literal 0 HcmV?d00001 diff --git a/bitmaps/r116o.bmp b/bitmaps/r116o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2207e9b7528b33cd91bd21137f9ef711f57a1f52 GIT binary patch literal 1918 zcmeH`I}XAy42E487#MnluAG7(c5cH8RAOM{N=OV`1H=W&)}e~|?K~PPAwWn7AuKt` z7dx@zy3^TmKq_O5Bk0^~Mw#wUU|$TK_OK%=!px$HRA0cQ<|aeIl261tT*UmH|GWGs zUKt%+JPrXdYyCdWA)gTc5pP(fF+ShD<9g-!u1h&qe zM>be7Z=rghHG+Re4Sus8-S6LF-#@Wmq!A&~mTCV5xsH;RGD=2BnF7W58BQlk6d@5yw(|KNcAQ^1 zoo@|@9VqU}FXk0gl0VY=b*sLi3_BYlvS&8@04M2-m-c zWgdY)fA;;O@Pnf0!Sus26)yEv>aSP*@UKetC*#)G5Q6gLOoHS6Rt}L03P-w#jRgB~ k-Ou~}#ks}=afG@4cX@&uyX<})hDMohmRLC(20ae&0$rGFH2?qr literal 0 HcmV?d00001 diff --git a/bitmaps/r116w.bmp b/bitmaps/r116w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..918d8d707e034add42820a75e1065cce6afc3914 GIT binary patch literal 1918 zcmeH{Jr2S!422ysbb}*w~OjR*51gVxB>5Hr8<>@K6 zd*6W6h1N6m!#Y5a{VUC%N9_acaC0Fd_o{LQoJ1QhEwUcRN;tV7)#n0R6us4Rxj<)n zN4wBqJQ-6iBoA3R6rPo1;n#O=%6!rJX=n9w_d^2Vd9eI=Ubgw#=5NwG@lz%FOvZz; uAw3r|H@gAoK>ps21E2%{gCi#B=8xXr@&XaZ)&I#>FY(vO{N33d$nXZgkPO@a literal 0 HcmV?d00001 diff --git a/bitmaps/r129o.bmp b/bitmaps/r129o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e76cd84ed166848f1edfdc3390fa1c1890bfcf6f GIT binary patch literal 2642 zcmeH{u}+6D5QmEnCOWvdv-%V^ad+{33^fkE7RDFBH(>k^g!8*=X(4fdKZ{0wNw3FO zTCP{Fk5A9n&h&u2r@f|Dxytw*<1aU{T|l&{L`2&{A@V=SIwDWH5(&5>Z31+cTiIvH z0d8Okkv*(sg`~}~bkj`d^4{cY3h*5#@CMy)XL%!RV~Tk#>)E2|w#*%Be01`dz$o3Q ziiHUv>b!sN|rVkIp6CEf{juyk;VbwWs5ZjaHD9VpD1>-v@PJy~jtx?B1|BFk2(7*V_-SO R-DIukVELacNx|Ejmv0%%`r-fp literal 0 HcmV?d00001 diff --git a/bitmaps/r129s.bmp b/bitmaps/r129s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..93b2c3970bb9d990c5ff307301bd4b2b6333057b GIT binary patch literal 2642 zcmeH|F>b>!3`ON+D9{X9vU|-bDxiCp+$S)N4!xFp6ZHleGZ5z71@vV_b{UYH3(=D`5m`ti)0 zI?1JRMm4_~mdbkyr8Z7p9FW!f{4C~z$7#-8W|s*&Ioo26P$=9v!a&9r#@OgRh?QNO zb(OI*Aiq~Vxb~Yckhwt&Gu}px`;iOgFEJiB$C3mvOBp3DVO_|=mL4qMfozOl`{O&a zPjQ3}iSNajbEXsazcMzr&&zqxVgZXgVOf>QS&|It#w1)Id~hb4-q>3~{cnqTu@$7EY1KM&yI#m`{zN^|4jPC8r6|o?g AA^-pY literal 0 HcmV?d00001 diff --git a/bitmaps/r129w.bmp b/bitmaps/r129w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cc3ad72e77af7cec6662861d71cbb39193a5832b GIT binary patch literal 2642 zcmeH|F%H5o3`J8IkQiWLXXO-BVrSt(4L8dnI6#iT$WUQ^96N5MPB5TWvE(LsO}jEItt%x6AB77@AFhR9<|6a-*c&zVKbqvS>f z0!hA$W=|DiZ~6AhT4QfzoiS1dq+0O^-V9mD8*y4}U(77YT%N6r^srT3oU0mqsX@rK zHL5qC*{Civ;(wOb;8dNLesHu}o$4D=-#6%;L0JmMV<7|M6pS!l^JR(b2wB@#NggRW c_aEk6i*I*5H)zow;h0rc&ZLQg*{`~M05qQlFaQ7m literal 0 HcmV?d00001 diff --git a/bitmaps/r21o.bmp b/bitmaps/r21o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3dd5f0943b179f82c23e30f7031911cab966e7b0 GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKIxgnSd$Od5$`2YVu5dQ$<2MiVr&;MI6d|;?x j`1$7t!ym>U41fP($1pjN+VB4>7``Z0FnsK(fSUyX$rw0@ literal 0 HcmV?d00001 diff --git a/bitmaps/r21s.bmp b/bitmaps/r21s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3e731eadff52dfb7033d420852166ca1799a7e8a GIT binary patch literal 146 zcmZ?rox}hEc0fu4h()28k%18`5dtKIxgnSd$Od5$`2YVu5dQ$<2MiVr&;MI6d|;?x e`1$7t!yiW6`0rnc+~A5dQuDeZvn1 m{)RvQ=QsRguy6SHe?MOQhd~~!9;EL#M}EVPWPZ4rAhQ9-3QQ{i literal 0 HcmV?d00001 diff --git a/bitmaps/r25s.bmp b/bitmaps/r25s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..91b184e8145e5b5c6a5ad7c46ca513eecad2b817 GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd)ZxgnSd$Od5$`2YVu2sgm+2L|?r&;Oq{{9)j4 p`1}7nkd|-w_kVxGKL&fe_|O0O4Zr`tZ}0{}GDLk|D| literal 0 HcmV?d00001 diff --git a/bitmaps/r25w.bmp b/bitmaps/r25w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cc4ee6f874b1f2efc0e558913ae84f79cc44a3ac GIT binary patch literal 162 zcmZ?rUBmzZc0fu4h$W$zk%18`kpd*I@If#WkPX5h@c;jR5N?3s4-D)LApC=YAB_Jn X$T$3BuqTK?>R@`nbTU8OOpw_CrieQ^ literal 0 HcmV?d00001 diff --git a/bitmaps/r29o.bmp b/bitmaps/r29o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6b725f6e4f93565a11e9a6977a35a8b7a9b86a21 GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q351uxgnSd$Od5$`2YVu2>*cL4-5*cL4-5YXAQK3)TxZ!y@s=A0UR=0ipr?5mV&= literal 0 HcmV?d00001 diff --git a/bitmaps/r29w.bmp b/bitmaps/r29w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..49d7640133334df02caac8c10b76c0faf567635b GIT binary patch literal 178 zcmZ?r-NXO^c0fu4h-IOek%18`Q352d@If#WkPX5h@c;jR5dHzf9~c-aVE7LM;}01A d&%pfSKLa~a_#aR$OdpuGNc`~!h+%esXaFFeOUeKM literal 0 HcmV?d00001 diff --git a/bitmaps/r33o.bmp b/bitmaps/r33o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..92e47c3fbb8a082c982c248cd3cd40cfb7c20ee2 GIT binary patch literal 326 zcmb`Cy$OI&41`ZB!NLUuv2zLq3p+;=-Ao)r9Klxb=X^=jO0Y3-`End2q^v6sTDj|) zQ+mmR1%X2ontYduq)3X`+5E}{h$LUhS$O+{?8QF>3h`{&Dm&P|{`i-G?!WJDKqB{c Ra#9Y1aU7Lf9Bcmd=Ly&kf#CoE literal 0 HcmV?d00001 diff --git a/bitmaps/r33s.bmp b/bitmaps/r33s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da4d22181574ff0af8db2947caad43666490c83a GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dv!+z`wJlmlT9`2YVu2>)+@u(8rV7#R3L@^Je9 z|9%kv9|MCu3jP28eh~jZ14BKS-v19`UIPPlY5RX*^I`V?`Tu`D$i6=e4Du+nj0}Vi Ir3v{H0G+mMRR910 literal 0 HcmV?d00001 diff --git a/bitmaps/r33w.bmp b/bitmaps/r33w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4afebd19137e7f6891d54bf031b93462f2587393 GIT binary patch literal 326 zcmZ?rbz@`z13Mt80mO<>%*X(d-~dur_#l`GCVPKF4*@r>P$UwxQG$DTi0EI$h6#xJL literal 0 HcmV?d00001 diff --git a/bitmaps/r37o.bmp b/bitmaps/r37o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..58139d72ea2687b1a80c1f5fc76b012b746234c3 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZF>F%bU!|NlQ^ z8Ycd~{{MFn8-r$GUeKF2LRYyq7eW9 literal 0 HcmV?d00001 diff --git a/bitmaps/r37s.bmp b/bitmaps/r37s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c46138465ca8b6fd931c209b1ac7ec4471251419 GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U}k+z`wJlmlT9`2YVu2><^9VWZF>F|4@${|B&o z1_pMlbp8MDVDSb9elUIi|9vohfI*(BG|XI>Jy7@j`~Uwp$ew=;49qArKYKHnk4EG2 HKe{*oF?)Y= literal 0 HcmV?d00001 diff --git a/bitmaps/r37w.bmp b/bitmaps/r37w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..528e2ff1c9b50f043b1bae50345a9179624a0eeb GIT binary patch literal 358 zcmZ?rO=DyL13Mt80mQ0M%*X(d&;U|b_#l`GCKkT>eKF2LN|nbeRAE literal 0 HcmV?d00001 diff --git a/bitmaps/r40o.bmp b/bitmaps/r40o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..000fc3e24400822260e1f3a38c6a467a0807375c GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhnSk;j3|px$|MxVde=zWa&HoIw=l%cBU_Q)U`=RcI X(K}@L!1BBAzC)p#4?Y0%afA~9k;%1$ literal 0 HcmV?d00001 diff --git a/bitmaps/r40s.bmp b/bitmaps/r40s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e67094a19ac5f498dc1e3fb3f212c9ec87fd83c1 GIT binary patch literal 382 zcmZ?rtz%>W13Mt8frJ?uAQBEhN|+mhnSk;j3W13Mt8frJ?uAQBEh>IxqOGXdp67zFc1~mQy21c;_2L^U9{eyv@F7yYeJr5X|!S=!2g^O-J_yDX9oyHMP0G!;1q5uE@ literal 0 HcmV?d00001 diff --git a/bitmaps/r45o.bmp b/bitmaps/r45o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3a8467251188f39771e12752daa423e197c18609 GIT binary patch literal 422 zcmchSu?@m75Jk^4>0k{SR!Bk59t;6WrpXw|67(J+=}bZN`Tt@|5QUbLex5J?%XdCs zx?o;4zennn6>KrC#ACl`M^91#kbtM3H~C^N(4QHbH&}cOz^HrHY|Re(AG1FKQGEgi raWZRi{}+~d+{5Q{uc-NDZ@#xu-vH^8x2pC2p879_srEcr%KzXSZXfM@ literal 0 HcmV?d00001 diff --git a/bitmaps/r45s.bmp b/bitmaps/r45s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2d8fe11b9066714e7caafbd4824d1331d619ea83 GIT binary patch literal 422 zcmZ?rUB<`&26jMF1Bi8@n2`Y@kpZNx@If#WP!5Da;Q#;sApHOT4=@`m{RgOy5h#z7 zw*UYCAxM7%0|P%cdj9|a=Rx8Jpz;qG8010x4-5?UAo~0N|MgHlU1*qnKzD%c2f9lh iWPbzHeL(*_2k{vg7}&AVj34a4;^;Im82^LR;<|9><*aw gVE&j7^dHDQ4Gat*0+as1-vAcJL4$%9Bu{__0GRmGq5uE@ literal 0 HcmV?d00001 diff --git a/bitmaps/r49w.bmp b/bitmaps/r49w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f9aa7841b82f06347cc55cc0818fbc7065751399 GIT binary patch literal 454 zcmZ?rJ;ulY26jMF1BeZwn2`Y@(E+5c@If#WP!5Da;Q#;sAPfWzIO%^Nh4u{$gy{bV z7#J8q<`AMEFfcHK)O|qE>>&OR1_u6tq=D`My94Gvm_HgA7#KkA!b$(&Zve~Vpb3O8 ISQ@Aw0N(h;T>t<8 literal 0 HcmV?d00001 diff --git a/bitmaps/r54o.bmp b/bitmaps/r54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d26cd70033973657a597ee0b228e0d9eb540d05 GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nZcazii^P!5Da;Q#;sAPfY5h^IjsnSttIv^`M! zXCNO&!^C0qbD;cupgfFz0F;mi@?rGH|NsBl1NlFI;`KoK50C~D|Nqth|2ZgV1_nlu zJ7Dhm01PdAApbGYU-Cfu0MNbsNc4H2_<11zJVOOL3T;>U9K=6h$M^uO9!dk1lM?;_ D8ly5s literal 0 HcmV?d00001 diff --git a/bitmaps/r54s.bmp b/bitmaps/r54s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1b25f53e7bac15a1d04039880436eb6ccd2e5be4 GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nZcazii^P!5Da;Q#;sAPfY5h^IjsnSttY(d9QA|55+{M?Fyd50D1A=N|(DyeS i`7n1M2l}TU$cNDffb#r6J_c>a_y8=9Mgz5z68->A8wMKy literal 0 HcmV?d00001 diff --git a/bitmaps/r54w.bmp b/bitmaps/r54w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..44123f05f95853d9572c19e9d4ccc331c1a90bf6 GIT binary patch literal 494 zcmZ?reaFZE26jMF1BlI_n2`Y@u>nY3;e%i%pd1K;!2kdMK^O@B5Kn_NG6U5UOFsZA zln1KEMSlRw+XLl)0O@)l{Rc<`iU0o?7#If=4RaUFy)geA0J@hS=w5=f9peMAIy9QZ G@CN|q;OPhe literal 0 HcmV?d00001 diff --git a/bitmaps/r58o.bmp b/bitmaps/r58o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0f8f01825be008c5cd9803d6a1fef18c7ea6e40e GIT binary patch literal 526 zcmZ?rCjJ>H{26E-F8TvdAu~`OM*pe*|Gyu|{|6M82ht!5>_N0W2n`|{>Moc&e*oRx z4s_o~pno3&=?6f0MkM+H!sR BW7_}# literal 0 HcmV?d00001 diff --git a/bitmaps/r58s.bmp b/bitmaps/r58s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eaad170e87cf2be49eff99a7bc1f9750d8c653a2 GIT binary patch literal 526 zcmZ?r8j|JnclFAt>u18I8@4HO?#G}K)% tcm4pnj~(bvm_Hu_{qqsXhtUs!@{B+}2F>440~W_Y1C0R!;^PIX9surQGRgn| literal 0 HcmV?d00001 diff --git a/bitmaps/r58w.bmp b/bitmaps/r58w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..11f1ac7c2fa8fe3759d983ac20133851d28ada2a GIT binary patch literal 526 zcmZ?rR8@vtON%vsZ7YE%F`OYTc CNV2{F literal 0 HcmV?d00001 diff --git a/bitmaps/r64s.bmp b/bitmaps/r64s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..940ebe9e3b4d69a01a37556e698af7a9cf90582a GIT binary patch literal 574 zcmd6jF%m#95Jfi>3WdTYoC2eFCXS|a4KoU@0~p``#Ed2ljh+0wO?GFqo2D%zJFVni zP_>scM~}vMo?cR_Pd5P4HyiXo3Hi@0^*}c^FfcHJoO%Fk-T(g&7#P?={J~Dc+{*w2Kb40CS*6xc~qF literal 0 HcmV?d00001 diff --git a/bitmaps/r72o.bmp b/bitmaps/r72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2a53da75dfbffd2e98433def75034b0e7093d2b1 GIT binary patch literal 926 zcmeH^F%H5o3`Jc!FmQ;joPtP9EZl*M(DVk}fL^6XVPj@Xr7GszaZ3<%09Gv7ef@Eq z=x4h>m!z>lT_bmv1r@3vuzp;nTtJbOU}nh_>Hm9fWFi%e!i}JDt0Q~W=Q!`rdC_16&Xm?QGNF5 w9X&k6BZ!9qg{XSr9xcqR>a#phP0o6rIM#mB-*ccyemeKTdMt|EZHyoJ4gvHdiU0rr literal 0 HcmV?d00001 diff --git a/bitmaps/r72s.bmp b/bitmaps/r72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b438967d8379a4f505b1c0b30f97e9ee5f555aef GIT binary patch literal 926 zcmeH^u?@mN3`KpUpkN5vOaT%V4Lh(1x|<~HWQ|A^tU!UzeE&1Zlm{)A{@06h_C-I3 z(=-Tc2OpuMD@kJijQ5vK(+VAvm8zOrwde1-*hWbT(_+}eyw+y}Ke%Vlo!y+VsQPT+ z%AJ`z%`665fhXq~vsdRE7~+`)zW%eu9AZ9m$gLnN&ogEo|KlCURkzIcgE1=N{cf(3 P-?M$p&w=5}7yimmR-u;a literal 0 HcmV?d00001 diff --git a/bitmaps/r72w.bmp b/bitmaps/r72w.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bc615cc4eac298a63ea6396cb22529379cb992ea GIT binary patch literal 926 zcmZ?royW`o26jMF1BgAKn2~`IES>Oh6G327&+o|AR0DK=|ad8$c#9F#ZP; z{~JI|DzN{6&9MiYNiFt2u$lE>GeHC>7{EjWkYt3i4*=QBQ1$~Ln|+l1pO|ns01PWw nxHSOT(C|bKbL4pZ0aU`kAP)|I>aqVZ)WgjrjZLk*fMgB;;aY1h literal 0 HcmV?d00001 diff --git a/bitmaps/r80o.bmp b/bitmaps/r80o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6019342b1a5b542ec49d20b5181789682db5f289 GIT binary patch literal 1022 zcmeH^F%H5o3`H9T7e!nb_F4wtjiNAm^!ucF_lmGl6VgdCX`j~eq@YN_0JKa25kfX-9-83si0_-Ve1!;|W@hwkzW*I3&CnbAR&&oelX45T$f7N-g?oL% zSJuC&PRU-gQ{0C}bM|_$?^Zk?%;rJ7kWGw(E^%J|%zuyi425pkzw24*JW<1}eu@K48 z%g>M9Iys#$TZeJv`M`0t$Xo_}&-=HX#)cIM8AK#uBYuY`t>r4t9~SswpCF!;L!ld= z&QhmI#X~*(J*{OuTfm?4fSjracL%Rfv#UGRQI;pX4O{$r3{BZxEK+M7wf*mtJ;=1%2J@sciIAc}-cb*HH8cbjs_*q!;?Vo9`4x(q#P<2)fGjy(@ zv))kv-=)9N`$}NF-wU^q*CKD@9Y^Flav_Ttk<^xx>6@wNlK-vNx9ZCJo8=BnEzCOHPSTsXTIoO9^pwJesl#- z9;N{==n3Ez+=CUYUv_^+CI{reoS7%{XXczyK;|Rz=e#1Aa~!}PJw@2h5{B&m14q9| Qi0m(X2S4`wCpYi=8-z|jlK=n! literal 0 HcmV?d00001 diff --git a/bitmaps/r95o.bmp b/bitmaps/r95o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5395cf82e29d74f20cfb27f6f42eb47664b2b2a7 GIT binary patch literal 1202 zcmeH^y$!-Z422y)qM*nKX_*2fdS+k=T6AF@TL4hS- zJ~{rA-)?_hklIGxwfLd;f(nfv<^O4AK9dL>#?0_!F@b!)$I)gHRgpuET|XK*InLCM z`?I$`7wkWYZCI&&G8`)m3tQxH3HDC826uMD2E~PO3!cC79r^O0&!4B?VSMKXH}CHc zByzZOG`+T9QBX|O6cz1&@u&)=$U~fXrs_&A0`N*V2zAGnIby#zkNX`8j7Q!z>+Ud zKR(;Bvp-yxVz$G%g&&g#38tU$zFE01pwMZmN}nyxfamvk@>(Kw)Ukwvw`X}Wo-)>l z7uc}>B5ql1@;p{I8jr5m%%482B}cCdK(H~oB6qxebH0;tP|vyNh066mm(L-eZO57W z{3AxJ+FSm7cj>3BxtIK(8MqdaHT5g6s#auVqjm3kZ{b)ZV#-+0AOh6G327&+o|AR0L{DU!oH1*j3Aa*e@ z$p8EQhX!n9^Z);VSilc*KdsqNi|xT-1+ljt%x(a4AYpg_#AbxBAAs1*qilMH!vRp3 zL&G1$WMBZt5pvu?6Qw+Qn)v`x&khoQ0AVxJhh2Yw;Xg2;fbAvB{=fiI(*RZv&%xBo Nzi=Z#?tue}*Z|9?w0-~p literal 0 HcmV?d00001 diff --git a/bitmaps/tim.bmp b/bitmaps/tim.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0de2550b5afc70c744970d26fc3a6635571f6865 GIT binary patch literal 7478 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 Zv;TQNnTOGh^EpWS|MUOlCr2}80{{vHHgNy| delta 91 zcmX@ce2jTQmgwXE4GjPH|Ns93MA!fS|4+Vw;orpi6wUWQ`u{)X|1kPKls_Lz$Ajqq Z?0@c0=3#W>JpLc3{r~y@_LHL-vjG6$Hj)4U diff --git a/bitmaps/w49s.bmp b/bitmaps/w49s.bmp index 0dcd4f107d409faa3cee80d8b73e66d7231dc516..d51a73c192439aace8aa37f429485c0ee4d332af 100644 GIT binary patch delta 12 TcmX@ce2jTQHKYB;8ZSlwA2$S6 delta 12 TcmX@ce2jTQHKY8-8ZSlw9+w0* diff --git a/bitmaps/w54o.bmp b/bitmaps/w54o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ee12647fdda99315407d83d9ea952d2069e0823c GIT binary patch literal 454 zcmZwDu}TCn5C-5mEUxn&A+4>oV8Gso@JTXaW9K7XaiWi4xmwxXDk8hE+5G;0vLFi= zn0!noftlRgzHF?nYwj0}%Oy6}3XkOZyhXjZYygbGR7Vm4CWb-`tLg`ITG$0OZN7%Mk~OLy6UVhgo?E%@4>vhvpgI^WGPcJrLLOT|K9R z>UpH8>huUu(m;PV(b)FKN-e@&#Xsb zptD!Mo!%dYp8v_HNo?ylj|+*p=Hr~FH1ELT{A#u%hLLQ*OLssfvd>avV%le4%A2agH2;u>&If?<68ciR3)}BzEk7y*&eb zow*+wrxF4A;!ZpcIs9SSQc7TOS%-#2=Me~^au&l!ycpi%Y}mx<$CvbIsEpEsp>i#H z$6#>XFzOw(llfk+sZ-B)+;2_|c$q792$y PGK);ier{9W*S_ChgI|r} literal 0 HcmV?d00001 diff --git a/bitmaps/w72s.bmp b/bitmaps/w72s.bmp index 31d4be9370b19cb629f57eeac66431d44aa42add..693e36c9bb02c7e42c97ca3c4f9c93df5a09281b 100644 GIT binary patch delta 49 ucmbQoK97CEZTV*mAi((_Nc?}^0AkC4*^du^*fkq}B{4GcY>s7eWCQ?yD-O{B delta 49 tcmbQoK97CEZTUwGAi((_Nc?}?0Afo(*atxDijBXL7#SHh$1*uG0swq74z&OP diff --git a/bitmaps/wl49o.bmp b/bitmaps/wl49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b405ea9756bf71b6fb350408a076d263866b7520 GIT binary patch literal 454 zcmcJ~u?@m75Cu@Xq9Y?vq@iU2EYULqBQQcz(q#lj2}p>Pj1VLWN+MAt5s5$l+lY#m zlg=+bpX|$OeYPgVlIxtg_@p)QU`I~Vn4$5r05D8O{=56byQ$pKyxj=w4|{E`h*D*opiAbl&V literal 0 HcmV?d00001 diff --git a/bitmaps/wl49s.bmp b/bitmaps/wl49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d1a737ab0cb98bd3bb9aef43db583a4847d750cd GIT binary patch literal 454 zcmb`@u?@m75CzchSc)4&S~@6c>8J>zX9iZt260Kp2(01)F-3O3WvZC}?T89GES+EO z;+*ZA&QF6p4xG1)-5dtx#g#mkCGx^~N-2TC;lCKrt3Cpa41krMA4~OUJtpOAdZZV+ zp*Ok$TtjPM@2HtvkT4^%JS|Oq$WB04>Sid~x>!|EAJq1v_5En;SfZlg4jh3N3CTemAUA-kgol(eS1?+nv|erFl_C%S z{Nq)&;s8W)^kqCAzjAZ;+Eje5@xDU4Ev>F<#_!SpbzzNx@)D5>%^t*#l)s&-2AP(F zw=0f~q)oAwdNwbJNpQ@Mpdg@Q_iA}L@jJa`{6K%xJ34s%2=tFrcl4Xn1P8puO z)}O*ga+A$V_t54&|kKWcPs56Kf>qPyU=Dhim##u$59%-KEu%~xe@Y0wMaMzj>PO6qIa~4Us zy4n1oS31(UsxhLcSoIED;ma{m_AZCm^{sVf?3u@_Ja6xWBnmL~Q MOXxta#ex6fUna{qQvd(} literal 0 HcmV?d00001 diff --git a/bitmaps/wl72s.bmp b/bitmaps/wl72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a64f46667c5be7cb2925539bd7cc93eb9310ef2c GIT binary patch literal 926 zcmds#F;2uV5JkswVId*XQXr+Jq}&E9QPFURJ;ELUVRI4A;(~*Cg~YZg7b(i{XU4&) zH~^76dH((xPwaVoe)pu$1L7^lQyY$)>U*qzT-i{e1!g7;d!VhzfAg6Bcn`$c<5a?mS{8VU6*=ubmHv&ilL0b=SFEci!soU#>Zk zXU9GNw=(t_i#x77BTu;BI}@k{}A2jc@N-r0K;VDKirv2`>n%9mcT`Npp_XA(%b}! zigF)YTG17~^4^U;fU=>%woW39(7T6(aYd|Qqo4DT#JWqNKKN4af#-Tp{gx88<38sq n?$QHEw1#J0@xDA;AfpZE2jzS($p%je$6u8ve#x3C760=M!S^MA literal 0 HcmV?d00001 diff --git a/bitmaps/wn49s.bmp b/bitmaps/wn49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0ab191a78d83948bab18170a43fa3f7928c83038 GIT binary patch literal 454 zcmb`@F%H5Y6b9g*G?B%~>ZYTsn?utYchBHa%IM}1yb6Qy9Ns|2PT>DT2TgRd34DF; z(FgQ!yc?9K$5K6dk0e)gPfv7B zFLVi5M`ys!Qj=_uFe8dQEzLt{Ys}I|-NYI<52z2`)P7)H`>EemA~nqOTCSenv7~?#BjJF)!Q~Bi|MO`cMDKzW_ju%2ogX literal 0 HcmV?d00001 diff --git a/bitmaps/wn72o.bmp b/bitmaps/wn72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..24f2a339c8e70365a26101e3abb708022627ab24 GIT binary patch literal 926 zcmdVYy-LJD5C`xLDbk3kt&-STg?S zKYJgQ*c#aIyUFa#e%$T-d+qq#;C+p8S4QP3#vkzg>(T}TgI zU&U6IdNF6`W4Cz5CE}}jL=jA9Jo>)IY_pvOJ@sCyV@1cD zzj#24VC&SHgQ&4i^r~p|P0eye#H5ZnrH*pdu0#4R_!mD>7V!v!vi4K}c*n>4midVR#E4b#ffQGszK`U_+K>!C-@JN8`c^{w2b zhww2t&goTI?>4XZ8M`t1rP6*lEo9s&p{Jy|eJ9UkyyOKL_C~x1;=bTm4uE4Cw++h% jR4lHKt(RvL;xoWJNqN&qp)oURf+Hr%#}6X|$b_h$AEqkT5P8c`Vll)ID1NsrQuYJ-N!hSyx{VSph}1LB%}8 fB6+cZXWp`ZQ1HnTD zF9&N!_B+OY3WqjuBhOU}n>cl~RxsG&j0uD4BM@W)IvKfGYL7mmDBsW%z0xhc(>34& zT>uA9UGYi6jWBszT8Cs7E^GA}wU5TX>OAE-Pd=I*>$=xcMj$tX?pc$|=9?=9=9v>Y aN$+!#WqTht@XGn%-pu?~{_8*er~UyeioxXo literal 0 HcmV?d00001 diff --git a/bitmaps/wp72o.bmp b/bitmaps/wp72o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c359be204b269daec15600f4a25026aaff4f857 GIT binary patch literal 926 zcmdVYu};G<5C&jJ8CVdRJ7wi5u*Af|JMajsm5>s|1MmhsOAtsI`wB)y%Id0%D_K7N z`_F|=Oe|Qk_4RVTYwTR#zO;_x3hO22O`VNv7{9~w_Y0d0)I~%brVYf7l;0g)gG|f8 z>Z@ZXxvSPvk7kWY@XU{(Ch6Y2TAoh)N^coI&>!@U4uk#(^ru&k^sM#MIlVzonH~nM zzX_d`wwSZ?p)a0s33zIrQ3Tr=4}NU1+iYh+FQZ4;;)|;8tsbl<CpXtKeeWvA1`}XEHwcVrW r#gytapxIzK*`tG)vG4c|=sjoD(s#iH`3Y&}sEw=f;K$H+{6G5(C%8jb literal 0 HcmV?d00001 diff --git a/bitmaps/wp72s.bmp b/bitmaps/wp72s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..933f37714505bd7b71f58f67618a0ab0ca7b8bf4 GIT binary patch literal 926 zcmdtgF-`FR^Z8B}taQ$L}xazAOT22 z79nb4PsS~#lPMt8STkq%QoUGT1zS&6g$?A=MvD@D8L|7mXQpI$fTC$oLqY5Sf- zcYmO~v~TBC++8yIX4~8Mye9WLuGrysq&prqT8$6k_o$8eFb|O8HFnwRW{m%U>df|$ SuiP45FwN0gk&Zm@Kl}yLM2a&2 literal 0 HcmV?d00001 diff --git a/bitmaps/ws49o.bmp b/bitmaps/ws49o.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fe7746721c3f68614f7535bccdf55e3a507ae921 GIT binary patch literal 454 zcmcJ~u?@m75Cu@Xq9Y^F(y{=S=$V0n0T>}E=`sSN1SCXCMlccuC6Op%l*FHZ=g`q& z>HOmJ#Xhgr7i)AZInNo3F|0`&dvczp(86&7U>F?550567d~hhm8n}xU5X2mav%*9Q zPnpModb*Iou@QzM2h<@;^&TSw&_`A-d2??YqsKCr!w?4#`2 s2mA6bv4YQ%4JxjE%+#9&a;{tU56b=qkq2}l9G@y)`6commGAnaAGty&t^fc4 literal 0 HcmV?d00001 diff --git a/bitmaps/ws49s.bmp b/bitmaps/ws49s.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5d2ad690a801c8818e96c57922e46470ca2617ba GIT binary patch literal 454 zcmb`DEe--P5QSe^LJeUpj+Iy(iY0i?z!kW`R^qq-30J8gT!+e4Ti%;44jfIUU+1UO zH$5Dm4z_mO*R;)O4kd9R9*bgDIBq#-(73`EMs$kzKrKd~5(6)b>d^)a@>k@ZJdq7~ zC6|D&$r-Tqq#Jw`;d&UUmdsr=4wy_!yt);B>PYp`J)yiivi0JAyH1>k!&?Je_w={4eYJpK@kf4t-?~|#IuQZQ7h^NZ-#j2t=^FZ2c_8m9 z6IDbnqcTOxDpAqG&5DC@Q3;dj@`ObmL=A+N!g)?p#u4xH8b+EL;j|ec&lCtQiT~1GW9{ywU_IXH6p~T+X>2 za3{46$M!oJX|mueIE9r(<%S;=~M}kz5gZ tUv#2};c=YHiuDIb9=BoJ<@pP#Z$PBi@~*L4nR#G0GfU=Esv5%o;2#IXmI(j= literal 0 HcmV?d00001 diff --git a/common.h b/common.h index be6d4e8..9d3fd41 100644 --- a/common.h +++ b/common.h @@ -185,29 +185,26 @@ typedef enum { } GameMode; typedef enum { - WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, -#ifdef FAIRY /* [HGM] the order here is crucial for Crazyhouse & Shogi: */ /* only the first N pieces can go into the holdings, and */ - /* promotions in those variants shift P-W to E-M */ - WhiteFerz, WhiteWazir, WhiteAlfil, WhiteNightrider, WhiteCardinal, - WhiteMarshall, WhiteGrasshopper, WhiteCannon, WhiteMan, WhiteUnicorn, -#endif - WhiteKing, BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, -#ifdef FAIRY - BlackFerz, BlackWazir, BlackAlfil, BlackNightrider, BlackCardinal, - BlackMarshall, BlackGrasshopper, BlackCannon, BlackMan, BlackUnicorn, -#endif - BlackKing, + /* promotions in those variants shift P-W to U-S */ + WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, + WhiteFerz, WhiteWazir, WhiteAlfil, WhiteMan, WhiteCannon, WhiteUnicorn, + WhiteNightrider, WhiteCardinal, WhiteMarshall, WhiteGrasshopper, + WhiteSilver, WhiteKing, + BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, + BlackFerz, BlackWazir, BlackAlfil, BlackMan, BlackCannon, BlackUnicorn, + BlackNightrider, BlackCardinal, BlackMarshall, BlackGrasshopper, + BlackSilver, BlackKing, EmptySquare, - ClearBoard, WhitePlay, BlackPlay /*for use on EditPosition menus*/ + ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/ } ChessSquare; /* [HGM] some macros that can be used as prefixes to convert piece types */ #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int) #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int) -#define PROMOTED (int)WhiteAlfil - (int)WhitePawn + (int) -#define DEMOTED (int)WhitePawn - (int)WhiteAlfil + (int) +#define PROMOTED (int)WhiteUnicorn - (int)WhitePawn + (int) +#define DEMOTED (int)WhitePawn - (int)WhiteUnicorn + (int) #define SHOGI (int)EmptySquare + (int) @@ -222,14 +219,10 @@ typedef enum { BlackHSideCastleFR, BlackASideCastleFR, WhitePromotionKnight, WhitePromotionBishop, WhitePromotionRook, WhitePromotionQueen, WhitePromotionKing, -#ifdef FAIRY WhitePromotionChancellor, WhitePromotionArchbishop, -#endif BlackPromotionKnight, BlackPromotionBishop, BlackPromotionRook, BlackPromotionQueen, BlackPromotionKing, -#ifdef FAIRY BlackPromotionChancellor, BlackPromotionArchbishop, -#endif WhiteCapturesEnPassant, BlackCapturesEnPassant, WhiteDrop, BlackDrop, NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove, @@ -521,6 +514,9 @@ typedef struct { int NrRanks; int holdingsSize; int matchPause; + char * pieceToCharTable; + Boolean allWhite; + Boolean upsideDown; Boolean alphaRank; Boolean testClaims; Boolean checkMates; @@ -528,7 +524,6 @@ typedef struct { Boolean trivialDraws; int ruleMoves; int drawRepeats; - char * pieceToCharTable; #if ZIPPY char *zippyLines; @@ -599,6 +594,3 @@ typedef struct { #endif -/* extern int holdingsWidth; -extern int holdingsHeight; -/*extern int holdings[(int) EmptySquare];*/ diff --git a/config.h b/config.h index ec3ac90..7f3a083 100644 --- a/config.h +++ b/config.h @@ -47,7 +47,7 @@ #define LAST_PTY_LETTER 'q' -#define PATCHLEVEL "4" +#define PATCHLEVEL "7" #define PRODUCT "WinBoard" diff --git a/moves.c b/moves.c index 2070ef3..9aff915 100644 --- a/moves.c +++ b/moves.c @@ -196,23 +196,30 @@ ChessMove PromoCharToMoveType(whiteOnMove, promoChar) } char pieceToChar[] = { - 'P', 'N', 'B', 'R', 'Q', -#ifdef FAIRY - 'F', 'W', 'E', 'H', 'A', 'C', 'G', 'O', 'M', 'U', -#endif - 'K', 'p', 'n', 'b', 'r', 'q', -#ifdef FAIRY - 'f', 'w', 'e', 'h', 'a', 'c', 'g', 'o', 'm', 'u', -#endif + 'P', 'N', 'B', 'R', 'Q', 'F', + 'W', 'E', 'M', 'O', 'U', 'H', 'A', 'C', 'G', 'S', + 'K', 'p', 'n', 'b', 'r', 'q', 'f', + 'w', 'e', 'm', 'o', 'u', 'h', 'a', 'c', 'g', 's', 'k', 'x' }; char PieceToChar(p) ChessSquare p; { + if((int)p < 0 || (int)p >= (int)EmptySquare) return('x'); /* [HGM] for safety */ return pieceToChar[(int) p]; } +int PieceToNumber(p) + ChessSquare p; +{ + int i=0; + ChessSquare start = (int)p >= (int)BlackPawn ? BlackPawn : WhitePawn; + + while(start++ != p) if(pieceToChar[(int)start-1] != '.') i++; + return i; +} + ChessSquare CharToPiece(c) int c; { @@ -220,48 +227,6 @@ ChessSquare CharToPiece(c) for(i=0; i< (int) EmptySquare; i++) if(pieceToChar[i] == c) return (ChessSquare) i; return EmptySquare; -/* [HGM] code marked for deletion - switch (c) { - default: - case 'x': return EmptySquare; - case 'P': return WhitePawn; - case 'R': return WhiteRook; - case 'N': return WhiteKnight; - case 'B': return WhiteBishop; - case 'Q': return WhiteQueen; - case 'K': return WhiteKing; - case 'p': return BlackPawn; - case 'r': return BlackRook; - case 'n': return BlackKnight; - case 'b': return BlackBishop; - case 'q': return BlackQueen; - case 'k': return BlackKing; -#ifdef FAIRY - case 'A': return WhiteCardinal; - case 'C': return WhiteMarshall; - case 'F': return WhiteFerz; - case 'H': return WhiteNightrider; - case 'E': return WhiteAlfil; - case 'W': return WhiteWazir; - case 'U': return WhiteUnicorn; - case 'O': return WhiteCannon; - case 'G': return WhiteGrasshopper; - case 'M': return WhiteMan; - - case 'a': return BlackCardinal; - case 'c': return BlackMarshall; - case 'f': return BlackFerz; - case 'h': return BlackNightrider; - case 'e': return BlackAlfil; - case 'w': return BlackWazir; - case 'u': return BlackUnicorn; - case 'o': return BlackCannon; - case 'g': return BlackGrasshopper; - case 'm': return BlackMan; - -#endif - } -*/ } void CopyBoard(to, from) @@ -330,7 +295,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) break; case WhitePawn: -#ifdef FAIRY if(gameInfo.variant == VariantXiangqi) { /* [HGM] capture and move straight ahead in Xiangqi */ if (rf < BOARD_HEIGHT-1 && @@ -349,7 +313,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) } break; } -#endif if (rf < BOARD_HEIGHT-1 && board[rf + 1][ff] == EmptySquare) { callback(board, flags, rf == BOARD_HEIGHT-2 ? WhitePromotionQueen : NormalMove, @@ -383,7 +346,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) break; case BlackPawn: -#ifdef FAIRY if(gameInfo.variant == VariantXiangqi) { /* [HGM] capture straight ahead in Xiangqi */ if (rf > 0 && !SameColor(board[rf][ff], board[rf - 1][ff]) ) { @@ -401,7 +363,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) } break; } -#endif if (rf > 0 && board[rf - 1][ff] == EmptySquare) { callback(board, flags, rf == 1 ? BlackPromotionQueen : NormalMove, @@ -434,10 +395,8 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) } break; -#ifdef FAIRY case WhiteUnicorn: case BlackUnicorn: -#endif case WhiteKnight: case BlackKnight: mounted: @@ -454,13 +413,11 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) } break; -#ifdef FAIRY case SHOGI WhiteKnight: for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-2 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf + 2][ff + s])) { - callback(board, flags, - rf == BOARD_HEIGHT-2 ? WhitePromotionQueen : NormalMove, + callback(board, flags, NormalMove, rf, ff, rf + 2, ff + s, closure); } } @@ -470,8 +427,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) for (s = -1; s <= 1; s += 2) { if (rf > 1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf - 2][ff + s])) { - callback(board, flags, - rf == 1 ? BlackPromotionQueen : NormalMove, + callback(board, flags, NormalMove, rf, ff, rf - 2, ff + s, closure); } } @@ -508,8 +464,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf + 1][ff + s])) { - callback(board, flags, - rf == BOARD_HEIGHT-2 ? WhitePromotionQueen : NormalMove, + callback(board, flags, NormalMove, rf, ff, rf + 1, ff + s, closure); } } @@ -523,8 +478,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) for (s = -1; s <= 1; s += 2) { if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf - 1][ff + s])) { - callback(board, flags, - rf == 1 ? BlackPromotionQueen : NormalMove, + callback(board, flags, NormalMove, rf, ff, rf - 1, ff + s, closure); } } @@ -574,7 +528,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) /* Shogi Bishops are ordinary Bishops */ case SHOGI WhiteBishop: case SHOGI BlackBishop: -#endif case WhiteBishop: case BlackBishop: for (rs = -1; rs <= 1; rs += 2) @@ -593,7 +546,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) /* Bishop falls through */ break; -#ifdef FAIRY /* Shogi Lance is unlike anything, and asymmetric at that */ case SHOGI WhiteQueen: for(i = 1;; i++) { @@ -632,7 +584,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) /* Shogi Rooks are ordinary Rooks */ case SHOGI WhiteRook: case SHOGI BlackRook: -#endif case WhiteRook: case BlackRook: for (d = 0; d <= 1; d++) @@ -667,7 +618,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) } break; -#ifdef FAIRY /* Shogi Pawn and Silver General: first the Pawn move, */ /* then the General continues like a Ferz */ case SHOGI WhitePawn: @@ -707,7 +657,6 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) case BlackMan: case SHOGI WhiteKing: case SHOGI BlackKing: -#endif case WhiteKing: case BlackKing: walking: @@ -817,7 +766,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) !CheckTest(board, flags, 0, ff, 0, ff + 2, FALSE)))) { callback(board, flags, - ff==4 ? WhiteKingSideCastle : WhiteKingSideCastleWild, + ff==BOARD_WIDTH>>1 ? WhiteKingSideCastle : WhiteKingSideCastleWild, 0, ff, 0, ff + ((gameInfo.boardWidth+2)>>2), closure); } if ((flags & F_WHITE_ON_MOVE) && @@ -1039,6 +988,41 @@ ChessMove LegalityTest(board, flags, epfile, castlingRights, rf, ff, rt, ft, pro cl.ft = ft; cl.kind = IllegalMove; GenLegal(board, flags, epfile, castlingRights, LegalityTestCallback, (VOIDSTAR) &cl); + + if(gameInfo.variant == VariantShogi) { + /* [HGM] Shogi promotions. '=' means defer */ + if(rf != DROP_RANK && cl.kind == NormalMove) { + ChessSquare piece = board[rf][ff]; + + if(promoChar == PieceToChar(BlackQueen)) promoChar = NULLCHAR; /* [HGM] Kludge */ + if(promoChar != NULLCHAR && promoChar != 'x' && + promoChar != '+' && promoChar != '=' && + ToUpper(PieceToChar(PROMOTED piece)) != ToUpper(promoChar) ) + cl.kind = IllegalMove; + else if(flags & F_WHITE_ON_MOVE) { + if( (int) piece < (int) WhiteWazir && + (rf > BOARD_HEIGHT-4 || rt > BOARD_HEIGHT-4) ) { + if( (piece == WhitePawn || piece == WhiteQueen) && rt > BOARD_HEIGHT-2 || + piece == WhiteKnight && rt > BOARD_HEIGHT-3) /* promotion mandatory */ + cl.kind = promoChar == '=' ? IllegalMove : WhitePromotionKnight; + else /* promotion optional, default is promote */ + cl.kind = promoChar == '=' ? NormalMove : WhitePromotionQueen; + + } else cl.kind = (promoChar == NULLCHAR || promoChar == 'x' || promoChar == '=') ? + NormalMove : IllegalMove; + } else { + if( (int) piece < (int) BlackWazir && (rf < 3 || rt < 3) ) { + if( (piece == BlackPawn || piece == BlackQueen) && rt < 1 || + piece == BlackKnight && rt < 2 ) /* promotion obligatory */ + cl.kind = promoChar == '=' ? IllegalMove : BlackPromotionKnight; + else /* promotion optional, default is promote */ + cl.kind = promoChar == '=' ? NormalMove : BlackPromotionQueen; + + } else cl.kind = (promoChar == NULLCHAR || promoChar == 'x' || promoChar == '=') ? + NormalMove : IllegalMove; + } + } + } else if (promoChar != NULLCHAR && promoChar != 'x') { if (cl.kind == WhitePromotionQueen || cl.kind == BlackPromotionQueen) { cl.kind = @@ -1047,6 +1031,7 @@ ChessMove LegalityTest(board, flags, epfile, castlingRights, rf, ff, rt, ft, pro cl.kind = IllegalMove; } } + /* [HGM] For promotions, 'ToQueen' = optional, 'ToKnight' = mandatory */ return cl.kind; } @@ -1110,7 +1095,7 @@ void DisambiguateCallback(board, flags, kind, rf, ff, rt, ft, closure) (cl->ftIn == -1 || cl->ftIn == ft)) { cl->count++; - cl->piece = board[rf][ff]; + cl->piece = board[rf][ff]; cl->rf = rf; cl->ff = ff; cl->rt = rt; @@ -1124,7 +1109,7 @@ void Disambiguate(board, flags, epfile, closure) int flags, epfile; DisambiguateClosure *closure; { - int illegal = 0; + int illegal = 0; char c = closure->promoCharIn; closure->count = 0; closure->rf = closure->ff = closure->rt = closure->ft = 0; closure->kind = ImpossibleMove; @@ -1139,6 +1124,51 @@ void Disambiguate(board, flags, epfile, closure) return; } } + + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate in: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + } + if(gameInfo.variant == VariantShogi) { + /* [HGM] Shogi promotions. '=' means defer */ + if(closure->rfIn != DROP_RANK && closure->kind == NormalMove) { + ChessSquare piece = closure->piece; + + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate A: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + } + if(c != NULLCHAR && c != 'x' && c != '+' && c != '=' && + ToUpper(PieceToChar(PROMOTED piece)) != ToUpper(c) ) + closure->kind = IllegalMove; + else if(flags & F_WHITE_ON_MOVE) { + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate B: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + } + if( (int) piece < (int) WhiteWazir && + (closure->rf > BOARD_HEIGHT-4 || closure->rt > BOARD_HEIGHT-4) ) { + if( (piece == WhitePawn || piece == WhiteQueen) && closure->rt > BOARD_HEIGHT-2 || + piece == WhiteKnight && closure->rt > BOARD_HEIGHT-3) /* promotion mandatory */ + closure->kind = c == '=' ? IllegalMove : WhitePromotionKnight; + else /* promotion optional, default is promote */ + closure->kind = c == '=' ? NormalMove : WhitePromotionQueen; + + } else closure->kind = (c == NULLCHAR || c == 'x' || c == '=') ? + NormalMove : IllegalMove; + } else { + if( (int) piece < (int) BlackWazir && (closure->rf < 3 || closure->rt < 3) ) { + if( (piece == BlackPawn || piece == BlackQueen) && closure->rt < 1 || + piece == BlackKnight && closure->rt < 2 ) /* promotion obligatory */ + closure->kind = c == '=' ? IllegalMove : BlackPromotionKnight; + else /* promotion optional, default is promote */ + closure->kind = c == '=' ? NormalMove : BlackPromotionQueen; + + } else closure->kind = (c == NULLCHAR || c == 'x' || c == '=') ? + NormalMove : IllegalMove; + } + } + } else if (closure->promoCharIn != NULLCHAR && closure->promoCharIn != 'x') { if (closure->kind == WhitePromotionQueen || closure->kind == BlackPromotionQueen) { @@ -1149,7 +1179,14 @@ void Disambiguate(board, flags, epfile, closure) closure->kind = IllegalMove; } } - closure->promoChar = ToLower(PieceToChar(PromoPiece(closure->kind))); + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate C: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + } + /* [HGM] returns 'q' for optional promotion, 'n' for mandatory */ + if(closure->promoCharIn != '=') + closure->promoChar = ToLower(PieceToChar(PromoPiece(closure->kind))); + else closure->promoChar = '='; if (closure->promoChar == 'x') closure->promoChar = NULLCHAR; if (closure->count > 1) { closure->kind = AmbiguousMove; @@ -1161,6 +1198,13 @@ void Disambiguate(board, flags, epfile, closure) */ closure->kind = IllegalMove; } + if(closure->kind == IllegalMove) + /* [HGM] might be a variant we don't understand, pass on promotion info */ + closure->promoChar = closure->promoCharIn; + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate out: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->piece,closure->ff,closure->rf,closure->ft,closure->rt,closure->promoChar,closure->promoChar); + } } @@ -1238,9 +1282,14 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, if (promoChar == 'x') promoChar = NULLCHAR; piece = board[rf][ff]; + + if (appData.debugMode) + fprintf(debugFP, "CoordsToAlgebraic, piece=%d\n", (int)piece); switch (piece) { case WhitePawn: case BlackPawn: + if (appData.debugMode) + fprintf(debugFP, "CoordsToAlgebraic, Pawn\n"); kind = LegalityTest(board, flags, epfile, initialRights, rf, ff, rt, ft, promoChar); if (kind == IllegalMove && !(flags&F_IGNORE_CHECK)) { /* Keep short notation if move is illegal only because it @@ -1267,11 +1316,17 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } } /* Use promotion suffix style "=Q" */ - if (promoChar != NULLCHAR && promoChar != 'x') { - *outp++ = '='; - *outp++ = ToUpper(promoChar); - } *outp = NULLCHAR; + if (promoChar != NULLCHAR) { + if(gameInfo.variant == VariantShogi) { + /* [HGM] ... but not in Shogi! */ + *outp++ = promoChar == '=' ? '=' : '+'; + } else { + *outp++ = '='; + *outp++ = ToUpper(promoChar); + } + *outp = NULLCHAR; + } AlphaRank(out, 10); return kind; @@ -1338,8 +1393,13 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, else "N1f3" or "N5xf7", else "Ng1f3" or "Ng5xf7". */ - *outp++ = ToUpper(PieceToChar(piece)); - + if(PieceToChar(piece) == '.') { + /* [HGM] print nonexistent piece as its demoted version */ + piece = (ChessSquare) (DEMOTED piece); + if( gameInfo.variant == VariantShogi ) + *outp++ = '+'; + } + *outp++ = ToUpper(PieceToChar(piece)); if (cl.file || (cl.either && !cl.rank)) { *outp++ = ff + AAA; } @@ -1357,16 +1417,51 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } *outp = NULLCHAR; + if (gameInfo.variant == VariantShogi) { + /* [HGM] in Shogi non-pawns can promote */ + if(flags & F_WHITE_ON_MOVE) { + if( (int) cl.piece < (int) WhiteWazir && + (rf > BOARD_HEIGHT-4 || rt > BOARD_HEIGHT-4) ) { + if( (piece == WhitePawn || piece == WhiteQueen) && rt > BOARD_HEIGHT-2 || + piece == WhiteKnight && rt > BOARD_HEIGHT-3) /* promotion mandatory */ + cl.kind = promoChar == '=' ? IllegalMove : WhitePromotionKnight; + else cl.kind = WhitePromotionQueen; /* promotion optional */ + + } else cl.kind = (promoChar == NULLCHAR || promoChar == 'x' || promoChar == '=') ? + NormalMove : IllegalMove; + } else { + if( (int) cl.piece < (int) BlackWazir && (rf < 3 || rt < 3) ) { + if( (piece == BlackPawn || piece == BlackQueen) && rt < 1 || + piece == BlackKnight && rt < 2 ) /* promotion obligatory */ + cl.kind = promoChar == '=' ? IllegalMove : BlackPromotionKnight; + else cl.kind = BlackPromotionQueen; /* promotion optional */ + } else cl.kind = (promoChar == NULLCHAR || promoChar == 'x' || promoChar == '=') ? + NormalMove : IllegalMove; + } + if(cl.kind == WhitePromotionQueen || cl.kind == BlackPromotionQueen) { + /* for optional promotions append '+' or '=' */ + if(promoChar == '=') { + *outp++ = '='; + cl.kind = NormalMove; + } else *outp++ = '+'; + *outp = NULLCHAR; + } else if(cl.kind == IllegalMove) { + /* Illegal move specifies any given promotion */ + if(promoChar != NULLCHAR && promoChar != 'x') { + *outp++ = '='; + *outp++ = ToUpper(promoChar); + *outp = NULLCHAR; + } + } + } AlphaRank(out, 10); return cl.kind; -#ifdef FAIRY - /* [HGM] Always long notation for fairies, don't know how they move */ + /* [HGM] Always long notation for fairies we don't know */ case WhiteNightrider: case BlackNightrider: case WhiteGrasshopper: case BlackGrasshopper: -#endif case EmptySquare: /* Moving a nonexistent piece */ break; diff --git a/moves.h b/moves.h index 8324ef6..cc70260 100644 --- a/moves.h +++ b/moves.h @@ -50,6 +50,7 @@ extern ChessSquare PromoPiece P((ChessMove moveType)); extern ChessMove PromoCharToMoveType P((int whiteOnMove, int promoChar)); extern char PieceToChar P((ChessSquare p)); extern ChessSquare CharToPiece P((int c)); +extern int PieceToNumber P((ChessSquare p)); extern void CopyBoard P((Board to, Board from)); extern int CompareBoards P((Board board1, Board board2)); diff --git a/parser.l b/parser.l index 03e0adc..da4cbc7 100644 --- a/parser.l +++ b/parser.l @@ -1,4091 +1,1058 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include -#include - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#ifndef _WIN32 -#include -#endif - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - - -#define YY_USES_REJECT -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 42 -#define YY_END_OF_BUFFER 43 -static yyconst short int yy_acclist[709] = - { 0, - 43, 41, 42, 41, 42, 41, 42, 40, 41, 42, - 41, 42, 25, 41, 42, 41, 42, 40, 41, 42, - 40, 41, 42,16410, 40, 41, 42,16410, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 41, - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 41, 42, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42,16410, - 40, 41, 42,16410, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 40, 41, 42, 40, 41, 42, 40, 41, 42, 40, - - 41, 42, 40, 41, 42, 40, 41, 42, 40, 41, - 42, 40, 41, 42, 40, 41, 42, 40, 41, 42, - 41, 42, 33, 40, 17, 40, 9, 40, 40, 40, - 16410, 8218, 40, 35, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 9, 40, 40, 40, 40, - 40, 40, 40, 36, 40, 3, 40, 40, 4, 40, - 40, 40, 3, 40, 40, 4, 40, 40, 40, 40, - 40, 40, 9, 40, 40, 34, 40, 40, 9, 40, - 40, 40,16410, 8218, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 9, 40, 40, 40, - - 40, 40, 40, 40, 40, 3, 40, 40, 4, 40, - 40, 40, 3, 40, 40, 4, 40, 40, 40, 40, - 40, 40, 9, 40, 40, 15, 9, 40, 23, 40, - 23, 8, 40, 8218, 22, 40, 22, 24, 40, 40, - 40, 6, 40, 40, 40, 40, 40, 40, 40, 9, - 40, 40, 40, 40, 40, 20, 40, 4, 40, 40, - 3, 40, 3, 40, 40, 4, 5, 40, 4, 40, - 40, 4, 40, 40, 3, 40, 40, 4, 4, 40, - 5, 6, 40, 4, 40, 40, 40, 9, 40, 40, - 34, 39, 9, 40, 23, 40, 8, 40, 22, 40, - - 35, 40, 40, 40, 6, 40, 40, 40, 40, 40, - 40, 40, 9, 40, 40, 40, 40, 40, 20, 40, - 4, 40, 40, 3, 40, 3, 40, 40, 5, 40, - 4, 40, 40, 4, 40, 40, 3, 40, 40, 4, - 40, 5, 6, 40, 4, 40, 40, 40, 9, 40, - 40, 38, 38, 37, 25, 25, 40, 6, 40, 7, - 40, 6, 10, 40, 40, 40, 40, 19, 40, 40, - 21, 40, 16, 40, 40, 40, 40, 40, 20, 20, - 40, 20, 40, 36, 3, 3, 2, 40, 5, 4, - 5, 40, 40, 4, 4, 40, 2, 7, 40, 5, - - 6, 5, 6, 40, 5, 40, 40, 40, 25, 39, - 40, 6, 40, 7, 40, 40, 40, 40, 40, 19, - 40, 40, 21, 40, 16, 40, 40, 40, 40, 40, - 20, 40, 20, 20, 40, 2, 40, 5, 40, 40, - 4, 40, 2, 7, 40, 5, 6, 40, 5, 40, - 40, 40, 7, 1, 40, 40, 40, 19, 40, 40, - 40, 21, 21, 40, 21, 40, 40, 40, 40, 30, - 36, 2, 2, 40, 5, 4, 5, 5, 40, 2, - 7, 39, 1, 40, 40, 40, 19, 40, 40, 40, - 21, 40, 21, 21, 40, 40, 40, 40, 20, 39, - - 2, 40, 5, 40, 27, 38, 23, 23, 22, 22, - 24, 24, 1, 1, 40, 20, 21, 40, 40, 40, - 11, 40, 40, 28, 36, 30, 2, 2, 5, 27, - 34, 39, 39, 1, 40, 40, 40, 40, 21, 39, - 11, 40, 40, 20, 39, 18, 24, 1, 1, 20, - 21, 19, 40, 40, 40, 11, 40, 40, 40, 40, - 21, 39, 40, 11, 40, 40, 12, 40, 40, 40, - 40, 12, 40, 40, 14, 40, 40, 40, 14, 40, - 40, 40, 39, 40, 40, 40, 40, 39, 39, 40, - 40, 31, 40, 39, 39, 31, 40, 13, 31, 32, - - 32, 35, 39, 39, 31, 39, 34, 29 - } ; - -static yyconst short int yy_accept[736] = - { 0, - 1, 1, 1, 2, 4, 6, 8, 11, 13, 16, - 18, 21, 25, 29, 31, 34, 37, 40, 43, 46, - 49, 52, 55, 58, 61, 64, 67, 70, 72, 75, - 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, - 108, 111, 114, 117, 119, 121, 124, 127, 131, 135, - 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, - 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, - 197, 200, 203, 206, 209, 212, 215, 218, 221, 223, - 223, 224, 225, 225, 225, 225, 225, 226, 226, 226, - 227, 227, 229, 229, 229, 229, 230, 230, 230, 232, - - 232, 234, 234, 235, 236, 236, 237, 237, 237, 238, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 248, - 249, 250, 251, 252, 253, 254, 254, 254, 254, 254, - 255, 256, 258, 258, 259, 261, 262, 263, 265, 265, - 266, 268, 269, 270, 271, 272, 273, 275, 276, 276, - 276, 276, 277, 277, 278, 278, 279, 281, 281, 282, - 284, 284, 286, 286, 287, 288, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 299, 300, 301, 302, - 303, 304, 305, 306, 308, 308, 309, 311, 312, 313, - 315, 315, 316, 318, 319, 320, 321, 322, 323, 325, - - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 327, 327, 327, 327, 329, 331, 332, 334, - 335, 335, 335, 335, 337, 338, 339, 340, 340, 341, - 341, 342, 342, 342, 344, 344, 344, 344, 344, 345, - 346, 347, 348, 349, 350, 352, 353, 354, 355, 356, - 358, 358, 358, 358, 358, 360, 360, 361, 361, 361, - 363, 365, 366, 367, 367, 369, 369, 371, 372, 374, - 375, 375, 377, 378, 379, 381, 384, 386, 387, 388, - 390, 391, 392, 392, 392, 392, 392, 393, 395, 397, - 399, 401, 401, 402, 402, 403, 404, 404, 405, 407, - - 408, 409, 410, 411, 412, 413, 415, 416, 417, 418, - 419, 421, 423, 424, 424, 426, 428, 429, 431, 433, - 434, 436, 437, 437, 439, 440, 442, 445, 447, 448, - 449, 451, 452, 452, 452, 453, 454, 454, 454, 455, - 455, 455, 456, 456, 457, 457, 457, 457, 458, 458, - 458, 458, 458, 458, 458, 458, 460, 460, 460, 462, - 463, 464, 465, 465, 466, 466, 466, 466, 466, 467, - 468, 470, 470, 471, 473, 475, 476, 477, 478, 479, - 480, 482, 484, 484, 484, 484, 484, 485, 486, 486, - 487, 489, 490, 491, 491, 491, 491, 493, 494, 495, - - 495, 497, 497, 500, 502, 505, 507, 508, 509, 509, - 510, 510, 510, 510, 510, 511, 511, 512, 512, 512, - 514, 516, 517, 517, 518, 519, 520, 522, 523, 525, - 527, 528, 529, 530, 531, 533, 534, 536, 538, 540, - 541, 543, 546, 549, 551, 552, 553, 553, 553, 553, - 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, - 554, 556, 556, 556, 556, 556, 557, 558, 558, 560, - 560, 561, 562, 563, 565, 567, 568, 569, 570, 570, - 570, 572, 572, 572, 573, 573, 573, 575, 576, 576, - 577, 578, 578, 580, 580, 582, 582, 582, 582, 582, - - 582, 582, 583, 583, 583, 585, 586, 587, 589, 590, - 591, 593, 594, 596, 597, 598, 599, 601, 603, 605, - 605, 605, 607, 607, 607, 608, 608, 609, 609, 610, - 610, 611, 611, 612, 612, 613, 613, 613, 614, 614, - 614, 616, 616, 616, 618, 618, 619, 619, 619, 619, - 619, 619, 620, 621, 623, 624, 626, 626, 627, 628, - 629, 630, 630, 630, 632, 632, 632, 633, 634, 634, - 634, 636, 637, 638, 639, 641, 643, 644, 646, 646, - 647, 647, 647, 647, 648, 649, 650, 650, 650, 650, - 652, 652, 652, 653, 653, 653, 653, 653, 654, 655, - - 656, 658, 659, 659, 659, 659, 659, 659, 660, 661, - 663, 664, 666, 667, 667, 667, 667, 667, 667, 667, - 668, 668, 668, 668, 668, 669, 670, 670, 670, 670, - 670, 671, 672, 672, 672, 672, 672, 673, 673, 673, - 673, 674, 675, 677, 677, 677, 677, 677, 678, 678, - 679, 681, 681, 681, 681, 681, 682, 683, 683, 683, - 683, 683, 684, 685, 686, 686, 686, 686, 686, 686, - 687, 688, 688, 688, 688, 688, 689, 690, 691, 692, - 692, 692, 692, 692, 692, 694, 694, 694, 694, 694, - 695, 696, 698, 698, 698, 699, 699, 700, 700, 701, - - 701, 701, 703, 703, 704, 705, 705, 705, 705, 705, - 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 707, 708, 709, 709 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 5, 6, 7, 8, 1, 9, 10, - 11, 12, 13, 1, 14, 15, 16, 17, 18, 19, - 20, 20, 20, 20, 20, 20, 20, 21, 22, 1, - 23, 1, 1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 33, 43, 33, 44, 45, 33, 33, - 46, 1, 47, 1, 48, 1, 49, 50, 51, 52, - - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 40, 65, 66, 67, 68, 33, 69, 45, - 70, 33, 71, 1, 72, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[73] = - { 0, - 1, 2, 3, 2, 1, 1, 1, 1, 4, 5, - 6, 1, 1, 7, 1, 1, 8, 8, 8, 8, - 9, 1, 10, 1, 11, 11, 11, 12, 12, 12, - 12, 12, 4, 11, 4, 4, 11, 12, 12, 11, - 11, 4, 4, 12, 7, 1, 1, 1, 13, 13, - 13, 14, 15, 14, 14, 14, 14, 14, 13, 14, - 4, 11, 12, 12, 11, 4, 4, 4, 4, 4, - 1, 1 - } ; - -static yyconst short int yy_base[824] = - { 0, - 0, 72, 2710, 5057, 120, 129, 0, 140, 2705, 138, - 149, 169, 160, 2705, 226, 157, 2651, 151, 2679, 130, - 2639, 131, 227, 271, 2648, 2633, 244, 331, 390, 447, - 203, 239, 332, 338, 375, 340, 370, 428, 430, 249, - 2650, 201, 254, 397, 2694, 147, 253, 506, 344, 257, - 568, 189, 2641, 229, 2672, 339, 294, 248, 335, 620, - 2642, 284, 574, 667, 724, 318, 640, 555, 608, 709, - 590, 610, 690, 746, 761, 462, 449, 644, 577, 2639, - 455, 0, 2683, 303, 781, 309, 5057, 2679, 439, 354, - 2673, 2673, 2671, 419, 692, 2671, 491, 160, 809, 2670, - - 0, 2683, 5057, 782, 0, 829, 0, 0, 499, 862, - 712, 582, 2636, 2641, 2615, 2616, 736, 2640, 2639, 717, - 797, 2627, 769, 829, 2613, 2627, 927, 336, 999, 5057, - 1023, 1074, 0, 1091, 1142, 834, 1159, 1206, 0, 1218, - 1265, 838, 847, 842, 2606, 2609, 2608, 2613, 303, 2597, - 890, 2664, 2663, 572, 2662, 594, 633, 298, 634, 1324, - 401, 688, 429, 1386, 1433, 2661, 851, 927, 900, 903, - 751, 689, 892, 946, 2626, 946, 951, 960, 973, 968, - 972, 690, 1445, 1496, 2659, 1513, 1565, 1010, 1582, 1629, - 2658, 1641, 1688, 1018, 1036, 1040, 972, 1003, 1023, 694, - - 804, 2596, 446, 503, 518, 2649, 542, 1153, 1167, 2648, - 2586, 5057, 2649, 2648, 2647, 2636, 2643, 2638, 0, 5057, - 2632, 2627, 2626, 2625, 2624, 808, 1023, 1045, 1073, 0, - 1072, 1085, 1136, 1735, 2570, 2563, 2576, 2571, 1179, 1229, - 2554, 1154, 930, 2569, 2607, 0, 2563, 2559, 1214, 1795, - 569, 1240, 605, 1867, 1930, 0, 1947, 0, 2608, 2606, - 1218, 1204, 1278, 0, 1998, 2606, 755, 398, 1272, 2015, - 0, 1288, 1317, 1395, 1379, 2062, 1405, 1391, 2564, 2600, - 2546, 5057, 1446, 750, 2608, 127, 2608, 885, 1185, 996, - 1447, 789, 2606, 1238, 1410, 2114, 2602, 1452, 2161, 1602, - - 1652, 1181, 1707, 1458, 1506, 1412, 0, 1100, 1179, 1637, - 2221, 2285, 2302, 2601, 1101, 1701, 1706, 2353, 1523, 1580, - 1383, 2370, 2600, 1742, 1748, 1457, 2417, 1803, 1816, 1411, - 1499, 1608, 1103, 2550, 5057, 817, 834, 2591, 5057, 1828, - 2590, 2589, 2527, 2526, 2579, 2578, 2577, 2577, 388, 2576, - 349, 2575, 890, 1761, 1029, 0, 1326, 1560, 0, 5057, - 5057, 2429, 1436, 1590, 2525, 2525, 2522, 2522, 2528, 2522, - 815, 503, 841, 2489, 0, 2542, 2524, 2525, 2522, 0, - 2561, 2633, 858, 907, 910, 1727, 2565, 2553, 1645, 5057, - 2696, 1760, 1085, 618, 1805, 2549, 1241, 1003, 2505, 2493, - - 0, 1759, 0, 1834, 2752, 1875, 1834, 2491, 1882, 2549, - 1901, 1902, 2503, 2488, 2547, 434, 1522, 653, 953, 1219, - 1291, 2809, 2545, 1912, 1875, 1888, 1899, 1572, 2869, 1505, - 1519, 1604, 1898, 1915, 2941, 2544, 3013, 3077, 1916, 1951, - 1591, 0, 3133, 1967, 2025, 1841, 1663, 2494, 2535, 1637, - 2534, 2472, 2532, 2469, 2529, 2467, 2520, 1748, 1924, 5057, - 3189, 2483, 2479, 2479, 2474, 2526, 1268, 1972, 2525, 870, - 2498, 2473, 0, 3254, 3326, 2463, 2463, 2519, 1299, 1946, - 5057, 2515, 1971, 1097, 1394, 1506, 2508, 1319, 1239, 5057, - 2454, 2439, 0, 2483, 1817, 2013, 2474, 1582, 2448, 2400, - - 2393, 1048, 1250, 1594, 3389, 2005, 2020, 2073, 2069, 1937, - 3454, 2440, 3526, 2041, 1956, 2075, 2440, 2084, 2010, 2077, - 430, 5057, 2114, 2425, 2424, 2360, 2345, 2405, 2403, 2341, - 2339, 2397, 2394, 2328, 2326, 2379, 2373, 1850, 2076, 2077, - 2380, 2325, 2315, 2035, 2311, 2293, 2330, 2286, 2267, 2304, - 2279, 2288, 2263, 2044, 2278, 5057, 2008, 5057, 2312, 5057, - 5057, 2306, 2123, 2296, 2238, 2232, 2283, 1861, 872, 1450, - 2118, 2127, 2135, 2136, 2278, 2137, 2129, 2273, 2177, 5057, - 2187, 2142, 2203, 2200, 2177, 5057, 2125, 2129, 2103, 5057, - 2089, 2136, 2126, 2064, 2105, 2066, 1992, 2011, 1986, 1984, - - 0, 1960, 2180, 1990, 1924, 1065, 1113, 2229, 2175, 1960, - 2172, 2083, 2180, 2191, 1900, 1933, 1299, 1883, 1859, 2126, - 1806, 1072, 1787, 1760, 3598, 1728, 1719, 1697, 1506, 1747, - 3670, 2230, 2232, 1665, 1664, 1616, 5057, 1582, 1880, 1999, - 3742, 2081, 0, 1530, 1479, 1752, 1163, 3814, 2244, 2160, - 2244, 2252, 1487, 1478, 2229, 1476, 1419, 1392, 1372, 1591, - 1710, 2254, 1312, 1271, 2256, 1158, 1136, 2225, 2227, 1106, - 942, 906, 918, 1045, 1456, 2259, 2315, 875, 756, 2293, - 2211, 733, 2243, 2248, 0, 701, 584, 603, 1827, 2312, - 2314, 0, 2299, 538, 5057, 421, 2242, 473, 5057, 304, - - 315, 5057, 2151, 2378, 2346, 2302, 234, 206, 1795, 2379, - 2317, 203, 1623, 1642, 1664, 1887, 2369, 2370, 2382, 2383, - 2434, 2436, 2437, 2442, 2443, 2444, 2446, 2449, 2450, 2514, - 2030, 159, 5057, 5057, 3883, 3898, 3913, 3928, 3943, 3955, - 3970, 3985, 3999, 4002, 4005, 4008, 4023, 4038, 4041, 4044, - 4059, 4074, 4086, 4101, 4116, 4131, 4146, 4161, 4176, 4191, - 4194, 4209, 4224, 4239, 4254, 4269, 1899, 4272, 4283, 2048, - 4286, 4301, 4316, 4328, 4343, 4358, 4373, 4388, 4403, 4418, - 4433, 4448, 4457, 4472, 4487, 4502, 4517, 4532, 4547, 4562, - 4573, 4588, 4603, 4618, 4633, 4648, 4663, 4678, 4693, 4708, - - 4723, 4738, 4753, 4768, 4783, 4798, 4813, 4828, 4839, 4852, - 4867, 4882, 4897, 4908, 4921, 4936, 4951, 4966, 4981, 4996, - 5011, 5026, 5041 - } ; - -static yyconst short int yy_def[824] = - { 0, - 734, 734, 734, 734, 734, 734, 735, 736, 734, 734, - 735, 734, 12, 737, 735, 15, 15, 15, 15, 15, - 735, 15, 15, 735, 15, 735, 15, 738, 15, 15, - 29, 29, 29, 29, 29, 29, 29, 29, 30, 29, - 735, 735, 735, 739, 734, 740, 740, 734, 48, 737, - 740, 51, 51, 51, 51, 51, 740, 51, 51, 740, - 51, 740, 51, 51, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 65, 64, 740, 740, 740, 739, 734, - 734, 735, 741, 742, 741, 734, 734, 734, 734, 735, - 734, 735, 734, 743, 743, 735, 743, 734, 12, 734, - - 735, 737, 734, 735, 744, 735, 745, 746, 106, 734, - 106, 106, 735, 735, 735, 735, 106, 104, 735, 735, - 106, 735, 106, 106, 735, 747, 738, 747, 748, 734, - 735, 735, 749, 735, 735, 735, 735, 132, 750, 735, - 135, 106, 106, 735, 735, 735, 735, 735, 739, 751, - 739, 734, 752, 753, 734, 753, 753, 734, 753, 734, - 734, 753, 754, 753, 164, 745, 165, 165, 165, 753, - 753, 753, 753, 165, 164, 753, 753, 165, 753, 165, - 165, 753, 164, 164, 749, 164, 753, 753, 164, 184, - 750, 164, 187, 165, 165, 753, 753, 753, 753, 753, - - 739, 734, 755, 756, 756, 757, 758, 755, 755, 759, - 760, 734, 734, 734, 734, 735, 735, 734, 735, 734, - 734, 734, 734, 735, 734, 734, 735, 734, 106, 761, - 735, 734, 734, 735, 734, 734, 734, 734, 735, 735, - 735, 735, 735, 735, 735, 234, 735, 735, 735, 762, - 763, 764, 765, 766, 735, 767, 735, 768, 767, 735, - 735, 735, 769, 770, 735, 770, 735, 735, 255, 735, - 771, 735, 735, 770, 255, 265, 735, 735, 735, 735, - 735, 734, 739, 734, 772, 734, 773, 774, 774, 774, - 774, 775, 772, 776, 774, 774, 761, 774, 296, 774, - - 774, 774, 774, 774, 774, 774, 299, 774, 774, 774, - 777, 774, 296, 768, 774, 774, 774, 312, 774, 774, - 312, 296, 771, 774, 774, 312, 318, 774, 774, 774, - 774, 774, 739, 734, 734, 778, 778, 779, 734, 780, - 781, 781, 782, 782, 734, 734, 734, 735, 734, 734, - 734, 734, 734, 734, 734, 735, 783, 734, 735, 734, - 734, 735, 783, 735, 734, 734, 734, 734, 735, 735, - 735, 734, 735, 784, 735, 735, 735, 735, 735, 785, - 786, 786, 787, 787, 788, 789, 790, 734, 734, 734, - 735, 791, 734, 734, 791, 395, 735, 735, 734, 734, - - 735, 734, 391, 395, 391, 735, 735, 735, 739, 734, - 734, 734, 734, 734, 792, 734, 774, 793, 793, 774, - 774, 774, 363, 774, 774, 774, 774, 774, 794, 774, - 774, 774, 774, 774, 795, 785, 795, 774, 774, 774, - 774, 438, 438, 774, 774, 774, 739, 734, 796, 797, - 798, 799, 800, 801, 802, 803, 734, 734, 734, 734, - 735, 734, 734, 734, 734, 735, 735, 734, 735, 734, - 735, 735, 804, 805, 805, 735, 735, 735, 806, 807, - 734, 808, 734, 809, 809, 809, 735, 734, 734, 734, - 734, 734, 735, 734, 809, 739, 734, 734, 734, 734, - - 734, 810, 811, 811, 438, 774, 774, 774, 774, 774, - 812, 804, 812, 774, 774, 774, 813, 774, 774, 739, - 734, 734, 797, 798, 798, 799, 799, 800, 800, 801, - 801, 802, 802, 803, 803, 734, 734, 814, 814, 814, - 735, 734, 734, 734, 734, 735, 815, 734, 734, 734, - 734, 735, 735, 735, 735, 734, 734, 734, 734, 734, - 734, 734, 739, 734, 734, 734, 810, 810, 811, 811, - 774, 774, 774, 774, 816, 774, 774, 813, 739, 734, - 734, 797, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 815, 815, 734, 734, 734, 734, 735, 735, 735, - - 735, 735, 739, 734, 734, 811, 811, 774, 774, 816, - 774, 774, 774, 739, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 817, 735, 734, 734, 811, 811, - 818, 774, 739, 734, 734, 734, 734, 734, 819, 819, - 817, 641, 735, 734, 734, 811, 811, 818, 819, 648, - 774, 739, 734, 734, 819, 641, 641, 734, 734, 811, - 811, 820, 648, 648, 739, 734, 734, 819, 819, 641, - 641, 734, 734, 811, 811, 820, 820, 648, 648, 739, - 734, 734, 819, 819, 641, 821, 734, 822, 811, 820, - 820, 648, 739, 734, 734, 734, 819, 821, 734, 734, - - 822, 734, 811, 820, 820, 739, 734, 734, 811, 820, - 739, 734, 811, 739, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, - 823, 734, 734, 0, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734 - } ; - -static yyconst short int yy_nxt[5130] = - { 0, - 4, 4, 4, 5, 4, 4, 6, 4, 7, 8, - 4, 9, 10, 7, 4, 4, 11, 12, 13, 13, - 4, 14, 4, 4, 15, 16, 17, 18, 19, 19, - 20, 19, 7, 19, 21, 22, 15, 23, 24, 15, - 25, 26, 7, 27, 7, 28, 4, 4, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 15, 42, 24, 25, 26, 7, 7, 43, 7, - 44, 4, 4, 4, 4, 5, 4, 45, 6, 45, - 7, 8, 4, 9, 10, 46, 4, 4, 47, 48, - 49, 49, 4, 50, 4, 4, 51, 52, 53, 54, - - 55, 55, 56, 55, 46, 55, 57, 58, 51, 59, - 60, 51, 61, 62, 46, 63, 46, 28, 4, 4, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 51, 77, 60, 61, 62, 46, 46, - 78, 46, 79, 4, 80, 81, 81, 81, 81, 84, - 87, 88, 89, 734, 734, 82, 85, 85, 85, 85, - 110, 733, 90, 94, 91, 92, 114, 155, 80, 93, - 94, 94, 95, 82, 734, 734, 225, 82, 226, 117, - 734, 413, 96, 97, 98, 99, 99, 99, 99, 100, - 414, 115, 110, 101, 101, 101, 101, 101, 101, 101, - - 101, 82, 101, 82, 82, 101, 101, 101, 101, 101, - 82, 82, 101, 82, 146, 113, 111, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 82, - 101, 101, 101, 101, 82, 82, 82, 82, 82, 104, - 118, 105, 106, 106, 106, 106, 107, 110, 168, 108, - 734, 136, 734, 135, 135, 686, 89, 110, 144, 103, - 163, 82, 734, 147, 119, 712, 156, 734, 91, 157, - 104, 734, 734, 158, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 105, 136, 136, 135, - 135, 135, 82, 170, 108, 580, 174, 136, 136, 123, - - 124, 287, 82, 113, 155, 150, 125, 135, 135, 148, - 125, 116, 206, 207, 155, 218, 125, 702, 210, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 126, 127, 127, 127, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 128, 126, 126, 94, 175, 251, - 179, 126, 126, 126, 126, 734, 173, 154, 734, 734, - 708, 734, 734, 734, 155, 225, 188, 226, 187, 187, - 216, 217, 176, 196, 152, 171, 126, 130, 126, 211, - 136, 136, 130, 135, 135, 135, 136, 136, 136, 136, - 135, 135, 135, 734, 135, 135, 135, 451, 734, 150, - - 172, 126, 126, 131, 287, 734, 132, 132, 132, 132, - 133, 114, 400, 151, 151, 151, 151, 225, 136, 136, - 94, 94, 94, 136, 136, 135, 135, 135, 135, 135, - 135, 293, 294, 734, 134, 502, 115, 502, 135, 135, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 110, 734, 213, 734, 214, 204, 335, 82, 452, 215, - 137, 401, 198, 138, 138, 138, 138, 139, 152, 155, - 82, 81, 81, 81, 81, 699, 136, 136, 142, 142, - 142, 580, 155, 707, 135, 135, 135, 141, 141, 141, - 581, 140, 94, 94, 94, 141, 141, 141, 142, 142, - - 142, 142, 142, 142, 142, 142, 143, 94, 94, 95, - 197, 199, 206, 336, 82, 234, 234, 234, 234, 159, - 97, 98, 160, 160, 160, 160, 161, 206, 336, 470, - 162, 162, 162, 162, 162, 162, 162, 162, 154, 162, - 154, 154, 162, 162, 162, 162, 162, 154, 154, 162, - 154, 338, 339, 470, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 154, 162, 162, 162, - 162, 154, 154, 154, 154, 154, 82, 110, 734, 150, - 82, 164, 384, 105, 165, 165, 165, 165, 166, 695, - 201, 108, 155, 151, 151, 151, 151, 734, 234, 234, - - 234, 234, 82, 188, 188, 702, 187, 187, 187, 386, - 288, 289, 164, 734, 155, 130, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 82, 180, - 181, 734, 400, 734, 240, 105, 182, 700, 188, 188, - 155, 82, 82, 108, 187, 187, 187, 110, 152, 290, - 291, 387, 82, 155, 155, 103, 188, 188, 188, 188, - 187, 187, 187, 734, 155, 187, 187, 187, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 183, 490, 734, 184, 184, 184, 184, 185, 188, 188, - 187, 187, 187, 94, 94, 94, 82, 82, 82, 200, - - 182, 503, 82, 699, 170, 221, 182, 222, 155, 155, - 155, 186, 223, 734, 155, 187, 187, 188, 188, 188, - 188, 188, 188, 188, 188, 188, 188, 110, 234, 234, - 234, 234, 734, 246, 246, 246, 246, 189, 188, 188, - 190, 190, 190, 190, 191, 171, 187, 187, 187, 734, - 332, 311, 234, 234, 234, 234, 303, 188, 188, 82, - 239, 410, 187, 187, 187, 399, 411, 412, 192, 734, - 172, 155, 193, 193, 193, 194, 194, 194, 194, 194, - 194, 194, 194, 195, 734, 234, 234, 234, 234, 696, - 204, 293, 294, 303, 194, 194, 194, 208, 208, 208, - - 208, 209, 244, 193, 193, 193, 150, 268, 692, 188, - 188, 354, 94, 234, 234, 234, 234, 333, 468, 187, - 187, 355, 82, 173, 734, 249, 338, 339, 355, 734, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 229, 338, 339, 234, 234, 234, 234, 230, - 265, 265, 265, 265, 276, 276, 276, 276, 265, 265, - 265, 265, 247, 276, 276, 276, 276, 299, 299, 299, - 299, 384, 471, 229, 103, 152, 469, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 235, - 250, 236, 150, 82, 279, 239, 472, 237, 417, 453, - - 82, 550, 238, 692, 130, 155, 151, 151, 151, 151, - 283, 82, 155, 235, 386, 236, 299, 299, 299, 299, - 479, 687, 237, 155, 606, 551, 238, 126, 127, 127, - 127, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 299, 299, 299, 299, 126, 126, 126, - 126, 302, 301, 130, 82, 103, 387, 304, 686, 82, - 454, 152, 299, 299, 299, 299, 155, 307, 307, 307, - 307, 155, 126, 130, 126, 300, 299, 299, 299, 299, - 82, 82, 374, 290, 299, 299, 299, 299, 299, 299, - 299, 299, 155, 155, 685, 374, 374, 126, 126, 126, - - 252, 252, 252, 253, 82, 126, 126, 126, 126, 126, - 126, 82, 305, 126, 126, 504, 155, 492, 82, 126, - 126, 309, 126, 155, 310, 308, 318, 318, 318, 318, - 155, 82, 457, 311, 327, 327, 327, 327, 305, 356, - 356, 356, 356, 155, 126, 130, 458, 103, 82, 568, - 416, 568, 327, 327, 327, 327, 318, 318, 318, 318, - 155, 357, 357, 357, 357, 331, 493, 103, 629, 126, - 126, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 256, 300, 290, 82, 257, 359, 359, - 359, 359, 330, 734, 258, 399, 259, 688, 260, 260, - - 260, 360, 360, 360, 360, 150, 485, 260, 82, 82, - 260, 390, 548, 260, 260, 103, 447, 82, 257, 486, - 155, 155, 261, 261, 261, 262, 262, 262, 262, 262, - 262, 262, 261, 262, 685, 260, 548, 394, 260, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 264, 361, 361, 361, 361, 432, 372, 265, 265, - 265, 265, 204, 335, 266, 103, 267, 267, 267, 208, - 208, 208, 208, 209, 152, 267, 204, 335, 267, 630, - 373, 267, 267, 340, 340, 340, 340, 82, 349, 82, - 267, 267, 267, 82, 268, 359, 359, 359, 359, 155, - - 267, 155, 682, 267, 373, 155, 267, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 270, - 391, 391, 391, 391, 681, 661, 271, 82, 390, 369, - 359, 359, 359, 359, 391, 391, 391, 391, 433, 155, - 103, 252, 252, 252, 253, 359, 359, 359, 359, 427, - 270, 491, 103, 492, 272, 272, 272, 273, 273, 273, - 273, 273, 273, 273, 272, 273, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 229, 370, - 379, 276, 276, 276, 276, 230, 130, 264, 356, 356, - 356, 356, 418, 398, 392, 392, 392, 392, 390, 82, - - 266, 419, 561, 546, 403, 403, 403, 403, 455, 229, - 569, 155, 479, 277, 277, 277, 231, 278, 231, 231, - 231, 231, 231, 277, 231, 94, 94, 94, 546, 491, - 394, 679, 82, 403, 403, 403, 403, 154, 97, 363, - 160, 160, 160, 160, 155, 556, 363, 678, 162, 162, - 162, 162, 162, 162, 162, 162, 154, 162, 154, 154, - 162, 162, 162, 162, 162, 154, 154, 162, 154, 456, - 363, 489, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 154, 162, 162, 162, 162, 154, - 154, 154, 154, 154, 82, 405, 405, 405, 405, 420, - - 420, 420, 420, 734, 264, 400, 155, 359, 359, 359, - 359, 404, 404, 404, 404, 399, 734, 266, 82, 82, - 82, 359, 359, 359, 359, 431, 420, 420, 420, 420, - 155, 155, 155, 673, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 296, 394, 150, 734, - 353, 672, 103, 297, 401, 82, 734, 268, 103, 689, - 82, 426, 409, 409, 409, 409, 82, 155, 421, 421, - 421, 421, 155, 443, 443, 443, 443, 296, 155, 671, - 734, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 312, 312, 312, 312, 312, 312, 312, - - 312, 312, 312, 312, 312, 256, 607, 82, 103, 313, - 429, 670, 446, 82, 82, 485, 314, 152, 259, 155, - 315, 315, 315, 429, 429, 155, 155, 82, 734, 315, - 82, 82, 315, 399, 667, 315, 315, 666, 290, 155, - 313, 659, 155, 155, 316, 316, 316, 317, 317, 317, - 317, 317, 317, 317, 316, 317, 290, 315, 430, 646, - 315, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 82, 264, 320, 460, 460, 460, 460, - 82, 318, 318, 318, 318, 155, 658, 266, 82, 319, - 319, 319, 155, 103, 400, 221, 103, 222, 319, 82, - - 155, 319, 223, 509, 319, 319, 461, 461, 461, 461, - 82, 155, 82, 319, 319, 319, 82, 320, 421, 421, - 421, 421, 155, 319, 155, 103, 319, 510, 155, 319, - 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, - 321, 321, 322, 441, 715, 82, 204, 522, 654, 323, - 674, 523, 425, 421, 421, 421, 421, 155, 514, 570, - 82, 484, 484, 484, 484, 150, 717, 637, 421, 421, - 421, 421, 155, 322, 434, 688, 520, 324, 324, 324, - 325, 325, 325, 325, 325, 325, 325, 324, 325, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - - 326, 296, 426, 434, 327, 327, 327, 327, 297, 82, - 372, 390, 103, 152, 82, 82, 653, 438, 438, 438, - 438, 155, 438, 438, 438, 438, 155, 155, 480, 480, - 480, 580, 296, 428, 152, 282, 328, 328, 328, 298, - 329, 298, 298, 298, 298, 298, 328, 298, 362, 103, - 82, 536, 390, 645, 103, 363, 82, 428, 442, 442, - 442, 442, 155, 537, 442, 442, 442, 442, 155, 395, - 455, 675, 644, 481, 355, 495, 495, 495, 495, 362, - 643, 355, 396, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 380, 380, 103, 380, 380, - - 380, 380, 380, 647, 380, 380, 380, 380, 660, 380, - 380, 82, 489, 399, 734, 380, 380, 380, 380, 421, - 421, 421, 421, 155, 82, 639, 485, 734, 639, 103, - 400, 456, 421, 421, 421, 421, 155, 204, 335, 486, - 380, 380, 380, 395, 450, 450, 450, 450, 492, 82, - 461, 461, 461, 461, 713, 320, 396, 734, 638, 539, - 382, 155, 568, 416, 568, 380, 380, 126, 252, 252, - 252, 253, 540, 126, 126, 126, 126, 126, 126, 441, - 703, 126, 126, 82, 150, 491, 489, 126, 126, 717, - 126, 461, 461, 461, 461, 155, 82, 493, 496, 496, - - 496, 496, 468, 290, 89, 498, 82, 82, 155, 388, - 655, 388, 126, 130, 497, 499, 91, 98, 155, 155, - 82, 93, 100, 82, 82, 620, 491, 398, 505, 505, - 505, 505, 155, 506, 655, 155, 155, 126, 126, 264, - 538, 538, 538, 538, 635, 82, 507, 480, 480, 480, - 515, 584, 266, 152, 267, 267, 267, 155, 282, 82, - 508, 634, 416, 267, 82, 492, 267, 516, 440, 267, - 267, 155, 557, 557, 557, 82, 155, 491, 267, 267, - 267, 547, 268, 505, 505, 505, 505, 155, 267, 574, - 628, 267, 481, 627, 267, 262, 262, 262, 262, 262, - - 262, 262, 262, 262, 262, 262, 262, 395, 110, 557, - 557, 557, 548, 82, 519, 150, 577, 558, 82, 440, - 396, 549, 397, 397, 397, 155, 626, 563, 82, 655, - 155, 397, 717, 82, 397, 601, 548, 397, 397, 492, - 155, 505, 505, 505, 505, 155, 397, 397, 397, 82, - 398, 625, 625, 655, 558, 572, 397, 624, 393, 397, - 393, 155, 397, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 362, 468, 82, 110, 150, - 572, 82, 363, 82, 564, 734, 539, 589, 519, 155, - 579, 82, 82, 155, 560, 155, 600, 573, 734, 734, - - 590, 732, 576, 155, 155, 656, 362, 623, 622, 601, - 406, 406, 406, 364, 407, 364, 364, 364, 364, 364, - 406, 364, 82, 204, 335, 150, 82, 621, 586, 657, - 582, 582, 582, 582, 155, 82, 593, 82, 155, 603, - 603, 603, 603, 82, 82, 82, 593, 155, 152, 155, - 620, 204, 522, 103, 590, 155, 155, 155, 582, 582, - 582, 582, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 298, 298, 422, 197, 608, 613, 636, 150, - 82, 423, 150, 82, 663, 619, 618, 586, 82, 611, - 614, 637, 155, 150, 152, 155, 603, 603, 603, 603, - - 155, 609, 612, 617, 633, 422, 616, 709, 664, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 380, 380, 612, 380, 380, 380, 380, 380, 381, - 380, 380, 380, 380, 150, 380, 380, 82, 82, 615, - 631, 436, 380, 380, 380, 652, 632, 662, 152, 155, - 155, 564, 82, 668, 150, 655, 416, 655, 150, 655, - 683, 416, 152, 694, 155, 665, 380, 380, 380, 680, - 631, 697, 655, 655, 655, 416, 695, 669, 655, 655, - 416, 655, 651, 655, 677, 416, 437, 684, 605, 677, - 604, 380, 380, 82, 264, 150, 655, 655, 655, 284, - - 697, 150, 655, 152, 150, 155, 693, 266, 677, 319, - 319, 319, 706, 677, 416, 711, 416, 416, 319, 150, - 561, 319, 560, 152, 319, 319, 602, 152, 599, 598, - 714, 597, 596, 319, 319, 319, 595, 320, 594, 690, - 593, 145, 677, 319, 677, 677, 319, 704, 416, 319, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 317, 395, 691, 152, 591, 677, 588, 677, 677, - 152, 717, 717, 152, 705, 396, 677, 439, 439, 439, - 416, 416, 718, 719, 717, 717, 439, 587, 152, 439, - 586, 584, 439, 439, 583, 720, 721, 535, 710, 535, - - 677, 439, 439, 439, 533, 440, 710, 533, 677, 677, - 531, 439, 531, 529, 439, 529, 527, 439, 325, 325, - 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 422, 527, 677, 677, 525, 525, 717, 423, 717, 717, - 282, 282, 416, 575, 717, 717, 717, 722, 717, 723, - 724, 717, 717, 282, 282, 725, 726, 727, 566, 728, - 565, 422, 729, 730, 225, 444, 444, 444, 424, 445, - 424, 424, 424, 424, 424, 444, 424, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, 364, 473, - 473, 218, 473, 473, 473, 473, 473, 490, 473, 473, - - 473, 473, 562, 473, 473, 282, 489, 282, 282, 473, - 473, 473, 473, 282, 282, 282, 717, 282, 560, 483, - 282, 282, 110, 555, 554, 553, 552, 731, 468, 110, - 545, 544, 543, 542, 473, 473, 473, 458, 535, 533, - 531, 475, 529, 527, 525, 207, 521, 517, 287, 416, - 501, 500, 86, 219, 475, 475, 494, 394, 395, 473, - 473, 380, 380, 390, 380, 380, 380, 380, 380, 483, - 380, 380, 380, 380, 478, 380, 380, 477, 476, 219, - 467, 380, 380, 380, 380, 282, 466, 465, 464, 463, - 462, 225, 225, 219, 218, 218, 218, 344, 344, 342, - - 342, 207, 448, 287, 287, 287, 380, 380, 380, 286, - 416, 286, 379, 408, 370, 264, 390, 256, 378, 377, - 376, 375, 371, 368, 367, 366, 365, 353, 353, 352, - 351, 380, 380, 380, 380, 350, 380, 380, 380, 380, - 380, 349, 380, 380, 380, 380, 349, 380, 380, 348, - 347, 346, 345, 380, 380, 380, 380, 344, 342, 335, - 334, 287, 287, 306, 287, 287, 286, 284, 282, 281, - 219, 280, 244, 130, 250, 248, 219, 245, 380, 380, - 380, 243, 242, 242, 241, 103, 225, 224, 218, 219, - 218, 212, 204, 202, 178, 734, 169, 153, 145, 122, - - 121, 116, 734, 380, 380, 485, 112, 103, 86, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 486, 734, - 487, 487, 487, 734, 734, 734, 734, 734, 734, 487, - 734, 734, 487, 734, 734, 487, 487, 734, 734, 734, - 734, 734, 734, 734, 487, 487, 487, 734, 734, 734, - 734, 734, 734, 734, 487, 734, 734, 487, 734, 734, - 487, 395, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 396, 734, 397, 397, 397, 734, - 734, 734, 734, 734, 734, 397, 734, 734, 397, 734, - 734, 397, 397, 734, 734, 734, 734, 734, 734, 734, - - 397, 397, 397, 734, 398, 734, 734, 734, 734, 734, - 397, 734, 734, 397, 734, 734, 397, 82, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 155, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 473, - 473, 734, 473, 473, 473, 473, 473, 474, 473, 473, - 473, 473, 734, 473, 473, 734, 734, 734, 734, 512, - 473, 473, 473, 734, 734, 734, 734, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 473, 473, 473, 734, 734, 734, - 734, 513, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 513, 513, 734, 734, 734, 473, - 473, 380, 380, 734, 380, 380, 380, 380, 380, 381, - 380, 380, 380, 380, 734, 380, 380, 734, 734, 734, - 734, 436, 380, 380, 380, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 380, 380, 380, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 380, 380, 380, 380, 734, 380, 380, 380, 380, - 380, 381, 380, 380, 380, 380, 734, 380, 380, 734, - 734, 734, 734, 436, 380, 380, 380, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 380, 380, - 380, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 380, 380, 82, 485, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 155, 734, 486, - - 734, 518, 518, 518, 734, 734, 734, 734, 734, 734, - 518, 734, 734, 518, 734, 734, 518, 518, 734, 734, - 734, 734, 734, 734, 734, 518, 518, 518, 734, 734, - 734, 734, 734, 734, 734, 518, 734, 734, 518, 734, - 734, 518, 395, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 396, 734, 439, 439, 439, - 734, 734, 734, 734, 734, 734, 439, 734, 734, 439, - 734, 734, 439, 439, 734, 734, 734, 734, 734, 734, - 734, 439, 439, 439, 734, 440, 734, 734, 734, 734, - 734, 439, 734, 734, 439, 734, 734, 439, 539, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 540, 734, 541, 541, 541, 734, 734, 734, 734, - 734, 734, 541, 734, 734, 541, 734, 734, 541, 541, - 734, 734, 734, 734, 734, 734, 734, 541, 541, 541, - 734, 734, 734, 734, 734, 734, 734, 541, 734, 734, - 541, 734, 734, 541, 473, 473, 734, 473, 473, 473, - 473, 473, 734, 473, 473, 473, 473, 734, 473, 473, - 734, 734, 734, 734, 473, 473, 473, 473, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 473, - - 473, 473, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 473, 473, 473, 473, 734, 473, - 473, 473, 473, 473, 734, 473, 473, 473, 473, 734, - 473, 473, 734, 734, 734, 734, 473, 473, 473, 473, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 473, 473, 473, 734, 734, 734, 734, 475, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 475, 475, 734, 734, 734, 473, 473, 539, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 540, 734, 571, 571, 571, 734, 734, 734, 734, - 734, 734, 571, 734, 734, 571, 734, 734, 571, 571, - 734, 734, 734, 734, 734, 734, 734, 571, 571, 571, - 734, 734, 734, 734, 734, 734, 734, 571, 734, 734, - 571, 734, 734, 571, 473, 473, 734, 473, 473, 473, - 473, 473, 474, 473, 473, 473, 473, 734, 473, 473, - 734, 734, 734, 734, 512, 473, 473, 473, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 473, - - 473, 473, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 473, 473, 473, 473, 734, 473, - 473, 473, 473, 473, 474, 473, 473, 473, 473, 734, - 473, 473, 734, 734, 734, 734, 512, 473, 473, 473, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 473, 473, 473, 734, 734, 734, 734, 513, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 513, 513, 734, 734, 734, 473, 473, 640, 640, - - 734, 640, 640, 640, 640, 640, 734, 640, 640, 640, - 640, 734, 640, 640, 734, 734, 734, 734, 640, 640, - 640, 640, 734, 734, 734, 734, 734, 734, 642, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 640, 640, 640, 734, 734, 734, 734, - 734, 734, 642, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 640, 640, - 640, 640, 734, 640, 640, 640, 640, 640, 641, 640, - 640, 640, 640, 734, 640, 640, 734, 734, 734, 734, - 649, 640, 640, 640, 734, 734, 734, 734, 734, 734, - - 650, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 640, 640, 640, 734, 734, - 734, 734, 734, 734, 650, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 640, 640, 640, 640, 734, 640, 640, 640, 640, 640, - 734, 640, 640, 640, 640, 734, 640, 640, 734, 734, - 734, 734, 640, 640, 640, 640, 734, 734, 734, 734, - 734, 734, 642, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 640, 640, 640, - 734, 734, 734, 734, 734, 734, 642, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 640, 640, 640, 640, 734, 640, 640, 640, - 640, 640, 641, 640, 640, 640, 640, 734, 640, 640, - 734, 734, 734, 734, 649, 640, 640, 640, 734, 734, - 734, 734, 734, 734, 650, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 640, - 640, 640, 734, 734, 734, 734, 734, 734, 650, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 640, 640, 82, 734, 734, 82, - 82, 734, 734, 82, 82, 82, 82, 82, 83, 83, - - 83, 83, 83, 734, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, - 129, 129, 129, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 154, 734, - 734, 154, 154, 154, 734, 154, 154, 154, 154, 154, - 203, 203, 203, 203, 203, 734, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - - 220, 220, 734, 734, 734, 734, 734, 734, 734, 220, - 220, 220, 220, 220, 228, 228, 228, 232, 232, 232, - 233, 233, 233, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 263, 263, 263, 274, 274, 274, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 285, 285, 285, 154, - 734, 734, 154, 154, 154, 734, 154, 154, 154, 154, - - 154, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 337, 337, 337, 337, 337, 337, 337, 337, 337, - 337, 337, 337, 337, 337, 337, 341, 341, 734, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 343, 343, 734, 343, 343, 343, 343, 343, 343, - - 343, 343, 343, 343, 343, 343, 358, 358, 358, 381, - 381, 734, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 389, 389, 389, 393, 734, 734, - 393, 734, 393, 393, 734, 393, 734, 393, 402, 402, - - 402, 285, 285, 285, 285, 285, 285, 285, 285, 285, - 285, 285, 285, 285, 285, 285, 415, 415, 415, 415, - 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, - 415, 154, 734, 734, 154, 154, 154, 734, 154, 154, - 154, 154, 154, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 435, 435, 734, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, 337, 337, - 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, - - 337, 337, 337, 449, 449, 449, 449, 734, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 341, 341, 734, 341, 341, 341, 341, - 341, 341, 341, 341, 341, 341, 341, 341, 343, 343, - 734, 343, 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 459, 734, 459, 734, 734, 734, 459, - 459, 459, 474, 474, 734, 474, 474, 474, 474, 474, - 474, 474, 474, 474, 474, 474, 474, 380, 380, 734, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - - 380, 380, 381, 381, 734, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 383, 383, 383, - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 385, 385, 385, 385, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 482, 482, 482, 482, 482, 482, 482, 482, - 482, 482, 482, 482, 482, 482, 482, 488, 734, 734, - 734, 734, 488, 488, 734, 488, 734, 488, 415, 415, - 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, - - 415, 415, 415, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 511, 511, - 734, 511, 511, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 435, 435, 734, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, 449, 449, - 449, 449, 734, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 524, 524, - 734, 524, 524, 524, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 526, 526, 734, 526, 526, 526, 526, - - 526, 526, 526, 526, 526, 526, 526, 526, 528, 528, - 734, 528, 528, 528, 528, 528, 528, 528, 528, 528, - 528, 528, 528, 530, 530, 734, 530, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 532, 532, - 734, 532, 532, 532, 532, 532, 532, 532, 532, 532, - 532, 532, 532, 534, 534, 734, 534, 534, 534, 534, - 534, 534, 534, 534, 534, 534, 534, 534, 473, 473, - 734, 473, 473, 473, 473, 473, 473, 473, 473, 473, - 473, 473, 473, 474, 474, 734, 474, 474, 474, 474, - 474, 474, 474, 474, 474, 474, 474, 474, 383, 383, - - 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 383, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 482, 482, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, - 482, 482, 482, 559, 734, 734, 734, 734, 559, 559, - 734, 559, 567, 567, 567, 567, 567, 567, 567, 567, - 567, 567, 567, 567, 567, 567, 567, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 511, 511, 734, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 578, 578, 578, - - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 585, 734, 734, 734, 734, 585, 585, 734, - 585, 592, 592, 734, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 592, 610, 610, 610, 610, - 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, - 610, 641, 641, 734, 641, 641, 641, 641, 641, 641, - 641, 641, 641, 641, 641, 641, 648, 648, 734, 648, - 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, - 648, 640, 640, 734, 640, 640, 640, 640, 640, 640, - 640, 640, 640, 640, 640, 640, 676, 676, 676, 676, - - 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, - 676, 698, 698, 698, 698, 698, 698, 698, 698, 698, - 698, 698, 698, 698, 698, 698, 701, 701, 701, 701, - 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, - 701, 716, 716, 716, 716, 716, 716, 716, 716, 716, - 716, 716, 716, 716, 716, 716, 3, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734 - } ; - -static yyconst short int yy_chk[5130] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 5, 6, 6, 6, 6, 8, - 10, 10, 11, 20, 22, 46, 8, 8, 8, 8, - 16, 732, 11, 13, 11, 11, 20, 46, 5, 11, - 12, 12, 12, 13, 18, 13, 98, 12, 98, 22, - 13, 286, 12, 12, 12, 12, 12, 12, 12, 12, - 286, 20, 52, 12, 12, 12, 12, 12, 12, 12, - - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 42, 18, 16, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, - 23, 15, 15, 15, 15, 15, 15, 27, 52, 15, - 23, 31, 54, 31, 31, 712, 47, 43, 31, 50, - 50, 47, 32, 42, 23, 708, 47, 27, 47, 47, - 15, 58, 40, 47, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 24, 32, 32, 32, - 32, 32, 62, 54, 24, 707, 58, 40, 40, 27, - - 27, 158, 57, 32, 62, 149, 27, 40, 40, 43, - 43, 40, 84, 84, 57, 158, 43, 701, 86, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 49, 59, 128, - 62, 28, 28, 28, 28, 33, 57, 49, 59, 49, - 700, 34, 56, 36, 49, 351, 66, 351, 66, 66, - 90, 90, 59, 66, 149, 56, 28, 28, 28, 86, - 33, 33, 128, 33, 33, 33, 34, 34, 36, 36, - 34, 34, 34, 37, 36, 36, 36, 349, 35, 44, - - 56, 28, 28, 29, 161, 29, 29, 29, 29, 29, - 29, 35, 268, 44, 44, 44, 44, 161, 37, 37, - 94, 94, 94, 35, 35, 37, 37, 37, 35, 35, - 35, 163, 163, 39, 29, 416, 35, 416, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 30, 38, 89, 39, 89, 203, 203, 77, 349, 89, - 30, 268, 77, 30, 30, 30, 30, 30, 44, 77, - 76, 81, 81, 81, 81, 698, 38, 38, 39, 39, - 39, 521, 76, 696, 38, 38, 38, 39, 39, 39, - 521, 30, 97, 97, 97, 30, 30, 30, 30, 30, - - 30, 30, 30, 30, 30, 30, 30, 48, 48, 48, - 76, 77, 204, 204, 48, 109, 109, 109, 109, 48, - 48, 48, 48, 48, 48, 48, 48, 205, 205, 372, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 207, 207, 372, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 51, 63, 68, 79, - 154, 51, 251, 51, 51, 51, 51, 51, 51, 694, - 79, 51, 154, 79, 79, 79, 79, 63, 112, 112, - - 112, 112, 156, 68, 68, 688, 68, 68, 68, 253, - 156, 156, 51, 71, 156, 251, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 60, 63, - 63, 69, 394, 72, 112, 60, 63, 687, 71, 71, - 60, 157, 159, 60, 71, 71, 71, 78, 79, 157, - 159, 253, 78, 157, 159, 418, 69, 69, 72, 72, - 69, 69, 69, 67, 78, 72, 72, 72, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 64, 394, 64, 64, 64, 64, 64, 64, 67, 67, - 67, 67, 67, 95, 95, 95, 162, 172, 182, 78, - - 78, 418, 200, 686, 67, 95, 78, 95, 162, 172, - 182, 64, 95, 73, 200, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 65, 111, 111, - 111, 111, 70, 120, 120, 120, 120, 65, 73, 73, - 65, 65, 65, 65, 65, 70, 73, 73, 73, 74, - 200, 182, 117, 117, 117, 117, 172, 70, 70, 171, - 111, 284, 70, 70, 70, 267, 284, 284, 65, 74, - 70, 171, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 75, 123, 123, 123, 123, 682, - 85, 292, 292, 171, 74, 74, 74, 85, 85, 85, - - 85, 85, 117, 74, 74, 74, 201, 267, 679, 75, - 75, 226, 99, 121, 121, 121, 121, 201, 371, 75, - 75, 226, 99, 75, 99, 123, 336, 336, 226, 99, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 106, 337, 337, 124, 124, 124, 124, 106, - 136, 136, 136, 136, 142, 142, 142, 142, 144, 144, - 144, 144, 121, 143, 143, 143, 143, 167, 167, 167, - 167, 383, 373, 106, 569, 201, 371, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 110, - 124, 110, 151, 288, 144, 143, 373, 110, 288, 353, - - 173, 470, 110, 678, 383, 288, 151, 151, 151, 151, - 151, 170, 173, 110, 385, 110, 169, 169, 169, 169, - 384, 673, 110, 170, 569, 470, 110, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 168, 168, 168, 168, 127, 127, 127, - 127, 170, 169, 384, 176, 419, 385, 173, 672, 177, - 353, 151, 174, 174, 174, 174, 176, 177, 177, 177, - 177, 177, 127, 127, 127, 168, 178, 178, 178, 178, - 197, 179, 243, 176, 180, 180, 180, 180, 181, 181, - 181, 181, 197, 179, 671, 243, 243, 127, 127, 129, - - 129, 129, 129, 129, 290, 129, 129, 129, 129, 129, - 129, 198, 174, 129, 129, 419, 290, 398, 188, 129, - 129, 179, 129, 198, 180, 178, 188, 188, 188, 188, - 188, 199, 355, 181, 194, 194, 194, 194, 197, 227, - 227, 227, 227, 199, 129, 129, 355, 674, 196, 502, - 502, 502, 195, 195, 195, 195, 196, 196, 196, 196, - 196, 228, 228, 228, 228, 198, 398, 606, 606, 129, - 129, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 132, 195, 199, 229, 132, 231, 231, - 231, 231, 196, 229, 132, 393, 132, 674, 132, 132, - - 132, 232, 232, 232, 232, 333, 484, 132, 308, 315, - 132, 315, 622, 132, 132, 607, 333, 229, 132, 484, - 308, 315, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 670, 132, 622, 393, 132, 134, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 135, 233, 233, 233, 233, 308, 242, 135, 135, - 135, 135, 208, 208, 135, 647, 135, 135, 135, 208, - 208, 208, 208, 208, 333, 135, 209, 209, 135, 607, - 242, 135, 135, 209, 209, 209, 209, 309, 289, 302, - 135, 135, 135, 289, 135, 239, 239, 239, 239, 309, - - 135, 302, 667, 135, 242, 289, 135, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, - 262, 262, 262, 262, 666, 647, 138, 420, 261, 239, - 249, 249, 249, 249, 261, 261, 261, 261, 309, 420, - 294, 252, 252, 252, 252, 240, 240, 240, 240, 302, - 138, 397, 503, 489, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 141, 240, - 249, 141, 141, 141, 141, 141, 252, 263, 269, 269, - 269, 269, 294, 397, 263, 263, 263, 263, 272, 421, - - 263, 294, 489, 467, 272, 272, 272, 272, 617, 141, - 503, 421, 479, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 160, 160, 160, 467, 488, - 263, 664, 160, 273, 273, 273, 273, 160, 160, 357, - 160, 160, 160, 160, 160, 479, 357, 663, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 617, - 357, 488, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 164, 275, 275, 275, 275, 321, - - 321, 321, 321, 485, 274, 278, 164, 278, 278, 278, - 278, 274, 274, 274, 274, 277, 485, 274, 295, 330, - 306, 277, 277, 277, 277, 306, 295, 295, 295, 295, - 295, 330, 306, 659, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 165, 274, 283, 363, - 291, 658, 570, 165, 278, 291, 363, 277, 675, 675, - 298, 330, 283, 283, 283, 283, 304, 291, 298, 298, - 298, 298, 298, 326, 326, 326, 326, 165, 304, 657, - 363, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 183, 183, 183, 183, 183, 183, 183, - - 183, 183, 183, 183, 183, 184, 570, 331, 629, 184, - 304, 656, 331, 430, 305, 486, 184, 283, 184, 331, - 184, 184, 184, 304, 304, 430, 305, 431, 486, 184, - 417, 319, 184, 319, 654, 184, 184, 653, 417, 431, - 184, 645, 417, 319, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 184, 431, 184, 305, 629, - 184, 186, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 187, 187, 319, 358, 358, 358, 358, - 428, 187, 187, 187, 187, 187, 644, 187, 320, 187, - 187, 187, 428, 660, 320, 498, 504, 498, 187, 441, - - 320, 187, 498, 428, 187, 187, 364, 364, 364, 364, - 300, 441, 432, 187, 187, 187, 332, 187, 300, 300, - 300, 300, 300, 187, 432, 713, 187, 428, 332, 187, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 190, 320, 714, 310, 450, 450, 638, 190, - 660, 450, 300, 310, 310, 310, 310, 310, 432, 504, - 301, 389, 389, 389, 389, 447, 715, 636, 301, 301, - 301, 301, 301, 190, 332, 713, 447, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, - - 192, 193, 301, 310, 193, 193, 193, 193, 193, 316, - 303, 316, 661, 714, 317, 303, 635, 316, 316, 316, - 316, 316, 317, 317, 317, 317, 317, 303, 386, 386, - 386, 634, 193, 303, 447, 715, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 234, 630, - 324, 458, 324, 628, 646, 234, 325, 303, 324, 324, - 324, 324, 324, 458, 325, 325, 325, 325, 325, 392, - 354, 661, 627, 386, 354, 402, 402, 402, 402, 234, - 626, 354, 392, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 250, 250, 709, 250, 250, - - 250, 250, 250, 630, 250, 250, 250, 250, 646, 250, - 250, 328, 392, 328, 395, 250, 250, 250, 250, 328, - 328, 328, 328, 328, 329, 624, 495, 395, 623, 689, - 329, 354, 329, 329, 329, 329, 329, 340, 340, 495, - 250, 250, 250, 404, 340, 340, 340, 340, 407, 446, - 407, 407, 407, 407, 709, 328, 404, 395, 621, 538, - 250, 446, 568, 568, 568, 250, 250, 254, 254, 254, - 254, 254, 538, 254, 254, 254, 254, 254, 254, 329, - 689, 254, 254, 425, 409, 406, 404, 254, 254, 716, - 254, 406, 406, 406, 406, 425, 426, 407, 409, 409, - - 409, 409, 427, 446, 411, 412, 433, 427, 426, 767, - 639, 767, 254, 254, 411, 412, 411, 412, 433, 427, - 424, 411, 412, 434, 439, 619, 439, 406, 424, 424, - 424, 424, 424, 425, 639, 434, 439, 254, 254, 255, - 459, 459, 459, 459, 618, 510, 426, 480, 480, 480, - 433, 616, 255, 409, 255, 255, 255, 510, 716, 440, - 427, 615, 610, 255, 515, 440, 255, 434, 439, 255, - 255, 440, 483, 483, 483, 444, 515, 444, 255, 255, - 255, 468, 255, 444, 444, 444, 444, 444, 255, 510, - 605, 255, 480, 604, 255, 257, 257, 257, 257, 257, - - 257, 257, 257, 257, 257, 257, 257, 265, 506, 557, - 557, 557, 468, 506, 440, 496, 515, 483, 519, 444, - 265, 468, 265, 265, 265, 506, 602, 496, 507, 640, - 519, 265, 731, 445, 265, 600, 468, 265, 265, 445, - 507, 445, 445, 445, 445, 445, 265, 265, 265, 514, - 265, 599, 598, 640, 557, 507, 265, 597, 770, 265, - 770, 514, 265, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 276, 508, 509, 516, 520, - 507, 508, 276, 516, 496, 539, 540, 544, 445, 509, - 520, 612, 518, 508, 518, 516, 554, 509, 539, 540, - - 544, 731, 514, 612, 518, 642, 276, 596, 595, 554, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 296, 523, 523, 563, 571, 594, 571, 642, - 523, 523, 523, 523, 296, 572, 593, 577, 571, 563, - 563, 563, 563, 573, 574, 576, 592, 572, 520, 577, - 591, 582, 582, 703, 589, 573, 574, 576, 582, 582, - 582, 582, 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 299, 572, 573, 577, 620, 579, - 611, 299, 603, 609, 650, 588, 587, 585, 613, 576, - 579, 620, 611, 614, 563, 609, 603, 603, 603, 603, - - 613, 574, 576, 584, 614, 299, 583, 703, 650, 299, - 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, - 299, 311, 311, 611, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 633, 311, 311, 608, 632, 581, - 609, 311, 311, 311, 311, 633, 613, 649, 579, 608, - 632, 603, 651, 655, 652, 668, 662, 669, 665, 655, - 668, 676, 614, 681, 651, 652, 311, 311, 311, 665, - 608, 683, 697, 683, 649, 578, 681, 655, 684, 668, - 575, 669, 632, 655, 662, 567, 311, 669, 566, 676, - 565, 311, 311, 312, 312, 680, 697, 683, 649, 564, - - 684, 693, 684, 633, 706, 312, 680, 312, 662, 312, - 312, 312, 693, 676, 690, 706, 691, 677, 312, 711, - 562, 312, 559, 652, 312, 312, 555, 665, 553, 552, - 711, 551, 550, 312, 312, 312, 549, 312, 548, 677, - 547, 546, 690, 312, 691, 677, 312, 690, 705, 312, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 318, 677, 680, 545, 690, 543, 691, 677, - 693, 717, 718, 706, 691, 318, 705, 318, 318, 318, - 704, 710, 717, 718, 719, 720, 318, 542, 711, 318, - 541, 537, 318, 318, 536, 719, 720, 535, 705, 534, - - 705, 318, 318, 318, 533, 318, 704, 532, 704, 710, - 531, 318, 530, 529, 318, 528, 527, 318, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 327, 526, 704, 710, 525, 524, 721, 327, 722, 723, - 717, 718, 517, 512, 724, 725, 726, 721, 727, 722, - 723, 728, 729, 719, 720, 724, 725, 726, 501, 727, - 500, 327, 728, 729, 499, 327, 327, 327, 327, 327, - 327, 327, 327, 327, 327, 327, 327, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 374, - 374, 497, 374, 374, 374, 374, 374, 494, 374, 374, - - 374, 374, 492, 374, 374, 721, 491, 722, 723, 374, - 374, 374, 374, 724, 725, 726, 730, 727, 487, 482, - 728, 729, 478, 477, 476, 472, 471, 730, 469, 466, - 465, 464, 463, 462, 374, 374, 374, 457, 456, 455, - 454, 374, 453, 452, 451, 449, 448, 436, 423, 415, - 414, 413, 410, 408, 374, 374, 400, 399, 396, 374, - 374, 381, 381, 388, 381, 381, 381, 381, 381, 387, - 381, 381, 381, 381, 379, 381, 381, 378, 377, 376, - 370, 381, 381, 381, 381, 730, 369, 368, 367, 366, - 365, 352, 350, 348, 347, 346, 345, 344, 343, 342, - - 341, 338, 334, 323, 314, 297, 381, 381, 381, 293, - 287, 285, 281, 280, 279, 266, 260, 259, 248, 247, - 245, 244, 241, 238, 237, 236, 235, 225, 224, 223, - 222, 381, 381, 382, 382, 221, 382, 382, 382, 382, - 382, 218, 382, 382, 382, 382, 217, 382, 382, 216, - 215, 214, 213, 382, 382, 382, 382, 211, 210, 206, - 202, 191, 185, 175, 166, 155, 153, 152, 150, 148, - 147, 146, 145, 126, 125, 122, 119, 118, 382, 382, - 382, 116, 115, 114, 113, 102, 100, 96, 93, 92, - 91, 88, 83, 80, 61, 55, 53, 45, 41, 26, - - 25, 21, 19, 382, 382, 391, 17, 14, 9, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, - 391, 391, 391, 0, 0, 0, 0, 0, 0, 391, - 0, 0, 391, 0, 0, 391, 391, 0, 0, 0, - 0, 0, 0, 0, 391, 391, 391, 0, 0, 0, - 0, 0, 0, 0, 391, 0, 0, 391, 0, 0, - 391, 405, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 405, 0, 405, 405, 405, 0, - 0, 0, 0, 0, 0, 405, 0, 0, 405, 0, - 0, 405, 405, 0, 0, 0, 0, 0, 0, 0, - - 405, 405, 405, 0, 405, 0, 0, 0, 0, 0, - 405, 0, 0, 405, 0, 0, 405, 422, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 422, 422, 422, - 422, 422, 422, 422, 422, 422, 422, 422, 422, 429, - 429, 0, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 0, 429, 429, 0, 0, 0, 0, 429, - 429, 429, 429, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 429, 429, 429, 0, 0, 0, - 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 429, 429, 0, 0, 0, 429, - 429, 435, 435, 0, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 0, 435, 435, 0, 0, 0, - 0, 435, 435, 435, 435, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 435, 435, 435, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 435, 435, 437, 437, 0, 437, 437, 437, 437, - 437, 437, 437, 437, 437, 437, 0, 437, 437, 0, - 0, 0, 0, 437, 437, 437, 437, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 437, 437, - 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 437, 437, 438, 438, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 438, 0, 438, - - 0, 438, 438, 438, 0, 0, 0, 0, 0, 0, - 438, 0, 0, 438, 0, 0, 438, 438, 0, 0, - 0, 0, 0, 0, 0, 438, 438, 438, 0, 0, - 0, 0, 0, 0, 0, 438, 0, 0, 438, 0, - 0, 438, 443, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 443, 0, 443, 443, 443, - 0, 0, 0, 0, 0, 0, 443, 0, 0, 443, - 0, 0, 443, 443, 0, 0, 0, 0, 0, 0, - 0, 443, 443, 443, 0, 443, 0, 0, 0, 0, - 0, 443, 0, 0, 443, 0, 0, 443, 461, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 461, 0, 461, 461, 461, 0, 0, 0, 0, - 0, 0, 461, 0, 0, 461, 0, 0, 461, 461, - 0, 0, 0, 0, 0, 0, 0, 461, 461, 461, - 0, 0, 0, 0, 0, 0, 0, 461, 0, 0, - 461, 0, 0, 461, 474, 474, 0, 474, 474, 474, - 474, 474, 0, 474, 474, 474, 474, 0, 474, 474, - 0, 0, 0, 0, 474, 474, 474, 474, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, - - 474, 474, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 474, 474, 475, 475, 0, 475, - 475, 475, 475, 475, 0, 475, 475, 475, 475, 0, - 475, 475, 0, 0, 0, 0, 475, 475, 475, 475, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 475, 475, 475, 0, 0, 0, 0, 475, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 475, 475, 0, 0, 0, 475, 475, 505, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 505, 0, 505, 505, 505, 0, 0, 0, 0, - 0, 0, 505, 0, 0, 505, 0, 0, 505, 505, - 0, 0, 0, 0, 0, 0, 0, 505, 505, 505, - 0, 0, 0, 0, 0, 0, 0, 505, 0, 0, - 505, 0, 0, 505, 511, 511, 0, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 0, 511, 511, - 0, 0, 0, 0, 511, 511, 511, 511, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 511, - - 511, 511, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 511, 511, 513, 513, 0, 513, - 513, 513, 513, 513, 513, 513, 513, 513, 513, 0, - 513, 513, 0, 0, 0, 0, 513, 513, 513, 513, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 513, 513, 513, 0, 0, 0, 0, 513, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 513, 513, 0, 0, 0, 513, 513, 625, 625, - - 0, 625, 625, 625, 625, 625, 0, 625, 625, 625, - 625, 0, 625, 625, 0, 0, 0, 0, 625, 625, - 625, 625, 0, 0, 0, 0, 0, 0, 625, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 625, 625, 625, 0, 0, 0, 0, - 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 625, 625, - 631, 631, 0, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 0, 631, 631, 0, 0, 0, 0, - 631, 631, 631, 631, 0, 0, 0, 0, 0, 0, - - 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 631, 631, 631, 0, 0, - 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 631, 631, 641, 641, 0, 641, 641, 641, 641, 641, - 0, 641, 641, 641, 641, 0, 641, 641, 0, 0, - 0, 0, 641, 641, 641, 641, 0, 0, 0, 0, - 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 641, 641, - 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 641, 648, 648, 0, 648, 648, 648, - 648, 648, 648, 648, 648, 648, 648, 0, 648, 648, - 0, 0, 0, 0, 648, 648, 648, 648, 0, 0, - 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, - 648, 648, 0, 0, 0, 0, 0, 0, 648, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 648, 648, 735, 0, 0, 735, - 735, 0, 0, 735, 735, 735, 735, 735, 736, 736, - - 736, 736, 736, 0, 736, 736, 736, 736, 736, 736, - 736, 736, 736, 737, 737, 737, 737, 737, 737, 737, - 737, 737, 737, 737, 737, 737, 737, 737, 738, 738, - 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, - 738, 738, 738, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, 740, 0, - 0, 740, 740, 740, 0, 740, 740, 740, 740, 740, - 741, 741, 741, 741, 741, 0, 741, 741, 741, 741, - 741, 741, 741, 741, 741, 742, 742, 742, 742, 742, - 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, - - 743, 743, 0, 0, 0, 0, 0, 0, 0, 743, - 743, 743, 743, 743, 744, 744, 744, 745, 745, 745, - 746, 746, 746, 747, 747, 747, 747, 747, 747, 747, - 747, 747, 747, 747, 747, 747, 747, 747, 748, 748, - 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, - 748, 748, 748, 749, 749, 749, 750, 750, 750, 751, - 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, - 751, 751, 751, 751, 752, 752, 752, 752, 752, 752, - 752, 752, 752, 752, 752, 752, 752, 752, 752, 753, - 0, 0, 753, 753, 753, 0, 753, 753, 753, 753, - - 753, 754, 754, 754, 754, 754, 754, 754, 754, 754, - 754, 754, 754, 754, 754, 754, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 756, 756, 756, 756, 756, 756, 756, 756, 756, - 756, 756, 756, 756, 756, 756, 757, 757, 757, 757, - 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, - 757, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 759, 759, 0, 759, - 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, - 759, 760, 760, 0, 760, 760, 760, 760, 760, 760, - - 760, 760, 760, 760, 760, 760, 761, 761, 761, 762, - 762, 0, 762, 762, 762, 762, 762, 762, 762, 762, - 762, 762, 762, 762, 763, 763, 763, 763, 763, 763, - 763, 763, 763, 763, 763, 763, 763, 763, 763, 764, - 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, - 764, 764, 764, 764, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, 765, 766, - 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 768, 768, 768, 769, 0, 0, - 769, 0, 769, 769, 0, 769, 0, 769, 771, 771, - - 771, 772, 772, 772, 772, 772, 772, 772, 772, 772, - 772, 772, 772, 772, 772, 772, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 773, 774, 0, 0, 774, 774, 774, 0, 774, 774, - 774, 774, 774, 775, 775, 775, 775, 775, 775, 775, - 775, 775, 775, 775, 775, 775, 775, 775, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 777, 777, 0, 777, 777, 777, 777, - 777, 777, 777, 777, 777, 777, 777, 777, 778, 778, - 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, - - 778, 778, 778, 779, 779, 779, 779, 0, 779, 779, - 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, - 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, - 780, 780, 780, 781, 781, 0, 781, 781, 781, 781, - 781, 781, 781, 781, 781, 781, 781, 781, 782, 782, - 0, 782, 782, 782, 782, 782, 782, 782, 782, 782, - 782, 782, 782, 783, 0, 783, 0, 0, 0, 783, - 783, 783, 784, 784, 0, 784, 784, 784, 784, 784, - 784, 784, 784, 784, 784, 784, 784, 785, 785, 0, - 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, - - 785, 785, 786, 786, 0, 786, 786, 786, 786, 786, - 786, 786, 786, 786, 786, 786, 786, 787, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, - 787, 787, 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 788, 788, 788, 788, 789, 789, 789, - 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, - 789, 789, 790, 790, 790, 790, 790, 790, 790, 790, - 790, 790, 790, 790, 790, 790, 790, 791, 0, 0, - 0, 0, 791, 791, 0, 791, 0, 791, 792, 792, - 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, - - 792, 792, 792, 793, 793, 793, 793, 793, 793, 793, - 793, 793, 793, 793, 793, 793, 793, 793, 794, 794, - 0, 794, 794, 794, 794, 794, 794, 794, 794, 794, - 794, 794, 794, 795, 795, 0, 795, 795, 795, 795, - 795, 795, 795, 795, 795, 795, 795, 795, 796, 796, - 796, 796, 0, 796, 796, 796, 796, 796, 796, 796, - 796, 796, 796, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 798, 798, - 0, 798, 798, 798, 798, 798, 798, 798, 798, 798, - 798, 798, 798, 799, 799, 0, 799, 799, 799, 799, - - 799, 799, 799, 799, 799, 799, 799, 799, 800, 800, - 0, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 801, 801, 0, 801, 801, 801, 801, - 801, 801, 801, 801, 801, 801, 801, 801, 802, 802, - 0, 802, 802, 802, 802, 802, 802, 802, 802, 802, - 802, 802, 802, 803, 803, 0, 803, 803, 803, 803, - 803, 803, 803, 803, 803, 803, 803, 803, 804, 804, - 0, 804, 804, 804, 804, 804, 804, 804, 804, 804, - 804, 804, 804, 805, 805, 0, 805, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 806, 806, - - 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, - 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, - 807, 807, 807, 807, 807, 807, 807, 807, 808, 808, - 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, - 808, 808, 808, 809, 0, 0, 0, 0, 809, 809, - 0, 809, 810, 810, 810, 810, 810, 810, 810, 810, - 810, 810, 810, 810, 810, 810, 810, 811, 811, 811, - 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, - 811, 811, 812, 812, 0, 812, 812, 812, 812, 812, - 812, 812, 812, 812, 812, 812, 812, 813, 813, 813, - - 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 814, 0, 0, 0, 0, 814, 814, 0, - 814, 815, 815, 0, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 816, 816, 816, 816, - 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, - 816, 817, 817, 0, 817, 817, 817, 817, 817, 817, - 817, 817, 817, 817, 817, 817, 818, 818, 0, 818, - 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, - 818, 819, 819, 0, 819, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 819, 819, 820, 820, 820, 820, - - 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, - 820, 821, 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, - 822, 823, 823, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 823, 823, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 734, 734, 734, 734, 734, 734 - } ; - -static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; -static char *yy_full_match; -static int yy_lp; -static int yy_looking_for_trail_begin = 0; -static int yy_full_lp; -static int *yy_full_state; -#define YY_TRAILING_MASK 0x2000 -#define YY_TRAILING_HEAD_MASK 0x4000 -#define REJECT \ -{ \ -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ -yy_cp = yy_full_match; /* restore poss. backed-over text */ \ -yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ -yy_state_ptr = yy_full_state; /* restore orig. state */ \ -yy_current_state = *yy_state_ptr; /* restore curr. state */ \ -++yy_lp; \ -goto find_rule; \ -} -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#define INITIAL 0 -/* - * parser.l -- lex parser of algebraic chess moves for XBoard - * $Id: parser.l,v 2.1 2003/10/27 19:21:00 mann Exp $ - * - * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. - * Enhancements Copyright 1992-95 Free Software Foundation, Inc. - * - * The following terms apply to Digital Equipment Corporation's copyright - * interest in XBoard: - * ------------------------------------------------------------------------ - * All Rights Reserved - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of Digital not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING - * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL - * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR - * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * ------------------------------------------------------------------------ - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: - * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ - */ - -/* This parser handles all forms of promotion. - * The parser resolves ambiguous moves by searching and check-testing. - * It also parses comments of the form [anything] or (anything). - */ - -#include "config.h" - -#define NO_CONSTRAINT -1 -#undef YYLMAX -#define YYLMAX 4096 -#define UNPUT_BUF_SIZE YYLMAX - -#ifdef FLEX_SCANNER -/* yytext is probably a char*, but could be a char[]. yy_text is set - in YY_DECL below, because if yytext is a char*, its value is not - constant. */ -char *yy_text; -#else /*!FLEX_SCANNER*/ -/* yytext is definitely a char[], so yy_text can be set here, statically. */ -char *yy_text = (char *) yytext; -#endif - -#ifdef FLEX_SCANNER -/* This is flex */ -#undef YY_INPUT -#define YY_INPUT(buf, result, max_size) my_yy_input(buf, &result, max_size) -#undef YY_DECL -#define YY_DECL \ - int _yylex YY_PROTO((void)); \ - int yylex YY_PROTO((void)) \ - { \ - int result = _yylex(); \ - yy_text = (char *) yytext; \ - return(result); \ - } \ - int _yylex YY_PROTO((void)) -#else -/* This is lex */ -#undef input -#undef output -#undef unput -#endif - -/* The includes must be here, below the #undef input */ - -#include - -#if STDC_HEADERS -# include -# include -#else /* not STDC_HEADERS */ -# if HAVE_STRING_H -# include -# else /* not HAVE_STRING_H */ -# include -# endif /* not HAVE_STRING_H */ -#endif /* not STDC_HEADERS */ - -#if HAVE_UNISTD_H -# include -#endif - -#if defined(_amigados) -# include -# if HAVE_FCNTL_H -# include /* isatty() prototype */ -# endif /* HAVE_FCNTL_H */ -#endif /* defined(_amigados) */ - -#include "common.h" -#include "backend.h" -#include "frontend.h" -#include "parser.h" -#include "moves.h" - -extern int PosFlags P((int)); - -extern Board boards[MAX_MOVES]; -int yyboardindex; -int yyskipmoves = FALSE; -char currentMoveString[YYLMAX]; -#ifndef FLEX_SCANNER -char unputBuffer[UNPUT_BUF_SIZE]; -int unputCount = 0; -#endif - -#ifdef FLEX_SCANNER -void my_yy_input P((char *buf, int *result, int max_size)); -#else /*!FLEX_SCANNER*/ -static int input P((void)); -static void output P((int ch)); -static void unput P((int ch)); -int yylook P((void)); -int yyback P((int *, int)); -#endif -#undef yywrap -int yywrap P((void)); -extern void CopyBoard P((Board to, Board from)); - - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - } -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - yy_current_buffer->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - - - - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; - yy_current_state += YY_AT_BOL(); - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 5057 ); - -yy_find_action: - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; -find_rule: /* we branch to this label when backing up */ - for ( ; ; ) /* until we find what rule we matched */ - { - if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) - { - yy_act = yy_acclist[yy_lp]; - if ( yy_act & YY_TRAILING_HEAD_MASK || - yy_looking_for_trail_begin ) - { - if ( yy_act == yy_looking_for_trail_begin ) - { - yy_looking_for_trail_begin = 0; - yy_act &= ~YY_TRAILING_HEAD_MASK; - break; - } - } - else if ( yy_act & YY_TRAILING_MASK ) - { - yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; - yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; - } - else - { - yy_full_match = yy_cp; - yy_full_state = yy_state_ptr; - yy_full_lp = yy_lp; - break; - } - ++yy_lp; - goto find_rule; - } - --yy_cp; - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ -case 1: -YY_RULE_SETUP -{ - /* - * Fully-qualified algebraic move, possibly with promotion - * [HGM] Bigger-than-8x8 boards must rely on long algebraic formats - * where I allowed piece types A & C (also as promotions) - * files a-l and ranks 0-9 - */ - int skip1 = 0, skip2 = 0; - ChessSquare piece; - ChessMove result; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove the / */ - if (yytext[1] == '/') skip1 = 1; - - /* remove the [xX:-] */ - if ((yytext[3+skip1] == 'x') || (yytext[3+skip1] == 'X') || - (yytext[3+skip1] == '-') || (yytext[3+skip1] == ':')) skip2 = 1; - - currentMoveString[0] = yytext[1+skip1]; - currentMoveString[1] = yytext[2+skip1]; - currentMoveString[2] = yytext[3+skip1+skip2]; - currentMoveString[3] = yytext[4+skip1+skip2]; - currentMoveString[4] = NULLCHAR; - - if (yyleng-skip1-skip2 > 5) { - if (yytext[yyleng-1] == ')') { - currentMoveString[4] = ToLower(yytext[yyleng-2]); - } else { - currentMoveString[4] = ToLower(yytext[yyleng-1]); - } - currentMoveString[5] = NULLCHAR; - } - - if (appData.debugMode) { - fprintf(debugFP, "parser: %s\n", currentMoveString); - } - /* [HGM] do not allow values beyond board size */ - if(currentMoveString[1] - ONE >= BOARD_HEIGHT || - currentMoveString[0] - AAA >= BOARD_WIDTH || - currentMoveString[3] - ONE >= BOARD_HEIGHT || - currentMoveString[2] - AAA >= BOARD_WIDTH ) - return 0; - - piece = boards[yyboardindex] - [currentMoveString[1] - ONE][currentMoveString[0] - AAA]; - if (ToLower(yytext[0]) != ToLower(PieceToChar(piece))) - return (int) IllegalMove; - - result = LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - currentMoveString[1] - ONE, - currentMoveString[0] - AAA, - currentMoveString[3] - ONE, - currentMoveString[2] - AAA, - currentMoveString[4]); - - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; - currentMoveString[5] = NULLCHAR; - } - - return (int) result; -} - YY_BREAK -case 2: -YY_RULE_SETUP -{ - /* - * Simple algebraic move, possibly with promotion - * [HGM] Bigger-than-8x8 boards must rely on this format - * where I allowed piece types A & C (also as promotions) - * files a-l and ranks 0-9 - */ - int skip = 0; - ChessMove result; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove the [xX:-] */ - if ((yytext[2] == 'x') || (yytext[2] == 'X') || - (yytext[2] == '-') || (yytext[2] == ':')) skip = 1; - - currentMoveString[0] = yytext[0]; - currentMoveString[1] = yytext[1]; - currentMoveString[2] = yytext[2+skip]; - currentMoveString[3] = yytext[3+skip]; - currentMoveString[4] = NULLCHAR; - - if (yyleng-skip > 4) { - if (yytext[yyleng-1] == ')') { - currentMoveString[4] = ToLower(yytext[yyleng-2]); - } else { - currentMoveString[4] = ToLower(yytext[yyleng-1]); - } - currentMoveString[5] = NULLCHAR; - } - - /* [HGM] do not allow values beyond board size */ - if(currentMoveString[1] - ONE >= BOARD_HEIGHT || - currentMoveString[0] - AAA >= BOARD_WIDTH || - currentMoveString[3] - ONE >= BOARD_HEIGHT || - currentMoveString[2] - AAA >= BOARD_WIDTH ) - return 0; - - result = LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - currentMoveString[1] - ONE, - currentMoveString[0] - AAA, - currentMoveString[3] - ONE, - currentMoveString[2] - AAA, - currentMoveString[4]); - - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; - currentMoveString[5] = NULLCHAR; - } - - return (int) result; -} - YY_BREAK -case 3: -YY_RULE_SETUP -{ - /* - * Pawn move, possibly with promotion - */ - DisambiguateClosure cl; - int skip = 0; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove the =() */ - if (yytext[2] == '=') skip++; - if (yytext[2+skip] == '(') skip++; - - cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; - cl.rfIn = -1; - cl.ffIn = yytext[0] - AAA; - cl.rtIn = yytext[1] - ONE; - cl.ftIn = yytext[0] - AAA; - cl.promoCharIn = yytext[2+skip]; - - /* [HGM] do not allow values beyond board size */ - if(cl.rtIn >= BOARD_HEIGHT || - cl.ffIn >= BOARD_WIDTH || - cl.ftIn >= BOARD_WIDTH ) - return 0; - - - Disambiguate(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, &cl); - - currentMoveString[0] = cl.ff + AAA; - currentMoveString[1] = cl.rf + ONE; - currentMoveString[2] = cl.ft + AAA; - currentMoveString[3] = cl.rt + ONE; - currentMoveString[4] = cl.promoChar; - currentMoveString[5] = NULLCHAR; - - return (int) cl.kind; -} - YY_BREAK -case 4: -YY_RULE_SETUP -{ - /* - * Pawn capture, possibly with promotion, possibly ambiguous - */ - DisambiguateClosure cl; - int skip1 = 0, skip2 = 0; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove trailing ep or e.p. (nonstandard PGN) */ - if (yytext[yyleng-1] == 'p') { - yyleng -= 2; - yytext[yyleng] = NULLCHAR; - } else if (yytext[yyleng-1] == '.') { - yyleng -= 4; - yytext[yyleng] = NULLCHAR; - } - - /* remove the [xX:-] and =() */ - if ((yytext[1] == 'x') || (yytext[1] == 'X') - || (yytext[1] == ':') || (yytext[1] == '-')) skip1 = 1; - if (yytext[2+skip1] == '=') skip2++; - if (yytext[2+skip1+skip2] == '(') skip2++; - - cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; - cl.rfIn = -1; - cl.ffIn = yytext[0] - AAA; - cl.rtIn = -1; - cl.ftIn = yytext[1+skip1] - AAA; - cl.promoCharIn = yytext[2+skip1+skip2]; - - /* [HGM] do not allow values beyond board size */ - if(cl.ffIn >= BOARD_WIDTH || - cl.ftIn >= BOARD_WIDTH ) - return 0; - - Disambiguate(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, &cl); - - currentMoveString[0] = cl.ff + AAA; - currentMoveString[1] = cl.rf + ONE; - currentMoveString[2] = cl.ft + AAA; - currentMoveString[3] = cl.rt + ONE; - currentMoveString[4] = cl.promoChar; - currentMoveString[5] = NULLCHAR; - - return (int) cl.kind; -} - YY_BREAK -case 5: -YY_RULE_SETUP -{ - /* - * unambiguously abbreviated Pawn capture, possibly with promotion - */ - int skip = 0; - ChessMove result; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove trailing ep or e.p. (nonstandard PGN) */ - if (yytext[yyleng-1] == 'p') { - yyleng -= 2; - yytext[yyleng] = NULLCHAR; - } else if (yytext[yyleng-1] == '.') { - yyleng -= 4; - yytext[yyleng] = NULLCHAR; - } - - /* remove the [xX:-] */ - if ((yytext[1] == 'x') || (yytext[1] == 'X') - || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1; - - currentMoveString[0] = yytext[0]; - currentMoveString[2] = yytext[1+skip]; - currentMoveString[3] = yytext[2+skip]; - - /* [HGM] do not allow values beyond board size */ - if(currentMoveString[0] - AAA >= BOARD_WIDTH || - currentMoveString[3] - ONE >= BOARD_HEIGHT || - currentMoveString[2] - AAA >= BOARD_WIDTH ) - return 0; - - if (gameInfo.variant == VariantXiangqi && /* [HGM] In Xiangqi rank stays same */ - currentMoveString[0] != currentMoveString[2] ) { - if (yytext[2+skip] == ONE) return (int) ImpossibleMove; - currentMoveString[1] = yytext[2+skip]; - } else - if (WhiteOnMove(yyboardindex)) { - if (yytext[2+skip] == ONE) return (int) ImpossibleMove; - currentMoveString[1] = yytext[2+skip] - 1; - } else { - currentMoveString[1] = currentMoveString[3] + 1; - if (currentMoveString[3] == ONE+BOARD_HEIGHT-1) return (int) ImpossibleMove; - } - if (yyleng-skip > 3) { - if (yytext[yyleng-1] == ')') - currentMoveString[4] = ToLower(yytext[yyleng-2]); - else - currentMoveString[4] = ToLower(yytext[yyleng-1]); - currentMoveString[5] = NULLCHAR; - } else { - currentMoveString[4] = NULLCHAR; - } - - result = LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - currentMoveString[1] - ONE, - currentMoveString[0] - AAA, - currentMoveString[3] - ONE, - currentMoveString[2] - AAA, - currentMoveString[4]); - - if (currentMoveString[4] == NULLCHAR && - (result == WhitePromotionQueen || result == BlackPromotionQueen)) { - currentMoveString[4] = 'q'; - currentMoveString[5] = NULLCHAR; - } - - if (result != IllegalMove) return (int) result; - - /* Special case: improperly written en passant capture */ - if (WhiteOnMove(yyboardindex)) { - if (currentMoveString[3] == '5') { - currentMoveString[1] = '5'; - currentMoveString[3] = '6'; - } else { - return (int) IllegalMove; - } - } else { - if (currentMoveString[3] == '4') { - currentMoveString[1] = '4'; - currentMoveString[3] = '3'; - } else { - return (int) IllegalMove; - } - } - - result = LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - currentMoveString[1] - ONE, - currentMoveString[0] - AAA, - currentMoveString[3] - ONE, - currentMoveString[2] - AAA, - currentMoveString[4]); - - if (result == WhiteCapturesEnPassant || result == BlackCapturesEnPassant) - return (int) result; - else - return (int) IllegalMove; -} - YY_BREAK -case 6: -YY_RULE_SETUP -{ - /* - * piece move, possibly ambiguous - */ - DisambiguateClosure cl; - int skip = 0; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove the [xX:-] */ - if ((yytext[1] == 'x') || (yytext[1] == 'X') - || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1; - - if (WhiteOnMove(yyboardindex)) { - cl.pieceIn = CharToPiece(ToUpper(yytext[0])); - } else { - cl.pieceIn = CharToPiece(ToLower(yytext[0])); - } - cl.rfIn = -1; - cl.ffIn = -1; - cl.rtIn = yytext[2+skip] - ONE; - cl.ftIn = yytext[1+skip] - AAA; - cl.promoCharIn = NULLCHAR; - - /* [HGM] but do not allow values beyond board size */ - if(cl.rtIn >= BOARD_HEIGHT || - cl.ftIn >= BOARD_WIDTH ) - return 0; - - Disambiguate(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, &cl); - - currentMoveString[0] = cl.ff + AAA; - currentMoveString[1] = cl.rf + ONE; - currentMoveString[2] = cl.ft + AAA; - currentMoveString[3] = cl.rt + ONE; - currentMoveString[4] = cl.promoChar; - currentMoveString[5] = NULLCHAR; - - return (int) cl.kind; -} - YY_BREAK -case 7: -YY_RULE_SETUP -{ - /* - * piece move with rank or file disambiguator - */ - DisambiguateClosure cl; - int skip = 0; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* remove the [xX:-] */ - if ((yytext[2] == 'x') || (yytext[2] == 'X') - || (yytext[2] == ':') || (yytext[2] == '-')) skip = 1; - - if (WhiteOnMove(yyboardindex)) { - cl.pieceIn = CharToPiece(ToUpper(yytext[0])); - } else { - cl.pieceIn = CharToPiece(ToLower(yytext[0])); - } - if (isalpha(yytext[1])) { - cl.rfIn = -1; - cl.ffIn = yytext[1] - AAA; - } else { - cl.rfIn = yytext[1] - ONE; - cl.ffIn = -1; - } - cl.rtIn = yytext[3+skip] - ONE; - cl.ftIn = yytext[2+skip] - AAA; - cl.promoCharIn = NULLCHAR; - - /* [HGM] do not allow values beyond board size */ - if(cl.rtIn >= BOARD_HEIGHT || - cl.rfIn >= BOARD_HEIGHT || - cl.ffIn >= BOARD_WIDTH || - cl.ftIn >= BOARD_WIDTH ) - return 0; - - Disambiguate(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, &cl); - - currentMoveString[0] = cl.ff + AAA; - currentMoveString[1] = cl.rf + ONE; - currentMoveString[2] = cl.ft + AAA; - currentMoveString[3] = cl.rt + ONE; - currentMoveString[4] = cl.promoChar; - currentMoveString[5] = NULLCHAR; - - return (int) cl.kind; -} - YY_BREAK -case 8: -YY_RULE_SETUP -{ - int rf, ff, rt, ft; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - /* [HGM] all squares referenced to board edges in stead of absolute */ - if (WhiteOnMove(yyboardindex)) { - if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { - /* ICS wild castling */ - rf = 0; - ff = (BOARD_WIDTH-1)>>1; - rt = 0; - ft = BOARD_RGHT-3; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } else { - rf = 0; - ff = BOARD_WIDTH>>1; - rt = 0; - ft = BOARD_LEFT+2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } - } else{ - if (boards[yyboardindex][BOARD_HEIGHT-1][3] == BlackKing) { - /* ICS wild castling */ - rf = BOARD_HEIGHT-1; - ff = (BOARD_WIDTH-1)>>1; - rt = BOARD_HEIGHT-1; - ft = BOARD_RGHT-3; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } else { - rf = BOARD_HEIGHT-1; - ff = BOARD_WIDTH>>1; - rt = BOARD_HEIGHT-1; - ft = BOARD_LEFT+2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } - } - return (int) LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - rf, ff, rt, ft, NULLCHAR); -} - YY_BREAK -case 9: -YY_RULE_SETUP -{ - int rf, ff, rt, ft; - - if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ - - if (WhiteOnMove(yyboardindex)) { - if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { - /* ICS wild castling */ - rf = 0; - ff = (BOARD_WIDTH-1)>>1; - rt = 0; - ft = BOARD_LEFT+1; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } else { - rf = 0; - ff = BOARD_WIDTH>>1; - rt = 0; - ft = BOARD_RGHT-2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } - } else { - if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { - /* ICS wild castling */ - rf = BOARD_HEIGHT-1; - ff = (BOARD_WIDTH-1)>>1; - rt = BOARD_HEIGHT-1; - ft = BOARD_LEFT+1; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } else { - rf = BOARD_HEIGHT-1; - ff = BOARD_WIDTH>>1; - rt = BOARD_HEIGHT-1; - ft = BOARD_RGHT-2; - sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); - } - } - return (int) LegalityTest(boards[yyboardindex], - PosFlags(yyboardindex), EP_UNKNOWN, - initialRights, /* [HGM] assume all castlings allowed */ - rf, ff, rt, ft, NULLCHAR); -} - YY_BREAK -case 10: -YY_RULE_SETUP -{ - /* Bughouse piece drop. No legality checking for now. */ - currentMoveString[1] = '@'; - currentMoveString[2] = yytext[2]; - currentMoveString[3] = yytext[3]; - currentMoveString[4] = NULLCHAR; - - if (appData.debugMode) { - fprintf(debugFP, "Drop: %s\n", currentMoveString); - } - /* [HGM] do not allow values beyond board size */ - if(currentMoveString[3] - ONE >= BOARD_HEIGHT || - currentMoveString[2] - AAA >= BOARD_WIDTH ) - return 0; - - if (WhiteOnMove(yyboardindex)) { - currentMoveString[0] = ToUpper(yytext[0]); - return (int) WhiteDrop; - } else { - currentMoveString[0] = ToLower(yytext[0]); - return (int) BlackDrop; - } -} - YY_BREAK -case 11: -YY_RULE_SETUP -{ - if (WhiteOnMove(yyboardindex)) - return (int) BlackWins; - else - return (int) WhiteWins; -} - YY_BREAK -case 12: -YY_RULE_SETUP -{ - return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); -} - YY_BREAK -case 13: -YY_RULE_SETUP -{ - return (int) GameUnfinished; -} - YY_BREAK -case 14: -YY_RULE_SETUP -{ - return (int) GameIsDrawn; -} - YY_BREAK -case 15: -YY_RULE_SETUP -{ - return (int) GameIsDrawn; -} - YY_BREAK -case 16: -YY_RULE_SETUP -{ - if (WhiteOnMove(yyboardindex)) - return (int) BlackWins; - else - return (int) WhiteWins; -} - YY_BREAK -case 17: -YY_RULE_SETUP -{ - if (WhiteOnMove(yyboardindex)) - return (int) BlackWins; - else - return (int) WhiteWins; -} - YY_BREAK -case 18: -YY_RULE_SETUP -{ - return (int) GameIsDrawn; -} - YY_BREAK -case 19: -YY_RULE_SETUP -{ - return (int) GameIsDrawn; -} - YY_BREAK -case 20: -YY_RULE_SETUP -{ - return (int) (ToUpper(yytext[0]) == 'W' ? WhiteWins : BlackWins); -} - YY_BREAK -case 21: -YY_RULE_SETUP -{ - return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); -} - YY_BREAK -case 22: -YY_RULE_SETUP -{ - return (int) WhiteWins; -} - YY_BREAK -case 23: -YY_RULE_SETUP -{ - return (int) BlackWins; -} - YY_BREAK -case 24: -YY_RULE_SETUP -{ - return (int) GameIsDrawn; -} - YY_BREAK -case 25: -YY_RULE_SETUP -{ - return (int) GameUnfinished; -} - YY_BREAK -case 26: -YY_RULE_SETUP -{ - /* move numbers */ - if ((yyleng == 1) && (yytext[0] == '1')) - return (int) MoveNumberOne; -} - YY_BREAK -case 27: -YY_RULE_SETUP -{ - /* elapsed time indication, e.g. (0:12) or {10:21.071} */ - return (int) ElapsedTime; -} - YY_BREAK -case 28: -YY_RULE_SETUP -{ - /* position diagram enclosed in [-- --] */ - return (int) PositionDiagram; -} - YY_BREAK -case 29: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -{ - /* position diagram enclosed in {-- --} */ - return (int) PositionDiagram; -} - YY_BREAK -case 30: -YY_RULE_SETUP -{ - return (int) PGNTag; -} - YY_BREAK -case 31: -YY_RULE_SETUP -{ - return (int) GNUChessGame; -} - YY_BREAK -case 32: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -{ - return (int) XBoardGame; -} - YY_BREAK -case 33: -YY_RULE_SETUP -{ /* numeric annotation glyph */ - return (int) NAG; -} - YY_BREAK -case 34: -YY_RULE_SETUP -{ /* anything in {} */ - return (int) Comment; -} - YY_BREAK -case 35: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -{ /* ; to end of line */ - return (int) Comment; -} - YY_BREAK -case 36: -YY_RULE_SETUP -{ /* anything in [] */ - return (int) Comment; -} - YY_BREAK -case 37: -YY_RULE_SETUP -{ /* nested () */ - return (int) Comment; -} - YY_BREAK -case 38: -YY_RULE_SETUP -{ /* >=2 chars in () */ - return (int) Comment; -} - YY_BREAK -case 39: -YY_RULE_SETUP -{ - /* Skip mail headers */ -} - YY_BREAK -case 40: -YY_RULE_SETUP -{ - /* Skip random words */ -} - YY_BREAK -case 41: -YY_RULE_SETUP -{ - /* Skip everything else */ -} - YY_BREAK -case 42: -YY_RULE_SETUP -ECHO; - YY_BREAK - case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_current_buffer->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - yy_current_state += YY_AT_BOL(); - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - - register YY_CHAR yy_c = 1; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 735 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 734); - if ( ! yy_is_jam ) - *yy_state_ptr++ = yy_current_state; - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_current_buffer->yy_n_chars = - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - return EOF; - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - yy_current_buffer->yy_at_bol = (c == '\n'); - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef _WIN32 -#include -#else -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif - - - -static char *StringToLex; - -#ifndef FLEX_SCANNER -static FILE *lexFP; - -static int input() -{ - int ret; - - if (StringToLex != NULL) { - ret = *StringToLex; - if (ret == NULLCHAR) - ret = EOF; - else - StringToLex++; - } else if (unputCount > 0) { - ret = unputBuffer[--unputCount]; - } else { - ret = fgetc(lexFP); - } - - if (ret == EOF) - return 0; - else - return ret; -} - -/* - * Return offset of next pattern within current file - */ -int yyoffset() -{ - int offset = ftell(lexFP) - unputCount; - - if (offset < 0) { - offset = 0; - } - return(offset); -} - -static void output(ch) - int ch; -{ - fprintf(stderr, "PARSER BUG: unmatched character '%c' (0%o)\n", - ch, ch); -} - -static void unput(ch) - int ch; -{ - if (ch == 0) return; - if (StringToLex != NULL) { - StringToLex--; - } else { - if (unputCount >= UNPUT_BUF_SIZE) - fprintf(stderr, "PARSER BUG: unput buffer overflow '%c' (0%o)\n", - ch, ch); - unputBuffer[unputCount++] = ch; - } -} - -/* Get ready to lex from a new file. Kludge below sticks - an artificial newline at the front of the file, which the - above grammar ignores, but which makes ^ at start of pattern - match at the real start of the file. -*/ -void yynewfile(f) - FILE *f; -{ - lexFP = f; - StringToLex = NULL; - unputCount = 0; - unput('\n'); /* kludge */ -} - -/* Get ready to lex from a string. ^ at start of pattern WON'T - match at the start of the string! -*/ -void yynewstr(s) - char *s; -{ - lexFP = NULL; - StringToLex = s; - unputCount = 0; -} -#endif /*!FLEX_SCANNER*/ - -#ifdef FLEX_SCANNER -void my_yy_input(buf, result, max_size) - char *buf; - int *result; - int max_size; -{ - int count; - - if (StringToLex != NULL) { - count = 0; - while (*StringToLex != NULLCHAR) { - *buf++ = *StringToLex++; - count++; - } - *result = count; - return; - } else { - count = fread(buf, 1, max_size, yyin); - if (count == 0) { - *result = YY_NULL; - } else { - *result = count; - } - return; - } -} - -static YY_BUFFER_STATE my_file_buffer = NULL; - -/* - Return offset of next pattern in the current file. -*/ -int yyoffset() -{ - int pos = yy_c_buf_p - yy_current_buffer->yy_ch_buf; - - return(ftell(yy_current_buffer->yy_input_file) - - yy_n_chars + pos); -} - - -void yynewstr(s) - char *s; -{ - if (my_file_buffer != NULL) - yy_delete_buffer(my_file_buffer); - StringToLex = s; - my_file_buffer = yy_create_buffer(stdin, YY_BUF_SIZE); - yy_switch_to_buffer(my_file_buffer); -} - -void yynewfile(f) - FILE *f; -{ - if (my_file_buffer != NULL) - yy_delete_buffer(my_file_buffer); - StringToLex = NULL; - my_file_buffer = yy_create_buffer(f, YY_BUF_SIZE); - yy_switch_to_buffer(my_file_buffer); -} -#endif /*FLEX_SCANNER*/ - -int yywrap() -{ - return TRUE; -} - -/* Parse a move from the given string s */ -/* ^ at start of pattern WON'T work here unless using flex */ -ChessMove yylexstr(boardIndex, s) - int boardIndex; - char *s; -{ - ChessMove ret; - char *oldStringToLex; -#ifdef FLEX_SCANNER - YY_BUFFER_STATE buffer, oldBuffer; -#endif - - yyboardindex = boardIndex; - oldStringToLex = StringToLex; - StringToLex = s; -#ifdef FLEX_SCANNER - buffer = yy_create_buffer(stdin, YY_BUF_SIZE); - oldBuffer = YY_CURRENT_BUFFER; - yy_switch_to_buffer(buffer); -#endif /*FLEX_SCANNER*/ - - ret = (ChessMove) yylex(); - -#ifdef FLEX_SCANNER - if (oldBuffer != NULL) - yy_switch_to_buffer(oldBuffer); - yy_delete_buffer(buffer); -#endif /*FLEX_SCANNER*/ - StringToLex = oldStringToLex; - - return ret; -} +%a 10000 +%o 10000 +%e 2000 +%k 2500 +%p 7000 +%n 1000 +%{ +/* + * parser.l -- lex parser of algebraic chess moves for XBoard + * $Id: parser.l,v 2.1 2003/10/27 19:21:00 mann Exp $ + * + * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. + * Enhancements Copyright 1992-95 Free Software Foundation, Inc. + * + * The following terms apply to Digital Equipment Corporation's copyright + * interest in XBoard: + * ------------------------------------------------------------------------ + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * ------------------------------------------------------------------------ + * + * The following terms apply to the enhanced version of XBoard distributed + * by the Free Software Foundation: + * ------------------------------------------------------------------------ + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * ------------------------------------------------------------------------ + */ + +/* This parser handles all forms of promotion. + * The parser resolves ambiguous moves by searching and check-testing. + * It also parses comments of the form [anything] or (anything). + * + * [HGM] Parser extensively modified for bigger boards, Shogi-like syntax, + * and unknow pieces. All pieces are now mandatory upper case, but can be + * any letter A-Z. Files must be lower case (as before), but can run upto 'l'. + * Ranks can be 0-9. The parser returns 0 for off-board files and ranks. + * For an unknown piece (as mover or promotion piece) it returns + * IllegalMove, like it does when the piece doesn't match. + * Promotions can now also be appended Shogi-style, a bare '=' or '+', + * and this is then returned as promotion character. The piece indicator + * can be prefixed by a '+' to indicate it is a promoted piece. + */ + +#include "config.h" + +#define NO_CONSTRAINT -1 +#undef YYLMAX +#define YYLMAX 4096 +#define UNPUT_BUF_SIZE YYLMAX + +#ifdef FLEX_SCANNER +/* yytext is probably a char*, but could be a char[]. yy_text is set + in YY_DECL below, because if yytext is a char*, its value is not + constant. */ +char *yy_text; +#else /*!FLEX_SCANNER*/ +/* yytext is definitely a char[], so yy_text can be set here, statically. */ +char *yy_text = (char *) yytext; +#endif + +#ifdef FLEX_SCANNER +/* This is flex */ +#undef YY_INPUT +#define YY_INPUT(buf, result, max_size) my_yy_input(buf, &result, max_size) +#undef YY_DECL +#define YY_DECL \ + int _yylex YY_PROTO((void)); \ + int yylex YY_PROTO((void)) \ + { \ + int result = _yylex(); \ + yy_text = (char *) yytext; \ + return(result); \ + } \ + int _yylex YY_PROTO((void)) +#else +/* This is lex */ +#undef input +#undef output +#undef unput +#endif + +/* The includes must be here, below the #undef input */ + +#include + +#if STDC_HEADERS +# include +# include +#else /* not STDC_HEADERS */ +# if HAVE_STRING_H +# include +# else /* not HAVE_STRING_H */ +# include +# endif /* not HAVE_STRING_H */ +#endif /* not STDC_HEADERS */ + +#if HAVE_UNISTD_H +# include +#endif + +#if defined(_amigados) +# include +# if HAVE_FCNTL_H +# include /* isatty() prototype */ +# endif /* HAVE_FCNTL_H */ +#endif /* defined(_amigados) */ + +#include "common.h" +#include "backend.h" +#include "frontend.h" +#include "parser.h" +#include "moves.h" + +extern int PosFlags P((int)); + +extern Board boards[MAX_MOVES]; +int yyboardindex; +int yyskipmoves = FALSE; +char currentMoveString[YYLMAX]; +#ifndef FLEX_SCANNER +char unputBuffer[UNPUT_BUF_SIZE]; +int unputCount = 0; +#endif + +#ifdef FLEX_SCANNER +void my_yy_input P((char *buf, int *result, int max_size)); +#else /*!FLEX_SCANNER*/ +static int input P((void)); +static void output P((int ch)); +static void unput P((int ch)); +int yylook P((void)); +int yyback P((int *, int)); +#endif +#undef yywrap +int yywrap P((void)); +extern void CopyBoard P((Board to, Board from)); + +%} +%% + +"+"?[A-Z][/]?[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { + /* + * Fully-qualified algebraic move, possibly with promotion + */ + int skip1 = 0, skip2 = 0, skip3 = 0, promoted = 0; + ChessSquare piece; + ChessMove result; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + if (yytext[0] == '+') skip1 = skip3 = promoted = 1; /* [HGM] Shogi promoted */ + + /* remove the / */ + if (yytext[1+skip1] == '/') skip1++; + + /* remove the [xX:-] */ + if ((yytext[3+skip1] == 'x') || (yytext[3+skip1] == 'X') || + (yytext[3+skip1] == '-') || (yytext[3+skip1] == ':')) skip2 = 1; + + currentMoveString[0] = yytext[1+skip1]; + currentMoveString[1] = yytext[2+skip1]; + currentMoveString[2] = yytext[3+skip1+skip2]; + currentMoveString[3] = yytext[4+skip1+skip2]; + currentMoveString[4] = NULLCHAR; + + if (yyleng-skip1-skip2 > 5) { char c; + if (yytext[yyleng-1] == ')') { + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); + } else { + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); + } + currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; /* [HGM] promotion to invalid piece */ + } + + if (appData.debugMode) { + fprintf(debugFP, "parser: %s\n", currentMoveString); + } + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[1] - ONE >= BOARD_HEIGHT || + currentMoveString[1] - ONE < 0 || + currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; + + piece = boards[yyboardindex] + [currentMoveString[1] - ONE][currentMoveString[0] - AAA]; + if(promoted) piece = (ChessSquare) (DEMOTED piece); + if (ToLower(yytext[skip3]) != ToLower(PieceToChar(piece))) + return (int) IllegalMove; + + result = LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, + currentMoveString[4]); + + if (currentMoveString[4] == NULLCHAR && + (result == WhitePromotionKnight || result == BlackPromotionKnight || + result == WhitePromotionQueen || result == BlackPromotionQueen)) { + currentMoveString[4] = PieceToChar(BlackQueen); + currentMoveString[5] = NULLCHAR; + } + + return (int) result; +} + +[a-l][0-9][xX:-]?[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { + /* + * Simple algebraic move, possibly with promotion + */ + int skip = 0; + ChessMove result; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + /* remove the [xX:-] */ + if ((yytext[2] == 'x') || (yytext[2] == 'X') || + (yytext[2] == '-') || (yytext[2] == ':')) skip = 1; + + currentMoveString[0] = yytext[0]; + currentMoveString[1] = yytext[1]; + currentMoveString[2] = yytext[2+skip]; + currentMoveString[3] = yytext[3+skip]; + currentMoveString[4] = NULLCHAR; + + if (yyleng-skip > 4) { char c; + if (yytext[yyleng-1] == ')') { + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); + } else { + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); + } + currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; + } + + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[1] - ONE >= BOARD_HEIGHT || + currentMoveString[1] - ONE < 0 || + currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; + + result = LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, + currentMoveString[4]); + + if (currentMoveString[4] == NULLCHAR && + (result == WhitePromotionKnight || result == BlackPromotionKnight || + result == WhitePromotionQueen || result == BlackPromotionQueen)) { + currentMoveString[4] = PieceToChar(BlackQueen); + currentMoveString[5] = NULLCHAR; + } + + return (int) result; +} + +[a-l][0-9]((=?\(?[A-Z]\)?)|=)? { + /* + * Pawn move, possibly with promotion + */ + DisambiguateClosure cl; + int skip = 0; char c; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + /* remove the =() */ + if (yytext[2] == '=' && yytext[3] != NULLCHAR) skip++; + if (yytext[2+skip] == '(') skip++; + + cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; + cl.rfIn = -1; + cl.ffIn = yytext[0] - AAA; + cl.rtIn = yytext[1] - ONE; + cl.ftIn = yytext[0] - AAA; + c = cl.promoCharIn = yytext[2+skip]; + + /* [HGM] do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ffIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) + return IllegalMove; + + + Disambiguate(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, &cl); + + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; + currentMoveString[4] = cl.promoChar; + currentMoveString[5] = NULLCHAR; + + return (int) cl.kind; +} + + +(ab|bc|cd|de|ef|fg|gh|hi|ij|jk|kl|lk|kj|ji|ih|hg|gf|fe|ed|dc|cb|ba|aa|bb|cc|dd|ee|ff|gg|hh|ii|jj|kk|ll|([a-l][xX:-][a-l]))((=?\(?[A-Z]\)?)|ep|"e.p."|=)? { + /* + * Pawn capture, possibly with promotion, possibly ambiguous + */ + DisambiguateClosure cl; + int skip1 = 0, skip2 = 0; char c; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + /* remove trailing ep or e.p. (nonstandard PGN) */ + if (yytext[yyleng-1] == 'p') { + yyleng -= 2; + yytext[yyleng] = NULLCHAR; + } else if (yytext[yyleng-1] == '.') { + yyleng -= 4; + yytext[yyleng] = NULLCHAR; + } + + /* remove the [xX:-] and =() */ + if ((yytext[1] == 'x') || (yytext[1] == 'X') + || (yytext[1] == ':') || (yytext[1] == '-')) skip1 = 1; + if (yytext[2+skip1] == '=' && yytext[3+skip1] != NULLCHAR) skip2++; + if (yytext[2+skip1+skip2] == '(') skip2++; + + cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn; + cl.rfIn = -1; + cl.ffIn = yytext[0] - AAA; + cl.rtIn = -1; + cl.ftIn = yytext[1+skip1] - AAA; + c = cl.promoCharIn = yytext[2+skip1+skip2]; + + /* [HGM] do not allow values beyond board size */ + if(cl.ffIn >= BOARD_RGHT || + cl.ffIn < BOARD_LEFT || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + if(c != '=' && c != '+' && c != NULLCHAR && CharToPiece(c) == EmptySquare) + return IllegalMove; + + Disambiguate(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, &cl); + + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; + currentMoveString[4] = cl.promoChar; + currentMoveString[5] = NULLCHAR; + + return (int) cl.kind; +} + +[a-l][xX:]?[a-l][0-9]((=?\(?[A-Z]\)?)|ep|"e.p."|=)? { + /* + * unambiguously abbreviated Pawn capture, possibly with promotion + */ + int skip = 0; + ChessMove result; char c; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + /* remove trailing ep or e.p. (nonstandard PGN) */ + if (yytext[yyleng-1] == 'p') { + yyleng -= 2; + yytext[yyleng] = NULLCHAR; + } else if (yytext[yyleng-1] == '.') { + yyleng -= 4; + yytext[yyleng] = NULLCHAR; + } + + /* remove the [xX:-] */ + if ((yytext[1] == 'x') || (yytext[1] == 'X') + || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1; + + currentMoveString[0] = yytext[0]; + currentMoveString[2] = yytext[1+skip]; + currentMoveString[3] = yytext[2+skip]; + + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[0] - AAA >= BOARD_RGHT || + currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[3] - ONE < 0 || + currentMoveString[2] - AAA >= BOARD_RGHT || + currentMoveString[0] - AAA < BOARD_LEFT || + currentMoveString[2] - AAA < BOARD_LEFT ) + return 0; + + if (gameInfo.variant == VariantXiangqi && /* [HGM] In Xiangqi rank stays same */ + currentMoveString[0] != currentMoveString[2] ) { + if (yytext[2+skip] == ONE) return (int) ImpossibleMove; + currentMoveString[1] = yytext[2+skip]; + } else + if (WhiteOnMove(yyboardindex)) { + if (yytext[2+skip] == ONE) return (int) ImpossibleMove; + currentMoveString[1] = yytext[2+skip] - 1; + } else { + currentMoveString[1] = currentMoveString[3] + 1; + if (currentMoveString[3] == ONE+BOARD_HEIGHT-1) return (int) ImpossibleMove; + } + if (yyleng-skip > 3) { + if (yytext[yyleng-1] == ')') + c = currentMoveString[4] = ToLower(yytext[yyleng-2]); + else + c = currentMoveString[4] = ToLower(yytext[yyleng-1]); + currentMoveString[5] = NULLCHAR; + if(c != '=' && c != '+' && CharToPiece(c) == EmptySquare) + return IllegalMove; + } else { + currentMoveString[4] = NULLCHAR; + } + + result = LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, + currentMoveString[4]); + + if (currentMoveString[4] == NULLCHAR && + (result == WhitePromotionQueen || result == BlackPromotionQueen || + result == WhitePromotionKnight || result == BlackPromotionKnight)) { + currentMoveString[4] = PieceToChar(BlackQueen); + currentMoveString[5] = NULLCHAR; + } + + if (result != IllegalMove) return (int) result; + + /* Special case: improperly written en passant capture */ + if (WhiteOnMove(yyboardindex)) { + if (currentMoveString[3] == '5') { + currentMoveString[1] = '5'; + currentMoveString[3] = '6'; + } else { + return (int) IllegalMove; + } + } else { + if (currentMoveString[3] == '4') { + currentMoveString[1] = '4'; + currentMoveString[3] = '3'; + } else { + return (int) IllegalMove; + } + } + + result = LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + currentMoveString[1] - ONE, + currentMoveString[0] - AAA, + currentMoveString[3] - ONE, + currentMoveString[2] - AAA, + currentMoveString[4]); + + if (result == WhiteCapturesEnPassant || result == BlackCapturesEnPassant) + return (int) result; + else + return (int) IllegalMove; +} + +"+"?[A-Z][xX:-]?[a-l][0-9]=? { + /* + * piece move, possibly ambiguous + */ + DisambiguateClosure cl; + int skip = 0, skip2 = 0, promoted = 0; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + if(yytext[0] == '+') promoted = skip = skip2 = 1; + + /* remove the [xX:-] */ + if ((yytext[1+skip] == 'x') || (yytext[1+skip] == 'X') + || (yytext[1+skip] == ':') || (yytext[1+skip] == '-')) skip++; + + if (WhiteOnMove(yyboardindex)) { + cl.pieceIn = CharToPiece(ToUpper(yytext[skip2])); + } else { + cl.pieceIn = CharToPiece(ToLower(yytext[skip2])); + } + if(promoted) cl.pieceIn = (ChessSquare) (PROMOTED cl.pieceIn); + + cl.rfIn = -1; + cl.ffIn = -1; + cl.rtIn = yytext[2+skip] - ONE; + cl.ftIn = yytext[1+skip] - AAA; + cl.promoCharIn = NULLCHAR; + + if(yyleng-skip > 3) /* [HGM] can have Shogi-style promotion */ + cl.promoCharIn = yytext[yyleng-1]; + + /* [HGM] but do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + Disambiguate(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, &cl); + + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; + currentMoveString[4] = cl.promoChar; + currentMoveString[5] = NULLCHAR; + + return (int) cl.kind; +} + +"+"?[A-Z][a-l0-9][xX:-]?[a-l][0-9]=? { + /* + * piece move with rank or file disambiguator + */ + DisambiguateClosure cl; + int skip = 0, skip2 = 0; int promoted=0; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + if(yytext[0]=='+') promoted = skip = skip2 = 1; + + /* remove the [xX:-] */ + if ((yytext[2+skip] == 'x') || (yytext[2+skip] == 'X') + || (yytext[2+skip] == ':') || (yytext[2+skip] == '-')) skip++; + + if (WhiteOnMove(yyboardindex)) { + cl.pieceIn = CharToPiece(ToUpper(yytext[skip2])); + } else { + cl.pieceIn = CharToPiece(ToLower(yytext[skip2])); + } + if(promoted) cl.pieceIn = (ChessSquare) (PROMOTED cl.pieceIn); + + if (isalpha(yytext[1+skip2])) { + cl.rfIn = -1; + cl.ffIn = yytext[1+skip2] - AAA; + + if(cl.ffIn >= BOARD_RGHT || + cl.ffIn < BOARD_LEFT ) return 0; + } else { + cl.rfIn = yytext[1+skip2] - ONE; + cl.ffIn = -1; + if(cl.rfIn >= BOARD_HEIGHT || + cl.rfIn < 0) return 0; + } + cl.rtIn = yytext[3+skip] - ONE; + cl.ftIn = yytext[2+skip] - AAA; + cl.promoCharIn = NULLCHAR; + + if(yyleng-skip > 4) /* [HGM] can have Shogi-style promotion */ + cl.promoCharIn = yytext[yyleng-1]; + + /* [HGM] do not allow values beyond board size */ + if(cl.rtIn >= BOARD_HEIGHT || + cl.rtIn < 0 || + cl.ftIn >= BOARD_RGHT || + cl.ftIn < BOARD_LEFT ) + return 0; + + Disambiguate(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, &cl); + + currentMoveString[0] = cl.ff + AAA; + currentMoveString[1] = cl.rf + ONE; + currentMoveString[2] = cl.ft + AAA; + currentMoveString[3] = cl.rt + ONE; + currentMoveString[4] = cl.promoChar; + currentMoveString[5] = NULLCHAR; + + return (int) cl.kind; +} + +000|0-0-0|ooo|OOO|o-o-o|O-O-O { + int rf, ff, rt, ft; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + /* [HGM] all squares referenced to board edges in stead of absolute */ + if (WhiteOnMove(yyboardindex)) { + if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { + /* ICS wild castling */ + rf = 0; + ff = (BOARD_WIDTH-1)>>1; + rt = 0; + ft = BOARD_RGHT-3; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } else { + rf = 0; + ff = BOARD_WIDTH>>1; + rt = 0; + ft = BOARD_LEFT+2; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } + } else{ + if (boards[yyboardindex][BOARD_HEIGHT-1][3] == BlackKing) { + /* ICS wild castling */ + rf = BOARD_HEIGHT-1; + ff = (BOARD_WIDTH-1)>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_RGHT-3; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } else { + rf = BOARD_HEIGHT-1; + ff = BOARD_WIDTH>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_LEFT+2; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } + } + return (int) LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + rf, ff, rt, ft, NULLCHAR); +} + +00|0-0|oo|OO|o-o|O-O { + int rf, ff, rt, ft; + + if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ + + if (WhiteOnMove(yyboardindex)) { + if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) { + /* ICS wild castling */ + rf = 0; + ff = (BOARD_WIDTH-1)>>1; + rt = 0; + ft = BOARD_LEFT+1; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } else { + rf = 0; + ff = BOARD_WIDTH>>1; + rt = 0; + ft = BOARD_RGHT-2; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } + } else { + if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) { + /* ICS wild castling */ + rf = BOARD_HEIGHT-1; + ff = (BOARD_WIDTH-1)>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_LEFT+1; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } else { + rf = BOARD_HEIGHT-1; + ff = BOARD_WIDTH>>1; + rt = BOARD_HEIGHT-1; + ft = BOARD_RGHT-2; + sprintf(currentMoveString, "%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE); + } + } + return (int) LegalityTest(boards[yyboardindex], + PosFlags(yyboardindex), EP_UNKNOWN, + initialRights, /* [HGM] assume all castlings allowed */ + rf, ff, rt, ft, NULLCHAR); +} + +[A-Z][@*][a-l][0-9] { + /* Bughouse piece drop. No legality checking for now. */ + currentMoveString[1] = '@'; + currentMoveString[2] = yytext[2]; + currentMoveString[3] = yytext[3]; + currentMoveString[4] = NULLCHAR; + + if (appData.debugMode) { + fprintf(debugFP, "Drop: %s\n", currentMoveString); + } + /* [HGM] do not allow values beyond board size */ + if(currentMoveString[3] - ONE >= BOARD_HEIGHT || + currentMoveString[2] - AAA >= BOARD_WIDTH ) + return 0; + + if (WhiteOnMove(yyboardindex)) { + currentMoveString[0] = ToUpper(yytext[0]); + return (int) WhiteDrop; + } else { + currentMoveString[0] = ToLower(yytext[0]); + return (int) BlackDrop; + } +} + +[Rr]esign(s|ed)? { + if (WhiteOnMove(yyboardindex)) + return (int) BlackWins; + else + return (int) WhiteWins; +} + +(([Ww](hite)?)|([Bb](lack)?))" "(([Rr]esign)|([Ff]orfeit))(s|ed)? { + return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); +} + +(([Ww](hite)?)|([Bb](lack)?))" "[Dd]isconnect(s|ed) { + return (int) GameUnfinished; +} + +[Ss]talemate { + return (int) GameIsDrawn; +} + +"+-+" { + return (int) GameIsDrawn; +} + +([Cc]heck)?[Mm]ate { + if (WhiteOnMove(yyboardindex)) + return (int) BlackWins; + else + return (int) WhiteWins; +} + +"++" { + if (WhiteOnMove(yyboardindex)) + return (int) BlackWins; + else + return (int) WhiteWins; +} + +[Dd]raw(n)?(" "by)?(" "[Rr]epetition)|(" "[Aa]gree(d|ment)) { + return (int) GameIsDrawn; +} + +[Dd]raw(n)?(" (".*")")? { + return (int) GameIsDrawn; +} + +(([Ww](hite)?)|([Bb](lack)?))" "([Mm]ate(s|ed)?)|([Ww][io]n(s)?.*) { + return (int) (ToUpper(yytext[0]) == 'W' ? WhiteWins : BlackWins); +} + +(([Ww](hite)?)|([Bb](lack)?))" "([Mm]ate(s|ed)?)|([Ll]os[tes]+.*) { + return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins); +} + +("{"[^\}\n]*"} ")?(1-0|"1 - 0"|"1/0"|"1 / 0"|"1:0"|"1 : 0")(" (".*")"|" {".*"}")? { + return (int) WhiteWins; +} + +("{"[^\}\n]*"} ")?(0-1|"0 - 1"|"0/1"|"0 / 1"|"0:1"|"0 : 1")(" (".*")"|" {".*"}")? { + return (int) BlackWins; +} + +("{"[^\}\n]*"} ")?("1/2"|"1 / 2")(" "?[-:]" "?("1/2"|"1 / 2"))?(" (".*")"|" {".*"}")? { + return (int) GameIsDrawn; +} + +("{"[^\}\n]*"} ")?"*"(" (".*")"|" {".*"}")? { + return (int) GameUnfinished; +} + +[1-9][0-9]*/"."?[ \t\n]*[a-lNnPpRrBQqKACFEWDGHOo] { + /* move numbers */ + if ((yyleng == 1) && (yytext[0] == '1')) + return (int) MoveNumberOne; +} + +\([0-9]+:[0-9][0-9](\.[0-9]+)?\)|\{[0-9]+:[0-9][0-9](\.[0-9]+)?\} { + /* elapsed time indication, e.g. (0:12) or {10:21.071} */ + return (int) ElapsedTime; +} + +"[--"[^\]]*"--]" { + /* position diagram enclosed in [-- --] */ + return (int) PositionDiagram; +} + +^"{--------------"\n[^\}]*\n"--------------}"$ { + /* position diagram enclosed in {-- --} */ + return (int) PositionDiagram; +} + +\[[ \t\n]*[A-Za-z0-9][A-Za-z0-9_+#=-]*[ \t\n]*\"[^"]*\"[ \t\n]*\] { + return (int) PGNTag; +} + +[Gg](nu|NU)" "?[Cc](hess|HESS).*[Gg](ame|AME) { + return (int) GNUChessGame; +} + +^[#;%]" "[^ ]*(" game file"|" position file").*$ { + return (int) XBoardGame; +} + +\$[0-9]+ { /* numeric annotation glyph */ + return (int) NAG; +} + +\{[^\}]*\} { /* anything in {} */ + return (int) Comment; +} + +;.*$ { /* ; to end of line */ + return (int) Comment; +} + +\[[^\]]*\] { /* anything in [] */ + return (int) Comment; +} + +\([^()]*(\([^()]*\)[^()]*)+[^()]*\) { /* nested () */ + return (int) Comment; +} + +\([^)][^)]+\) { /* >=2 chars in () */ + return (int) Comment; +} + +^[-a-zA-Z0-9]+:" ".*(\n[ \t]+.*)* { + /* Skip mail headers */ +} + +[a-zA-Z0-9'-]+ { + /* Skip random words */ +} + +.|\n { + /* Skip everything else */ +} + +%% + + +static char *StringToLex; + +#ifndef FLEX_SCANNER +static FILE *lexFP; + +static int input() +{ + int ret; + + if (StringToLex != NULL) { + ret = *StringToLex; + if (ret == NULLCHAR) + ret = EOF; + else + StringToLex++; + } else if (unputCount > 0) { + ret = unputBuffer[--unputCount]; + } else { + ret = fgetc(lexFP); + } + + if (ret == EOF) + return 0; + else + return ret; +} + +/* + * Return offset of next pattern within current file + */ +int yyoffset() +{ + int offset = ftell(lexFP) - unputCount; + + if (offset < 0) { + offset = 0; + } + return(offset); +} + +static void output(ch) + int ch; +{ + fprintf(stderr, "PARSER BUG: unmatched character '%c' (0%o)\n", + ch, ch); +} + +static void unput(ch) + int ch; +{ + if (ch == 0) return; + if (StringToLex != NULL) { + StringToLex--; + } else { + if (unputCount >= UNPUT_BUF_SIZE) + fprintf(stderr, "PARSER BUG: unput buffer overflow '%c' (0%o)\n", + ch, ch); + unputBuffer[unputCount++] = ch; + } +} + +/* Get ready to lex from a new file. Kludge below sticks + an artificial newline at the front of the file, which the + above grammar ignores, but which makes ^ at start of pattern + match at the real start of the file. +*/ +void yynewfile(f) + FILE *f; +{ + lexFP = f; + StringToLex = NULL; + unputCount = 0; + unput('\n'); /* kludge */ +} + +/* Get ready to lex from a string. ^ at start of pattern WON'T + match at the start of the string! +*/ +void yynewstr(s) + char *s; +{ + lexFP = NULL; + StringToLex = s; + unputCount = 0; +} +#endif /*!FLEX_SCANNER*/ + +#ifdef FLEX_SCANNER +void my_yy_input(buf, result, max_size) + char *buf; + int *result; + int max_size; +{ + int count; + + if (StringToLex != NULL) { + count = 0; + while (*StringToLex != NULLCHAR) { + *buf++ = *StringToLex++; + count++; + } + *result = count; + return; + } else { + count = fread(buf, 1, max_size, yyin); + if (count == 0) { + *result = YY_NULL; + } else { + *result = count; + } + return; + } +} + +static YY_BUFFER_STATE my_file_buffer = NULL; + +/* + Return offset of next pattern in the current file. +*/ +int yyoffset() +{ + int pos = yy_c_buf_p - yy_current_buffer->yy_ch_buf; + + return(ftell(yy_current_buffer->yy_input_file) - + yy_n_chars + pos); +} + + +void yynewstr(s) + char *s; +{ + if (my_file_buffer != NULL) + yy_delete_buffer(my_file_buffer); + StringToLex = s; + my_file_buffer = yy_create_buffer(stdin, YY_BUF_SIZE); + yy_switch_to_buffer(my_file_buffer); +} + +void yynewfile(f) + FILE *f; +{ + if (my_file_buffer != NULL) + yy_delete_buffer(my_file_buffer); + StringToLex = NULL; + my_file_buffer = yy_create_buffer(f, YY_BUF_SIZE); + yy_switch_to_buffer(my_file_buffer); +} +#endif /*FLEX_SCANNER*/ + +int yywrap() +{ + return TRUE; +} + +/* Parse a move from the given string s */ +/* ^ at start of pattern WON'T work here unless using flex */ +ChessMove yylexstr(boardIndex, s) + int boardIndex; + char *s; +{ + ChessMove ret; + char *oldStringToLex; +#ifdef FLEX_SCANNER + YY_BUFFER_STATE buffer, oldBuffer; +#endif + + yyboardindex = boardIndex; + oldStringToLex = StringToLex; + StringToLex = s; +#ifdef FLEX_SCANNER + buffer = yy_create_buffer(stdin, YY_BUF_SIZE); + oldBuffer = YY_CURRENT_BUFFER; + yy_switch_to_buffer(buffer); +#endif /*FLEX_SCANNER*/ + + ret = (ChessMove) yylex(); + +#ifdef FLEX_SCANNER + if (oldBuffer != NULL) + yy_switch_to_buffer(oldBuffer); + yy_delete_buffer(buffer); +#endif /*FLEX_SCANNER*/ + StringToLex = oldStringToLex; + + return ret; +} diff --git a/readme_HGM.txt b/readme_HGM.txt index 63d27d4..5769521 100644 --- a/readme_HGM.txt +++ b/readme_HGM.txt @@ -1,3 +1,97 @@ +Winboard_F.4.3.7 release notes + +This Winboard supports the following new options (shown here with their default values): + +/variant=normal +This (already existing) option has been expanded with several new variants, involving non-conventional pieces and deviating board sizes. The board size is automatically adapted to the selected variant, unless explicitly overruled (see below). The new variants are (with default board size, files x ranks, in parentheses): + +variant name Game board description +knightmate Knightmate (8x8) Variant where the King moves as a Knight, and vice versa +capablanca Capablanca Chess (10x8) Variant featuring Archbishop and Chancellor as new pieces +gothic Gothic Chess (10x8) Same as Capablanca, with a more interesting opening position +courier Courier Chess (12x8) a Medieval form that combines elements of Shatranj and modern Chess +shogi Shogi (9x9) Japanese Chess +xiangqi Xiangqi (9x10) Chinese Chess +fairy Fairy Chess (8x8) Variant were you can use all pieces of other variants together + +The variant can be set from the newly added "File -> New Variant..." sub-menu. +Extra board files are indicated by the letters i, j, k, l, ... For boards with more than 9 ranks, the counting starts at zero! Non-FIDE pieces will be referred to in FENs and PGN by letters that depend on the variant, and might collide with piece designators in other variants. E.g. in Xiangqi 'C' is a Cannon, in Capablanca Chess it is a Chancellor. Pieces that do not belong in a variant cannot be addressed in FEN and PGN either as long as that variant is selected, unless the letter assignment is overruled by the /pieceToCharTable option. The variant is not saved in the winboard.ini file; on start-up we always get variant "normal" unless we use the command-line opton, or have added the option to the winboard.ini file manually (in which case it will disappear when this file is overwritten). +WinBoard_F knows the movement of all pieces occurring in Capablanca Chess (of which FIDE Chess is a subset), Shatranj, Courier, Xiangqi and 9x9 Shogi, so that these games can be played with legality testing enabled. + +/pieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" +Each piece that WinBoard knows (in its legality test) has a letter associated with it, by which it will be referred to in FEN or PGN. The default assignment can be overruled with this option. The value has to be a string of even length, with at least 12 characters. The first half of the string designates the white pieces, the second half the black. +The last letter for each color will be assigned to the King. (This is the piece that moves as an orthodox King; note that Nightmate and Xiangqi have a different royal piece.) All letters before it will be assigned to the other pieces in the order: + +P Pawn (move often depends on variant) +N Knight (move subtly different in Xiangqi (where it is written as H) or Shogi) +B Bishop +R Rook +Q Queen (Lance L in Shogi) +F Ferz/General (Silver General S in Shogi) +W Wazir/GrandVizer (Gold General G in Shogi, in Xiangqi it is royal and denoted by K) +E Alfil/Elephant (Moves subtly different in Xiangqi vs Shatranj/Courier) +M Commoner/Man +O Cannon/Pao +U Unicorn (representation of Royal Knight in Knightmate, used as promoted Pawn in Shogi) +H Nightrider (Promoted Knight in Shogi and CrazyHouse) +A Archbishop/Cardinal (Promoted Bishop in Shogi and CrazyHouse) +C Chancellor/Marshall (Promoted Rook in Shogi and CrazyHouse) +G Grasshopper (Promoted Queen in Crazyhouse, promoted Lance in Shogi) +S (Promoted Silver in Shogi) +K King + +Pieces that are not mentioned (because the argument has less than 34 characters) will remain disabled. Mentioned pieces can be disabled by assigning them a '.' (period). They are then not recognized in FEN or PGN input. It is not advisable to disable a piece that is present in the opening position of the selected variant, though. +Promoted pieces that need to be distinguished from original pieces of the same type (because of demotion on capture and transfer to the holdings) will be indicated by the letter for the unpromoted piece with a '+' in front of it (Shogi), or by the letter of the promoted piece with a '~' after it (Crazyhouse, Bughouse, in general everything with holdings that is not Shogi). +All the new pieces have a native biytmap representation in the board sizes 'bulky' and 'middling'. For all window sizes that do not support such fairy bitmaps, promoted NBRQ are represented as a 2-sizes-smaller normal piece symbol, so that Crazyhouse can be played at any size. People disliking the fairy representations might even prefer that. +There is an enhanced 'Edit Position' menu popup (right-clicking on the squares after selecting this mode in the main menu), featuring some common non-FIDE pieces, and 'promote' and 'demote' options to make those not directly in the menu. The promotion popup shows ArchBishop and Chancellor in Capablanca and Gothic, (or in fact in any game where this piece is not disabled), and leaves only the options YES / NO in Shogi. In Xiangqi there are no promotions. + +/fontPieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" +This option is similar to /pieceToCharTable, but sets the font character that is used to display the piece on the screen (when font-based rendering is in use), rather than in the FEN or PGN. The default setting should work with the WinboardF font, which uses the 'intuitive' mapping of font characters to symbols. +Note that UHACGS are also used to represent the promoted versions of PNBRQF, in games like Crazyhouse and Shogi, where the promotion has to be undone on capture. + +/boardWidth=-1 /boardHeight=-1 +Set a number of files and ranks of the playing board to a value that will override the defaults for the variant that is selected. A value of -1 means the variant default board size will be used for the corresponding parameter (and is itself the default value of these options). These parameters can be set in the "Files -> New Variant..." sub-menu, where they are reset to the default -1 is you OK the chosen variant without typing something to overrule it. These parameters are saved in the winboard.ini file. (But unless you saved while a variant with board-size override was selected, they will always be saved as -1.) +A variant with a non-standard board size will be communicated to the engine(s) with the board size prefixed to the variant name, e.g. "variant 12x8_capablanca". In protocol 2 the engine must first enable this feature by sending "boardsizeFxR" amongst the accepted variants, where F is the maximum number of files, and R the maximum number of ranks, as decimal numbers. + +/holdingsSize=-1 +Set the size of the holdings for dropable pieces to a value that will override the default for the variant that is selected. A value of -1 means the variant default holdings size will be used for that parameter (and is itself the default value of this options). This parameter can be set in the Files -> New Variant... sub-menu, where it is reset to the default -1 is you OK the chosen variant without typing something to overrule it. This parameters is saved in the winboard.ini file. +To disable holdings, set their size to 0. They will then not be displayed. For non-zero holding size N, the holdings are displayed left and right of the board, and piece drops can be effected by dragging pieces from the holdings to the drop square. In bughouse, the holdings will be filled by the ICS. In all other variants, captured pieces will go into the holdings (after reversing their color). Only the first N pieces of the /pieceToCharTable argument will go into the holdings. All other pieces will be converted to Pawns. (In Shogi, however they will be demoted in the regular way before determining if they fit.) Pieces that are disabled (per default and per /pieceToCharTable option) might not be counted when determining what are the first N pieces. +Non-standard holdingsize will be communicated to the engine by prefixing it (together with the board size, even if this is standard) to the variant name, e.g. "variant 7x7+5_shogi". In protocol 2 the engine should enable this feature by sending "holdingsH" amongst the variant names, where H is the maximum acceptable holdings size as a decimal number. + +/alphaRank=FALSE +When this parameter is true, a-h are converted to 1-9, and vice versa, in all move output and input (to PGN files or SAN move display as well as in communication with the engine). This might be useful for Shogi, where conventionally one uses letters to designate ranks, and digits to designate files. Engines that want to use this option must make sure pieces are never represented by lower case! This option can be set from the Files -> New Variant... menu, where it defaults to FALSE unless you explicitly set it. It is not saved in the winboard.ini file. +Note that the PGN format in Shogi also leaves out the trailing '+' as check indicator: In Shogi such a trailing '+' means promotion, while a trailing '=' means defer promotion. Prefix '+' signs are used on moves with promoted pieces, disambiguation is done western SAN style. + +/allWhite=FALSE +Causes the outline of the 'white' pieces to be superimposed onto the 'black' piece symbols as well (as a black outline) when native bitmaps are used (as opposed to font-based rendering). This is useful if we choose a very light color to represent the 'black' pieces. It might be particularly useful in Shogi, where the conventional representation of the 'black' pieces is as upside-down white pieces, so that both colors would be white. This option is saved in the winboard.ini file, and can be set in the "Options -> Board..." sub-menu. + +/flipBlack=FALSE +This option is reserved for future use. It will cause upside-down display of the 'black' native piece bitmaps, as would be needed for Shogi. For now it can be set from the "Options -> Board..." sub-menu, and it is saved in the winboard.ini file, but it is ignored. + +/detectMate=TRUE +/testClaim=TRUE +/materialDraws=TRUE +/trivialDraws=FALSE +/ruleMoves=51 +/repeatsToDraw=6 +These are all options that only affect engine-engine play, and can be set from the "Options -> Engine..." sub-menu. They are all related to adjudication of games by the GUI. Legality checking must be switched on for them to work. +If /detectMate is TRUE, the GUI recognizes checkmate and stalemate (but not in games with holdings!), and ends the game accordingly before the engines can claim. This is convenient for play with engines that fail to claim, and just exit. +With /testClaim set, all result and illegal-move claims by engines that claim more than their own loss are scrutinized for validity, and false claims result in forfeit of the game. Useful with buggy engines. +The option /materialDraws=TRUE causes games with insufficient mating material to be adjudicated immediately as draws, in case the engines would not claim them. +The option /trivialDraws adjudicates KNNK, KBKB, KNKN, KBKN, KRKR and KQKQ to draws after 3 moves (to allow for a quick tactical win. Note that in KQKQ this might not be sound, but that problem would disappear once bitbase probing is added). +The /ruleMoves determine after how many reversible moves the game is adjudicated as a draw. Setting this to 0 turns this option off. Draw claims by the engine are still accepted (by /testClaim) after 50 reversible moves, even if /ruleMoves species a larger number. Note that it is perfectly legal according to FIDE rules to play on after 50 reversible moves, but in tournaments having two engines that want to play on forever is a nuisance in endings like KBNKR, where one of the engines thinks it is ahead and can avoids repeats virtually forever. +The option /repeatsToDraw makes the GUI adjudicate a game as draw after the same position has occurred the specified number of times. If it is set to a value > 3, engines can still claim the draw after 3-fold repeat. +All these options are saved in the winboard.ini file. + +/matchPause=10000 +Determines the number of milliseconds that is paused between two games of a match. Saved in the Winboard.ini. + +Clocks +There is an "Options -> flip Clocks" command, that swaps the position of white and black clocks (convenient in over-the-board matches, where the screen is next to the board, and you want your own time to be displayed on your side of the screen). The clocks can be adjusted in "edit game" mode: right-clicking them adds one minute, left-clicking subtracts one minute. (Also for OTB matches, to keep them synchronized with the official match clock.) The flag-fell condition is now indicated as (!) behind the time. + +Other improvements +Castling rights and e.p. rights are now fully maintained, and considered in legality testing. They are imported from and written to FEN, as is the 50-move counter. +------------------------------------------------------------------- These are the release notes of Winboard_F 4.3.2, which is released under the GPL. This version was derived from Allessandro Scotti's Winboard_x 4.2.7 source files. diff --git a/winboard/resource.h b/winboard/resource.h index 67f2932..8c4ba3e 100644 --- a/winboard/resource.h +++ b/winboard/resource.h @@ -131,6 +131,22 @@ #define DP_Bishop 618 #define DP_Rook 619 #define DP_Queen 620 + +#define EP_WhiteCardinal 630 +#define EP_WhiteMarshall 631 +#define EP_WhiteAlfil 632 +#define EP_WhiteCannon 633 +#define EP_WhiteFerz 634 +#define EP_WhiteWazir 635 +#define EP_BlackCardinal 640 +#define EP_BlackMarshall 641 +#define EP_BlackAlfil 642 +#define EP_BlackCannon 643 +#define EP_BlackFerz 644 +#define EP_BlackWazir 645 +#define EP_Promote 650 +#define EP_Demote 651 + #define DLG_LoadOptions 700 #define DLG_SaveOptions 800 #define OPT_PGN 802 @@ -445,6 +461,9 @@ #define IDC_TrivialDraws 1603 #define IDC_RuleMoves 1604 #define IDC_DrawRepeats 1605 +#define IDM_FlipClock 1700 +#define OPT_AllWhite 1701 +#define OPT_UpsideDown 1702 #define IDC_STATIC -1 // Next default values for new objects diff --git a/winboard/winboard.c b/winboard/winboard.c index 21460fd..7369520 100644 --- a/winboard/winboard.c +++ b/winboard/winboard.c @@ -92,6 +92,7 @@ void InitEngineUCI( const char * iniDir, ChessProgramState * cps ); void mysrandom(unsigned int seed); extern int whiteFlag, blackFlag; +Boolean flipClock = FALSE; void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber); @@ -137,7 +138,7 @@ char installDir[MSG_SIZ]; BoardSize boardSize; BOOLEAN chessProgram; static int boardX, boardY, consoleX, consoleY, consoleW, consoleH; -static int squareSize, lineGap; +static int squareSize, lineGap, minorSize; static int winWidth, winHeight; static RECT messageRect, whiteRect, blackRect; static char messageText[MESSAGE_TEXT_MAX]; @@ -423,7 +424,7 @@ VOID EngineOutputPopDown(); BOOL EngineOutputIsUp(); VOID EngineOutputUpdate( FrontEndProgramStats * stats ); -VOID GothicPopUp(char *title); +VOID GothicPopUp(char *title, char up); /* * Setting "frozen" should disable all user input other than deleting * the window. We do this while engines are initializing themselves. @@ -694,13 +695,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine) if( gameInfo.variant != VariantFischeRandom ) { EnableMenuItem( GetMenu(hwndMain), IDM_NewGameFRC, MF_GRAYED ); } -#ifdef FAIRY -#ifdef GOTHIC - /* [HGM] Gothic licensing requirement */ - if(gameInfo.variant == VariantGothic) - GothicPopUp(GOTHIC); -#endif // GOTHIC -#endif // FAIRY + if (hwndConsole) { #if AOT_CONSOLE SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, @@ -1171,8 +1166,11 @@ ArgDescriptor argDescriptors[] = { { "boardWidth", ArgInt, (LPVOID) &appData.NrFiles, TRUE }, { "boardHeight", ArgInt, (LPVOID) &appData.NrRanks, TRUE }, { "holdingsSize", ArgInt, (LPVOID) &appData.holdingsSize, TRUE }, - { "matchPause", ArgInt, (LPVOID) &appData.matchPause, FALSE }, - { "alphaRank", ArgBoolean, (LPVOID) &appData.alphaRank, TRUE }, + { "matchPause", ArgInt, (LPVOID) &appData.matchPause, TRUE }, + { "pieceToCharTable", ArgString, (LPVOID) &appData.pieceToCharTable, FALSE }, + { "flipBlack", ArgBoolean, (LPVOID) &appData.allWhite, TRUE }, + { "allWhite", ArgBoolean, (LPVOID) &appData.allWhite, TRUE }, + { "alphaRank", ArgBoolean, (LPVOID) &appData.alphaRank, FALSE }, { "testClaims", ArgBoolean, (LPVOID) &appData.testClaims, TRUE }, { "checkMates", ArgBoolean, (LPVOID) &appData.checkMates, TRUE }, { "materialDraws", ArgBoolean, (LPVOID) &appData.materialDraws, TRUE }, @@ -1896,6 +1894,8 @@ InitAppData(LPSTR lpCmdLine) appData.drawRepeats = 6; appData.matchPause = 10000; appData.alphaRank = FALSE; + appData.allWhite = FALSE; + appData.upsideDown = FALSE; #ifdef ZIPPY appData.zippyTalk = ZIPPY_TALK; @@ -2300,36 +2300,32 @@ enum { PM_WB = (int) WhiteBishop, PM_WR = (int) WhiteRook, PM_WQ = (int) WhiteQueen, -#ifdef FAIRY PM_WF = (int) WhiteFerz, PM_WW = (int) WhiteWazir, PM_WE = (int) WhiteAlfil, + PM_WM = (int) WhiteMan, + PM_WO = (int) WhiteCannon, + PM_WU = (int) WhiteUnicorn, PM_WH = (int) WhiteNightrider, PM_WA = (int) WhiteCardinal, PM_WC = (int) WhiteMarshall, PM_WG = (int) WhiteGrasshopper, - PM_WO = (int) WhiteCannon, - PM_WM = (int) WhiteMan, - PM_WU = (int) WhiteUnicorn, -#endif PM_WK = (int) WhiteKing, PM_BP = (int) BlackPawn, PM_BN = (int) BlackKnight, PM_BB = (int) BlackBishop, PM_BR = (int) BlackRook, PM_BQ = (int) BlackQueen, -#ifdef FAIRY PM_BF = (int) BlackFerz, PM_BW = (int) BlackWazir, PM_BE = (int) BlackAlfil, + PM_BM = (int) BlackMan, + PM_BO = (int) BlackCannon, + PM_BU = (int) BlackUnicorn, PM_BH = (int) BlackNightrider, PM_BA = (int) BlackCardinal, PM_BC = (int) BlackMarshall, PM_BG = (int) BlackGrasshopper, - PM_BO = (int) BlackCannon, - PM_BM = (int) BlackMan, - PM_BU = (int) BlackUnicorn, -#endif PM_BK = (int) BlackKing }; @@ -2339,36 +2335,13 @@ static HBITMAP hPieceFace[(int) EmptySquare]; static int fontBitmapSquareSize = 0; static char pieceToFontChar[(int) EmptySquare] = { 'p', 'n', 'b', 'r', 'q', -#ifdef FAIRY 'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k', -#endif 'k', 'o', 'm', 'v', 't', 'w', -#ifdef FAIRY 'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l', -#endif 'l' }; -static BOOL SetPieceToFontCharTable( const char * map ) -{ - BOOL result = FALSE; int NrPieces; - - if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare - && NrPieces >= 12 && !(NrPieces&1)) { - int i; /* [HGM] Accept even length from 12 to 32 */ - - for( i=0; i<(int) EmptySquare; i++ ) pieceToFontChar[i] = 0; - for( i=0; i= 0 && appData.overrideLineGap <= 5 ) { lineGap = appData.overrideLineGap; @@ -3085,7 +3057,12 @@ InitDrawingSizes(BoardSize boardSize, int flags) } } - if (boardSize == oldBoardSize) return; +#ifdef GOTHIC + /* [HGM] Gothic licensing requirement */ + GothicPopUp( GOTHIC, gameInfo.variant == VariantGothic ); +#endif + +/* if (boardSize == oldBoardSize) return; [HGM] variant might have changed */ oldBoardSize = boardSize; oldTinyLayout = tinyLayout; @@ -3103,21 +3080,26 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "s"); pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "s"); pieceBitmap[0][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "s"); - pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s"); pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "s"); pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "o"); pieceBitmap[1][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "o"); pieceBitmap[1][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "o"); pieceBitmap[1][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "o"); - pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o"); pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "o"); pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "w"); pieceBitmap[2][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "w"); pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "w"); pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "w"); - pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "w"); -#ifdef FAIRY + if( !strcmp(appData.variant, "shogi") && (squareSize==72 || squareSize==49)) { + pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s"); + pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o"); + pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "w"); + } else { + pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s"); + pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o"); + pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); + } if(squareSize==72 || squareSize==49) { /* experiment with some home-made bitmaps */ pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s"); pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o"); @@ -3125,43 +3107,46 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s"); pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o"); pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w"); - if(!strcmp(appData.variant, "shogi")) { /* promoted Gold represemtations */ - pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "wp", squareSize, "s"); - pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "wp", squareSize, "o"); - pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s"); + pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o"); + pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w"); + pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s"); + pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o"); + pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w"); + pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s"); + pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o"); + pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w"); + pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s"); + pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o"); + pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w"); + if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */ + pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "s"); + pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "wp", squareSize, "o"); + pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "w", squareSize, "w"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wl", squareSize, "s"); - pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "wl", squareSize, "o"); - pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "w", squareSize, "w"); - pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "ws", squareSize, "s"); - pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "ws", squareSize, "o"); + pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "s"); + pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "o"); + pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "w", squareSize, "w"); + pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "s"); + pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "o"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w"); } else { - pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s"); - pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o"); - pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w"); + pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s"); + pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o"); + pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w"); - pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s"); - pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o"); - pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w"); - pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s"); - pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o"); - pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w"); + pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "s"); + pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "o"); + pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "l", squareSize, "w"); } - pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s"); - pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o"); - pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w"); - pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s"); - pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o"); - pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w"); - if(strcmp(appData.variant, "crazyhouse") && strcmp(appData.variant, "shogi")) { + if(gameInfo.variant != VariantCrazyhouse && gameInfo.variant != VariantShogi) { pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s"); pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o"); pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w"); @@ -3170,17 +3155,22 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "o"); pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "dk", squareSize, "w"); } - if(!strcmp(appData.variant, "xiangqi") || !strcmp(appData.variant, "shogi")) { - for(i=0; i<2; i++) - if (pieceBitmap[i][WhiteQueen] != NULL) - DeleteObject(pieceBitmap[i][WhiteQueen]); - pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "s"); - pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "o"); - pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "o", squareSize, "w"); - } + } else { /* other size, no special bitmaps available. Use smaller symbols */ + if((int)boardSize < 2) minorSize = sizeInfo[0].squareSize; + else minorSize = sizeInfo[(int)boardSize - 2].squareSize; + pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "s"); + pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "o"); + pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "w"); + pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "s"); + pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "o"); + pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "w"); + pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "s"); + pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "o"); + pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "r", minorSize, "w"); + pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "s"); + pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "o"); + pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "w"); } -#endif - } HBITMAP @@ -3368,9 +3358,19 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, sqcolor ? SRCCOPY : NOTSRCCOPY); } else { - if (color) { + if(minorSize && + (piece >= (int)WhiteNightrider && piece <= WhiteGrasshopper || + piece >= (int)BlackNightrider && piece <= BlackGrasshopper) ) { + /* [HGM] no bitmap available for promoted pieces in Crazyhouse */ + /* Bitmaps of smaller size are substituted, but we have to align them */ + x += (squareSize - minorSize)>>1; + y += squareSize - minorSize - 2; + } + if (color || appData.allWhite ) { oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, WHITE_PIECE)); - oldBrush = SelectObject(hdc, whitePieceBrush); + if( color ) + oldBrush = SelectObject(hdc, whitePieceBrush); + else oldBrush = SelectObject(hdc, blackPieceBrush); BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, 0x00B8074A); #if 0 /* Use black piece color for outline of white pieces */ @@ -4351,18 +4351,22 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (y == -2) { /* Downclick vertically off board; check if on clock */ if (PtInRect((LPRECT) &whiteRect, pt)) { - if (gameMode == EditPosition) { + if (gameMode == EditPosition) { SetWhiteToPlayEvent(); } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) { CallFlagEvent(); - } + } else if (gameMode == EditGame) { + AdjustClock(flipClock, -1); + } } else if (PtInRect((LPRECT) &blackRect, pt)) { if (gameMode == EditPosition) { SetBlackToPlayEvent(); } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) { CallFlagEvent(); + } else if (gameMode == EditGame) { + AdjustClock(!flipClock, -1); } } if (!appData.highlightLastMove) { @@ -4378,6 +4382,8 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) || x == BOARD_LEFT-1 || x == BOARD_RGHT || x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize || x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize + /* EditPosition, empty square, or different color piece; + click-click move is possible */ ) { break; } else if (fromX == x && fromY == y) { @@ -4390,37 +4396,29 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ) { /* Downclick on different square. */ /* [HGM] if on holdings file, should count as new first click ! */ - - ChessSquare pdown, pup; - pdown = boards[currentMove][fromY][fromX]; - pup = boards[currentMove][y][x]; - if (gameMode == EditPosition || /* [HGM] max piece > King! */ - !((WhitePawn <= pdown && pdown < BlackPawn && - WhitePawn <= pup && pup < BlackPawn) || - (BlackPawn <= pdown && pdown < EmptySquare && - BlackPawn <= pup && pup < EmptySquare))) { - /* EditPosition, empty square, or different color piece; - click-click move is possible */ + { /* [HGM] now always do UserMoveTest(), and check colors there */ toX = x; toY = y; + /* [HGM] UserMoveEvent requires two calls now, + to make sure move is legal before showing promotion popup */ moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR); if(moveType != ImpossibleMove) { - if (IsPromotion(fromX, fromY, toX, toY)) { - /* [HGM] UserMoveEvent requires two calls now, - to make sure move is legal before showing promotion popup */ - if (appData.alwaysPromoteToQueen) { + /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */ + if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight || + (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) && + appData.alwaysPromoteToQueen) { FinishMove(moveType, fromX, fromY, toX, toY, 'q'); if (!appData.highlightLastMove) { ClearHighlights(); DrawPosition(forceFullRepaint || FALSE, NULL); } - } else { + } else + if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) { SetHighlights(fromX, fromY, toX, toY); DrawPosition(forceFullRepaint || FALSE, NULL); /* [HGM] Popup calls FinishMove now. If promotion to Q is legal, all are legal! */ PromotionPopup(hwnd); - } } else { /* not a promotion */ if (appData.animate || appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); @@ -4489,13 +4487,16 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) appData.animate = appData.animate && !appData.animateDragging; moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR); if(moveType != ImpossibleMove) { - if (IsPromotion(fromX, fromY, toX, toY)) { - if (appData.alwaysPromoteToQueen) - FinishMove(moveType, fromX, fromY, toX, toY, 'q'); - else { - DrawPosition(forceFullRepaint || FALSE, NULL); - PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */ - } + /* [HGM] use move type to determine if move is promotion. + Knight is Shogi kludge for mandatory promotion, Queen means choice */ + if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight || + (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) && + appData.alwaysPromoteToQueen) + FinishMove(moveType, fromX, fromY, toX, toY, 'q'); + else + if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) { + DrawPosition(forceFullRepaint || FALSE, NULL); + PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */ } else FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR); } if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY); @@ -4549,6 +4550,14 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (appData.highlightDragging) { ClearHighlights(); } + if(y == -2) { + /* [HGM] right mouse button in clock area edit-game mode ups clock */ + if (PtInRect((LPRECT) &whiteRect, pt)) { + if (gameMode == EditGame) AdjustClock(flipClock, 1); + } else if (PtInRect((LPRECT) &blackRect, pt)) { + if (gameMode == EditGame) AdjustClock(!flipClock, 1); + } + } DrawPosition(TRUE, NULL); switch (gameMode) { @@ -4577,7 +4586,10 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /* Just have one menu, on the right button. Windows users don't think to try the middle one, and sometimes other software steals it, or it doesn't really exist. */ - MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1); + if(gameInfo.variant != VariantShogi) + MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1); + else + MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1); #endif } break; @@ -4678,17 +4690,22 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) (!appData.testLegality || gameInfo.variant == VariantSuicide || gameInfo.variant == VariantGiveaway) ? SW_SHOW : SW_HIDE); -#ifdef FAIRY - /* [HGM] Only allow C & A promotions in Capablanca Chess */ + /* [HGM] Only allow C & A promotions if these pieces are defined */ ShowWindow(GetDlgItem(hDlg, PB_Archbishop), - (gameInfo.variant == VariantCapablanca || - gameInfo.variant == VariantGothic) ? + (PieceToChar(WhiteCardinal) != '.' || + PieceToChar(BlackCardinal) != '.' ) ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hDlg, PB_Chancellor), - (gameInfo.variant == VariantCapablanca || - gameInfo.variant == VariantGothic) ? + (PieceToChar(WhiteMarshall) != '.' || + PieceToChar(BlackMarshall) != '.' ) ? + SW_SHOW : SW_HIDE); + /* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */ + ShowWindow(GetDlgItem(hDlg, PB_Rook), + gameInfo.variant != VariantShogi ? + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, PB_Bishop), + gameInfo.variant != VariantShogi ? SW_SHOW : SW_HIDE); -#endif return TRUE; case WM_COMMAND: /* message: received a command */ @@ -4699,27 +4716,25 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) DrawPosition(FALSE, NULL); return TRUE; case PB_King: - promoChar = 'k'; + promoChar = PieceToChar(BlackKing); break; case PB_Queen: - promoChar = 'q'; + promoChar = gameInfo.variant == VariantShogi ? '+' : PieceToChar(BlackQueen); break; case PB_Rook: - promoChar = 'r'; + promoChar = PieceToChar(BlackRook); break; case PB_Bishop: - promoChar = 'b'; + promoChar = PieceToChar(BlackBishop); break; -#ifdef FAIRY case PB_Chancellor: - promoChar = 'c'; + promoChar = PieceToChar(BlackMarshall); break; case PB_Archbishop: - promoChar = 'a'; + promoChar = PieceToChar(BlackCardinal); break; -#endif case PB_Knight: - promoChar = 'n'; + promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(BlackKnight); break; default: return FALSE; @@ -5288,6 +5303,11 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) DrawPosition(FALSE, NULL); break; + case IDM_FlipClock: + flipClock = !flipClock; + DisplayBothClocks(); + break; + case IDM_GeneralOptions: GeneralOptionsPopup(hwnd); DrawPosition(TRUE, NULL); @@ -5437,6 +5457,36 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) fromX = fromY = -1; break; + case EP_WhiteFerz: + EditPositionMenuEvent(WhiteFerz, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_WhiteWazir: + EditPositionMenuEvent(WhiteWazir, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_WhiteAlfil: + EditPositionMenuEvent(WhiteAlfil, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_WhiteCannon: + EditPositionMenuEvent(WhiteCannon, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_WhiteCardinal: + EditPositionMenuEvent(WhiteCardinal, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_WhiteMarshall: + EditPositionMenuEvent(WhiteMarshall, fromX, fromY); + fromX = fromY = -1; + break; + case EP_WhiteKing: EditPositionMenuEvent(WhiteKing, fromX, fromY); fromX = fromY = -1; @@ -5467,6 +5517,36 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) fromX = fromY = -1; break; + case EP_BlackFerz: + EditPositionMenuEvent(BlackFerz, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_BlackWazir: + EditPositionMenuEvent(BlackWazir, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_BlackAlfil: + EditPositionMenuEvent(BlackAlfil, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_BlackCannon: + EditPositionMenuEvent(BlackCannon, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_BlackCardinal: + EditPositionMenuEvent(BlackCardinal, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_BlackMarshall: + EditPositionMenuEvent(BlackMarshall, fromX, fromY); + fromX = fromY = -1; + break; + case EP_BlackKing: EditPositionMenuEvent(BlackKing, fromX, fromY); fromX = fromY = -1; @@ -5492,6 +5572,16 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) fromX = fromY = -1; break; + case EP_Promote: + EditPositionMenuEvent(PromotePiece, fromX, fromY); + fromX = fromY = -1; + break; + + case EP_Demote: + EditPositionMenuEvent(DemotePiece, fromX, fromY); + fromX = fromY = -1; + break; + case DP_Pawn: DropMenuEvent(WhitePawn, fromX, fromY); fromX = fromY = -1; @@ -6626,6 +6716,8 @@ ErrorDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) } #ifdef GOTHIC +HWND gothicDialog = NULL; + LRESULT CALLBACK GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { @@ -6646,7 +6738,7 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) and it doesn't work when you resize the dialog. For now, just give it a default position. */ - + gothicDialog = hDlg; SetWindowText(hDlg, errorTitle); hwndText = GetDlgItem(hDlg, OPT_ErrorText); SetDlgItemText(hDlg, OPT_ErrorText, errorMessage); @@ -6669,7 +6761,7 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) } VOID -GothicPopUp(char *title) +GothicPopUp(char *title, char up) { FARPROC lpProc; char *p, *q; @@ -6677,11 +6769,16 @@ GothicPopUp(char *title) strncpy(errorTitle, title, sizeof(errorTitle)); errorTitle[sizeof(errorTitle) - 1] = '\0'; - + + if(up && gothicDialog == NULL) { lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); + } else if(!up && gothicDialog != NULL) { + DestroyWindow(gothicDialog); + gothicDialog = NULL; + } } #endif @@ -8694,7 +8791,7 @@ DisplayWhiteClock(long timeRemaining, int highlight) char *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : ""; if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, &whiteRect, "White", flag); + DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &blackRect : &whiteRect, "White", flag); } if (highlight && iconCurrent == iconBlack) { iconCurrent = iconWhite; @@ -8716,7 +8813,7 @@ DisplayBlackClock(long timeRemaining, int highlight) hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, &blackRect, "Black", flag); + DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &whiteRect : &blackRect, "Black", flag); } if (highlight && iconCurrent == iconWhite) { iconCurrent = iconBlack; diff --git a/winboard/winboard.rc b/winboard/winboard.rc index d9387f9..0f85a93 100644 --- a/winboard/winboard.rc +++ b/winboard/winboard.rc @@ -185,6 +185,8 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Promote to:" FONT 8, "MS Sans Serif" BEGIN + LTEXT "YES ",IDC_STATIC,49,27,40,14 + RTEXT "NO ",IDC_STATIC,94,27,40,14 PUSHBUTTON "Chance&llor",PB_Chancellor,49,4,40,14,NOT WS_TABSTOP PUSHBUTTON "&Archbishop",PB_Archbishop,94,4,40,14,NOT WS_TABSTOP PUSHBUTTON "&Queen",PB_Queen,4,23,40,14,WS_GROUP @@ -565,6 +567,10 @@ BEGIN PUSHBUTTON "...",OPT_ChoosePremoveHighlightColor,110,184,20,15 CONTROL "Monochrome",OPT_Monochrome,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,210,64,10 + CONTROL "All White",OPT_AllWhite,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,140,180,53,10 + CONTROL "Flip Black",OPT_UpsideDown,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,140,192,53,10 PUSHBUTTON "Defaults",OPT_DefaultBoardColors,80,206,50,15 EDITTEXT OPT_DarkSquareColor,80,112,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP @@ -1061,6 +1067,7 @@ BEGIN POPUP "&Options" BEGIN MENUITEM "Flip &View\tF2", IDM_FlipView + MENUITEM "Flip &Clocks", IDM_FlipClock MENUITEM SEPARATOR MENUITEM "&General...", IDM_GeneralOptions MENUITEM "&Board...", IDM_BoardOptions @@ -1098,6 +1105,8 @@ BEGIN BEGIN MENUITEM "White", EP_White MENUITEM SEPARATOR + MENUITEM "Promote", EP_Promote + MENUITEM SEPARATOR MENUITEM "Pawn", EP_WhitePawn MENUITEM "Knight", EP_WhiteKnight MENUITEM "Bishop", EP_WhiteBishop @@ -1105,9 +1114,16 @@ BEGIN MENUITEM "Queen", EP_WhiteQueen MENUITEM "King", EP_WhiteKing MENUITEM SEPARATOR + MENUITEM "Archbishop", EP_WhiteCardinal + MENUITEM "Chancellor", EP_WhiteMarshall + MENUITEM "Elephant", EP_WhiteAlfil + MENUITEM "Cannon", EP_WhiteCannon + MENUITEM SEPARATOR MENUITEM "Empty Square", EP_EmptySquare MENUITEM "Black", EP_Black, MENUBARBREAK MENUITEM SEPARATOR + MENUITEM "Demote", EP_Demote + MENUITEM SEPARATOR MENUITEM "Pawn", EP_BlackPawn MENUITEM "Knight", EP_BlackKnight MENUITEM "Bishop", EP_BlackBishop @@ -1115,6 +1131,46 @@ BEGIN MENUITEM "Queen", EP_BlackQueen MENUITEM "King", EP_BlackKing MENUITEM SEPARATOR + MENUITEM "Archbishop", EP_BlackCardinal + MENUITEM "Chancellor", EP_BlackMarshall + MENUITEM "Elephant", EP_BlackAlfil + MENUITEM "Cannon", EP_BlackCannon + MENUITEM SEPARATOR + MENUITEM "Clear Board ", EP_ClearBoard + END +END + +SHOGIPIECEMENU MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "White", EP_White + MENUITEM SEPARATOR + MENUITEM "Pawn", EP_WhitePawn + MENUITEM "Knight", EP_WhiteKnight + MENUITEM "Bishop", EP_WhiteBishop + MENUITEM "Rook", EP_WhiteRook + MENUITEM "Lance", EP_WhiteQueen + MENUITEM "Silver", EP_WhiteFerz + MENUITEM "Gold", EP_WhiteWazir + MENUITEM "King", EP_WhiteKing + MENUITEM SEPARATOR + MENUITEM "Promote", EP_Promote + MENUITEM SEPARATOR + MENUITEM "Empty Square", EP_EmptySquare + MENUITEM "Black", EP_Black, MENUBARBREAK + MENUITEM SEPARATOR + MENUITEM "Pawn", EP_BlackPawn + MENUITEM "Knight", EP_BlackKnight + MENUITEM "Bishop", EP_BlackBishop + MENUITEM "Rook", EP_BlackRook + MENUITEM "Lance", EP_BlackQueen + MENUITEM "Silver", EP_BlackFerz + MENUITEM "Gold", EP_BlackWazir + MENUITEM "King", EP_BlackKing + MENUITEM SEPARATOR + MENUITEM "Demote", EP_Demote + MENUITEM SEPARATOR MENUITEM "Clear Board ", EP_ClearBoard END END @@ -1609,6 +1665,7 @@ O72O BITMAP MOVEABLE PURE "bitmaps\\o72o.bmp" U72O BITMAP MOVEABLE PURE "bitmaps\\u72o.bmp" H72O BITMAP MOVEABLE PURE "bitmaps\\h72o.bmp" G72O BITMAP MOVEABLE PURE "bitmaps\\g72o.bmp" +L72O BITMAP MOVEABLE PURE "bitmaps\\l72o.bmp" DK72O BITMAP MOVEABLE PURE "bitmaps\\dk72o.bmp" WP72O BITMAP MOVEABLE PURE "bitmaps\\wp72o.bmp" WN72O BITMAP MOVEABLE PURE "bitmaps\\wn72o.bmp" @@ -1624,6 +1681,7 @@ O72S BITMAP MOVEABLE PURE "bitmaps\\o72s.bmp" U72S BITMAP MOVEABLE PURE "bitmaps\\u72s.bmp" H72S BITMAP MOVEABLE PURE "bitmaps\\h72s.bmp" G72S BITMAP MOVEABLE PURE "bitmaps\\g72s.bmp" +L72S BITMAP MOVEABLE PURE "bitmaps\\l72s.bmp" DK72S BITMAP MOVEABLE PURE "bitmaps\\dk72s.bmp" WP72S BITMAP MOVEABLE PURE "bitmaps\\wp72s.bmp" WN72S BITMAP MOVEABLE PURE "bitmaps\\wn72s.bmp" @@ -1639,6 +1697,7 @@ O72W BITMAP MOVEABLE PURE "bitmaps\\o72w.bmp" U72W BITMAP MOVEABLE PURE "bitmaps\\u72w.bmp" H72W BITMAP MOVEABLE PURE "bitmaps\\h72w.bmp" G72W BITMAP MOVEABLE PURE "bitmaps\\g72w.bmp" +L72W BITMAP MOVEABLE PURE "bitmaps\\l72w.bmp" DK72W BITMAP MOVEABLE PURE "bitmaps\\dk72w.bmp" E49O BITMAP MOVEABLE PURE "bitmaps\\e49o.bmp" A49O BITMAP MOVEABLE PURE "bitmaps\\a49o.bmp" @@ -1650,6 +1709,7 @@ O49O BITMAP MOVEABLE PURE "bitmaps\\o49o.bmp" U49O BITMAP MOVEABLE PURE "bitmaps\\u49o.bmp" H49O BITMAP MOVEABLE PURE "bitmaps\\h49o.bmp" G49O BITMAP MOVEABLE PURE "bitmaps\\g49o.bmp" +L49O BITMAP MOVEABLE PURE "bitmaps\\l49o.bmp" DK49O BITMAP MOVEABLE PURE "bitmaps\\dk49o.bmp" WP49O BITMAP MOVEABLE PURE "bitmaps\\wp49o.bmp" WN49O BITMAP MOVEABLE PURE "bitmaps\\wn49o.bmp" @@ -1665,6 +1725,7 @@ O49S BITMAP MOVEABLE PURE "bitmaps\\o49s.bmp" U49S BITMAP MOVEABLE PURE "bitmaps\\u49s.bmp" H49S BITMAP MOVEABLE PURE "bitmaps\\h49s.bmp" G49S BITMAP MOVEABLE PURE "bitmaps\\g49s.bmp" +L49S BITMAP MOVEABLE PURE "bitmaps\\l49s.bmp" DK49S BITMAP MOVEABLE PURE "bitmaps\\dk49s.bmp" WP49S BITMAP MOVEABLE PURE "bitmaps\\wp49s.bmp" WN49S BITMAP MOVEABLE PURE "bitmaps\\wn49s.bmp" @@ -1680,6 +1741,7 @@ O49W BITMAP MOVEABLE PURE "bitmaps\\o49w.bmp" U49W BITMAP MOVEABLE PURE "bitmaps\\u49w.bmp" H49W BITMAP MOVEABLE PURE "bitmaps\\h49w.bmp" G49W BITMAP MOVEABLE PURE "bitmaps\\g49w.bmp" +L49W BITMAP MOVEABLE PURE "bitmaps\\l49w.bmp" DK49W BITMAP MOVEABLE PURE "bitmaps\\dk49w.bmp" diff --git a/winboard/woptions.c b/winboard/woptions.c index 1d92129..4f91822 100644 --- a/winboard/woptions.c +++ b/winboard/woptions.c @@ -495,7 +495,7 @@ BoardOptionsWhichRadio(HWND hDlg) LRESULT CALLBACK BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static Boolean mono; + static Boolean mono, white, flip; static BoardSize size; static COLORREF lsc, dsc, wpc, bpc, hsc, phc; static HBITMAP pieces[3]; @@ -564,6 +564,12 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) if (appData.monoMode) CheckDlgButton(hDlg, OPT_Monochrome, TRUE); + if (appData.allWhite) + CheckDlgButton(hDlg, OPT_AllWhite, TRUE); + + if (appData.upsideDown) + CheckDlgButton(hDlg, OPT_UpsideDown, TRUE); + pieces[0] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "s"); pieces[1] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "w"); pieces[2] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "o"); @@ -575,6 +581,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) hsc = highlightSquareColor; phc = premoveHighlightColor; mono = appData.monoMode; + white= appData.allWhite; + flip = appData.upsideDown; size = boardSize; SetBoardOptionEnables(hDlg); @@ -619,6 +627,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) (wpc != whitePieceColor) || (bpc != blackPieceColor) || (hsc != highlightSquareColor) || + (flip != appData.upsideDown) || + (white != appData.allWhite) || (phc != premoveHighlightColor)) { lightSquareColor = lsc; @@ -628,6 +638,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) highlightSquareColor = hsc; premoveHighlightColor = phc; appData.monoMode = mono; + appData.allWhite = white; + appData.upsideDown = flip; InitDrawingColors(); InitDrawingSizes(boardSize, 0); @@ -713,6 +725,16 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) mono = !mono; SetBoardOptionEnables(hDlg); break; + + case OPT_AllWhite: + white = !white; + SetBoardOptionEnables(hDlg); + break; + + case OPT_UpsideDown: + flip = !flip; + SetBoardOptionEnables(hDlg); + break; } break; } -- 1.7.0.4