Phalanx-XXII/0000755000175000001440000000000010320061540012421 5ustar sombrausersPhalanx-XXII/README0000644000175000001440000003170510314125617013320 0ustar sombrausersPhalanx is a chess playing program Copyright (c) 1997, 1998, 1999, 2000 Dusan Dobes LICENSE AND WARRANTY - Phalanx 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, or (at your option) any later version. - Phalanx 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 Phalanx; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. WHERE TO GET PHALANX - http://www.crosswinds.net/~dobes/phalanx/ - ftp://sunsite.unc.edu/pub/Linux/games/strategy/ (Only sources) Sunsite is well maintained archive with lots of mirrors, but it's dedicated to Linux. If you want to try Win32 binary or bigger secondary opening book try following site, it has both sources and Win32 binaries plus opening books largebook.zip and hugebook.zip: - ftp://ftp.math.muni.cz/pub/math/people/Dobes/ - http://www.gambitsoft.com/sharee.htm (Only Win32 binaries) - http://www.cent.co.yu/chess/free.htm (Only Win32 binaries) Please let me know if there are others, i will update this list. Feel free to put Phalanx on your ftp site. COMPILING, PORTABILITY Compiling is simple, at least under Linux. Just type `make'. You might want to edit the optimization flags in makefile to produce faster binary. Phalanx is developed under GNU C, GNU Debugger, and GNU Make. If your system does not support GNU exensions (e.g. long options), remove '-DGNUFUN' from DEFINES in makefile. If you have incompatible 'make', try this: $ cat *.c > allphalanx.c; cc -O allphalanx.c -o phalanx INTERFACE, COMMAND LINE OPTIONS Phalanx is xboard compatible. Running with xboard: 'xboard -fcp phalanx'. Note that permanent brain (pondering) is off by default. Newer versions of xboard set it on with the 'hard' command. If this does not work, try 'xboard -fcp "phalanx -p+"' or (for <4.0.0 versions of xboard) change your initString (see Xboard documentation for details). It's better to stop permanent brain in both programs, when playing Phalanx against another program on a machine with one CPU. It's also possible to run phalanx without xboard. Do "phalanx -h" to get a list of command line options. One important command of phalanx's ASCII interface is "help". MORE ABOUT INTERFACE I'm trying to write an interface that fits following three requirements: - Xboard compatibility. For best results, get the latest version of Xboard. (http://www.research.digital.com/SRC/personal/Tim_Mann/chess) - shell-like interface that allows running commands in a batch. It's very useful for testing. Example: look into the file test.fin. It's a set of chess problems and solutions. You can simply send this file to Phalanx's stdin: $ phalanx -c+ -o- -b- -f10 < test.fin | tee result ( Where: -c+ .... use cpu time -o- .... don't use polling input -b- .... no opening book -f10 ... fixed time 10 seconds per move ) Watch how it works. - Acceptable ASCII interface. COMMAND LINE OPTIONS Usage: phalanx [options] [ []] phalanx [options] [] phalanx bench phalanx bcreate [book creation options] Options: -t Transposition table really needs to fit in the RAM memory, it should never be swapped to disk. Maximum size is your total RAM minus space needed for OS (8-20 MB) minus space for other (possible) applications. -f -x <+/-> xboard mode on/off default: on "Xboard mode off" is designed for the ascii interface. In -s+ mode it shows also the move that is currently searched. -p <+/-> permanent brain on/off default: off Phalanx ponders on a predicted move with the permanent brain on. It is sometimes called pondering. Xboard sets it on with the 'hard' command regardless of this option, just use xboard menu to set it on/off. -s <+/-> show thinking on/off default: off Phalanx shows depth, evaluation, time used in centiseconds, nodes searched, and principal variation (best line) when searching. Xboard overrides this option with 'post' and 'nopost' commands, just use xboard menu instead of this. -c <+/-> cpu time default: off This one defaults to the "wall clock" real time. It's better to use the CPU time when running test suites. -o <+/-> polling input default: on Use -o- for running test suites. Phalanx reads the positions from its standard input and polling input makes it stop thinking after almost zero seconds on each position. -b <+/-> opening book default: on -l <+/-> learning on/off default: on -r default: 0 (no resigning) -e default: 0 (best play) 1 is the hardest and 100 is the easiest easy level. Phalanx tries to emulate human-like blunders, the higher the number the more blunders it plays. It also adds more randomness with the easy levels, repeating games should be impossible. Easy levels set hashtable size to zero, pondering and learning to off. Phalanx responds almost immediatelly to opponent's move. Node count is used instead of the time, so appropriate levels should give the same strength even on different machines (e.g. 486 == Pentium-III). -v Print version and exit. -P -S -L -g Book creation options: -b Stage 1. One cell is 10 bytes. Twice the space is needed for sorting the buffer, use no more than 1/3 of your total RAM. -p Stage 1. Stop parsing the game at given ply (halfmove). Default value is 70, it's 35 full moves. -c Stage 1. PGN files have comments in {}. Phalanx skips the comments when parsing. Big PGN files also have lots of errors, sometimes '{' does not have matching '}'. So, if the comment goes over the maximal length, we suspect the text is no more the comment and continue parsing. Default value is 4096 bytes. -w Stage 1. We are adding the [position,move] to the database. The side to move won the game. The appropriate database entry gets bonus. Default is 5 points. Use values in 1-10 range. -d Stage 1. Same as the previous except that the game was drawn. Default value is 2 points. -l Stage 1. Same as the previous except that the side to move lost the game. Default value is 1 point. -u Stage 1. Same as the previous except that there is no result of the game in the PGN file, sad and common case. Default value is 1 point. -v Stage 2. Moves that have less total points than this value are not added into the sbook.phalanx. Bigger numbers create smaller books. The smallest reasonable number is 10. Default is 15. -g Stage 2. Use values in 50-100 range. The 2nd, 3rd, and other moves are stripped if their value is less than G% of the value of the best move. The G is decreased in positions where the 1st move value has high enough value to give more variability in frequently played opening, e.g. we want a bit more than just sicilian, maybe 1. ... e5 is also good. 50 gives lots of variability and maybe dubious moves, 100 gives almost no variability and only the highest valued moves. Default is 80. Examples: phalanx -c+ -s+ -o - -x- -f 60 -t4000 xboard -fcp "phalanx -r800" xboard -fcp 'phalanx -e 100' ASCII INTERFACE COMMANDS about about Phalanx, show version, copyright info, and settings bd display position (same as 'd') bk show book moves (xboard) - shows ECO code/name and all moves from both primary and secondary opening books. The last line is the text string that is used to identify the position in the pbook.phalanx. Primary book moves are shown along with their probabilities. There is no such probability info for the secondary book moves, as all secondary book moves have equal probability. book enable/disable opening book both machine plays both depth set search depth in plies (xboard). Search will be stopped at given depth, no timing info is used. fen display position in FEN force user plays both (xboard) go switch sides, start computing (xboard) history show game moves in full notation level N M I set level to N moves in M minutes, increment I seconds. Phalanx needs its time info have updated from xboard via the 'time' command to make this level work well. level N set level to fixed time N seconds per move new new game (xboard) post show thinking (xboard) remove take back last move, two plies (xboard) nopost do not show thinking (xboard) quit quit (same as 'exit' or end of file character) score show static evaluation time remaining time is N/100 s (xboard) undo undo last ply (xboard; same as 'u') set test position, start search, show result # comment OPENING BOOK From version VI, there are two book files - primary (pbook.phalanx), and secondary (sbook.phalanx). A position is first searched in pbook.phalanx. Only if it's not found there, sbook.phalanx is searched. You can specify book directories via command line (-P, -S) or use environment variables PHALANXPBOOKDIR and PHALANXSBOOKDIR. Otherwise Phalanx tries to find its book files in current directory (./book.phalanx, ./sbook.phalanx) and finally in compiled-in directory (/usr/local/lib/phalanx). You can change the compiled-in directory in makefile. - pbook.phalanx is 'hand'-written, text book. One line per position, sorted. This time, it's bigger than really needed, because it was the only book file till version V. The size will be smaller and the line format might change to EPD+SAN in future. - sbook.phalanx is binary book, generated from large PGN files. Six bytes per move (4 hash key, 2 move). You can generate your own sbook.phalanx with 'phalanx bcreate ', like this: $ ./phalanx bcreate < manyGMgames.pgn Book creation has two stages. First stage reads and parses PGN from standard input and creates the 'rbook.phalanx' file. If rbook.phalanx already exists, the first stage is skipped. Second stage filters positions and moves from the rbook.phalanx to sbook.phalanx. First stage needs about 30 times more time than the second one. Look at 'book creation options' for more details on creating your sbook.phalanx. ECO DATABASE From version XX, Phalanx has ECO database. Command 'bk' can also print ECO code and opening/variation name. This works with xboard 4.0 via "Help"/"Book" menu item. If you want to activate this feature, you must type the 'bk' command (or click the "Help"/"Book" menu item in xboard) once per session in the initial position. Then, the ECO index is created (that might take few seconds on a slow machine). The ECO index is based on positions rather than on moves so transpositions between openings can take place. The eco.phalanx file is taken from Gnuchess distribution (originally eco.pgn, but this is not real pgn). INSIDE THE MACHINE Phalanx uses (traditional) 10x12 board implementation. There are three often used board implementations: "8x8" (GNU Chess), "bitboard" (Crafty), and "10x12" (Nimzo, Phalanx). In short, "10x12" is easy to implement and the code and basic data structures are small ( == fast on PC). The engine uses many well known techniques: PVS (principal variation search), transposition/killer table, static-eval cache, history killers, SEE (static exchange evaluator), null move pruning, forward pruning, internal iterative deepening, chess-specific extensions. AUTHOR Dusan Dobes, dobes@math.muni.cz Phalanx-XXII/HISTORY0000644000175000001440000004502010314125617013517 0ustar sombrausersThis is history of Phalanx. Dates are in the form YYYYMMDD. I First version to play a legitimate game, it finally knows all rules. 19970304 I spent a lot of time on tuning transposition table code and extensions. The program scores 78% at large Reinfeld's test set, 10 s per move, on 486+/150. II Two killer heuristics added: well known history killers (modified) 199704?? and `reaction' killers (the killer is connected to the previous enemy move). The tree search is faster, especially at `quiet' positions. Hashtable presearch. Modified hashentry replacement strategy. Better evaluation function, it now knows more about passed pawns, the endgame play is much stronger. Fixed bug at 7-th row pawn push extension routine. Faster output - using sprintf() to prepare the output and then only one printf. New command line options: -t, -T to set the hashtable size. III Permanent brain (pondering). King safety evaluation. Hung pieces 19970529 static evaluation. Null move pruning. Forward pruning. Better time heuristics - forced moves are played quickly. New cmd-line options: -f, -x, -p, -s. IV New option -c to determine whether to use cpu or real time. The 19970721 internal timing resolution changed to 1/100 of a second. Xboard compatible editing position. Removed en-passant capture from quiescence search. Changes in static-eval function. Piece list implemented - speedup is between 0 and 20%; more in endgame. Pinned pieces static evaluation. Better evaluation of weak pawns. Trapped bishop and knight evaluation. Bugfix at extending check evasions. Bugfix: development bonus was computed but not added to total evaluation. Output change: '!' means turn, '!!' means value out of window. V Mostly interface changes, no big improvement in playing strength. 19970803 Xboard compatibility fixes: 'post' is no more switch, new command 'remove'. Fixed command 'level': 'level 0 5 0' (five minutes per game) should work, also increment (ICS) levels ('level 0 2 12'). Increment can be given at command line. New option -o (polling input) - when running tests, phalanx needs -o-. New feature of autotesting: all incorrect results are written into file 'notfound.fin'. Small output changes for better compatibility with xboard 3.6.2. Eliminated some bad turns in evaluation. Better king safety evaluation - counting safe checks available. VI Fixed small efficiency bug in evaluate.c. Improved time heuristics 19970915 for increment (ICS) levels. Optimized hashing - about 5% overall speedup. Fixed bug in ptime(). User is now allowed to continue play even if the position is drawn by 3-rep., material, or 50 moves rule. Fixed bug - Draw requests are now always ignored, not always accepted :-). Xboard-compatible 'Illegal move' message. Binary opening book, created from PGN by bcreate. This distribution is bigger than any previous because it contains a small example of binary book ('sbook.phalanx', 174kB, 29634 moves). SAN input accepted. Static evaluation now better understands middlegame positions without castling. Added pre-computed tables into static evaluation -> about 5% speed improvement. 'Show thinking' mode now shows also a list of book moves if there's a book entry. I have played a match with previous version (64 games, 2 minutes, increment 12 seconds, on a 486+/150, via xboard, no pondering), new version wins 38.5-25.5. VII Courtesy of Pavel Janik ml., new command 'fen'. Bugfix in command 19971022 line parser, 'phalanx 0 2 12' now works. Better time controls: added hard time limit to avoid being flagged. Pondering bugfix: Phalanx was pondering O-O, but opponent played O-O-O; the move check was incorrect and Phalanx thought that O-O was played; this resulted in 'Illegal move' message few moves later. More pondering safety: the move to be pondered is now checked for legality, before this fix it was simply taken from PV (if present), but PV is not always 100% correct. More PV safety: search cannot be interrupted during the first iteration, the abort is delayed until the first iteration is finished. New options: -r , -b <+/-> to set opening book on/off. New commands hard/easy to set pondering on/off. Optimized do_move(): 3% speedup in test positions. Search optimization: null move is not played if the value in hash table entry is too low. Output bugfix: output is now readable even at long time searches. SEE (Static Exchange Evaluator) and more pruning in quiescence search. RoboFICS compatible commands 'white' and 'black'. Routine for evaluating pawn endgames. New extension trick that helps in some horizon-effect type positions, it's based on measuring difference between current score and null move result; if current score is much better, the side to move must be under threat and the line is extended, similar trick is also in gnuchess. VIII Fixed bug in search(): eliminated useless re-searches -> about 3% 19971103 speed improvement. Noise level is now in centiseconds, not in nodes. Improved horizon-effect extensions. endgame.c: new endgame knowledge, mostly for endgames with minor pieces and pawns: knight and bishop mating, knight+knight (draw), minor vs. minor (draw), minor vs. pawn (draw, but still needs some work, sometimes a pawn wins against a knight), onepawn() as a special case of pawns(), bad bishop (bishop + rook pawn), basics for R+P vs. R, bishops with opposite colors (this is often drawish ending). New penalty for moving castling-side pawns in middlegame. IX Function smove() is now used in both binary book and hashing code, it 19971205 is cleaner and easier to read, the binary is smaller with this. Bugfix: Phalanx now does not ponder move that leads into a terminal position (checkmate, stalemate), this fixes some unexpected quits (I hope all of them). Added more limits to horizon-effect extension trigger - there was so many extensions, that version VIII was actually weaker than previous versions, because of lower nominal search depth; these extensions are now used only for major threats. Static eval cache entry is now packed into 4 bytes instead of 8 -> the cache eats only 256K (512K before this). X Bugfix in static evaluation of trapped knight at [AH]7. Better 19980108 evaluation of trapped bishop ([AH]7) and knight ([AH][87]), now it's using the static exchange evaluator. Time allocation: alloc more time (+1/8) if pondering is on. Better understanding of 'trade-down' bonus - if there are no pawns, you often need a rook more to win the game, a minor piece is not enough. Shallower extensions resulting in greater average search depth. Easy levels: use new command line option -e <1...100> to select an easy level; 1 is the strongest and 100 is the easiest one, Phalanx tries to make human-like blunders. Minor changes in resigning. Clean up in pbook.phalanx, deleted over 100 positions. Killer heuristics now uses the SEE. Bugfix in endgame.c: trade bonus did not work for kings and pawns endgames. Simple learning, can be activated by -l+ option; it is off by default, because it's very experimental version. New version wins engine-engine match with version IX 23:17 (tc 2, inc 8, 486+/150, no learning, no pondering). XI Courtesy of Milan Zamazal: long options and user-friendly handling of 19980125 book files - you can now use environment variables or command line options. Bugfix in trade bonus: endgame KQ-KBPP was evaluated only about +1.10, but the stronger side is winnig here even without pawns, now it's >+3.00 and Phalanx can solve this Dufrense&Mieses study: 8/3Np3/7P/1p3P2/1k6/5K2/1b6/8/w Pf5f6. Deeper overall extensions, +10% of ply. More check evasion extensions. Wider window for 'lazy evaluation', search is now slower but stable. Minor fixes in forward and null move pruning. Zero-width search modified for root moves, actually it's no more zero-width; this eliminates some 'blind turns' (a move is evaluated as >=(Alpha+1), but the engine cannot prove it in re-search in full [Alpha,Beta] window). Minor changes in static evaluation. Bugfix in time allocation of increment levels. Changed time heuristics to use more time. XII More pruning in quiescence search: moves that have little chance to 19980301 return the value over alpha are not generated. Permanent brain is now really 'permanent', if there is no move to ponder in the PV, Phalanx uses short search to pick a move and ponders it. Bugfix: occasional zero division at very fast time controls, like 10s/game. Some puts() replaced with printf(), puts() is buggy in my gcc (2.7.2) and causes sigsegv when interrupted and called again during the interrupt. Optimized null move, this speeds up the engine. Easy levels now use nodes instead of centiseconds for measuring time, the playing strength of easy levels does not depend on cpu power and cpu load. Resigning now works with RoboFics (via 'tellics resign'). Updated FSF address in docs. XIII Lots of 'char' and 'short' replaced with 'int' -> speedup on iX86 19980316 chips (about 10% on my 486, probably more on P6). Bugfix at 'edit' command, edit was broken for positions with black to move. New command line option 'bench', 'phalanx bench' runs a 5 cpu-minutes benchmark and reports nodes per second. Added some interesting lines into the opening book. Dynamic draw score, it's set to -20 by default. New command 'rating ' to adjust the dynamic draw score, Phalanx tries to avoid draw with weaker opponents, minimal draw score is -20, maximal +20. XIV Dynamic draw score did not work for stalemate, now fixed. Major bug 19980416 fixed at resigning: if resigning was on, phalanx resigned almost any game after few moves, this was broken from previous version. Simplified computing bounds for lazy evaluation, this was too complicated and slow. Higher material limit for evaluating position as endgame. Deeper extensions, +0.1 ply. Improved move ordering at root search. Minor optimizations. More variability in opening book. Disabled scout search near leafs. Bugfix: type of Nodes changed to 'long long' (64 bits on Intel[3456]86), 32-bit integer was not long enough for >24 hour runs. Bugfix: option -P did not work, now fixed. Added startup messages that show full path of all open files. XV Internal iterative deepening. Cleaned pbook.phalanx. New "Pc2-c4" 19980614 code to encourage playing c4 (c5 as black) in closed positions where e4 (e5) is not possible. Bugfix at computing total material on the board, the variable was sometimes overwritten with unexact value. New xboard compatible commands 'bk' and 'analyze'. 'bk' shows all book moves. 'analyze' starts analysis mode. Bugfix in bcreate.c: no games on stdin caused segmentation fault. GNU extensions (long options and snprintf) are now used only if GNUFUN is defined (-DGNUFUN in makefile). New endgame knowledge: KNP vs. K is sometimes draw. Small changes in static evaluation. SIGINT is ignored in polling input mode. Time information in post lines is shown in centiseconds instead of seconds to follow current draft of xboard chess engine communication protocol. XVI Bugfix in analyze mode: there is no extra character after the search 19980630 depth number in post lines - xboard understands that time info is in centiseconds, not in seconds. Bugfix in null move pruning: the side that is trying its second move in row must have at least one legal move, this caused segmentation fault if there was none. Command 'hard' does not set pondering on in easy levels. Bugfix at parsing SAN moves, nc3 was (possibly) interpreted as Pc2-c3. Command 'level' accepts time in mm:ss form, for example 'level 0 2:30 12'. Bugfix in kings+pawns endgames - penalty for pawns on one file (doubled) worked as penalty for pawns on one row. Improved kings+pawns endgames static evaluation. New command 'xboard' sets xboard compatible mode. XVII More variability in pbook.phalanx. Better sbook.phalanx, generated 19980804 from wall.pgn. Changed (and fixed) extensions for check evasions and passed pawn pushes. Changed evaluation of passed pawns. phalanx and bcreate integrated into one binary, most of the code was common anyway; book can be created via 'phalanx bcreate' instead of just 'bcreate'. Bigger limit for count of [position,move] in bcreate code, the counter has 32 bits instead of 16. Performance bugfix in null move pruning. XVIII Bugfix in the static exchange evaluator - it let kings slide 19980906 horizontally. New styling of board in command "bd"/"d". New command in edit mode: 's' to switch side to move. Modified look of edit mode. Modifications in static evaluation: bishop pair needs mobility; queen has 'king distance' bonus only if it's on a safe square; simpler rook evaluations - smaller bonuses; forpost (outpost) pawn gets more bonus for # of pieces defending it (Aaron Nimzowitsch, "Mein System"); bigger bonus for protected or connected passed pawns. Modified threat extensions - only mate threats are extended. Bugfix in analysis mode: PV is computed (and shown) even if there is only one legal move. New feature of command 'level' - 'level N' sets level to N seconds fixed time per move. Better pbook.phalanx. XIX Log file to allow easier debugging/tuning, it is activated via 19981122 '-g ' command line parameter. Positional learning file is created (in current directory) if it does not exist and it no more has to be distributed as empty. Minor speedups in pawn endgames. Outside passed pawn detection and evaluation in pawn endgames. Raised material value needed for evaluating kingside/queenside storming (attack after different castlings), these are not worth evaluating when close to endgame. Fixed book move selection to make it easier to implement book learning in future (no real change for user). FICS whispering. Better pbook. Bugfix in evaluation of kings+pawns endgames - the evaluation of 'king in the square of pawn' had bad sign (!). New extension trick: we add big extension after two succesive non-pawn captures that result in pawn endgames - the branching factor is much smaller below that node and we can go deeper without affecting search stability and ... we should do so, because 6 plies subtree evaluation in middlegame is much better than 6 plies in king+pawns. Timing change: phalanx uses more time if there were turns in last ply level. Fixed bug in communication with xboard that caused playing too fast in '-mg' mode with 'reuse' on. Alias 'u' for 'undo'. XX Bugfix in xboard mode, long lines of 'tellics whisper ....' were 19990104 split into several lines. Better pbook.phalanx. Fixed code that avoids pseudocastling (moving white king e1-f1-g1 and leaving rook h1 undeveloped), now it works also in endgame. New code to keep pressure against stonewall d-pawn; if black has stonewall, white should keep the c-pawn on c4; previous versions often played c4-c5?, and that is a bad error against humans. Knights now get penalty in endgames with pawns on both sides of the board (12 to 35 centipawn). Outside passed pawn evaluated in all endgames, not just in kings+pawns. Minor bug fix in analyze mode with xboard (phalanx aborted search due to unimplemented '.' command). New side effect of command 'level' - it also sets remaining time to the same value as level time; this does not break anything but might help in the Fritz 5.32 winboard interface. SAN input now accepts pawn captures in the form 'ef'. ECO database, ECO codes and names are shown with 'bk' command; user has to run 'bk' command once in initial position to activate the ECO feature. Removed '-T' command line option from help, it might be used to tablebase directory in future. XXI Major bug fixed in outside passed pawn evaluation, when one side had 19990131 no pawns, there was indexing out of range. Minor penalty for rook on a pawn file in middlegame. Fixes in pbook.phalanx, as usual. XXII Better ICS whispering, it sends only one info per move. Bugfix in 20000116 disabling castling flag, now also moves _to_ the A1,H1,A8,H8 squares disable corresponding castling. Improved pbook.phalanx. New sbook.phalanx created from "granit" collection. Modified bcreate so that moves are put into the book in the order of their success rate, the most successful move is later shown as the first one in the list of the book moves. Bcreate now uses temporary files instead of memory. Deeper extensions. Modified and fixed rook static evaluation. Learning is now on by default. Phalanx sets the first finger line on ICS, it shows version, size of hashtable, and sizes of the opening books. Bugfix in benchmark, the resulting number was incorrect on machines that can do over 70kNps. Phalanx-XXII/COPYING0000444000175000001440000004431110314125617013466 0ustar sombrausersGNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: * a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. * b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. * c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: * a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, * b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, * c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the program's name and an idea of what it does. Copyright (C) 19yy name of author 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. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Phalanx-XXII/makefile0000644000175000001440000000212310320061540014117 0ustar sombrausersCC = gcc ####### choose the line that makes the binary faster on your machine # CFLAGS = -O3 -Wall -fomit-frame-pointer -funroll-loops CFLAGS = -O0 -Wall -Werror -fomit-frame-pointer -march=k8 -std=c99 -D_GNU_SOURCE ####### debug/tuning options for developers # CFLAGS = -O -Wall -g3 -static # CFLAGS = -O -Wall -pg ####### ### DEFINES ### -DSHOW_FORCED_MOVES ### -DPBOOK_FILE=\"pbook.phalanx\" ### -DSBOOK_FILE=\"sbook.phalanx\" ### -DLEARN_FILE=\"learn.phalanx\" ### -DPBOOK_DIR=\"/usr/local/lib\" ### -DSBOOK_DIR=\"/usr/local/lib\" ### -DLEARN_DIR=\"/var/local/lib\" ### -DQCAPSONLY DEFINES = -DGNUFUN LDFLAGS = OBJ = .o/phalanx.o .o/bcreate.o .o/search.o .o/io.o .o/data.o \ .o/evaluate.o .o/genmoves.o .o/moving.o .o/hash.o .o/static.o \ .o/levels.o .o/book.o .o/killers.o .o/endgame.o .o/learn.o phalanx: .o $(OBJ) $(CC) $(CFLAGS) $(DEFINES) $(LDFLAGS) $(OBJ) -o phalanx .o/%.o: makefile %.c $(CC) $(CFLAGS) $(DEFINES) -c $*.c -o .o/$*.o .o: mkdir .o clean: rm -rf .o phalanx backup: tar -czvf Archive/phalanx.tgz \ makefile *.c *.h pbook.phalanx sbook.phalanx test.fin Phalanx-XXII/test.fin0000644000175000001440000000714010314125617014111 0ustar sombrausers# # This is a set of tactical problems. I tried to select problems that # are not too easy (like mate in 2) and also not too hard to solve. # # You can find more tests like this one in a distribution of Gnu Chess 4.0 # 1k5r/Npn2p2/1N1p4/R1pPp3/4P1q1/1P2Pb2/1PPK4/5Q2/w Qf1xBf3 1r1rb1k1/2p3pp/p2q1p2/3PpP1Q/Pp1bP2N/1B5R/1P4PP/2B4K/w Qh5xPh7+ 1r2r1k1/p4p1p/6pB/q7/8/3Q2P1/PbP2PKP/1R3R2/w Rb1xBb2 1rr3k1/p3ppbp/3pbnp1/7P/qP1BP1P1/5P2/1PPQ4/1NKR1B1R/b Bg7h6 2r3rk/3q1p1p/5p2/1p1p1b2/2pN3R/P1P1R3/1P3PPP/3Q2K1/w Re3e7 3r2k1/Q4p2/Bp2p1pp/3r4/1P1n3q/P7/1P3PPP/2R1R1K1/b Nd4f3+ 3rnr1k/pp3ppp/4b3/2p1qNP1/P2pPR2/1P1P2Q1/2P3BP/5RK1/w Nf5h6 4r1k1/p1qr1p2/2pb1Bp1/1p5p/3P1n1R/1B3P2/PP3PK1/2Q4R/w Qc1xNf4 4r3/p2qppkp/3p2b1/1p1N4/2r1P1RQ/2P4P/PP4P1/5RK1/w Rg4xBg6+ 4rrk1/ppp2qpp/3b4/3p4/6b1/2P1B3/PP1Q1PPP/R3KN1R/b Pd5d4 5q1k/8/8/7r/1P2Q3/8/7P/6RK/b Rh5xPh2+ 5rk1/1p2ppbp/p2pb1p1/q7/P1rBPPn1/5B2/1PP1N1PP/R2QR1K1/b Rc4xBd4 6k1/1b2qpbp/3P2p1/Q7/N3r3/6B1/PP2r1PP/3RR2K/b Re2xPg2 6k1/ppr1r2p/1nq2pp1/3p4/6NR/1PPQ1PP1/P4PK1/7R/w Rh4xPh7 6r1/4kp2/p1bRpp2/1pr1P3/5b1p/PBP1N3/1P4PP/1K1R4/w Ne3f5+ 6rk/pp2pp1p/3q2rb/3P1b2/3P1P2/1P3Q1P/PB1N1R1K/2R5/b Bh6xPf4+ 7Q/1bq1kp2/p3p2p/8/PNp1r3/6P1/1P3P2/3R2K1/b Qc7d6 7k/6rp/5qb1/1pQp2R1/p4p2/P1P2p2/1P5P/3n1BRK/b Rg7c7 8/2R4p/6pk/2R2b2/8/5KP1/7r/8/w Pg3g4 8/8/3p4/3P2p1/3kBp2/5P1b/3r3P/6RK/b Kd4e3 8/p3k2p/1p2pnPP/5p2/P1PP1N2/5K2/8/8/w Nf4h5 8/p5Q1/2ppq2p/3n1ppk/3B4/2P2P1P/P5P1/6K1/w Pg2g4+ R4n2/pp2qpp1/2p3pk/6N1/7P/2P2P2/P5P1/3R2K1/w Ra8xNf8 n1k1n2r/Qb1r2q1/1p1p1p2/1PpPpPp1/2P1P1P1/6R1/3B1KB1/R1N5/w Qa7xNa8+ r1b1k2r/pp2qppp/2pb1n2/3p4/4P3/3B1N2/PPP2PPP/R1BQ1RK1/w Pe4e5 r1b1r1k1/ppq2p1p/3b1ppQ/2n5/8/3B2N1/PPP2PPP/R1B2RK1/w Ng3h5 r1b1rk2/pp3ppQ/1np5/4q3/2B4N/4P3/PP3PP1/2R2K1R/w Qh7g8+ r1b4Q/ppp2kpp/3b4/8/4RP1q/8/PPP3PP/3R2K1/b Bc8h3 r1bnr2k/4q1pp/p2Rp3/1p2Qp2/1P5P/P3P3/1B3PP1/1BR3K1/w Rc1c7 r1bq4/1p4kp/3p1n2/5pB1/p1pQ4/8/1P4PP/4RRK1/w Re1e8 r1bqkbnr/2pp2pp/p1n5/4p3/N3p3/1B3N2/PPPP1PPP/R1BQK2R/w Nf3xPe5 r1k4r/ppp1b3/5Npp/4pb1Q/8/1B2B3/PqP2PPP/2RR2K1/w Qh5xBf5+ r1r1k3/pp1qn2p/5pp1/3p2N1/6Q1/8/PP3PPP/2R1R1K1/w Re1xNe7+ r1r3k1/1q2bp1p/4p1p1/1b2B3/1p4Q1/1P1BR3/P4PPP/R5K1/w Bd3xPg6 r1r3k1/2pq2pp/bp3p2/p7/P1NPp3/1P2P3/2R1QPPP/2R3K1/w Nc4xPb6 r1r3k1/Bn2qp1p/2p3pb/1p2n3/1P2Pp2/1NP4P/4B1P1/R2R1QK1/b Pf4f3 r2q1rk1/6p1/3p3p/p2Pp3/5bP1/1PNR1p1P/PQ3P2/5R1K/b Pe5e4 r2q1rk1/ppp2ppp/3b2n1/1N1P4/2BBP3/P4pP1/1PQ2PbP/R3R1K1/b Ng6f4 r2q3r/pp1nbkpp/4p3/3p3P/b1p2B2/2P2N1R/PP1RQPP1/1BK5/w Bb1g6+ r2qk2r/ppp2pp1/2np1n2/2b1p1B1/2B1P3/3P1Np1/PPP2PP1/RN1Q1RK1/b Nf6g4 r2qkbnr/ppp1pppp/8/3Pn3/6b1/2N2N2/PPP2PPP/R1BQKB1R/w Nf3xNe5 r2qr1k1/pp3pbp/3p1np1/2pP1bB1/2P1N3/3Q1PN1/PP4PP/R4RK1/b Nf6xNe4 r2r2k1/pq3ppp/1p1bpn2/8/2PN3Q/1P6/PB3PPP/3RR1K1/w Nd4xPe6 r3k2r/pp1bppbp/1qnp2p1/1N6/3NnPP1/4B3/PPP1B2P/R2QK2R/w Nd4e6 r3kb1r/1bq1nppp/p7/1pp5/4Q3/1B3N2/PP3PPP/R1BR2K1/w Bb3xPf7+ r3r1k1/pp1Rbpnp/q1p1p1p1/4P3/1PP2QP1/P3B2P/4BP2/R5K1/w Be3c5 r3r3/5qpk/ppR2B1p/3p3P/n2P4/P2P2Q1/5PP1/2R3K1/w Bf6xPg7 r4k1r/4Rppp/n1N2n2/1q1p1Q2/5B2/8/PPP2PPP/2KR4/w Qf5xNf6 r4r1k/p6p/1pq2bb1/n2pB3/2pP2Q1/2P3N1/PP4PP/R4RK1/w Rf1xBf6 r4rk1/4npp1/p1b1p3/qpp1P1P1/4NBQ1/2PP2P1/P4P2/R3R1K1/w Ne4f6+ r4rk1/pp2ppbp/6p1/8/Qnq1P3/2N1BPPb/PP4NP/R4RK1/b Bh3xNg2 r4rk1/ppp3p1/2bpq3/5pPR/3Qn3/5N2/PPP2PP1/2K4R/w Nf3e5 r5k1/1ppq1pb1/p2p1n1p/3P2p1/7Q/1P1B2RP/PBP2PP1/6K1/w Bb2xNf6 r5k1/3rbpnp/p3q1pB/1pp1P3/3p1PP1/3P2NP/PP2Q3/R1R3K1/w Bh6xNg7 r5k1/pp3pbp/2pprnp1/q3n3/2P1P3/P1N1B1PP/1P3P2/R2QRBK1/b Nf6xPe4 r7/5k1p/2pP2p1/1p6/1q3B2/1p2Q1P1/1P6/rNK1R2R/b Ra1xNb1+ rn2kbr1/pp3p1p/2p5/q2Pp3/6b1/1BN2Q2/PPP1NPPP/R3K2R/w Qf3xPf7+ rnbq1rk1/pp2b1pp/5n2/2pPp3/2P1N3/3B1N2/PP4PP/R1BQK2R/w Pd5d6 rrq1k3/2p2p2/3pb1p1/3N2Pp/p1PpPR2/P2P3P/1P6/K2Q1R2/w Rf4xPf7 2r3k1/1q1rbpp1/p2p1n2/nppPpPN1/8/1PP1B2P/P1BQ1P2/5KRR w Ng5e6 Phalanx-XXII/pbook.phalanx0000644000175000001440000013715510314125617015135 0ustar sombrausers# sorted Phalanx opening book 20000116 00r1b1k1nr2p2pppp1p8p5bPPpP1q4P3PP1B1QPPRN2K1NR h5f7 00r1b1k1nr2p2pppp1pb7P1q5PpN1P4P3PP3PP1RNBQK2R c3d4 00r1b1k1nr2p2pppp2b7p1q1Q3PpN1P4P3PP3PP1RNB1K2R f4h4 00r1b1k1nr2p2pppp2b7p3N3Pp2P4P3PP3PP1RNB1K2R c1g5 00r1b1k1nrpppp1ppp2n7b9P2q3N4PPPP1PPPRNBQKB1R c4b3! h5e5 00r1b1k2r2p1bpppp1p8p1n4PPp2P4P1P1PP2NP2RNB1K2R d4c5 00r1b1k2r2p2pppp1pb1n1q3P7PpN1P2N1P3PP3PP1R1BQK2R g2g4 00r1b1k2rppp1bppp2n2n5p2q4Pp3BPP1P3P2Q1PPPRN2KBNR o-o 00r1b1kb1r1pp2ppp5n2p2p2q2n1Pp3BPP1P3P2Q1PPPRN2KBNR b5d6 00r1b1kb1rpp3ppp2n2n4pq15BPN2PP3PPPRNBQK2R c3b5 00r1b1kb1rpp3ppp5n3Bpq5n10PN2PP3PPPRNBQK2R c1d2 00r1b1kb1rppp2ppp2n2n5p2q4Pp3BP2P3P1P2PPPRN1QKBNR c3b5 00r1b1kb1rppp2ppp5n5p2q2n1Pp3BP2P3P1PQ1PPPRN2KBNR a2a4 00r1b1kb1rppq2ppp2n1pn4pp7P6PBPN2PP1N1PPPR1BQK2R f1e2! c1d2 b2b3 00r1b1kbnr2p2pppp1n6p1P2q1B2Pp7P3PP2NPPPRNBQK2R c3b5 b4a5 00r1b1kbnr2p2pppp1p8p2q3PPpP6P3PPQ3PPRNB1K1NR g4h5 g4g3 00r1b1kbnr2p2pppp1p8p6PPpP1q4P3PP3QPPRNB1K1NR f1b5 00r1bqk1nrpp3ppp2nbp4Bpp6P7N1PN2PP1P1PPPR1BQK2R g1e2! g1f3 00r1bqk1nrppp2ppp2np5Bb1p7P5N2N2PPPP1PPPR1BQK2R c1g5! c1d2 g1f3 g1e2 00r1bqk1nrppp2ppp2np6b1p5B1P5N2N2PPPP1PPPR1BQK2R c1g5! f2f4! g1f3 00r1bqk1nrpppn1ppp11p5bPP12PP1B1PPPRN1QKBNR d1e2! b5d7 00r1bqk1nrpppp1ppp1bn15P6N6PP2PPPPRNBQKB1R d1h5 00r1bqk1nrpppp1ppp2n7b1p5B1P5N5PPPP1PPPR1BQK1NR d1g4! g1f3 00r1bqk1nrpppp1ppp2n7b1p5B1P8N2PPPP1PPPRNBQK2R d2d3! g1f3 00r1bqk2rpp3ppp2nb1n5pp4PP5P3PN5N1PPPR1BQKB1R d4d5! e4e5 00r1bqk2rpp3ppp2nb5Bp1p11P1P1PN3P3PPPR1BQK2R e4e5 o-o 00r1bqk2rpp3ppp2nb5Bpnp11P1N1PN3P1P1PPPR1BQK2R d4c6! d3c2 00r1bqk2rppp1bppp2n8np14P1NP1PP2PPBPRNBQK2R o-o! c1e3 00r1bqk2rppp1nppp2np5Bb8NP5N5PPP2PPPR1BQK2R c4d5 o-o 00r1bqk2rppp2ppp1bn2n6p7P3N1PB1N2PP3PPPR1BQK2R c1e3 00r1bqk2rppp2ppp1bnp1n6P7P5PB1N2PP3PPPRNBQK2R d3e4 00r1bqk2rppp2ppp2nb7np11P1N1P4PQP1PPPR1B1KBNR c1e3!! d4c6 00r1bqk2rppp2ppp2np1n4b1p5B1P5NP1N2PPP2PPPR1BQK2R c1g5!! c3a4! c1e3! 00r1bqk2rpppp1ppp2n2n4b1p5P1P5N5PP1PBPPPR1BQK1NR d2d3 00r1bqk2rpppp1ppp2n2n4b9P8N2PPPP1PPPRNBQKB1R f3e5 00r1bqk2rpppp1ppp2n2n5Np4b2P8N2PPPP1PPPR1BQKB1R b5a4 00r1bqkb1r1p2p1pp2n2p2pBPp8nB4P1PN2PP3PPPRN1QK2R c1g5 e2e4 00r1bqkb1r1p2pppp2n2n2p1Pp9B4P2N2PP2PPPPRN1QKB1R e2e3! f3e5 00r1bqkb1r1p3pppp1n1pn4pp6PP4P1N1PN3P3PPPR1BQKB1R b2b3! d4c5 00r1bqkb1r5pppppn1pn4pp6PP4P1NBPN3P3PPPR1BQK2R f1d3 00r1bqkb1rpp1npppp5n3Bpp7P8PN2PPP2PPPRNBQK2R a2a3 d1a4 e2e3 00r1bqkb1rpp1p1ppp2n1pn12PN8P3PP3PPPRNBQKB1R d2d4 00r1bqkb1rpp1p1ppp2n1pn4p7PP8PN2PP3PPPRNBQKB1R c4d5 d2d4 00r1bqkb1rpp1p1ppp2n1pn4p9P5N2N2PPPPBPPPR1BQK2R f1e2 a2a3 d2d4 00r1bqkb1rpp1p1ppp2n2n4p7P1p6PP3PP3PPPRNBQKBNR e5d6 00r1bqkb1rpp1p1ppp2n2n4p7P8BP3PP3PPPRNBQK1NR d2d4 00r1bqkb1rpp1ppp1p2n2np2Bp9P5N2N2PPPP1PPPR1BQK2R f1g2 c3d5 00r1bqkb1rpp1ppppp2n2n4p7P9PN2PP1P1PPPRNBQKB1R g2g3 e2e3 00r1bqkb1rpp1ppppp2n2n4p8P6P2N2PP2PPPPRNBQKB1R d2d4!! e2e3! c4d5 00r1bqkb1rpp1ppppp2n2n4p8P8PN2PPP2PPPRNBQKB1R d2d4! c4d5 00r1bqkb1rpp1ppppp2n2n4p9P5N2N2PPPP1PPPR1BQKB1R g2g3! d2d3 e2e3 d2d4 00r1bqkb1rpp2pp1p2np1np3p9P5NP1NP1PPP2P1PR1BQKB1R f1g2 00r1bqkb1rpp2pppp2n2n4pp13P2PN2PBPP1PPPRN1QKB1R a2a3 c1g5 00r1bqkb1rpp2pppp2n2n4pp15P1NP1PPP1PPBPRNBQK2R e2e4 g2g3 00r1bqkb1rpp2pppp2n2n4pp6PP8PN2PP3PPPRNBQKB1R c4d5!!! e2e3 00r1bqkb1rpp2pppp2n2n4pp7P6P1PN2PP3PPPRNBQKB1R e2e3! c1g5 00r1bqkb1rpp2pppp2n2n4pp7P8PN2PPP1BPPPRNBQK2R c1g5!! c1f4! c4d5 00r1bqkb1rpp2pppp2n2n5p7P9N2PPP1BPPPRNBQK2R c1g5! c1f4 00r1bqkb1rpp2pppp2n6Bpn16PN2PP1P1PPPRNBQK2R c1d2! g2g3 00r1bqkb1rpp3ppp2n2n4pP15BP3PP3PPPRNBQK1NR d1d4 00r1bqkb1rpp3ppp2n2n4ppp7P6P1N2PPPNBPPPR1BQK2R f1e2!! g2g3 00r1bqkb1rpp3ppp2n2n4ppp7P6P1NP1PPPN1P1PR1BQKB1R f1e2!! g2g3 00r1bqkb1rpp3ppp2n2n4ppp7P6P2P1PPPN1PBPR1BQK1NR f1e2 00r1bqkb1rppp2ppp2n2n5pp14P1NP1PPP1PPBPRNBQK2R f1e2! c1g5 h2h3 00r1bqkb1rppp2ppp2n8np11P1N1P4P1P1PPPR1BQKBNR f1e2 g2g3 00r1bqkb1rppp2ppp2n8np11P2P1N3P2PPPPRNBQKB1R c1g5! c1e3! f1e2! f1c4 f2f4 f2f3 00r1bqkb1rppp2ppp2n8np11P3P4PQP1PPPRNB1KBNR g2g3 f1e2 f1d3 00r1bqkb1rppp2ppp2n8np13N1PN2PP1P1PPPR1BQKB1R d4b5! d4c6 00r1bqkb1rppp2ppp2n8np13NP1N2PP2PPPPR1BQKB1R c1g5!! f1c4! f1e2 00r1bqkb1rppp2ppp2n8np14P1NP1PP2PP1PRNBQKB1R c1e3!!! f1e2! g2g3! f1c4 f2f4 00r1bqkb1rppp2ppp2n9p4n2P5NP1N2PP3PPPR1BQKB1R c1g5!! c3d5 00r1bqkb1rppp2ppp2p2n21P4PPP1BPPPRNBQK2R c1e3! c1f4 00r1bqkb1rppp2ppp5n5pn15P3PPPNBPPPR1BQK1NR f1d3 00r1bqkb1rppp4p2np1nN12Pp2Q8PPP2PPPRNB1KB1R c3d5 00r1bqkb1rpppp1ppp2n2n6p7P5N2N2PPPP1PPPR1BQKB1R f1b5! d2d4 00r1bqkb1rpppp1ppp2n2n6p7P6P1N2PPP2PPPRNBQKB1R d2d4! f1c4 00r1bqkb1rpppp2pp2n2n6N6Pp11PPP1BPPPRNBQK2R d2d4 d2d3 d1e2 00r1bqkbnr1p4p1p4n5p1p1pN2Pp4Q2P3PP1NBPPPR1B1K2R h1h3 00r1bqkbnr1pp2pppp1n8pP4P8P5P3PPPPRNBQKBNR c3e4 00r1bqkbnr2p2pppp1n6p1P4B2Pp7P3PP3PPPRNBQK1NR d1g4!! c3b5 00r1bqkbnr2p2pppp1p8p6PPp7P3PP2NPPPRNBQK2R d1g4! g1f3 00r1bqkbnr2p2pppp1p8p6PPp7P3PPQ2PPPRNB1K1NR d1g4! g1f3 00r1bqkbnrpp1n1ppp2p8p6PPp7P3PP1N1PPPRNBQKB1R f1d3!! f2f4 00r1bqkbnrpp1p1ppp2n7p8P9N2PP2PPPPRNBQKB1R d2d4! c4d5 00r1bqkbnrpp1ppppp2n7p17PN2PPPP1PPPRNBQKB1R d2d4! g1f3 e2e4 00r1bqkbnrpp1ppppp2n7p18NP1PPPPPP1PRNBQKB1R e2e4! d2d4 g2g3 00r1bqkbnrpp1ppppp2n7p19P1PPPPPPBPRNBQK1NR d2d4! g2g3 g1f3 00r1bqkbnrpp1ppppp2n7p7P10N2PP1PPPPPRNBQKB1R g1f3! g2g3 00r1bqkbnrpp1ppppp2n7p8P8P3PPP2PPPRNBQKBNR d2d4! c4d5 00r1bqkbnrpp1ppppp2n7p9P8N2PPPP1PPPRNBQKB1R g1f3! g2g3 00r1bqkbnrpp2pppp2n6Bpp16PN2PPPP1PPPRNBQK2R e2e3!!!! d1c2!! a2a3 g1f3 00r1bqkbnrpp2pppp2n7pp15P1N2PPPNPPPPR1BQKB1R e2e4 g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp15P1NP1PPP1PP1PRNBQKB1R g1f3 g2g3 e2e4 00r1bqkbnrpp2pppp2n7pp15P2P1PPP1PPBPRNBQK1NR e2e4! g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp17NP1PPPPPPBPRNBQK2R e2e4 g1f3 g2g3 00r1bqkbnrpp2pppp2n7pp6P9PN2PP1P1PPPRNBQKB1R d4d5! g1f3! e2e3 00r1bqkbnrpp2pppp2n7pp7P6P1P3PP3PPPRNBQKBNR e2e3! g1f3! c4d5 00r1bqkbnrpp2pppp2n7pp7P8P3PPP1BPPPRNBQK1NR g1f3!! c4d5 c1f4 00r1bqkbnrpp2pppp2n7pp7P8PN2PPP2PPPRNBQKB1R c1g5!!! g1f3 c4d5 c1f4 00r1bqkbnrpp2pppp2n7pp7P9NP1PPP1PP1PRNBQKB1R c1g5 c1f4 c4d5 g1f3 d1b3 00r1bqkbnrpp2pppp2n7pp8P6P4PPPN1PPPR1BQKBNR g1f3 e2e4 00r1bqkbnrpp2pppp2n8p7P12PPP1BPPPRNBQK1NR c1f4! g1f3 00r1bqkbnrpp2pppp2n8p7P6N5PP2PPPPR1BQKBNR g1f3! c1f4 00r1bqkbnrpp2pppp2n8p7P9N2PPP2PPPRNBQKB1R c1g5!! g1f3 00r1bqkbnrpp3ppp2n1p4Bpp6P9PN2PP1P1PPPRNBQK2R f1d3! g1f3 g1e2 00r1bqkbnrpp3ppp2n7ppp14P1NP1PPP1PPBPRNBQK2R g1f3 f1e2 f2f3 00r1bqkbnrpp3ppp2n7ppp14P2P1PPPNPPBPR1BQK1NR g1f3 00r1bqkbnrpp3ppp2n7ppp7P6P1N2PPPN1PPPR1BQKB1R g1f3! g1e2 00r1bqkbnrpp4p6n5p1p1p3Pp4QN1P3PP1NBPPPR1B1K2R a2a3 00r1bqkbnrpp4pp2p2n5p1p4PPp4QN1P3PP1N1PPPR1B1KB1R h2h4 g2g3 00r1bqkbnrppp1pppp2n8p7P1P10PPP1P1PPRNBQKBNR c1f4 c1g5 00r1bqkbnrppp1pppp2n8p7P6P5PP2PPPPRNBQKBNR e2e4 00r1bqkbnrppp1pppp2n8p7P9N2PPP1PPPPRNBQKB1R c1g5 00r1bqkbnrppp1pppp2n8p9P7N2PPPPP1PPRNBQKB1R c1g5 00r1bqkbnrppp1pppp2n8p9P8P1PPPPP2PRNBQKBNR e2e4 00r1bqkbnrppp2ppp11pn13P5PP1NPPPPR1BQKBNR f1c4! g1f3 00r1bqkbnrppp2ppp11pn6P10P1PPP1P2PRNBQKBNR e4g5 00r1bqkbnrppp2ppp2n6B1p7Pp4P2P3P1P2PPPRNBQK1NR d1g4! a2a3 00r1bqkbnrppp2ppp2n6B1p7Pp7P3PPPQ1PPPRNB1K1NR d1g4 a2a3 g1f3 c1d2 00r1bqkbnrppp2ppp2n6B1pp6P8P3PPP2PPPRNBQK1NR e4e5!!!!! g1e2 e4d5 00r1bqkbnrppp2ppp2n8p7Pp7P3PPPN1PPPRNBQKB1R f2f4!!! g1f3 00r1bqkbnrppp2ppp2n8pP17P1PPPPP2PRNBQKBNR c3e4 00r1bqkbnrppp2ppp2n8pp14P1NP1PPP1PP1PRNBQKB1R f1e2 g1f3 f2f4 c1e3 00r1bqkbnrppp2ppp2n8pp14P2P1PPP1PPBPRNBQK1NR f1e2 c1e3 g1f3 f2f4 00r1bqkbnrppp2ppp2n8pp4P1P6P5P3PPPPRNBQKBNR a2a3 00r1bqkbnrppp2ppp2n8pp6P8PN2PPP2PPPRNBQKB1R c1g5!! e4e5! 00r1bqkbnrppp2ppp6n4p14P3B1PP2PPPPRN1QKBNR h2h4 g1f3 00r1bqkbnrppp3pp2np8N2Q3Pp11PPP2PPPRNB1KB1R g2g3 00r1bqkbnrppp4p2np2N8Q3Pp11PPP2PPPRNB1KB1R g1f3 00r1bqkbnrpppn1ppp11p7Pp7P3PPPN1PPPRNBQKB1R c2c3! f1d3 f2f4 00r1bqkbnrpppn1ppp11pp5PP8P3PP3PPPRNBQKBNR e4d5 g1f3 00r1bqkbnrpppp1ppp2n13Q15PPP1PPPPRNB1KBNR d2d4 g1f3 f1c4 00r1bqkbnrpppp1ppp2n9p14P1N2PPP1PPPPRNBQKB1R d2d4!! g1f3 f2f4 00r1bqkbnrpppp1ppp2n9p5B1P11PPPP1PPPRNBQK1NR f1c4! g1f3! f2f4! g2g3 00r1bqkbnrpppp1ppp2n9p5P7N5PP1PPPPPR1BQKBNR g2g3!! g1f3! g1e2 00r1bqkbnrpppp1ppp2n9p5P8P4PP2PPPPRNBQKBNR g2g3! f2f4! g1e2 g1f3 00r1bqkbnrpppp1ppp2n9p6P6P5PP2PPPPRNBQKBNR d2d4!! g1f3! d1f3 00r1bqkbnrpppp1ppp2n9p6P8P3PPP2PPPRNBQKBNR d2d4!! g1f3 00r1bqkbnrpppp1ppp2n9p6P9N2PPP1PPPPRNBQKB1R e4e5 e4d5 00r1bqkbnrpppp1ppp2n9p7P5N5PPPP1PPPR1BQKBNR f1c4! g1f3! g2g3 00r1bqkbnrpppp1ppp2n9p7P8N2PPPP1PPPRNBQKB1R f2f4 g2g3 f1c4 g1f3 00r2qk2rppp1bppp2n1b6np13NP1NP1PP2PPBPR1BQK2R o-o! d4b3 00r2qk2rppp2ppp1bn1bn6p7P3N1PB1N2PP2QPPPR1B1K2R f3d2 00r2qk2rppp2ppp2np1n4b1p5B1P1b3NP1N1PPPP2PP1R1BQK2R g5f6! g5e3 00r2qkb1rpp1bpppp2n6Bpn14N1PN2PP1P1PPPR1BQK2R d4c2 e2e3 00r2qkb1rpp2pppp2n2n4pp7P2b5PN1PPPP1BPP1RNBQK2R g5h4! g5f6 00r2qkb1rpp3ppp2n1b5p1p15N1P1PP1PPPBPR1BQK2R a1c1! d1d2 00r2qkb1rpp3ppp2n1pn4pp4Q2P2b3P1PN2PP1N1PPPR1B1KB1R f3d2!!! c4d5 00r2qkb1rppp3pp2n8npp8b1PQ1PPN3P3PPPRNB1KB1R d1d2! d4b3 00r2qkb1rpppn1ppp4pn5p6P3b2P2PN2P2PBPPPRNBQK2R f1d3!! c2c3 00r2qkbnrp3pppp2p7Pp3b14P1PPP1PP1PRNBQKB1R e2e3 g1f3 00r2qkbnrpp2pppp2n7pp7P2b5PN2PPP1BPPPRNBQK2R g1f3 e2e3 00r2qkbnrpp2pppp2n7pp7P2b5PN2PPPN1PPPR1BQKB1R e2e3! c4d5 00r2qkbnrpp2pppp2n7ppN6P2b7P1PPP1PP1PRNBQKB1R g5h4 c3e4 00r2qkbnrpp2pppp2n8p7P2b6N2PPP1BPPPRNBQK2R e2e3! g1f3 00r2qkbnrpp3ppp2n1p5pp7P2b3P1PN2PP1N1PPPR1BQKB1R g1f3!! c4d5 00r2qkbnrppp1pppp2n8p7P1Pb7P1PPP1P2PRNBQKBNR e2e3 h2h4 00r2qkbnrppp2ppp2n1p6p1b5P1P6PN2PPP3PPRNBQKB1R g1f3 f1d3 00r2qkbnrppp2ppp2n8p7Pp1b5P3PPPNBPPPRNBQK2R g5e7!! h2h4 00r3k2rpp1qbppp2n1b5p1p14PN1P1PP1BPPBPR2QK2R o-o 00r3k2rpppbqppp2n2n3Bbp4Q4B4P1PN2PP3PPPRN2K2R o-o-o! a2a3 f3e5 00r3kb1rpQpq2pp2n8npp8b1P2PPN3P3PPPRNB1KB1R a1b1! d4b3 00r3kb1rpp1b1ppp5n3BpQ5n10PN2PP3PPPRNB1K2R f3d4 00r3kb1rpp1q1ppp2n1b5p1p14PN1P1PP2PPBPR1BQK2R f1e2 00rn1qk2rpp1B1ppp5n5pp4b8N5PPPPNPPPR1BQK2R d1d2! b1d2 00rn1qkb1rp2bpp1p1p3np3pp12BP2PN2P1PPBPPPRN1QK2R f1g2! b1c3 00rn1qkb1rpp2pppp5n4pp7P2b5PN2PPP1BPPPRNBQK2R e2e3 b1c3 00rn1qkb1rppp1pppp5n5p7P2b5PN2PPP2PPPRNBQKB1R c2c4 e2e3 00rn1qkb1rppp2ppp4pn5p6P3b5PN2PP1PBPPPRNBQK2R b1d2! d4c5 00rn1qkb1rppp2ppp4pn5p7P2b5PN2PPP1BPPPRNBQK2R c2c4! b1d2 00rn1qkbnrppp1pppp11p3b5PP8PPPPPP3RNBQKBNR h4g3! e2e3 00rn1qkbnrppp1pppp11p9Pb7P1PPPPP2PRNBQKBNR b1c3 00rn1qkbnrppp1pppp11p9Pb8PPPPPP1P1RNBQKBNR g5h4 00rn1qkbnrppp1pppp11pN9b9PPPPPPPPRNBQKB1R g5f4! g5h4 00rn2k2rpp2npp3pb1q1p3pNB5P6N5PPP1QPPPR1B1K2R f3f4 00rn2k2rpp2npp3pb3p3pNq5P2P3N5PPP1QP1PR1B1K2R f4e3 00rn2k2rpp2npp3pbq2p3pN6P1PP3N5PPP1Q2PR1B1K2R f2f4 00rnb1k1nrpp3pp3pb1q1p3p7P6NB1N2PPP1QPPPR1B1K2R g1e2 00rnb1k1nrpp3ppp2pb1q5p7P6NB1N2PPP2PPPR1BQK2R h2h3 00rnb1k2rpp2npp3pb1q1p3pN6P6NB4PPP1QPPPR1B1K2R c1f4 00rnb1kb1rpp2qppp10p8Np3B1P5P1PPQPPPR3KB1R b2b3 b1d2 00rnb1kb1rppp1qp7n1p3p2p4P10B1PPP1NPPPRN1QKB1R f3e5 00rnb1kb1rppp1qpp6n1p3p7P3B8PPP1NPPPRN1QKB1R g2g4 00rnb1kbnrppp2ppp11qp13N5PPPP1PPPR1BQKBNR d4e3 d4a4 00rnb1kbnrppp2ppp4q7p13N2N2PPPP1PPPR1BQKB1R b1c3 c1d2 00rnbqk1nrpp1p1ppp2p7b1p5B1P8N2PPPP1PPPRNBQK2R d2d4 00rnbqk1nrpp1pppbp6p3p9P5P2N2PP1P1PPPRNBQKB1R d2d4! g1f3 00rnbqk1nrpp2ppbp6p3pp7P6P2NP1PP2PP1PRNBQKB1R c4d5! g1f3 00rnbqk1nrpp2ppbp6p3pp7P9NP1PPP1PPBPRNBQK2R g1f3 c4d5 00rnbqk1nrpp3ppp2p7bPp5B10N2PPPP1PPPRNBQK2R e4e5 00rnbqk1nrpp3ppp2pb7p7P6NB4PPP2PPPR1BQK1NR d1f3 g1e2 g1f3 00rnbqk1nrppp2ppp3p6b1p7P5N2N2PPPP1PPPR1BQKB1R b1c3 g1f3 00rnbqk1nrpppp1ppp10b1p5B1P11PPPP1PPPRNBQK1NR b1c3! g1f3 c2c3 00rnbqk1nrpppp1ppp10b1p7P8N2PPPP1PPPRNBQKB1R d2d3 g1f3 b1c3 00rnbqk2rpp1p1ppp2p2n4b1p5B1P5N2N2PPPP1PPPR1BQK2R d2d4!!! b2b4 d2d3 00rnbqk2rpp1p1ppp2p2n6p4bB1P5N5PPPPNPPPR1BQK2R o-o! d2d4 00rnbqk2rpp1pppbp5np3p10P7NP1PPPPP1BPRNBQK2R d2d4 o-o 00rnbqk2rpp2ppbp5np4p13N4P1PPP1PPBPRNBQK2R o-o b1c3 00rnbqk2rpp3ppp2p2n4bPp5B7N2N2PPPP1PPPR1BQK2R c3d4!!! e4e5! e1g1 00rnbqk2rpp3ppp2p2n5pp4b2P4BN2N2PPPP1PPPR1BQK2R o-o! d1e2 00rnbqk2rpp3ppp2pp1n4b1p5B1P5NP1N2PPP2PPPR1BQK2R b2b4 c4b3 o-o b1d2 00rnbqk2rpp3ppp5n3Bbpp13N2N2PPPP1PPPR1BQK2R b1c3 c1d2 00rnbqk2rppp1bppp5n5p2B4Np6PP3PPP2PPPRN1QKB1R e1g1! h2h3 00rnbqk2rppp2ppp3b7np11P1N1P4P1P1PPPR1BQKBNR d4c6! c1e3 00rnbqk2rppp2ppp3p1n4b1p5B1P5N2N2PPPP1PPPR1BQK2R b1c3! c2c3! o-o 00rnbqk2rppp2ppp5n4bPp13N2N2PPPP1PPPR1BQKB1R e1g1 e4e5 00rnbqk2rpppp1ppp11Pp4b14PPPP1PPPR1BQKBNR o-o 00rnbqk2rpppp1ppp5n2b3p7P3P1N2N3PPP1PPPR1BQKB1R e1g1!!! d2d4! d2d3 d1e2 00rnbqk2rpppp1ppp5n4b1p1B5P6P4PPP2PPPRN1QKBNR b1c3 00rnbqk2rpppp1ppp5n4b1p5B1P5N5PPPP1PPPR1BQK1NR c2c3!!!! b2b4!!! d2d3 00rnbqk2rpppp1ppp5n4b1p7P5N2N2PPPP1PPPR1BQKB1R d2d4 f3g5 d2d3 00rnbqk2rpppp1ppp5n4bNp7P11PPPP1PPPR1BQKBNR f3d4 00rnbqk2rpppp1ppp5n5Np4b2P11PPPP1PPPR1BQKBNR f3d4 00rnbqk2rpppp1ppp5n6p4b2P3P1N6PPP1PPPR1BQKBNR b5a4!!! b5c6 00rnbqk2rpppp1ppp5n6p4b2P5N2N2PPPP1PPPR1BQKB1R e1g1!! b1c3! d2d3 d1e2 00rnbqk2rpppp1ppp5n6p4b2PP4N5PPPP2PPR1BQKBNR b1c3! d2d3 00rnbqkb1r1p3ppp4pn2p1Pp5P6P8BP1PPPPRN1QKBNR a4b5 00rnbqkb1r1p3ppp4pn4Pp5P15BP1PPPPRN1QKBNR a1a8 00rnbqkb1r1p3pppp1p2n4Pp7Pp4QN1P3PP3PPPR1B1KBNR b1d2! g2g3 00rnbqkb1rpp1ppp1p5np3p8P8PN2PPP2PPPRNBQKB1R f1g2! b2b3 00rnbqkb1rpp1ppppp5n13P12PPP2PPPRNBQKBNR d2d4 00rnbqkb1rpp1ppppp5n4p10P7N2PPPPP1PPRNBQKB1R g2g3 d2d4 00rnbqkb1rpp1ppppp5n4p15P2N2PP1PPPPPRNBQKB1R d2d4 b1c3 00rnbqkb1rpp1ppppp5n4p17PN2PPPP1PPPRNBQKB1R d2d4! b1c3 g2g3 00rnbqkb1rpp1ppppp5n4p7P10N2PP1PPPPPRNBQKB1R b1c3 g2g3 00rnbqkb1rpp1ppppp5n4p8P6P5PP2PPPPRNBQKBNR d2d4!! e2e3 b2b3 00rnbqkb1rpp1ppppp5n4p8P8P3PPP2PPPRNBQKBNR d2d4 c4d5 g2g3 00rnbqkb1rpp2pp1p5np4p6PP6N5PP3PPPR1BQKBNR f1g2! b1c3 00rnbqkb1rpp2pppp5n3Bpp16PN2PPPP1PPPRNBQK2R c1d2! b1d2 00rnbqkb1rpp2pppp5n4Pp12P8PP1PPPPRNBQKBNR e2e3 00rnbqkb1rpp2pppp5n4Pp6P13PP2PPPPRNBQKBNR e2e3! d4d5 00rnbqkb1rpp2pppp5n4pp13P2PN2P1PP1PPPRNBQKB1R g2g3! b1c3 a2a3 e2e3 00rnbqkb1rpp2pppp5n4pp13P3N2PBPPPPPPRN1QKB1R b1c3 g2g3 00rnbqkb1rpp2pppp5n4pp15P1N2PPPNPPPPR1BQKB1R b1c3! g2g3 00rnbqkb1rpp2pppp5n4pp15P1NP1PPP1PP1PRNBQKB1R b1c3 g2g3 00rnbqkb1rpp2pppp5n4pp17NP1PPPPPPBPRNBQK2R g2g3! b1c3 00rnbqkb1rpp2pppp5n4pp6P9PN2PP1P1PPPRNBQKB1R d4d5! b1c3! e2e3 00rnbqkb1rpp2pppp5n4pp6PP8P3PP3PPPRNBQKBNR c4d5!! e2e3 00rnbqkb1rpp2pppp5n4pp7P6P2N2PP2PPPPRNBQKB1R b1c3!! e2e3 c4d5 00rnbqkb1rpp2pppp5n4pp7P8PN2PPP2PPPRNBQKB1R c1g5! b1c3! g2g3 c4d5 e2e3 00rnbqkb1rpp2pppp5n5p6PP12PP3PPPRNBQKBNR b1c3 g2g3 00rnbqkb1rpp3ppp2p2n5p6PPp4QN1P3PP3PPPR1B1KBNR f1e2 00rnbqkb1rpp3ppp4pn4Pp5P6P9P1PPPPRNBQKBNR a2a4 00rnbqkb1rpp3ppp4pn4pp6PP8PN2PP3PPPRNBQKB1R b1c3! c4d5 00rnbqkb1rpp3ppp5n4pp7P7B1N2PPP2PPPRNBQK2R b1c3 00rnbqkb1rpp3ppp5n5p2B4Q6N5PP2PPPPR3KBNR f1e2! b1c3 00rnbqkb1rppp1pp1p5np4p17NP1PPPPPPBPRNBQK2R f1g2 c2c4 00rnbqkb1rppp1pppp5n5p13P3N2P1PPPPPPRNBQKB1R c2c4 g2g3 c1f4 c1g5 00rnbqkb1rppp1pppp5n5p15P1N2PPP1PPPPRNBQKB1R c2c4! g2g3 c1f4 b1c3 00rnbqkb1rppp1pppp5n5p16PN2PPPP1PPPRNBQKB1R c2c4 c1g5 00rnbqkb1rppp1pppp5n5p17NP1PPPPPP1PRNBQKB1R c2c4! g2g3! c1f4! c1g5 b1c3 00rnbqkb1rppp1pppp5n5p6P10N2PP1PPPPPRNBQKB1R d4d5! c2c4! c2c3 00rnbqkb1rppp1pppp5n5p6P9P3PP1P1PPPRNBQKBNR e2e4!! c2c4 e2e3 c2c3 g2g3 00rnbqkb1rppp1pppp5n5p6PP12PP2PPPPRNBQKBNR c2c4! d4c5 00rnbqkb1rppp1pppp5n5p7P6P5PP2PPPPRNBQKBNR c2c4 00rnbqkb1rppp1pppp5n5p7P8P3PPP2PPPRNBQKBNR c2c4!!! g2g3! c1f4 00rnbqkb1rppp2ppp11np11P3P4P1P1PPPRNBQKBNR b1c3 f1d3 c2c4 00rnbqkb1rppp2ppp11np13N1P3PP1P1PPPR1BQKBNR b1c3! d4b5 00rnbqkb1rppp2ppp11np13N2N2PPPP1PPPR1BQKB1R b1c3 d4c6 00rnbqkb1rppp2ppp11np13N3P1PP1PPP1PR1BQKBNR c2c4! b1c3 00rnbqkb1rppp2ppp11np15PN2PP1P1PPPRNBQKB1R b1c3! f1d3 00rnbqkb1rppp2ppp11np5B7N5PPPP1PPPR1BQK1NR d4b3 c1e3 00rnbqkb1rppp2ppp5n5Pp13N5PPPP1PPPR1BQKBNR f3d4!! f1c4 00rnbqkb1rppp2ppp5n5Pp14P4PP2PPPPRNBQKBNR f3d4!!! d1d4 00rnbqkb1rppp2ppp5n5Pp14P4PPP2PPPRNBQKBNR f3d4! d1d4 00rnbqkb1rppp2ppp5n5p7P7B4PPP2PPPRNBQK1NR c2c4! b1c3! f1d3 00rnbqkb1rpppp1ppp5n6N14P4PPP2PPPRNBQKB1R d2d4! d2d3! b1c3 00rnbqkb1rpppp1ppp5n6p5P11P1PP1PPP1PRNBQKBNR c2c3 d2d4 b1c3 c2c4 00rnbqkb1rpppp1ppp5n6p5P7N5PP1PPPPPR1BQKBNR d2d4!!!!!! f1b5! c2c3 00rnbqkb1rpppp1ppp5n6p5P8P4PP2PPPPRNBQKBNR d2d4!!! f1b5 00rnbqkb1rpppp1ppp5n6p5P9P3PP1P1PPPRNBQKBNR d2d4! b1c3 c2c3 00rnbqkb1rpppp1ppp5n6p6P8P3PPP2PPPRNBQKBNR e4d5! b1c3 00rnbqkb1rpppp1ppp5n6p7P5N5PPPP1PPPR1BQKBNR f1b5!!!! f1c4!! d2d4!! b1c3!! c2c3 00rnbqkb1rpppp1ppp5n6p7P6P4PPP2PPPRNBQKBNR d2d4! f1c4 b1c3 00rnbqkb1rpppp1ppp5n6p7P8N2PPPP1PPPRNBQKB1R f3e5! d2d4! b1c3! f1c4 00rnbqkb1rpppp1ppp5n6p7P8P2PPPP2PPRNBQKBNR f3e5 f1c4 d2d4 00rnbqkb1rpppp1ppp5n6p7PP10PPPP2PPRNBQKBNR f3e5!!! f1c4 00rnbqkb1rpppppppp5n12P13PP1PPPPPRNBQKBNR e2e4! c2c4! g2g3 00rnbqkbnrpp1p1ppp10p1p6P6P5PP2PPPPRNBQKBNR e4d5! c4d5 00rnbqkbnrpp1p1ppp10p8P12PP2PPPPRNBQKBNR d2d4 c4d5 00rnbqkbnrpp1p1ppp10p8p6P2N2PP2PPPPRNBQKB1R d2d4 b1c3 00rnbqkbnrpp1p1ppp19p9N2PP2PPPPRNBQKB1R b1c3 d2d4 f1b5 00rnbqkbnrpp1p1ppp2p9p5P9P3PP1P1PPPRNBQKBNR d2d4!!! g1f3 00rnbqkbnrpp1ppp1p6p3p10P7N2PPPPP1PPRNBQKB1R f1g2 00rnbqkbnrpp1ppp1p6p3p15P2N2PP1PPPPPRNBQKB1R f1g2 g1f3 00rnbqkbnrpp1ppp1p6p3p17PN2PPPP1PPPRNBQKB1R f1g2 00rnbqkbnrpp1ppp1p6p3p7P11P1PP1PPP1PRNBQKBNR f1g2 b1c3 00rnbqkbnrpp1ppp1p6p3p7P7N5PP1PPPPPR1BQKBNR f1g2 b1c3 g1f3 00rnbqkbnrpp1ppp1p6p3p9P5N5PPPP1PPPR1BQKBNR f1g2 00rnbqkbnrpp1ppp1p6p3p9P8N2PPPP1PPPRNBQKB1R f1g2! b1c3 00rnbqkbnrpp1ppppp10p10P10PPPPP1PPRNBQKBNR b1c3 g1f3 g2g3 d2d4 00rnbqkbnrpp1ppppp10p14P6P1PPPPPPRNBQKBNR d2d4! b1c3 00rnbqkbnrpp1ppppp10p15P5PP1PPPPPRNBQKBNR b1c3 g1f3 d2d4 e2e4 00rnbqkbnrpp1ppppp10p16P4PPP1PPPPRNBQKBNR b1c3 d2d4 00rnbqkbnrpp1ppppp10p17P3PPPP1PPPRNBQKBNR d2d4! b1c3 g1f3 00rnbqkbnrpp1ppppp10p18N2PPPPPPPPRNBQKB1R b1c3! d2d4! g1f3 g2g3 00rnbqkbnrpp1ppppp10p19P1PPPPPP1PRNBQKBNR d2d4! b1c3 g1f3 g2g3 00rnbqkbnrpp1ppppp10p7P13PP1PPPPPRNBQKBNR g1f3! b1c3 g2g3 00rnbqkbnrpp1ppppp10p9P11PPPP1PPPRNBQKBNR b1c3!! g2g3 g1f3 00rnbqkbnrpp2pppp10Pp20PPP1PPPPRNBQKBNR g1f3! e2e4! e2e3 00rnbqkbnrpp2pppp10p3N5p11PPPP1PPPRNBQKB1R c1f4! g1f3 00rnbqkbnrpp2pppp10pp14P2N2PP1PPPPPRNBQKB1R g1f3! b1c3 00rnbqkbnrpp2pppp10pp15P1N2PPP1PPPPRNBQKB1R b1c3 g1f3 00rnbqkbnrpp2pppp10pp16PN2PPPP1PPPRNBQKB1R b1c3 g1f3 00rnbqkbnrpp2pppp10pp17NP1PPPPPP1PRNBQKB1R b1c3 g1f3 g2g3 00rnbqkbnrpp2pppp10pp18P1PPPPPPBPRNBQK1NR b1c3 g1f3 00rnbqkbnrpp2pppp10pp6P10N2PP1PPPPPRNBQKB1R g1f3! d4d5 e2e3 d4c5 00rnbqkbnrpp2pppp10pp7P6P5PP2PPPPRNBQKBNR g1f3!!!! b1c3!! c4d5 e2e3 00rnbqkbnrpp2pppp10pp7P8P3PPP2PPPRNBQKBNR b1c3!!! g1f3 c4d5 00rnbqkbnrpp2pppp10pp7PP11PPP2PPPRNBQKBNR d4e5 00rnbqkbnrpp2pppp10pp8P6P4PPP2PPPRNBQKBNR b1c3 g1f3 00rnbqkbnrpp2pppp10pp8P8N2PPPP1PPPRNBQKB1R d4e5 00rnbqkbnrpp2pppp10pp9P6P3PPPP2PPRNBQKBNR g2g3 b1c3 00rnbqkbnrpp2pppp11p7N12PPP1PPPPRNBQKB1R g1f3 e2e4 00rnbqkbnrpp2pppp11p7P12PP2PPPPRNBQKBNR g1f3 b1c3 00rnbqkbnrpp2pppp11p7P12PPP2PPPRNBQKBNR b1c3! g1f3 00rnbqkbnrpp3ppp10Ppp16N2PPP1PPPPRNBQKB1R e4e5! b1c3 00rnbqkbnrpp3ppp2p8P7Np11PP1PPPPPRNBQKB1R g1f3!! c3d4! d1d4 00rnbqkbnrpp3ppp2p8pp5PP8P3PP3PPPRNBQKBNR e4d5! e4e5 00rnbqkbnrpp3ppp4p5pp7P6P1P3PP3PPPRNBQKBNR b1c3! g1f3 00rnbqkbnrpp3ppp4p5pp7P6P2N2PP2PPPPRNBQKB1R b1c3!! g1f3 00rnbqkbnrppp1pp1p6p4p9P6P3PPPP2PPRNBQKBNR f1g2 00rnbqkbnrppp1pppp11p13P6P1PPPPPPRNBQKBNR e2e4! c2c4! b1c3 c1f4 00rnbqkbnrppp1pppp11p14P5PP1PPPPPRNBQKBNR e2e4! c2c4! g1f3 b1c3 00rnbqkbnrppp1pppp11p15P4PPP1PPPPRNBQKBNR e2e4! c2c4! g1f3 g2g3 00rnbqkbnrppp1pppp11p16P3PPPP1PPPRNBQKBNR e2e4! c2c4! g1f3 00rnbqkbnrppp1pppp11p17N2PPPPPPPPRNBQKB1R c2c4!!!! g1f3! c1g5! b1c3 00rnbqkbnrppp1pppp11p18P1PPPPPP1PRNBQKBNR e2e4!! c2c4! g1f3 b1c3 g2g3 00rnbqkbnrppp1pppp11p6P13PP1PPPPPRNBQKBNR e2e4! d4d5! g1f3 d4c5 c2c3 e2e3 00rnbqkbnrppp1pppp11p7P12PPP1PPPPRNBQKBNR c2c4!!!!!!! g1f3 c1f4 00rnbqkbnrppp1pppp11p9P10PPPPP1PPRNBQKBNR g2g3 g1f3 b1c3 c1g5 e2e4 c2c4 00rnbqkbnrppp2ppp11Pp19PP1PPPPPRNBQKBNR g1f3 00rnbqkbnrppp2ppp11Pp19PPPP1PPPRNBQKBNR d1d4! g1f3 00rnbqkbnrppp2ppp11p6PPp7P3PP3PPPRNBQKBNR c2c3 d4c5 00rnbqkbnrppp2ppp11p7N12PPP1PPPPRNBQKB1R c2c4! g1f3 00rnbqkbnrppp2ppp11p7Np6P4PPP1PPPPRNBQKB1R g1f3! c2c4 f2f4 00rnbqkbnrppp2ppp11p7P12PP2PPPPRNBQKBNR c2c4!! f1d3! 00rnbqkbnrppp2ppp11p7P12PPP2PPPRNBQKBNR g1f3! f1d3 00rnbqkbnrppp2ppp11p7PpB4P5PP2PPPPRN1QKBNR b1c3!! g1f3 h2h4 00rnbqkbnrppp2ppp11pp12P6PBPPPPPPRN1QKBNR f1d3 b1c3 00rnbqkbnrppp2ppp11pp14P2P1PPP1PP1PRNBQKBNR b1c3!! c2c4! f2f4 g1f3 00rnbqkbnrppp2ppp11pp17P1PPPPPPBPRNBQK1NR g1f3! b1c3! c2c4 00rnbqkbnrppp2ppp11pp5P9P3PP1P1PPPRNBQKBNR d4d5 g1f3 c2c3 00rnbqkbnrppp2ppp11pp6P6N5PPP1PPPPR1BQKBNR e4e5 e4d5 b1c3 00rnbqkbnrppp2ppp11pp6P6P5PP2PPPPRNBQKBNR b1c3!! b1d2! e4d5! e4e5 00rnbqkbnrppp2ppp11pp6P8P3PPP2PPPRNBQKBNR b1c3!!! b1d2!! e4e5! e4d5! 00rnbqkbnrpppp1ppp12p11P8PPPPPPPRNBQKBNR d2d4! b1c3 g1f3 b2b3 00rnbqkbnrpppp1ppp12p12P6P1PPPPPPRNBQKBNR d2d4! b1c3 00rnbqkbnrpppp1ppp12p13N5PPPPPPPPR1BQKBNR g1f3 b1c3 d2d4 00rnbqkbnrpppp1ppp12p13P5PP1PPPPPRNBQKBNR b1c3!!! d2d4!! d2d3 c2c4 00rnbqkbnrpppp1ppp12p14P4PPP1PPPPRNBQKBNR d2d4!!!! b1c3 f2f4 00rnbqkbnrpppp1ppp12p15P3PPPP1PPPRNBQKBNR d2d4!!!!!! b1c3 d1e2 d2d3 00rnbqkbnrpppp1ppp12p16N2PPPPPPPPRNBQKB1R e4e5! b1c3 00rnbqkbnrpppp1ppp12p17P1PPPPPP1PRNBQKBNR d2d4!!! b1c3 00rnbqkbnrpppp1ppp12p18PPPPPPPP1RNBQKBNR d2d4! b1c3! b2b3 g1f3 g2g3 00rnbqkbnrpppp1ppp12p5P13PP1PPPPPRNBQKBNR g1f3!! c2c3 b1c3 00rnbqkbnrpppp1ppp12p6P12PPP1PPPPRNBQKBNR e4d5 00rnbqkbnrpppp1ppp12p7P11PPPP1PPPRNBQKBNR g1f3!!! b1c3! f1c4 f2f4 d2d4 00rnbqkbnrpppp1ppp19Q12PPP1PPPPRNB1KBNR b1c3!! g1f3 00rnbqkbnrpppp1ppp19p9N2PPP1PPPPRNBQKB1R d2d4! c2c4 f1c4 00rnbqkbnrppppp1pp13p15N2PPPPPPPPRNBQKB1R g2g3 00rnbqkbnrppppp1pp13p5P12PPP1PPPPRNBQKBNR g2g3 00rnbqkbnrpppppppp32PPPPPPPPRNBQKBNR e2e4!!!!! d2d4!!! c2c4 g1f3 01r1bqkbn2p4p1pN3n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R a1b1 021nbqkb1r1p3ppp4pn4Pp5P16P1PPPPBN1QKBNR b2b3 021r2kb1rp1pq2ppQ1n8npp8b1P2PPN3P3PPPRNB1KB1R f4f5! f1e2 021rbqk1nrp2pppbp2n3p2pp9P3P1NP2P2PP2PBPR1BQK1NR a2a4 031rNqkbn2p4p1p4n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R d1c1 031rq1kbn2p4p1p4n1r3p1p1p3Pp2P1Q2P3PP1NBPP1R1B1K2R f1d3 03r1b2rk1pp2ppbp2n3p4B13N4P1PPP1PP1PR1B1K2R c3b5 03r1b2rk1pp2ppbp6p10n2B4N4P1PPP1PP1PR1B1K2R c1f4 03r1b2rk1ppp1bppp2n2n5p2q4Pp3BPP1P3P2QNPPPRN2KB1R f1d1 03r1bq1rk1pp1n1ppp5n3BbP7Np5N5PPP2PPPR1BQK2R d2b3! c4b5 03r1bq1rk1pp2ppbp2n2np4N13N4P1PPP1PPBPR1BQK2R f3d4 03r1bq1rk1pp2ppbp2n3p4Q13N4P1PPP1PPBPR1B1K2R d1d4 03r1bq1rk1pp3ppp2nb6pnp11PP1PPN3B3PPPRN1QKB1R f2f4! d1e2 03r1bq1rk1pp4pp2nb6pnpp10PP1PPN3B2BPPPRN1QK2R g1h1 d1e2 03r1br2k1ppp1bppp2n2n5p2q4PpN2BPP1P3P2Q1PPPRN2KB1R a2a3 03r4rk1pp2ppbp6p6B3n7N4P1PPP1PP1PR1B1K2R g3f4 03rn1q1rk1ppp2ppp3b1n5p10b2P2PN2PB1PBPPPRN1QK2R c2c4 b1d2 03rnbq1rk1pp1p1ppp2p2n6p4b2P4BN5PPPPNPPPR1BQK2R d2d4! b1a3 03rnbq1rk1pp1pppbp5np3p7P6P3NP1PB1PPP1PRN1QKB1R b2b3!!! d2d4 b1c3 03rnbq1rk1pp2ppbp5np4p13NN3P1PPP1PPBPR1BQK2R b1c3 e2e3 03rnbq1rk1ppp2ppp1b3n6N4P1Pp3P1N1B5P2PPPR2QKB1R c2c3! b1d2 03rnbq1rk1ppp2ppp5n2b2Pp11P1N2N3PPPBPPPR1BQK2R f1e1! e4e5 03rnbq1rk1ppp2ppp5n5pp1B5P3P1P2P3PP3PPR2QKBNR c2c3! d4e5 03rnbq1rk1pppp1ppp10bNN5B1n11PPPP1PPPR1BQK2R c2c3!! c4f7! d1h5 d2d3 03rnbq1rk1pppp1ppp5n6p4bB1P5N2Q2PPPP1PPPR1B1K1NR d2d3 c2c3 03rnbqr1k1pp3ppp3b1n4pp2B4P6N2N2PPP1BPPPR2QK2R c4d5 b1c3 0Cr1b1k1nr2p2pppp1pb7p2q3PP8PR2PP2N1PPRNBQ2K1 c1g5 g4h5 0Cr1b1k1nr2p2pppp1pb7p2q3PPp7P3PP1NNPPPR1BQ1RK1 g1f3 0Cr1b1k1nr2p2pppp1pb7p6PPp2q2N1P2PPP2NPP1R1BQ1RK1 c1h6 0Cr1b1k2r2p1bppp2p2n1qp1Pp4P2PpP3N2P4P2N1PPR1BQ1RK1 h1g1 0Cr1b1k2r2p2ppp2pb1n1qp1Pp7PpP3N2P3PP2N1PPR1BQ1RK1 d3e2 0Cr1b1k2r2p2pppp1pb1n1q3p6PPpP3N2P3PP2N1PPR1BQ1RK1 a3a4 0Cr1b1k2r2p2pppp1pb1n5p2q3PPpP6P3PP1NN1PPR1BQ1RK1 g4h3 0Cr1b1k2r2p2pppp1pb1n5p6PPp2q2N1P1N1PPQ2PPPR1B2RK1 o-o c1e3 0Cr1b1kbnr1p2ppppp1q7pp13P2PN2P1PP1PPPRNBQ1RK1 c1g5! g1f3 0Cr1b1kbnr2p2pppp1p8p2q3PPp7P3PP2NPPPRNBQ1RK1 f1d3!! g1f3 0Cr1bqk1nrpp2bppp2n7ppp14P1NP1PPP1PPBPRNBQ1RK1 c1g5! g1f3 0Cr1bqk2r5pppppnbpn4pp6PP4P1NBPN3P3PPPR1BQ1RK1 o-o 0Cr1bqk2rpp2bppp2n2n4ppp1N5P5NP1PP1PPP3BPR1BQ1RK1 o-o! h2h3 0Cr1bqk2rpp2bppp2n2n4ppp7P6P1NP1PPP2PBPRNBQ1RK1 c1e3! o-o 0Cr1bqkb1r1p1p1pppp1n1pn4p9P5N2N2PPPPBPPPR1BQ1RK1 b2b4! d1c2 0Cr1bqkb1r3p1pppp1n1pn3pp9P5NP1N2PPP1BPPPR1BQ1RK1 f1e2 d1c2 0Cr2qk1nrpp3ppp2nbp6p7P2b3P2N2PP2BPPPRNBQ1RK1 d1c2! g1f3 0Cr2qk2rpp2bppp2n2n4ppp1N5P1b4P1PP1PPP3BPRNBQ1RK1 g5c1 g5h4 0Cr2qkb1rpp2pppp2n2n5p7P2b6N2PPP1BPPPRNBQ1RK1 e2e3 d1c2 0Cr2qkb1rpp3ppp2n1pn4pp3b3P5P2PN1PP1P1BPP1RNBQ1RK1 f1e2! c4d5 f1d3 h4f6 a1c1 0Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN1PPPP1BPP1RNBQ1RK1 g5h4! g5f6 0Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN2PPPNBPPPR1BQ1RK1 a1c1! d1c2 0Cr2qkbnrpp3ppp2n1p6p7P2b6N2PPP1BPPPRNBQ1RK1 f1d3! g1f3 0Cr3k1nr2p2pp1p1p1b5Pp2qp3Pp5N1P1P1PP4PPR1B1QRK1 h4h5 0Cr3k1nr2p2pppp1p1b5Pp2q4Pp7P1P1PP4PPRNB1QRK1 h2h4 0Cr3k1nr2p2pppp1p8p6PPpP4N4qPP3P2R1BQ1RK1 g1h3 0Cr3k1nr2p2pppp1pb7p6PPp2q2N1P2PPP2NP2R1BQ1RK1 h5h6 0Cr3k1nr2p2pppp1pb7p6PPpN4N1P2qPP3P2R1BQ1RK1 d3f5 0Cr3k2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPPR1B2RK1 a1d1 0Cr3k2r2p2pppp1p4n3p6PPpP4N2P1qPP6R1BQ1RK1 h6g6 0Cr3k2r2p2pppp1p4n3p6PPpP4N2Pq1PP6R1BQ1R1K e1c1 0Cr3kb1rpppq2pp2n1bp5np13NP1NP1PP2PPBPR1BQ1RK1 f1c4! e1c1 0Cr3kbnr1p2ppppp1q7pp10b2P2PN2PBPP1PPPRN1Q1RK1 f2f3! e2e3 0Crnbqk2rpp2ppbp5np3pp7P9NP1PPP1PPBPRNBQ1RK1 o-o c4d5 0Crnbqk2rppp1ppbp5np4p17NP1PPPPPPBPRNBQ1RK1 e1g1 c2c4 0Dr1b1k1r3p1bppp2p2n1qp1Pp4P2PpP3N2P4P2N1PPR1B1QRK1 g2g4 0E1r2k2rpb1qbppp1pn2n4p1p3Q7P1NP1NP2P1BPPBPR4RK1 a2a3 0E3rk2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPP1RB2RK1 d1d2 0F2k4r2p2pppp1p3Pn3p6PPP5N3q1PP6R1BQ1R1K h2g3 0F2k4r2p2pppp1pr3n3p1P4PPP5N3q1PP6R1BQ1R1K d3g3 0F2kr3r2p2pppp1p4n3p6PPPP4N3q1PP6R1BQ1R1K d1d3 0F3r1rk1ppq1n1pp2nbpp5p1b5P6P1B3PP1NBPPP2RQRNK1 a2a3 0F3r1rk1ppq1n1pp2nbpp5p7P2b3P1B3PP1NBPPPR2QRNK1 g5f4 0Fr1bq1rk1pp1pppbp2n2np2Bp1P13N2N2PPPP1PPPR1BQ1RK1 f3g5! f3e1 0Fr1bq1rk1pp1pppbp2n2np2Bp9P5N2N2PPPP1PPPR1BQR1K1 d2d3 c3d5 0Fr1bq1rk1pp2bppp2n2n4ppp7P5NP1NP1PPP2PBPR1BQ1RK1 d4d5 c1e3 0Fr1bq1rk1pp3ppp2nb6pnp11P2PPN3P2BPPPRNBQ1RK1 c1e3! d1e2 0Fr1bq1rk1ppp1bppp2n8np14P1NP1PP2PPBPRNBQ1RK1 c1g5!! c1e3! g1h1 d4b3 0Fr2q1rk1pp2bpppn1n1b5p1p11PPNPPN3B2BPPPR2Q1RK1 d1b3!! a1c1! f2f3! 0Fr2q1rk1pp3ppp2nbb5pnp11P2PPN3P1NBPPPR1BQ1RK1 f2f4 0Fr2q1rk1ppp1b1pp1nn1b7pp12NPBNP1PP2PPBPR1Q2RK1 g1h1! e2f3 0Fr2q1rk1ppp2ppp2nb5B9P2b3P2N2P4PPPR1BQ1RK1 d1f3!!! c3e2 c3a4 0Fr2q1rk1ppp2ppp2nb5B9P2b5BN2P1P2PPPR2Q1RK1 d1f3!!! c3e2 c3b5 0Fr4rk1pp1qbppp2n1b5p1p14PN1P1PP1BPPBPR2Q1RK1 a1d1 0Frnbq1rk1p1p1ppbp1p3np4p9P4N1PN2PPPPB1PPR1BQ1RK1 c1b2 0Frnbq1rk1pp1pppbp5np3p8P8PN2PPP1BPPPRNBQ1RK1 d2d4! b2b3! d1c2 0Frnbq1rk1pp3ppp2pp1n4b1p7P5NP1N2PPP1BPPPR1BQ1RK1 b1d2 c4b3 0Frnbq1rk1ppp1ppbp5np4p9P6PN2PPPPB1PPRNBQ1RK1 c2c4! b2b3 0Frnbq1rk1ppp1ppbp5np4p9P7NP1PPPPP1BPRNBQ1RK1 b2b3 c2c4 10r1b1k1nr2p2pppp1p8p5bPPpP1q4P3PP3QPPRNB1K1NR c8d7 10r1b1k1nrpppp1ppp1bn17P2q3N4PPPP1PPPRNBQKB1R f8e7! b8c6 10r1b1k2r2p2pp3pq1n5p5pPPp2p1P2P2PP1QNNPP1R3K2R o-o 10r1b1kb1rpp1nqppp10p8Np3B1P5P1PPQPPPR3KB1R d5b6 d5b4 g7g6 10r1b1kb1rppp1q1pp2n2n5p2B4Pp1N9PPP2PPPRN1QKB1R g5f3 g5e6 10r1b1kb1rppppq1pp2n2n6N1B4Pp11PPP2PPPRN1QKB1R e4g5 e4c3 10r1b1kbnr2p2pppp1p8p2q3PPp7P3PP2NPPPRNBQK2R o-o!! d8c7! b8c6 10r1b1kbnr2p2pppp1p8p2q3PPp7P3PPQ2PPPRNB1K1NR f7f5 g8e7 10r1b1kbnr2p2pppp1p8p6PPpP1q4P3PPQ3PPRNB1K1NR g7g6 c7f7 10r1b1kbnr2pq1ppp2p5p2p4Q1PPp7P3PP2NPPPRNB1K2R b8c6 10r1b1kbnrppq1pppp2n6Bpp16PN2PPPP1PPPRNBQK2R e8g8 d7d5 c7c5 10r1bqk1nrpp1pppbp2n3p3p8P8PN2PPP2PPPRNBQKB1R f8e7 10r1bqk1nrpp2ppbp2n3p3pp7P8PN2PPP1BPPPRNBQK2R o-o 10r1bqk1nrpp3ppp2nbp4Bpp6P9PN2PP1P1PPPRNBQK2R b8c6! o-o 10r1bqk1nrpp3ppp2nbp5pp7P6P1PN2PP3PPPRNBQKB1R b8d7 10r1bqk1nrppp2pbp2np2p5p5P7N3P1PP1PPPBPR1BQK1NR d7d6! e7e6 10r1bqk1nrppp2ppp2np6b1p5B1P8N2PPPP1PPPRNBQK2R d7d6! b8c6 10r1bqk1nrpppn1ppp11p5bPP12PP3PPPRNBQKBNR c8d7! b8c6 10r1bqk1nrpppp1ppp2n7b1p5B1P11PPPP1PPPRNBQK1NR g8f6! d7d6 10r1bqk1nrpppp1ppp2n7b1p7P8N2PPPP1PPPRNBQKB1R b8c6 f6e4 f8c5 10r1bqk2r2p2pp3p2n2p2p5bPPp2pBP2P2PP1Q1NPP1RN2K2R a6b5 10r1bqk2r2p2pp3p2n5p5pPPp2p1P2P2PP1Q1NPP1RN2K2R b8d7 10r1bqk2rpp1n1ppp2pb1n5p6PPp5N1P3PP1N1PPPR1BQKB1R d8b6 c5d4 10r1bqk2rpp1n1ppp3b1n5p7Pp5N1P3PP1N1PPPR1BQKB1R d7b6 10r1bqk2rpp2nppp2nbp4Bpp6P7N1PN2PP1P1PPPR1BQK2R c5d4 d7d5 10r1bqk2rppp1bppp2n8np11P3P4PQP1PPPRNB1KBNR g8f6 b8c6 b7b5 10r1bqk2rppp1bppp2n8np13NP1N2PP2PPPPR1BQKB1R e7e5 g7g6 10r1bqk2rppp2pbp2n3p4np11P3PN3PQP1PPPRNB1KB1R b8c6! f8e7 10r1bqk2rppp2ppp1bn2n6p7P5PB1N2PP3PPPRNBQK2R b8a6 10r1bqk2rppp2ppp2nb5B2p13P2N2P1PP1PPPR1BQK2R d7d5! o-o 10r1bqk2rpppp1ppp12P4b8n5PPP3PPR1BQKBNR d8g5 10r1bqk2rpppp1ppp2n2n4b1N7P11PPPP1PPPRNBQKB1R e4f6 e4c3 10r1bqk2rpppp1ppp2n2n4b1p5B1P5N5PPPP1PPPR1BQK1NR d7d6 g8f6 10r1bqk2rpppp1ppp2n2n4b1p5B1P8N2PPPP1PPPRNBQK2R b8c6 d7d6 10r1bqk2rpppp1ppp2n2n6p4b2P5N2N2PPPP1PPPR1BQKB1R f8b4!! c6d4 10r1bqkb1r1p2ppppp1n2n5p7p5P2PN2PBP2PPPRN1QKB1R f6d5! e6d5 10r1bqkb1r1pp2ppp2n5p2np11P2P1N3P2PPPPRNBQKB1R b8c6 e7e6 e7e5 10r1bqkb1r2p2pp1p1p2n5p3p2PPp7P3PPQ1NPPPRNB1K2R b7b6 10r1bqkb1r2p2pp1p1p2n5p6PPp2p1P2P3P1Q1NPPPRNB1K2R h7h6 10r1bqkb1r2p2pp3p2n2p2p6PPp2p1P2P2PP1Q1NPP1RNB1K2R c8a6 10r1bqkb1r2p2pppp1p2n5p6PPp7P3PP2NPPPRNBQK2R d8a5!! c8d7! d8c7 b7b6 b8c6 10r1bqkb1r2p2pppp1p2n5p6PPp7P3PPQ2PPPRNB1K1NR g8e7 c8d7 10r1bqkb1rpp1npppp5n3Bpp16PN2PPPP1PPPRNBQK2R d7d5 b7b6 o-o 10r1bqkb1rpp1p1ppp2n1pn4p9P5N2N2PPPP1PPPR1BQKB1R f8e7 f8b4 10r1bqkb1rpp1ppp1p2n2np3p7P9PN2PP1P1PPPRNBQKB1R b7b6! d7d5 10r1bqkb1rpp1ppp1p2n2np3p9P5N2N2PPPP1PPPR1BQKB1R f8b4! d7d5 10r1bqkb1rpp1ppp1p6p2Bp1P2n3n6N2N2PPPP1PPPR1BQK2R o-o b4c5 10r1bqkb1rpp1ppppp2n2n13p6P2N2PP2PPPPRNBQKB1R c6d5 10r1bqkb1rpp1ppppp2n2n4p7P10N2PP1PPPPPRNBQKB1R e7e6! b8c6 10r1bqkb1rpp1ppppp2n2n4p9P5N5PPPP1PPPR1BQKBNR g8f6!! f7f5 g7g6 10r1bqkb1rpp2pppp2n2n3Bpp16PN2PPPP1PPPRNBQK2R o-o c7c5 b7b6 d7d5 10r1bqkb1rpp2pppp2n2n4pp17NP1PPPPPPBPRNBQK2R d7d5 o-o 10r1bqkb1rpp2pppp2n2n4pp6P9PN2PP1P1PPPRNBQKB1R c5d4! d7d5 10r1bqkb1rpp2pppp2n2n4pp7P6P1P3PP3PPPRNBQKBNR g8f6!!! d5c4 10r1bqkb1rpp2pppp2n2n4pp7P8PN2PPP2PPPRNBQKB1R f8e7! f8b4! c7c5! d5c4 c7c6 b8d7 10r1bqkb1rpp2pppp2n2n5p7P9N2PPP2PPPRNBQKB1R c7c6!! f8b4! f8e7 10r1bqkb1rpp2pppp2np1n4p9P5N2N2PPPP1PPPR1BQKB1R d7d6 g7g6 d7d5 f8b4 10r1bqkb1rpp3ppp2n1pn3Bpp6P9PN2PP1P1PPPRNBQK2R o-o! d7d5 10r1bqkb1rpp3ppp2n1pn4pp7P6P1P3PP1N1PPPR1BQKBNR g8f6! f7f5 10r1bqkb1rpp3ppp2n1pn5p6Pp6N1PN2PP3PPPR1BQKB1R e6d5! f6d5 10r1bqkb1rpp3ppp2n7pnp11P3PN3P1P1PPPRNBQKB1R f8b4!! d8c7 10r1bqkb1rppp2p1p2n3p4np11P2P1N3P2PPPPRNBQKB1R e7e5! e7e6 10r1bqkb1rppp2p1p2n3p4np11P3P4PQP1PPPRNB1KBNR g8f6!! f8b4 10r1bqkb1rppp2ppp2n2n5pp7P5N2N2PPPP1PPPR1BQKB1R e5d4! f8b4 10r1bqkb1rppp2ppp2n8np13N1P3PP1P1PPPR1BQKBNR g8f6 a7a6 d8c7 10r1bqkb1rppp2ppp2n8np13N2N2PP1PPPPPR1BQKB1R e7e6 d7d6 e7e5 10r1bqkb1rppp2ppp2n8np14P1N2PP2PPPPRNBQKB1R a7a6!!! b8c6! g7g6! e7e6 10r1bqkb1rppp2ppp2n8np15PN2PP1P1PPPRNBQKB1R b8c6 d7d6 10r1bqkb1rppp3pp2n2n5pN6Pp11PPP1BPPPRNBQK2R e8g8! e7b4 10r1bqkb1rppp3pp2n8npp10P2P1N3P2PPPPRNBQKB1R d8c7!! e7e5! e7e6 10r1bqkb1rpppn1ppp3p1n6p6P8PN2PPP2PPPRNBQKB1R f8e7 b7b6 c7c5 b8c6 10r1bqkb1rpppn1ppp5n5p6PP12PP3PPPRNBQKBNR b8c6!! g8f6! 10r1bqkb1rpppn1ppp5n5p6Pp8PN2PP3PPPRNBQKB1R e6d5! f6d5 10r1bqkb1rpppn1ppp5n5p7Pp7P3PPPN1PPPRNBQKB1R c7c5 10r1bqkb1rpppn1ppp5n5pp5PP8P3PP3PPPRNBQKBNR g8f6 c5d4 b8c6 10r1bqkb1rpppp1ppp2n15P1n8N2PP2PPPPRNBQKB1R e7e6 b8d7 10r1bqkb1rpppp1ppp2n2n12P1p6P1N2PP2PPPPRNBQKB1R d6e5 10r1bqkb1rpppp1ppp2n2n6p5P7N5PP1PPPPPR1BQKBNR e7e6! g8f6! g7g6 d7d6 10r1bqkb1rpppp2pp2n2n6N6Pp11PPP2PPPRNBQKB1R f8e7! f8c5 c8g4 10r1bqkb1rppppnp1p2n3p5p5P9PN2PP1P1PPPRNBQKB1R d7d5 10r1bqkb1rppppnppp2n9p5P10N2PP1PPPPPRNBQKB1R e7e6 d7d5 d7d6 b8c6 10r1bqkb1rppppnppp2n9p5P7N5PP1PPPPPR1BQKBNR e7e6! g8f6 g7g6 10r1bqkb1rppppnppp2n9p5P9P3PP1P1PPPRNBQKBNR g8f6! b8c6 10r1bqkb1rpppppppp2n2n23N2PPPPPPPPRNBQKB1R d7d5! c7c5 10r1bqkbnr1p4p1p4n5p1p1p3Pp4QN1P3PP1NBPPPR1B1K2R c6a5 10r1bqkbnr2p2pp1p1p8p3p2PPp7P3PP2NPPPRNBQK2R d8c7 10r1bqkbnr2p2ppp2p5p2p6PPp7P3PP2NPPPRNBQK2R d8a5! b8c6 10r1bqkbnr2p2pppp1p8p6PPp7P3PP3PPPRNBQK1NR g8e7!! b8c6 d8c7 10r1bqkbnr4ppppp1p7pp16PN2PPPP1PPPRNBQK2R c7c5! d7d6 o-o 10r1bqkbnrp4ppp2p7pp16PQ2PPP2PPPRNB1KB1R c7c5!! e6e5 10r1bqkbnrpp1p1ppp2n7p1p15PN2PPPP1PPPRNBQKB1R d7d5! c7c5 10r1bqkbnrpp1ppp1p2n3p3p9P8N2PPPP1PPPRNBQKB1R f8b4!!! d7d5!! c7c6 g7g6 10r1bqkbnrpp1ppppp2n7p17P3PPPP1PPPRNBQKBNR d7d5 g8f6 10r1bqkbnrpp1ppppp2n7p18N2PPPPPPPPRNBQKB1R e7e6! e7e5! c7c5 g7g6 c7c6 10r1bqkbnrpp1ppppp2n7p9P11PPPP1PPPRNBQKBNR g8f6!! b8c6 10r1bqkbnrpp2p1pp2n2p3Bpp16PN2PPPP1PPPRNBQK2R d7d5 10r1bqkbnrpp2pppp2n7pp16PN2PPPP1PPPRNBQKB1R f8b4!! d7d5 c7c5 10r1bqkbnrpp2pppp2n7pp17NP1PPPPPP1PRNBQKB1R f8g7 d7d5 10r1bqkbnrpp2pppp2n7pp7P8P3PPP2PPPRNBQKBNR g8f6!!! c7c6! f8e7 c7c5 10r1bqkbnrpp2pppp2n8p7P12PP2PPPPRNBQKBNR b8c6 g8f6 10r1bqkbnrpp2pppp2n8p7p6P2N2PP2PPPPRNBQKB1R c6d5 10r1bqkbnrpp3ppp2n1p5pp7P6P1P3PP3PPPRNBQKBNR g8f6 b8d7 10r1bqkbnrpp3ppp2n6B1p7p9N2PPP2PPPRNBQK2R f6d5 10r1bqkbnrpp3ppp2n7pp7P9N2PPP2PPPRNBQKB1R f8e7 f8b4 10r1bqkbnrpp4p6n5p1p1p3Pp4QN1P3PP1N1PPPR1B1KB1R f8e7 f8b4 10r1bqkbnrppp1pppp2n8p17N2PPPPPPPPRNBQKB1R d7d5!!! e7e6 10r1bqkbnrppp1pppp2n8p7P12PPP1PPPPRNBQKBNR c8f5!! e7e6! g8f6! 10r1bqkbnrppp2ppp2n6B1p7Pp7P3PPP2PPPRNBQK1NR c7c5 g8e7 10r1bqkbnrppp2ppp2n8pp6P8P3PPP2PPPRNBQKBNR f8b4!! g8f6! 10r1bqkbnrpppn1ppp11p6Pp8P3PP3PPPRNBQKBNR e6d5!! d8d5 10r1bqkbnrpppn1ppp11pp6P8P3PPP2PPPRNBQKBNR c7c5! g8f6 10r1bqkbnrpppp1ppp2n9p15P3PPPP1PPPRNBQKBNR d7d5! c7c5 10r1bqkbnrpppp1ppp2n9p16N2PPPPPPPPRNBQKB1R d7d5 e7e5 10r1bqkbnrpppp1ppp2n9p5P13PP1PPPPPRNBQKBNR b8c6! e7e6! d7d6 10r1bqkbnrpppp1ppp2n9p7P11PPPP1PPPRNBQKBNR g8f6!! b8c6! f8c5 10r1bqkbnrpppp2pp2n9pp4P9P3PP1P1PPPRNBQKBNR d7d5 10r1bqkbnrpppppppp2n29PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10r1bqkbnrppppppppn31PPPPPPPPRNBQKBNR c7c5 d7d5 e7e5 10r2qk2rppp1b1pp2n1b6npp10P2PPN3PQ2PPPRNB1KB1R b7b5 10r2qk2rppp1bppp2n1b6np11P2PPN3P3PPPRNBQKB1R d8c7! f8e7 10r2qk2rppp2ppp1bn1bn6p7P3N1PB1N2PP3PPPR1BQK2R d8e7 10r2qk2rppp2ppp2n1b5bnp13NPPN2PP3PPPR1BQKB1R f8e7! a7a6 10r2qk2rppp2ppp2np1n4b1p5B1P1b3NP1N2PPP2PPPR1BQK2R h7h6! c8e6 c6a5 10r2qk2rppp3pp2n1bb5npp3P6P2PPN4Q2PPPRNB1KB1R c8b7 10r2qk2rpppn1ppp1bn1b7p7P3N1PB1N2PP2QPPPR1B1K2R d6c5 10r2qkb1rpp1bpp1p2n2np2Bpp14N1PN2PPPPQPPPR1B1K2R o-o b4c3 10r2qkb1rpp2pppp2n2n4pp7P2b3P1PN2PP3PPPRNBQKB1R d5c4!! h7h6! b8d7 10r2qkb1rpp2pppp2n2n5p7P2b6N2PPP1BPPPRNBQK2R e8g8 c7c6 10r2qkb1rppp2pp3n8p1n5Pp7P3PPPNQPPPRNB1K2R a7a6 b8c6 g7g6 10r2qkb1rppp3pp2n1b6npp10P2PPN3P3PPPRNBQKB1R b7b5 10r2qkbnrpp1b1ppp2n6B1p7N12PPP2PPPRNBQK2R o-o 10r2qkbnrpp2pppp2n7pp7P2b5PN2PPP2PPPRNBQKB1R f8e7!!! b8d7 10r2qkbnrpp2pppp2n8p1b5P12PPP1BPPPRNBQK1NR g8f6! c7c6 10r2qkbnrpp3ppp2n1p5pp7P2b5PN2PPPN1PPPR1BQKB1R c7c6!!! f8e7 10r2qkbnrppp1pppp2n8p7P2b6N2PPP1PPPPRNBQKB1R e7e6 c8f5 b8d7 10r2qkbnrppp2pp3n8p3p3Pp1b5P3PPPNBPPPRNBQK2R e7g5! a7a6 c7c5 10r2qkbnrppp2ppp2n8pp6P2b5PN2PPP2PPPRNBQKB1R f8e7! d5e4 10r3k2rppp3pp2nbbq5npp3P6P2PPN3B3PPPRN1QKB1R b8d7 10r3kb1rppp1q1pp2n1bn6Np4Bp1B10PPP1QPPPRN2K2R c5e3! e4c3 10r3kb1rppp3pp2n1bq5npp3P6P2PPN7PPPRNBQKB1R c8b7 10r3kb1rpppq2pp2n1bp5np4P6P2PPN7PPPRNBQKB1R c8b7 b8d7 10rn1qk2rpbpp1ppp1p2pn11bPPP8P2PP4PPRNBQKBNR b8c6 10rn1qk2rppb2ppp2ppbn6p1B3P7NP1NP1PP2PP1PR2QKB1R f8g7 10rn1qk2rppp2ppp3b1n5p10b2P2PN2P2P1PPPRNBQKB1R c8b7 10rn1qkb1rpbpp1ppp1p2pn12PP9P2PP2P1PPRNBQKBNR e7e5 10rn1qkb1rpbppp1pp1p3n7p4PP9N2PP2PPPPRNBQKB1R b8c6 g7g6 10rn1qkb1rpbpppppp1p3n12PP12PP2PPPPRNBQKBNR f7f6 10rn1qkb1rpp1bpp1p5np2Bpp16PN2PPPPQPPPRNB1K2R b8c6! o-o 10rn1qkb1rpp1bpppp5n3Bpp16PN2PPPP1PPPRNBQK2R d8e7!! c7c5 10rn1qkb1rpp2pppp5n4pp7P2b5PN2PPP2PPPRNBQKB1R f8e7! f8b4! b8d7 10rn1qkb1rppp1pppp5n5p10b5PN2PPPP1PPPRNBQKB1R c7c5 d7d5 h7h6 10rn1qkb1rppp1pppp5n5p1b5P9N2PPP1PPPPRNBQKB1R c7c5! c8f5 e7e6 10rn1qkb1rppp2ppp4pn5p6P3b5PN2PP1P1PPPRNBQKB1R f8e7! c5d4 d8b6 10rn1qkbnrpbppp1pp1p11p5P9N2PPP1PPPPRNBQKB1R g7g6 c7c5 10rn1qkbnrppp1pppp11p10b6N2PPPPPPPPRNBQKB1R f6e4! d7d5 e7e6 10rn1qkbnrppp1pppp11pNb18PPPPPPPPRNBQKB1R c7c5 d7d5 10rn2k2rpp2n1p3pbq2p3pNp5P1PP3N5PPP1Q2PR1B1K2R h7h6 10rn2k2rpp2npp3pb1q1p3pNb5P6NB4PPP1QPPPR1B1K2R d6f4 10rn2k2rpp2npp3pb3p3pNq5P6N5PPP1QPPPR1B1K2R g7g5 10rn2k2rpp2npp3pbq2p3pN6P2P3N5PPP1QP1PR1B1K2R f7f5 10rn2kb1rppp1qppp3p1n16b4P1N2PPP1QPPPRNB1KB1R b8d7 e7e2 10rn2kb1rppp1qppp4b6n6N1p5N5PPPP1PPPR1BQKB1R c6d4 10rn2kb1rppp1qppp4bn5p2B4P12PPP1QPPPRN2KBNR b8c6 10rnb1k1nrpp3pp3pb1q1p3p7P6NB1N2PPP2PPPR1BQK2R d8e7 o-o 10rnb1k1nrpp3ppp2pb1q5p7P6NB4PPP2PPPR1BQK1NR g8f6!! c8e6 g8e7 c6e7 10rnb1k2rpp2npp3pb1q1p3p7P6NB1N2PPP1QPPPR1B1K2R f6e4 10rnb1kb1rpp1p1ppp2p2n2q3p6PP5N5PPP2PPPR1BQKBNR g8f6 f7f6 10rnb1kb1rppp1qppp5n5p2B4P12PPP2PPPRN1QKBNR d8e7 10rnb1kb1rppp2ppp5n5qp14P4PP2PPPPRNBQKBNR a7a6 c8d7 b8c6 10rnbqk1nrpp1p1ppp2p7b1p5B1P11PPPP1PPPRNBQK1NR g8f6 10rnbqk1nrpp1pppbp6p3p9P8N2PPPP1PPPRNBQKB1R c7c6!! d7d5! 10rnbqk1nrpp2ppbp6p3pp7P8PN2PPP2PPPRNBQKB1R d5c4! f8e7 10rnbqk1nrpp3ppp2P7b1p19PPPP1PPPRNBQKBNR c3b2 10rnbqk1nrpp3ppp2p7bP6B1p8N2PPPP1PPPRNBQK2R d7d5 10rnbqk1nrpp3ppp2p7bpp5B1P8N2PPPP1PPPRNBQK2R e5d4 10rnbqk1nrppp2ppp3b7p7P12PPP2PPPRNBQKBNR b8c6! f8d6 g8f6 10rnbqk1nrppp2ppp3p6b1p7P8N2PPPP1PPPRNBQKB1R c7c6!! b8c6! f8c5 f8e7 10rnbqk1nrpppp1ppp10b1p7P11PPPP1PPPRNBQKBNR g8f6! b8c6 f8c5 10rnbqk1nrpppp1ppp12p4b10P3PPPP1PPPRNBQKBNR c7c6 a7a6 d8g5 10rnbqk1nrppppppbp14p4P12PPP1PPPPRNBQKBNR e7e5 10rnbqk1nrppppppbp6p11P13PP1PPPPPRNBQKBNR b8c6 g8f6 d7d5 10rnbqk1nrppppppbp6p12P12PPP1PPPPRNBQKBNR c7c5 c7c6 e7e5 g8f6 10rnbqk1nrppppppbp6p13P11PPPP1PPPRNBQKBNR d7d5 g8f6 10rnbqk1nrppppppbp6p22N2PPPPPPPPRNBQKB1R e7e5! d7d5 c7c5 10rnbqk2rp2p1ppp2p2n3Bb1p7P5N5PPPP1PPPR1BQK1NR b4e7 b4a5 10rnbqk2rpp1p1ppp2p2n6p4bB1P5N5PPPP1PPPR1BQK1NR g8f6! g8e7 f7f5 10rnbqk2rpp1p1ppp2pb1n6p5P8P1N2PP2PPPPRNBQKB1R b8c6 10rnbqk2rpp2bppp2p2n5p6PPp5N1P3PP1B1PPPR2QKBNR g8e7!!! f7f6 10rnbqk2rpp2ppbp5np3Pp16PN2PPP2PPPRNBQKB1R c7c5! f8e7! a7a6 b8c6 10rnbqk2rpp2ppbp5np3pp7P8PN2PPP1BPPPRNBQK2R o-o d5c4 10rnbqk2rppb2ppp2pp1n6p1B3P7NP1N2PP2PPPPR2QKB1R e7e6 g7g6 10rnbqk2rppbp1ppp2p2n6p5P7NP1N2PP2PPPPR1BQKB1R c8g4 10rnbqk2rppp1ppbp3p1np11P7N3P1PP1PPP1PR1BQKBNR f8g7 10rnbqk2rppp1ppbp5np4p13P3N2PBPPPPPPRN1QKB1R c7c5 e7e6 10rnbqk2rppp1ppbp5np4p6P9PN2PP1P1PPPRNBQKB1R d7d5! c5d4! b8c6 10rnbqk2rppp1ppbp5np4p6PP9N2PP2PPPPRNBQKB1R e7e6! b8c6 10rnbqk2rppp1ppbp5np4p7P8PN2PPP2PPPRNBQKB1R c7c5! f8e7 10rnbqk2rppp2ppp3b1n12BPp5N1P3PP3PPPR1BQK1NR f7f6! g8e7 10rnbqk2rppp2ppp3b1n5p7P9N2PPP2PPPRNBQKB1R f8d6!! f8e7 10rnbqk2rppp2ppp3b1n5pN6P12PPP2PPPRNBQKB1R f8d6! f8e7! b8c6 10rnbqk2rppp2ppp3b7np11P3P4P1P1PPPRNBQKBNR g8f6 b8c6 10rnbqk2rppp2ppp3b7np15PN2PP1P1PPPRNBQKB1R a7a6 b8c6 10rnbqk2rppp2ppp3p1n4b1p7P5N2N2PPPP1PPPR1BQKB1R f8c5 f8e7 10rnbqk2rppp2ppp3p1n4b1p7P5P2N2PP1P1PPPRNBQKB1R d7d5 f8e7 10rnbqk2rpppp1ppp10b1p7P1n3N2N2PPPP1PPPR1BQKB1R d7d5!! f8c5 10rnbqk2rpppp1ppp10b8pP1n3N2N2PPP2PPPR1BQKB1R c6a5!!! c6d4 b7b5 10rnbqk2rpppp1ppp5n2b3p7P3P1N6PPP1PPPR1BQKBNR g8f6!! d7d6 10rnbqk2rpppp1ppp5n4b1p7P5N5PPPP1PPPR1BQKBNR g8f6 f8c5 10rnbqk2rpppp1ppp5n4b1p7P8N2PPPP1PPPRNBQKB1R b8c6 f6e4 10rnbqk2rpppp1ppp5n6p4b2P5N5PPPP1PPPR1BQKBNR a7a6!!!!! g8f6! f7f5 f8c5 10rnbqk2rpppp1ppp5n6p4bP7N5PP1PPPPPR1BQKBNR g7g6! e7e6 d8b6 d7d6 10rnbqk2rpppp1ppp5n6p4bP8P4PP2PPPPRNBQKBNR c8d7! b8c6 10rnbqk2rpppp1ppp5n6p5P8P4PP1bPPPPRN1QKBNR d8d7! b8d7 10rnbqk2rppppppbp5np11P10N2PP1PPPPPRNBQKB1R b8c6 d7d5 g7g6 10rnbqk2rppppppbp5np11P7N5PP1PPPPPR1BQKBNR g7g6! d7d5 g8f6 10rnbqk2rppppppbp5np11PP12PP2PPPPRNBQKBNR b8c6! g8f6 10rnbqk2rppppppbp5np12P8P3PPP2PPPRNBQKBNR c7c5 g8f6 10rnbqk2rppppppbp5np12P9N2PPP1PPPPRNBQKB1R c7c5 c7c6 e7e6 g7g6 c8f5 10rnbqk2rppppppbp5np21PN2PPPP1PPPRNBQKB1R d7d5 c7c5 10rnbqkb1r1p3pppp1p2n5p6PPp4QN1P3PP3PPPR1B1KBNR a7a5! c8d7 c5c4 10rnbqkb1rp1ppp1pp1p3n7p4PP12PP2PPPPRNBQKBNR g8f6 b8c6 10rnbqkb1rp1pppppp1p3n12P13PP1PPPPPRNBQKBNR d7d5! b8c6 10rnbqkb1rp1pppppp1p3n13P12PPP1PPPPRNBQKBNR c7c5 g8f6 c8g4 c8f5 10rnbqkb1rp1pppppp1p3n23N2PPPPPPPPRNBQKB1R d7d5 10rnbqkb1rp3pp1p1p3np3pp12BP2PN2P1PP1PPPRN1QKB1R f8b4! a6b7 10rnbqkb1rpp1p1ppp2p2n12Pp8P3PP3PPPRNBQKBNR d8d5 e6d5 10rnbqkb1rpp1p1ppp2p2n6p5P9P3PP1P1PPPRNBQKBNR d7d5! g8f6 10rnbqkb1rpp1p1ppp2p2n6p7P5N5PPPP1PPPR1BQKBNR g8f6! d7d5 10rnbqkb1rpp1ppppp5n13p8P3PPP2PPPRNBQKBNR e6d5 10rnbqkb1rpp1ppppp5n4p17P3PPPP1PPPRNBQKBNR g8f6 d7d5 10rnbqkb1rpp1ppppp5n4p18N2PPPPPPPPRNBQKB1R e7e6 c7c6 c7c5 g7g6 10rnbqkb1rpp1ppppp5n4p7P13PP1PPPPPRNBQKBNR g8f6 b8c6 e7e6 10rnbqkb1rpp1ppppp5n4p8P12PPP1PPPPRNBQKBNR c7c6! e7e6! d5c4 10rnbqkb1rpp2pp1p5np3pp13P2PN2P1PP1PPPRNBQKB1R c8b7 c8a6! 10rnbqkb1rpp2pp1p5np3pp7P8PN2PPP2PPPRNBQKB1R d5c4 f8e7 10rnbqkb1rpp2pppp2p2n5p7P8P3PPP2PPPRNBQKBNR c7c5 g8f6 10rnbqkb1rpp2pppp5n4pp13P3N2P1PPPPPPRNBQKB1R c8b7 e7e6 10rnbqkb1rpp2pppp5n4pp16PN2PPPP1PPPRNBQKB1R b7b6! d7d5 f8b4 c7c5 10rnbqkb1rpp2pppp5n4pp6P9P3PP1P1PPPRNBQKBNR c5d4!!! d7d5 g8f6 10rnbqkb1rpp2pppp5n4pp7P6P5PP2PPPPRNBQKBNR g8f6!! e7e6 10rnbqkb1rpp2pppp5n4pp7P8P3PPP2PPPRNBQKBNR g8f6!! c7c6 c7c5 10rnbqkb1rpp2pppp5n4pp7P9N2PPP1PPPPRNBQKB1R c7c6 d5c4 e7e6 10rnbqkb1rpp2pppp5n5p7P12PP2PPPPRNBQKBNR g8f6 b8c6 10rnbqkb1rpp2pppp5n5p7P12PPP2PPPRNBQKBNR g8f6 c7c6 10rnbqkb1rpp3ppp2p1pn5p6PP8P3PP3PPPRNBQKBNR b8c6 g8f6 10rnbqkb1rpp3ppp2p2n5Pp13N5PP1PPPPPR1BQKBNR d7d5! g8f6! d4c3 10rnbqkb1rpp3ppp2p2n5Pp13N5PPPP1PPPR1BQKBNR d7d5! d4d3 10rnbqkb1rpp3ppp2p2n5p6PPp5N1P3PP3PPPR1BQKBNR c8d7 d8b6 10rnbqkb1rpp3ppp4pn4pp7P6P1P3PP3PPPRNBQKBNR g8f6! b8d7! f7f5 10rnbqkb1rppp1nppp11pp5P9P3PP1P1PPPRNBQKBNR d7d5! c5d4 10rnbqkb1rppp1pp1p5np4p16PN2PPPP1PPPRNBQKB1R b7b5!! b7b6! c7c5! d7d5 10rnbqkb1rppp1pp1p5np4p7P8P3PPP2PPPRNBQKBNR g8f6 c7c5 10rnbqkb1rppp1pppp5n5p16P3PPPP1PPPRNBQKBNR g8f6! c7c5 d7d5 10rnbqkb1rppp1pppp5n5p17N2PPPPPPPPRNBQKB1R b7b6 d7d5 e7e6 g7g6 c7c5 10rnbqkb1rppp1pppp5n5p7P12PPP1PPPPRNBQKBNR g8f6! e7e6 c7c5 10rnbqkb1rppp2p1p3p1np5p5P7N1P3PP1P1PPPR1BQKBNR d7d5 g8e7 g7g6 10rnbqkb1rppp2ppp11np13N5PP1PPPPPR1BQKBNR g8f6!!! e7e6! g7g6 10rnbqkb1rppp2ppp11np15P3PP1P1PPPRNBQKBNR g8f6! a7a6 b8c6 10rnbqkb1rppp2ppp12p4n8N1P3PP1P1PPPR1BQKBNR d7d6 g8f6 10rnbqkb1rppp2ppp3p1n6p5P9P3PP1P1PPPRNBQKBNR b8c6 d7d5 10rnbqkb1rppp2ppp4pn5p6P9P3PP1P1PPPRNBQKBNR g8f6 d7d5 10rnbqkb1rppp2ppp4pn5p7P9N2PPP1PPPPRNBQKB1R e7e6 c7c5 c8f5 g7g6 10rnbqkb1rppp2ppp5n5Pp19PP1PPPPPRNBQKBNR b8c6 d7d6 e7e6 10rnbqkb1rppp2ppp5n5Pp19PPPP1PPPRNBQKBNR b8c6 f8c5 g8f6 10rnbqkb1rppp2ppp5n5p15P1N2PPP2PPPRNBQKB1R d6d5!! f8e7 10rnbqkb1rppp2ppp5n5p7P12PPP2PPPRNBQKBNR g8f6! c8g4 10rnbqkb1rppp2ppp5n5pp7P8N2PPPP1PPPRNBQKB1R e5d4 f6e4 10rnbqkb1rpppp1ppp5n6p15P3PPPP1PPPRNBQKBNR d7d5 c7c5 10rnbqkb1rpppp1ppp5n6p5P13PP1PPPPPRNBQKBNR d7d6 e7e6 b8c6 10rnbqkb1rpppp1ppp5n6p7P11PPPP1PPPRNBQKBNR b8c6!!! g8f6 10rnbqkb1rpppp2pp4pn7p4PP12PP2PPPPRNBQKBNR g8f6 b8c6 g7g6 10rnbqkb1rpppp2pp4pn7p5P10P1PPP1PP1PRNBQKBNR f8g7 10rnbqkb1rpppp2pp4pn7p5P9N2PPP1PPPPRNBQKB1R g7g6 c7c5 c8g4 10rnbqkb1rpppp2pp5n6pP18PPPP1PPPRNBQKBNR d7d6 d7d5 g7g5 10rnbqkb1rppppnppp12p5P13PP1PPPPPRNBQKBNR e7e6! g8f6 d7d6 b8c6 10rnbqkb1rppppp1pp5n7p15N2PPPPPPPPRNBQKB1R d7d5 c7c5 g7g6 10rnbqkb1rppppp1pp5n7p4P13PP1PPPPPRNBQKBNR b8c6 g8f6 d7d5 g7g6 10rnbqkb1rppppp1pp5n7p5P12PPP1PPPPRNBQKBNR g8f6 g7g6 10rnbqkb1rpppppp1p5np11P13PP1PPPPPRNBQKBNR b8c6! g8f6 d7d5 g7g6 10rnbqkb1rpppppp1p5np12P12PPP1PPPPRNBQKBNR g8f6 c7c5 c7c6 g7g6 10rnbqkb1rpppppp1p5np21P3PPPP1PPPRNBQKBNR c7c5 d7d5 g8f6 10rnbqkb1rpppppp1p5np22N2PPPPPPPPRNBQKB1R d7d5 g7g6 c7c5 e7e6 10rnbqkb1rpppppppp5n26PPPPPPPPRNBQKBNR d7d5 g8f6 c7c5 e7e6 f7f5 10rnbqkb1rpppppppp7n24PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10rnbqkbnr1ppppppp8p23PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnr1pppppppp31PPPPPPPPRNBQKBNR c7c5! g7g6! d7d5 e7e5 b7b6 10rnbqkbnrp1pp1ppp1p10p5P13PP1PPPPPRNBQKBNR b8c6! d7d6 b7b6 e7e6 g8f6 10rnbqkbnrp1ppp1pp1p11p5P12PPP1PPPPRNBQKBNR c8g4 g8f6 c7c5 10rnbqkbnrp1pppppp1p30PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 10rnbqkbnrp1pppppp9p22PPPPPPPPRNBQKBNR d7d5 e7e5 g8f6 10rnbqkbnrpp1p1ppp2p9p5P13PP1PPPPPRNBQKBNR d7d5! g8f6! e7e6 10rnbqkbnrpp1ppp1p6p3p17P3PPPP1PPPRNBQKBNR g8f6 d7d5 10rnbqkbnrpp1ppp1p6p3p18N2PPPPPPPPRNBQKB1R c7c6 e7e6 e7e5 g7g6 c7c5 10rnbqkbnrpp1ppp1p6p3p9P11PPPP1PPPRNBQKBNR g8f6!! b8c6! d7d6 c7c6 10rnbqkbnrpp1ppppp10p21PPPPPPPPRNBQKBNR e7e5!! g8f6! e7e6 c7c6 c7c5 f7f5 g7g6 10rnbqkbnrpp1ppppp2p29PPPPPPPPRNBQKBNR c7c5 d7d5! e7e5 g8f6 10rnbqkbnrpp2pp1p6p3pp16PN2PPPP1PPPRNBQKB1R f8b4 d7d5 c7c5 10rnbqkbnrpp2pp1p6p3pp7P8P3PPP2PPPRNBQKBNR g8f6 10rnbqkbnrpp2pppp10p7Pp9N2PP1PPPPPRNBQKB1R b7b5! e7e6 g7g6 10rnbqkbnrpp2pppp10pp16P3PPPP1PPPRNBQKBNR g8f6! d7d5 10rnbqkbnrpp2pppp10pp17N2PPPPPPPPRNBQKB1R e7e6!!!! g7g6!! e7e5! c7c5 c7c6 10rnbqkbnrpp2pppp10pp7P12PPP1PPPPRNBQKBNR c7c6!! e7e6! d5c4! 10rnbqkbnrpp2pppp2p8p7P12PPP1PPPPRNBQKBNR g8f6! e7e6 10rnbqkbnrpp3ppp2p8Pp19PP1PPPPPRNBQKBNR d7d5! g8f6! d4c3! d4d3 10rnbqkbnrpp3ppp2p8Pp19PPPP1PPPRNBQKBNR d7d5 d4c3 d4d3 10rnbqkbnrpp3ppp2p8p6PPp7P3PP3PPPRNBQKBNR b8c6! d8b6 c8d7 10rnbqkbnrpp3ppp2p8p6PQ12PP2PPPPRNB1KBNR e7e6 b8c6 g8f6 10rnbqkbnrpp3ppp2p8p6Pp8P3PP3PPPRNBQKBNR e6d5! d8d5 10rnbqkbnrpp3ppp4p5pp7P6P5PP2PPPPRNBQKBNR g8f6! e7e6 10rnbqkbnrppp1pp1p6p4p16P3PPPP1PPPRNBQKBNR g8f6 d7d5 c7c5 10rnbqkbnrppp1pppp11p20PPPPPPPPRNBQKBNR g8f6!! d7d5! e7e6 f7f5 10rnbqkbnrppp1pppp3p28PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrppp2p1p3p2p5p5P9P3PP1P1PPPRNBQKBNR d7d5 b8c6 10rnbqkbnrppp2ppp11p7Pp7P3PPP2PPPRNBQKBNR c7c5 10rnbqkbnrppp2ppp11pp15P3PPPP1PPPRNBQKBNR d7d5 10rnbqkbnrppp2ppp11pp5P13PP1PPPPPRNBQKBNR c5d4 10rnbqkbnrppp2ppp11pp6P2Q5P3PPP2PPPRNB1KBNR g5d8 10rnbqkbnrppp2ppp11pp7P11PPPP1PPPRNBQKBNR e5d4 10rnbqkbnrppp2ppp18pPp7P3PP3PPPRNBQKBNR b8c6 10rnbqkbnrppp2ppp3p8p5P13PP1PPPPPRNBQKBNR b8c6! e7e6! g8f6 10rnbqkbnrppp2ppp3p8p7P11PPPP1PPPRNBQKBNR b8c6 g8f6 f8c5 d7d5 10rnbqkbnrppp2ppp4p6p17N2PPPPPPPPRNBQKB1R c7c5 d7d5 g7g6 b7b6 10rnbqkbnrppp2ppp4p6p7P12PPP1PPPPRNBQKBNR g8f6! c7c5 c8f5 e7e6 10rnbqkbnrpppp1p1p6p5p5P13PP1PPPPPRNBQKBNR d7d5 b8c6 10rnbqkbnrpppp1ppp12p19PPPPPPPPRNBQKBNR e7e5!! c7c5!! e7e6 c7c6 g8f6 d7d5 10rnbqkbnrpppp1ppp12p9Q5P3PPPP1PPPRNB1KBNR g5d8 g5a5 d7d5 10rnbqkbnrpppp1ppp4p27PPPPPPPPRNBQKBNR e7e5 d7d5 c7c5 10rnbqkbnrpppp2pp12pp4P13PP1PPPPPRNBQKBNR e7e6 b8c6 g8f6 10rnbqkbnrpppp2pp12pp6P11PPPP1PPPRNBQKBNR d7d5 e5f4 f8c5 d8h4 10rnbqkbnrpppp2pp4p8p5P12PPP1PPPPRNBQKBNR g8f6 g7g6 10rnbqkbnrppppp1pp13p18PPPPPPPPRNBQKBNR g8f6 d7d5 c7c5 10rnbqkbnrppppp1pp5p26PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrpppppp1p14p17PPPPPPPPRNBQKBNR d7d5! e7e5 c7c5 g8f6 10rnbqkbnrpppppp1p6p25PPPPPPPPRNBQKBNR c7c5 d7d5 e7e5 g8f6 10rnbqkbnrppppppp16p16PPPPPPPPRNBQKBNR e7e5! d7d5! c7c5 10rnbqkbnrppppppp8p24PPPPPPPPRNBQKBNR d7d5 e7e5 c7c5 b7b6 g7g6 11r1bqkbn2p4p1p4n1r3p1p1pN2Pp4Q2P3PP1NBPPPR1B1K2R a5b3 131rbqkbn2p4p1pN3n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R b3c1 131rq1kbn2p4p1p4n1r3p1p1p3Pp4Q2P3PP1NBPPPR1B1K2R h7h5 132kr1b1rpppq1ppp2n1b6np11P1NPPN1P1P3PP1R1BQKB1R c8d7 c6d4 f8e7 13r1b1r1k1pppnqpb4p1np5p2p2PP5PN1P1PPP3NPB1R1BQK2R a7a5 13r1b1r1k1pppnqpb4p1np8pP1PPp4PN1P1PP4NPB1R1BQK2R g6g5 13r1b1r1k1pppnqpbp3p1np5p5PP5PN1PN2PB2BPPPR2QK2R d8c7 13r1b1r1k2p1nqpbp2pp1np1p3p3P1PP5PN1PN3BQ1BPPPR3K2R b7a6 13r1b1r1k2p1nqpbp2pp1np1p7P1PPp3BPN1PN4Q1BPPPR3K2R f6d7 13r1b1rnk2p2qpbp2pp1np1p7P1PPp3BPN1P5QNBPPPR3K2R e8c8 13r1bq1rk1pp3ppp2B2n4b1N6p6N5PPPP1PPPR1BQK2R c6e5 c3f6 13r1bq1rk1pp4pp2nb6pnpp10PP1PPN3B3PPPRN1QKB1R f8e7 13r1bqr1k1pppn1pb4p1np5p2p2PP5PN1P1P1P3NPBPR1BQK2R h7h6 13rn1q1rk1pp3ppp3b1n4pp10b2P2PN2PB1PBPPPRN1QK2R o-o 13rn1q1rk1ppp2ppp3b1n5p10b2P2PN2PB1P1PPPRN1QKB1R f8e7 13rnbq1rk1pp2bppp2p15PPp7P3PP1B2PPR2QKBNR d8c7! d7c6 13rnbq1rk1pp3ppp1bp2n6N4P1Pp3P1N1B5P2PPPR2QKB1R f8e7! e4c5 f8c5 13rnbq1rk1pp3ppp2p2n4bPp5B7N2N2PPPP1PPPR1BQK2R f6e4! d4c3 13rnbq1rk1pp3ppp2p2n5pp1B5P3P1P2P3PP3PPR2QKBNR f8d6! e5d4 13rnbq1rk1pp3ppp3b6pnp11P2PPN3P3PPPRNBQKB1R f8e7! b7b6 g7g6 13rnbq1rk1ppp1ppbp3p1np11PPP5N5PP3PPPR1BQKBNR f8e7 g8f6 f7f6 13rnbq1rk1ppp1ppbp5np4p6PP8PN2PP3PPPRNBQKB1R b8c6!! c5d4 d8b6 13rnbq1rk1ppp2ppp3b7np11P3PN3P1P1PPPRNBQKB1R d7d6 d8c7 13rnbq1rk1ppp2ppp5n5pN4b2P5N5PPPP1PPPR1BQKB1R f8e7! e4d6 13rnbq1rk1pppp1ppp10bNN2Q2B13PPPP2PPR1B1K2n d7d5 13rnbq1rk1pppp1ppp10bNN5B13PPPP1nPPR1BQK2R d8h4 13rnbq1rk1pppp1ppp10bNp5B1n8N2PPPP1PPPR1BQK2R f6e4 d7d6 13rnbq1rk1pppp1ppp12p4bB1n5N2N2PPPP1PPPR1BQK2R c6d4 c6e5 13rnbq1rk1pppp1ppp5n2b3p7P3P1N2N3PPP1PPPR1BQKB1R f8e7 f6e4 13rnbq1rk1pppp1ppp5n6p4b2P5N2N2PPPP1PPPR1BQKB1R f6e4!! f8c5 13rnbq1rk1pppp1ppp5n6p4bB1P5N5PPPP1PPPR1BQK1NR c6d4!! g8f6 13rnbq1rk1pppp1ppp5n6p7P3P1P6PP2PPPR1BQKBNR f7f6! c8g4 d8d6 13rnbq1rk1ppppppbp5np11PP6N5PP2PPPPR1BQKBNR e7e5 e7e6 g8f6 13rnbq1rk1ppppppbp5np11PP8P3PP3PPPRNBQKBNR b8c6 g8f6 13rnbq1rk1ppppppbp5np11PP9N2PP2PPPPRNBQKB1R b8c6 e7e6 13rnbq1rk1ppppppbp5np12P6P2N2PP2PPPPRNBQKB1R c8f5 c8g4 13rnbq1rk1ppppppbp5np12P8PN2PPP2PPPRNBQKB1R c7c5! f8e7 13rnbqr1k1pppp1ppp1b3n6p4P2P3P1N2N4PPBPPPR1BQK2R d7d6! o-o 1Cr1b1k1nr2p2pppp1pb2q4p6PPpP6P3PP2N1PPRNBQ1RK1 d8a5 1Cr1b1kb1r2p2pppp1p2n8q3pPp7P3PP1NNPPPR1BQ1K1R d8c7 1Cr1b1kbnr2p2pppp1p11q3pPp7P3PP2NPPPRNBQ1K1R b8d7 1Cr1bqk2rpp1pppbp2n2np2Bp9P8N2PPPP1PPPRNBQ1RK1 f8e8!! b8c6 1Cr1bqkb1r3p1pppp1n1pn3pp9P5N2N2PPPPBPPPR1BQ1RK1 d7d6 1Cr2qk1nrpp3ppp2nbp6p7P2b6N2PPP1BPPPRNBQ1RK1 c7c6! b8d7 1Cr2qkb1rpp3ppp2n1pn4pp7P2b5PN2PPP1BPPPRNBQ1RK1 h7h6!! b8d7 1Cr3k1nr2pb1pppp1pb2q1Q9pPpP6P3PP2N1PPRNB2RK1 b8d7 1Cr3k1nr2pb1pppp1pb2q4p4Q1PPpP6P3PP2N1PPRNB2RK1 a5a4 1Cr3k2r1p2npppp1qbp5p7P3b4PPN2P2N1PPPR1BQ1RK1 d8b6 1Cr3k2r2p2pppp1pb1n5p2q3PP2b3N1PR2PP2N1PPR1BQ2K1 f6f7! e6e5 1Cr3k2r2pb1pp3pq1n5p5pPPp2p1P2P2PP1QNNPP1R4RK1 f7f6 1Cr3kb1rpppq1ppp2p1bn21P4PPP1BPPPRNBQ1RK1 b8c6 b8d7 1Cr3kbnr1p2ppppp1q7pp10b2P2PN2P1PP1PPPRNBQ1RK1 c8b7! c7c5 1Crnbqk2rppp2ppp10bpp5P8P1N2PP3KPPRNBQ1B1R c8e6 1Crnbqk2rppp2ppp11pp5P8PbN2PP3KPPRN1Q1B1R f7e6 1Crnbqk2rppp2ppp12p5p8PKN2PP4PPRN1Q1B1R b8c6 1E1r2k2rpb1qbppp1pn2n4p1p3Q9NP1NP1PP1BPPBPR4RK1 a7a6 1E3rk2r1p2npppp1qbp5p7P3b2Q1PPN2P2N1PPPR1B2RK1 a8b8 1E4k2r1p1rnpppp1qbp5p7P3b2Q1PPN2P2N1PPP1RB2RK1 c8a6 1F2kr3rppp1qppp2n1b5bnp13NPPN2PP2BPPPR1BQ1RK1 a7a6 d8c7 c8d7 1F3r1rk1ppq1n1pp2nbpp5p1b5P6P1B3PP1NBPPPR2QRNK1 a8c8 1F3r1rk1ppq1n1pp2nbpp5p7P2b3P1BN2PP2BPPPR2QRNK1 a8c8 f6d7 f8g6 1Fr1b1r1k1pp1nqpb3pp1np8pPPPPp5N1P5QNBPPPR1B2RK1 c8a6 1Fr1b1r1k1pp1nqpbp2pp1np10PPPp5N1P3P1QNBPPPR1B2RK1 a7a5 1Fr1b1r1k1pppnqpbp3p1np10PPPp5N1P3P2NBPPPR1BQ1RK1 d8c7 1Fr1b1rnk2p2qpb3pp1np1p6pP1PPp3BPN1P5QNBPPP2KR3R h7h6 1Fr1bq1rk1pp1pppbp2n2np2Bp9P5N2N2PPPP1PPPR1BQ1RK1 f8e8 e5e4 1Fr1bq1rk1pp2bppp2n2n4ppp7P6P1NP1PPP2PBPRNBQ1RK1 b8c6! b8d7 1Fr2q1rk1pp3ppp2nb1n4pp10b2P2PN2PB1PBPPPRN1Q1RK1 d7d5 1Fr2q1rk1pp3ppp2nbb5pnp11P2PPN3P2BPPPRNBQ1RK1 b8d7 1Fr2q1rk1ppp2ppp2nb5B9P2b6N2P1P2PPPR1BQ1RK1 c7c6! c8e6 1Frn1qr1k1pp3pbp2p1bnp4pp5P1P5NP2P1PP2NPBPR1BQ1RK1 c5d4 1Frn1qr1k1pp3pbp4bnp4pp7P5NP2P1PP2NPBPR1BQ1RK1 d6d5 1Frnbq1rk1pp2ppbp5np3pp7P8PN2PPP1BPPPRNBQ1RK1 d5c4!! b8d7 1Frnbqr1k1pp1p1pp2bp2n1p4p4P2P3P1NP1N4P1BPPPR1BQ1RK1 c6b8 c8b7 c6a5 Phalanx-XXII/sbook.phalanx0000644000175000001440000077200210314125617015134 0ustar sombrausers5*^S LC KU#L/#\$-Lac6-Q]"%eg-#^vR],"\[HRMX6#JT#?7 #@5 #@72'7# N(DL~+b`H+{/JT{/Laj07-r0HRƾ2@Tڬ56.6,X8##9LWY:.E>IR>/%w>jA+p2B0&gB.sBUa4NC%=EIRG.IR]%J_^_KT\0L.0L,$kMNX׵PW`GQ,GS,*UMW*UAU*U>RWKU{X0&cX-CFXSGՌY+6ՌY@TӦY%Z-#)i[y[A6W[I\W[8]8$wxa>R b b=Iee$6jAIfjzoGQZpISq>RqW`u".[vLa|j|#}7L*,+ ݀:C'R]ɂ-#O)B]  >R͉_`]ЊTL]ЊAJٷ7#$";d% sT\"4Z9B6w@7.@7SAJ{7_LҝKU@6+ͩ+@ŪI\9UaLAO˯4>O˯R]T4)8qC9}:Ua[ITe ׶9%JT"»J7A"GLVRLa 6"Y:^rJH@rJU`@~4 bF@6W`EMW$+!$'"7DX.h,"8 BVF?`<-#A7k9IS"7.WS^WK]W>R3o!,0tA76.8B]@U`\7#sI\:6?4 c%-UaB@W`@7_i6?0qAI#R]`/%.*!*>#/%NXIRžU`U`?(4 l 6? #f 8c)-5CW(I.$Ty@7#^L9,UC>j ,!Ua#6?M#I\zL#J`8*%3*?Sr,W`!-+14 +1@5K1,"y3656.5MW6G6w6+!7"8#D8+D:/8P:A6q::q<A6Ú?.C*@6"<@"DNXFAKH@5^H KTS^T\[TR]W[7LY\6+/a, dJT6hg7+h,"&CkT\tkJ@$lNXn5*~nJTep?Gt*"`vT]uz:C.N{.o{T]{.<~0&o@6()-#():&寅I\WLJ}@6a T\p+4Me#Me.6-5쥐.`֕Gc=I %_@6e+`9CEx7#( MW( Lav/&V8CMPLalR]`+ 6.#=6AKbD& "DUCz@+ѱ#lK]H@?6I,"6?ھ@^59Lc$@JA8JT+7#ڤJT4 c/7@6AJI\)*3Q@5=* o,5a*5JU-6.v6?F?6IRgT]PU^6W`B]@7n4`n?S "i#5I\@TI>3w>R+6"j5!RٿG1AU/:C</%56?* 8#x# ,_ I\C.R7R{=4{+4s+gI\LlUa-#B8A7IAUIKUILa4 M,ISU`Rw!.$g='T\TZ'?64{(Lao)7#c*6.u.," 1LC47AO456JT :V_;0&;* ;7#E<6.=.'|?p;AK*oD7#oD+G7LJ#ZLqL-JNHRqNN5]xN+xN/%[P#[P-[P/%R%R0T,0T,!*1VK@*1V7#[63[%\`:&d* d!+ڜe|g%k#m6Ao-;p#_p6?:pA.Xr+ `rL`x,)z.7z{I\~|A.}4>b~>+ܯ~#HU:#-}6+%Ń.6.%U`nJƍ+!T]+Rb%דMWT\CN)*:5+5@ěT\t?S SGT9D5!7#sPU^\\0&\z,@7z #?SuԮD9rJTI\KUɷA7z c6Iͭ2Dv-v]+!d0&5!<L^",M iW"\RLaR@Ta<@6a<?6CI\C@TjZI>#653FA6ó@6h=^N+]7#z 7#f*f7#sJTW`0KU.I5!I#+!p?I_`MBV"_^-$Er0&Er+Er*h%8 8(+ IA 8$' "|  9% +KfZ+ X#?4IB  T3ك)GQ*A8R*+4R*JTR*DL*6%+U`,UI--H@V.-#16"~2?-53HRc36?c3U` 4LUz4`Ut9F;;"=?S@F@5ruL@TJ?NITrN@LO.%OO#OL7R#S.&S6-yUT]VKA"AW9]"AWLVYX3#\5!P`8$,b>RbJTb@T˙c@5f.$$h+!$h6.hLa qo p-CKsMWs!wLa9xMW9xLaB}JTK֊,`/ى<T\X3XA.m"gY^L^_-54Ց7#6-9]15!)a^ -+%Z.+>L8Ϣ>R%Ỵ* Ỵ-, !C,"ɣ9%l2,6-Uv:6@54?JL.ICL7@W`LGQJh4>ynU/:ъKUDIS*"*I\8TLSZJT/>R}%"C{+-5!u?`|W`l+4L3J"6J#M>R+T\+I\+6?=AUWB5!6-? AUB"5!yT]O%aT\A.jT\qLaq4` PP`Th#_CD:]T\f=43>MWgF@K1JU9].W`6,=>7#aOA7& T\& 6? 7- -Z T]!5-@5m+!i  "-߈$@I.&][ &Z 'BVi'MB+s+!J18J1C6C"`9A.@9-#9N"9AJϦ:΅;MW=U4u>7#?I\?@T?KUW@LaW@?`4 B,E*!F>5EHJT4IW`0K:&JP.lQB]RR]4KUY=\U`]I\H!_,7)_JTBL`>R\Z`,7`T\/aB]/aLa/a9]bd@I|d e8$fUaXJh7+ah6-i=Ij#ak=Qb&m!Im@Ipsps@6[VuA6İvW`;(z.u{GQ|9%|#϶|T]϶|U` z7#I\-#$-CW^+!E*:C!I\9N+!ݬ^`CkǖLAΖҙJTߚ".kC+>̠=^̠S^̠H^UI>-#/ܠA7DV0&GQT]OMW"_bCLTA,AU6-/%R]r#o A.}W`JT+46?T\=+@GQѺ-#+7>GISJsKA\~=^-6$8B yLaɴx#CG>+BT.$D.6B6+.RH^AK[ ?5 y@5k6"538-#+A.,P-#tH@tJT}L7{C6AH^-2+ V@^MJ?7/ LaH 4> @6 &[,bacAU{7.@^>6?6.D*! ^#+  0&O6. !"x$x$9%F%6"%I\%>R,*6?Ge*5Ge*6"lp+KVW/@+a60-A,17+ 1.C{35oP47@ԯ56?Gf6@L6%87W`A9*;KU*=KUz;=8$@6.ENX lFJ8F>RG8$A8JD:{L{Q.TU`.TI\oUJTU?`f[AUD\W`\+ ^C4a@TfdUCdI\dJTNg,KhMWi4"tj6?٠l q_`rBuvwI\-'y6"{%{@5n~6"26"ԃ>Rw@+?6&A.,+4*5.$%Jڌ0&Jڌ#K@6m?Sm@T`-N7GI>,"6-y89]ƞH=R],|жxR]T^# s+-S3i+R@L;.T]ڶLaSU^S7LJTDLK],)8. A76#YT\8TL&LV&Na)6NX !"C9k7@%-#h".p@5a )J^ ^TLwLC#+%NXF/+/* AI," @5€JT6+H6?"".P:* .w+! 6"t`U  6"=   W`V@L),"HR27, !@6\s"T\"BV#.L&$C.%9L &+>'N"W'HTF*=^+U`1*53h45h4><8%9K]9#|:8(:6(:82=@54>T\h[@.$Ն@HTALaAI\~A-#EtCTLC][DNXCD!}FMWrG+rG>6HITtK+7SNW`O4 OA."O6"PKjTU:̰T@Ly ZNX@[^J@a+7)e@Te&"˩f7!;gUIgLagI\ Rh,Xkzl7- m6"qDLfs.ksUs5s,`uAJ3v6"cw6AEuy ۹y!*'z@T,}:&,+ G48ғ%W_`A64,A>+,֗ BCݚ?66IНAU9#<ŸJ`>,Ư?SG>RݢG-S>R=KU!I\8H^Ы.6-}BN+#8$K%ɳ6-͈=^H^E-!%"c3%JT80ÿ=G l@,BwA.@IՐLaj+$HTMW_9>A7@6nW` * MW+#.9GQ T9]qIS'6.E>5z8$ l@K T\6?*R]kHT6# AUV 6"oLaT>-@5K7-T-KH-#NX06IT)M_^MI\MISDo=Ho4`O -". .%tA ,Jf K] GT]]@6K?Z4La@T)* k.$bI\'-#; (>Rݜ(8ݜ(* CB,-?S?/HR;0-C81I\27#64 5669U`597#59.J9#=ƪ=+!$`@LT@ A7LBJTBMW*C=^jFUII*XK0&cKA.N9],O_`P3XP"qLQJTCT+ATU`UR]U>RX"\Y+![MW[6?[I\[\T^\J7=s^,"^.Leb@LdC^ff-# f6.&5g dk.$lUam9]Vq3Vq@5urizJ`5!\KUY]+a\[]" ,B!R]%7"0&Y6+x=Q͐LC)VB]14 &A.&A>4La 6?CF@KCW#;8$LaJT?SvB]XuUa|s@Lϯ6.7#TLI\J`",=#@KU`@ǬG\įI5SS+5MW5B]59]^oJ`QT\c+!:&24>jø)4wνq-#==Q=q8K6gzgIR`)L˽?6:@TM@7fd^A6d^+!,8$sUam:&m\)Y8$B]jH^AKI=s@KDr.Dr+u+"v~6.,"\v/%\v6"\v5!pzI\>J7@=IWT90LW;*ܝ.T\OAU8$1j8$C-}y@5ʁ@K,j=I6fHR;" IS ,n B ,d C7L9/%:6"q+#JT6?+!,S=%U`%La &!).$).9U +J+6.U+@K",7,,#+cj-#G0x1@K6+ :.h=%;=>>+>"/@5!1AUa[CLaG7-Q?HFR@LFR@KpKS6hWW`eWCUXAUX/ZJT[>+_"-bܢbT]ܢb?`bI\bH@]g?Sj?6ol+4fn4o"o%Cs@6t5,\yw0&z"!zMWuz,"ڀD:':C*KCۋR]SiAJKj@6Kj+!)nAUn@TS3[ " $Tْ#=@tՓ,,6+'?6$6"rșW`ʚ5@ʚW`QҚJTC.$c>+6]H+ 6.tNX8$7#-#cݲMWR]-#&,GT\ޯNCmT]ՆC-+ ,5W`H+PAJa{+#6@ @I.T\I\S.-'"hg.-1T\0UIcC=I\7@INk?4 *U`hI6.aAUD7AJX5@ U"95AKo>+o9@Rd-#d/%KUQw+!QwlJTy^R].?S# I@x# D9z  >RVA AU d e W`: +>{ @I 3 S^ 3 + U4 LC` I: .$O /%O 8$~ " W`~! KU>" 5?# R]# 6-% W6"& NX*+ 0&l, @7- 4,/ _^g0 -#1 0&>A3 6-53 .n05 * 9 HR9 S^1b; @L46@ UaA AUrCA GQf!C vC XE 9#F AJG % G "=jI ITZI =QZI T\'I ]RI @TK 4`L fL )4L KU M -B]O O @TO MWP *=7R jgR >R +R 7BS @LЇ^ 8Ї^ -#^ Nb ?SZb 6?vc ,"d JTGh =^1i U^m .$m @6Qm .%Wm 6Ho 5* t 6+Y+v Y+v 7-y 0&y 8{ 0&1~ ,^ NY I\Y KUY AUn A6n @6^ K] JTg ,[ %q T\J I\ 4  LaP@ " HRxӏ +!xӏ 6"ې U` 6?Ϗ 8$N I=z  – A7 – C] MW @Tњ H 9] 6+ !)8D #pʤ LT3 0&3 ", L^Ƃ }  -Z + LaK A7Xҵ @ T\Ի @T\ ,O #bj ,bj ! * R NXt fn @I$ ,  "d+ ISh 7#h * z /%}~ AKO :Cf LaV N| :&, @6* JT*  ADbz 9 @Kp? 9Tc 7+f La\w 8$ " +! , @68+  x 7# x )=y %< @+ A.H ".S +!l : >R, .:P + r D >Rz ?Sg +" ?6  @LDZ C^( /%< * < C @T 8 :^@ GQGg U`- ?H|. LT MB| LaB Ua2 6.y " -" 8$;E" 7#z" # 8N$ ?S8 % "3-% JTK( #4+ "d- >d- @6/ ,51 T\1 NXy4 LT4 H?5 4`Y5 + 7 %7 5f;8 MWf;8 KU8 K@v9 ?6 < C < #?5= 3TЀ> @Kk@ /#,A 5C 7#;C 5*J SG=P 8$PQ .$#Q BLtS S 7+U 7LyCV .BWW 5@snX "9?^ MW8_ S^52b A.[i U`Aj JT`j "fm 4)9n -#[Wq H-ځq 8$r A76r t LWu K]\xw x A7x W`x @T\| 6+"} _L~ 9]C~ ?SV~ MWo= J>+% A.B SH@ A.) Ua =QW  IS2 D:j %5 -83 "c +@1 @Tc U`# +!`ٖ `ٖ "y U^ LaΙ 6# @6V ,6i= -6F 6A 8$ -b2 "C} # T_m  7#b +붭 La{ \h 5˹ 9]QW I6ļ X ISg A.g N! I\: 7? K9] T_6 - AU 2 "C 2 :CE< !L 7,F >H5 A. 3 ?S AU9 #N u + q 6Wp A.O w C 9#O" W` 5!B 5)7 6@q 1 # >,RN Wah %P  R]# ! W`> )J 4`[ .! LaG > 8$ 6"]y Xa0 e ^A 9%J Q - @TE 6+1 I\ AU W` 6 "- G]*V @6٨ R]x  :&Z 3o" " La'# "Y:$ .3[$ #ܬ& -#O( MWYq* IT2+ ++ G]IH1 ?GN2 ,{4 KU8 U`8 NXW8 )W8 wV9 *w]9 AUw]9 6@l9 6.: KU: 7# ; +̒= ?J&T> > 4`;D .%(H %I !,I 3I 0&RlJ +QL JTjP +!^R 50S 6?NT %CT LaV _`-X .5X -#(Z T\[ "] ]`ٳ] IS5^ =I_^ ".?_ MWMa .@bb + Lb =Qwc #^.h +! j @Tm "mn JTq ?St /%t /%w 6-g| I\k 7#{ 8` @5\\ R]`0 ?4u \IB   " ?S  ט 0&Ǚ AU᠚ MB .0 /:I I\ġ . I\ T\ _`D AJ ?SV^ 6?e W`{\ 6.`l A68 * ȥ A8 t KUa K]0 -p -#4 * P .“ MW)Z sz >RFͼ AIFͼ =Il .+ TL% La AJ{ >Rg S^ # q 7 + o -#E +L LC T^6 "r 6 U` -  6. IS] "D + C8 R] 8J8 ?I 0&kH "[ -+B KU5 !,¶ 4IN 6"o HR .#cM % I\w @6P * ?J .%/ LC[ .Е #/  @L: 7Lr ,E + @ 7# JThO HThO ATe R]k >6g 6? _`Z +!/`" H?% UI,& :C"d& C7V& ,¿& /%N( )N( N( 0&( NXv) MU) , , =Q- IS- _`- I\a7 I\O9 _`e> S^Q? "A D @I'F T\RH LaeH @-ڽI 7-J \:N .9O .jkP +'OR R @6RS ?6\U >5 JX C7a[ "[ +[,] ?S[,] T\[,] AUZ] @5V_ J`` TL` 6A\Aa #c 6@2d AUd Ua7"j NX7"j HT2Mm 6"+m "3n 6Ie?p NXe?p ?S. W`F, ## @T# MW T^ "yS 9L OF ,"^V 7#^V +! @Lnߕ { I\ )vA :&x] T\{ 8-%$ AU/ LW ] I\)L @Ky 9]7֦ >Rۧ A7ۧ . 5! @L† 6Ai .A JT tʶ A7G -: KU U?' U`[a ,A 5! .c ,[ 8O HRJ: ,^ +@(= ,D_ J La>_ 5 @Jʁ 6@$ ^] 6@9 v >+J> U`X ": 6" ," * JT# ` 5  ?S # ^j 7,u 5"` 3<  -5 @TF U`F J`9p @7 =G8 >5 JSQ- NX@ V_ @Jю 5K 5 +G _`Q @To 8$ AK A6xS 0&~ 9], !* 74 ?S 7L% + :R "! I\ 7L^" /:& ?6( 8$( #d) KU+* 6"W- .- .- 7#V}. 6.. " 1 U^o3 @5&6 @L1r6 J`A6 I\Z"8 ?S "9 ISj< Lap= >+/? IRUC JT_lC "D 7#E UaF LaF T\+F 6"oG 6\ 4 - :C#z I6 5!O +!j& W`\ @5! KU La ISa ƕ [^ I66 T\_ I>4 6A !) HRgƛ 4` /% MW T] W`Qʦ /) ?S§ KU %k . h .$# 6^# La/t *5洯 JTǦ @^^# 0 >G J7d H?lռ  GQ _L \[' *?* AG +!3 !* @5" :K 6I  AKl :C3 B` 6./t ,f =IO -# ^_ @7 AUI: A6I: >! @IAF /%p + ,4 8$`2 +c * ,U *" JT 3  ?S* CA %La4 R] @KQIS +W`~A73+MW>7A8  ".$$%6VU(?J;)/&* =-AK..:C1,Y3+!Y36r5,5?6e839?S9T\;T\L>4 gC)GU`? H$9;HN-2J"0`O"=O9]P"SLaW7#IW?IkX>GzX-4ZT5[LVEf[>6W]"Q]7#3`S^Zc*6c-d0:dD:Dg+h@6!l# nO{pC.3p-Pp(p@TrI\t:8oLtU`4yt9%tעwW`|GQ|=Q}=Q}"c~%,I\θ3H,-;WLJ`)>RBLa,.mKU}5!}7#}6""IS>WKU7%5"Q7#+9MW<?$%@T}V5vU`6Iद#FȦA=rKUŪI\N-{A7;A6.$0.7!/%Z6?ݸ/%=b6"6-y%7#6%0.L*5(LaY!8#JT+!6aT\,JJ7-@K%@TuJ@5J^T]s.(LCho6-A.}"JTUaS^LWLU+p7#pAKP]8" ?7:O#][jRDISj-#6"/%3@63?63..&,"&+5#+C_` 6+wK@5@J+S=#qTLϖ"k I"H@#:ClI#C/'?5$)U`$-HT-bo-_-6A6.K]|.,O.W`0JT1!2A7p3La4AJV65t5A.6:.F6.#>5!AKUB@RUD@*F6.GT\LMWJ MM*cO,"aPU`SV3T{W-#]_`]9]T]-QT]JTKi]T\`+;4adU`RgHRMhk.˫k7BkC9%n"0o8zpKUq wMWyU`oyUI)_{"G|6"|,"ݙ}I\L~+ G~W`J@Uх?SU`?TqW`@6lA8_-2-#.#4@L6@ꠔR]Ĕ9LcY+!UI\E`T\E`HRA7@7H+VT]٠7@dž<6?W/%KU9z+7Jί+!Ҳ8k6-SKUx_`)@JT̻* P9e,;4I;@L#+\_R]8A)"as0Ce6.T\JU46?]8$A8$/%QI\qx6ITYNXvGQV ?`{j6-ߘ=5@?SHRֳTLCKbam6.η6.lA71AK5>MWKU#,>@+".C.P?`{6*w7#w+#,)AU:#LaK?65x @57%[@KA7%V7#ҢIAXaB#!* Laj"9&6.9&"0'#H%(-U')".%X)+%X).vm0T\@"37#:%(=4UJ>SH>7Ah?AUh?MW4DW`D++I%^IR]BdI4)իIJ>҄JAUñL8/7MNX3MNDOR]OHTocRX{YYG]_aZZ/%=[)hCc"hCc,Uc"cLah3d7gYd6?͆dQIe MfhPPiW`j6-yk+kI\lR]ylLabn?Uo,7oT\oBKWuqL:]q7Lx6"qz"+xzNXr}r}|~KU;6+CU^CUa*U`"7#8T\CeVCNӑA7>48$,zCMzDXT\ (6.\f4I:C9]:͢+@6,"#U^:>RUa)>MB?c׸"ј5!ј,"ј6"@K(IS(8B_`CG\8.AK6.Kg7#D@*ptW` hLV*MW*U`*ISG-#3+80-JTIS ," 6"b6.{#KU6"a&.hIS,La6"@TW`8$Gq)@^_šJ8š/8eu W`- w 8$J SH0:",5`A6"7,>:^c6+6KUK"%dVJT{ , 6. !J#5@S$,S$#%@6 ,_` ,IS܃-8$|.07#o1\^hp3IR4.99>Rp;+;@Tq<.#@7AE@>RTAT]SB%tD-jE+"FLC5G,XAJDL7:LjL5!M,"8N@7ZN7@ZNLaνNI\jOU`OU`BP?SQ:C R-#R3JU9%JUwULC:W6"7%Y@7^+!ea0&cUae0&jeK?CgT\'vg,KhU` l"9(mA7Uo%p+}OqLa}OqI\q?Sw%7w,z+!z+@j {JTt~~-$A~@5T#%m.#n4?v7=^v7BVtT]>)j@6T\DX}#}.GI6G0&r܏+ 7U`NX"ҙ?5JTsKKUsK>Gb@6r%/%#H=^q3?Sq3JT6?I\zMW,W`/% V6.> #ڲ>4?SDI6 ,/.$LR]:LaO{6AO{La߱C1?S :CSC-P"c+ LWWG7LWab" !KU xQ?6ILa!8$Nm+r,3AJ`e  o*C.:CHR?`OB!HR+!@Um1C-R9%3#G',"AJ6IZ@J&KV|7/%ۏJ>" ! w?9% >צ LCA La17+MD9#.$ W`^[IISIU`&?Io+!o,"c!AU>!LC.9&6"'W`'@L(,?(A72)*5*T9ER.@5Y$/KUb300R]2=^l84T\5i^5@6:7);.H;[1=@+3@53@@+3@6"sAI\,`B H_7DIS{D9%&FISG"G,zHLabICW#I/JLVHuKJTfL:^O@KUPCcSKUcSLacS,MJU@KoU6-,xU)U- VKUVJ`W6-pW.WjX+'\@6+]#{]UV^,"dC_%`Vpbc7"/d7 e7#j5!Tk+6q9n+!؀nA8o]oISht+LuHRv:&w#z8z6QzQzef|@6}|/:}+~9]J'7#6KUs!d^Ƀ=^R,ᮆ.9|T]UC-CJT\m.%z>RzAKzU^e"g,"l“T\Ǻ@TcI\cAU.mJT)D/Ю?SЮJT縛@T@^ɠL^ҡL7 W`gJTI\3%AIf\[&T\>%cΪU^߫%35)ԭW`T]I\WTL,?`u,.$ivƻ" %LaQc,e>ڞU`I\-$JTaA.a+JTDBMcW`4 b-b. A7! %,S4`',W`Dq4?6%rJ`B%6-5*8$R@7qՀ*"R]"G9LG.Q_AU4MW49])^+4#6 @LVTL@5{9]{GQOLT=Q5!j!,Uf U? AUh:6"K*[]U`})n@L8$,A6nn@T L+q@K#7,"@ D:-x!#lp#.%uM%W`%,i (I\.(U`*@6*,^*W`-La.NX.#7/T\30La30T\.27#5U`8-^@A`TE8$Y F7ApIfT\mgI\(j/8{jAJ?j"4jNXk0&k7,>klKUdm.#nnDLьoHRnsC.$y^K{:&+{|6" +}#7A8-΅KU΅MWV@T-ڊ.%D>%{W`B+4}?S KUA9]AT\G@#.)"*/T]:^3AU/ϙ/ϙ7L##` #.9L>Rޣޣ"JTHĩ^@Hĩ6? B]`U^`HR`_`妮3+L.,5+ ؁#k?6޴XLW"޸MTL Z/DD".+7$2R]4Q/#V6.Y9J`>#7L)~TLM7-T]5*U^$7" 6"Z%>4OGQN#@=@T@-U`6+P`AIHRINXW+7A z%>6.O>RU`]H3Laz"40&U`4)/:9]6ZW` . /% 8$h AIZI>ZKAF]g5*@T"I\ECAD 8$a,+6La @+rb96+!@K0%3%5!%TL%_Ln'U`)I\_+7#ey-"=<-"<-,$.U@16I2K839%446"^5/%6?Jk7#7:97!9=Q;/%E</8><:7-?.RA%BA.B,C-C#D63E-.F%.3G=Q3G6AHAUHLa4I)>KLV LRP QB7RI\8_W+ Y%OzZ0&+[@TI\0[]`_8__".mb3 c_THd,"`e%׾k6"ml*":Zm.r6" sT\7uIS w6?EyG]nz{AU!{e|%u~7@-!0&eY$-Sh6+)M,G,7I\1MA"-#]7#3q7B?.$?8$7:CkG]E 0&E )]W7,:+5!&3+@f.}I\ڬ-#b,%n})j14`7Lk(p+ )o!//%mS"\dA.C*5[o@I4JT*zP+LaT%פ""3>:A?`Z X,5X*5U`29=@69/* H^`JTSuTM"3/T\>R7O+!7VU`7VGQ^c@TƄ|+4W`vVI\sU`sH^)8,* Y7,K]+!-@7AU*"*3%N+!V5+MA.T\o `[ .`{ 7 7.Tt7"T\4 "_`Q5O0&&.VIT.W`t"AUt"MWӖ#^$/%/%A7'7-P+@6.)Z.CNM/M/-?32?T35La6KU%6MW;#9;^`;5;gc<#6Sz>-# ?;T?HR)<@%@AU@La@JTiUD+ FDXKT\LGQHM8$8dRN9U+r WT\X5^/%?`@7a[^bJ`m eJTe/7pfg+ OkC9kLanJT(*pHRpI\~rMWQyI\V^y55yLW%z"pzC-j|La~/%2/._=0&-#7KU I\ 4`Y)8-x>RT^גD#ړ,"\8":?6\%y+ {H^DB7@7u@6[9]O8Mģ.'A5+F\S4+=2MW"4V"hLT{8$-;̵ͷʸA.P@T "v=4P}6"LDC8CL^ Ȃ@T)}tB7i.6IN,-5VC.ΐKV9%+7z=3)7L4@KT\ _KU _AUD9mJ8j5hLahMW9?5K=GR/GQN.U`0.%h-/:LA3!)N8BR_LaM8C %W . g iT>YC/%YC"9[y8Y?G6#!S3> 5! 0&!S^4G"/4#BU#7##P$T]Y$"l'@6l'%+7#+G,?S0/+!5"7La8@LCE:J@.Z=B]=3=+>HR0MBS^0MBKUBB*D>R/E!H.H,M7#A&N>A&N#9NS=ȁO8P/%3R?)^ST\SS+SS U6> X6.Z@\6">\IS_]6H]W`T^T\<`KVJb9%!cGQ!cU`cCDO@d@6Ae8ANeKUe7#jh.$jh3h@++i9L'vi.$jMWtk>Gl0&5m^Ro.#xBVNGx H4y?`9yJT _`^ށXa[,";Ň 8@)SJ-ՊOMW0X.0X-#J`ʋ?U3LGQ/mLaF-+dʑ+7#W`X[ATZ20&mїU?8C:Cʉ._Ua+z,5!N;3I@6F.38$30&,=JTNw>C^DMW$7, +(@в>RX5JTH^!+! 9L#.#c*?=6"_O=^5)8H@MX76"O*u9]CBLTLJI\[\[[AUq,2+ )A616A@KUw7+|G\I\Ws/$,GAKGMnTLk@LFXBKUKA@KKA7B08"hW`7!iA,"DJS}Z+@}ZH@n"3Cq@Ti08B++HT:sU`S?Tʃ-6"gP?SEH_`LaJ%JT&7#AJch%WS=^La5= 8$ CM^l {n !3ZMWͯn8I>W5@WISE-@iAKkLa{9#~J?S~JJT7@TI\ "4T!K]T!IS"SH)$ Z$L7y(@ToD)GQ *W`-C.".g.ݑ.%d/DNo/>5~19%8=9 O9T\m9:6.:R];+ !;K?jW</%jW<7#>6@#9CdDJTdD7R1D6"UEA7J.oJ#K, NT] P,@QAJ2TpU7LҀW@7~XI\~X4`Z@5 ]LC]@>_U^`R]$dUapod,+fT\wfHRgJTgI\{j[l.#[l8$~q+q7@rKAt_`u6?yu5-u/w,"w.1Az4=b~,Z-5;i>53>+ᒆLCH$6A"W`Ń7+>H?IZq:CD>3DLHR@T3"AA.]R]R]7#nJT>5AJ͚88$ޯISנ@L+*},D-#hө6Y8#r+@5&@5]xITI\[.#]c@8/RG9%0&7#LaMUW`s^,k9A!vW`J=4WIRPt,56IR4` DX >RW MW ?7Q@6"Q@#Ob3{J`"6H][QiBV{r6+o-jA7]%#F@A9]q{":(-#U=4|+ j-#MI6mTL6^n3;0^GQr@7@5-#GpMDr,l6?>UacB,]MW"L#,"DIRDITV@5_|BfT]չG\3 U:W S^? AJ 6 )=-#W7IW`d((GQE|3+@TU`ͼH@ͼ4@Ԗ!][!La:""CS$>T%-=^vm/IRq09]2JTl26"'30:{5B8w7@*07I\8E9>R9H@:8$;AUc<4G >. >-#0AAKېAC^i+CCD?TD=Qb`D=@HR]Q.K+ hK+hK/%BL>6LU`[P.Q".SLCvTISBXNaSGb?TbIS c@5 cK]rd6I%g@Lqk?Swxm/8qB]r-XtLabv6"bv.A}{{IS|%xJ` [CWlʍ.$lʍ.lʍ#@r@TV0NXV0H^9AJ9TLᅑ7#U`Eђ5!\%b_5>R@^\3@T"'-)LU23ˠ)8ޡA.Ha!a)a"]^LC$>RhLa:@5La9]7>RςU`ς?SA-s\[D9Ĵ>=۳6W_/%B?T.˺˺" [T>\ݻ5A, >~>~@T>RxW8-#->MW%T\,N_`eC.|\[6-fD:~%BUˀC9X* .7@oY=3LȧLa36#_@^d@IMWԀ.43+!@+_/?6 U`8a.$11,"<JTZ?ITLaz^t5!^t,"i".ہ8eT]tISB]?.$zU`\%B8@L 9] Na !,a  V 6. >RX #7+P(T\XI\BL<CU 7@B!,"A"ISvx"-"l"D9,%4I!%T\%5@}^(( LC)"C *)ê*AJy +7#;,U?],+-6+F8T\u<+>W`Z?.$A7pC6-qtI_LNJJJ#,P* ,P5!P@5SJAYTDLW@IX/%JX< Y7[HRr[>#\@J]?`un^ISg^6.g^*"f`b"6 7c3+d,q h3Dwh3'ai=^ j-?lGQ`m+gmLa:o.9Yp0&bq4`PsNX0sW`s:^Ct=QCt?It@"tu+ fv,2v6.nz*3э~:E+߫kLW$kI\7/%77#ޅ9% W`BE_^{>RHAJ#R]ޛ8|K]Z..ΤA.?Sw=^+?I005,"Q"ѓ@+n"wLa#xU5 8Dٛ,"CqA6&gUI,.9A"DN+A7LHR|:AUHW`^ KUIS`@6 66?r .?HReNX@^PNT\ #_I>eLa*u(6.2|,2.) %g"CM;JT77+kLC~".kwU^H@6ĽKU@J'&@5*>W`?`S+`S5!\8_`qI\ t ?67^8C8$7#"|$@KhZt0&-(@7͎.$8$OGQOT]],KU @6ud"3"80Q#NXv*W`^?-9%P1+,w2#v3,4A760&8UaR9A.9֭=KU֭=5@|>+c>HRc>I\c>?Sz?#?AJt?,B6.O4C?SCDDT\oDW`zD=GFL^$GG\J6"dJD/)NW`IO@5PLVyR7,}RU`#TLa#TU`۰W@T^[/:c\JTa+dI\d+ dd5!Eg9/ j6?p8j6Uk@T~kMBRTlmA7!=p6"'rBA6sZuAICxl2z-$l}#2^~AUJW`sA@6>GW`K]r 6 )CC],>F7LsA6/3+@5s0&5=?S%LaJT@67C5@˙+S"ǜ+ C8;UC@0&ʣAJe4)X#aUaaLVKUЋpز"BVr]U4r]"4߰3 %A@L``".5)5=HHR6#ɾAUC.obBVbLa]"2PL^4 8`U^?S"8:?S.=QP4#/T?`k6.y/?5+I\@T+7"+R3w]`I-4#4W`R]"i B9U^Q.g6"rH6I\( 6?͖3͖6)KAWIRtQI\oW@KPa-#"./%-I\T]9]c," 6I KUf!9]M"?S"-#"ChW$?S~$H^~$I\v%I\&@5M'+4U(* Ib(%Ң(7-o)Έ)\Jյ+=ItY/J`0IR0k1?Sr3@7E5ND7IA :La$=f>GQ?A.4CGQE"_-E_-ET\E5!E+!0E7@FD:F@+3K+w3L.iN$.!rN3P@TMUUT\XDLXKUcYZ-#9bZ35\R]B_K]J`od0&5e#ef+!bh2jJAdo6IrH=.7w* 1*x,y5!{8Bu|6AST8."7@n.$_#q{+ 5CW4.5 Lߋ/B6?,K]3"67-=32\#6MWAUѠ"Ѡ-Q0&Q2@52-#m FdI=]̝ɞU`Z7#D6":¡ѢU`x+x3!5=U@%R\[׭.׭54ܬ +!8Գ+#BVLV%(IS(I\NA7]<W`WUa3.AʅMWU^jM7+QB]ON9]m&.T4)!,kG]T^i5*hU`ADHU`:^j8$}s6.lhT\#CMI\+4/tIUԶ$AU`GSI>B:& TL-#n 9%J @KIRei^JB)BO@^2=IW`.][.DL G?S,._0'#KU'#ISr)#-##KU#I>g$@K%!6%=I0&6"ED&HR1'NF13>=F\7386E:IS#?KU(B@5J&CU^VKC-RCR]rDKUqtD7#D%#E@6`F3F?608IT\;J+ ۉN5#կR%SXMSISaTV7L;[^.{^"{^0&Ra?Svc."g.$lisjISIk86kH=k6A1mm/%vn%q3s-/zs@6*sJtdw-#}wTL x%`x6,zAKYVIU8u^[jDX.1!1Ύ?I-# ё,&MWlKUζA.}:5+JAZ?55@IRI5I\@TpܞU`E=H{Р?64qBUM;#x{W`A/7mPC.16.AAJ\I\KUG56"QG?S‴XM _L~7?̍NXƚ%4)T.$Ҟ#.$6I,i/%yA.S^4 4>J6?GM%Y+ . A.VT]^C:Ɗ6-|"p/%pC 4` @6+AUKU-A@PKV6./?S[7eMW475@AK#@5%~*6n@+)J)+AI8$U , J`r=^n7W`h@KXNU^*5J>z9]y+!YAWT#A9:U`? T\A7,A -MW.$Up" "%i#+ Wk#IS%A6)&".g''+U'9](#Tk)LaLn*U41/u1"\2A 36"s3.'/46"o4|5NXV64I7*5\8".L;"4<+?"BeAA7)A:6EI\6 FJ7MAKTNNU`GP HRRXRK]\SAUST0&SToUR]FRWLaVXJ?\X6,xY+iYZZD9nZ+nZ>\]%v^B`I\ bT]bLaYcCWeLUHeBVag-i?SMlvn"dpT\dpS^ upU^qI@@v6",wN"6mz>|.}} [+*=?T_WI\]JT]?`l#l8l"̑6"3"AUP5!6+߰LC߰"7+LajY@J8Y?TY>Xנ.$""2>=T\;"4LW`Ų,Ų"\MWz{La:R]D^+4\%MM@T-%mAU,ڤ . %4!-#=5R@A!8Q>R@T8[4"^R*]MWF #v_6I)"I.#.LIU3>NBVl-@6AIk-_`2a=Q8R]MW@TG?@G@"&@6sU`S^Ƴ JSSH=3r&D* ?S+{*5,Cg6*0?U0?T A6/%M* NXLK,"^T]V"[y6?i8B~!5+8t*5?`E8$r#!6$W``%La%GQ%5!|&Layw(,)@K4-SD425TL5Ua-P8d9MU:=';T\';La+ <TL=/:T=,50>@70>N-A9ANBLa[FI\,GA.|I#_'K+KLa/M0|QB,Q4>/TG\vT6ARMiK]j+!:k-k++ l.$^maVq6?1x@TyW`;z`6.r6+e4+e46"dQ0&}t6"8@^uCsJTL.Ϗ?5~"=^+~_`W֘#U\Ι.i:CCA7Ġ#y>T?`6"I\(+fW`i`SH'!6'*6k`+@6"˵I\k T. JT=+A@5QR]-#+6+h,"h4 [U^DHHR.gJnJ`4KވLaLBVc6"@%@::w,:w".0&p3c#Nq+h5!m!Na6?@L)x t+"!3$Z7#B6_@U 6"9L/0/C;LAi#@5 >RE.kA.mw3+oaX]La|[UaD@5ϽJ`x/NX%_*"JT !I\:h!9Le"[^W#LTQ$")*5l)6",T]T1+=q2+ .384#5>6T]<<C@TsE#GGJTH0&{H#I5+]K=^zK@5K@5"LTLM4P+܂P4`%P4I)QL^l R,"BTIT7#liTKUuV%MW3nWU`Ya-Z9] [U`?i]#]I6d`%a=3qb=3bB7bU`c^_ieLCgE/m#n,"1o4 o#+o"=,pA.,#r".5sBUuCW/Sv7L[yQ{@T~H*@5@7/@6=DX@+%܆* p,:C@+k#5,>X!)KӍZAI0"I6‘?`+-,-3YIUPڗ!2"ʹ9]Tٜ>j":6@6.6R]\!7@"VC$MUO |MU`|MGQLcKUqN5!uKUWV5-#2̺^=.6+?+t_=^ =T\ba0&n-#9%"@+J"9U_0I8u7TAvMWsJT7L`e6U`?w5Ls0W`nITw8$)o+.9}hA7T,T7-@TC^VNX+7[,E7Le3+5!LU@7B'+[6"lz,UT\.-#O4/#{jB]v6^ W`e KU #9Uf J`W @TU" 53R B]g #5'  =QT  +5{ T^U Nh TKD@" -#," BA|" @K>& -#h& y' +!' :C( +"( j( R]) JT2+ ?52+ -#2+ 32+ @5, 6-, +7.- @6- T\=. @6=I2 5!4 #6 J`i7 CW`< ab^= 8$A JT C +VD -nbH *6%I yMJ A7L JTL =QL @^7O JT P +XQ 9.{V MW{] * ^ @T^ 0&2b >RPb )c /%i 6?'xn .r KU2x T]zy JToy T]1y "z I\{ | | +!| *55~ * F | -# + "O ,t .Ɣ ][e# IRW 5!k 9C 7-<\ #6 A6 R]% # " `Ul T\3  U` @5] #Uj LaC LW LUm 9Lg "g @6w 5+ La +x E _LC baB %a 5̯ AK̰ " 7@ / 6"{ #{ >H HR +!y 4`m ,#xÿ U4ҿ *<[ <[ I\ GQ UI`4 3>h 3m +~| @Kk /#3 6+. +! 5,S[ 5@O + /%, H? T]F ?6~ @6+ 6. IR -#[ R]eQ +!m %c B]c KUc ISc MW-p %ES @+-0 , B +#N LUW 9 5= 7#4!#T!* !4>!KUu!@+!!.<!,<!%}B!e!"!#0!7#o!HRo!S^Cd!GQ1h#!@5%!La%!2(!JT(!m+!U4܎,!6"܎,!:&f-!Q? .!KU,.!@L.!9L.!K]W/!#/!./!8/!P/!6"[1!?U_2!U`2! =G4!!3aa5!"=o6!>Rf7!R]ш8!J^0q9!-7^:!3h)VR!B7VR!5>q0R!MWLS!-S!+S!,U!5V!MWZ!,p[!>#B\!8c]!LaA@a!AJwa!-b!?Sc!K@Qc!A6eh!6"kai!T\Fi!7#Fi!+Bi!=Qj!6.o!.#!p!KU6v!,5gv!6"^x!&x!T\y!Ńy!U@Ζy!KVfz!7-J~!+ !S^!J`+!7L…!BA\!#}!MA]!7+Bu!KU!U`Y!I\Y!U`օ!6">!$/2!La&ߕ!!+!6Aӡ!AU!.9!A64!+4!* $!0&_!][Y!.i!+!i!"ߟ!GQ_!!+h̠!Ֆ!-#u'!AU !7+!"!* c!AU^!+E!5me!.=!W`S!!- !.Z(!>+!_L!=4C!J^Ŗ!+4P!* !)w,!_^!HR!.6k!"l!,>!]!KUl!@6!A7j!t!-#t!6"!T]!S^!IT:"!UC%!!6"!* !=!=Q8!ISQ!5>!5!!@L5!B]S!'!/%N!A9!5,"6.6"+@e"6"ݑ"0C{"AU9 "TLɇ "KUe "*e ">l "? "TLeS "R]A"MWD"baQ"MW"AUQ"C"7+9B")ǻ"*"T]2"LW"La["C9"9%"# ",!"R]LX!"5#{""I\s$"\[8%"La&"u`'">RM("MWM("LaX)"I\)"JT)"Q? *"-Q*"6*"T\!,"IRTt2"M4"6",_4""Y5" 76"*5SD;"+|<"Na<"CM,D?"I\B,A"La'zA" A"LaMC"C"ND"I\7 H"*"GH"-5HxJ"#$0N"HR)TN"AJqN"AJDP"7#J]Q"WN:T"KU:T"B]T"T\zU"-lHU".W"@5^Z","9^".69^"#9^"I6J^"^_`"6"v5c" Cc"+ "f"W` f".g"@L+h"-"m".hn"+o"5, p","q"/%q","I4r"-#r"".Nt".$zt"BMhz"4`hz"7: {"L^|","J~".9"UaC"6#"+ ҁ"'4"+ `"@5x"Lax"AU݃""6"MW/"0&劆"B80߆"!*o"K<"7L$" 6"J6""o"ITO";ݒ"A7;ݒ".;ݒ",7" tp"_`tp"9L>"o̔"TLH"TLԖ"IS"-#c"T\X"X"9]"J"R]"A"A"@5Ì"+!"W`P"/%Vѣ"H5".3Ӥ"#"_`/"8C/":C@".ݧ"+E"("W`Sj"IR)""״"K97"Ua0"A6a"5@N",K"ATh"T9Ͻ"#Q"L@l",l"+#"La#w"_`"".">R~"?SA" )"B8"_L""".ں"K"6#Bx"ت"0&a"S^%"W`"_`""A.6"JT*"@U-"+7dI"R]s"6?C">O"%Y"#d"=Q">R"C.5"+q"MWx"AJf"L1"CWγ"8$γ"=3#/7#8$#,#.$P#Ξ#%#6I,#+!+ #*5 #U^ #"B#T\:#9LW##T\#@T#T]-#U4-#"4|#9]#8!#9%–"#>–"#6"$#La%#>+ݬ'#+W)#6?+#"+#LC.#K].#9]w0#4>0##2#I\0 4#+4׀8#8Cv9#5#;#S^[H@#?SD#8E#E#8-E#"XK#.DaK#6@0DN#9]TP#".ZP#BVQ#AU#9%ԄY#/%ԄY#8fY#.Z#+[#J`\##w]#C]#TL*_#6_#_`_#J4C`#+ fd#LVf#KU f#,g#6#Yh#HRYh#h#.%i#-#Dk#JT9l#AUÃn#A7Yn#7,^5o#BLo#T\mp#"4q#=^q#D:fr#?T)v#=Q{v#AI2w#I\w#W`$*x#U^:y#T\:y#GQ+z#9%oz#@+~#+@a~#6I#H^k#9]#R]#?@FT#X#6?q4#7,8#,t#0&T#>R0^#@T#W`N#"}#,"'#MUMM#Cݞ#ݞ#MCd#GQh#+^x#>R#.$r##U`|<#?6=#KU+# ih#A9#7+zH#"Rd#ISR#Jb#_`?#NX#?7վ#=#ISy#LUI#"m#@7r#%"#"#W` #0&kE#9]kE#5@kE#K]c#U`is#][-#A.e#@L #I\#,"#A8/u#=I_# #NXs{#-#c#+Z#+d#.7t#JT#*6M#LC"#7@\#0&Q#RGG#"#5$#. #I\#I\q#+}#I\"G#T\#97$KU $.${ $ $! $"8$"IU$"Ҝ$>5)U$ H\$ATE$"$69*$@7=$6"1 $Z!$W`M#$I\$$D0)%$+&$AUww'$" ($,*$?68-$K]X/$-e0$7%R0$D:/1$I\/1$IS/1$HR—3$IT4$/%&5$%u8$U`i>$Q?j?$0?$#@$BV@$3߭C$+4GE$.CF$5@*F$5!*F$.H$D:gH$GQyH$KVrH$A.R$.SzV$D9X$KUt%Y$ܒY$BA`$T\@^d$NX f$GQsvh$U_h$Bi$@6}j$%j$0&wk$I\Am$B]_%n$^_%n$?`ko$,">o$Gp$3>5Ws$=Q5Ws$U^x$IRLy$)4y$^\z$LaRz$T\1{$AUt~$ISZ$R$ߒ$$g$p$+0$7+~9$abn$R]4#$0&؍$-#Ȑ$6.2+$Q$R]$$+!$@6B$B$C.K$@^$H^ם$A8ٞ$KVp$+!($4 ʚ$-7t$.$B$LCqħ$A7$.8$R]4$?T$+$#$_` $UIv"$A7*$C@$^$6"$.$5$5@ė$AU$+!}]$U?$0.IJ$^=$U`$XM,p$ރ$.5$0$La$@Ka$"$R]$ALf$:C:2$i$5$5!$@7T$+!u$5"$Las$?`$..F$G]$UI$B7 $I\$#9$#6U$LaU$T\u$#~}$CM=$3$8$$0.$3;%LVG%0&`%6?a%AT%9]l%?S%.@7%,#%[{ %T]B%H^B2%9LB2%TL*=% Q%1%6.%)/!% $%+]H%%T\%%H?0%%AI]d'%>(%"4,%),%.,%@K*b-%5!-%/%˱-%W`,3%+4$3%+!>4%=G|4%BK9%LaB%@KNE%6"F%GQF%#y3H%6-H%H%0&EJ%ɺJ%AUɺJ%LaɺJ%JTɺJ%?SN%4"N%+4Q%6"Q%/%@kR%+ IR%6> S%.9T%+6 V%7+sW%sW%@TzX%*6[%G\{\%6"h\%I\c\%7+]%A7_%U`?`%6?Ib%>I2b%6#c%6?d%LA͢d%IT*e%.AYe%IRf%GQ,g%ISi%T] i%JTj%W`l%l%3m%S>)o%La͵r%JAEBs%-6x%L`y%-6=z%?=w}%+D%C=%.9%I\7%U`7%LTsČ%3%%DL%KUɏ%C؏%,%La&%>%MB%:&A%I\%%+J%3%BV#נ%AU#נ%Lap%@KF%#?%_` x%+@M%La%A8V%G4%GQD%7CѬ%6##J%8$T%+"%:C{&%IR;V%?%O%AJڵ%) %"C%,"NH%-#%@+nй%-#v#%ն%+@/%^_d%][ ]%6.q%Ua%7, %%?7{%A7%-%%, %La#%8"%GQT(%9L"%MW%IT%IRۣ%+!%*5%6"g%7Lˉ%?6K%,x%LaX%9%%6"%.%hs%#א%?S^%+ 5%%^%A.8k%7#C%C%6"C%+%%%La%@5%,"%=%A.1%KU%9C0%]JS%3S%#Z%=Q.%I\%R]%JT%%k&U`.&6.&+!$&L@ &U:}_&La- &NR&Ku&DKu&.C &][y &@5bJ&6Aݫ&,"&6.&I\^&AUZ&AJ T!&MW&&\*&>+Y*&La.&T\0&!1&0.2&4&NXF6&AI7&U`9&+!9&/%Tm=&"ʼn=&A7 =&6g?&6"?&AKA&A7fG&+H&A7XEJ&,J&=ISK&"CSK&8$K&,"2L&6gaM&5@M&9CEO&K]2P&+tP&@^^bQ&@JLR&6I`yS&V__T&T\ V&SGƬV&\Y&TLY&I\Y&S^Y&=^)Z&I\Z&U^ [&A6 [&+][&@6]&Ua4 ^&H^^&^&6A__&T\e`&8"&a&7@$c&,Qc&V_f&.,g&,Am&\S#p&6Zw&5]qw&?Sqw&AUh|&>Rڏ&6*{&.$L؁&#&@T & &"Ї&I\Q&ITm~&7:&8#<&A.]&KUڍ&0&m&7A&K]&T]O&>3&@Tx&.$6&HR3&JTT&GQ&4>\ʚ&JT"&IS&H=&JT&- u&"l&-#\&&4 <@&T\`x&J`;&@6&qF&R]Lʦ&%*&7#&&@5&R]&+S&T\<߯&)S&)&@5&=3E&6IX&)>g &>RҨ&KU%&&La4T&@Ux&AJ(&6?&_LC&W`Sk&NX>p&60&IS҅&&>D&LU<&4`&6"&U`m&-&S&5,&^`&#&/. &MW &JT &KUn&@T&W`&0&&,"&w&I\&AUX& .&Na&+&BTeU&?6_&.h&La7V&T\7V&J4&.kc&.A&*5 &Lab(&M&* &,A&?` B&+7*&@`&#}&.E'.AE'4`â'k'"'+!Q'J> '9 '=GK '\['"4r'La7r'A7.'I\'B7'.${'#J!'AJ'K]F'?Uc'?H?<'B6P'6WK 'U`U"'HR|"'* "'.#,$'8$)'+7|*'I>-/'%fd1'@5d4'>D4'*5"6'#"8'U^r;'5,='?S?'5@IB'+C'NFC'JTOC'I\F'" H'8#j}I'|I'U@ڿJ'AJK'T\K'DLM'#NQ'7+WX'8$aY'-F['5"ԁ`'@TFb'5#b'0& c'-h'%i'6.k'3l'MWIo'T]0o':Cs'3)v'#y'?z'][г{'^`z|'@+}'7+h'@K'@6׃'7L׃'I\q'9'@T?'6"<'0&<'#lj'9Cq'R]'LCv'.ג''K]?g'A.-'#-'0&k9'.%'5@2'/%'+e'JT 'AUߟ'W`A'5!z'B,'.$$'I\o'.M''!+G:'+G:'@6('T\('=Q[''I\i''@73'%I'+4i' B'6-'I\',M'=^}''\['@7['6?`'U^'KU&'LA=F'La',"'I\/T'IS'Wa}'Gu0'?Tw''+!'+!'A.''T]'AU!G' wy'KU8n'G]':&{t''/%W'm'.'9Q'6AB'  'v0'5H'K]''KUY'9K'#'C.'%'7#+'8$1':C'','LV (* xC(a (< (3=+ (- (>Rq (I>(]^?(C{>(?TK(@65(BNR(#(Y(+e.(?7(+((S^O(-)!(AUX#(%(@L&(-#)(0&E*(KUQ,(AJY,(Lan,(3Yc-(KUYc-(?Se.(CMiy.(,"2(>R2(4(9]9(KA9(,#Ԍ:( ;(@TU<(S^?(3=|@(.ƲA(=^A(I\uB(5!"B(6"n7C(W`D("JHD("=G(NXR(wZ(+" _(J``("Ia(*5a(I6c(4IFj(>I k(@LLn(T\in("vp(@6q(S^`s(Lz(I\[{(S^[{(G\}(@I2=}(JTp~(0&p~(7#=([(I\yۃ(#+(7#.Ą((, +(T\(?78(N(.Q(SGwє(0&(+#5j(>5(,"q/(I\ ((T>4(#-3(6*6(9]6(R]6(4>R(Ua(B6P(=31(HR(7#B(6.}(0&:(?6(9%(@T㺻(@T("ƽ(>R'(KC{(?Iu(.(-(e(JT(>@(-[(W`(+!h(A7(L7k7(Z(# (U48(ATo(LW(HRς(6"(Q?(+-(7,T5(?`((.$;(^(HR( E(-(@+( 7>("{~(La#(>5(?6`(#:(6?t(T\0[(+!0[(4 ͩ(I\(T(Y(Aү(=I(,"b(@5} (:C} (LC94(6?(-u(I(U`(`(-5(KU >(90<)AU)BVqQ),)+M )W` )%W ).W )7#W )6"@ )# )@K;)S^w)39m)MUZ)I63)6?t)50)5u)5)@H4 !)8#[k!):&@!)H^!)4>))(h))6?*)!*)/%-)-,.)S^&&/)AS1)+1)ISM2)?` T2)JT4)W`6)"7)@5;:)4`;:)?`;:)=I[@)R#B)6AC)T\MF)8VG)I\MhG)7+J)J)aK) K)OL)A.6O)5!P)JT//S)W``S)5 S),[)* ^)3V_)@L"`)AURG*)+!A)5!â)/:M)5P)5@3޲)5>?)I\ g)-)2)?S)%iP)@*p)+;Ͻ)6"ӹ)-),G)LU_)SG|)5)Q5)JT)!X)?S)LV[)@T[)4`)9%),"))/%q)P)P)5@)-#cI)5@,)LA)7L-Q)>3)9])B])8#<)<)0&<)*5 )LU)#)KU.))+),()d)LCk>)+7q)@L)6" )>RO)6A),"#*=I**T\ *# *+!i *>39 *6 *-#*6.0*-!H*U`_*I\>*4GFu*kl* *#IU*T*?J *$?e*La *@T[$*+"|t$*_`ȟ$*JT%*U`cX&*?U#&*AJ(*DX)*wM+*=3,*J^:,*+!:,*,*3>90*LU?0*-# 1*+1*@L1*H^R3*"R6*6-ҋ6*#6*19*5"7<*I]<*IU8=*.$L=*?SZ~=*6I5?*A** B*ISl+F*4=WG*I6J*@T':K*T\K*=^&L*@6M*$N*,t|O*+ /P*T\{pP*@L{pP*@^=~P*QU*IR oV*@6pY*\*#{_*ISN`*\ b*W`d*,}e*.%7|f*GQg*,A|g*+|g*.;h*D9[ m*,[ m*)5.m*9T5.m*AUJm*6+m*7,,n*n*MWMq*S^A!u*.A[x*W`y*7~z*U`z*@T={*TLK\{*KUw{*!~*``*+SH*I\*ITH6*/8o@*-#ZH*@5N*U^*W`*CM*T\`*,"+*I\3*-#*9]*I\*@5 *I>G*ISׯ*"I$* *%=*I\L*Ua#/*.WǮ*La;*HR;**.Ko*.*4`*.+*][ض*K]V*0*IR(*I\(*S^wa*.]*".o*7+*KUj*$:H *^_d*+^*@K0*DNt*La'*_`*"*U`*D:*ISW*JTW*KU* AE*=Q*U`p*L^*T>F*%T*H=*.*.9*6"S*k*9Bb*@+*# b*9]*U`'*C**"*6"*-7*+L+89Q +5Q +3  +:& +x +T\|u +6"b+@T++ 8+J`g++##@+7@e+%-+3=W+@6+CM+4`+@T+ ++K!+"V!+LA!+I6w0"+T]P$+I\W&+@KNQ*+>3^0+CN3+/%m3+@K75+"49+7,:+7#;+KU;+I\>+AI>+AJP@++!A+"CB+#C+,"=$D+s9E+GQVE+B]VE+IS1E+U@6E+B7hF+9]gG+PH+W`:K+.$K+JTK+OyL+=QL+34M+6.M+6AM+GQQ+LaR+I\4:S+?-eT+7T+.U+@TV+!X+"5Z+5 [+6"p\++]+@^+a+9%c+!c+c+,f+ f+@Tl'g+U^el+La7r+L^,t+I\"x+5y+7"Kz+4 z+-#{+IR ~+#+@D̀+IT*+7"++4+3~+%+KU[+U+R]p+R]F’+ba -+% -+6"Д+9!+s+I\%+-#|+#h+6.+W`b+I\b+*5b++!+)-4+MW-4+@T+4`jB+#`+ۡ+RG+C. +-+6A+TLs+s+* 3+6.+KUM+V5+d+@^+U`+R.뜿+BVԿ+,L+=Iˈ+W`+"w+3+W`++HT+!}+A.d+#3+T\+0&R+ +6+@+I\֪+B]j+6"a+"+U`+6-+._+7L+9++La++u+@T++.9+I\+?S-l+JT+7@D!+3&+MXS+:C+#^'+7L>+#x+>K+R]GQ+@5o,"; ,C; ,.D ,-#R,9],7LR,(,!)"E,:, n!,6#$,$,IS&,">&,Ua',AT6}),,"6}),.*,U`,, M4,9C6,C8s=,AU=,UC>?,D9@,)4A,0&1#A,QID,?F,W`4I,abeI,U`M,LaJO, P,xQ,,'T,6@#W,J`#W,7@ X,-TX,5$Y,T\\,T^D\,+ ],4 /],"R^,R^,+!-^,-9$a,m1a,!b,#3Rc,LC3Rc,,xe,La]e,I\ch,@5ch,A.NJj,6-!k,U`$l,@7 Sl,@I Sl,@Lc~l,+ Cn,.ACn,VAMn,kn,6+Yo, wio,7.#Cp,6?r,,5r,*5t,,";t,GQfu,.3v,#Lv,>Rv,W`w,B@wx,.%}, ~,I\ڂ,O,K],A6,@6,JT,0&a,T],W`L,I6L,*6&,7@_,_,D#,6",/%,D9,%,a,.#,a,u,Lau,?`u,I\gߎ,K?ݒ,5,,=Q7,=,JT,J8r,MWr,U`, , ,I6,"ɝ,.%͝,IRߝ,B6), ,#],,,#{,I>X,R]ς,-#ϩ,+!Yd,6+n,=4},,JTPH,.F­,GQ,HR#,-{i,_L_,+Z,,GQK,+,,\,R],K@,^[Z,,HT,p,I\,R],LAV,/*,+,@b*,T\,J` p,,6",IS,-I!,@6F,.$F,B:,.9,_`3{,,"VP, OF,.m,LaZ,+@,6.P,G],+;,T\B,*̂,MWu,S^g,MWWK,NX ,7#r,{,,h7,6+,63,R],+ d,<,%>,NXO,4+;X,@^ț,@+ZE,@L,5A(,%-LUr-?S -q--C -@6 ->R -T\' -#u-?I-GQ--0D-:D"b-"\-LaG->R!M-+-3-* v-Lav->Rv-T\w-* H-6+ -H^I"-@K{"-8$$-LW:t&-@^*-@6,-* ۑ--#"0-?SN2-6"4-.K7-!29-5!X<-+=-3j>-?6>-TLr_?-L^?-%@->A-6-D-IR`K-R]`K-@JK-5!+L-U`CN-5N-?JS-H=V-La=[V-GQW-POX-4 [-+]-U`aj]-@T?3`-4>:`-J``qb-+c#d-NWdh-6!h-&=h-,!>Wh-/.h-NXh-h-+#yj-%j-KUj-?ISn-@7 ~o-.o-]9gr-#Sr-Ct-VMqv-Jy-@T2 {-*6{-C.{-3n|-'&|-q|-9]q|-7@S|-,"K-6.9-/%-\…-#<-U:J-֍-*-?` --Cڊ-6#-ד-@TΘ-HR-#Ι-CNԝ-JT߭-AUǞ-AI`-1à-."t-IRG-H?Os-LW(-=3$-MWv-+}-,-@T -RGp-,6p--60-3+-/%-MW-T\ -TLk0-6"-,F-6"-4` -+ -6"Q-6"E-@6-U`¾-=I1-@J-AI-T]-7L-+O-U-%:4-6?|-T>-3G-8$v~-;-7#ۑ-R+-.-"CaF-@*-"-&<-,E-6"mf-AUxi-H^!-)J#n-,"-=H-B6S-A7{--{-* - -_^-+!-#Q-I\@-,"-=^-W`4--#4-,4-LC4-.$-7"r-#.-6?-6".=4o.?6\.* e .I\) .AS.I\<..9q.:CO.DXa.KU.,"..R].9.6.8$Ad!.^_|".H?j#.K6ٜ#.#~1%.@7F&.X).LaX).@Kt,.La-.CT/.T]2.%'8." \;.A6 \;.<.+C<.U^1>.,"/?._`ފA.*"|E.,5E..$TF.#VH.BVH.AKPL.S@!L.-#5P.JTQ.TLU."X.UahPY.U`?[.KUd[.-8i$\..Ȥ_.Pc.ISPc.La=g.+!k.l.AUq.?Se~v.?`w.ITx.+x y.,"zz.JA |.@T,|.@T}.7Lj.@6.@K.4`T.#"w.@KTd.JU@.6.6.#i.+;8.6J.R.W` `."Gɍ.UaDw.AU;.JT .8$M.IS.6+.6A.=QQ.MW..U`g..#6? .K]CH.MBLU.@T^.Cx.,L{.\[`.U`jɷ.?S#Ǹ.6.7Lr.7A_.6"q.!3..b.AKM..q5..ؽ.W`}0.S^..LCG.l.)3.-.7LE.,.@6t.W`63.@+.C...JT$.C^n.#x.W`.8Jl.Law.6.qH.>G.LAv..T>.>F.!..La.?*b.6._.%2..,.G\{.5B.JT.6..JT;/);/A7/G]/MW/>RaW/HQB/LaJ/+r/5>^/U`/>R/#t /"I/W`/@^/)j/5H/"/La/./@6/U/.$/AJ^/3&/%> //% D /La4,#/U^y&/4>)/3>//+ 51/?I2/#%4/5/ISs6/6?*6=/+ >/7#3>/+"`#@/`#@/B/CF/>F/@LH/I\JK/-#K/-M/@T$N/I\,P/6.7P/TLP/)P/3U//7U/L7V/5]hY/.9σZ/9LG\/AUFa/KUGd/!kg/@Kh/Fi/Fi/5!j/JTj/H=EOk/T\#yk/8$#yk/-l/MD|n/+[o/8-)o/K]Xiq/La 7r/LUWs/CWs/+!_w/8$x/A6-y/5!|/AU,w~/6".~/U^U/,"U/C.(/I\^ɉ/AUN/AUh/CL//G3/%/5/?S1/+?/I\/,/:&5/-#ܨ/?S/NaJ/U`ZԞ/3q]/@Kˢ/@L:/+!/=Qԧ/`U/@T;/4>/@T /?շ/*6s͸/@K/JTS/.$'/MD'/bDt/7# /LVxE/!/T]!/U`Y7/I/"/*Ϳ/"*Ϳ/@6z/HR//>R_/0&/*6/"|Z/6A^/+q/AI/-Q//I\/@T~/3/MW]/I\/IS/G\/"@$/,"/La/@Ku/L@u/H@!/W` /5!s/8/7#/8$/%/@T/?`/5?`/NXg/./HR/@Lϥ/F/_3k/3*/L^0/#m/La3/3/#Q/GQ/A7I/8/:C40I\j06IS 0@7 0% 0+ Z 0IT0%$0"05VW0#L0$$0.%0)rh0NX90AU 0I\0 06+'Y#0c#0- #07'0*0+4S+0,4-0-6I/0>+/0/ L20HR120[306+30@630A6d30!6y30I\40A_T:00&l;0JTl;0Lam;0IS;<0ISZN@09%0B07#8F07-gG04)+$0){0.9Q0"J05@0*t0A7 06. w030JT T0-# T0"00)0>R;0>G0T]θ0N0@IU0=3}d0ͬ0>Re0:&u06"u0V[0"J0AU980+!X0T]:90#:90)0B,I0BK0+0HTӴ0AJi080/%m0+07#=0J5k0JTE0NXD0JTa0LCT0R]G0D:0AI0W`x0@50K]:M0j`0q0I>V0@6J0BVr10@6.0%0U`w0y0I\06I0AI]0.$ 0 (>0#I0_^ 0CR0!*X-07#_0-#B0"X06"0* 0_L@18B<1L@x1?SB1-#=1A8 1#7 16"H 1KU]= 1#]= 1 1 1T\wc1Ua˵1La1{1[m1TLm!1D9l"1=3ъ%19]'1=Q'17L`)1JT)1-n*1%FN+1/1B:q115h41U`41+9516.~X:1A6/<16A4-=1J`>>1%>1n?1#A1A.BC1=4HD1I6F1LauL1L1 M13|Q1KU(S1JT[1W`{`16+$c1?Tc1TLK2d1L7e1,f1>6`j1n1MWn1KUp1I67r1+!Dir1T\t1IRIy1%'%{1"1{1@5b}1*=*1BV1U`B1_`}Q15@/1I\<1AUh1#ލ1\[΀1GQY11+f16^/1JTY1Uaz31I\,1821)۩17R1U4='1`1>+\U1IS1#y1U`1.l17+11LU[15!81孴1T]91AJ=31>R>1e1,1T\E1"O19]ϻ1?Su1T\17Mwk1?Swk1@Tu1691Ua91La1+]1.&1"1#!1Laf1Np1W`1b"1,w+1r1.$[1@Lxy1i13=1 1+!O$16"K1.`|~1W`!1][ 1-"a^1@T1@K.1+,16?1La011\[]H1.#W>1La17#616";16?21NXf1+"91T]1J^\1+711/#C,1%f@1.31T]jj1+!l1-#~1J1U`2-2JT-2U`2K]2@6, 2U` 2*5v27+82@72#052IU2*52* 2KUvy!2IT"2@5"2T]"24I"2K]|#2IS#26. $2,$2,8&2#V'2+*2.H+2+P,2+4%.26?.271232-42I\!52J452  72%t;26I9R@2@K6A2ISaE2@TIF2"^F2LW^F2LUңF2-G2T\T1H2Ua}H2@+ڶK2IS5M2NXO2#$EO2)P2AJVQ2#S2+!/S2eV2.NW2JA3c25!3c2,iae2_Lf2^[mZi2][1j2TAlj2k2m2m2!tm2,"o26.q29L#r2;s2U^s2@+!lu2]w2w2HRBix2T\z2".X{2]T6|2.}2@T}2-O~2GQe2@72Ɂ26+S2+! 2," 26"2/% 2.]2@LX(2ISĈ2A2@5Ή2%62G]S@2342" x29LR2-022.yg2?I02.2.$~~2 2I\02La2G]^2+7vI26"52I\24`A>2".28$27@/2#@2,"72]c2+<2H2}2p2?GA2I\2@TA20&4?27Le2,"&H2AK2"/c2V_25ܝ2AI32LaW222KU+=25322S^2S^&A2.2W`2J`ͩ2.ͩ2+!124 2)h2I6H2+Yj2.dP2)'2.2[S2R]26"2>2," c2MWSL2/%SL2+ź292JT'2W`2.28*3W`3DL3_LvD3jW3* jW3,"jW3@5TE 3AU# 3, 3-6 36" 36-3=^u3,s3"l3GQ^3*6щ3Gg3+4Z3+3R]cY$3(3Ua)3-#,34),3G\~-3LaJ-3#7/3S^~.03LVn 13913@6,33D¶43/%-63KU83JTQ83U`:34 <3BUq=3#q=36"XA3#+KB38KB30&KB3םD3~H3\H3".UI3JTUI3@TzXJ3B]ZJ3IvK32M36+_1O3=^ZO3+UP3T]UP3@JP35, S3"T3*U3?6\Y38#Y3+4\3La[w]3".}]3"ca35, b3Gc3.d3JTg3K]g3MWi3=[>:k3T] k3G\vk33k3^`l3I\l3BUl3BMkm3@6@o3,9p36"op3-ۧq37#vr3$71r3@Tt3+ v3+~3KU3T34 ^3/3#n3A6q36"23J`T30&h3\[3L-3.wt3U`ք38絫3+"x33'3-#&3@+&3/%V>3.3q3J`+r3K]53K]'3K3W`3-3K`~33-#3W`0363HR3@6)x3W`36+C3"3-#.3A.B3@I3La 3,73%D3@T3H=36"e[3>G3Q\ 3?Iy3W`[3C3D9%?33W`G30]33-ً37+M3Cg33W`B3? 39%$3L^3+ j3-C839A*37#*4D:$p4+ 4MW4?U,4W`) 4?S 4#` 4,` 4.$}; 46.ѭ4Ҩ4%04W`1]4-1]44#q4S=4I\74H4T]W4,"4AU4I\!4-#!40s#4AUs#4Laa%4+ $*4_I+4@=0404CZ14I\v"248J7z24#,fC74AU7484":4+@=46?=4I\yA4#K4AUK4/-K455L4-#bP4JTP4UaFS4D9RT40&TyU45!U4.U4#W4?6tX4I\X4.ABZ4,"Z43)[4;F[4=If[4A6Q^4$!_49]`48$`4!h`4`4-a4GQai4%-o4)Hp46@;q40&4v4-4v48_}4@K}4* }47-64+!\44ba#45v4tX4W`4-aM44h{4㫍47#e4H@4Ua4b)46-E14AUTT4La4+*GZ4@Kי4Uaי4La 14KUS4@H[4BV4,wQ4?Hc4T^4._47#4694AK47+D4MWꑫ4#ꑫ4-Ϋ4W`4?I4IAx~46.40&4헮4LV4#44?S_4*54,"A4C9\ø4i4#248׻44I4UasK45@sK4HR4.4KU4MW*4T\*4U`7@44>4S^54@754@544MW4%4\[4,"4][Z4@J44**40&e4@6l4R]f4o4Lao4W`46?g4R]46?f43M56"M5#M55!5+۠5%5% c5-r 5@Tr 5JT: 5U` 5 5U 54)[ 5+75,525?6/5-<5,"C5I\5GQ5DL05H5J` - 56"H 5MAj!5#H"5BVF<'5AJ(5=Qn+5JT ,5IR/54"057@'{15C725?765>P75A7956"N95=Qy95B9w;56?>5S^mZA5T>pB5@JrJC5CZH5ZH5.$K5La2BM5+ M57LI3N5"62N5KU2N5?SQ59%T53W56"W5".X57.&\5}]5-]5T]c5:.Nc5"We5A7,f5AJljj5W`ɇj5@^^k59%:k5@Ty!l5l5UI*n5?Un5\]p5,"2q5#&v5I\y5_`}5)}5+_s5N-A5+\56A\5T]}ˏ5.$A5_`ē5LU%˓5JT^5AU258@y5݇5T\Õ5U`Õ5HR%56"95AU5_L[5I65%Rc25KV556>Fޢ56. 54 ۨ55Aۨ5>R5,Lf59]h05#56?5CW5@Iʭ5:5"@55!5,)5,<5"5R]ㅻ56?|v5+45#ub5-|f5#|f5)%57+v5"5#r5KU5Lag5HR5%o5-54> 5#M5+V5.$557-ny5BLw5?Jw5^H]/5C:657@(5:&,5#`)5%t5ISĻ5.6q5#,Bv5-.50&5MW>59]5HR5%N5L7_5>5er5IT"$5+ 5DL 6 6!i6U`i6J`67# 6I\a 6* L6G\6U`6T]L6.6KU6.#s65#$6K]464 *6?6(!6(!6#"6J`Ā&67#le*6KUle*65@*60&,+6JTȆ/66?/6.7*06U`16.$36,,146NW,146,AA[56+!66I\_/66-#cY86MA964`[;64 &(<6_L:A6JTF64`F6BVF6)7G6-, iG6".H6* ZI6MWPrI6AU)XJ6.=EK6?6L6BAHM65"FM6ůN6,O6C.P6@5eR6>RŨR6* /U6NXU6o$W6KUX6+X6!X6-#](X6T]Y6K]]6`Tna6?S c6BVGf6-1g6:&U}h6+!"h6Ua/k69C;n60o6 e p6BVq6-1t64 t6Qt6I\u6".Zu6%=^w6UCP'x6+@y6 G{6\[G{6>RY^|63Eo|66"ä}6T\}64~64 6=Il67#8W65!p66+O6W`Xy6-#׏6C.6%ܯ6U^ܯ6J`N6,N6)6*6-6-t6X 65*$6La"6B]"67LQ6U^М666<6R]<64>6* _6+?6G\ln696-96867#}6KU%6"6 6DXc6KUAA63LN66"&6.w6IS6o#69]C6./66!]6]64 D6?5N}6 6MWu67Ao69]C6 64`ݚ6#56T\`6D6S^6*"&6@+e6W`x6)666-TL6!o6 6@Lr6B6. g6W`6+4M66"m6V_.6..6C6KU6La+6KUh6?T46-C46p=6@K6+|6AJd6MW6LU66A16>Ru63>7 7+ 8 7k 7p 7>p 75!7L^J77-Β7@T7,Bq7-#7?S7+ ?X 7JT?X 7BV 7MWm)7U`)7 +7R]xC-79%xC-7"M-7@Te.7[/7,w079]n417H@?27==37%47W`Ub57=I[77JT77IA876.597U`+P97R]]:7 /;7R]tX=7tX=7:&?7RG?7I\3-@7?TP4B7U`P4B7?S~D7*~D7!*E7AJLE7T\ҝF7G>K7?SǭK7C$K7,-L7\[-L7KUL7KLZM7AUO7-#}R7+45S7MWU7,U7,"U7.S&V7+"X79]Y76.=Y7GQ]7?6I^7@TI^7U`G_7I\E:c7CE:c7kc7f7@Tf7?Sqh7T\!h7LVj7@6k7@Kl7."+(q7-#t7-v7.Ev7=^hv77#Ex7^ y7BLy76{7MWA|7jn}7TL}7IRd7?T3G76?3G7U`7I\7 L7TL L7J`%k7W`7,w77 67-nO7% 7?Sb7J`kđ7B]n70c7U`7+77+7?S⑛7".C7H?76+p7NXà7LaOr7W`CȢ7JTL7A5/777*6IM7#7* ?7`4f=76?T76-7T\Sn7Sn7I\ ũ7)>P7I\P7HT87T?X7@6X7-?7AUf7|7R]i07%77I67@T576-7:7̝7.?7@5?7* {77U:x7 _7,7MX37.7L7G7/:l7+"7@+7"7MW7U`7L77#T7,"7@7:7,76.7@IG7.$G7,7%76.G7G\x 7=QX7|7,7ISI7-#Q8U^8H^}87A8+P8La18La 8.# 8*"տ 86-PI8?6hl80&Y8r8H8?SI 8U`I 8HR_86I҂8"o87,8"8@IL!8/#"8".ӳ#8$8J`C$85?B|$8#w}$8Law}$8B]w}$89]r(8Uar(8LV,8.8JT.8.088$08Z28?S68KU":8KUL:8O=8,5HA8KUwyB8NWG8@T~H8JTuJ8:0,K8-#,K8@5BL8"O8MW4O8HRO8>RP8^>Q86A>Q8J@S86.+T8"ETT8?TyGU8pX8>4Lz[8TLM[8*5N]8@K"^8#A_8@7`8% #c8U`Pd8Ke8W`e8,"e8-#5f85!g8R]|l8=^p8Gq80&Ss8) +t84Imu8A7ؾx8+72m|8W`}8+~8+v8V`z8`_8K5Ca8+!+T8BU58)58,"G838?SR8!8K]]l8,5'8KUgݏ8?`088@8/䭔8IS8%Vʖ886#'88T]:8@68:&8#j8#Dm8/:~.8U`'١84`;8KUč8_L8=Q8AUG8D9 8La8 ~é8)Ʃ8IT8_^UH8S^ p8-8:8AJr8,86+e88.8I\o8LV18D9᛽8T]̎888  W8*58+\808A6k8#>ğ8.9W8c+8"8+=8?58Uar8MW̾8R])8"td80&x8I\x8J`|8^@|8=@xC8"8GQ8>f8[8"8%28-#8R]H8@."8MW87#8.)8+!K88+@~84`~8?`88#+8+ k>8LaF8JTq8UIp8La!8* ?87LR8C89S^@9#6ζ9#:96-H9I\9A7E9* 96+t 9. 98$ )9,9^t96I#9IS#9LaA93*ѵ9@IxG98ATs 9%>!9@U!9@6Qj"9".ͅ"9/%1[#9#94Iz(9"(9+M)9C*93}19.#296"79?5U894`w:9][:9U4<99L=9)=9][H>9z>9#z>9*2>9H^wE9>wE9C-%G9_`AG9@HޓG97#ޓG9-#gH9hI9*GN9.acO9T\O9.$)Q97#)Q96"`R9S^}]S9W`!T9:^fT98U9LV+X9ݢZ9+!\9 _]9I\U^9@6U^9CL_9+!b9I\ǖc96.|td99LRe97@e9k9+q95,s9I\&u9LA&u9M8*-y9Uaby96@fy9@KI|9A7t|9-#H9R]e96?X97@9@6ӆ9.9Laܗ9!}9K9>\989I\m9J@j9C69>R =9* ~99T^9+49kg9".\9.#Ou9K]9%|ҝ9T\9T^+49 9^906x9*9T>V9)9H6/9I9?579ߤ9@7s9%99@TƼ9@^9+V96"p9"p9"9\[9#9>G9.69@:9bu99I\9 .9W`9La9K@9+f9A9 9-9+!}9JT&9 &9)%9I\9K]$9* W 96.9*69I697#9-#9#9.9,"N9U`N9?S99?6N9I69C9(9U`9HRH97L]l9"9#9A7 9ISÜ9R] 9AII9I98k9-#96"9A69:# :,p:@6E:6-BM:."k:3):AU: :7@7:@Ikd:9%9:0&!:U`K:+JQ:@68:S^Bf:+!X(:%:?5:!6#n:LA!:":La$:@K:J%:@5&:>Rb$(:W`(:K*:"*:-_ -:#8_ -:W-:MD 5.:"X0:@TX0:Ua1:+nf2:?Sp'3:6"z3:,5@7:LW7:8:7:BV8:7Lr8:.$;:5#<:=:/B:9%{9D:4`D:JT%F:/%G:G\JI:&O:JT Q:6? Q:I\R:8$UT:T\ U:4`+U:?SrW:,5W:DM]:_`^:T^w(`:4?K_a:@5a:LUe:+7e:DLf:?`Wg:Dh:6+3i:/%>i:H6b)k:+"sm:7"n:U`n:ISn:?SD|p:-D|p:"r:"g?s:]s:IS&s:Ds:L^]t:U`x:8x:5y:U`{z:@7|:|:.R:La:#s:6?kF:6AP:8$v:7+v:,ń:MW$:B]j:-):J:KUYm:LaD:@*:6.;:@KF:A9F:2:+4 :6.ە:J^:.6Cw::>Rᢗ:6?ė:?Sė:#6{:v:*5v:1:+*:!6*:-#8:NX8:U`8::A.:7# :KU&:6+yҫ:5!"*:"ʮ:KU:LDL:=Q:7":.:>G3:=QI:6"H:*63:7@V:Lal:,#{:J`8:GQ :%:PJ:6-m:Z:AIt:@Kk:%p:,p:5!b:-#9:LC:8$S:KUx:::.t:6?M :+:4I:):S^u:KU>:5! :J?J:W`:I@:@IJ:>3x:7#x:.x:5!: פ:*3:,C:+:.:.:#:H^Ӥ:%:#:-:SJo:-#:-#D:J`:6A#+:ISRv;A8;A.:2;I\;;:$+) ;#+ ;7L+2 ;6-<};+ŷ;R;JT;IS;0&1;+!n;+\;*5\;"˻#;@7n$;* .8&;KU(;Q(;MW+;@T+;AU+,;+N-;"Kl-;W`1w.;,"0;}0;AU 2;5!~82;5!4;+5;T\7;8-:;+h:;%l>;.TC;I\KC;MWy;,y;%z;*"Y|;LaY|;GQ};/: ~;Á;@TYԂ;T\YԂ;MaYԂ;?S$;LC0;=3J;Ѕ;t;k;O;dy;6"w̑;U`@;Lay;@6y;;AU=;S^,;+@Pؗ;L@ޗ;+! ;|;6?;>);8$;B9kb;;6-!@;"?;k;%2D;+7;A7;>;)v;I\Fׯ;W`ʴ;) ;" ;&;WaF;.;6+u4;;La;>R;0&];Ua<;JT?;4)?;%;7+K;^`l;La8;w<;#';SJH;%;R];W`j;,"q;-#q;,"g;_`;5!J;-J;*6;+@Ӗ;R]Y;?S@R&)<R;*PAb<>5tjLd<6-R_<#<#+<"無<0&ĒM[<=R]g=6#D =,M =,#& =6?n=U^n==Q{ =AU{ =KU==+=)=Ӽ="6(=I\C=0&p=KUٶ=A7NP==3f=W` =/%$ =?Tx^!=#x^!=^B$=%'=%7(=@T,=-=%K{.=KUK{.=LaC7=:C8=" 9=@K19=.19=8$j9=W`g9=@5;=KUk<=?Ua>=DW@= _z@=%{B=)RE=6@&E=" ^F=-_wF=L76H=6H=-J=K=.#&K=H^&K=LV$L=I\jN=.AXO=%~R=LW9Y=>R}Y=7#$[=La\=6"4\=LWT_=!,`=`=AId=Lacf=g=#hth=T\i=@6i=@Ik=@5l=!p=I\it=]`w=-x=-|{z==^)|=}=:.ma=U`m=#҅=)҅=@5م=U`b=S@=AJ>=,#A=4 W=U`F=oH=,"q =T\=6.NT==T]=.#=#=5=G\v=7+WZ=?I+=4IX=a5X=*5⼦=C=Fĩ=,=/%N=UaN=BVp]=W`=7#p=6+s=4=Ġ=!*@=C.D=,+=@TNs==Qa=KUeʾ=U^_="_=<=@KI=6"ي=T^7=MW=8B=#.i='=^@V=UC==5?=,"P=,6r=+>Ԗ=J`=>=?S=ab* =R]$==^/=G]=>R]=TL=MB=CLO="=3=I\=9]=u=56=I\6=BVi`=G=U^r=_L=!)=?S=_`=@5A=*5:D=5?:D=S==*^=,=6I.,=+=* 4=* =+ >KU>-#g>4\>>]^! >C.! >". >?6 >K]>HT>6.M@>*6>6?X>,">.>>R>-#>@5f>>R^>5!v>U`v>T\a>:C >@5">7#J$>9]_'>#_'>+(>(>3W+>6.->@7.>7#d/>+E0>,"G<>JAB?>W`?>W`ŸB>HRVC>W`DLD>caE>6LE>"uI>9jI>]`~ J>KAx'J>-x'J>8$LJ>,!O>U`;`P>;`P>K6FcP>LauQ>I\KVS>V>@>Z>yb\>\> V]>AU*^>,"ތ`>^a>@6d>U` e>MWaf>:&#k>- !l>53*n>po>BV7rq>+*u>+70w>LAw>,"qw>AIwz>wz>+}>8$7T>6>6y>@KQ>+![Q>LW>LCl>H^?>6+J>AU(> >Ua>KUُ>.>#>^_l>T\>, >J`.>HR8>W`*>*5u>%>T\ >T\b>GQ3>UC>@6ݰ>* A>JTa>6"ű>KU)C>->+}>%}>5!ƺ>,eһ>K]aE>AUI>b>B]>W`ɹ>61>?S*>@TR>7+$K>UCb>5,u>+>HR"9>,X>B>T]>B>T\>A6>9L>AUH>,6j >@5 >6"<>@K>%K7>C^*>][>&.3X>#D>\[u>0&͆>C-'>T]R>>>,>>#>>+!P>0&i>>R#>LC#>>3>KU3>IS^&?B7?HRD?U4mz?@T?JT??I\?JTMK ?*6#W ?.$ ?W` ( ?0& ( ?/%c ?-?.J?Uam?.$?6"y?H^?+ ?.w?@I??S?La#?_`?A. ?ba !?JT&!?KU1["?_"?SJ/&?7B)?IU_)?/&*?"+?-+?L0?+ |3?GQy4?.#y6?MWf^8?.$̟>?HQΰ??K] !B??SB?6.D?\G?W` K?=Qe#N?e#N?7-O?O?,HvO?>R&O?@6&P?#:U?+!V?5+ߓZ?7L([?-A[?e\?>GZ\?7#]?LaLa?JTa?6b?%ec?@Tc?5! d?La pe?,"4f?RGf?2h?@K !i?,3?k?)m?Xm?W`|n?@TVo?>3q?r?/%s?VK~u?C~u?#Hv?dx?".Nx?90&z?3}?)}?>h~??`r~?J>W?.$?CK=?B]p?@T?ۍ?5,?:C؎?5=?9?4>?.?TL??S?Ua? ?>R?S.?@LV?@6S0?+]??I-?T\`?.$~?U`K?KUd?+&?/%V{?6?*?6蒻?IS??3`?#7o?%I/?53?LV'?* u?AJ?MB!?>,?3ޞ?"?/$?*Z5@:Ch@KU d@J֎@La@@ @@7 @-#y!@8$!@!@JTǘ"@88"@7,Y%@Cz&@z&@IS+(@W`3(@@5M+@?Sj+@D+@W`b,@*,@!-@+".@8A.@/%Wm/@,Wm/@4 Բ1@@K3@/0E4@8@K <@@#<@?6#<@@6=@35>@@5S>@@616@@"7A@A@@RC@"5G@@JG@I3OI@UQ@.UQ@>Q@LacT@.T@#~U@6+\Z@_`+[@W``@GQSb@.c@6?&f@/ff@ok@Lal@IRm@7# v@+ >v@5v@x@+\~@7#\~@-#j~@@K~@J`)@_`@Ń@W`?@8$e@HR @6" @+@7#|a@+`Q@:.[@UCG @?SJ@I\@ @=^:@?IԮ@%@R]U@La3@+@V@C.@6+{@* o@@+ @+!e @4`e @d@R.r@,"@+!➬@^@۬@M@T\ ҵ@"X@@Lu@.hw@)UA@@I6@LaJǼ@Lai@#+ʛ@I\ʛ@KU@:&c@%[@I\1f@U`@@:C5@7A@@L_@ba^@6@@@T\H@@JH@>R-@,1@@#@w@>@w@+!l@6#{@5?;@:@AJ3@?7|d@I\@GQ@R]@@+9@CW@@I\@@U`'Q@LW@W`A9_A?SA.$} A+ AAU`EA6"A#A ʱA+͸A5!nAR*AăA+!nA!A7#!A*A5OA+6=lA+5AIR Az AK9[!A:&"AJTD"A~#AK?ů$AO$ALWX'A\^g)A}-A7#O2AS6A%h8AKU9A#+:A#1;A%v;AA=^@A>G <@AAIAAIT^UBA,5)]EA>5qFALV8GA6? LAT]NA@5)OAMWyuRA," SAU`TA7@ȲUA"8WA4II:XAW`?YA*3xYA3=Bx[A]A+-_A6"i:bA@+i:bA7+NgAAUOhA6iA,iA.zjAWLzjACnAJoA?SqAtA@K}CzA-Þ|A LALTeA+!؀A+4ڀAW`,%AT]JA5,[>A,"A9]QA6.QAV*A5H~A#>KAA@LAD9NřA6"ԙAAUUA,eA,4РAUC0AAA70AA@7쁢AaLA4 AB-@JA+ cA6"cA#9A+.A.A%AG]>A3ݩAI\ߪA,#AMWA sA+~AALavA.WAKU1?AA@69A,AźA?SA#A%AISAAWyA?`.A)+A@Lz A@6AT\$OAI\q+AL76AD:AAAHREA"A+/A%YA:CAA-#A,"EA#٢A5*AISĦAĦA,"nA5AB7CALaMAI\A5*oALaoAGQl-A/8ARA.$FALaFA?SAR]BAR]TNAJTAHRA4?eCB%(BB7"BU`"B@+7 Bq B@LC B6@! BJT:BTLBW`TB mB+!fB@KqBB>HB.yB6"B@TכBLaB"B#BAJ#B0&%$B@+$B6?+&Bo'BUad(B6.+B6-&,BA7}7.BAJ1Bq4BI@IV5B~:B[;BI\ R B"B>5~ BR]IB,WhB%ZB_LaBMA\͏BJ`2B6-׉BTL>B4>“B)“B!jBNX ߖB,"B,GzBB`aNIB7L搚BC&B+!ΛBBVB.$B@6ysBL@ӇB".B BGj=B,=BW`wçBC.ヨB4`BR] XB.$[RB. B6A BLalB"vmBLC>B6#B+!)B6IrB+hB][hBLVwBBGBB?SBU`B LAB,urB@LB#86`BC.BB6"ˢB%B%8B@5tB:&IB@6B.B-#˵BarBLa B?SIBNX_B6"$7BCFB+4BLasBCsB+#k6B?`WB#B6BIhB@LwB@TdB+"B*BU`e^BW9qMB4`B!`B%3v1C2CH^>L6C,"7C+9C5C?-&Z@C8-YBC5=CC>3CFC:CFC#FC@6FCKUHC7,jNC# OCLTǕRC.ǕRC,"RSC>6SCLU$SC?S>>UC* kUCR] VC?JAVC6KVC8$ZC+ V [CW`^CS^^C* R_C5-]OaCI\gbC.iC%mC?TvnCLUtCA6xtCƏuC#vC%[wCNam{C+7R}C6"nC*5s`CR]C-#FC6#7yCCKUDC.7DC@LTC-CBCI\+aCW`tC+7C@+bCGQ C6- 0C`U@CW`G CIRCMUCBUzC&J՛C5?՛C\[%C7+FC7#FC-$C#CR]D5@sDS^D,"D#Y D@K*] D:& D6. D"-D%eDD@6QD>%D0&D@6D," DA7!D,#DLC{e%DKU%&DI\&D+R)DR]L:+D@I.D=^i/D@5/DU`1D+!+3D~=3D4D4D,U6D,6'7D%I:DV=DA7&Q>DKU@D5*[@DJ^cIDLaJD6+dJDLa,MDLaIMD-%rMDJTzOD@LuRD"RDU4"RDJ4=SD.NsVD6"XD.#n\DLV0._DEbD?6dD5,fD.'cgDjD3/qD"esD6"8tD/%%tD@6%tD-vD^wDW`SwDW`s{DT\v|DV_x~D"4DR]D.,^D#GDMW D^`|$D-#D9]D#DU^HD6?ڑD8.̖DS@#D.$GDT\GDBVϷD-u3DpD5!kD5!PDLaD".CD+ DIRSDW`D6I(D-#썲D 6DI>AID4>bD3-D@T-DMWuD@5EMDT]i8D@6DDCD@KD+!D,8D%(;DI\UjDIS`qDR]&D=QgD%rDA8_DD* 'DL^3DW`D3+hD6"DI6)D,5 _DAK}D3֡DT]"DW`:DA7:D@7@D1)D,DIUkD# D-gUDLCRD#D?S0D+ DK]mD-#DXDWLKD6H,`DD9PrD86DwD7#0DH^DK]KE }E*3s.E?E.9 E:C` EU`E,5 E?`EjELaxEW`E%!E6!EC6!E#m#E"&EKUX)E?S+E@5,E5@w-EAU.ET]1E4`02E*63E:0}4Eg?EJ4g?E_`@E?S2FE7#2FE.f>GEC9HE+C1MER]vOEFPE?6'RE+#TE_TnUE#cIVEHRxVEWE4 XEXE0&XE7L^\EJ@NR]E )v^E@7^E9]`E7Bo cE@+WJcE_`YfE"gE4?hELahE@ThE?SRxiETLSiE?SdajE0lEI\CnE#+_oE-!jYpE nqE"x|rE7!tE.$uEAJwE+!axE?6xE7@~zE,zE{E8|E"7|E}E6"}E%EU_πELU솃E+솃E/%WEW`SEIAFsEG̎E9LdEC9ȒEE!)_RE4`&ϖE#E7#ER],ԚE/5;EiFELaaE?I,E⤣E@TeBEAUE5!/E6"vEA7vE"E_[gAEA.gAEET\ELaE@6EA6EU`E+HCE,eE0&7JE-kECME.E,>E.>E#BEU`E8EW`EIR!RE L1*E+1*E/%bE9]bEB]-ESHE8,E+>zES^lhE)E>RE-E6.GE*"E,>+EEEEmE/%E,+EE"mEW`EI\E.%PEE6+FIRFIS)F4>E>FISVxFG\$F=I}FKUES FA. F3ٞFK]F9]$]FU`F+FB,MFA.tF@T#FXL #F?6 #F-#1)F";*F-FAK .F.J.FA7.F@+/F%10FU^10F?`0F5F5FJT6FT\6F?I6FKU:FR][:F@+=F6+?FG\@F8$JAF_`žAF8$[EF!5zsGFzsGF!GFKF*6ONFCNvOF8#{OF+SOFI\QFQF5]SFD9UF+m9VF=^lXFKU\F4`^FJ`^FU`w`F,rdFI\dF:^bjF.kF@61CmF"OnF%πqFIR|qFsF6.tFLamwF>3wF.K{F|FJTG}F6F6"F*3FJTGpFA. ȅFK_aVF."aVFeאFU`ޝF?`ޝFAKFI\F6?FLa˺FFISԝF@5ԪFB96 F%F%,WF@5uF/%>FPF* PF"JFLaѽFLCrF5"F>R:F7#ӭFBFBFISBFNX.F`UlF+>F#F"eF#F=ItF6IUF#_F#/,F-C5F6- FT^utFMWܤFLa<=FF=F@KUF0&FjUFLU~lFLF#LF+OF=QFH^ F#bF-#NF-TF_`xJF.#+FJoF"$F?S27F"FA. -FHRcFJTF|IF" F+FI\BFFMWFA.F#+F5aFT\rFAU ,F/:F!,ҿF+(FKU(FAUF#aFF5>FW`\F,5tjF@TdF)F+G!G@5pTG5G,G%AG< GT\< GIS< GMWޓ G"!G900G0GGQbaG9Li~GJ4\G,>GB]cBGLC'aGGLaxGLCv#GKU1$G"÷$G"%G%G>R&G@6Q(G6?9+GK]m;,G.e3GF3G+6B6GISȓ6G:&L7G)L7G7#8GGQ8G*39G#Ö:G4`;G=3Z=G6"+>G,"s?GT\@GU^BG_`IG@KCKG@7)KG&"LG/%MGA.4NG+BvNGKC}PG+6\PG+!{dTG-WG+3fqWGK]+WG*5?CYGMWXZGW`':]G7@C ^GNaC ^G9]E_Gr`aG?TvscGW`cG+@dG^`̜iG+qNjGISjGGQkGUImkG*AmGNXoGI\&sGDL&sGIS&sG=QsGA.*uGJAwGHQwG6-5xG+!yG@K|G"}GT\_G6"zGT\})G@T‡G.UnjGTBG* G5!؍G.$؍G.+ 7G%GL^1G8$[GU`tG6?GǛG-#.GAU"GCMGKUMGISQ^G%G@6G#OG*w¤G$G#G@5ІG0&?G* {G7#FܺGKSGT]%{G,"G+G@TGLa G GJTG?SG4IGNXGW`nGLa͵GKU3G90GDXG@T#G,G>G@LϢG7LG/%G,)#zGU`#zG@TEfGLaGgG.$G+&xGG3G@5#GGB88G+G"GJ^'GU`uG6"CGGQzGLTgoGW`eG9]GBVG VG. G+!ޤGNX\GЌH@7$<H+HLCHB-PH : H-#: HLC V HKUf~ HzH?SH@5H+KH4`H.mHJ@mHA.H6" H7LH6"H8[H7A7H\A H6"D HLa HI\F#H6W&H4>'H,5N)HK@?4HU`4H6H"R:H@KIFHKBͮ?HLa@HU`>BH@TCH8$LH6.OH5 zQH'&TH"'&TH,!XWH3)WH"~YHU^ ZH@5ZH,dHUa-hH@I!iH3=kH!]kH-8.lH-oH-#oH+>uH*6w vHw vH+@^vH7/dvH=GvHMWdVwH_`|wH"ԡwH.ԡwH/%ixH%}zHL}HU`H@4Y\H.y,Hab߆HI\=iH!,UH"CwH53ڌH#6aȍHU`XHAUXHS^XHKUH>3HKH>R\HTLaHMW6H7CޜH+1HS^ HGQHAJmH?SBHEHI\H"H+!H-ǯH6^HU`bH,YH6nH.$nH8$9;H7L)ƵH.9[HI\H8C4HKU'HS^z@H/%yHIS(NH5!%oHA7p;H][H5!5HS]>HA6HIR*+H,"*+H6")HBV˒H%}H,HHT\]H7#H6?iDHI>۹HB]H"%H+mH@KAH4)?UH?HHUaHAKڿH+X H,H_`ՖHA@H%hHH^%H6.DHMX%HUaNH:C HKUюH/D:HI\¹HBHzHD:H.EI+IRI>GyI+!yI5!\?IT\mI-4 I.#Ϙ I)4 I/. I'IJTtFIoI?SoIISwIBVwII\pINX%ILaII\;IU] IA7R )II\ )IMW)I@+@O*I^@N ,I;,I5>tJ0I8IW`Y8IG\8I9IIS9I?`:I>5:I7#I.ީ?I"@IDL @GIJAJI!KI-# KI`LIC8RIDSI"4SI#bUIUI#UI%/VIKV|WI+XIUaKvZIT]6ZIU`ZIU`X\IJ ]IKB ^ILCx_I_I`I@TR`I@L-cIS:cIJT[dI[dI0& fICUvhI0&=kI=^lI@KlI+mI+!{nIB+oI"uqI7+krIJAsI8$sILWtII\uII\uIAU:zuICNDzI8{I.i{I|IGQ|IAU(I,I@I!W^IIII\ I%II9L.I?G\IBU\IMUdII0I4>ɌI=QɌIT\II/8 IHIW`f^IHRf^I?SI#wQI)IJT;I/%绛IT^ RdWIPIGI%.?I+ ICIU`aI=IkIIJTI"(I+FbI-#}IT\fID_IIR]IS^rII#j5IJT_I)RI6"I".:iI ݷIC3I.7̒I/%ILaoI?SaI63qIMWVI9}I+ I#+IpI@L/I097PIC7PI- IT]JJT` JW`hn J4 ZqJ,B]JMUuJ+!4J=Q?J@KsJS^$GJ,J! JI\D#JI\o%J/%Q&J%oX'J#+JI@-J?IT.JE.J+ */J@TX0J2J2J.8Z4J,54J?S5J_F8J7, 9JT\{\J6+\J7#]J][u\_J"tC`JU^EaJ,""8bJBV߱dJ6.N[gJ6" iJ7,cjJ+#cjJ+,cjJnJW9pJpJA6XsJ9%PvsJH^PvsJJTxJ6?_yJ8zJ6"{J!{JAU 3|J8$J-#JA.TJ5oJ!υJ-WJ6"yJJ5!)mJ)mJ! bJU`JGQ+JCJ*HғJ8J7#z"J6.JLaOJ.6J@6ΦJBV[PJAUJ@6JJTc*JήJK]J@^,-J@AJD:;J6?,CJR]J# ȼJH@ JA7ZJ@LJAJ`JCWJHR-JKU4J.9tJU`kgJ>R}J6-9J,J5!J@TJHRZJC0wJ8JA7J6-3J8$ nJ.$UJ#J.J6"?J"BJ^-JJ?6J3JI=7JCJ@5J#OJf]JJATJ3JLa"J51J6IcJ?SHJ?JW`2J5J6?_J6.JU`K*"/K@6KU`K7@6 K5@SK/%_K"ǍKB8HK@b#K6"b#K+.6$KAIP$K.0%K%K.&KBV&KKUrC'K,RF'K8$),KD.K-#.K u1KHR`5KI%/5K.8KV;K#z;KU`3M=KW`M=KNX=K@T;>KP>K9%sqGK@TOHK HKU^1\eK@7WeK=^շgK,hKCLiK6./kK`U/kK9]ثnK#-(qKMW sKLawK"YxKU`yK3zK@L{K6AKUaK9]5K5K߆K+!KK6xljK".S0K.KNXlK@6RK9%!^K.KוK>RוKMWוKKUDK3tܖK-# K",K,K6"?K?JsKKsK7#6K.$a1KH-a1K@7K9][gKL^3K7L#KgK+թK@5թKA.sCK6"aͶK`U K6^οKKCW }K6?[K6QKA.S]KI\KI\}KLaK.KJT}KI\K4>KK@6|KAUVK^IK0&aK@7KMUKMWI KU`uKU-4K90K  KUaKI\K,"KLaK6?FK",LUa&L._LS>RVLK@t:L)t:L@5^LL-v LI\ L3 LLa* L LT\ L(oL9L^L!L,L4 LLLara!L5M&L6- &L%t4'L+ ) (L@K-LG\0.LKU0L)0L6.1L+ 1LW`5LLa5LK]6L".Ն7L7@F7LDLJ:LMW):L7?|;LI6n>L%j@LW9D|DLFLU`>IHL/%\ILNXKL@6LLGQ/[PL+/[PL zRSLNXEVL* EVL6"YVL-WLJUs[L:&kK^L`L* IbLLa#cLNXpcL AXcLC0dL* tdL#!dL3*hLCW%iL>+#jL!+oL?7?qLXLRtL+ KuL0&nvLƬwL 5xL6":yL]`'LMW.L.%\LNL6AL.$4LA84L5/ԈL>R{L3=LS@!NL+טL*6LU^銚L/ٛL9/jÝL)]`L@6L9%tLdLWL!dLNXdL`UEL.;jLA7"L7MLXMcįL7#L9]ñL=QñLK]'LI6((LG=WL@6ctL.$θL5,xYL=QӻLBUL6"$L5L,5FLI\bL5,}LIRͯL\[T*LL@+ǍL0&zL\LMW{L3cLCMLU`MLKUpL?TL+!aL@LIRhLUL=L%LCEL5*yL#^LںL6"ںL?50LU`uaL6-iL-CL@5cLL6"L#M6"y{MM+M,M&MH?  M#X M- M6?% MT\>M M!5SM@&M)MU`M MM?SM-#M8$M6"M/%M,MA7!MJTЊ!MTLQ!M$M%_%M6A$(M*59)MVCG)MKUG)MR] *M<+M>R-M#a;/M)f7M N;M?U>M#>M?MI\ܒAM4 EM8$EMI\FM6"HMA.SJMHRSJMJTmKM+=LMU`@NMA8iOMBVOM?I+0QM6?ymQM-#=SM* -bTMC.UWVMTBUWVM0BVM.jXM"~8YM\M]MI^M0DaM"cM%ZFdM*31dM#KeM?HgMCWLhM+khMMWkMW`3lMI\nM"oM@5oMqM#tM6HW"wM@6^wM5!wM6?7xMT]'yM8f[zM+X|MHRX|MH^|MQ~M@6~M0TM4HM,"ՂM# M7@VM.$w^MD9VM#MB7M4>MlMJ`3M:.*M5!DܘM"=bM+!bM6"ĚM.M WMLaVM* 9M?I}M-~M"&M@7PMJT M,M7#I M6.qM+EM6?ˬM$-(M@KޯM#˱M@L!MU`aM7#M.yM6":M>3\MIRüMCy^M#BM=^vM##|MISM6-uM#UMMsM-#W*MT\KM-#MKU/qM-&M#MITyLMR]M>+IM+!MV_`M+!HMA6#M-#M#"M#MG1M@5mMxM#M%MLa"M6.q`M,6ofM]H.NW`NKUjN9]xNJT\N5)jN a N)RN+NJU6NA7HN@7NU`NN4)N*";?N7N#@N4? /N N+ P%N@Ki&N6"ܙ)N.9L,N^{-N+.N+ 82/N00N0&2N!, 4N3L6N6N_^6N%"N6?T>NReAN@5ANU`DN!*DNU`GGN%HN"-CHNA9iHNHRiHNS^JN8.NNK]TND90UNW`0UN@TLVNU`5ZN,"ZNU`s[NQ?s[NJ?k\NHRk\Nh_NaN"obNK]bN[bN+dN>T*kNN`ZoNDXZoNAIdqN.AqNKUCqNG\tN~wN@5 xNJT xN8qxNS^PyNLDyN!yNA7JzN0&G{N,|NA. }NMW"NNJT݂NiNLA%N4>RnNMW~EN@5 qNyNyN*5pيNB]BNA.BN"PN9TӎN%N.ԓN| N@6scN6.~N+4TDN5!TDN,NKUAN?JdN3KgN,"N[NKiNIS(NN9w:N-N*5[N.SN=Q6N@T'cNMWN,6.rN#N#/NMASN̺N5!NT\NN fNAUNNA-LNGQLNI\NNI>*NNLV?NNI\tZN.nN@5eN_N+NI\N@7VN+yN9]nHN/%YNLWNJ7NU`^NIRoNNALN8.^N8$\NFuNT^NLa N"BN%[NA.xN8$CNNT]FNJT$N@7N+N,NNK]LN+N@T7NHRAN9L0N6IRN"EO>O8C݁OMWO+O_3OLVf*OO O_`F O7#} O6, O+" O+ Q OGQOK](O@7O@I O*OW`O5!kNO,"!J O.C!O%"ONXI "O!m"O!7&%OUax^%O^'OI\f(OS^;,OC.o,OI6-OBV-OW`.OKUHL/O][^0O0&1O2O5!2O.2O7#f6O?S:O5*,:OK6M;OO+ BO`UBO@TBOBO6"GO5!3KOuSOI\UO8$UOJAVO/#WO][WOS^ZO@6\O?3JA^O^O-^O8$%_ObOcO"dO/#i?gOGgO^,hOT\,MiO6")jOU`RnOLConO=4joO+ pO6+gqO?`gqOU`I^rO@KZwOJTZwOH^P yOT\P yOU`P yOJ`zOU`8OU`^OIS:O@7 ĈO>3͋O7L܋O>RwO/%YĐO7@O-@ٖOT\4QO9%!O4 ODXOU`O_`c֭O-&=OALDO"+O6IYO,SOAUἿO%O6"!OT\s`OW`&O?SO!*`O5O,"KO2)OI\OA.fOyO#,BO* O.PO-#PO.O4OD9O9#OO!scO+[CO"qOL:O6.O#5O@T1O53+GO5@w`OsOAKO"OI\NO9]]OU`0OLaOK9PA. P:7PP)cPNXxP@TP@^i PS@ P+!Q P@5 P=ImPLaVP%PVP-P /P6?PW`_PHPWP"P=S%#P.%#P5!%#P7#-%PW`4%P,'P* '(Pt(PJT70PT\Fm0PR]1PB8h2P#2P.R5P:x5P>R(6PR]u`7PU`Q8P+ R8P6.R9PU`iPyPP^9PJ`aԵP!aԵP-#PKVvP6"vP,"TP*5P/&CP"PTLZP:&WoP-D8P6.KP PU` P]`vP+2P8"PZP%TPJT%PI\)PU`f7P?6JbP.A P@T PPU^PU4E0PGP+HP9]aPLaP4IP.#pP%&]P@LQP,.`PR]f PWaP)P.`P.$%PGQPP/DPR] PU`WPKU1P"SP=QPS^W`PAUW`PLaP"'PKUYQT\(Q.j^QQT\ Q.b QA6 Q5@QKUQ8Q%QMW/Q@+QU`bQQ7#QXB.!Q9]h%Q,"~'Q+ K(Q#(Q"L(QU4L(Q"4ѥ*Q-#*Q.#2QW`8QI6E:QAJ\:Q@5+';Q+;QLA\QLa1Q4 4͘QKU4͘QHRژQm/Q,"m/Q5!m/Q6"CQI\Q,x7Q?T%|Q3"KQ,#/Q/Q#`Q^rQA.ۇQ-#j%QI\utQ+]utQNXQQNXcQCrwQyQ:&Q7.7QVC␿Q>@$Q6"$QA8cQ7+QL^:Q+IQ+Q,TQI\sQ5@0QCbQ=IQ%GQ-"XQ_^Q6.QQ_^RQ8$RQ.hQ@6RQ,"RQ6"Q-nQ8$wQ>RQLaQ>}.Q6"{Q"ǺQA7Q@LQ@KUQ+hQW`#iQ* #iQ#Q"?=Q5?@jQIRnQQ@5QgQ6"KQ+ \2QLVxQC.Q%vFQ%ݜQ-#Q7#BR8:RyRBL RR7C RK R, R6" R- R*5RJ`NKRD91R7CR@T`R"YRR-#C R+!E`R+ RI\$RKU~$RC~&R`^ף&R#I&R* 5'RNX|'R'RS^(RBNĪ)RH?*S*R6-+R0&^O/RX1R-\33RDX67RK]@:RR`W?RAUIRR0&R,"XBR3R4HRyR,!)RU`R?S@R.6R@T7RHTZR9]R* CR>GCRKURI6JR,"GR+!R7#R6"R.RT^9S#RSTLvS#U[&S/%F_SC98SCS SU` S9% S"d S^` S-ipS=SNXS?6SS8$BJSIS^SLaS4IST\]!SJ8,#S<#SR]8$SLa%SCe'S6+g)S#W)S?S~,S:CN-S%Q'-S!)/S* Ʌ1SU41S:0(3S-4SLV/6S@5}8S9LV8S7#?9S+:*:SMW:S@+:S#+:SGQ4_?S6+VCS jyCSK]oDS+{ES6HSISIS+3ISmKSU^rKS,AaRS"TS,"\qUS6"YS/%*,^S?U_S&J_SBV_S aS.0aS>RobSK]bSS^cS?S:cSC)dSLWWeSI\20hS>I9iS+4 jS,"jS+ lS,"mST]nSPoS-# pS%pS@KrSI\gtS4`E9uSA6CwS=ImGwS=QiwS7#2yS?SJXSKUS:0%=S+%=S/%SXMv,SA.lSCSGԤS6"`S@I S3zVS.$S"S>0&SI\0&S0&SHRSW`qS4@juS+4IaS٠S@6sSSCW\S,"RSNX!SJTIS#VSJTҦS@T?SHSC"S)S3+ݬSLaL-S.YS[mSKU[mSH@TISJTдSU^SUaS=Q;SH?0MS"1S#SUaSLaSUI=SH@SDS@K>SDuSU`wSwS:&ST]SNXS.^S@T^SGQHSo4SLaYoSS3 S.S6~,S9S6.GSDXS"8SR][S S-^S?S8S6?S+S-S:6S7#SdSLApS׿S^@ST/7STL7T8DZTLa"TD9CTC9XTC"ۛTU^sT ߤ TTL TT]> T_LJ TW`k T"> TU_DTJTTTCyT%RT6?-TI\ [T@*^T T,"<&TT\&T6"6f*TT]6f*TR]<{-T..TJ`.T7#b1T\I:1TP4T+d$5T#6T,6T9%I8TG\8T,":T+:TTLS;T%u;T?Su;TKU[=T#@HT%^dIT6?ITU`ITJ`KT7_LTD:TvMT6+хMTƨQT4`MRTJ4tRT?`tRT.6QST#yST-TTT\WT@^PYWT>YTAUZT6" [T?7~\TLaY]T?46]T=I^TH^_TCM_T.9`TJT͕`T=Q͕`TQcT.6USdTJ?fTRgTGQDhT@6~kTB7&nTJToT=QoT*roTU^roTUJ+pT+"rTB]uTEmxT"\{T@+,j}T@TzTL^zTLaT#.mT+4#~T-#T,WATU`|T%vT6AXoT"U7T ΖTT\T6-T9]TB]TJApT@7IT4)T:C9T. T:CzTDNTTJ?hTBU4TJ`VT^o T6"(T#@TLa*8TW`FTISJTKAxTA6CTLaPgTLa,TD4T"pTNX׻T# T T5ATLVT7B~T>5:T?7TCU&T9]>T%iT:GǿT +LTAT=IT+!KT5@F7T8TAUT@K\TT\qT5qTqT#&TA.+TKUXTR]THRdTW`)T7#T"yT4 cT6. T.TW`?TM:jTS^jT@TAT7LPTPT,"T#T/%T+!ST6*cT.jT6"bT=T@TcT.QTBVTT8STqzTCTLa}T*CTGQ,U".BU@+bUI\bUHRU6"UT\9RUW`tUT\ed U-#R U]9< U+ R U):|UBVGUG]| U4 | UϊUS=UL7TU-UW`U,B!Uq#UUCˆ#U> #UA7$UCH%U>I&UI6(UMWr[+U.-.U?I^1U=@h7U5K+:UI\%?U#%?U".AUI>BU/%7CUEU7,eEUT\uFUuFUT\tFU@TGUI\HU5@%FIU5! JU`_"BKU6"iKUB]wMUR]zKOU* WU* >XUYU^_J\UMU^U*5t^ULa^U_U6._UbU+^cUpdUH@gUT\hUCMKkU6" lUNX\lU3+nUKUf=qU+hqU"JrUrU5@tU=Q^uUuU%vvU6.01zU@5HzU@LzUW`~UK]2U6"2U* ɁU.!U6#U@5/dU/dUISULa4ߥU#,nۧU%$UTL^VU-^VU6.UT]UU6+)U6?EU+1]U5!w̯UK]궰U9]s\U+UI\'UKUlUW`VJUH^%U*5U@5z U+x UH@`U?5c}UW`ULCUBU,U+!UIU5U-pU+GcULauU6?CUS^1UUAL@UA7yU,U+U86U:ChmU6?hmUI\+U5%,UK]UI\zU#(UGQXUITUL9,VW`VVNWoV@6ZVMDzVT] V=& VKU V6. V,5LV)0VV=I}FVA7}FV@7VVUIV>RV* eqVJTzV?SLV#7 V8$oVLaV!6fVI\V%k"V8A"V#9'V6?(VJA?*VMW*V+,VI\o.VA.o.V1VT^h3VU4΄4V6"/8V\[x8VT]+9V+9V9%=V۫?V"2@VI\AV3%BV>R EVR]*FV-#GVLa HV>~NV!**NV!PVI\b[TVJ^sUVMW YXVT\^VR_V@6_V@LU_V"aVT\cV7,dV+dV" qeV?6hVLahV@^hVHRdiV6.kVLao-nV@^nV-#4qVJ`rVDԬrV.vrVLUotV9]BuV%KuV)vVKB1wV*|V.~V"w~V7,~V5&~V*5~VMW~V@TVL7F`V;V=^(V^[VeVJTчV,"WV`V@IÎV)wVK]nȒV"7NVAIqVITsVHV.E6VH^E6V@IV9]RV++V8uV+ ~V<VW`V>RVT\LVJTܢVW`ҤV)3hV5>OVBVVLUYV,":VJT VC V"EV5iKVT]'VAJFVC"V>VAKRW/%WW`W7+1 WW` W9DdWJ` W6"W.$mW6-W?U;WUa+=WLaWkfWT\2W/:W=3 W:&F!WR]~F"W"N"WLC##WO%WU_%WHR)WNa6,W-F-WT].WGQi/W6?}5WHRz6W7#6W@T6W6WTL%7W-#);WNXY;W#;W8C>W^>WU^?W8$?WЩ?W@6IxAWKUGCW6ICW,CW+7CW+!DWI\=XHW#0IJW6.fKW@LLWJTLWU`OOW6.YPW7#QW#QW,QW4 ySWA.@SW?6TWJ`TWT\9$XWN".YW"2YW6Iy]WX_W+eW.7hW-#lhW7,ziW1nW hpW7LqW8#}qW@TqW6.rtW.6uWU`vW,wW8wW xW, yW6,IzW"O{W=IXW"6W.WW`8WaW7LaWKU?WWYW%ąW6.)WLaXW5"NDW%V:W@7WLaWW#W6I WMW W@T#[WH КW* YW"@WW1W6-WqW5 WqmWA5 WU:W,"+ߘW W+nWI\nWUadW>+FW,gW7+sWHRW,LW?SW6"x3WS^x3W8AMW@^ƓW@7`WI6LWAUW#W0&W+W6"W* w"W!*-}W7#9WAUQ6WbWD9W7WTLW3>N0W6?n@WWJTYWW@6W@5RW.tW^:1WLaW>RmW@7BW,B8;W"bWNXGlW%,WKUGW W/%W[W7#syWiWA6zXAKW_X+X%XA6eX7-¨X"tX6"_% X: X+X@7XU`XNXiXJ`>XR]OX-#7X:^NX4` X;DX6"X,A4X^XIS^XGQX"^!X`"X%#XIS#XA8fX%X/%J(XR]ss,XG\ss,X?4!/X+!/X0&)/X.$0X+43XH^z4X=IDe5XKV6X6-6X@T"8X_LG8X-#9X-s9:X\[Tm:X9L?:X>X@T9?X-JCX-^CX.5DXT\+EX%EX-#EX7#HX-#JX*55KX.9LXT\ MX4 oOXAUV3QX y RXU`6TX>9VX!$WX@TTKZXLCD^X!`XGQ`Xx`XNDaXU4ybX6eX6-*fXITchXchX0&iiX%jX=^mX8h1qX.luX b{X-#|XJT|X8#}X Y9}XI\{ĀXIS4X6dXT\6X7L~X+3X>NUX?6bbX=GxX/#XS^#XG\#X9]#XGQ6XnX+" XLa, XpXMURIXR=%pXLUtX-tX"X"ۧX#9$X+!X@7\X.X-#1X67دXW`X.$VX_`VXGQܱXAUX X3XƳXAUX0XT]NXՑXЪXCЪX5XW`F]XJT{XAUZX6.ZXV*}X+XITFX,)X/#fX@5$XCGXT]X(X?6 XT^mhXqXCW#X8$wXX?SXI6XAJItXBVJX=^XJTXnX.#3g Y6.#Y6&YT\&Y+4O'YK]N=(YA7)H(Y,:)Y-#)Y:UIl*Y6?+Y?G>.Y6@>.YU`>.Y9Kc0YT0Y5!0YA7(&1YLa"K5Yi6Y?58Y@K8YUA:YLW_Y*:`Y7+aY!3}=cYGQdYHRfYJT)viYC.mY>RIoY8rYT]rY\[tY.9avY"xY.KzY5,_zYCY {Y$}Y-8nY5ӀY3"Y6"jYU`YbdY"؉YR]YB8 aY@5ZY=^|Y+7YYB6[Y/%tYA6lYړYT]SY#QY4 ϛY0&:՜YBK4YY,Y%7YU`7YB]Y!3YMWYJ`/YT\Y  vYW`xY#\Y,"YR]dY0.NjY_^ݰY"Y.'YC=4Y+Y>5+Y*5YHRqHY-#PYLT LYU`rYJTYB]Y,Y".CYKYY.Y,"YYU`YLaEY@6~YT]YI\WY##Y>RYLaYUC Y,5GY,]YIA#YK@5Y#YT\Y"nYT\O[Y NY5@YXWY8#Y !YUIYMW~ ZI6MZ+4cZA_CZ. Z,*`Z5ԑ Z:D ZI%x Z5? Z%TZ@^ZVZ/%]ZZ6+Z,DZI\FZLaqX Z4I"ZZ."ZLa!$Z@Tc%ZI\}%ZW`(ZDL*ZNX*Z-#s+ZLC+Z+Z=I+ZT]I/ZJ@3Z35Zabf5Z.5ZI\Ձ7Z.z7Z+_;ZT]|?ZLa?Z@K[@Z5@@ZMWr@ZMWaCZJT0CZJ`0CZ=SqFZJ?[FZ7#GZ9MIZW`JZ.JZ/%LZ>+wQZDXQZ=3QZ9%$SZSZJTTZDLVZITWZt[Z6+q\^Z6?^Z7#^Z+gB_Z`Z6I`ZAUqaZLa jcZ?5*.eZyfZ*fZ-$fZ"jZ=^5kZ@7MlZ-# mZS^ZqZ4=ItZ>RDuZ6+duZW`[vZLA]wZ5#xZ+!1yZ,"#zZ+^{ZT\p|Z,|ZtZU^aZ3)XZUZM:UZ%:<38Z?6vZLaqZH@XZT\XRZR]ZG\VZ,4Z6.hZ+ ZZIRPZ,)lZZEZ+ ZZ7#Z6"bZV5bZ,"Z7-$qZ6"Z+Z6I6Z5!ZH^ZȍZ#9ZRZAJZ5!Z#nZ@LwZ@6AZ",Z6IbZ6" [+ [^!T["[-[C[` [H^ [.6 [W`9[i[.J[m[B]dW[/:[8A6_[6"Е[W`j[>G[x[.$0K[+4A [6"U["4[VLI([8([6([#~\.[/[A6|2[8(2[W`/ 3[IRyF4["V36[+u<[J`B=[IR9>[JTu>[%&>[+6v?[*-@[@5@[KU!@[BUx@[LaSsA[IR8A[#g[,J[Lad[^`y[&[LWx[L9j{[Ҙ[+XE[I@62[B8҈[# ʧ[5#X[0&腫[I6[7,[Cg[z[6I [)Tr[KU~ѳ[=Gt[#lw[-?[Aɷ[I66[.6[> [.#@[6@[_L[T\cZ[4`[KU[@*[@7D[T\D[I\\%>\+!pi@\TA)A\>B\6?6E\+ K\* 6M\U`N\5!6U\9U\gsW\7#X\T\X\AUX\B]Y\@5zZ\R]"[\5(\\D:p\\"]\"]\5*W_\?c\6" f\6.Eg\-i\K]/j\)lk\>il\I\o\>p\! q\)ns\U`t\D#mMv\X7%z\@5z\>G|\.9@}\5~\+6m\5#m\3\.\5\+\+\_`n\6?ĕ\,"X\*6K\@Ka\"ؗ\IR@\!\N\+ [\\A@\Ua}\5AMJ\K\,\IS\>Rt\JUM\wT\8ݯ\LW O\:CJ\&8P\DA^\I\\"\W`\9]\>NQ\=I\0&\+$\UCq\W`j\6.-N\C:"\>\."\?`΍\,M\>Rw\+7\-\?S]\@T\I\abe}\LU\][9\.\@7\J\6?J\GQ \@TT\x\\L^ \LA"\>RV\.L\KV0n\+\9]\#\0&ߕ\TL|\\[\I%c\,C\+!,\KUb\@6%\+ \,\A8k\?`]R]>p]Ϣ ]/%]7C]@J#]LaBu]%\]]]KU]U_c]?Ti]6+ ]3x$]U^%]LaM)]>R)]6I B*],6qy+],"",]TLAh-]-]6"`.]$0]R]߀2]@T3]Lat3]-C4]z4]>R4]Ua6]:&W8]-#:]TL_?]JT?]%+?]I\CA]C_A].C]3 E]/%BI]LVBI]J^J]@7K]?I;K]AT:L]@6 N]O]HR-U]+3W]H5YW]7LX])bX]W`)\].$;^]@+Q _]J`_]/%b]+ Pe]:Ce]+ٜf],Byg]"77h]+!qh]+!j]-Xk]_`m]4USn]AU|q]B:{q]Hr],gs]-es]+4t]v]6Aox]KU=}]S^=}]GQ`~]-0]%}]6I}]Q]7#Q]/%Wf],]=^#]#1ߌ]@LŎ]K@|]BV]]?S.]T]@JQ]7L]LaN]MW]@5D]+OI]G\]I\]KU1]ISH]L^']HR4]=^VV]T]]6.m]JT|]8$k])F]x]]UCZ]+c]`U]Ü]?S#]@6 ])]]R]]!$]%']Z]6?v]4)L]- ]"J]C]3]M+],z]IS]6+Z]U^g]KUsX]JTҁ]U`G]AIZ.]]6A ].]AJ1]#Xh]:&]U`]?`G^S^G^9]d^?S^9B^+e^I\Դ ^A9 ^MA ^,V ^A.^+4!^@KR^A7^*4^0To[^I\^ #^@K^_`"^I\$^J`1&^B7f'^-# (^6AA+^)@E-^9Lk-^AU0^?73^6"F6^T^6^U`Z9^)ؐ:^3ؐ:^# <^6.*=^C-=^5=^+)>^=^(W?^6"?^. jB^H^C^+cE^JTlEG^H^BL^U4M^3$P^jQ^SJ_Q^.T^ W^7-ϷW^/aW^Ua Y^3@Z^#Z^%Z^`[^aV\^W]^[~a^"ya^@+4b^6?>h^fh^@Ui^l^:Cp^U4q^A7r^#r^-t^A6u^Laiv^@5 w^,x^?TlKy^@Te|^e|^3*}^][$^UI ^U^ۼ^4*͊^+!5^-#.|^6"Qڎ^T\^HR*Г^@L^B7^%ǎ^7L! ^AI! ^6IL^6Iħ^ISq^,< ^@^o^6AӼ^BVwݭ^8B^LV-^*5ܯ^9]V^DX_^@5.%^.^C8ǹ^6.^7#l^@7^+^!^6I ^0^^3JY^KU^U`^T>y^+y^6"^D0^JT^6?O^^H[^T\^6"^,"}^*}^A7 Z^IS Z^LaG^K]lG^4S^AKJ^I>J^p^#9?^+?^0&^!) ^.^B^@+^LTq^JT=g^#;N^N-A^5!?_CX_-#{_{_6" _^_ _6?R _I\ _C7_RUT_?Sī_`T#T_5b)__A. D_>Rj_,"_#"_-'$_I\}$_AI}$_L@ $_6"$_8$M]%_KV*(_@52(_MW\)_7#*_.*R-_U^=-_HR5._-#5._".~._Uat/_6.ď0_U40_80B5_37_NX#9_^Ӻ:_MWӺ:_@TӺ:_AU;$=_,u<=_W`N@_T>E_U`:E_T\F_.@J_gK_+5!M_J`M_KUM_+O_+!O_4`2R_@7 S_gX_LaX_W`~Z_J[\_!)*^_%*^_53fq__+B`_La_b_>R_b_=Gf_0&{h_-tVi_R]k_%Zm_3+r_6?s_T]"s_,"/=u_4`w_J`l{_9L{_#_.C_La _3=w?_5!Ȅ_R]ۄ_La_6-x_K] _BV_:&_`Ut_,p_._?6_6"e_ISJ_S^_KUJW_AU_UC1_)&_"Ua_.#_#O&_#+9Z_C̸_C._/9c_*  _+!<_La<_I\_GQ={_#={_+!#_@Tb_Qj_C_:8q_L7_)mK_A._AIOa_"Oa_!Oa_* &_6"4_"4_@6]_/%_N-ѭ_!_g_@L_!T_>R_5!_+!h_=_La_?S_Җ_6._JS+_U`l_6II_=Q_-#@R_!5_>+l_S^e_-_/%Mt_)_6")_/%_)_@6__@66_:_8$%a_8$o_@Lts_گ_J`,_8__``4``AJ `I\z(`AJ`"Ҍ `J?wp `,B `% `|`-# `I\y`,`+>`8ui`8D`@7>`A6`W` `LC `@+U!`'y"`7#"`J&`6I)`7#-)`%^+`6I`.`/`51`6"mY2`@Kh4`7L8`@78`%W :`KVp>`+ ?`+!>A`RCA`MWC` 6C`M`6C`K]E`܄L`%BM`GQ N`U`4S`R]SS`%=W`I>wW`*=Y`?6Z`".e+[`3)[`JTI^`% ld`I\wl` l`T\l`CLWn`La0n`,"Zn`KV,o`>R,o`I\so`%p`6?Br`-#ҽr`T\y%s`?7Lu`Latv`!*v`H@*2{`"a`6.o`+@=؀`R]>o`6-F`l`AU[`@KD`UaD`GQ4`La4`IS运`v`0&`C-~`?Sy`* y`V˙`:`.``UaT`J7`+5 `@5Zќ`@K``KU E`I\`%˩`KU`Laѯ`KUR`+`"`q`5@`.`+!`^6`7#P`HR d`5A]`"4``6"l`+!d`-#wf`,P`,5P`5@` >`,u.`8$` `-6ek`HTߔ`>R%x`W`9`#D`H?y`7#y`"`Ua`NX{;`#{`#{`,"`4`z`+7;7`MW#`JT5"`V5`Lab`AJ`+8`4 F`:&F`#}`@5)b`=^&`8$+`6"),a^@a4AaKUSa^_ya+!ÞaAK a4 a) a0:aJTa=I`2a`2a.6aT\aBUBabaa@UQa6"la:& a#!a-$a@Iq&a>R(aJTJ*a/.aA.51a@KK1a,X1a+23a6IY4a%Y4a* @.5aI\O5a$8a-#_9aHR4:aA6Ei;a@^m;a,"AaVGa6.sHa" 8JaI\Ja8$JaN->La7@{NaDXNOa3QaUCG*TaC.-UaU4oJUa>51SWaU` XaJ`Xa-qXaHR2l]a+4V^aGQV^a][a^aI>ز_aNXU^`a`aU`GaaISTba@7AdaKU\dafaNXha6"ia5 ja_`kka+ 2napa6?paNX qa8$:qaS=Msa5?Msa3T1ta+LtaLawua_`wuaIStua+1uaH3>ua7#Y*xa?xaXxa6"Xxa@5{a*  |aJT*laoa?5Ia",a/:a.*Va6+ a*6$wa,a% ɉa7#UaC.Ùa"!a1iaLa&a8,Ҕa-,ҔaC,aDXa@5`a5@)Ca,gaT\~a>4ta@+ha6+a+@a6?aI\uaaC-VaaC8@aU`a?Sa/%3a*6\a^7a# a,Aa}a+>fa@Ta/%gBaa6AsNb+4m^ b0 b7LQb@6b^Qb.bCLb!b8#bU_u!bI\}#b}#b*5Ґ$bU`L&b'b.9'b* Ա'b6.c)b?6.-b][0b?S51b0b1b@51b?64b=^%6b-39b.$KRиbH@b7+~b+bW`bB]Mb#Mb5d,b3qb.AbPb:.b6I4b.b-:bW`b3:bb+!tb5"v>b7L&bA.b+ bLUb.$|b#A=b=b+ͮb0&{&b.b߱b+!Obͨb,"ͨb+>lb.DCb5!b5bI6+bI\8b>Gb*!b3bNXc7Loc5!zc9%c, cW` cC cU4\ c c8$O c c'xcAIc,_c6+cC8}c?6tc+'%cAI$&cJT3(c@+w)c9]w)c5@*c*c.2 -cI\L/cJTx0c7#[0c.1c+!92cJ5cAJT5cW`r7c-#m8c-#L;cJTL;c`=c+45@cFAc,AAcJ`Bc@+=Dc6?EcB]"UGcHcJ`Jc?4~bJcJcT]2DKcY?Lc!6^Lc Nc?6QPc!iQcoRcMUc@5"Xc>RXc7B_Zc3[cL7k[c6"6]c=^6]c]c.$^c@+`c%.0cc@6>ec5+>ec-~hcHic-%jcD:RkcB]blcU`blcR]mcDLxnc5_oc>Rqc=rc?6=rc+vc8$^xc.ܤ|c.])c[݃c5![݃c.Nc7,c.9c7LcI>{c#֜cncK]ΒcJ7c@+&cU`cISIc.C8xc#)c"$c9LcW`BcLa'cjcR]DUc+@6*c9]6c@66c6c!]c5!ѩcD c#cHRyc%CcKU-ncC"-nc){c@Lc5 c?HcGQcJ8D&c%c"ccJT׾cI\gc,?}c!*c@KMc@IWc~c7+%c:c8$~Bc>6c*c)4c+>PcT]c,qc+qc.cHR(cGQlcT]OcLaOcNXOc4`L&c,67c+c6+A c?ScI\c^c6I8c+Ac.cC8RLc9]QcA7c6.Ptc0&c%c.RX0c=?18c"cc9% c.c8cU^"ccI\Cdcc/%cA6c6+[cL:;odBVd+d&dLad.(d,CW d.) d@6 3 dLWz d,Q d d4Id@T7dT\_dZodddA.d#fd?6dU`dK]d=^d#,ud@KBdLUrd-#4 dU`4 d>R'd#'d#=)d)dHRF,d>,dJU.d_.d@T5d\6dW`c9d9dA6;d6"6;d+45HdUaJdB7,NdWL,Od6?byOd%OdH^Od@TOd6?OdU`OdNX1Qd9%1Sd#Vd(%Vd5!2Vd"WdT\MXd,"![dUaQ\dbd\Iehd6+QmdA.bnd@TBpd!rdcrd)ud#ud9TbvdA.wdR]#yd>==zdLa=zdMWEzd8$5zd{dU`w|d,ܳ~d,ʀd+"dU`_d@5m d7#IdT\맇dNaadAI dKV.d@TɒdHdNad_`儘dT\Ҧd5AҦd6"td.td-#td)d".pdW`]d6"8d,"ןdU`&d@6Kd5"d)d@+9Cd9]Jd.-d8bdNX(dA8$dL^jdd/#;d#>ḻd>5adL^J˳dT^d7+cdd-#qd#1d"4dDLl^dU`d@L!(d>RdCd5!/WdKd=?j+dT\jd6"d-#d@5dCdBV]d^d0&[dAJ2d3>UUd+"ad#9`d", d d@Ld`_^d+d\`=dITd6+d@5dW`d5d#.d.d`Ufd>Rkd%ԣd!7d!dBUd.*d@7sd#+zd7#Oe,";eU`-eS^eT\eW`em e6A: e-: e. e, e\` e-$ eMWe-heC8 e+>e}eHR}eS^vDe7#vDe,5He7#Be>6BeMe6"MeneH^e9% eI\v"e@L "e?S|%e=QR'e?6<&)e#֑)e@T֑)eLa6*e8A*e>+u+e7LB-eIRF/e7,A0e-#wA7e:C8e+!9e>=;eAUJ;e+=e@5=e%>e"tAe>BeDBeIFe#GeDLtqHe,tJeGNeW`QOe(QPeA75PeU`5PeT\QeqRe"qRe+LSe"(Se8BVe@TBVeW`Ye+ 1Ye %Ze% =Ze@TI[e"&\eB6*]e)o1_eT_eT]tce>5vce7-#deنee5*gehe7#yieDEje~me,=neMWne?Gype+@pe@LueCue.P[xeI\xeHRS}eS=eLaGe7+ꒀe3+{e6":Ђe"e@L\e+!We=Qze7Lke-ve5!~e"4$e@L$eI\÷e+ye6#ee#ee->qeL^"e-#T^e9%e@Ke@^ eA6 eU^eU`e.Nʰe3>ReAUe+eieSe.$e+4׷e‘e-#b%eAIwTe- e6I[ee)ge7Lge6Ase@L̝eU`eI\Se9Bee4`LeH?ıeSeC.+eZe.e0&ge/%Qe+ 4ee7RI\eKU\e, e+Xe/%PdeAUeGQeA7e@7e}eHT eU^Vf#w@f+fFBfK]9DfAI7Ff_`Gf7-GfKUQIf7LIf4* JfI\gKf2Kf"Mf/#{PfD0Pf+ bRfMDbRf6ܫSf8$2TfCUf@5UfI\;Wf7-S0Xf7L,wXfYf5"1H[fO;\fUa]f!]f?S^fGQ_faf[SRafA6%bfT]RdfT\efU`Cff+3jf%P1kf5!(lfN-lfLa qfQ>rf5 )sfT\vtfKU vf"xxf"~fA#F~fUI f#f7!f7#5fG]f6?+f,f:^4fMU㝊f6,ufMWufKU)Ѝf6Af8fCfE"f+fT]7f?=;WfB]Yޘf7#:f?52YfKU2Yf>Rf#f,f-RfUa)fIRf3+f@+fC ff.5f1f6?rf6?f%)f]^)f][mgg9Lg6?gI\- g+# gJTk g( gU` gG\ g@^gJ8|g>Ggg6" g)>g@TgLa)6 g"t!g9B!gS@#g-#:%g"%g5APx&g+}{*g>RG>,g+X-g-0g0gR]&1gJ^@1g+l2g2g"a 3g5|:5g/:v8gV9gR]9g.}:g+!P;gI\pRH Zg\g>\g Ld^gKU_gNWBzag\[{egKU{eg>Rig#*ig%gig" jg"kgHRlg@6 mgA.g:&>g~g)g9Og+g0&Ҹg%VκgJ7gI\g_`g@Lsg5gg.g-#hNggg5"`g6IgJT0gA6ngTLggLaig`;gg+ygC-\tg#bg.Pgtg7LΖg-#gmg>g g*6gg6.g-#/g#5Ogg0dg[g,>gJT<gLg+.ZhSH98 h,Ôh:h#OhAU|:h"QfhO`h4=O`h>G<h%@WhI\QWhWAh[ hU` h7# A!h!h#hA7S$h43&hLaJ'h9Lh(h.h(h7#P+h9]q,h.cM2hH5/]5hCՃ7h>Rg;h0&;hI\AhV_AhT^Ah+!QVChGhHHh+Ih@6'Jh+LJhA.DpMh)UMhNXMhJ` CNh?SUPhukTh.WhT]4Xh+KZh7-}\h,"]h8/j_h-#k_h6>bhAU,ichJT.eh6"jeh?6hh):kh6?'kh7BE mh6-@nh3nhLanhI\6}ohXC.oh,".oh6"qhUCshth7AQ2whJTXxh9%jxhxh8$xyhU`I{h~h6I-~hIT\hIR$hMLh*㬈h"CՈhA8hW`QhS^Qh][h@LsϊhISތh-hK]^h=3юh)>ԐhI\XhI6-hDLőh* PhBUߖh3!+hTLJ5hR]hJThJTEh7#dh推h`_&hIT+hW`GhBV7hhh6IXh3+h#ȶh8B\{h=IhA.ch%Sh-#fmhISLhKULh5@ h6?fh6+hLVh.#6h4>*hLTh+@h>R$h6"h7,hISh9]h6I8whhhkh6"vh7@OhU4'hA.h+4h+!fh+!h6-`hA.hI>d>hW`Uh6-hMDjh?Sh){h/%Mnh6IOrh|h)ZhMh7#Sh*5!.i.#v iLAkiISkiKUi+if7i,fi/%;i#qriGNi%ji5,i&8.iD9vTivTi3+i"6!iI\d!i+ Q>"i7LQ>"iKU#i=IF%i}&i?S3%'i*6m'i6+ 'iU^(iB]X(i?4,i+P-i6A-iB6*.i*.i!%0i7#0iB]cE2iI6i3i]`6iBK(9i7L,9i":iT]_:i%/;i+=#31i.6>Ši,i:&iDXiAIǦi@7'i9%¿iIS i!iCݫioiMWi6Iy׳i.piAi:C3liUiR] iT]i5Mi4)㺾iI\ki.[iCLjsi\[FiI>ci0&i6?i`_5iGQgiI\fi#"&i_`XiJT?hiI=?hiR]Fzi F%i!oiAKi>GgiI4iJ`iiLV:i7Li)6iB@ui!*i@6XiH@55i@K+i/%+i-#^i.>i6+jiLa7i@6WiT\8#i@^i@+"i#M;iDպiI\i+*j+j#b^j@T: j Q j@Tk j.M jYj.$,aj\Sj!wj"Ǯj9%&j,!lj?S0jNXjU`9jW` j6.j6A!jLa!jBV"j?6^%jKU%j%jT\N*j)5[+jBAޒ,jޒ,j")-jU`-jC#.j+ .j/%&0j%j4j0&8j"H9jI\jLa?j@T?j?jISwEjR]:Ij+4Lj+ Oj-# PjA77Pj.PPjGQPj8$hSjIS/UjNX/UjDX*CUj.IAVj7#Vj :Wj6?QXjC-/HYj[jD9@]jGQ_j>_j%:-aj"6bj6bj?ScjRdj fj.fjT]ugjAJugj7LvfhjI\ijijNXtmj6?SnjI6 ojCqj%߸rj9]<5sjAK9sj%sj/:|Hyj /yjGzj"|j.$QjUC jJS4qj7?Rj#mj>R2j%ņjQj".1j"6jǍjKU2ŒjI\^j@5lj-lj8$j8j/#&jUa-j0&#{j+j+4lj+ljj[^@j7#"j.TܭjI6j+!!j9#!jD#,jLUjj%hj5!CjR]E;j%8ȿj-CjW`0jS@jKUj"Zj"jLa?jT]j.$j8$~;j@5 qj0& qj,"jAICj%~cjLTI?j=^Dj9]Tj.#jUjAUzjA7Wj3 j8$zj6#9jR]تj#Vj@6j.6"\jR]jXj6+QjI\Qjj7#?jMU]j.Κjj5!2jLa79jJ jALj,ukR]k7,k5{k+k3k@Ik- k#lY k:.} kIR kJT k+]k=Q<k#]6k/k3Kk kkNk"k9] k5?ӛ!k3+H"k"k8.w&k?`w&kLa(k#Ū*k.y-k6.2k 6k)=X8k_`8k-#49k+69kH@U7:kA7^::kI6;k* ;kA.;kNX;k>R8>k6??kLa}@kU4'Ak?H_Wk#sxWkXk4>]\kAU0^k6I)^kR]h<^k8h<^k8-^`k/%Lck,"gkK93hk7#jk#jk@6*lk/7lkA.nk_pkI@Spk"uk"%fvk+!kwk-kwk#Gwk?G7wkR]7xkJ4zk7#:&|k+}k/&~k-@~k+!k+kAUk%Ճk݃k.Uk%%.k@>kUak@6ƑkIR'k]k=Q+kokKUk,"vk+kUk+6Uk*K}͗k"7k.Ǣk&љk@7k6"ٛk>Rٛk?S۽kKUkU` kISK{kdkU_EkEk0&Ek,pk+ 铬k*k7+kBVYkJ@kI\kHRpk>R?kFSk$k?Sκk8'Nk7#Ck# k4>6k.ikik7#kL^~bk/:pkIRkH@*k+"Sk kAJk#k?S%kAU;k+;k>Gk," k#ېkW`kk,k){Gk*6IkW`$kDLRkCMMXkk.9k&kA7kLawk7#5ukKUk#Vk"kKUkAUvk@5^kbak+ kRk-lElJ?NEl]H4l=@ lI\ lU^ lGQ llTLl,"ưl.LlCW?Cl?SXl+Gl.l:CMll+ ul/% l*6d/!l_L@w#l3T#l#6%l8#&lU`&l%ނ'l@5ނ'l8ނ'l-#)lISZ *lI\f*l+f*l>/l48 2lI@Fa4l6.n4l.r/5l4>y26l*k6lNX8lIS7#9lG\(;lKU;lLaB{AlKU"Al'QBlMDlsDl+FlI\,$Fl@5LHFl@6hFl*6(Gl@75HlISQvHl+!UIl+3Jl6+Nl9]NlHR+'QlQl.#ŴSlW`cUlIRDVlB8XlJTAYl7,\Yl#]l9^l7#-;^lLW-^lR]n_lT]`_l7#_l?Sdl glKUOgl,LhlCFCil+kl+8VllU`eYll7BmlA6إolQwqlMWsl6"Ctl.$Ctl/% ul7"|l8#$}lIT`~l6+Vւl][lmhll+l/.l%;lDl4"lJSlJUlU^Hl#6lI\illI\lJT)l1l%1l6"XlSVl.Ml.69l+Bl6l4`/l"tl#tl,Yl5l_lR]/lLUPl"͵l9]#lAUl6A l  ?l-@ l3>ClHRлl=^l.#5l@T*l7+l#rl4`9^l.llKVVlU`UYlISVlD9mlAJl*H'l7L^lLa lGQMolT\7l:.,l,"lA7hlCW%lW`7l3)(l.1lH@l?SlllDX7l@TJl/:rLl7+9}lW lJTDl,'lW`l#\m9%m)mI\ m_^mB]mKU~mIS m7# mLU] m8D m@^ m%.* m\+mT\m7@rmmAUHmCmm][PmI\K:mGQKm_L}mH5̶mC^m6? mLaq#m4IUI&m#\b&mH~&m?GM*mJTo/mU`o/mGQ?1m5!|y3mW5mLaW5mJTW5m?S(5m-8m@L8mIS9m%:m#:m3Ԅm@LbGm7AGm-#ziImOKm@KOMm4Om-#4Om7#4Om!hPm6+hPm>32Pm.Qm-Rm@5RmW`UUm* ȣUmK]Wm.YmNXYm[m>R^mI\^m#E_m`m,"bmI8jmITkmS^͌omU`͌om=Qiom5"rm9%3rm^g;tmU`g;tmG\um3m~vm7Lxm zmI\(zm6?Gzm 0m:&m7%Հm%N/m,Nm@69mKU~mDLmUaJmT]Mm8$;m.;m-#mW`ߋm-#`ZmLam͍mC8tm@7&mIS=m mK]am6ImmW`m-mC'mXWm>R^umƞm.m#+m@6BmD>m?SD>mISmm>̨m)L_m?Jm@K,;mT_ދm,"'m4`m#m6?m+mLam6.ݺmCݺm/%׻m-"%m@I-9m-9m?6fmHRfmU`m,!mHRim7,mA6FmLa$mfmAUfmKUSm3+I m  mI=7mW`mBVmG\m,m_^BmI\_mSG m'mGQVmAU;mW` mT\m?`mBK@mUIm6.m_`=m0Ctm0&m#m4`e]m,Bm@5@]m)hmGQRmU`Rm@T@m,@m#[m5@m+ zm[m@KmPm,"7m6.Vm?Sn6#9nn@7 n nFnTLn%rn*!nAK9n.nAUnKU Gn6?!nIRn7#nT^Yn.$n"Pn6+N0 nI\r n"!n7-!nW`#n@L(n?S@,n3aR-n=?^-n6-]/nU`M1n#2nT\:3nA7qY6n%9n,"CEnR]En,hKn#MNn7#PnW`TRn4 ;Un-#ZnC]nW`@h_n5ananG\cnJT]$en#;enofnMWNhn5@2lnA6_qnDLMvrn9]Vsn=I+vn>+Rvn?SznU45r{n,"\}n6"k~n#.~n_`TnW`#nAI⇂ninin6"8n"┇n0&┇n-#Qn.n4`znNaUnR]n.'nR]'nT\A}nR]n-#xn+4@n3~n=Ifn8.zn@^&nn ʡn4)Un-Ln7Lʥn@T=n=3XnI6IhnNXݮnKn.#n*3KnLUιn\[n"6XnR]wn.$уn*5gn@Knnn0&ǨnLan#0n6.ĉnJ` n" n#PnV_nIS^n6"^n,"ɇnLan>+xnK]xn9]GnT\Hn"=n7#n0&ejn6.en6A2n6?}nW`Ӷn"nB:Un7+nL7nT]n9L!n,n8$n5!nmnn.Cn7,nIRn,"n+!n6#Rn6.HXn@T(Uo5@o#9;o8woT\~oW`o6-2oH?y@ oLa o@5 o* o@"poUaGAo%DoA79o?6G_oXoUao6.o7+oLC oLVB"o* #o*3$o?@sx)oW`Bv*oIRd9,o7+ -o+.o6v2oJ3o.h4o?Tȹ5oAT7o%oa9oJT=;oS>AoCo@5Co+bEoIoI\Ko6^Mo+iOo^`o4`Po,Po.o^:ؓo,oJ`oU`JoAUoI>]o5!Aɧo)YէoENoKU-oMA{oUaoR]?o?So6+mRo7#oB];o=^] o5?) oo,=o@6ko>R o#ooT].o5,o-#oJTho?S3o*"-oBVBo6.2o>Rl|o@5o.$o+4Jo>oAI5*o6??o>o6-9KoIT'oLajoT\&oMBo?TԭoI4oo.$"(o8$hoNo6"oJTo%1oR] o+ oCM<o,"<o5!o+!oo>)8pU?kpJT̻pS^n pW`z pLaz pMWrl p#hIpC9 p6.mp+"Mp0D"pD9"p:9p=^bpKUpKUpIU pU`p5!˗p/%ђp4=p+ 81 p@KrA p pI\k!pK]X"pT]I&pL'p-#$)p=*pT\)*p"4J4+p=^u-pDX-p)/pI> 0pMW0p@71pI>;2p7.3pHT,a5pS^~5p5+pL9p7-^9p-&:p,;p+;p5?pK6ECp# Dp.bLEpAUyEp@KyEp@LFp9]Fp@^>Gp?5pwHpIpJ`qJp6- LpTL}BMp+tOp1Op#QpW`<#Rp%*RpU`Rp.Sp6"$TpAIsTpI\"UpXW-Up8,Wp6"EWpKWp+cLZpZp [pLa,]pD9]p* b^p.$d^p/%d^pC~_p+ V_p6-dp\[ep?Sgp?S ipipU`lbkp6?הkpT\]kp/%"lp^%mpJT}pp"pp?Susp@Ltp?SNupIxpLW5p:&5p,zJp#Mp=Q|p#<}p6?ΉpW`/Rpyp6pkp6Ap:.#p=^Xp6A p6?p=?qpT\dܗpNXp?`:ip7# p%ܜp.̝pLa̝p9]MpK]=pܤpW`pJTpI\|`p"냪pJTp"lep.9pWp+Fp=4}p%)p@5Gp-p6@p-p* p?6=p%pg4p?Hp+p)KPpHT=Yp>pHR#p>5up@7pzppnp" pp"4p5=x[p" pA6ap@KLpI\z4p- pW97p@L0p7#pW`Ip,p3+p]gp!"\pT\" p"p%pqC9PqR]q3q.qW`q^`3q@L`q+4`qU4rq@TK% q:C0 qW`a'qBVq+!q@Lq@5q8$q3Aq+"Aq4"hq8/ q7AHq$Jq-#8q#؏q=Qq@5$qAUq.$Yq6.Iq6.% qTL\!q-!q:C$q-$q+g&q(@'q]^1I(qR]M)qISh,qAU.q8$/qI60qT\)1qW4q6?4qJTE5q6-z6qMW7q6A:8qLaLA8q@^z8q#z8q.:q6"d=qJT:">qJToAq6mDqU^Dq-#Dq@5Dq.)Eq7#Fq=^:FqUJHq-#.IqNX.IqT]'Jq/%Zq,Ha[qS=[q9]S)]q/%u)]q+]q^q]`&`qaq, dqhq6?jqBU:9lqklq6.nq>rq~;sqIRQsq+BtqLaBtq4`NuqHwqW`zqJTH {q?I{qJT{q]}q6+Rq ,qIT ZqLCqq][+\qAJoqsq5*qCfqT\gqI6qqaqJ`NJqqΕqAIﰙq?SﰙqMW4lqU`q.qCDyqq6#qKUY3qG]bqqG]qI\'2qU?q#qJ8 Юq- Юq+!NYqKUwqqW`q=@q@Lq-ٻq-#q5A۬q8$(q]qnq#ǿqJq6?q+@Nq6ASq@TSqJTqNX`q,A8q+Oyq+ Ǧq6.7lq:^q@^{+: r5!r:CN"r,x"rI\#r.%$rT]j%rabv&r.*r6A+rT^ ,rIT~-r-5".r6-".r8$R,/r?5/r0r6?x3r"a5r"d5rK]7rKU*t8r=;r,G;r~S;r"~S;r=r<>r+@r%YAr6?Cr* qMr%Or %Or@6HQrW`Rr,"dTr^zVrUa![r+!![r+![r[r-#ٽ]r#^rC9C`r/:OzrALW|r6?h_|rh_|r5@rsrCWrrLarI@Lr#Lr0r"rC7NrT\2r/%)r.$yr+7ËrrŎr* yCrJԑr+ʖrG5rr"rr,=ܘrDLr]^rR4rI\JZr.գrLaJr-Cr6A"r.ūrLCr+bcrI\7r+!rGQrISCrNXrrISr][շr,/Ar.$*{rU`TrTL0Er87rArC9drAJr7#r!ۘrH?rab\r#r6.0rTL rAJrLU1rCWfr/qrrMWhr͚r͚r?SrR]Jr-#r>rJTrxr+xr/%fPr>rHRcr=4rKUEr5,Lr5svr@Lfr3 rW"r7#W"r6"*rHT*r4`7>rW`r@7>{r@5hr.!rwrS^rMWrLass+ )sJs 3osA6s.s* [Ds,sLVs6-s3s,6sJ`*sA6s@K s"2sR]NsUaNsJTNsS^.sI\ s">s8HBsLT sNX#s4>cs*5_ds,"&sLa,s5@=psU^{ss,!PsK] sNWԮs>zs#@s8\s5s"Gt@TU[tD9Z tAS tMX" tIR t%tAJt".t*6 t6"t5!Pt7.Z3t+!!tH^Ct@Kst5+t:6 tLa t@^D$t6?%t_`'t/% ,t*3,t,t>RC.tW`73t+ M6tISM6tI\!T6t0&MGt%~ Jt.uJt_`LNt_`uPt@5RtU_JSt@6xVt7#Er\tKU}`tIT} ht-5*ht?6Git-@kt96nt.Hot6Brtsrt 9rt@T6JstN_wt?SN_wtHRvYxtNWizt7#b{t6A|t|t}t@T[}tW`~tMW~tLa]tT]t:CԂtA7Ӈt/7(tLaxtT\UtaU3t"^utW`볕t+NtI\[*tIS[*tG\s tI\t@^<˚tJTqCtU`Et5!΁tU`tCW<"tJ`[JtS^[JtU`-t@Klt+!*tI>/tI6ŮtISt,wtB8Ct!3t"ut,"`tIѵtAT&tMWNvtUCC^tS^t,Ώt+>t+%tQ[#tI>t+Nt+0UtU`>t5ozt#t+nteItLact!et9]RtBVF t@.0t#8tW`]tB8Ӱt)>+tJTt>R"1tUatLat+!0t-kt9]t%P_ttT>t"pt5+pt.5u" JuW`u#u@LuAIuu"4u5o uu/#u5!u.u uJTu u@Tu uI\u7@&u-8 u-#!uT\ W&uJT&u8$c'u6- '*u,"+uIS ,u7#,u.}-u-uMWD0uAw4u?$@9u. :u D?u#5H?u3Au6" Cu\[Du.$Fu%HuCJuLaRuR]G,Su@5cTuLWTuL@Wu./Xu%1Yu?SYu>RZu5?\u?--]u?S*^u6?)_uC+`uH^u`uA7`u8.8auZauK? au@JDcu," huCiu"ju"JkuluI\wFnu3Lou-Cou,puMWB]qu,XruC8bxuzu>3{u{u* 9|u,Ӂu*,u7#Єu*"Єu"uDLuHRlu+6(uI\ u]^uJT*uR]HuCuK5 u-#u-#+.u uG\սuT\tuJTtuI\cu#WAuGQҥuIu#u\u%mwuLC*u@6uGQͫu7Lޫu-iu@TbuB]Եu7#ζu^IEuuJTuKUu>R<0u.$Ku]`uH=CuA.Cu5NuA62bu_`u>u`Uu+u+duU^uAUu DuJ49u+!`uWL)u7L}u>}u6"vu.%uW`uVCau+tuu6"@u6@u0&uUCBu@Ju@+Ku9uT\uH^u=I_$uuW`vu\uJUu>:u)dBu9%auuR]uCL u.u.u4 N u:CZu iu7#\uMWT:vU`vAJ*vMWsv.$xv[;vA7wvv*5vA7 vK]v?+v#+]vKU؎v-#I}vI\LvH^VOv@50JvISx_vKU\v?S`v $%"vI\I"v,2#v.#c#v7Lk/(v)v,+v#+v-#.v3vHRP3vT]6v%]v6v3h9vT]h9v?Sv0&0@v"_Bv" BvKU{Cv_`&Dv%VGv,Ba Hva HvH@IIvA7Iv7B(Lv/%mLv%Mv6.Q)Rv+!Q)Rv,"PlTv#Tv.6Uv6ICWv,5qWv6"}[vK]\v_LH]vMWZ]v^`]^vл_v6.b`vISS;av`aFbvA7ev6"f:gv* AKiv7L+jv@5mv@5mv:Cenv pv\`Prv.$sv36vv4`6vvLaWxv?I {vA7o{vNW0|v:&6H~v6?tvU`Qv=^Wv?):8vGQfv6"כv7v7#ʉvI\{?v/9v?`v6.pv-Fv4>“v.%9Jv`bT+vNa2vU`Zv6I'v7#Gdv/#vKUvAJۢv6.v 4^vA7?=vLAv6"[̬v%l vMWv7Lv@5Wv~vI\TvJT1v@+|vJ7v\[vT]_v"Avv+ vHRUvQv"|v6"5vR]&v?6avR]fvvB]|vLCyRv+4>vv+3v6"͘v+Sv-#D{v8DVvU]v"U]v@6xrv+xrv".vLaw vv"sv@Kv6+$vT\ihv-#rv7@< vAUnvH@vAK?sv?4A#v_`N\v.$Lv+ v%vTLv^[\vvJTq~v76v6?Uv-#Zv8,vLav4 vJKbvMWbvKU37vEjv=@vLaɻvv6+Sv6?-ov#B/v@52}w9]wJ`U5w@Lwdw#(wYwWVw-#{w-w",_w6?hw*0#w6?$w4&w+{(w6."d)w*5"d)w:&y<,wH?-w4) 0w"0w.0w+3w.DN3w"6D3wLV96w#a9wPy:wLaݺ?w3EwEw@LIwAUlJw+5GLw#1Mw>=NwGQOw.Qw8$Qw:C Qw#^(SwT\Sw!TUw4>9Uw6.UwC.kUw@K_Xw7#Xw+!'\wGQ]w"2d]wC9]wJU2G_wW``w6"DfwLaŇgw5"RhwLW9\hw=^dhwkwkSlw-lw* /dow, pw6-b]rw5>4uwLa2;vw ww@6 ww#ww:&zw}w!w7#w6.ׄwA6wKU鞆wS^wI\4wKUw0&1wIS1wU`ɍw%Y#w@TVw`Tfwdːw6"rސw#zwDXzw5A2kwJ7HwA75/w,bw@Tw.Fw&w.9wtwBLtwN9twba'w8A w7Lǩw7,[Sw%]wW`Fw ȳw4`wLa:w@LwJTwIS۷w.9>MwI\9wMW wUw%9wNW콿w9Liw,.ww w.wIJBw+Tw:COw@UF w=QwD+kwMw8$qwWLw.w,w_`w"4ݏw9BwL^w3=w@6wA6jw7# xW`:xH^ZIxT>>xI\OxTLyx6"@xK] x6.Lx#+xIT x6?Nx-(x*5Px6Ix*'|x x nSxAKxC.x6"5xL^{x@6+&x/'xC*'x.gL(xT](x9%?)x>3'*xB]-+xU`+x+x8#.xD9E/xAI 2x:C{54xR]15x)S;x`=x.+>xT\@x+!@xA7UAxA6\Axa4Bx9]Ex6"BHx@L!HxA73Hx-#eMxOxR=|Px+|Px6"2QxVK(CQx7AQxH@$Sx+ Ux+Ux.UxW`Ux7+NYxH@qZx"<_x bx@6gxITgxJShx\[lx0&QmxJTԑox6"DrxT\Qrx#sx-txvx.$x-#Ux.$UՃxGQGxJTzx:6+wx@L:jx6@Zx=3x4)VxMxG\C݋x)Ax3+QWx%,]x-Hx* x.9ylx/$ylx/&xxTLxAJ-xIA=xU`3x%xIRxAK2x.),x?65x+!_x7#x%x9LM@x#XxC+oxT]x-#"x@7"x@5x%XxIS\x,"\x5!Q&yB,Iy+SyI\yGQy.$3yTLny y.%yU` yS^ y@6 y?6 yA8y8y.Kxy:.iMyLaiMyGQiMyI\Py6IvyL^w1yy!,syAIyR]yR7\yISyCWy?SyNXyAU y6"#yU`1v&yB]1v&yKU&y"4;"(y?`(y8$p-yGQp-yR]7-y0y#Fl3yKU3yI\4yU`4y=I5yUay;y+>yLVO0@yT\AyG]ҮAy%ϽDyV_DyVEyDXKFyL77FyKBW3GybIy_`%JyKKyB]PMyMy4)nOy Qy,Qy.Qy?=D Uy3Uy+ Vy 8Wy%CsWy.lfXyNXtXyXyS^RZyUC2 ^yUI&iby+|cy.gyISNgy&egy4`%jy#&ky. oy^`py [ryS@ry$?syT]Isy+4jsyDbty.s+uy7,6vyba/wyLazyMAzyK5yy6IU΄y@Jy* My3yB6Syy@6Sy6y.y5+y+ky,+y9%Iyyy* ҒyDL\ܔyUayJ`Ԗy".זy* %UyLayCyW`xy\[y#ByL: y5*jpy>Rpy8AfyLay6.բy7#yJTyBV8Ҥy7@Py `yV_y,"fly+fly7#y3Zoy6"yyB]yLa|oy6-py"yطy)¹y&y7+&y@+Fy@6߽y* yUa1y:&Dy"yyKU\y py#yy%y#y8Yy* uGyUCyyC9eryCL{;y%qyU`y6.Iy=Iyy*5y"Uy"y@7y@TQy.=y,6~\y:^y3;y.;y+^By6?zNy4`Oy%Oy6"JBy*5JBy#ym%y6.yS^yH^Pyy6?zzR]iz#ƿzI\ z6. z. z"CcK z z," z0& z@Jq8 z@5f zTL z,#Gz=I2zR]jzI\}z9%}z".T^zzLV;z6I zI\2z8Tz#-!z)~!zNX "z8ʷ#zLa!%zW`\%z-Ce'z7L@w(z"(z+"I)zI\*z.zU`Z2z=Qr2z+86z >9z#7:z_`;zKU(Bz3#<>z7#4*AzR]ūBz9LJBzH?yCz7#`"DzN-&Dz>R@Dz@JIFzC9IFz0&IzUa!Kz6"NzC.NzGQa@Pz+ Qz"m,Rz UzJ` WzT]DYz- [zR]Waz7+*dz*Vez=4ez.{fz fz+ iz.$izEejz,Ljz-kz"z,lz7#lz@+jnzK]nzSInzL:ipz+rz5"Yvz=?lwz7,xzBkyzLa#Hzz6"Q{z8"|z9L ~z]^Lz Hz+6$az>3#%z6?Jlz/%Jlz$-z@Tz5!!%z,"Az#Az@KGzLagz4>@zLagz)z6.?z%/5zUI/5z6Iz+u̝zI\u̝z7Lu̝z?`=zC.=z=z#zJTUAzOzzb z,Ģzz@J3z-qzBA5zz?Sδz6"Mz@Ldz.ӹz@K: zNX"+z@57=z+!zezI6>zT]NzI\'z5zMW\z+zA88z4`IzT]z]^z@Txzz,"L/z# z6.zAKazKzLaz?6z3 z4`bz5Gz#0z+0z>zW`#z)-zU`4z4?zR]DZz^Lz?IzCWlz+!_zhz6"!zz%ξz8C{I{5~{!6{,{7#) {+Y {@LQ {.`{LaI{%{I\{.{ + {"7e{B7~{I\a`{I\{{@L"{ ,{"n{H^{=^=s{KU#{6"#{9${.0${%{H?({JTE){6"t-{*.{3>0{H50{0{C2{Z64{.C?8{-?8{8.:{+A<{R]AB{@7C{La٣C{#=D{6- D{!,`G{@6>I{GQDI{.$2I{-#\M{Q{I\ {R{+IS{ZS{6IT{T{+T{6"A-U{@5X{U`,mY{6",mY{+!a[{) ^^{-#_{G d{)g{ATOj{T\Oj{J`4j{.CՖm{+!_n{,"Wq{+4Kv{I>v{6Aw{C9Wx{0&x{"SK{{+{J8{U`{JTz{@7{Lτ{U` ]{MWi{@Tx{#({W`u{.u{".Q{$KA{U`F{AUM*{%7{U^`{HTn~{* n~{0&{6"+{ Q{JT;{TL{c{t{A.?{ٺ{KUT{>,{JT{KU{:3н{NW {xG{l{G\l{NX{=Q{* {7#{{KUX{6,{1{GQ{La{-#u{u{+{{,!*{B:8P{U`{JTh2{:CЙ{%{?5{4H{+@{GQ {-#Y{"-o{. {B{6"F]{+3T{JU{>{IT{"{>4X{+ h{La){*5{MW{AI{#&b|  |+ n |-=|^p|3>p|#>nN|K5ʧ|,"||U`|4`R|?SR|JTh|*5߰|"4DC|?6V5"|IS%|?-M'|S^(|6A*|/%!,|'-|A. .|..|6A0|+"1|S^e4|.(7|66r7|8t1:|* t1:|?6`M;|#;|W`X@|!-A|9%;ZB|I\E|@6F|A.F|,I|.oM|LU\MN|T\N|/%N|D S|5S|#T|6IU|W|{Z|#X\|LaX\|T\\|La_|R] a|+a|SH/a| e|KU_f|h|IRk|W`m|?6Kn|C6o|AU Wp|MUUu|K]aw|MW {|?S~|T^&|LVS|.#|+!|La|JT|S^|6I|6. |7#|_`|NXؒ|6+ |#|,jX|%|JT|5,.=|8CE|7,|4`r|I\P|>!|)|B]= |-#= |@69|9%η|R]uS|#|B7ٽ|-#|_LW|I\ d|K0o|4HO|6"ƿ|@IX|?5k |AUk |@TQ|A7{|^IO|W` |IS |G\|7+8<|.}|:C|:&7+|V|8$|5 |?T|-#(|7@||4=d=|F|F|6"V|SH;|Ua}}|HR'|A?|A8M|A7|!|"4|+4i|5!i|#Z|IS|LC||6. 6|I\Bi|U`|LC|A7N}A7l}-n}+4}I\ }T]}6+}D9}T\U}?-}AI}U_ }@72/}A7}R]H}6.}+4}R]gu}.&}@^&}>G~u+}4 P,}5@.}./}6I!/}@70}I\3}\Iz9}#z9},Y?:}-#=}" >}4>:>}9]pB}+@C}LaHE}"!H}9LH}#^\J}>L}@LM}K]!O}+Q}MA?2R},>S}C~T}XMU}6.U}$dW}9]W}L^"eX}."eX}5!X}La[}>z`}T\]b}U`1(c}6.`e}W`~e}6.ug}TJm}U`%n}6.n}@T?n}?T?n}8Aht}U`}Ju}^u}\Imv}I\Ny}DNzy}:&O~}La\}W`8ۄ}:.8ۄ}* 8ۄ}.F}}P}>I8}=^}"iw}T>^x}6"=}/#yC}>51}LV}d}8ӛ}I6}.9}-#M}Ǚ}IS<}?Sǡ}+ }IS}>R}U`,}-5(}3+}BVU}6?r} ʮ}7BӮ}@TӮ}La }U`'}S^'}ATƜ}:&r }B]}TL}>Rӷ}La`}KUҹ}A.|Ժ}T\;:}?`"}UC}JT"}IS}C.8}6IF}@KҰ}JT}I\},6/},#O}"}8B}>+-{}.}AU}MW}}U^}_`}8$*}5+-D}Laza}f}9}T}KU}C-}S^}JT})}?6}I\}La@7}A6}}6A}#Ov~Q>ғ~+ғ~@5h~, ~B:!~T\W~GQA~Lay~y~I6y~@7R ~% ~U`~@5 ~JT7~KUJ~o~%Z ~+ s~6?s~La~9]j~~~9]~-~8$^#~)%~=^{&~@5'~.~?(~7L3*~_L,~. R-~U`.~.i5~U:t6~.=7~U?s7~i9~4 ;~?-Z=~S^&A~A.JA~LW|B~Do'C~H@ԚD~G\YE~+ I~UI@J~I\@J~6?@J~5@L~W`|N~NXQP~_^QP~ISGP~"tR~.#ƑS~I\S~=^PT~+!2V~-#2V~/%X~@69^~#^~b~?6Kf~R]h~3h~,}9i~?Sli~4>m~m~HR o~#Xo~@^p~=IQr~6?g,s~6?Ms~ISu~.9u~8Cu~-Cv~v~GQDy~+!&{~-~7#O~7+D~A7D~A7s~7#\~L^+~"^铑~HR~K]ٽ~W`~AJ+~+!=8~~-~AU:~.Uۡ~BK~6"~LVG~@H~/%~) ~4`) ~@Ta~La~+@j~?`~VU[~^I8~+8~,$7~A7$7~#Yi~O6~A6lW~@6e@~J`@~UC~DN~po~A.po~,?~"g~6+r~#no~#no~4 c~-I~AU~7A~/%~Q~Q~TL~BV>~8$B>~J`f@~~MWj~Laj~>Ri~~W`~@5~.~5-~@6#~JT#~IS#~?S~K]_~,"S~)~TL~@L~+ ~0&~@K\~NX;AU|6 La!?S`GQ|&.@+> W A A6ՊMWrAUu@K4?4bo +*+ C.*,"*W`ƈ"XU`La7X?S6KB La!#$".$I3&5&La&T\&9]BQ'>6)Ƹ,Ƹ,JT(i.6.0G\(1B]?1#"3- 8%z+:GQU=8>6"=@MWjALCʰBI\WDW`DLAH@JDK%M_N_LP*3P!3n QA6 R RBV R?SMXT\.YQYKUq4Z5K\@7d]KU^3)_i>RiD9m?T~dqCdrs!+tD.tISO"v6"x* gqy?Sy-y?S{C-b|HT}]o=^'#B]?Sb%: #>юLT?I9#ʖ4 R=^O+-#7* 5*I-#%T\qN0&5+H#e,~8$'G\I4`nI\"qBVN:U`AQ함CX8$hJTAJì`]GbAJr#JT)*5G; !98.³6?u.dU`{g5H3λ+7H߾T\~D T>+VGQvM֖T\֖GQW`0>RE">5 5*ߍ.I@ D9K@TKJT,.MWrI@6"O+\5*) AU@5%FT3֫JTN=B8 D?]0K2@LOW`[#s|L7s|#54=!+@La1%B7 % +;fR]6"8q X .+ % * rNXrU`YMWkwU`7L"+IA.5NX5T\{?SK~>RI\6"{#C98HR8AU8  GQ &La,&I\&LBԛ*GQԛ*][.][/6-/!,55@w5@K"7ATq7+@O8"2w<6+=>.?3?@TRAI>YCGQH+H0&JUaJISJ4>qJS^:UN0/N8/N7#OI\P.~qQ7"Q6.6R!*BTR]BTKUkgXK]֨\*3H^7#E`+ dMWdD9~eHRf.fV_g.9jAU2j@T)`k7LKm6IKmMW`m;pTLBq,#s#sT^v|tB7Dv%@w)w*~|+|" ~I\O^}!}7#ANLaTLjRb@6 -%ꗀ@7QBV蛀,>蛀C'@L,A6ǢR]"nU4nU^$:2݀L7QLCI> ]]#y"@I,8E6.LaV/%p=HT\W`:%6"UaAAU2 HR% KU}AUp#p6"׃6I00&0b8$@5P;R*dU`d#8^p$^_B5%4 d(-#@Q*GQƿ*L^++m05@6K60V6_^b9JTo;>):=^=U>,q @J`5AU`,A@+^BEkCqCRRDT^D%'F@5G$-LW`{N SN"P89PRU^SU`gS?I>LTI\9UA7D=Z,"Z7,Z5,\_@T_Laa_-#|__`*a5"a#a*5Cd>GŏfLai.$i!Yl!QrU` sDXss4 t=QyT]}z-}[;~+5M~3EHKU"Ɂ#Ɂ3+,"2d6- L^쇁|,l7+@ݍLa@ݍMW7ώ%;\S^? H@XMrr8+K],J`8w>R혁N9\[5J`LaMWzK]殣>)+Tc#9V_TLV__L"uNX%#o8+",H=LClQW`*3 ױ=I,l5R]ovK.CIT"?S@6Su6At4@6NI\D5@@ā3Ɓ+4o ǁ+![ǁMWǁAJȁ_`=ˁTĹHŔ?S4́7A6́NXFρ8ρ.ρL:Aҁ"*nҁHRҁ0&Ӂ,ՁK]؁I\ځ\[Aځ+ 8$N#}I@7#A.V6AIi8".36ƙUaI\76"JT;4?ۅT]7#)^ 5 :&j Ua iU`?6d@6ԛT]0LaW`6"Z}NW4?6UCMMWP K] !MW!-#*"-x-":&I"I>#_L$AK!(5)U^z\*7"~*#\*JT+>+,>RX,K8`-R]Z-I@(/#+(/I>R0+ 3Cua7R]*>KUĩAA8weB5@B.6\C"ƩDUCEAU GoJNO*qS53TG]tU`YjuYU4YY#~PZ@6Z[T]c\\aU;Xc"~cd@Jg9]gB]gIS h@7PiLVkC;wm-rn?So6@=p,"]r6+t#>w6.K({:^M{#Q||LC|+}}K*})WwK]Ӏ?S倂W`倂La:ق@T$'7L텂MUKE6"a:S^a:SJff#+2R]5@B]틂6I틂=QRSLC@I#+e.L@6L.LaBG]Ck>Xϧ"ͩc>R«ѫ%뮂7LCﰂu=^ͽ?SV䲂%9]̬?6KUG ‚UadÂI.Â* [Ă8$.ĂU`.ĂNXĂd+ł,łIS?ƂMWǂKɂɂNQʂK]ʂLCM˂?͂+!AЂUaтW`5ӂ ւI\%؂7,\؂HR[b߂LA߹߂4`K _`?TLW4?~7#ERT]7# @K7AI\$w3$w0&@ T\ LVIW`Ur@T]L@IST^.U`MW 6.XT\xT\nR]L,MBL,7L`4``@Tn< \[!6?!@T"I\c$6B$,"/'6"5+6.+I\2,7L,5U/Ci0@T2^_7889%N9k9U`;T^J=T>~`>W`}@S^7A]A-AW`CI\ӻEU`ZF+!{J?T%KITrKMWOJTMOGQPJTQUalR%\S3+}U@TXXW [W`\I\@^AIb8$>9dW`|h6+ kU`kLaal"m@6/q8"Ur6.r?6r#r,os`t6"Sv.#IxU`x5!x"yI\ z3=}0~N~JT~@T)La1+4]LC})؁,#$/%$+AA.OWBdd".dd7#$@T$Ua ދ?S.@Ỉ7#锃@+ij4 bN"Xu0&0:CVBU@T#}٤A.7 &* I6 ,z8${KU4 bT\p@+AD6?&Y6?VrU`$@68686.ȸ0&w0&)A.)aLN/%ܿLa9%ÃAK(ƃyǃ~ʃ_`ʃ+/̓W`^̓76΃% #σ+σHR҃D9փITփ0&9؃9ك7L9>ڃUۃ>܃* 3ރ>3ރ@7".߃T\A߃6""@{K6 ^#nYI65,VS6AVSI\-JT][6.B@Lz@+MW`A.yP5@yPH^Zrd{I\>%_IR\I7"8 R@5$#‡CUNX=^ʳ. \I/h 6?}j?`}jJTE N]DN]-_@K*0&6n0:JT N9i,U`}j* * T\ -c#.9$)q%6"%J`ș'6.h]*8C0u+U:0u+8:+@6+3(,%s-25@DI4GI4U`5MW5KUg6+g68?SR9#9U`m:@Ty<" n=">W`n?-#T@3T@0&@@7U_AT^LDʂE+5F+5F.oG#GH*LBVN* OUa{P+{PH>{PG>)QpSI\V,V6# ]VK]XW@KQY.{]TL^?S~]_CQ`6*xbLaNc:&ocR]e6+jKUclCWo#9s+!=u#N wISw@6y#R{NX 7L)@I97L0*54Ƈ% 퉄2@AUM@T\$.5+CAKBH^KAȝW`YGQ_+KR].3XP@Iƚ6.p5!x@5?SzNXzU`(+YT\M6I#LT76+S@K3.$3,$V*5HR^>ƄƄDŽp˄"]̄^_vGЄBVvGЄMWhЄ=^$%ф9]$%фB]JфW`%҄I\ل6"]Pۄ]`ۄ^"܄La-d܄GQ܄JSބ8$رLag&B]=T"7d-7@TR5!R;+!5l^I^_4W`ւB6P887VT\6?[\[?*5r:J>R|  .6y -# b I\ ,c8AU.\"MWa]6"Io5!j!+@+!7#z ?Sz U`/c$+@"%V&:&)A.TI-6.E-6+7/7#0?`O54"CS4 $6@7W`UX7,C8K69?`%<3>JT~>C8?JS9k@MB(BL7DVG:9Q@KS fS+#VIT WMWCX5CX6"'SY.pZ=[A7\\,"S]%<^,<^:C<^!Lc^.S_6.a_,"b4` /gA7iR]l6+.lG\.lIS1n-#8o%@3q-#"*rU4t#%u4`x7LyMW~z{+7:~R] 䊅"-7+NW.W`鏅"Ct"'T\j)g.$N.c-qEKU!.kY+A/:A.T]'N-'#6Y 6"@Lo,>تI\a5"#\IΫ@TZ:C+!R]3@5ﶅHù>R퓼C:뼅%HƿD4W`3? 7L…ݓąI\YŅ=QͅTͅT>NυI\dυxׅ^6ׅLa؅I\ۅJT@݅N߅@+lU`l7LXvA8Ϯ+MWwU@B.)"\I"?G]Zn,AU=Q4+abk,"K]6.C'#.|k.6-u:CLa 9]8]=^8]@Kz8/ @6Q +L 0&L !Cp1BV* g ?6ij-#3IS}baZ#?ST\A6a-~#?7$6?_$+&5&6"L',"NP(-[(@T[(JT[(h(+)CM)6?.H^w.+"^0IS;1@T&.2=GU2T\ݽ2UI 5 5+55"6:&69%6UJ6Ua#7+ Oa9Ua9@TT:7#AB6ID6IOF@6kI*QJ`kRLahATMW%*U6-iUU8?V5,/W6.Y7LY]T\ ^- b* :e:e3e4>@f.(ht-#vuIA_wI>JwIR%yLah}8C}+!}#~I\0&W`[T\ǂ-CꡃT\jCW`p!NISNAUd2.$JTSW`@K툒#3T]~ @T$w뛆La'r]^t =I8|){æ8$ABV1جT]*?mba7[ı.MWA@6^A㶆/@5־0&־,nJAUnAU.$"@5G`T6T\Æ@K†+ Æ-FĆ"8^Ȇ5!^Ȇ+WYʆ5*ʆ"+EΆR]φIІ:& Ԇ{Ն׆,"؆@6؆:&؆#6ن7+ۆMW܆ 4*"ZZ7'DLY#(W`u5!W+4IS9-#KUuV%mGQ@7b^*5ɳ  ATV " +6K]7@,5YISОI\YI6.q"2?T ^6-lcls!/"W`]%&@L'(#)+ H++v.aL!N/Ua@Q0,}0U^d\33+Z8@IJ8J`9U^<?J5?MW?.P@"MA6?B7@DU^G.gH+"+lHJ`+lHU`HKLaGLI\+L7#L+jP?6R[S'TA6X/%^#6_-_@7_@5)$_6"-UdGQeNX4Tf?6j8. jA60l6?:o+=qs@7sLUVxW l{9]!}D @T W`$-#GQJT`/0&GQ6"_U`A Laю3>MU l6"Փ3=fSHJ.")iAJqT\q}I\JwAU^*"4+ HR죡\[@+(%194-#[鲇!*᳇HR_`/GQa,ա-?5sCѽ@L,7^I\ÇJT^Ç%`ȇ5!}wɇAUɇ>Lˇ+"ṗ@TP͇*5 ͇6..χ+҇?6҇6.ǥԇ3GهBKbڇ3M܇8܇B7e߇, ?Hx+!VAUV_`u-u* Y-#""..#@L`2UCHRrKBG XW La? Q6M M aX G=Q̅H@O8CFAJ#*6v%{-{S%7D9+++.%4`A%C-E&/%b&La'-#N'6?N'HR)7,_*!*'/G]+2LaD4NXKA7\[9JT)9(:%&:R];A;AUv?#,A>4[AAK{A6A(CAKXDJT1FW`tFJT"G,4}tH+XHI6-DrNO"=UR]zUGQ^SY@6[KU7:\7:\6"h>\LU\?S_T\`JT`+4a5"6dTL:dITe?`l@5),q) Vt6"u.v:Cy vyG|#1@5 `NrR]0fJ`H^rC5ITq4?1+! ,9Lm쉈#R]@ƊI\z6@DI\YLaGUaaHZCz6"z*Ρ,La[0@K"(jKt?Sr-z_`F"5&KDLBS^︈KUº#0&D".D#A.6rˆ)@ň%ȈI\Ɉ?6ʈT\hψ* 1ш"„ш,s҈T\҈@6 ӈ%R/"ӈ>+/"ӈ.:ԈI\:ԈMWԈ6"dՈՈW`Uֈ:&Uֈ,mֈ.׈K]rۈ7:J܈_`J܈AKJ܈5@B^݈%RMbވ+!gވ7@W?MW0ANXlB6.B"BHRB@TBJTHCU`E.E," GD:J@7}JJTl3J8$L.E&N#+cNAUcNLa.zOLWg%P?I#SC.TA7fHV\[UV"V*?RY^_ZT\vZIS\\[}^_.od6-Ih#i0j6# j#Xm=^o+NpJTp_`q@5-qC7ڮq8$s.`t*5|U`|ISV|Lani6+v[^~A8M.6>x8KU熉 T\+kUaNSNXᑉ*=|MDHRI\U`p+U`֕I\?A^>R韉"|+!"| &m6^%brAJզ* 33ɖ$-@ISb/%?$T]v]T\`,=^d[6.۴S^*@!5@Y϶6+rѷI\z!ռ.UuR];7+6"5hĉ"ƉAJ<̉7#Љ.?ӉLT؉NX]+ى?S]+ى2 ډ+ ۉ#L߉+"FB73"9]539%A3T?I+,"ʊJT96.T*.7#6"UaFvLW`@6wW`@^ϴ ' @Tģ AJXC7},+"+"%V7L5@T\U`?6W`.T AU * x!A7x!@6&6A&H?p-.=2.%Z/.B/.T0KB! 2T]4@5-8J@~8^9U`^95@ܥ;:.<>A@#A@3+>D* (EKVF+~F6.JG#RG+LgM:ChUOLV^P+9QYU7UC.W@+Y߷Y@JiC[H^TO[6A$f]U`(4aD9dpa6"a@TZc>5Td"qe?`ufhg#,hg7/*i@7Bk@Lhm@I&nGQBp#KLr"-,sQ[s+"u,'uI\-u>}xD9Ky"|@*l~*"yLWu|@5BUmLa==^7芊+!"]5H,-97@ڭ5+Sz@5K?60^S0US&o#&.&8$O"U`Ȩ3+]竊5@8$j7#G粊@6U,鷊:La5(PT\'6"cU`zI6-#.)8LAŊ,"ˊ6"MΊJ8BΊMЊ+ъ.$FMҊ@7]ӊ+!%`Ԋ'Ԋ+4֊La4֊9]U֊XB@ ؊TL)ي6. Sڊ?Sڊ#5$݊!* ݊/8ފ#.#U`?,ʼnR]J4is=Q+@8a"_[3rCI\aHTaAT5#r7#|T]]]4 1)0T\%[ T] #O7#-#+8$|mI\E6+KT45. ;,nBVt>4Đ "{!R]!6"n=">$6.a&@(5C(JTC(@T)+ á*""*LC-Cl1U4n2G\n2I\2"826"82/%v4LTʛ4, 5D 5;5GQـ6J`9*59w(:::5H);+);m;7"f`A!*7~A5A[B6?tD_`E  GGQH@TcWIJ` *KW`NKB!ЃR%mU6-ɻVISY/e[GQ[KU[-<\S])@^K6Xx`=IBaSH`bLa;gL^ѬhG\ nR7Kp*r6-n:s-P(t9]"u+!,$wI\gwGQgw_`w%w8$xJSHxNX'y,B{s:}CWJTѫ/#xr7LI6?׆BJ@KB:.T"$NXȋ@I%}7-`T:C<.>U`$iΛ!47,]I6|.$c+ܢ+ ⢋T\YC7G,+7r'+4j6IZI\La~GQ߳^_@KPAU+47Ë".|NjAU&NjȋI\ɋ.$]ɋ?`]ɋI\]ɋJTBʋ8$ˋ̋5!t.͋6?ЋCҋW`U؋+!s؋=^jNۋKUjNۋ\[wqۋ7@Qߋ"o!9HR3|3|T\2?`#a.#"3| 6-U4LUvM?SKU6Lan/=IHI\x %Q 3+W6 Q6Il=^4?kI\JGQ D:a$.#\5@AT % @TwI\Vh6"7#ƧlLaQ @T`!6"'%HSO&<&. 'i+4G=/7+yf/"nB0A.F3@5p4U`p4IS4#-n5U`05U``6L9 7IU|-8.:6?w:@7C;,<.9hEpI6"I6.s+JJTK+KA7kLW`O_`RJTR@TFT3FYW`FYISZ# [8$O[5Nr\@LO=^C`@6C`D9a6"a@5xb@IXcGQ[e-#LgJTkn?S ošqMWk:u7L.Fu#~uBLAv.Av"3>w7Lx+xAK{zI\|6A}R]7,8}H?8}4?瓀.6瓀*6 =6"nAInTLƅWAۆ+戋:&6+!G">3>/&C$KUA7M@6'3.ܝ.Lџ>+џ.џ#+JCKUCT\^U`g9%UIܣLaܣJ@2\ItT\h7Ll[6?Y.qm,"qm6"..C<@7 @K1e?S7䲌OL74(+L}ѹ+ACHRŒC-Œ,"ŒATÌ-#H Č@KČ3>ʌ6+ ˌ7@w̌Z͌+͌@6!Ό%:Ό-#ecΌ+4EьIRҌ:&P+֌D׌! ٌA.O܌S^AߌLaq@LW8$A76"OMW{f+@LC6-76@KߺLVUI\U?`m8eG3Y"5@+ H " T] 6"h"NV#5GQONX:&-H_t- -!#>:b%H^ &W`z&!*-8h-W`L/T]014`2@5#5+ G5 6AC69D86*;-#e[<,id=@LA>AK]D#FFNXFK]I";OѵOGQ#QsQ.$RT\ SU`6U@56U+V.pYUC%[KUj[5!r[?`r[AKm\?S]A7(_+5_%g^_L^_NX,_W`.j`A=C`3+_d.zjC0m7@~oT]oU@sGQsMW2Rt^{>+|I\}@5~5ɀNX@T?SWGKUWGJT:^I\b3=х7+'&5MAU6I|ԏ".I\-A.7"Nk@5E!>Gs{-#Е.9-B@+R򇚍6"@KIAT̆@I=A7'#:CU`A6?<@L©7#W9@+^_Sz]^>մLa!?H`U.E@K9A.;]`m7J8@KcōJ`gō@5^ō/&ō,"'ƍT]Uʍp͍BMuύD9Ѝ7.yэJ`ӍKU@ӍLVӍT\4ԍ4ԍ=^iۍ ܍LT?ލ,ߍ.#ܷ+5G7Ln+ A.J>RW`+$Laf'8ASLay*6"K6I6+N6?d#.C.ţ%46" MBO @Tc ,& NXM :C;^=6.4T] )AU%%>QIB] # E"%k$:C$@KI$*=p$>6t%-#&+!H')@K+*6G*1HTp1801W`9?59-#:H?@>LC"A@5C6-2D+!F?GL JN`J"CM-#O".wQ.!EQ-j{R3>\RULaU*? XG\XX)[YR]'\.c^G\_@+`Y`/%`Y`7#Wa3La-_"e6.cFeA6tgBVnITgn#{n6* p>Rur@7ջrGQr.Bs"7z-z"=7++k-#Y&!3\"6)"LaDXe?`I\@珎LC,"pX钎I4+6" R]"]W`ڦW`\aC#ФIRɅ)`TL>Gڜ7#H5OI6+b೎9]b೎B]#%B6?zT\=m︎HR(H^+AU#h7L!GQŽT\zŽ#6Î7-ĎA8uɎ̎@5iΎΎKЎKUюR]dӎgԎH@B֎)ˣ֎"JDڎ>Eڎ) gݎ@+ގ6.ߎ4Ir#54:&>b@KԑW`=T]؁?SLa˲,5.#_6- kg@6MLU|T\.4`\@T\:.6"ejY)>RA.*.R]N%2`La+"; 7?:zU`dA.5 + #.#^"/"i7Z7-M3M)"_ ,# UI!6^"T\{f"8$a"#"6R'?S'I\'W`(7Le)A7+/7H,-X-#".7+N2CZi5T\Zi5NXq5]5U`z6R;8D.K@-g~BIRlB,"xJ+!ۘKR] K-8P%P*QP@KQ]R.SAKhWS53hWS"SAJ\BV#+~VH^GWGQMvX"Z[H?bR]fB7eg@^gLTlShƩl@+o9],[p*3qq=+q@^sK5s*56t:CtI\t-{w+,kw+} kLa+ǥ:NXئJU퇏CWc6͎ᎏ+ #@[ߠU?4"9+΢^`4@Ǫ+H:I\E6"v9La"Cg*5_`i6-޷@7¸@:C3>RI#W`/6.1hÏND ď.|Ə6"KǏ@6͏ ϏяWadՏ/ُ~܏@5܏,z.$j6,kDI\%ND:)7,@J`@U`YJ@d7L%@5!*KUGQU`Y!%n#3Z@JU`#_6 7#".@6_6+/7N  * 1 _`m ?Si La!AJ[>/8$t8A@^~?STJ@L+!;#*5,H@pd6"+uv"/%uv"7#"T^L$AU%8F.&.$N&JT܅)-+U``,6+e-e-,"9j.IR7.UIW.@I.T93R]"77#V79M7La:#N;#?DLBBMDD".DEW`:JW`IK%K>#7MAJ͓N+!|SO.jOADOKV5ZP%yR:^aoSCU@JVVKZ_^k\B]^"J,aDLJ,a_L7c7mJ`nJTnBU-pnA.-pn!nT\eu6-u)u.v, zK]}(K~.C~MW~G.6-6Co?T * t)gUabLa7- _` BKC}=^&]GQ猐W`C %6"5!.@L5]Xcl.D@6D"6A^fk:&bl.j|+6]>R]GQ,!ঐঐLTA86+YY3+hy/nMWy%Ͱ,Ͱ+,#Ⱳ9%˳I\I\yW`pg:^+:@^o27#<Ɛ#<ƐJA$ȐgyːNX̐AI#̐%קΐA7А+ѐ!ԐA.LԐLaLԐ+6.(אVL;gאITOِUCc:C.9؅U`WL*5M;J`BQ.9 BVCiI\Y%;3La[/: KU.#(!7 <@K_%"7%t.W`}. 4-G ./6"-",HRLa.$"5@KcKUd, ^="+4p8$-#U'I>N#(U`N#(4` )+=/)|0+07@H08As27"g26IY4#56J^?W9Ӕ?BL~DI\~DLaFJTF?SG@7EH@5EH#'L[=_+N@T~N>4Q?SU)FZ6+<\IAs{\C^R]^+n`G\o(a:DabMWOKdU`-efCf-#.f.9h8^mU`nKUTo/b>p8@p+p@7pA7p"ws!wsws0&lvJT&+z6Az8(}/+!@T6"/%8@6.9 *兑T\?#,"Ĉ9]%~W`<@IK@6oLaiT\zC=7Qו5=Ř%La T]p +@VV+1AKs7# @56]`%,=Ib.ЬLUFNXkHQ[go=@5j#+o'- '߳A7ayUa3:C52sI\2sJTC-ĸ+񎻑R]#‘".KMÑ=Qˑ@Kϑ5>ёI\ё3+_ӑ eԑ%ԑ)3>֑/9P֑LaVّ+4VّU4sّKUڑ9]vۑU`bܑJ8bܑ/8vܑI@I\+!+-97%"U"%5!1AJ7.>Ri@+!* H?A. JT2+!e.s"JTg+!g)>~6-qC94>R@}7#oDLy@K>5" 6?' =^XUT\UJ8$K]A%6"5@39]|UaK5K]YW`06I"<""c5&I\38+=3V,,.n-,.6"?). ?).-#L1TAw1=4&24R7T46.8X5=Q5I\6U`47W`Ș8:%&s;J7^R-tLaD+-Q5T]G.%GI@5!O+4=QJZT\!6.C"P7L^H ANa%La6.G#~'W`ݳ+>,"DMAַI@S@J:&{* {,WGTLWG7LIT+4j!**Ò#Œ zŒJTǒ%~Ȓ>?SɒWɒBN?ʒ@Kw͒"u/ҒNXҒJ`VӒ9]/$Ւ!)/$Ւ#[=֒7Aؒ)ؒ!ޒ+9]W?`V@LX]`X>RZ3>JU"6]9.br.T\a%-IS-LakIR=Cѻ\PLa%[^A8!.PJAуF7+@I\0 ,o KUo 7@4 "q 6#8#1 ;7.E,E#\@59]K] u$.%7LE"&-&7#(A7,,#,W`nF-JT-*z.CD15!1+ 2|4A7I6@5L79]L76A:LCcZ<#C="D>R]'A@5A7# B)5B.B,yFI\FaG]^9I*5NL>RNLJTYLM,TQ5+TQR@6jR4`vY5"s]%_@@_@T`A8K`^IcT\/e?VeeU`Ch%h`_sl7#yl>Gnm@5mndq:CHtMWu@6zu:.){AU݃"ꅓ[׆+,-N打UIъLC~ËT^-#@6?SHRﮓ,cU` Ø0& #W`:AJ֞UQ?UJT_áW`Ȥ)MW?JT׫=WQ?KJTK_`|۹6"nJIAU5~4UuW`F“P+ē+!jē+5Ɠ_`5ƓR]5Ɠ6@iƓ+"ߞƓ=QǓUIȓS^˓@L]̓/:)ғHR!Jؓ#Pؓ,Pؓ>+mZۓܓ=3'zݓ+"`=I`T^Fs.9'06" 9. 9#Cc3ƭ^_E@I=r@T+HI\-+=G=3=MWhR]CU5!P)PC!LDR]GJT *6 RGB ?S4 #&NX1-#9.$4"kMWkAU+U 5! /%!MC%JT%I\ &C7)570+* {+7!W,#ۉ,q.S^)&3@J4JT_c56AK659C"659L@79"y;+y;y;+!Ƀ<@K%<+=G]b>?S>@L3?6;?,d A]`RCKT\`;L%RJMA7)M%GN?ILR?6RU`~T+9lX.*ZMW̜]NXo2_D=_>=b>b3)bMW_|eAJ_Xh+!jj.6Lkmdn^_^n7#/n6\sLWsI\5t)&|La&|BV}+6RƔ+|Ɣ?JƔMA<ǔ#>ǔISQȔ\ɔ?SE͔97KxДAKєDXєB]ҔA7)Ӕ/DhՔ7LpyՔ,UՔ֔6?|*ؔNX;>ٔ*6ڔ6-=ߔ7LM+6H f:CM#6,8@5A7wLAmDM@5>A7g/#R]UI*5m3AB8K]RO.)7#M5JT~LaH]`,6I>C@6Kn"4`׆ HR0 $:: J`F *fV+O"*.AU 6" 7# JT I\p lAIS"O-vK]՜-".}] 6A!!!%Q?"BAKu"'q(!'q(#'q(.).*@^v+7#F1+`6MU 76.o8,%:T\S<7L<=^ J=JT.>@5O3@DX{bA%oA%7D6+vD5,hE+EH6?LTI6?P%1]R$_S.#VT\VAIWW`6eXLa[,.\J`]JT].`_%d5!ffMW‰f6*g@6,g@6,g+}vh=Ii^=k@Lo@Lp6?^pLaqI\WsN0ttI\t4`v6"wK]אyD\,A7ƁC.+΢MXj2ISGQ̶+"~M%T .5}ڏHR-#:.6-KUМ%H`bן)ן,"ן6"ؒ,>G} I\G iS^^"4Ԩ6Ԩ6.ਕU`/GQ=Gx嬕9LO˰:C6-T\6?-Q,"W`•JTŕ4 ŕ+*ƕ@I]$ɕk͕<͕ ΕIYΕI\ՊΕIS:ЕUaЕI\ӕ8&ԕ/<֕?Sە6 *ܕ7BHݕA7cޕ4 "f-#"f+ -889#$.qT]ϾJ`7L7#%*635@3NX"76`.W`mLW9]*,*J8z#|A#W`JTE4>E=Q>RU"%8A ǚ#ǚ0&Dg5!,>#>: R]m U`m GQ AUK ' A6S.GQ-Q*7#6"I\7+EHRHA.ݬ!,q$+*&>Rي&6C'6",)KV8,?Ix/@K0]J2HRz:I6߹:5>j;baJ;W`y=6AA=?`s@!@,B+dEU`dE@T݆H)HKMIT2NH^rNLarN4`;P-#{QU^K(S6.UbV7,uXAIQZH^}ZLVL\%3]T@3]^@\^,^0&`LV(a6A]a@5b+#b.@d8${'e+9Oe@7i6"jMDl+!n3hn=Qt"o>R:oW`Hq6ds,>uMW9v7#w4 w* j|D~-#>8J) 0&;ISzV 7-"WJTˊB8s6"ڎ5!mF?S-7/%5D7?6e H ϫI>ꛟI\"]R֠.֠/%UR]m ࡖ@T<L9,5D#+!lC:˰@I :.H?~H9C@5\@LʵMVFW`(R]#._׾?S+!#69–k–R]–%ÖR]/ŖŖ,#ŖD9Dǖ-h3ɖD0͖IS͖K]QΖ%$ϖIT5ϖqϖIAϖ-#ϖϖ,"yՖ+v זR][ז.6WhؖJT3ٖKUܖ-nޖ@T_ߖ@Ti1%GLa][ JJ^R"8$ =Ibh6IP@T,^`DR]HRAU;x=^pL^+1JT0U^4@+8UK6",""yLa  0& +mUanU`I5!6?U``"@^?*)6@p@+x+!5@7# +#G!BVG!8Dd$:C',c(4(7#)S^)A7*MB*7,;,R]-5.%0%:y7@6RTHH@ױJ`kGQv+}I\} >+"=^|#6)G)JTz+LW+7+ q/-C 3U`7+J8?4b9.9LJ:UI~:+0/>?5(@I\S$B8C E0& E,"SH6SHCMJ*3-eJ@5hJ7#hJ?6(sM6?ANGQK.OMWcP@5RRR6@T;T+LV@5CWKUcXW`Z6"ZV]!,^K]܁^La˹^_>4Ė`La^a:.^aC.hc#d@R[AdU`@nd0&iT\'i-#'i6"&jj,"jJTk.@mJTi5q?SqtIRvOuv"jv-#S&z+7N{JT|6"/~H^/~N`~@T*5wDŽQ"`,5ρ*5 CAU,S^PI\ ۋ矌G\ʎ.9ϐ"6".䑘5,/#n I\5퓘۔A7'>64`?U`5.vz֝K]i\I\W`<|GQNX̪G\ +ޱc"_JTٿIS#50>mU^G#+TR6".vT]Ø6"ŘI\ǘ*6Ș@E ʘGQ͘ITИ"-Ә6.lԘLa՘4I՘U^֘L7*֘5!٘*5ژC.xݘ>ݘ#[ ޘ+mV/$R]`UӅ6JMWP"5BV8T\T?S0%9t"+!C Lanv# LC%# +!GF"4h5!vW`L50:C6 ,6 1?`U7#JT J` ISb AUH#:I6!La!%.%>l(#NN*@KR+,JT#0@60"8.3HR>4I\>4U`t5%F6.I8,85!{:K]:#nKU?7#@T\*A"*+AU?uB^[nC.C%CGQCT]{E"GT]2G*5okHI6okH,okHCJ6IGL%:'O*6:P4`.yR9]cR%rS#*ULaU*WXAJX\U^`$?%bT\ b5#Ec0&Ec- f!)8h4` iI\ml#OnBNtqLa4r4= t!vt+fvMU&wD:LxL^iy-#z,"{6?0~%(dyUCG-,"|LVk,5']HӄLaӄT\uISuR].Pg+QWT*5\4=n6+AJI\=46.;Sޤ=^VHR:&^iLVm/_`֪I6!)5Ų06+@׶*5a \[h,9U^0&PVS^U-ͽ)o۾][o۾]R8!5LV™T\Sƙ"ǙNXə7#F8ʙ]`'ʙ.HX͙|ΙIAϙT> ҙI6ԙ+ԙaUؙ"ۆٙ.%dۙ@Jnܙ`aQݙ#{ޙJTޙޙJ?ƖޙNY*6!)BUh>H +'g+ ڒ+@ڒH@iIS6+sHSA7lw+ 8U`ZDI\ZDT\Ua@+ 4 68-;7#QAUkI\o NXN !4 A.W` "`US7HR;JT5!lAPK)?V7#NXR=^O"-#O"6"Ա"#%"5?SM#.SM##H$T\0&\']T'5!\u)KU8-8$ 3-#z4_`z49]F6`77#`7.JJ9CM:T\:8JZk>@+@9BSIIT~J.$]YL-eL%+WMI\nM>RPDXR5AwU@72V:& XR]oY+@[La\G]\R]o^W`B_NaaW`c6+m d+4akd@L`dI\`dKUjfk+ q@TJr@L !sW`sT]pnv+!v6"o{r]}-i*~U`.iUI+!* 2JTމ)I%%_@LË4GO/%O5!ᆐ@Ai"CAH?ISќJTWNzI%+-#Vo7@H8HLV<:^5ΐʚ̚T]x͚%͚*62Κ6 lК?SfКњW`QӚ@IpԚJT9Ԛ՚7#v֚?7 7ך@Iך4!igؚښI\ۚT\ܚG>cߚ3+sU`q?SW/:(@T(JT|8.>3,R]&T\ɂ4`+ SGz+8TL%=$JM9];T];S^[?J#6ST\+!{ >R{ T\7 U@ @J *35!n_^U`,8-Ǔ&@5ݯ&U^ݯ&LV6U('Y(-#'Y(/:)%+?T-/+-/yD3"!39LL4T\~45La57B6.k6,!$8@Lg8J7@3>:F5=G,>I+]7JL9=}MAU1?NT\>S>U_` WLarWHR.^I\G`!`ga5!cffJTgW`j?6m@58op,p.s@^uJTYv".Yx3sy.$Y|/:|7L}6*+@NS^NX큛CW큛+4适@Lc0&c* X7gU`@5#2JAٍ?S U^E5!UCc%$g4 |t,X+p*66+ӟӟGQ".¡J^ᄂ+4aQA8*ꦛAU*ꦛT\"֪4@"[%ȭJTǮ"AW`ⲵD9nnk@I=.c۹?`SL^ISh6A@TJTT].N,5]›IU-ÛKUkě@Iś.C)ƛ@T)ƛ=Qƛ*"'ɛ<͛A6ћ6-ћћ"ћ"Pӛ7Lfq՛6+bכW`h؛KUD؛6"ڛ#1aۛGQ}ۛ!=ۛLTXܛW`ܛ6"J8${D~#!-.}J`+:6"xJ`ISx+!#MVKUCmT^ . .3f@6Z*%V," a5 a#=._q 6.a ?T W`) I6)#3W* ?SAK!R]!G]=1Q[u3urCMW+6u 4`"!+ PU!R]"@Kst%%Y8*.+KUo,)/. /La /?`80IS1/%}36447,4A6K@n6!,7#7Lk7@+";NX>7-3>>>"@T\tA>AD?`3DI\3DLa F,fK@^XN* .N6"CQ%HyWUIqY-#Zm[#m[.`>RdU`eNXH3h,0jW`=p+qC<rLUrLCs({T\({T] ~>R&~.][GQ ;6?#Yc>5kKU݇,ϊA7x15o猜+!_+:CA7J뎜y-#La*9]e9]J*6.^?6Z#.+U`ٞ&3:CwISMS^4`W9]L@+uLUo.K]㬜6"ɮ#Ɍ#La $A7$&6-N&7#'@6(," ,Q.0&Z2MW+2?5Z3HR77W A:+!;>R^<@K/?LaZ@_^WA>TBqXC4 ,C.DU`f0GGQ9G+*HHđI@TđIKU HK6@LJT`L-# M+4jM09N#N* N@LN6AOOJTwQJ`SQ/%`VW`PX XMLRZ7/RZ#,ǝ\\]U^mf+gJ` k@LMnLa#nI\șoI\p#q6I0u*3fyA6ɸ|/:h}-L~0&7~IS~%?`Ӄ,".AU5!IRÁA㊝JS*I\]+bB7#O "\:bYH=?Tf#렝@^"T\z'NXz'JTר#AL(@5LV:^U^C9@TX-#X0&-W H&>RXL][7LVژǝ-C?ɝ+ɝ!?ʝ.#ѝGQҝ6.)ם%^ם@T^םG\D۝!)(ޝC:Q!ߝ/:& 0A7+!SJTS/7,8$KUDl"I6:C8HRO4>O5>8$#-7#,S>R -SW`j!+!@L4> 8Ѐ % 5>CKV@6@0&#C]5?G=^La^9]IUPe@KvNXFtAU^_|AUT\?I\Ш!%"6?=Y$=Y$9%%9%.%0&./T^p/1E1.39]]6AU6"S7/%A9.U'<.C5DI\iDI3{D>HI+#&I5OK7#V_`V+YK] [_Li_5Wa3b)UbT\rcLa>ee ewf;g?IlT\mHSm.`qUIsK@8s:C s"6t.6pt>R3tHROv=^vz@5z#G|9]8À#8À0&"恞U^7#!D@5{LaC#a܊-18BCI6C@7B[pgLC @68KU*5K>NS"NS* p+!Oܝ睞JTEIR,)>Ruš"N5â?SŦ5.++P"mH^mJT.")8$UJ ᱞIRi6.[La@I>@+f\[:5>м@6HYoTBN׿#m@6KA7:Ğ?G>Ş;Ǟ=^QǞ0&Ku͞I\͞6"͞.NΞNΞJT ОT\ ў+ўLa#ҞT\qҞ/%qҞ.PҞ@HqӞ#R1՞6"F֞A7m֞W`f؞.؞9],ٞ?5ٞCڞ/%qڞA.ܞTLs,ݞs,ݞT\:#U`:#NXJd.@TC-L`l3knUC{.u>Rud#+#:CTW`RhGQT\/@K?SP>R$LaA.xb +!-"6?G#+$.U;&La'T]Q(W`5)][;7,5,%4`1.T}2/.5L79>!,?%ZA9] C@L(C-#HW` ןGQڟMWڟU`ܟKUܟAUݟ%ޟ-#ߟ9)9|ELUC}R]&+&>AU5!AU,"U?II\7#9La|FNX|FH^6A:3:+6GQ7%^.$3!I\yTL>+.R] GQK LV6 A7 5?c5G}^x,T\j.W\6"kU`cI\"+=^"9#&&z&+7'(-#C)NXW+LVv,A9/6At]/W`/LU&0K@$0@6!0?Uu2I\ 3BKb4+4h68-C/M9HR/M95@di<@*a?6#tXE%FB8JJ#LKUNN=Q$RR,R/#_SIRKT9.U9%lV$W6.WW`NbXJ`ڊ["9]U`:]_`]6+2^8$e_-#r1_AU__6+ȶ_"ȶ_#uaKVǻaUadAJ Ve?TFfAJB`gNXg#ai%kNXlU`"l=Ql:6n5,!o3oW` v xU`!4z?5"zLaz-#$*{ba]{9]/8|6?555CK.LR6-+!O%z UaM쏠"ȷ.[Q=Ò#jKUjAU"P6?șISJ,RϜKBjࡠ+!?âJTV>Gr.-5bT\")UMW%:&+..#."IT=4'% ?Sgf. IS %?,""m%8+!k>A66"]6-%!"4 ^@56"/""%B'T]V'G\'I\'j/4+1La.3AU.3MWN40&(;4@T85UC6_`57I\778AD7?SM8B7:#6.p^?"B@L0GM,"OT^R?S;%SI\_2U,"_2U*}V#KW+.X+(Y6IZYI\[@KC@]AU˿]?6[T^-#/Q_*/Q_0&/Q_#6aa!EcKUd6"#e#e6@Żf8$ffK] zh*5iJ`k!4k?5 l?S q3>xLaxJT|5!~A@+ +!̄6?".&ᐡ6.V56?1ÖWΖS^痡.g8-0#՟6?HE".b#9ͣAWn6?+!ԜAU&U`vg-"W`4IpGRP#:W4=."x,B\T\ A6Lq8$K]׺@Ka7,ۼ#$޿^@MX+3*,I\=fġ9C]hġ?`ġ4 JšC-stʡA7ˡW`ˡ͡!Ρ-Ρ@6 СLa=BѡҡLCUMӡ9L#ӡ6?9ӡMXԡ:.APۡ$8xݡ4>xݡޡ?5v ޡA.Kޡ.?A.A#BA?-w.U`," ;,V-#V U-,U-".=G\c8$.8$95I\d +)sTL2@56+5"4,>&!5*3px8*K5_5=rM  U` GQ U`K@6+#GLaJTb%q1>R+p+QLa@T5j+>@ @6P U^o!GQK"TL=$GQ8%5y%?`t&7@g&4`k(+@5,C֬,@Ti1T\i1G\2B81?4@T5AKS:Ԁ:#mRY[)K]ڒ_d6"d#(e#[eI\fU` Ki#bUi* mA7m/%m)(n@71rU`rI6rssI>QtW`xxUIy{T^,|"~-#A6ƃI\9rKU7W`ȅ?SZ CZ .6ISAR%.~쎢-6"UKUGGQN6Q!MW%W`K6Aq-#+*E@^ 뵢A6x I\\#±.$QS^i.36"@7f¢.>Ţ9CNɢ`oʢW`"̢MWr΢@7Ӣ"Iآ`ڢ+!ۢ.$ۢ#ۢ.+ݢNXYߢqzAUA8M>7LM>AU"^{!7#.7+6->5*.,5p** +8LUz%m`%[8.I\y5APC5S^Wz 0&+ +R]",-#+7#ӈEE9%#,a"w!%TC"S8$;*7-*T]Z,KU-6A^.m.3/?63//n2U_2*646"4I>r6JTr6KUr6GQ#77L#7B]L9B]L9K]jm:+!l;7-;?S=, ?=^kAAUCBA6[ G6"[H0I.P#PI\R,T@KU#>YHT52[.\Ua'_b.^b VcLaY&d=^h0d%tf5tf.liR]jCl+wq%*r,>s@TxK]^Iz3^Iz%z5!K|TLw|#}?Sb~,~7LU^8$̂6ӃLaӃBVt"3CMOꌣKUIRNX0)l@+]R"5+& U`ݡ6-b#dKB +gP"í"6>0D:ym?IlTA7I>eLUSAJ>R㴣/@55-EUC幣7#F".H컣㼣C-V 6I #LaKݿJTţYHɣ8$>ɣ <ʣ:Dˣ+ˣ"&Σ#&Σ"ϣISϣ%P_ӣ"ڣ+7ݣ7+ZޣMWZޣAUZޣJT|ߣ5!7Q+ISyJB1J0&pUa߱-#6"#AJTA?IA53UJT'SH\vHR>KU)6+ (N9/6-g_-#:^ JT , + |MU(T\xU`)@5AKll+!A7+s\[<<AKT\$& @6^!+!"JT"7L#^_$[%C&ITC'D )K5߀)9LZ)<*:U<*<*MWA,MWA,ISA,La.* 0U` 0MW1#,H4JT,H4MWA<6.#86.09Ȯ98$;>MW?C>R3CJT9H?S KyO4`yO^@yOJ@OIT%iT7#tU U8:}VH@uY#7Z]H^^U`^.ab46;hNX;h i_^iA.i Njk7#k.Qmqp7@r-Nhs>R4zGQ{I@{A8}I\X*37#6")䃤HR䃤9]g!U`AC8͆6?5!<.闌U`7@5@юB]юT\юLaH"@+ܖR]D~9%@6\[UaٚNXٚ7LٚO"Fe+!H4`ҝ57++++CI\ʨ d)5+s +0͸@5IC.I#壹L@I\B+Լ7#Լ0&Vྤ+Vྤ.+@8ä5!^=äI\Ĥ7#Ť6? 7ɤTL+ˤ6.m1ͤC^ ΤaѤ65Ѥ7L,ҤIS,Ҥ?S<ҤI\Ҥ5Ӥ6?'ӤAILդK];4ڤT];4ڤI\;4ڤ=^{nߤ6A.+ 2*5dT]T\/#<6+"R]+ISQ@6Q+#6K]q5q+!9^8>#W`]%vUCpB7# #  U@K#52K#AKd+ z)*6:vUa V_3,BtI\rs.$@'A@'+L74>i UaM#G\b%>4b'NXb'U`J+6.߄+@I-+B-D#x1.#1@J~37,,4@=45"~5ba@6ba@6>Rbz7>3;6A<=5@<=U`<=GQA8$xA+"CpF>ÁF6"GU`HNXJUasiK.HLITbO8G R#kU.uXY>T&XZUa:n^":n^I6!_I\cud4 ud* j"k5k'p#6sU`OsAUTuMU$uJAu,v"lw@56|yU`z|.xQJ`SW?S!燥#"H@I<6/:ź@T1슥7:U`j>5LBH=+I>hB7홥>4!W-#?6A7Mɡ6AᤥH@3-388I\}CIU:Cn5A淥LakJTWI\0&!k7+bĥ7ArDǥ3ɥ-#vɥTLvɥ_L̥Υ,MΥѥ9].<ԥR]Q֥Aߥ5=#MU/+0&c_`!,La%hw."8pU`)TLS#CW,VA^  OT]d6?i?I\ ]!AJ59% 4k%#74k%BAZ&A~(%(. )B6,/7#2 3+a8@TV96.Wd;6+><(R~"޴~U`޴~T\o+* ȇA.n@3>!*Ê.HRo$>)m@7ȓJT וKUT`6"}*0?,a:+ZgI\W*56"@6N$.4q){W`T\9%OB]B8.AU8pIS .O^6?_@L~AI6.2B 8B C 6.pW`s6#ISBALՁ+?S6"@K4I\6 *5+y H@]M!H^o"+U$I6U$*6a& QU'AJW'9'UaF(@6eb*R];, /9Cf/,6Q0>+/v1*R=?5MW 607J6 j6I\D:R]P+U>P#P"^QT\ RJTR9]PS@KS.V6"WW`X+!Y%jY6+Z@TO[JU'\/8 _UTMa9%dT\$Td^`MNf^fG^f>fjhB]hi3;_@T_?S΁9]N+4hKU|@5^A.VɌU`6RHBVS_!m6.6"T>JT7RT?S-IIS-IJ`>3.ج4Uoꝧ@LtLaI7@RKU~Ҩis#ɀL.*Uar??60?5 @K.+ -J`/AK񯼧.$KUIA.EJTɽA66,F+  J``_8,`_`§*5§H@`çLWUç+;˧˧5"ͧJTΧ.OΧLaOΧKUѧ5:ӧBNmէ|ا$- ٧#T\٧+ ~ۧU`ۧ.9ۧ#ۧ, 4ܧ6?ݧ6?h@ThI\s"7_`).@7zR]T6"_T8/^@T]"KUgU`6.ށq"NX$6"O.w&La)/:WLaW9]z GQC .G SGP^jXLaԙ#)~c9%7, AU}+[)6I10^I., ~C*-*,J`R!*5Ak"86#*"%6-K]&ƶ'MWƶ'KU^)T\)=IRe,,IR.AT2R7#{7ISD77L88:Ua8:U`ι:A6J?-|@ISr@6-ځK3}L,L5@LV)L\HRbcc%He.9ieUaj,kAU,kLal>RG@p+,p6Ik)rW`Ps>+vAKw@Tn x+JD{".k{"e]-䃨5?m4T\<-8oLao5@E7B^AUS#)0%5l3LaxϖGQ Ӗ/%.0&L^b-K9.tʡG] +!I\騨%!Ωt@5&_LeAJ$"I\+!ֵ"C幨SHID9&6?ԃ+fh¨@TWèQvè+5Ĩ4`(ŨA.tǨITP˨" ѨҨ6+oӨJԨ@L[(ը-#[(ը.$6֨+!/٨7+ڨ,ܨ6"0ި.R6U^{88_`8>R8ab;6A;9]<.s&?6??,"?-#AI\A6?5A8vBnCLa24D*ET\gGDXI+!vKM4?MT\Q0&MRLaR!YTD9pUU qWNXqW9]qWJ4qW_`Y8$.^.^as4b0&”d,”d!HeRe6"q0fK@gI\!ik@TkJTk@Kkm5@dnIRep,^rCWs.buxDN;{;{D:C{%n_~?NX+4瀩KUl=^I\/CT_-l6" :Cy%Q9B?7I>,4 6Iv&@5JT73LWLK]LBN^ >^ *6㝩6..La"=-#"=/%-5ݥK]5)!3xR]ˢ!`9]Q5=E.XITŰ7#k첩7/7+d4NX6_#7La⹩L)?TDf4`m?6þAJU`e©-ĩW`H ĩ0&ũLa^Ʃ".ɩ@5ʩJTS˩u˩,ΩΩA7/Щ*=ѩ4`sҩ?SթT\-ש^]Kkީ/%<9A7P" 4 WAK!,!"C&BVҙLLaI6GuE6.GG* N7#;QQ"LVT/#SG{3֦=^"b6?=I>#\8* rr6I[#[!n.n0&nA7w=@!NT\"pBVt+!g6.7#)hY2\[6+@L6"W`=.q%R$Ua&%I\-%U^%S^(GQ9 )9]R+I6܄-7@-"T&y0&y6IBVA..1kJ`H&YHT>MW~h9JT.6?@L:9UIĖ>RW`vU`5GQWNaWUa8$pᛪ@6B@L?7)r,UJo+Ҡ:.ޡ@7?5Tƪ PJT 7#^诪@Tf*"KUMWm,k.k,9H@N+RAIŪNXŪ6IgǪ.#lǪsǪ.{Ǫ-#jɪXʪIA̪V`8Tͪ+ bͪ\^.TΪ".Ҫ*ժ)5ܪLa@A`KB0&@LGG4>5+g.$lJ`nHRJ`rLa#U^'KU'BNXi+W`t."%{@T%{U`>5m96+ ZG] ?S`W BVc AU A.A@6BI\!4 U`A+7;?SFMW=hMU$x0&$x* ʣ T]}"R]"KU#6"#IS#%:C'&7L&T]/3+1>Rϒ2"ϒ2,84TL4>RJ9".:4 <%+<5=8@*6(D#DA6,HNWSJMUAQ+@SLa:W>Rt\8.m]H-:^6"^KU_@IkQ`a#^bD9ҧc+eKUfJTsh,4h5>hLa'i.6@PjB]/kMWk,&oJTopGQnq,"LsU`Rt.RIu>RIuӛu3l vl v,"v%pmwKU0iz,|#z}4 }"~-12?S#4 U#5Ä.#.R]\}f?S: CbO>«4`G\La)@>G]@JMUU@5W.LaEMW杫M:՟zj#Q%6ADR0ISR0KU-#o"+:^r6" (C*5)-#NX#AH@¾8$4+5B@L9DL3Iȫ-&ȫ7-̫5=yΫ@Tϫ7#-?ϫMW,ҫ5*LӫB]o֫?Sfݫ5@ݫ6"Vޫ67=%Yb5A>BVf?T"HH?Q`Ul9%C@7"NXz#+KV\NX\IS\La7LV{JU!4`%nHR:LWP - x?-WN7#m7>O@KQW#+`JT3KU3B]C"rIS\!7R-!@7!UIt#"t#"%%:%@T& i(#{/.;0I>m0+m0.816+16.1AS?2""2W`z396 39%c3-Eh4=H;U^[?)%@."[@W`rC@H,J@+mK,5yK4`L7@8LJ`NOI\ OAK?O@6PLaSC.9T+4UA.Z9U+4Z9U"VV`AVaVLaX5X!GWZ6?,o]?@ _+!{`) aT]M)aG=Ib,=cW`˒e7Ig#[lI>l+!S_nR]o6.pUap=Q]yp_`NqISNqT\s5?Lt@6Lt"̀w{i|\[?}@L~6"wH@6.#𿀬,=A74)UH@N /A.0],6X!*59瑬5I\.#3R:&-IS0zUIҗT\nέMDК?4T-_7BS^T]S^6A7I\XkU`k7@G㤬I\U`S .Ȥ@LêAI4#!@K}Q"@Ⲭ^S˸U^ ?6 -#ֻ+ެ7+>ެA.nެGQڄAK׉#j'MWp.$AU,HP>e-#lA.0&]K] U`!l:^!lLa{+ {+"|+BLa$KU+7AKU 5*9a +@ .I)ze@TXI\kLVrIRMW>I\DI  8$ .{6"Lam.!AKA%7#&@T&JT(R]J*_^-@T..Ҳ.JT^/+ 26?C.3@A5U33]`6LU>9T;I>>_`>HRD=Q\EC#F.sIKUGJ9]GJISaJ?SI MA8yS8yS3LT.xU9]YTLKw[,"[:Caw]"7 ^Ъ^,"ȨbAUX_h7+ji@+(nLaLo~r>~rA7XsU^t.$uWL[w4?8x-5zAT-}6"!#+=^g6"{@7=6?=JTw6.@INX,%㖌^U C53rKUs`_=#7?@eR]b#6" ^#*,"ܢ%J,>J5>񺣭 7#"m:\[Wæ~7@؍R]@5g-g3wHLawH@TC7@r+HJT+@TUJ- .7򕽭^&?G?4KUȜ]`U^6"ĭȭA7ȭ6-ʭ4Iʭ@έI\"ҭōҭ+ōҭ0&ōҭ.P׭6"%حU?:ح4`:حR]+{ڭS=)ۭ,ݭ"SVޭ Nޭ.VB=+_-Cx.WHRRBI@w/#oXAI+KU΅9(0&%3UaHA85**,S^UBVo6"+B ') 7# NX @KR]/6"38I\LVu7#)oXML7JT?*!W`."KUF#@L#K]%LAr&+(,) [*MWӠ*5!"-".k0@LZ122GQJ3%Ae7) 9) 99MLF=6+=?J`G(?Q?g)?LT]?A6@%TD@7E6IFC.FF5!H".aJ)jLAU.L^=PN#uNI6uNA7yZâ\A7(^R]gJT>ViA7[j[j:&[jN-[k?I[ks>5N*uATzy-#oR~0&6.[c+7_L\`/%р-YDUaFTLV#[JT҃g܄*"0 W`|cU`ػ8$0E5@)KTQ_^UaM/IS=+l5,鏮4>KGΐ."Q6+E9]A8hKU+!k&7#3KU>3i8TL̤T\6_^CUa=^c짮"x種6?ll9%@T.@T;+!5S$.U`,* J4SBV􉴮6+I,0&LaD6+Zf@LISnl@ITL6=3®7@;gŮR]Ʈ#7:Ȯ+Ȯ,"̮&Iή"]ήJT2Ϯ!ιϮ6?Ю5@!ҮU`7ӮT\t\ԮI\WԮ:Cծ!)ծ%ۮ@5YܮW`ܮ6-S^U`ՁMW,+!S^-7+R]@L}#0 +"B6+V/%6"@:&V5KUJWLa,G6"J@5d/#* JT @I S^ La 6.M4A7[t4 GJ@{M86@5[U`CW7L,,8Rab88GQ@K~,":LUb!JTn!"r"7L#}#:&$U_:!)BM8)BL)@A*6I]0,La,U`c0@74";?"@"CSI.$I)IJ$JGQ$JI\cL*6_GO/#Q%V:&XD_ [#,m[5bQ]6II^5A4_W`P_J7_@TU_-`IS-`W`h"eU`#gT\Cj,"jI\j5@sU`t,uS^5 xUC|zW`|zLa|"TU`TI\DZ+!DZƄ5,v|IS+@@57T\Q7.q. -#_X!_X)⓯LayVCUH^Ӟ)Ӟ* 6"pWG]aI\aG\`I\߄J5?lLC4@5फ>H-ή!){LCe@T;6-Ŷ#.ҷ,>)KLT$-WW?6HR,AïgïHRį+4Ư3ɯ,HpͯT\Hpͯ?SHpͯISί!Yӯ#Dӯ80Vկ*tf֯%Zׯ>iׯ*5%ׯ\I3vگ.*ܯISIS|HRwKUw >C~QA7ϲR]_^`^f5:C{ p*"2@5.P%+W` 2,"D9R]N6I%I?B*3+T%A8QI\*E~r 6.} I\ Lg:^>p5!3dI\d7AjHRvK=^JT^?`_ 9L';'I\-l3MW537"c9.c9+)=K]2>!2>-#>6??9#BE7#`1E" J-J6"KkLUay R7# U+X?UqYU`>*ZT\$\7# <\5@/]T]~^,&h`+ ؟cATdATd9]+e.uJh=iS= p"ttA.ԑtT][}+4}ITX~AU]:7" BV< 6?0W`^N}S^.#p)D.L! U` J`7CS^wݑ,J6A 훰S^&+T:C랰#kء:Cƨ7@6A7@7?MW3b=ᬰ NX䲰#6oĴ@+K\[7#OO.$OXE_L-AULa6Kð5@Ű"ưSJSPǰ%Ƚǰ,ɰ,˰W`R)Ͱ?S@ΰ6Iΰ* ΰ.9аT]*Ұ,"*Ұ#*Ұ8$;g԰TLڅذ,@ٰ6A$ݰ# ްC.]-jCWHpLagY*A.l%"N-l~KUH.m:C\@T5K%6.I\y?3lS^VI\m+4=Z+!T\H6"G-@JU`U`@6dA7d+ G"x>$.Ė$3|@&6?|@&6IO'C'6.''S^`(3+,AKF/9] 0"P1@+b%2_`gb2C.{46;5* s5"Q6*5Q6A7"78@h8@h8-8@J;J^@;"zA7#zA-# BI6CJCNXD0GJTQHT]Y9L@Ih M@L-KO>R͍OI6Q6"3QAIQKUnSU`o#U7Lo#U?`ĠW-X6?@(Y"[A.][a0&~ef=^=fMW=fLaOgCg 6k=^dsUas6.t-#UvLAx_^Cz@+YB{GQ}0&}* }+!ƛA.W烱@R;%SA.JT]K抱LUF+!J`V7#VAIeؕ-NnU`HTLa䗱=IC..@K ##Ȟ6"ZDL꟱W`꟱K]KU , ܧ﫱R]Ŭ@5ŬC7~鱱I\"銴6" +60&_ﹱ,Bg@K0&2"~ISyñ.&ı,>aű-#ȱ7#2ȱ7+9ɱ?4`Bͱ,PͱMWα7+αyбK]<ԱW` ԱMWS1ױ@Kkױ`b#ױ+$۱J`ܱ?I#ܱ. ܱ6+7ݱJ`\ݱUIݱ.7ޱ"-߱&AT]$JT$La6@5Xh* >6?HG\ GQ>RW`.T>3fLa75d.+NX#7,* #6A"".A.}@K][:6.w |/ HRԗ 0&V&6>5?5!Is$MLRE"h3h%O%8$O%3$&U`'6"f(][**5;,+!9-7#E..O/JTO1B3?`4+40&X:6.0;(=C 2A.9qSA7+:G@KvG.%G$M"kMT\tO.O#.QbRT]YRHRRW`öR5!U-#QU/9Y#b[A.[+@[+41\߷\La`IRbAUL;d9eKC{e.9+e+og pggR(mU``m@KIr6+5r\It6*euR]u6IxUab3z%|z+ {-!|@5J|}>Gr,ÂKUQ탲I\7@E] r*AJ!|T^Laz@L-lI\ ~zLaii>5+ڡ. 6"Q3+4U.9e@54=G˵A76w4 >AJdԻ6. ,_` ,I=,5ۿU` +ò,ijIJ?SIJ#IŲA. Ʋ3Ʋ+,DzJT; ̲=̲̲,"}Ͳ,"6cвU`^Ѳ)$Ӳ]`1iղ#ղAK,ײ"6زC^ٲA7۲z0ܲW`Δݲ,.iW`M5! ,7.Ñ_`5+rCWѿ.0L@x*#+"#+ BW`=4b7#XJ@;q3>f.6e,"^?S#QT]˧?5h  UIJ %H KGQ],7}5LaS^6?xx0&KB4"dAR]@K_[^w :&O S^9!=^9!G\i~"U`k##U`[E$LU$R]q)L/I@0.15"11*,37L(03.9 4F7I\_9#u9BM9]TC6. F7#cdH>IJI\K5!{4M6?MNAUOU`P}WLa[+`]:|_A6 b>8g6"h-jk+'l8 oH^o6+[q\[ uW`uuIS[hz+48{La+{?JTJ~La\@L\@R@7r.9K+K.K/%K6"N.N5/8B@5B{T\{5@㥋@Ta.6I.%I,ĐP#KBd’9]d’I\$7@J>_ᕳR]JTf7.oC͟AJz<5*S6I|{T]?#C57A˫JA+L+KUx9%zL5!(,(8$-#Ϳ6.(³-#ó_`#ųA8tųIRɳ6"ɳ* <ɳ?SCʳD˳-#v˳U^ ̳7{̳JT7{̳`ѳ.`ѳ"(Գ 8ܳ5޳LUsA޳7,-#T\U`@J,AUq5?` +U^pIS%y~6I3)]76.uA7LH@6n@I3h,#,@6<4Ie ?S__Ll CAN`(6-"6@Kf0KV,"] 9]95KU7#HI\>#ISPW9\*6$@6#&.1**3\C./6,E/6A/L07LL0H^J0.$,1.$;1%e3W`F5@6R5JTR5KU~5,p7@6̳8@L*9%B2;J`;?6;:&%<%?6BC8#D+!IIUavDJ?JJQ?KMU`QU`Fe`dzb6,+cimoTB-qAT]q7-s,LtI\t,xgu,ZwJ4w+"zI\z"{||6"h}A7}-,΁ISㄴ,;焴8LkU^K]׉%D"dI3ۑJ`v暴՞KUC@TaB7顴7,;ߢW`G8$E-5!E-+I>4l6?T]Ȱ+MְJT_L @KC6.k W`=R]2?S2R]HR#)+U;6"=KUގ7+],]A7`´LC´5!ô+ô* Lƴ6"SǴ-#eǴI\ȴ-yʴLC˴W̴J`'ʹ+8Aʹ,8Aʹ.$*ϴ^Iд/%״UI״=INش+!}ٴ#_ڴI\۴^ݴJAmI\ |I\U7"ܣ%<U`H,",+C8I\+>RabÖA_#8$Fp'LUnL5-yH3P7,5- >+d "oKB-JTNX098DL8$#'+4?ȃTH<."hJT.@K2KU1 LV!JA;<$*"&A7)7LD+@6L]+A6',6-$-@K-@6-0U`R2@KR2@L@3`4x46?4I\u9@+X:3:6+:6?S?+!B5nFA7G@I+G`MH7LH@+wOR]vR$XW.gZ+[A6[J`ס\BV^+4 _".9bV_Mc@5c@+f?SqRgE`iU`iA.iKVjI\bt6.u6-X&uD:*vI6/lvA7w"rwJTy,m{6HC{%P|".P|# ~>R;~"P}A7P}#JTuU:\IUIx=^ˌBNˌ$-񥎵AK ֎J@6:Cd ꐵ3yAUyMW,5+N0ISaA.,i-,i*5NH@ V>3̗ ח-ח]_L|" N"$VL@KՠIS|/7@?A7cK]XΩA.|#­,wT]W`MBd*@+@+㣶@秸GQ秸AU縺5=H6JDL6"o%k4LV LaAµ6-õ@6õ.ĵڀǵ-ȵI\pȵ8$˵-˵8$m̵7A@e͵%yϵJT ѵԵ!<Ե+ ׵6"ص/%ص-#imٵLa%}ڵI޵C^޵KTg޵%ߵ5-d>+MW9I>R;@6sAU0?6J`uR]cJ`cLac?SLm+`"-t?S­*6$0&C. I\=UazFG] 3+ ?S+ @T A6NK JT9%6ANXcU`E[.ň>R!KVl#U@'4=*". + +8f,6.4-0&-@5-.5/.r7NX97-q:4`q:J`;".Y=%>)>t!?@5-?La}u?5@9A"A6F)bIC.I6-OWJIS}DK4>KT9d+M I@OG=P$QJT3,R6+XRW`lVX,LW6IoWW>)9Y4`gCZ-#sZG\pZU^mZLamZI\lh[?Slh[5\>+`J^MWU`,k`A7Ja+")e*5R4`8AD:U  * ?T1 -A + =>R?SC9?`+?`MWJTN#77Lc#;W`UG,UGUG?55BKjITe]$O7-i(+ 7L`!R]]p&IRH(+ )"*0&/е1AI2"7:5Lan9KV >3B>*5?5!Ą^[+?$-#ϊ9%ދHRˌ>N:Ce듷7B]#$yCUIJ$ISBA.䛷@5yLV66"D9^W`>La櫷9LLa_+_*uRU` Ua2(C-W`k]THՏ-C-La#ȷ?6Eɷ+aJɷUaʷ"˷,̷@K<Ϸ.#Ӯз+Duַ\[`ַLaV_׷ALBط6IBطGQsطU_ٷ"CMݷW`߷7LG6A`NJTn#,"¦%:1@+M.M+C9$-/%%U7@La@TBKU6-JTU`UiI\N33+!LS^_L_`@5-4U`A..&.B7-)+#+x @+  6+ 6"(- KUGMGM!!7#OC-%4``ULV-,AUq|- +! T\Ȱ"6A O$!,.#5.0& 0W`1%27A*38$?35%o6JT9GQ:6-Kf;AUKf;-7.g<".'>4=L@?SRA.LyB* QC+EE8C4H5yJJSYL8$9Q5!3GR7#./T5!YU\[4VR]2Z/%BZ!vZ`U\.{^8Q^?6`6.$bU`kbEeLaKef@+#g.gT\'_h6'_h+!zhLUzhS^Ei6"$\iI\"kk5IkC.45o)Ep%qG\qKUsAIPTt ,uuB8uH{U^F~T]lDJ߃5@LI\`ʅI\%?T3Nއ)> I\ #C:&W`]HU`đ_`8+5eUa+a,"9U^9HR4QAڤT]Bʥ3*뤧%lW`N@5$/D:W,"䰸8b0DGĶ_`,庹#?=?6?`6A¸,5¸I\ŸW`aJǸ9?MǸǸ#ȸJ`Fɸ#ݣ͸ϸ9T,и)Ը%aָNXaָ6?ظ5,T>ٸ@TCٸ?Iٸ>RݸݸU42޸I\2޸MWIS_`@ 8A:C8ALC&7@,"AU|;m5@m4`|6H?6[.[-#/b6"$9]4>vJT:-#Bk5*+!-K=q+ 7R6?)gH4"BV,KU;5l_`u6">5!>,La~AUI\4"rU`x"J + D!I\#I\'(6"("Se*m*A6m*>+*Y+T\|,.-GQ#/"f/La50#~[0* 0?S1%R^2I\,5:.:W`:;?S@;<_`(=MWi=-#9>/%9>7#E_`FGJ"JHAUYJ,hJLahJ4`LAJwM,OT]O+TT^LUV#gW>gW#DYI\̀Y![N`U\C]-#>#_"`"`+`@TYKb-{bU`Zb6A!c6#dH^-e+áhR]Pk/%^rU^ w@LLw=ILw9]}KU}- &~* bB@5Jl6?.UUI_` .H,""XϏMWR]3F=^Γ.Γ+铹?S6+CGYLW.J,\T\#-#+HRHU`ޡ4M"-s+扬\[  ;+4"8$ɾ¹+ƹIRyǹ7#)ȹ+ ˹"ʞιI6Թ0&<ٹ:^wٹ5!{߹@6u"7a*5A4+<0AU *NK_[s>#/)6+BB6"jR]Lb6?u=֨?6UIBV )/?SI\Z AUG -4 La.%GQ|AJեn>+nKC %HR"F+F7@.%*.%*x'%_k)N8)IS7+B7G,\G,L^2*5B]d7^qm8."Z9:W`I<7@@BVB-RBA7bB>RkE+E@KFBVFI\F+7I@I%IGQZJQK*6M=^O9LdRHRDS8$5T%XyVDLV-DW9]1JW.1JW#~WC.~WC*YLaYJ[#_@T@`T\b%>b4>[d5.jd)PfA8ufhL7h@Ji6"Gj/%DmA7:oU`_r s"w@Lw6Iw-w+F|.u|6+9~*"~,=@E.$kAJiń0&ińS3T\Z3[q@5ƘDL蚺UaD,"ʜMWw*U^U3+;u6-3ա6?1q:'CEE".,MWU`eI\  #j`^iR?SiR@To볺R])A6+I\9¸9]௺0K+qK]^>RPĺ,ڏƺ#`ǺNa`Ǻ6A;Ⱥ-^ʺT]2ϺD)ӺJ`SӺR]Sպ)ۺ@LFwۺۺ-#K]ܺITMO7@MO5@"H^LW6I6?M@5(KCdU4A.ƛW`h98R]$LaEy_`8"5!WJTWI\>ITiFK5-}T]s6"{ :C LaU @L<_^MWLa^7#F7.S7L8:KURAURy* s l&%+)+)JT)6. .LA81"'(47B5i7B8R8La3*9H@9<+!!`=@T>9]@,-;A#CA.D@K"HL@fJ$-QK5=0L,zLJT_L+_L#MU`KN4`N@6 OLCDPQ\[RS%3T".3TTU^)V7#m_V?*WUaWG]rY@6}YKU[C.w\6^)^?6mgb/:d4`1g@5i-siA8FkJT)kB]Glm7#Vr4`rJTdUs-Rt* u6v.wCxU`ex-rz>3{>R |6@g|J@v"}=^~HTa~A7ӧA7.AJSD쉋+B]隍@^78$%Zh-##,";EC.B>Rt%>1:C𴢻5#`ۢ!H@T!HAU["@%Ԩ7#!^`7+S٭)ȵI\S?I6.K8mI\¹+U6"U^$s5!û7.ĻS^vǻ?S.ͻ* λ6.ϻ#*һW`?Ի6+Oջ8J~ۻI\ܻ."_ܻ!*޻UC޻:9v?Up\^p]^SUI?SD?6`%i.DLi.K]MWiC4Ik%KU^=I 6A K]?r/.{@5{#{{, %La#+R]@5 6" I\R "'?6y#+7|SKUAU&^` +@59c&4>Y*@T!,W`^,MWT*1"-3AU>v5La=6U`N9@529>.ڃ>U`@]BE"F?J5F+I,"I5!KLaM@+CM-CrOU`rOJTأQ?SCR.ΨT)AT=3AT0&vT)1YKBX Z9.]I>˧^A7.k_@TQa-[2bV`bALd)LAf-mi@5J]lJ`n4`nVMEoU`o+o.Lp-#mp>R0q@hw6upw|w7L{xU^y#z5}6-{Z~H^~@+p7A؁6-@7₼/%xf"U6.,VT\.TL57#5-q-#,:^A:.r\[C=I{w5,UaJT'-+IT<uЧT]La"9S,X|U`鬼K@88_ذ6?L?`R]ES^ڿ-+ü?6ļ?`*ļ@+kkǼCrʼ,(ʼLa(ʼAU(ʼI\߻̼6?}ϼW`ytѼ,BvyѼJTӼ@K1kڼ#7i{ڼ8$&ڼ+Oݼ,"ݼWN޼%^p?SS^_"GR]f * fU6"=ʳ :C2+7..+-#2+!=^AU+6"J)>RIQ/%8$Es W`] "4i~ ;,@VLa$65@9]׼-#@T"C>Ro@?T!#,y%89%3+&)B&+5&?S-'.$-'N-)7++H@,W`,TL,H^80^L,0+ >5@67R]7R]7'49^^:n;La<#<,>@TfC6"boD,dE-SH̃HJ`FJ6.KLaIL-# MAUQM+MS^9S9]cT9%:U_^fUIXA.>XBVEX_`:X/% $Y XY-#Y,#[*5f[/%~[6I_6"la@K"b7-cI\eH^Dj%\nMWWn%=pB8p,"rJTr!00tISVt@5-duìuMAWvw\[x4`y/DZ_`HR?S>R_`rv_`("I_`ԌTLvHT0GQ0HRc3c!*c)ALA򛑽S^+AJ DQ?T!4 hHR%؝%؝:& ʅ#5d#5㦽@LbLa!4ᨽ`NՕ++ 26"@6"ʭ?=4d#d.95,LѷAU.@I+W~7L۽@6>R,La"ĽKSvBȽ,0ʽA7ʽISo˽,.y̽JTν8$EԽT\"ս#"=ս,"z׽C@ؽ-C ٽٽ6?۽C. 6#׆I\p@JTp@.K@I0&5HR<,>A. yKV,"`ISsJTH8?62JT2+WQF, "Ij5W9W`8K@*8K+!F - y Ua(8$^G]dT\dLU:"*Z"@TZ"JT4""."CU %W`(.*+w++w+?6]e,0R]O1"TA?I\?+@ƒD"DaL*G&HI>R1'JU^N%P6-t\?`\?` _@H`@5,e=^͝e0Sg.h+hjITm"kIRpA.CUrGQLr9]Is?Sct6.)>|JTt7#86IޑAK*VW`ДH@~ F% C LaKVP3Ѡ>G%5,@TW`=4IH䮾La -ܲv=IEEf|JT~MWᵾI\ܨþ,"!ľ?6Fƾ@6Vƾ"vʾ#>ʾAUy˾Las;GQs;7LϾNa$JѾ*hӾ8$-ԾDվ@T׾-ھAU,۾Z!ܾ+Z!ܾ.ݾT]G߾MWG߾La߾-#w߾#+A7 U^]``5+!6"I-"I-)4.#6MW6NXZLCZ5)n|A76?@6J#q/%}WXIT^?6A.++dL7JUa U^s>>@6I\ PMWi+O7#A.$+!f?=KU :&}Y"9#6"#UaE'U4E'+4(HR(?SF)1,JT1,I\W.6#S1La3KU60&7*7@5I9U`? ?8$ ?#ŗ?T]sC:HISI6?MW9{BMW`]M7#O+5UAU)Y@K`\Y%=Y=QJQ[%:\ ]>R_TSg_#94`"-a@0a.$0a"0a#0a9%;bDNkc-#ue4!teW`ag0&ag* ~i+j@5#mCn4`p3'p+Eq~sytNXuy?S z+ C5{".Fy{|@^x9LwLa,,5!4IψA76.tU4Lad)T\GL^ETLsܓ:C@@5LD:.˘3 JT~SH쵛]`󪜿7A6-66,-#0M#yZ6" H^ R]qd"=1 I\?BV\%EA۫-#LA_+X46"B?SzOK]=dz@e@++p6-˹U`H@TV7#zL57B4ſ#ſ?Slǿ+!·ȿ8˿La;̿*5f̿+!*οAU8ο0&JϿ,"zҿ6+6Կ+LPֿA. ڿ6*@ݿ6.lL7 UI5!lW/YLWCH^q@7TJ^.#KUA6C @T|RQ?MDLa-a+ E!*lV A7V ,< 5! LC :& " I\T]JT^&67l+4 MIR`@T`JT?T`y_C.[?AU_:CuA!T^#8$;$,"I&W`K-@+`-K@$-GQ24+4U4- 6AU 6@TҔ86-k93,;+{<=Gg>5*>!1?JT1?KU?%-CDV F"'GKU4K5KR]AL+4OKM-#OKM.WBP5WBP"TA.,U6?ԕV4 ԕV/%[>6C[A7,]" .e#;Ke6"lCUn4 n.$pA6Lp-Up%w"fy|+}v}6"9ȁT]T\RrCOJ8@,TK[IS/%;ΐ"@6eU@5E͕+@L<>+Ǘ8$I+I\I+GQ6"oV4@6kZ8]?5D+!L{-L{)eҤLat"Mե.se6?@,"$"6v̪6+R6"P\+waKUc#I7LIM`+#:ѯC7DZ7RYB-MI\A+Z+ [3Qи.DȵMWZJT%@ @5AJTLWED@6A@^t 5-$KU>RLaW``?S)"=y6"b6"%*?SA.|C[E@I8KU6IoLaoISk-R]^U#9%I6$6-&_#FJA#h7#F^  >R.xGQy;:C>-#LKUj{_`!.MD+@Kd@TKJ JTg"6"@#B6$HR'@KR(* Ҙ(C(?`*"D+?5x,La-`_/AUP1DL6C4q46.Ȝ56.s 6,e17T_;5">""X>H?>GQ1D7#7HLa:IMAJ+'L"ALUa77N@^O,OGQOT\>Q~T5~T+U+!VQ["y^6I,C`@5a.$a^_Ӎd+"h6?k0&3lMWpA6EvKUx[w@Tmw?S8xGQ]x=QSފ@K-#IS3%NJTlJT锐BV锐LU#.9g?S:6+x6.ՖRuB]:iJT,$LW$LUy?I\~S^:CڎLaʏdCңLCK,"9ƥ>Gfߧ6"x36{|@^ ?`-_A8@6嫫.$lJTŰ!Ͷ@6%/%&W=I04`0U`+8,AT>G6lI3gL!/%"IR2c/%Y 7#Y6?TL$LaR6"f|IRvgJT\) eU`0&`.JTUI\,Lah.X,"X4 =)4)KRIRMzL:%/%= Ca LaC Zo 6.D#5 fKTˀ4+@Ts/%s7#{'@T{'AU{'MW{'La4E*6,+"?S?!GQ?!G\l."@5t"76R#3+.5&#7&%A&-0E)W`1+).%/6?"0@J1La71+2T\&3".VC3>RVC3U`z3^[a4C^57#6?9G\IA:U^R:5@R:TK:7B:KU:IS:B]:MWu)AU?.VC@TEU`ET\FA7G,G!aKU`xL@+HOKU R/.>R.STI6hdW5?WG]YT\YIRkY"Z,z[\3]+7F],Ga] a`TdKUe"4\hIS6i!*;k=Qk!*'lW`'m+ʽmJ`^n?Trn="Gp.9GpD9gr7+r@Tr?SQt@5 t7AýtDXlu rw".gyDyU`5d{J`T}A66~* 6~ :&#+Ђ6..KU.MW,I\,3+UJ?]7+琉.#9HMW9HAUch.h85<@66#{ݝ@KU4)̟A.Q0&iz6"3,w>)l?6#7C"7@T MI=ѭGQILaIKU-u7A藳Laŵŵ,"ф8וL9".Ȩ%Rye7#87#޾:CISߘ&o@-6AP34 IR.|RLa>~80;~BVKtA.+ٮIRa(*#v~5*6"bNbI\I\.yAIKXBa6Ixt!U`s* ƹ8$DMU-3*09D6.&@@:I\5==^&"-&`n*5`n-6"|C.iB]La%%fKUZJTd5KU|!wKU!@6c % AU >R" I\P U`KAK)}w8#G]I\@5,4>9!,KUMWP /#v KU--!TAy1!?6*`!>R[l"S^;"5E#.E#-#M#ܐ#I\ܐ#BVܐ#LaP@$5@P@$?Sy$ $%+ &6AG))SH-!o8/%O/NXO/T\0I\1?6x3K@a3_`3:k444JT6U`%G76"#<"<%P:=,+P:=5+{=HR T>W`/b>9?+!?^@5!/@T]B7,~C%2CA.hD7,F.FAJG9%l;HVKZoI?`K.$\M7#NI\ZN-#jZH?q^+!0 _R]`baAa"=bA.dU`'f6.hLDkISrn*6rnD:o+7qpGHop0&x>s* tu@Ky2z9]<|S^}!*c~La~*xB]x9LI\U`P".x@5E.VUaʂ9%U`?A.6*5WR]W4`X#)LU}W`HITލLV,-#X3nO@70lLWLa?H-6eIR3'K+RS|YI\7KUGRI\>RnE-AU9]=._)AI=.+K+7+ LVI\#@+,6AHAU3@I3T\k#HG=K{!)9?I݁=^@K$S^GQIZ* IZ%O I\T 6A.MT\MU^Ʃ,n4>d?SAIӊ6B7#T\ISM La1O ?7 =3 ?To6-XaAI.G@6_`T\#8] !!6#X""$U` &ر&W`(*"s(+"0*KUm*>5>+-N +@7-K]`/5!`/,5{7,7I\i9:CX:J`jALayjA. B% G@J~H=^ J@+sKנK7L;MKU;MI\N,"EO?SEOT\P6?PB!DQ@+{-q|I\Q~6?巀" р7#́+\%0>3yW`KUT\6#%>ݔ8$yJ`fA7f!-#0JTRAUBU9LBUO'7AtLa֯֯JT[*AKldI>W`0D0m*5 -5 4S=h[* >G  JT,HRnL._q6"C.C"A7 l][.$7#NoT]@^u6?w#";16"lA.?6N9%!KU^@T9]6-;";8=Q5!3 @5)?Sv+%@7:U`"7A0J`_`+A67#c_9LlA7^GQKUj"@5 A7` 5@Pw:&R]09]0ISp#,8/}Lah0&h@6dCNaIRIT\ #A68#@6^?$?S&6?61=IB3%f4.D7W`88.V8vj;5O?6"?cAGQ.C"-MDW9RE%*HAUJ.KM^O*5J P#wQT]8SGQW@TɄY+ Z5@ZT\[NX>^:&'`/%B`7+Ѣ`/8"cGQhTLjTKunT]unBVOp6.rGQtP4uMWw#ay0&z5@ׇ}W`m@K(80sNX.a_7Aa_T\ 6A6eW`.LaAIo3&WUa@6="w@Taj%\7- .dAU 6.ŭ*"@5X3+YAULU2@Tl_^yf)\Կ+ 8$l5"GLaGMWJT[L^x+> /%C-#.ew@J4>IHAUmCWR]KU:CC&3@A7i*TA-*?IoeJT|xBKQ6.EKU!9 6@L;s7#;s".;s8*ʒI\&-@6v_L "1#ϣBJ6.a0&h$@Tb/#>+,#7BMW6"V@ L7 AIK.*3)s I\.5!I\GQ<-sISsHR^[m /%m -#|"-#!&6.Oa)S/.1"1]["1U`*26AO5Cw677#u8-Q;_`t=^*>6?в??# @AL!<@LUBN-rC#)ER]E>R\"GA6\M@6 PMUQ:&})ST\W3XXT\.X3[aKU-`c4@d.$d3!e.eUa.gDy-h?Sy-hAUh][3l6.hl +m>R}n8}nC.4pU^pLa\q,D:s@5rv6.-xMWIy@^}AzLa}AzMW{JT{La}.$V}6?}~/&)T^FoW`T]RLCg?`BKqJ`A.D:W`ڋ.$."܌#_6"x,LCPz-#"0,55@6Z+ 7$>R25!lCM)U`?`޼H?5>\7+1U^sD:O8ã?5L:C6@K/e/7oȬO+UaҶJ`@6T\*6g!5t@5b,:+ .9cJTr5[!/+"/%2U`8"/%cM,H-#)U^6A6$A6,{-@J~A.~0&6?tLW`zR]7@o5.GQ#B4>׸6"׸> }GQY6?+/%JT*5$-AJ4)L_5@L_T\3-# j"ATtH^/@+tISu\@5u\6?I\$U +߭6+>6I>T]U@LLW)GA6A. AU)@Tn**7#bv+4=k+C8^ -@Ls .La4/%Ԛ0.R2K]3-7_`j8U`8?-9<7L!<#=>R#X>J^e?,-B*"+ F:GIRpG@LH'J+!YL0&N-#N9NJTOU`bRR>RTMD W@KMX%Y@5cBY+h[3\W`a^JTa^KU[^9g`T^f6h j9.kKUk8$$q:6zrAUrjv@T|,7t6"둁U`-_`ă7,鰈7#ډ8$ )>7#unAJNx+q,g@LGkISGk_`E!,J#JLA+ TR] m7+Q.%%!U`o̶+KUS=##9Uao.{|C|-o@Lտ*տ53LI\X,5z8A#-# ) pb@LEf*@+AL," #ٙ+!ٙ?6-K]@LPBVPI\I\zH^W`p .CU`..T+!+LA/%VJ=GH\[7L/|T\8$7#;M6./ \ *O -O % C2u HTJArP3=rPIS$I\$+5 +,e#{$"Y-8_`HR:6.XW`=QZ{!+@#TLe%U`,@T,*-W`ڦ.ڦ.DX005@r66A*7"*9:@5<;.U_;?>R/?9LPAR]PA?SqD-FIR$HU`~JKW`MA.O?SOJT1Q%aRrS:&/'TT,kV>}WJT}WY7#Y-#Y"ZC.ZZNX(V]_:CHa#Wb3Wb-#Wb)Vd.$f6-}g i. iU^i-ii0&5mUanAUoVq4?s6-tW`?tKU5|x#8yH^z5,dz#BV$Q9]ŃW`#Q?5/+'-S^+4U^@5KU3w>Rh@K~>b6\S^_"{nfy4U4MW4BVU` ,6W`6+*6.a@7ө6+\[@6+-# >ѹ"#GQȺ6-.$I6--F+AI,3'` l0&-6",%Lak3=Hb3[cJT{#{.C#hW` P8#;+ p@KNA@T;A8^8C: @@L`,'JT'I\YLa) AId*5!=^)*5+VU?,@+K0TBa,z-#K^4>+RHRU`MW֮@61UaLaSJ`".)7#)+ɷ"6.W`l-7v(,"Ag. QLA7+&  B]Խ%HJT*\[p.6o6.=-#  6-953GQ  mk BVmk LaP!s$+$+!N$,Y%9]&%MWG%,&=(NT(?SH(?`l-JTl-@T{-W`-7#1W9Y3LU-85+:%)g>-#>-a?#\?0&A BISBB3~nCW`F,5aGMUH#U7I6+fM+N%N0CNPLRKURtTLaV XLaHX@LVpZ4`[LaXm[4 !\@6R\" \K]2^kT`6,q`+!`HRg/%g,2hh_`hMWn@Tko`_ϑs#6uU^Ou+ wy`&z#5CXC9O/%OC}T^"-E,"j<6",_5ہ"ہ,+!TLKU5@/%+)\[ G\6J I\U`@+JT3./6IK].|`Uƪf4%rAU8B@T8BHR+@7rlI\'@K.]]^,ɺ*6c* c/%Ӿ 'HR_aS^_aU`V[RB]Lag mB]HRDJTSNXK+=^+O"SKA8 kW`LA"5,B]+:GQ5T#8G+JT6-t=^S_` #@A7k"BG8$N@7gW3v6"j_^GQzHRc%8,P"@5v+X6"QI\ l+ T]." <,)7HRJT3 3rh D9t @V  . M,I\,1"}l.}1?S-#)>3T\;!!*z$-%La06%)&?`5&La5&@T@&>@&.(-#HD)@5a)U`,JT7-UC.*1NX.*1IS2{?5UL|5CN#E7o9@=I@`TOAB6/C8CIS8C5@ DAIeHI\LLA0O@5-R_`خRB7U"TKUwUU`wUISU@6WJX,ZYLaZAJt^^9]4^[5_IRadBh.7@hIST[h\[êh@Lu~klLaDz-#xz+xzA7||LVǀ7#[ׂA6ޅT\].m5!%-#W`y3}8$)J5@7@To%υ/%B7@6" ,y#elΪ#.x=IqS^y+!yDհ>w4-#R\?6kȸƾ+bI\6"fmR]R]T\BG+!FMUaO9[/%6#uW`}][}U`BVP7("jLT*@+c9%)037P0&IS.%C-#1 _NLAJTr%AUr%JTr%La=x:&7@KB]J?]NW]>R5|*5+# I\ 0&vIT 7#Gk3gDC*?fKUY c* ! W`#9)?S:#U`..6Y> #BM!)-,T^bbV="PXLa-#Q"@^{"AU%Lae&_`&.&6"&.)+I\@1./MW_22@636+6C76"?7^h+9$-:TL4;?S3!<^V,>J>"C@7\0K+"MU^)M.%.UI\PV>)eX.%[CU[?Un]+ v^68_U`_6""a+@laaVC*b9]*bGQb6"d,fe#|kW`vlLa nU^g[n+!n.6`o:^o#xpS^p6.qvqR]qrJTHtA6Kt#Ut6"t>Rx+z/%3{9]| P|6:| LUjLa܊[ >)+c+6P@C"z+#I\ 7UCAU{!K+=@TKS@1W`?.9D9f*W`hA.n߮@5iϲ?R5!kA6W6"QT\鼺-պ7,Q=@I@kJT5)>d5!.6?V/#x"I\FHR#KPA6W`S6?#LTsAK~+[C:NX5@EKU"RGGLaGAU%T\aZHRlҴ7,T\[@INX#@+u6?QLaA. AJDU`bUaxLax .  U4  E)"?S@6+MUK]5#!*T^a#JT-&#z,JT)-Ua)-MW-JU0:6 011I\16+.p3AU5"@&7@&7IS7"*7*e9T]o9W`x9A7T.:.;NXr=6"r=+!=La=B]H@C9v B+-BH@VC6AD!F+GHAUjH>jH#jH,?xHI\ITEJLVzQJKUcJ6?J@5bM-wNDNiNLaO"Q@5ސQT]QKUNQ46RaNW.WTL+lX6XY@TYLa<[>].)^T\z`U`z`+ dU`d@73vi61mA8#nLV!omSHgΥ_`d*5_(HT5ASͬ-6{{+!~ڰ+4jO@KIRgͲgͲ80N*"?S 6"βA65!)>_`+-#7La 7+HM"T\U`x.G&2v@^eI\H6A-#6?&5#(BV ?SL,"L6"I>"K".k"j;A7"MR]A %jI\@A7C>">R(DU?j%G"6p?I@K5"@!:92+!28pK\%ÑLa6+U^ AU&T]?Sm :&M7+50&CW` AJ T\ /%$LLaW`La?o 8$?o M"@A:+LVi/7#8/+]97L@A5@A@6Bb3FAKvFISJJTK fKST6K#|NKUKQMW R8T@8VSH8VU` VS^>WG]XcY*?XcYU` \].#_6X`NX[`a>RaI\aUac+ h8$hKU;i+ lGQ4!pKUqW`6qJ?rvt>tU^pxJ?{.5}6"QI\݄쳅dVG$6?Č8$8=Qx.$IA6+hSG=IZ.O.q}La}I\J"7d3@LͩD:{UMWI\Lұ7#Lұ3[6".9_"õ@T8$O3> @6ITIR+4)g.)>s,(T]y:C 6.!*R6?g@5@U47#e3S^1GQa@^y*6P5@c \wv=* 6?B8.@lJTIʿ,6T^6I\q3>6+ LAs0,.@7"5),/#XC"(,G,IS?SNXg?@+4B95!GQ1"T]O_T]XA7=^.KUw"5!-  7+j1 AUcp .# 6I";".;"o#Y ,LU'+o*=Q4?X,?Um@K^@T~LV6,?S6,JTb!?Sb!CUb!GQ"-= #!)@+*+MW.@60+ 1/%2,j2G\63JT63IS(f6)(f6>37AJPA8HT%#:?6-b?C9vGI\vGT\H eJHRJ+J/%UK-#&@MP6-ÏQ*"eTVXU^3YCGY>G3Y!ZIR\6.eI]," ]6W^6.y^=I;_-`MacdKV0q*ovHQg w%HiwӤ{* "{|"| |M~NW~hq>'87LG+q/%q6"#T\ÎJ`ÎU`Ku+t`4ᷕD0{̙"48@d0&MAU5?`NX^`t%IU^T6-Ei>R7ȱ/%7ȱ6">R稷XL+Y%\@L7?S#+o;6"KAn@Th 1@^(XGQT\xMB>Rc80;^`I=QuTLA6S#Ԩ7#g6+6.iHTƼ4 'h7#26"W`$x*#,4 >RR=5!J`4`GD.0 KU3*5DG\4gJT66?7#@Tpc#.6#Y =IKB:ZMWށI\@I5#*g536?!7I"C|#6Ir$'LV6{("Z)" *A7e(.I\2>R@29%$37#I(4@T.57#j5?S5LT6]`6][V,7,M>8=3@9@6*gE/:\FJT\FI\\FHRQG)PI?TJcI.IJ` K#]M">NIS~R5R>3R4 SJ`[T5![T7#PT@+8UI\Y+!DYJAYW`v\:CL]'_,w_@6`".PI`5)c@TcAU:c.qc0dAJe+fAUBg+4[gg@TegNXiMA i#Qxj0&#l6"9lKUcl%wl@Twl?Sm.73nAU NpDq8-Dq8psx6"AxU`q|9]4|:&4|9%#HLa%y 1A.$XJ`߃.L_5R:C`-ֆTK#6AU!BVo-#ߖ6""ŝ6"KUyT]; y|.z؏*35@ȭ@Tq?5dtISOٯ=^?f,Bұ_`.TAT.96"8C.A7_^?5}7AjtCjt.NXAA6 -#V/%#0#:& >4S^NI.SGQ [I\&)CL&)\[h&JT#W`JT:BV]6"bAU7#f @6@L:@@5@#7-#*! k6?d"7AU`l!6^l!Mav%WKUa>0@595A795>M8MW8KUM6"M/%ԝ8$&, -8cC@Kڇ67:U`lX-#^J`d% Na5 A94 -6G ?=0 .D G{ K] JTJS6,2vAU͝*3M|JT*6"6"RS{'La*B]*6?"d.W /1 4)56"59@7e9JT9U^Y4?R]@7#@:^HA)EB,C@LDIS|E.zEBUfFpH4`H"eIITL-mMJ`;tO-C3O@TCSBVTTUnV@7wWI65W:DXZJT)[#+E[?4 `\5,`Uab5H[b#d^`IdLaUh6IWjT^Wj@JLk+!k4IkH^m*5m"oq8$rW`hu.6u,3wT\w6.Ovy6.9||W`@6N+!F7@+rڇ6#؉D4AUҊU`4?SۋIS/%.+܍#N- AU 6.6.RAU* 灛I\k6Ijn+!jnA7ҞISE_LS +!.@+Ρ+/%,U@,!)b#SF/%Fb-#S=8͢MW環+ @ñ7:@ñ=4IS T\^C@LBW6"T]'@T* IL^VA.a@IA8I3,:&%6-i"@K26?J-#8`/%8`-#\[@LT\U`X?SAI6)5t+I\t+T\t+U`ϕZ:C=!BR6?T y W*54`?`6A06-'H^'5@* BV9a-W`1I\,6I4G+}͓LA)67#a=Q>T^_}H#w@JM%YIS4+#C3+%%87* KUAA.!AJ!B]«L76+ڷ@6J`Cl_`XU`A60K]a6"8$!=I!=Qk#6?~$-A%TLc:*@7i+I\i+U`$+C(-W`0R]664@5z4MUw6C:K]f=/ABm#GLaGMWhG!I8ZKKLaFMW`qMaMK]NNA6ZbR]Lc5Oc"4{8d@+CfDL@f)>(i=QTi9]vi0&vi5"j6"wj6In+!nRDtLAvIA2w-#S{JTo{BVo{I\{.|CWT]-#Y΅N9:-+!,=^H^PeJTߕ@T`}.R| H06-s|.#(A7"٩*n@Tt.T٬?`e3+ޑ@+Jf@KU`Y[6.R.tS^̎+ @7@INNJTjR]-,!09]F-#oHRoAKw>56R]46.T\PJ^X6"*5Q*Ho@KLaXISXU`sT-7B?7#+bH"!OY6",?` ATe;+!e;A.,ΪH^Ϊ\^,T\][DAK{T\{IS{AUX7+pC81+ M=?6jA72.$)#-.NX6I:5!Ø"Ø@5A.l =Il UIn .68  +7,%P-#AI\ԡV5!q6" `R] `JT#. LAm4!JT"Uam$9Lm$T]%W`/:&3=_]'G=J)9)6?a*9],LaG0"0JT14U24@59977-P87-<#6OE>+=M?%rF.$ZII\YKJT$AN dOA.Y|O"[R6AjRV`ySU`5dU6.=X4@X6.F_+ `6","GPvT]- ˓B]t+!ooA.o@5CMW'@5c,Ș!,eEDT^CWU^\KUW`0L+w@L?-95zN#Q+6"E,"ٶ7LU 9]Ч@˺U`ǡAJVJ`5=^4-#4,"4h7+JT6I$HR #?S #IStK@L ڼW`y5@yT^VU^A7T6@6\TKLaK534>R%?S  nUa["7W%U`lW`97#|+.#" AU ?S,#97#@57 I\ 6I # CNXB.$B8$5?7rA6q' +!+ $@L]$5 (CL*)@UOI,4"v-@T0][0LC,2?6n59]C7AK8I:,<P=67A=6."@6"Dg@"IAJTIAGQRSB7#BMBCKU8{GB]G%H"4I5AoO*oO@5oOCP# Q7#"W:CPXW>RPXW5?X6:Gu#*vfhw:C[{.[{,"{4`W` W`DN͆?5L=*DL?SAK-CR]#~4 #~#7ËR]aۍKU^^+OI\´>´5țJT HKU&~@Tsz?Sn =QަI\-?6s#s,&!D'@T6*Kʯ@L2T\tܵ#:6ITŸ@LѺA7ٻ0]BJT]9LrT^UaVGQV/:h-K^5@oIS=?I}AU{6A)^AUaDXT\ #qP!*+ @+6?UAUz~%7:&)7@LI\D5#T\/%eATx/%BUCH?5e(7+VNXI%T^-#.iAM߁JTXW`t-#T]#P\[aG7Lk "k #6 )3D KU<7,M:C[YLaAI zQ"1u6"Š+-C+ T\R!GQR!_`2@#T\#AU#+$$A7$LC%@6&BV&JTb&=S@ (3B)7#B-*@I0*0&+?` ,-#[-6?-%*=)>LV@6?KC0&92G_`92G9]GMWGT]GU`p'KxLT]O+nRAJ26U][26UDXcVK9 X"Z5@\@K\@Lk]7#Ʋb&.HcA.&jXmJAXqLaXqGQu!zTw+6zTwJT'xa)z@Kz^Uz%{:&C~@LN0C,"/%0n. T\GI\絆W`LUaψlMWȯ3e<6.B7,"8+48LW˄3˄,7LLaݒT]3I=&!6w?`<>RfC./՚+"%U-{#*5JADgR]".\[RH/IS_"%5!%-L^= F$6"6>9/%HR~ۺK] 6+yAIj!"B0&UISi-&-#{M33+mT]Z1T+!_O#_O?6 5=}T\ +!U?Ј%,"x9]K*BKBVW9LcC@T\XKU j!@IV"+V"@5l#IS~$@T%d%AKb*"=t+6.+"+5!,kq-U4-A7 .F0CF08O0#07#v2.#O2*=/?3J`{5\[u6T\ :KU:LU;R]<@7->7@ ?,@@!b@CU0A@TSDS^iG^@GW`GHI\H6.~K7#W*LA.RMKU OB8O!6O#-T9%CTJTWHR$YNW[T\[AI]0[^C_`4>I`3cL^:c>i@m&mLC6m0&=o5!=oɻuzvLCp+xNXwz4?V{LCZ{ }LW~AL0JKUT];!*sV6#K# 6"%J`(%97L>^>R:&-CF06IdVdVK6%t+#LB7>R>6./%͘-#c>N#a @7/%-#C".٤*5"*5;JT㶧U`㶧T\F!I)zAKoݫ9/.T\9#NX|dW`EIT\w}MWbz:&,#k\[9$6uS.$d8$ BVz6-x@*CǙS#xS> ?S U`[@5V9]f5?`I6xR]U%%!3*3IS5.GQ"._DB5@G7#9* 6A@TMW2*5TLT\HR>RA+!b+>%b"5:&MWMU#" T> S@{ 6?%baE9I\7#?La5!uGAJ@TiA7 ,/"I\Z#.# P$I\#%=4%?@%.D?&KU+AUL,-,N.I\K /#53MW#n:I\@:7#e;H^;Lav>, ?.A#UDIR~D$-F+I@*KT@jLJTILT\M>gP5P>5P*5P8$XpQ+|Q3+!T".*UISzV,W.R[M,=\NXyQ\I>\r~]B8r~]__Ȑ`+ g%gKU_h][_hU`~j=^~j>RAl"m*p4)s#.{6I{FP},"=QvCT9ј"6U`6++!6+"3R?SI>+с. IAՓA7/ɝ537@-ڙ:CQv+AUB@@8$2;I\r):JTc!#0&5@7'3DT\0%7#ϥ-,v\];ק@T;קI\ATjMDJT@W`熯R]-#!LȁS^߷X2A6u="#KU¿.#9ĿU`ـ+"@52CM(8$ $# @6^8$JGQ2D9#6"|LV!,5!JTLZ?O :0MWO"A7nU`[SI\fU`fLaCw7@AIA9N`?S!)&+!"=I#5o:^c?>T@TD( ,ML^3++!FJ`~+7\@6\"'.t0I61IS4`r5,I>z"6"* A!KUk#-?+$9#&I\s'KUs'MW1)@U;*@T++.9+U`K,-f.K0"'@2I\526A36"78A7=.=6"k=6->@%@C.@6@CEA%7DKI>_F+uHMBH7!6JON>5(Q+[Q.4U"V6"WR]:W6?\XA77Y@T˗YLalY3Rh@Ki3+=jI\=jk>3)n5oU`:q@6hrU`6Mt6A`u#Yw>w*5w6A}KAH~?SbsNX_`6+8$AJJT##E@TS99]S9MWΈ6+%PɋU^Y.GQϏ"|:C֐LC ߙBVv7R!N"6+5ӛۛ.9-.s6.|3|-# 3+-7L7@ ۦ e+4u\[q6AA6"F%K0_p.7]'T\>AUL^.͝*K͝]` +6.6.3* W`z4>W`ST]7#0/8]Cm,zT]3T\@T1THBfR,fD:6+"`7,eGQk@7LajziW`CLH^I\R]wJT?*[lܘIRU&#:.9)LaYAUR]DzA9O@6J 7@7T\I!D," A#ABKxHTM][&C.='MLZ(6"?V)W`?V)Lax)6.{*!5m7*A.+6"z/0.1La3AU4.~45DLF5=^F5W`c6-#|758La=<.!>-C ??H@3>@I>ZBHRZB5@-C#GAT II>oL!M9]іNO@K7YU6"B0WU`LW0&Z3;Z>RZW`L[7R^9c.90dUa=fT\ff?IffT\5f+ |h7#h8i4))i%jU`ek.9+ |]HLa,.AJ7,f@7%HI6TAܐ,0Lap%쯒[mm-#;@6T]LVlNBVIR W`+4~~#Ӛ6.R@Ljī@Ti=Q?K?Kf#L^J>c_,^`5,BdU`F@Kbz+@+=8$ 9%|4>c  |AJ656 TL,"-r>r6".,7@%?`La?S-9])u%LISL_`.y+C [5><7"M:u3NXT@T8JU}D^` ~U`~@T~4`>5%-#Z6LAJ5({  G1@5NA.6"v@7KbW`Ι6JgKU7W`=.=9 6"6",",S^,La@7Y$".%,"%T\%S^O%/%R8&8Ckf(4?ȝ(.,R_+CL_E.*O/I\,22@5`25*4+ Z5+4O77"7@K8>4W96#O=.`>B/@U`f@Laf@Ua8E/%8E7#8E6"&KI\leK.dL-#dL6"JfP-1Q".~QLCAQR]BS_V5!: WGQW.$W*3X.X#\7#\5!I]/%\_I\'`,"6Ba@T7a.$bb-b8$0c%cI>c%8cLadR]of6A;fLDrMj,l4`_dm) n9]W-pR]%p+7 ~qLAr+RjsS^(tw zVB{-CAi|Jc}7#C~][RoU`Ro5@#HR#I\^6.+ 66"7L1,"+6ّ+!bVP| @5KmR]t:& DNXp+HLaCM.%@U` TKJܦT^Ũ^[x?4E7@T1ʱT\ϲT\.$η,"4>#IS-#b)T(4 ?6!Ua!DXLVFR]DBf 5@ W`6 90/76+96I\ 6"AMBpD9/#2?6]O8/* D#94`~+g}.zLa,&3+7B"J#VV-V!c5I@L^5a7,.~@+0TITH.H-#_O+vTL")#+M<I@ErA7.@5 +! AKS I@Y +! UCK6*BC)IT\LIS&N8$tLA"3@+g!!"B".%:%6AO&IS\'@6s_(KAD)NXD)_^zo)@+V-\I28c22JT35!95]J06CME0:9]91:B>">r?6?A6+B\[B"EB"EB8NCD8$vEA8F+ G3 ^G=I`H5YhI-KK5!`NT]NAUQ wQ5!wuR+}RI\}R\SS%T:CU@T1UB8Y7#[W`3_4`L`C.f+4;iLai!>lC>l8:#m6?'o!po@"~o~oIS5qMW8s6"_bt?S88u?55|>Re+>*^3,6?cԐI\ U^%#A"= BVT\/%Lam#) ,6.u.$:C#%zI\CM".86IR@J1د@J|?Ig9]%ú-#%ú)LaT\?SU`*5؟GR(6.bϮ+W`U@5*%~I\6\+4,Ry^?6JTL*GKV` B] NXt 8.6 86M+tj-a\H@6I|7--)Z-- \ W` #JSe<$7#3'G\0'J4Z ()U@b)4IIf*HR&F+W`_+>,R],@T,=?-#B-B9B-]9!}/TLe1+ w24La7B]H8IS9A:*5{p=6"v=@TWd>/X>I?AC B B* 9EU`0H,#YJ@6J+!K.L@TMN6"}PI\RA7SLa)U^"^-^*"u_JS_W`_@5R_aA87a#aNakb"xbH-?c_c5/NdKU) g.$g@+k9.iRrq+!rI\W!sMW4t"Ztmv:yW`zJ@{6+r6I6"` KUkAUR]u+4KAUŻCn]`(+>_T\ʀ4`᷎DfH=W`ޗ!VLI\J\IJT!+7AAI@IS?/_$.*C.cLaBGQT>%jy.{>+3"W`C?S⋶6.\U``ҷ.,?5ʻ@5m6?DR] 0:P^I\%F/T>Va V@Tm6?!HRIT/=Q][FIS+!VKUa%y?ST\=Q+"S^«6A3b#R)6^;DBV.&>5?+&W`"AK@6U`E> S^!AU75|B6I6AGW`y9% *63  LW*57A"n73$W`I\(?`v0&A7!-C!5@!T\"*3%La2(T\6-LUm36^556"5;.kWIPK>@%>C;?%?J^?C9?B6AA6BCB@57C.mC+mCEW`ELawH8.EH/:4;IIRP- P(RT\7SD9T^@TLacV.$@W.X,#Y.T2Z-#ZI\k3[,~[6+H-_7"V_/%[_.pa#pa,pa"pa:&a&8b%$keUa*fg rgTAI\j%jUaGjIR^kW`l m#n=QnI\Wo@Iݣo/s4>sAJ*t>5t9%-u# jwLa@zR]|z{@5|"4Mz}+Md* ؂n7+y#IRXF86"E+푐4`ܽ7#.#="QUI\[[U`3?S4-sdW`"6";;ˬUawiU^B]9]\ϲNa\ϲLV8-$"b:LĹ[RvR]3 ,hNAUQ9.3I@~T\@6)6."> 6"R7#35>5/;K]8$QLaQ@TQ:^a6@1?7Ě.Ě.66+6*66J`%*"\@KU8$ C$&KV&-#".5_#>l5MWR]=,Բ>+6?t>J` AU?J/IRȽ@TAC . @5X7L_-#5!E6?A6XO* XO,"=I{7+b @K*KUB-W`e6.66+!=:C=>#>8$>*6>6?>W`@MB8A,8A"AW`B4 XCH@qDCqD,5bDUajDIRK!K, LI\4MTLgMISAN8 Q+ ~S^TJTT.T7#QV@TV!7,XT\YR]NX/^@T;U`;U`GQ@a6" aN-fg#h+kAIYmT\Ym?SKn+]oISpq?S}q@5Cs`T's*y6"z?SzA.{5,.|@7i }5!J`/U`@݆"HLWC6?5mbU`?UՒiU`7#]`Ø0CvK]pA6ÛU:+ŤT\bMX3VK_0TF:CףKU\+!#>KIB]20A98Ua石5!@@7ȷUa) #6ȾȾ"+̌:D+4"6f+p_9L AT2U FR].Ua.CO,"hI\hLa_\6.NX=QW?SHR,+ZxVA75)6_`y?^J$TL-88?=+6#q?#MWcI\5=39]GQnUC T] A.E GQ " .".1K/%WLC5#+̩@6:#I\Ra$&~'0(@7,=Q,`m..1][ť2AUen3AUVM4LaM4!5M4*5z77Le7La:6?:@Th:I\pB;.w>T^,BIT+BLa*D!*D* >E6.HKLaBL"NIRb:N+!@PƬPIRS%[TNXXU8BLV-#LV5!LV+W+@WH@rY ][L7x[7\#YaL`a+7?ib@TdcKU+e33f%hAU" j/AlkLa:/nU`n@Lto@5oXM p4`nvMW(wWaz[|"7[},?u}0&?u}*5P ~A7@5>>3a`6.pUa9ąW`Y"W`0ok͍HRRLa  8s 6*,"A@-#G=^$̜6.n͜SHG"%П3)@T9?^b"wLLVttI\^@5PרKUcv=S4`>6-@A7LFLT2jH"HIxLMU`gM"5M,MN#7fPUa&XGQJY.JZAUN[5,^.6aAJ~c%7d6?BdNXCe-#Lf+4ah$i?6 j5!rk@IRm-o=ubv?S Ow4`x5kx5?}." ~La ~JT~T\LaI\T\2A.M.X-N*[:&h|!,cw@Ifw3׍A.׍8.¿9]:ې]H>-5LJT&+4A6"-#e+7И\[UDNN#J-7L>6-II>`AJU`=^ƃ+NآH?uc*6%iLa"5!=˯7#6-U`x<,AITLtJTִR]Z.$I\P,HQ6.꡿La!A856La56MW]/%%LaK]c!*D9_?Sg`I\+#KU]H8#LA8"}.:CP7#q!+ ,E)GQvHTz~"8$'H^a80a"=- MW-`2+TLaI7"D6.S=T" #,@>%@A6}'+a+i-A.7 ^@j BA R]$rJT$rs"+tK?#6++7W`-7LU#ATh$HR\L%7#&U`8(L@h(6J,)S^*{+*6+LaC/LCJ/IRf/b/, /@Uz+4.~5_7KU7.o;-p;K9*g<4Iu @H?@=G`C@6D7CE^ES^ϿI,MM0&N7+MQ?4RI\h6SI\ٴS5>TV_$UWH@X-#XXMWXXKUġX>RH[)[.%D^@I;o^XaU`XaI\}HbA7}Hb@7xc5!dJ@dT\1 i@2iW`kAUиl6-ܝpW`p"n{t\] xHRx@5AyJAy+4Vz,zMWz@T}KU}MW{!~U`\[`ƞH^ƞHT4NX3)m6"1HKU8$*H.A.{XLauU`20&?Z5!Q7LU`4`^EA63@Tw|#9B9D-5->JT5)NWB86Z+8V_F[8$ GQGQlϫAJ.000&1\[ĸ#/%#f.VA\6?g7#j4`S6.JTY?S=KU@6"4`@Ty!C@J4I.%@)>ӡGQ#=^_9]]?Tv0& ,%5,L75 -N4`pGQu6AQ?7cF+JNX]"6?+!JT" 6?\ L6 [R A8x/ "q 9I\W`E+!#)-$g+@tR]%5W`D#3(K] )#DG)y)%y)IT*LC*.K,T]w,%F1AU5J1#5J1:0(2@I(2@L15I\V6D7.$?+8r8W`r86ID9+:7@:R](>I\8@JT@W`~+CUaiD7,rG+JH#pI,kO=QaPS^dR@T5RZ]S+ UW`sU.$ZXA6tTY5,Y-#Z+ <]@+`I\`-?9e89YjXjUa^m][m@6!pU`EpAUPsW`u+-u5*%vLaLv#Qvvy6-[zz. z8|.3}K] ~٘@5I߁"0&dJTJ8xJ" 7#* XdI>4-H-80$aߏC"?)P^[,cAULg@T?T\?MW& SSJTH4?S2G.$呟=^R.͠6"o0Uaͤ5?6+#,5aKU36ALoj,54LaQKUzصITA.7/%>ٽ6">ٽ6-־AJ־TL =^/%%6I24\I4% D>Rw6IG+kM4`dITX"}T\]+!]%N,IS+.$>+-#6568$)+JTB0#5C>RK).6.+! KUE? ?R I\2".""pA6,FJ`dJI\w@T`4@+4W` ,"I#5K)-%+#'h+=G/+Q.La.7#.6?'0@600@T53J`53Laͤ3Laͤ3AU54 Q56.6"s9#b =#+_A6"|B5>kEI\TG7LTG?`I6"I+LN>R/RR@TS!ULawV,gZ#gZ0&Z?4ؖ^MW+^@K_IR`+qa4`U2h.xj.9BjLaj-!NkGQSk"_n@K0o+ wK]$wMWyS^Wy.%zU`z@L%|6+&<|CWo}A7 6-?4u:^ ڄG\ ڄ_` -TA CLa@+?,7Ƙ6A_ЛK` 1-#1)T\ +m+@"."!T>lO3*8Ѱ-a>IÚ?6o6A=QRMTLj6"IAJThW`oS^R,'La\?`\R],#z%C;.9-OJ@|@@L3-B[@T[5?La-#!{5,|3KUj@71"8~^6.VsC98La,MAJy7#y-#JL^8-M,"J8)66#O+@*AJA=GP ". t 408E*+{@)N-nKUnISn?S. T+X.XX%AU!6I@$TK%"c'NX*'.(0&>*J`+8Jp,"sI.̙.TL/AU/I\0I\2-H4@5 ;JSTG;U^;7@="C*>C.*>:&S?K@A7@вB.$|C,F4?GJTVHT\J"IJTI6"9L+!M73MC7S.-T@LxV:&WJ^WUa7Z4 ~U[5!\[:C`aaTL΄b-e.eg6@[xjplA8/m#tn+ >SoI\\oITbtv-#v/%%vLa%vAUpw4 _x6+Kx@T3'z9%3'z"azATK|LUD9&JTāU`ILAtMUj+ y ..8Bj?7܍`_V+O3O-߲+w,;,oCW\.$^gJTŒAUK7+k"6.Z9.59%gR $`3duL^ Q/%۳+d@T?SƩ%JT7I\8Jo7.7q{MUKMWKT\x?62-CYޱ"ޱ,[ W`5`@Tg/%QH6",MIS3%UK]*GQas.as#:.Z#+.?59] 5>YoS^hLa8$3^U*E@7pB]p9],0&;R]_+aH@5aH*5< 6*!?`"@Le#7#Q%8/q%.A%,>%@6&&A7$'7#'/%(@5u6*R*LaI+NX},6.|/+3@63+"7C+9T\K:AJz;+<8#"?.@S^MB6.MD83E4 1GHDL+HJGQJ3J-#M,"ZP2Q0&"AVI\SW7#WX,"WX6"sYISsY_`YAS"Z@TZLa}[6\W`-u\"bI>"jfӥi@LrmDm)Yqp/7p+u5@]z"H]|3AJZ>RTނ+`@,g3-#o?S67#wP+v,ċJT؎@IoA. =T\+ X@5!6+S430*5|/:y*6XA6!],"W`>Ѡ3W1 ӧ+7f6f,AJT>j>4]{!*BVXWG\b4 Z/:R6"pW`BLa4`+)7,"C>A7>+!W`EBVHMCWLa)AK:V.$MW)%_?6B]$ +I\#Z#2p#7B^.3M_`@6"9 -h$MDI".%6"A6OLa;U`/%drc"J`6+#* kz+z#z50&U`0I+ .m+y- 7#, , :&r /%D6?P+ Wi6U`@L|6>̓W`:"&T\m)La%+T]2Z-La.)I//.V2La3@T3*5^7+4 <6^\=/:߻>@K&IG@+CJW`=MA.ؑM"!NSRRDXTG]@T@Ts.U4kV@TqCX6^w]=^_A7`T\S`Oa*6Oa-Ae6"f+!cl#m9]tm"hp@T;qJ`[q,qTL2q@I&rT^rAUrG\\u6I\u_`\u\[xJT%z,")}5!)}7#F^~@5hNAMH4 GQ B] KU!*S@{W`]HR_-#o0&)>Rj6+Ť6"JA c=^\[ Y6-hK]!"36?ϡUIϡ\I{U4W-ŮHR)"Rb,"bOT7+3߸%#UaҾ+!0<6"0<?_U4iL77A.86"I\+!,"',A 0&UaQ@KiAGQJ"v_@T@SJq3>7LaY+'@K04>RyA8)#{%WG\F!35!@5v.pT\7+/: 6.66+9>3+7o5!֍KUj@5W?H?W@KR9," @HR # C.0&I%N =Qe.ځW`%V/%9RI\F>DLR@T6""U`0b(MWb)@6j)"K*,C*IS,E-W`9-,"9-0&-A7.,a/LC/7A1L7;4*5R4AI6>+I76Ag7,"N:IRV;5@V;?S<LIRL6";OD9O;lP-?P-#/kULa/kUU`[$A\La!_ISj_z_LA`S^-_bL7hcLW=d?`q/+!EJT,*5I7#QQ-"@IAB9A9D?ULU5-9XBV%Z(:CT:C7tA7to!tӡI\X@5Ƨ*"5U^?]["aJ`">5PI\|G"_*6J.[+I KL^&Ӹ&Ӹ*5(-#н6"@I! 3=p8"_L6bBL]#:LWc?`';La8,9I\Y-u1c~7L4)~AUV-#\6?Gk5!rHR_"T\0-#@66_/KUZ3)U`f?`fJTj:C]x5+qAUqP,nTQA7z>RLaU`fLWNb[3+7/+7,u 0&u Uw09]6~)L+.F=3ώ7Lm+U^6"*4 nI>T]"#'MWߖ)-*-.#-v-A7{.W`E0,"1U`|14`16-yt5>R؃:U^:7,M;JTxAS^ُB?IBJ`B)CLaE E* FLa5J+J+ aK6"jL6AYM5!fN@6R`_ÜSLaSbaTXB|FUT^VYGQ[Ua"\6+]I\`MW'eH^'eHRkk6-èk6-nkMW+Rm#5pT]_rW`t]t su=3+u7@+uLa}w6")yy* |MUq|?6>}!"a~:.BNKUkISe.PMD^?S^@T^JTp BV+A.UQJTR5:.Z!?I\KA>38'@KD@Lt+ K6"¨@A+z!5īC:ɬ"b KV~+!K@J@LfB]@KKr3A W`B@L+!JTIU|m.V=4?SJ?Izx[Rt-,KTv-!)MWLaLa Bn!I.7]#W`E#"ج$H^A'?(G\*+*+c-VNh0:Y2AU2>2A7P3.n5*57L^"b8A.]9":%<w==89D?@KI?+I?#?+!aiA7#\OD?S)SF@6ŷK+ LI\,LCMI\MISqNP7#QAUQ."*YVIR2WLU@XOX%.O\$]F^?`$_/%!_KUKh. |hT9j5!xlUaÿm,=pHRA%u@Tv-7Xv*,{Laҙ}JT2~-2~@6>*.#K6.\N@L*I\G + H +%@5%A.pAINXc -AR]!Е"!Е?6:S^u՚)s6.La :+4l+l" Dl@5Dl-AUw5+[s6<%A6vLavGQI-᫵MW᫵La_`baLU@*0@+0)?\JnP?`BV6$I\>I%*l6b-#DC[AJ@53~y8$y5@/#IRt0&S%tR]Y6)@L =*w/:4_UAU/C.3=@Y@KL+aA7+BA.ݓDG]DE@TfJI\fJ_`fKHR6K#+KAUKR]N."OIS(P?SlP@6SP*QMWR"JS#& T,"#U-VT\~VJX>,JXNXI\YC9Z@LC[LVG]-#_IRIc*"!d5!sh3\ii`Ukj+Dm%2n,5zo@Lp5#qU`sTv_Lv/%x@J]x#{7L%p} ~J4AJ+!ZdU`Zd5@#+-#'!*5ţJT^7@jC.ǏAS'*6Ly$D>}.$* Ķ"T]@6A7U`z-̡85!j"U7+#өH^+ )4.bζ@5 )50&5-Xɽ6߽. LVF<>F<"#6"ʚ>n6.6R^R]vJTҷAIkR]!Uad GQ U`,#/%&@5'-(UI@*8:.=^:j0"0>0?6(5DZ8AT 8NX;T\u<AAAW`mGG+FI4>:J)JtK* QK@50LW 9LMWPKUU"FW8$ X%]Y%]]KA __lO`-ha# e>Gg.6khuUi>+Yjkkzl:n0&ERnR]|bn@^|pyy\[zN"z8$K7zU`{@Ty{%{?H{?`NA7K]Z4`Á.">6?Lh|ULl9%;f#ĕNa~,)M.kߚI\C8Sٛ5,J*"ЦHR@67B8?SxHT٫6.,"#M," +ĮLa%%JTLae-&U`9%$WCT]LCSμ)""q55>"65>H6kBV* 9]&0&&-T'T^SU^YLa(H5Om?I4 -6pC'H^Ι N@T!,"'-'I6H'*3J85@5p+ e=QK5,"]@LtKUZ-#U:9D+>r @62MW>G_._ La-#Ƣ.C 4` +!A.#N,"e5o+!o6"o5!C#?[Rd6. K]6>.4KU`T5?T\*|!La"^@}$5"@(@6~,=Q-9%l0,̈́0@T131@I"1S^z2868CUa:IT ;% ;=I<+!ο=)DBMωFGQoKoK@5lLMXaO=3%S9&(U.UVW`^X^X6"+rZR]\H@8\^]T\]"d_5"$`7/9`8$QbI\c>RcG\-YeJTf/%j4>6l?S6lHSEl=*_m"7Kp53pq7LqH?[xR]*y{+{".m~_`.m~NX~U^UH^FFI\ +„@T/%pLU U^`AU2tTL"G+ 9&&MWISş6?"KU"K]"=^"5@Tţ*5.0*NCG@U_9.$9"cK6.R CM-I\5!".5 -$:K}MD%03nI\6y5",5!T^@^U40:x "9 +4K )f T]= "Ua:(>O9%/(@6u-".iCX6Ab@5!W`n+!bTHL=I ,!b:&W`)+!p.p/% .!LC! y"K]%76'_'.,0+8+#,1P.500:x2MWR46?d86?o9";$=:&F?AAUXC+!(F6?KFGM,DQ.$eR+aT6"3T[NX3T[=QK]%]L`jb7Lb%')d8.f!*g@TgLa%j.>lT][l4 olAUztp.Czq*"ݩr+Bu6.Pu+v6?vUay7+|5|8$|#=~#6o.ITL.+ QHR+!"NWNX8\WJTM7Ď=IT\]CT\@TKUɕ7#ɕ@+8A7iI\X6.ʜ6,TUaby&GQ="Q[hM6"(ѥ@+wLT La?cldU^gCC.6ZK@-aN9UR0& HRٳM:CH][H8AtZ+4{M/>RZ6.\[C^C:I\4UI\s.$7%z.`)5.FI\;-(5@MG\>LaC.:C I=`x.#1fLawj+wj@55KU4oW4`{C.uJ4`]Y".Y#Ǐ#T?JMGQ-MW|@5|-#f/h+!"NXR*56I 8$u>J 8  A61W =3 7L4`{A6pI\"Ua@V-#aT6"!6?` UaQZ"t#U`t#I\1+&.6(JT(7A*`T,A.s-\/?S&5,>,"?_LACA,"A?`=CI\F6AIgH:&IaaMLa xM#6͉OQ@TmUEVIR&yXX5=kYY\Jj\A7|]LT]@Jt7^.^W`GU_0&7a+.mc*5׵cie+4ieSeI%g/:C=j5gj6IRjA7kT\kU`!nn@Tt0q+ qJ`qs+ t4)ET{!4~0&~7+z @5v%-6.-6"-5!-7#-/%p0&p#5.eώL^:\["ɐ6?J"53'@Ju"T]S^ژ3+?`)@I\#,2e+6ş%9MW9LV9?S xw0T\BL^wLBIA.If5!If-#[LaDJ` KU I\8++! Uaf1.{# 9]o5!4`JT=TL]GQzP_`yAJ-Hf#,5T\qxU`-#9L~"+!L_X,B`"8sU`"&,>26Io@L.%-jISj5"jv7#)@5G/%ۈ-# +4I\:&V݆C*07#+!3D8X@67-?Tq#"iJT2)* S%+ 9]KU6La'IS<,:-#vU`6"U 8$a U7 /#m ?7 @+08u6"iD@+i4 @LL*3 0& N+"ST] I\%W H?!>R#N$La~$%0$.)KU2)I\ *K]+@T,6#T0,6^0.1T^,1C^2@K!3GQ4,4-#?5t5JS7$-75!=+=7+@U`FC"E,"-HKUDUH@KoKBVKQ8$ASAIU@5@UI\ U^`iW6W%|VX.$Y+[7#]W`5]8$aT3fD9n+@X2o+ ݓoJTTp.Tp-#p@^2r!t6"t+8u+PevҠ|AJCU劃A@ @5=^@=J@==@,.4B8:C2,5-#K3= W`>@+sC7D#&.RpA77#UAU7#Yݚ6.+44JT]LT)B#+)B@6+/%YС-#ѿT^Q?5(W`斯U`Y0J`L`vv.6m߸NXAŹ3!+9$.%N0&k,BLad#d"q.QAKY,>MW0.>(_:&@  U4.p)h>67@W`x6-Uak7,jJ`*&N-A.-6x" 4I LC0805!":6"I\AU?S7_`La7JTM.$06AGQvR]C9MWP.H:CɜISLa6._v@T=Z I\-; I\ 7A5jIAU77"= -#\,\+RrMCH6.?SP-7wQ?=>RJW`}%+}%-#AJÀ!.#>z$>z$JTLm%K]'#(-*"m3@L:6R]d;KU==Q=7L >,"@Ua>9B.B5!ZD,"3E# GKjGA.DHMWzuJB6ZMLT].NR]pPKES:&U6?WMU9]&kU.UUKUGWX@\~\7@]JT"`"Fa6"d5!d,"fI\ og+i@*p>Rq,5u]r=I]r@K&t)'fz.$hmzD`{@5w{9L{D9 8}DL~C."~6AQ8Ahw5hw.hw8$La@-ǃA8هK]$׈5 W+!ZT^_6A_U^_MW@TЎ]H25#gKUg@JW`Y,ґ8$r_LW`%=7LI\X!.8#32U^p\-La)/La@J-C8{-#H^.2 I\/`UT6. 9?HR`@T`U`I-C'Ŭ,.J`X-#IS5@{","o.$ٺA6OdC9m%0][NTS@L{@LY7+ 5*7#6"H5!,La9F+ں6"&Q%KUJ`\+ La9]^!#VuS^VuJT=NX2L7vMW,U^,@K>G%@6l@5g+]U^ - ZT\Я:C_ @L9 99 )# ?I# AKþKUe0/#q@6 6"QT\\y+ / U`p"DX".9%b&?IM'U`[(@A+@L+Cka-..+...00G 2)F2"z2,D 5Ua@7T]|9@5xj:8$;"=%=?#@7#CW`+D6?P:C\SK]~UT\ǕX#yY@TYEZ9%LUZATBZTL%\#\T]z]/%Z]B8^T^-^7LBhbad7#oe8"g6"g:&h7#j^Ij%j@5pn,mo-6P%pC`*p%xq?T+w6-w+7mz?Smz@T1{G\.S}E~AUc~oJT+~W`.$!F/%MXPy6Az.0IR}8#KU 7,R4>a=Ior"C9L,*!6?BA.OW"w#"3]-#|KU9@Im(:CѧC¨@L4#-4 b7#S^H+!`6"T?`u8$°LaD5!6.-\[ĶN7#̲4`~zq5).}AKT\,rA7*"Z.%o5!>KUATA.c,>* " %7MW<+/%(xr* x*6O+AK\[-$bT]$9L?`T].$/@T%Qd+ S6.u5!N`f?HgLagISlC46+OKUS^78"LaMT\LaWR]k#W*6" 6" #.W`-3o7AA68A7g. -#*!T]g("B]p#6-~i%+%AU(&Η&7#M'KU'J`R(JTF5-F5z6#);$,>A8BA.BLUB)gC.9CU`C6?EDC7GNH3I8$M-yN:6FQ9.dSwS*5kW6?+W++W.(X+4(YC(Y-(YnK[#z[Laz[5@k^_"[a?4~b~b-#3e+g!h/%h6"ati._j@6j4 kAIPmU^pNXpT\VGq*6#r,"cr@6[rLesJT[t76\t*5-zzW{U``}!W`I@^o^U55@jR]7@i@5a֌I\:&y6+-U`5?S@LAUݛ!*`0;%IS+46^ZK]N)DTL6"`93NXHHTγJTe*w+ AUߺ@KX$AU)> +":C3ET]cT^A>R+ GQ_`KA@8T\'.'5-r3-#EZ PT*" iAJ"#DI\}@T.ѡH5I\ص?`5!.{?U5.\6I+n* gDXfHT]L . * 6+/MW8J3 R@KA9LH*4`Y .X-#8V`6HRNd C%$-#z{%7,@%?6tQ*LCw,6.-*"0.R0U`(2.(27#?f2"237La:;H^~>I\>?0A=^i*BS^i*B][I+A6.@6?=I#W` ƙ6"s* -I6iNXJ`FR]B3++!3ըW`(G\ 4`(x+7#La5G\ģNXz˻MWz˻KU ,"K#,.Laխ.9LTLo{;hJT,YGQWAJt5!U-d570]+!],#+u4 @%k6"v7,b3>S>6f?Sm!;;Co^I\$C"*"";aUj7+I\8$3p.GQ-7CI\>W`TB7}++9 9 $ū + K) T]A.MU!>"RNXL.jCc##Z@7xH^YS^8 >+I#!"!@T$(%_`v%6?4(HRN)%,"/U`ZD/T^X0AK2187HRd(8?`08+4=y>@Lsp?6"$A qBAU)CLCoHAK eJ@L`M-#|MK?NGQVNL7R"-SB7}W+3$4WT\1ZL^l]6"]WN_I\d'a"+Rc\[Qd"EdHe7,e@KeUIe5+YfI\[hh6?sl=m:p#cop6?Hqe=t7@+Bv?UawKU@{5!n+5&KVV%Y7.\+.KD0&94 FM"+6?D5@5`M|La6ݎ6.1T^@TTm@K끖LaÖ3U`Dg@7t9+o IS{c2B76.CܣU^5u=Q*6r9L)2AWȨ+ һһ)ީ.#=^1@KDŽ+?H0&q0&,"@Kp4@pH@p+@D=Iǵ.,?KU"u@T?SHR*GT]R]R]f5f>]+5%T,K]JAU^GI\YKBI,+$8 [.6*6T\wg-b7Ğ@7?6xbJ`S5V6?޶#>R5#7A+u(UIx,"WG=GAQ.HRCFU`I-#W`6+M.Q^`SU`\/T\6.}<*6J#`t La =IV H?7p,pU_H^0HTx.SLa%3)kK3+ g-#9%\6-BB67B;FDXơ-! K@=!6?mB#.9 #$W`Ь&+s&@L&7#4*TU!+6?k,)-B8)-A7n.>/4>J0u07#j 2HR12I>go2]^+ 5,5746W`67+7@577I\9*C6?wDT\oDDLD#FF+!FFISsH4J9]7L/:_Q,tVLTBWU`ޫW87=HX#,Z_`B^?SP`I\cdKUhThuhBVoDi,oDiA7An#+nn0&p6-q6qH?q6"s9u@7 wKUx?S?y5A+Jz7#\T{CU*."%@T=X][P@5Ո"e#6-2ٌ#2ٌ>6\@IF~W`XďGQ*.HR?GM}K@L5ۇ@K>p6@ H^=ˠHTU ģ?J.R&D9N@T!E+452+":C"W`"6?Q? fD@_`@$+z?6z.@TIS+-#(/%J7-Vo^_ 3-#۲6?/\[V AJ+!,V6+o6?o7LW` ?GnR]KAI6DL* '6"m-"A7SKU@L6,9@7?S:C%Z+#ӠHR "/%Z94`HRA79]{6.6A.٬-A3IH^BN/%BN-#X)"5@J4`0\?55]s8$^ w @=v 6-0,Ne0s?6"i-5AU`?S-#G#7L)LV[8#d0&d .$MR"JT|$XW%R]''7#B'0(J)5@J)I\ +-+h+-+IU,!32%6HQD7D7+!79]C8J9-#\:Y.>7#v>@7v?JT X@,GvA?SBU`B7L3C+bMCHTbMCR]ZOC"̒C@LD?`kwF5!JG%CGGDLFK hK?S1KW`KK?`L7#P@KSjQ6"mS+mS6"ASU`AS6ITT=QTTT\TTS^W.%ZH[+[U`!\HR[K^DL[K^NXC^6AQ_@U_*5|/b|/b+hfh##iW`j,"mk6?gll@*}l.6VpMDEs6.sQv+!QvvU#mxmyT\>{"'6^q-#MA.M50AU0ISbI\N*6Lă:C(B6wY6IdHR/@^f* 9A7N@73ϐ.3ϐ8 h@+{FAqA6`h V``*@6.$5z&>RA " 5J-QWaI^4IUǨ0&PK]嵯5ն4 ն,"a* {,ǻ@K|vN?TڼLWN@L%JT^x:@Th6+%9@TJ:U?62T\Q"yA9'903=M6T^UW`5=6!,s)6?,V>RB>R`/@TD+p6+B6"+490tH*5Ź7# #_ " C.+T\oLao6@^JTp6A5mU^bw=^$HT:1*5O@+/:!HRY&&&@Lf'I\0)DXF-6+R.5,/0@50@666-+ۭ7A6Y9@L\5=H^R>_`?@Id@#>d@,>C`_CK]C\C+!CG"0KUajKLLV2NMN@TKP?HT=Qu"YT\ZW`RZLU_[@5]9%Y^R]f`.|b4 Ke>Rh,j3>kJTplUImn5!p-CLx_`|8CF@}.P~Ѭ*5w, La JTU`5!Z:Laʋ*3T+Z./׎"@,UIUݓ\[ǰ/:@7oP>Q~QG]D?ShKA.¡=Iڣ6I.}5#+AD+Laa#P?T\`ZI>ղ* !زIR]p)4`KUJ/#@z>,:^J`4IU#+$R]W`]"ŁA66A5_`ĈW`=>RDL`I\W.=4|GW`6"x7+O.#߅6I:-#CaN9=i7LJUN6.w7#|JT!AUu6"u#_)J[+÷U`AKGQpHTsKU."6?H?ba,.:6C-7#8La8J`67X?S%N-L@5o Ua} .$a+"fK5v6]%HReA6e@64AU-+ AI"KUC#+%W(4`0+6".U_/@T/06?T10AJS05@S0ISA0JT93)P6IR7@=+@W`N@ @+!ZQC4 +D-FG]oHU`%EMIS-QMA7pcM6IpcM=IM?6OI\%PI\lPT3*[7#t\MW:]'ve.'ve+eawghgI\hgISEqh.- iDLi.$bj,<$k=^AlK9 r@Ls4`sLaAu7+v6@v7@LzGQ^ ~U6-?U"^:P9% H53#.=^7+j7C"$3ݐ45?/*3荓LWTϓ@TS>R[9LU IScW`=x_LUL7BUCA7>W`@9,!jLV$)҉"7s>55+3n0&LCq7DO4>}ι_L-6AyR]pJB8:AJ?6I5XJT+9WLJI\J8$]!*:=Q5,ALa/*c#8A_C΅)n-#Q[@J2.9Z,N","`%FLar&T]KB*5=^NK]45,MWJT -+#6?KSGQvHTPW`/%~/%e5@;LA# +! %UI*7Lu5I\G#-G# ß&6.' @'?S(@6(@7B{.@K*3*384JT4KU 55!>6#k6GQ7!78"e8T>9La<-Z(=W`D? B#;!DA7TDJTDGS@G>TH"7 JIS`K$#K4? M6?N@IQ؏R#5S.$ S=QSH@U@5W9[+_=Q`I\MbT]eIRffITj1gHR=hU`j l+ xm@5'oVAo>3o* &p?`qW`/s+sDLht.6(u7+MvAUޮz,CzA7m{.@|LC|.(LVj5*"@5A1) @T֢>R[JTҊ-9L@K>y##ז"iK]MDIS'AUw?=䊡5 AB]9]+]I\baEW`5W`R@5J+E@T:+н,#y-BB]/H=s1@5u4>dHRdMW1-4 5IR]NX#GQ26?4+!|@7u+!pzJ`"R]ӖNXx?S2 W`,Il % GQȧ  ?6 #6"+<>t:*6t:.6BGQ|0"#+!%4)Җ'6IF)(9Td-,J3^4C9]5#]5, 5#,9-x9IU'9N-'9A7*;B=:?IR*C.#CH?>E6?٭E"FS^JW`K+M:N5~)O#jzOU`PJ`8QXW^R";T3YCR}I\ 4)계>RTL 80&+5#%4AIv_`đJTM/%MA@UIᱚ6Ag#5MWIƝ>RiJTi@T.9;L8$bƬ-`?SJT66?@7C7K]I\+!"Lae>R;GQzCT^,"*KWN-ӬU^T\MWL^eI.$"V-#4IRJT"1@KDLƫ+ 7+%W`LTKUKU/"C8?SX>GW`9KM6-AUKUW`AKUB]?IHW`r%-#FI\;La(7# X56"x,K/ڴ 6- ,6R@K^X,5X*5U/%wA^_#'$NX%.$&?S&T\(U`k|())6A)JTje+6",@6,KVI-5,u/?60LaZ4.$536@6L7#7%9@59^_E@=La<>LC>.>7+-x@!@A.A]^1FCoD.VE@5]F7#%H6-#K,#K0&#K.LSH3$N+ dN%awNU`pN`]P3bSL^2bT\cU#6oVW`_4[5@q[La[I\\B8_]La_]MWu]I\&b"fLaS*g&.8gI>#k`kT] lT]qlA7 q?`s7#u,vA6Fw6.Px,"ryT]G|_^\~#!3R5R5"![ր#w?SAą+ PW`N@5Ȅ+!Q\[8ˏG[,"ӉW`>^=06"М:C,g.vAI6I6+I\La0]VK+Lac-c$ǭW`2T\l\[Jq6.h$7J`Ne·SG%`V`D7#3A.CC6"C'W`kAUI\[,%Z-#HT:C>GLU`A./6A7K#°">* a`HRI7L*3+#hJ`T\ k0&U`_AJwKU.^IBW`LaGQ5@Tj/MWI\)QNTLVL|AU@LUa.$H@2 6"##56-@7AK~+yW` =I2"$6"Ѱ&A.#*`.LCA.@KP.BVP.I\&/JA007#00-#0@7B27#37+R4,67@L/8NX'G:<:4>=BVo>*"We?,5We?7+}A#AD=GADH^UBD6A,E+7JFgGуGT\0LB6M"M9%N3R5%TFTVJTZI.NZAD [${\U`\/%]A]5]]J&^MWi^IS^J`^5@1_S`6AbbTLcI\cJTc4`cU` cI\gL^*h?G-{iA81kJTbn'nGQvpp4 q6?jIs-Zs>nPuHT4v.$#{6?am{K]}M_}+!e+e5!e36"ڲ5-#*3K5![Ua(";ŔS^m%"ӗ8U` AK0&nJT]L7T]2.$]+ ̨4 #ޜ-LaqnJTU۬6"b&GQ"u~6..U`W<4)I\ŧIS۟#6R][q@TqJTU)H^NX5-#;BVjqIS[AIS[AC"*5,ݐGQݐLa~/0&L@6L^S^G]˓+5>W`=!)H?%C*J>"][$I@"7Lyj8$?S7L@@TIR3)tLa9/%6?=H?6r  4> 9]6 " HRt -t ,9%W`FA7,bD:Z A?B7G6"s H^1"/bQ$KUbQ$IS %,"s'I\y-@7.6.\%0%n01@TdA1>RSK3>R4>=;5437@J5<5<EW%W8$)WNXZ-Y@TZ7#<[4>G\,]@72O_La`D aI\gaB6Te_^e@5f#i6.j-rk_`n1m@7Im.mJTm7LT-s9]|6" }@T}La0& T]+S_46+tT\<NX<JTF%eސ5!L@+ư+!NUKVc+!ݟ4=U^=I*)â7Ru+ cT]a!]\SU:K]x@T?`FhfnZ=^в@LS+7xLaGISA-#86+"JLW#3B7|.-) ,< ]g6.LWS^;!56AALaA@Ti,I\U^'LCM#AiJToR]6,s.ϒW`tAJ1[^TZ?`h+^+ZM6+?SAJT],; ./ Ua 0&ױ .9B/RaK]I@yCjG\v+ @(?6ԥ?6K 8$%+k %@6(@5ǁ)T]})/:f+=Qf+AU--?8/.1  2K]|30BU4K4'Y:ISg:4<)4<"=8A2=6.2=BI\C7+GC?`C6+ER]TF.,bGH+>WKV`j N6+$P6?;iPQ.Q%}2SsVH^f+VU`DXāX5AN5Z+5*#\@6F,]D9]=^M^B]_-Q`+!Db6"*bS^"ve?SO_f?Sf7@XEhI>PjimW`?o?JoJTrq)|Rx5@̹zKU̹zNX}@K?SGQ\NX]„]„.I A6!0&/%]6+C?S@6LWϕ$, *"#їTAf)#ex#Ǣ6IҢ MW.$`U/%`U6"1=*ҁLVU+-DW`dA.mŲ+ V=I#ֺIS@7LCӿKUӿB]H4>.6?@I.|K]MW@UC9߳>5'!JTN8@6kb/7 T\ .9%18$55U47@L6.7@%X=GaJT6U`7,0]KUɺ:C9]x+MW63AUe@6._`U`NXLCU6""n6+d5 -d5 Ck +WsX!)+ISKUda-#da"m6"/R]>RH.+WJT6@(KU(H^Bx ,Y!R]!MWr"@U<"GQ#U`$I\+&6I+&S_P&3'>*F0U?@4JT@4@TV5+66,7@T0r8GQ;)A=%BBLV| C~D-#EU`xG6.bIJ][tLI\{LM!*ŞOI\#JR@TRO4S10XISZU^k["!\.{],B^5U^\`aI\fad6?e=Hf@7$|gAU$|gKUXg0&Xg>h,7diGQq.jN[k8pl6?mN"/p9.r8"\r+ Is4ttA@tufv.q?wBV@x6AyrzUa|{"|LCs}@T|~][B+6.\:D->RA#TY6WR]č-$?La5+v4I##T\RY+ Ϛ6.#6" 6,Ѥ6.=U#LCH ,L@5?ANU`G]Y2.#-ҭG]JxT\6AJS^#+"J7L[][6g>R4#۸GQS^=^]?La]?Na$+46,-f%%* K]j= \#&B7fgKU)A6*L@*KUs4`La9]4I,5Y4`q6Ar* qV?S."AJl*uJTl@I݉8/3IRA6@5s`^;^`-¤MW4AU4MW4@TiJ7RAUl>6x=I?S KBī + 7#q 6"-`?6\5"q8$VHR).)5)8, N9TS^3$3_%D'5!3j':&t(W`(b)_`r;*B]*"]+T]T,5-\[1i3>R'5G5Na<59+!Ux97+;AU<5;<CDI%hEE"I"3IL@OIR Q"7RITV4`mW+ X5r=ZT\r=ZNX2[@7ldbC:fZc5@e,"f-Cf:CgR]h+h0& uj4>gn@Tn.to,u+!x6?5yI\,|H3T-|LV=}La0΀,+!P,6@U`όC"_+ -R]k ".<%RB!˖J`MB: A75+5MUMW=-AISAW`}?S0ATmT?9K7+\UaǵKDISI>:Cѻ?T,-c=S^#RpCRp8$gI\.$BD9/#W8?Jo6"2."KU.U A6A/%50," D*#C7"(ABh"MI\94``K]JT(#{v%.IS7*6]?R]66+!e6"fG]f=^Ck/%D:lGQm+7}{+LTIAKPhalanx-XXII/eco.phalanx0000644000175000001440000051625010314125617014566 0ustar sombrausers [ECO C99 Ruy Lopez: closed, Chigorin, 12...c5d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 cd cd [ECO C98 Ruy Lopez: closed, Chigorin, Rauzer attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Nc6 dc [ECO C98 Ruy Lopez: closed, Chigorin, 12...Nc6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Nc6 [ECO C97 Ruy Lopez: closed, Chigorin, Yugoslav system] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 N1d2 Bd7 Nf1 f8e8 Ne3 g6 [ECO C97 Ruy Lopez: closed, Chigorin defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Qc7 [ECO C96 Ruy Lopez: closed, Keres defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Nd7 [ECO C96 Ruy Lopez: closed, Borisenko defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 d4 Nc6 [ECO C96 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c5 [ECO C96 Ruy Lopez: closed, Rossolimo defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 c6 d4 Qc7 [ECO C96 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Na5 Bc2 [ECO C95 Ruy Lopez: closed, Breyer, Simagin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 Nh4 [ECO C95 Ruy Lopez: closed, Breyer, Gligori\'c variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 N1d2 Bb7 Bc2 c5 [ECO C95 Ruy Lopez: closed, Breyer, Borisenko variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 N8d7 [ECO C95 Ruy Lopez: closed, Breyer, 10.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 d4 [ECO C94 Ruy Lopez: closed, Breyer defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nb8 [ECO C93 Ruy Lopez: closed, Smyslov defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 h6 [ECO C92 Ruy Lopez: closed, Flohr-Zaitsev system ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Bb7 [ECO C92 Ruy Lopez: closed, Ragozin-Petrosian variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Nd7 [ECO C92 Ruy Lopez: closed, Kholmov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 Be6 [ECO C92 Ruy Lopez: closed, Keres variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 a5 [ECO C92 Ruy Lopez: closed, 9.h3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 h3 [ECO C91 Ruy Lopez: closed, Bogolyubov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d4 Bg4 [ECO C91 Ruy Lopez: closed, 9.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d4 [ECO C90 Ruy Lopez: closed, Suetin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 a3 [ECO C90 Ruy Lopez: closed, Lutikov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 Bc2 [ECO C90 Ruy Lopez: closed, Pilnik variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 d3 [ECO C90 Ruy Lopez: closed ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d6 [ECO C89 Ruy Lopez: Marshall, Herman Steiner variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed e4 [ECO C89 Ruy Lopez: Marshall, main line, Spassky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 Bd6 Re1 Qh4 g3 Qh3 Be3 Bg4 Qd3 a8e8 Nd2 Re6 a4 Qh5 [ECO C89 Ruy Lopez: Marshall, main line, 14...Qh3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 Bd6 Re1 Qh4 g3 Qh3 [ECO C89 Ruy Lopez: Marshall, main line, 12.d2d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 d4 [ECO C89 Ruy Lopez: Marshall, Kevitz variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 Bd5 cd d4 Bd6 Re3 [ECO C89 Ruy Lopez: Marshall counter-attack, 11...c6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 ed Nd5 Ne5 Ne5 Re5 c6 [ECO C89 Ruy Lopez: Marshall counter-attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 d5 [ECO C?? Ruy Lopez: closed, 8.c3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o c3 [ECO C88 Ruy Lopez: closed, anti-Marshall 8.a4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o a4 [ECO C88 Ruy Lopez: closed, 7...O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 o-o [ECO C88 Ruy Lopez: Trajkovi\'c counter-attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 Bb7 [ECO C88 Ruy Lopez: Noah's ark trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 d4 Nd4 Nd4 ed Qd4 c5 [ECO C88 Ruy Lopez: closed, 7...d6, 8.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 d4 [ECO C88 Ruy Lopez: closed, Balla variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Qc7 a4 [ECO C88 Ruy Lopez: closed, Leonhardt variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 d6 c3 Na5 Bc2 c5 d4 Qc7 h3 Nc6 d5 Nb8 N1d2 g5 [ECO C88 Ruy Lopez: closed] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 b5 Bb3 [ECO C79 Ruy Lopez: Kecskem\'et variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 d6 c3 o-o d4 Bd7 N1d2 Be8 [ECO C87 Ruy Lopez: closed, Averbach variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Re1 d6 [ECO C86 Ruy Lopez: Worrall attack, solid line] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 b5 Bb3 d6 [ECO C86 Ruy Lopez: Worrall attack, sharp line] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 b5 Bb3 o-o [ECO C86 Ruy Lopez: Worrall attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Qe2 [ECO C85 Ruy Lopez: Exchange variation doubly deferred ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 Bc6 [ECO C84 Ruy Lopez: closed, Basque gambit ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 d4 ed e5 Ne4 c3 [ECO C84 Ruy Lopez: closed, centre attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 d4 [ECO C84 Ruy Lopez: closed defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Be7 [ECO C83 Ruy Lopez: open, Breslau variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 o-o Nd4 Ne5 [ECO C83 Ruy Lopez: open, Tarrasch trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 o-o Nd4 Qd7 Ne6 fe Re4 [ECO C83 Ruy Lopez: open, 9...Be7, 10.Re1] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 Re1 [ECO C83 Ruy Lopez: open, Malkin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 N1d2 o-o Qe2 [ECO C83 Ruy Lopez: open, classical defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Be7 [ECO C82 Ruy Lopez: open, Motzko attack, Nenarokov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 Qd3 Ne7 [ECO C82 Ruy Lopez: open, Motzko attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 Qd3 [ECO C82 Ruy Lopez: open, Dilworth variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 N1d2 o-o Bc2 Nf2 [ECO C82 Ruy Lopez: open, St. Petersburg variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 N1d2 [ECO C82 Ruy Lopez: open, Italian variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Bc5 [ECO C82 Ruy Lopez: open, Berlin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 Nc5 [ECO C82 Ruy Lopez: open, 9.c3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 c3 [ECO C81 Ruy Lopez: open, Howell attack, Adam variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 Be7 c4 [ECO C81 Ruy Lopez: open, Howell attack, Ekstr\"om variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 Be7 Rd1 o-o c4 bc Bc4 Qd7 [ECO C81 Ruy Lopez: open, Howell attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 Qe2 [ECO C80 Ruy Lopez: open, Bernstein variation, Karpov gambit] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 N1d2 Nc5 c3 d4 Ng5 [ECO C80 Ruy Lopez: open, Bernstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 N1d2 [ECO C80 Ruy Lopez: open, 8...Be6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Be6 [ECO C80 Ruy Lopez: open, Zukertort variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de Ne7 [ECO C80 Ruy Lopez: open, 8.de] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 de [ECO C80 Ruy Lopez: open, Harksen gambit] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 c4 [ECO C80 Ruy Lopez: open, Berger variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 a4 Nd4 Nd4 ed Nc3 [ECO C80 Ruy Lopez: open, Schlechter defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 d5 a4 Nd4 [ECO C80 Ruy Lopez: open, 7.Bb3] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Bb3 [ECO C80 Ruy Lopez: open, Richter variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 d5 [ECO C80 Ruy Lopez: open, Friess attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 Ne5 [ECO C80 Ruy Lopez: open, 6.d4 b5] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 b5 [ECO C80 Ruy Lopez: open, Riga variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 ed [ECO C80 Ruy Lopez: open, 6.d4] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 d4 [ECO C80 Ruy Lopez: open, Knorre variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 Nc3 [ECO C80 Ruy Lopez: open, Tartakower variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 Qe2 [ECO C80 Ruy Lopez: open defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Ne4 [ECO C79 Ruy Lopez: Steinitz defence deferred, Boleslavsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Ne4 Re1 f5 de d5 Nc3 [ECO C79 Ruy Lopez: Steinitz defence deferred, Rubinstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Ne4 [ECO C79 Ruy Lopez: Steinitz defence deferred, Lipnitsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 Bc6 bc d4 Bg4 [ECO C79 Ruy Lopez: Steinitz defence deferred ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o d6 [ECO C78 Ruy Lopez: M\"oller defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o Bc5 [ECO C78 Ruy Lopez: Archangelsk variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 Bb7 [ECO C78 Ruy Lopez: Rabinovich variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 d6 Ng5 d5 ed Nd4 Re1 Bc5 Re5 Kf8 [ECO C78 Ruy Lopez: ...b5 & ...d6] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 d6 [ECO C78 Ruy Lopez: Wing attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o b5 Bb3 Be7 a4 [ECO C78 Ruy Lopez: 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 o-o [ECO C77 Ruy Lopez: Morphy defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 d3 d6 c4 [ECO C77 Ruy Lopez: Anderssen variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 d3 [ECO C77 Ruy Lopez: Wormald attack, Gr\"unfeld variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Qe2 b5 Bb3 Be7 d4 d6 c3 Bg4 [ECO C77 Ruy Lopez: Wormald attack] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Qe2 [ECO C77 Ruy Lopez: Treybal variation ] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Bc6 [ECO C77 Ruy Lopez: four knights variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 Nc3 [ECO C77 Ruy Lopez: Morphy defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 [ECO C76 Ruy Lopez: modern Steinitz defence, fianchetto variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 g6 [ECO C75 Ruy Lopez: modern Steinitz defence, Rubinstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 N8e7 [ECO C75 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 [ECO C74 Ruy Lopez: Siesta, Kopayev variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 f5 ef Bf5 o-o [ECO C74 Ruy Lopez: modern Steinitz defence, siesta variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 f5 [ECO C74 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 [ECO C73 Ruy Lopez: modern Steinitz defence, Alapin variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc d4 f6 [ECO C73 Ruy Lopez: modern Steinitz defence, Richter variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc d4 [ECO C?? Ruy Lopez: modern Steinitz defence, exchange variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bc6 bc [ECO C72 Ruy Lopez: modern Steinitz defence, 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 o-o [ECO C71 Ruy Lopez: modern Steinitz defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c4 [ECO C71 Ruy Lopez: modern Steinitz defence, Three knights variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Nc3 [ECO C71 Ruy Lopez: Noah's ark trap] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 d4 b5 Bb3 Nd4 Nd4 ed Qd4 c5 [ECO C71 Ruy Lopez: modern Steinitz defence] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 [ECO C70 Ruy Lopez: Schliemann defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 f5 [ECO C70 Ruy Lopez: Taimanov variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 Bb3 Na5 [ECO C70 Ruy Lopez: Graz variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 Bb3 Bc5 [ECO C70 Ruy Lopez: Caro variation] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 b5 [ECO C70 Ruy Lopez: Classical defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Bc5 [ECO C70 Ruy Lopez: Alapin's defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Bb4 [ECO C70 Ruy Lopez: Bird's defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nd4 [ECO C70 Ruy Lopez: Cozio defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 N8e7 [ECO C70 Ruy Lopez: fianchetto defence deferred] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 g6 [ECO C70 Ruy Lopez] e4 e5 Nf3 Nc6 Bb5 a6 Ba4 [ECO C69 Ruy Lopez: exchange, Bronstein variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o Qd6 [ECO C69 Ruy Lopez: exchange, Gligori\'c variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o f6 [ECO C69 Ruy Lopez: exchange variation, Alapin gambit] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o Bg4 h3 h5 [ECO C69 Ruy Lopez: exchange variation, 5.O-O] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc o-o [ECO C68 Ruy Lopez: exchange, Romanovsky variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc Nc3 f6 d3 [ECO C68 Ruy Lopez: exchange, Keres variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc Nc3 [ECO C68 Ruy Lopez: exchange, Alekhine variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 dc d4 ed Qd4 Qd4 Nd4 Bd7 [ECO C68 Ruy Lopez: exchange variation] e4 e5 Nf3 Nc6 Bb5 a6 Bc6 [ECO C67 Ruy Lopez: Berlin defence, Rosenthal variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 a6 [ECO C67 Ruy Lopez: Berlin defence, Minckwitz variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 de [ECO C67 Ruy Lopez: Berlin defence, Trifunovi\'c variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 d5 [ECO C67 Ruy Lopez: Berlin defence, Cordel variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nf5 [ECO C67 Ruy Lopez: Berlin defence, Winawer attack] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 Nd4 [ECO C67 Ruy Lopez: Berlin defence, Pillsbury variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 b3 [ECO C67 Ruy Lopez: Berlin defence, Zukertort variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 c4 [ECO C67 Ruy Lopez: Berlin defence, Rio de Janeiro variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 Qe2 Nd6 Bc6 bc de Nb7 Nc3 o-o Re1 Nc5 Nd4 Ne6 Be3 Nd4 Bd4 c5 [ECO C67 Ruy Lopez: open Berlin defence, 5...Be7] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Be7 [ECO C67 Ruy Lopez: open Berlin defence, Showalter variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Nd6 Ba4 [ECO C67 Ruy Lopez: open Berlin defence, l'Hermet variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 d4 Nd6 de [ECO C67 Ruy Lopez: Berlin defence, open variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Ne4 [ECO C66 Ruy Lopez: closed Berlin defence, Chigorin variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Nd7 [ECO C66 Ruy Lopez: closed Berlin defence, Wolf variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 ed [ECO C66 Ruy Lopez: closed Berlin defence, Showalter variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Bc6 [ECO C66 Ruy Lopez: closed Berlin defence, Bernstein variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Bg5 [ECO C66 Ruy Lopez: Berlin defence, Tarrasch trap] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 Re1 o-o [ECO C66 Ruy Lopez: Berlin defence, hedgehog variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 d4 Bd7 Nc3 Be7 [ECO C66 Ruy Lopez: Berlin defence, 4.O-O, d6] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o d6 [ECO C65 Ruy Lopez: Berlin defence, Beverwijk variation] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o Bc5 [ECO C65 Ruy Lopez: Berlin defence, 4.O-O] e4 e5 Nf3 Nc6 Bb5 Nf6 o-o [ECO C65 Ruy Lopez: Berlin defence, Kaufmann variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Bc5 Be3 [ECO C65 Ruy Lopez: Berlin defence, Duras variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 d6 c4 [ECO C65 Ruy Lopez: Berlin defence, Anderssen variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 d6 Bc6 [ECO C65 Ruy Lopez: Berlin defence, Mortimer trap] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Ne7 Ne5 c6 [ECO C65 Ruy Lopez: Berlin defence, Mortimer variation] e4 e5 Nf3 Nc6 Bb5 Nf6 d3 Ne7 [ECO C65 Ruy Lopez: Berlin defence, Nyholm attack] e4 e5 Nf3 Nc6 Bb5 Nf6 d4 ed o-o [ECO C65 Ruy Lopez: Berlin defence] e4 e5 Nf3 Nc6 Bb5 Nf6 [ECO C64 Ruy Lopez: Cordel gambit] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 f5 [ECO C64 Ruy Lopez: classical defence, Boden variation] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Qe7 [ECO C64 Ruy Lopez: classical defence, Charousek variation] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Bb6 [ECO C64 Ruy Lopez: classical defence, Benelux variation ] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 Nf6 o-o o-o d4 Bb6 [ECO C64 Ruy Lopez: classical defence, 4.c3] e4 e5 Nf3 Nc6 Bb5 Bc5 c3 [ECO C64 Ruy Lopez: classical defence, Zaitsev variation] e4 e5 Nf3 Nc6 Bb5 Bc5 o-o Nd4 b4 [ECO C64 Ruy Lopez: classical defence] e4 e5 Nf3 Nc6 Bb5 Bc5 [ECO C63 Ruy Lopez: Schliemann defence, Berger variation] e4 e5 Nf3 Nc6 Bb5 f5 Nc3 [ECO C63 Ruy Lopez: Schliemann defence] e4 e5 Nf3 Nc6 Bb5 f5 [ECO C62 Ruy Lopez: old Steinitz defence, semi-Duras variation] e4 e5 Nf3 Nc6 Bb5 d6 d4 Bd7 c4 [ECO C62 Ruy Lopez: old Steinitz defence, Nimzovich attack] e4 e5 Nf3 Nc6 Bb5 d6 d4 Bd7 Nc3 Nf6 Bc6 [ECO C62 Ruy Lopez: old Steinitz defence] e4 e5 Nf3 Nc6 Bb5 d6 [ECO C61 Ruy Lopez: Bird's defence, Paulsen variation] e4 e5 Nf3 Nc6 Bb5 Nd4 Nd4 ed o-o Ne7 [ECO C61 Ruy Lopez: Bird's defence] e4 e5 Nf3 Nc6 Bb5 Nd4 [ECO C60 Ruy Lopez: Cozio defence, Paulsen variation] e4 e5 Nf3 Nc6 Bb5 N8e7 Nc3 g6 [ECO C60 Ruy Lopez: Cozio defence] e4 e5 Nf3 Nc6 Bb5 N8e7 [ECO C60 Ruy Lopez: fianchetto defence] e4 e5 Nf3 Nc6 Bb5 g6 [ECO C60 Ruy Lopez: Alapin's defence] e4 e5 Nf3 Nc6 Bb5 Bb4 [ECO C60 Ruy Lopez: Brentano defence] e4 e5 Nf3 Nc6 Bb5 g5 [ECO C60 Ruy Lopez: Vinogradov variation] e4 e5 Nf3 Nc6 Bb5 Qe7 [ECO C60 Ruy Lopez: Lucena defence] e4 e5 Nf3 Nc6 Bb5 Be7 [ECO C60 Ruy Lopez: Pollock defence] e4 e5 Nf3 Nc6 Bb5 Na5 [ECO C60 Ruy Lopez: Nuremberg variation] e4 e5 Nf3 Nc6 Bb5 f6 [ECO C60 Ruy Lopez ] e4 e5 Nf3 Nc6 Bb5 [ECO C59 two knights defence: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nh3 [ECO C59 two knights defence: G\"oring variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nf3 e4 Ne5 Qc7 [ECO C59 two knights defence: Knorre variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 Nf3 e4 Ne5 Bd6 d4 Qc7 Bd2 [ECO C59 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 h6 [ECO C?? Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Be2 [ECO C58 two knights defence: Blackburne variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 cb [ECO C58 two knights defence: Colman variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 Rb8 [ECO C58 two knights defence: Paoli variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 Qc7 Bd3 [ECO C58 two knights defence: Bogolyubov variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 c6 dc bc Qf3 [ECO C58 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 Bb5 [ECO C58 two knights defence: Mar\'oczy variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 h6 Nf3 e4 Qe2 Nc4 dc Be7 [ECO C58 two knights defence: Yankovich variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 h6 Nf3 e4 Qe2 Nc4 dc Bc5 N3d2 [ECO C58 two knights defence: Kieseritsky variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 d3 [ECO C?? two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Na5 [ECO C57 two knights defence: Fegatello attack, Polerio defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 Kf7 Qf3 Ke6 Nc3 Ne7 [ECO C57 two knights defence: Fegatello attack, Leonhardt variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 Kf7 Qf3 Ke6 Nc3 Nb4 Qe4 c6 a3 Na6 d4 Nc7 [ECO C57 two knights defence: Fegatello attack] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 Nf7 [ECO C57 two knights defence: Pincus variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 d4 Bb4 [ECO C57 two knights defence: Lolli attack] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd5 d4 [ECO C57 two knights defence: Fritz, Gruber variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd4 c3 b5 Bf1 Nd5 Ne4 [ECO C57 two knights defence: Fritz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed Nd4 [ECO C57 two knights defence: Ulvestad variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 ed b5 [ECO C57 two knights defence: Wilkes Barre variation] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 Bc5 [ECO C57 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 [ECO C56 two knights defence: Canal variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 Re1 d5 Nc3 [ECO C56 two knights defence: Yurdansky attack] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 Re1 d5 Bd5 Qd5 Nc3 Qa5 Ne4 Be6 Bg5 h6 Bh4 g5 Nf6 Ke7 b4 [ECO C56 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Ne4 [ECO C55 two knights: Max Lange attack, Krause variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 Ng4 c3 [ECO C55 two knights: Max Lange attack, Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 Ng4 [ECO C55 two knights: Max Lange attack, Schlechter variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 fg [ECO C55 two knights: Max Lange attack, Loman defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 g6 [ECO C55 two knights: Max Lange attack, Rubinstein variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 N3e4 Bf8 [ECO C55 two knights: Max Lange attack, Marshall variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 N3e4 [ECO C55 two knights: Max Lange attack, Berger variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 d5 ef dc Re1 Be6 Ng5 Qd5 Nc3 Qf5 g4 Qg6 N3e4 Bb6 f4 o-o-o [ECO C55 two knights: Max Lange attack] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o Bc5 e5 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed o-o [ECO C55 Two knights defence, Perreux variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed Ng5 [ECO C55 Two knights defence, Keidanz variation] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 ed e5 d5 Bb5 Ne4 Nd4 Bc5 Nc6 Bf2 Kf1 Qh4 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 d4 [ECO C55 Two knights defence ] e4 e5 Nf3 Nc6 Bc4 Nf6 d3 [ECO C55 Giuoco piano: Holzhausen attack] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 d6 f4 Qe7 fe de Nc3 [ECO C55 Giuoco piano] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 d6 [ECO C55 Giuoco piano: Rosentreter variation] e4 e5 Nf3 Nc6 Bc4 Nf6 o-o Bc5 d4 Bd4 Nd4 Nd4 Bg5 h6 Bh4 g5 f4 [ECO C55 Two knights defence] e4 e5 Nf3 Nc6 Bc4 Nf6 [ECO C54 Giuoco Piano: M\"oller, bayonet attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 Bf6 Re1 Ne7 Re4 d6 g4 [ECO C54 Giuoco Piano: Therkatz-Herzog variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 Bf6 Re1 Ne7 Re4 d6 Bg5 Bg5 Ng5 o-o Nh7 [ECO C54 Giuoco Piano: M\"oller attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 d5 [ECO C54 Giuoco Piano: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 bc d5 Ba3 [ECO C54 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Bc3 [ECO C54 Giuoco Piano: Aitken variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 bc Bc3 Ba3 [ECO C54 Giuoco Piano: Bernstein variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 bc Bc3 Qb3 d5 [ECO C54 Giuoco Piano: Greco variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 Ne4 o-o Nc3 [ECO C54 Giuoco Piano: Greco's attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Nc3 [ECO C54 Giuoco Piano: Cracow variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Kf1 [ECO C54 Giuoco Piano: Krause variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd Bb4 Bd2 Ne4 Bb4 Nb4 Bf7 Kf7 Qb3 d5 Ne5 Kf6 f3 [ECO C54 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed cd [ECO C53 Giuoco Piano: Anderssen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 Bb5 Ne4 cd Bb4 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 [ECO C53 Giuoco Piano: Ghulam Kassim variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 ed e5 Ne4 Bd5 Nf2 Kf2 dc Kg3 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 [ECO C53 Giuoco Piano: Bird's attack] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 b4 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 [ECO C53 Giuoco Piano: Eisinger variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 d5 Nb8 d6 [ECO C53 Giuoco Piano: Mestel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 Bg5 [ECO C53 Giuoco Piano: Tarrasch variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 o-o Nf6 a4 a6 Re1 d6 h3 [ECO C53 Giuoco Piano: centre-holding variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 d4 Bb6 [ECO C53 Giuoco Piano: close variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Qe7 [ECO C53 Giuoco Piano: LaBourdonnais variation] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 d6 d4 ed cd Bb6 [ECO C53 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 c3 [ECO C52 Evans gambit: Alapin-Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bg4 [ECO C52 Evans gambit: Sanders-Alapin variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bd7 [ECO C52 Evans gambit: Lasker defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 Bb6 [ECO C52 Evans gambit: Waller attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 d4 ed Qb3 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o d6 [ECO C52 Evans gambit: Richardson attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o Nf6 d4 o-o Ne5 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 o-o [ECO C52 Evans gambit: Sokolsky variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Bg5 [ECO C52 Evans gambit: Levenfish variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Qb3 Qd7 de de o-o Bb6 Ba3 Na5 Ne5 [ECO C52 Evans gambit: Tartakower attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 Qb3 [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 d6 [ECO C52 Evans gambit: Leonhardt variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 b5 [ECO C52 Evans gambit: compromised defence, Potter variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc Qb3 Qf6 e5 Qg6 Nc3 N8e7 Rd1 [ECO C52 Evans gambit: compromised defence, Paulsen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc Qb3 Qf6 e5 Qg6 Nc3 N8e7 Ba3 [ECO C52 Evans gambit: compromised defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 d4 ed o-o dc [ECO C52 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Ba5 [ECO C51 Evans gambit: Cordel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Be7 d4 Na5 [ECO C51 Evans gambit: 5...Be7] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Be7 [ECO C51 Evans gambit: Mayet defence] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bf8 [ECO C51 Evans gambit: Stone-Ware variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bd6 [ECO C51 Evans gambit: Fraser-Mortimer attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 Qa4 Bd7 Qb3 Na5 Bf7 Kf8 Qc2 [ECO C51 Evans gambit: Fraser attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 Qa4 [ECO C51 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Bg4 [ECO C51 Evans gambit: Steinitz variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Na5 Bg5 f6 Be3 [ECO C51 Evans gambit: G\"oring attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 Na5 Bg5 [ECO C51 Evans gambit: Morphy attack] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 Nc3 [ECO C51 Evans gambit: Paulsen variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 d5 Na5 Bb2 Ne7 [ECO C51 Evans gambit: Ulvestad variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 d5 Na5 Bb2 [ECO C51 Evans gambit: normal variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 c3 Bc5 d4 ed o-o d6 cd Bb6 [ECO C51 Evans gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb4 [ECO C51 Evans counter-gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 d5 [ECO C51 Evans gambit declined, Cordel variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 Bb2 [ECO C51 Evans gambit declined, Showalter variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 a4 a6 Nc3 [ECO C51 Evans gambit declined, 5.a4] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 a4 [ECO C51 Evans gambit declined, Hicken variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 Qf3 Qe5 Qf7 Kd8 Bb2 [ECO C51 Evans gambit declined, V\'asquez variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 Bf7 Ke7 Qh5 [ECO C51 Evans gambit declined, Hirschbach variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Qg5 [ECO C51 Evans gambit declined, Pavlov variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Nh6 d4 d6 Bh6 de Bg7 Rg8 Bf7 Kf7 Be5 Qg5 Nd2 [ECO C51 Evans gambit declined, Lange variation] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bb6 b5 Na5 Ne5 Nh6 [ECO C51 Evans gambit declined] e4 e5 Nf3 Nc6 Bc4 Bc5 b4 [ECO C50 Giuoco Pianissimo: Canal variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 Nc3 d6 Bg5 [ECO C50 Giuoco Pianissimo: Italian four knights variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 Nc3 [ECO C50 Giuoco Pianissimo] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 [ECO C50 Giuoco Pianissimo: Dubois variation] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 f5 Ng5 f4 [ECO C50 Giuoco Pianissimo] e4 e5 Nf3 Nc6 Bc4 Bc5 d3 [ECO C50 Giuoco Piano: Jerome gambit] e4 e5 Nf3 Nc6 Bc4 Bc5 Bf7 [ECO C50 Giuoco Piano: four knights variation] e4 e5 Nf3 Nc6 Bc4 Bc5 Nc3 Nf6 [ECO C50 Giuoco Piano] e4 e5 Nf3 Nc6 Bc4 Bc5 [ECO C50 Hungarian defence: Tartakower variation] e4 e5 Nf3 Nc6 Bc4 Be7 d4 ed c3 Nf6 e5 Ne4 [ECO C50 Hungarian defence] e4 e5 Nf3 Nc6 Bc4 Be7 [ECO C50 Rousseau gambit] e4 e5 Nf3 Nc6 Bc4 f5 [ECO C50 Blackburne shilling gambit] e4 e5 Nf3 Nc6 Bc4 Nd4 Ne5 Qg5 Nf7 Qg2 Rf1 Qe4 Be2 Nf3 [ECO C50 King's pawn game] e4 e5 Nf3 Nc6 Bc4 [ECO C49 Four knights: Nimzovich variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o Bc6 [ECO C49 Four knights: symmetrical, Mar\'oczy system] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Ne2 [ECO C49 Four knights: symmetrical, Tarrasch variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Be6 [ECO C49 Four knights: symmetrical, Blake variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Ne7 Nh4 c6 Bc4 d5 Bb3 Qd6 [ECO C49 Four knights: symmetrical, Pillsbury variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Ne7 [ECO C49 Four knights: symmetrical, Capablanca variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Bc3 bc Qe7 Re1 Nd8 d4 Bg4 [ECO C49 Four knights: symmetrical, Metger unpin] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 Bg5 Bc3 bc Qe7 [ECO C49 Four knights: symmetrical variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 d6 [ECO C49 Four knights: Svenonius variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 bc d5 [ECO C49 Four knights: Janowski variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 bc d6 Re1 [ECO C49 Four knights] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Bc3 [ECO C49 Four knights: Alatortsev variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 Qe7 Ne2 d5 [ECO C49 Four knights: double Ruy Lopez] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o d3 [ECO C49 Four knights: Gunsberg counter-attack] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 o-o o-o Nd5 Nd5 ed e4 [ECO C49 Four knights: double Ruy Lopez] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4 [ECO C48 Four knights: Rubinstein counter-gambit, Henneberger variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 o-o [ECO C48 Four knights: Rubinstein counter-gambit, exchange variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Nd4 [ECO C48 Four knights: Rubinstein counter-gambit Mar\'oczy variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Be2 Nf3 Bf3 Bc5 o-o o-o d3 d6 Na4 Bb6 [ECO C48 Four knights: Rubinstein counter-gambit, 5.Be2] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Be2 [ECO C48 Four knights: Rubinstein counter-gambit, Bogolyubov variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 Ne5 Qe7 f4 [ECO C48 Four knights: Rubinstein counter-gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Nd4 [ECO C48 Four knights: Marshall variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 o-o o-o Ne5 Nd4 [ECO C48 Four knights: Bardeleben variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 o-o o-o Ne5 Ne5 d4 Bd6 f4 Nc6 e5 Bb4 [ECO C48 Four knights: Spanish, classical defence] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bc5 [ECO C48 Four knights: Spielmann variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 a6 Bc6 dc Ne5 Ne4 Ne4 Qd4 o-o Qe5 Re1 Be6 d4 Qd5 [ECO C48 Four knights: Ranken variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 a6 Bc6 [ECO C48 Four knights: Spanish variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 [ECO C47 Four knights: Belgrade gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 ed Nd5 [ECO C47 Four knights: Scotch, 4...exd4] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 ed [ECO C47 Four knights: Scotch, Krause variation] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 Bb4 Ne5 [ECO C47 Four knights: Scotch variation] e4 e5 Nf3 Nc6 Nc3 Nf6 d4 [ECO C46 Four knights: Gunsberg variation] e4 e5 Nf3 Nc6 Nc3 Nf6 a3 [ECO C46 Four knights: Italian variation] e4 e5 Nf3 Nc6 Nc3 Nf6 Bc4 [ECO C46 Four knights: Schultze-M\"uller gambit] e4 e5 Nf3 Nc6 Nc3 Nf6 Ne5 [ECO C46 Four knights game] e4 e5 Nf3 Nc6 Nc3 Nf6 [ECO C46 Three knights: Steinitz, Rosenthal variation] e4 e5 Nf3 Nc6 Nc3 g6 d4 ed Nd5 [ECO C46 Three knights: Steinitz variation] e4 e5 Nf3 Nc6 Nc3 g6 [ECO C46 Three knights: Winawer defence ] e4 e5 Nf3 Nc6 Nc3 f5 [ECO C46 Three knights: Schlechter variation] e4 e5 Nf3 Nc6 Nc3 Bb4 Nd5 Nf6 [ECO C46 Three knights game] e4 e5 Nf3 Nc6 Nc3 [ECO C45 Scotch: Romanishin variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Nb3 Bb4 [ECO C45 Scotch: Potter variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Nb3 [ECO C45 Scotch: Blumenfeld attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 Nb5 [ECO C45 Scotch: Meitner variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Nc2 [ECO C45 Scotch: Paulsen, Gunsberg defence] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Bb5 Nd8 [ECO C45 Scotch: Paulsen attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Bb5 [ECO C45 Scotch: Gottschall variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Qd2 d5 Nb5 Be3 Qe3 o-o Nc7 Rb8 Nd5 Nd5 ed Nb4 [ECO C45 Scotch: Blackburne attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 Be3 Qf6 c3 N8e7 Qd2 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 Bc5 [ECO C45 Scotch: Tartakower variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 Nc6 bc Nd2 [ECO C45 Scotch: Mieses variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 Nc6 bc e5 [ECO C45 Scotch: Schmidt variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nf6 [ECO C45 Scotch: Steinitz variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nc3 [ECO C45 Scotch: Fraser attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nf3 [ECO C45 Scotch: Rosenthal variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Bd2 Qe4 Be2 Kd8 o-o Bd2 Nd2 Qg6 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Bd2 [ECO C45 Scotch: Berger variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 Bb4 Nd2 Qe4 Be2 Qg2 Bf3 Qh3 Nc7 Kd8 Na8 Nf6 a3 [ECO C45 Scotch: Horwitz attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 Nb5 [ECO C45 Scotch: Pulling counter-attack] e4 e5 Nf3 Nc6 d4 ed Nd4 Qh4 [ECO C45 Scotch: Ghulam Kassim variation] e4 e5 Nf3 Nc6 d4 ed Nd4 Nd4 Qd4 d6 Bd3 [ECO C45 Scotch game] e4 e5 Nf3 Nc6 d4 ed Nd4 [ECO C44 Scotch gambit: Dubois-R\'eti defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Nf6 [ECO C44 Scotch gambit: Benima defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Be7 [ECO C44 Scotch gambit: Cochrane variation] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc bc Ba5 e5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc bc [ECO C44 Scotch gambit: Hanneken variation] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 c3 dc o-o cb Bb2 Nf6 Ng5 o-o e5 Ne5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bb4 [ECO C44 Scotch gambit: Vitzhum attack] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 Nh6 Qh5 [ECO C44 Scotch gambit: Cochrane-Shumov defence] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 Nh6 Nf7 Nf7 Bf7 Kf7 Qh5 g6 Qc5 d5 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 Ng5 [ECO C44 Scotch gambit: Anderssen counter-attack] e4 e5 Nf3 Nc6 d4 ed Bc4 Bc5 o-o d6 c3 Bg4 [ECO C44 Scotch gambit] e4 e5 Nf3 Nc6 d4 ed Bc4 [ECO C44 Scotch: G\"oring gambit, Bardeleben variation] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 Bb4 Bc4 Nf6 [ECO C44 Scotch: G\"oring gambit] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 Bb4 [ECO C44 Scotch: Sea-cadet mate] e4 e5 Nf3 Nc6 d4 ed c3 dc Nc3 d6 Bc4 Bg4 o-o Ne5 Ne5 Bd1 Bf7 Ke7 Nd5 [ECO C44 Scotch: G\"oring gambit] e4 e5 Nf3 Nc6 d4 ed c3 [ECO C44 Scotch: Relfsson gambit ] e4 e5 Nf3 Nc6 d4 ed Bb5 [ECO C44 Scotch: Cochrane variation] e4 e5 Nf3 Nc6 d4 Nd4 Ne5 Ne6 Bc4 c6 o-o Nf6 Nf7 [ECO C44 Scotch: Lolli variation] e4 e5 Nf3 Nc6 d4 Nd4 [ECO C44 Scotch opening] e4 e5 Nf3 Nc6 d4 [ECO C44 Ponziani counter-gambit, Cordel variation] e4 e5 Nf3 Nc6 c3 f5 d4 d6 d5 fe Ng5 Nb8 Ne4 Nf6 Bd3 Be7 [ECO C44 Ponziani counter-gambit, Schmidt attack] e4 e5 Nf3 Nc6 c3 f5 d4 d6 d5 [ECO C44 Ponziani counter-gambit] e4 e5 Nf3 Nc6 c3 f5 [ECO C44 Ponziani: Romanishin variation] e4 e5 Nf3 Nc6 c3 Be7 [ECO C44 Ponziani: R\'eti variation] e4 e5 Nf3 Nc6 c3 N8e7 [ECO C44 Ponziani: Fraser defence] e4 e5 Nf3 Nc6 c3 Nf6 d4 Ne4 d5 Bc5 [ECO C44 Ponziani: Jaenisch counter-attack] e4 e5 Nf3 Nc6 c3 Nf6 [ECO C44 Ponziani: Steinitz variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 f6 [ECO C44 Ponziani: Leonhardt variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 Nf6 [ECO C44 Ponziani: Caro variation] e4 e5 Nf3 Nc6 c3 d5 Qa4 Bd7 [ECO C44 Ponziani opening] e4 e5 Nf3 Nc6 c3 [ECO C44 Tayler opening] e4 e5 Nf3 Nc6 Be2 Nf6 d4 [ECO C44 Inverted Hanham] e4 e5 Nf3 Nc6 Be2 Nf6 d3 d5 N1d2 [ECO C44 Inverted Hungarian] e4 e5 Nf3 Nc6 Be2 [ECO C44 Dresden opening] e4 e5 Nf3 Nc6 c4 [ECO C44 Konstantinopolsky opening] e4 e5 Nf3 Nc6 g3 [ECO C44 Irish gambit] e4 e5 Nf3 Nc6 Ne5 Ne5 d4 [ECO C44 King's pawn game] e4 e5 Nf3 Nc6 [ECO C43 Petrov: modern attack, Trifunovi\'c variation] e4 e5 Nf3 Nf6 d4 Ne4 Bd3 d5 Ne5 Bd6 o-o o-o c4 Be5 [ECO C43 Petrov: modern attack, Symmetrical variation] e4 e5 Nf3 Nf6 d4 Ne4 [ECO C43 Petrov: Urusov gambit] e4 e5 Nf3 Nf6 d4 ed Bc4 [ECO C43 Petrov: modern attack, Bardeleben variation] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qe2 Nc5 Nd4 Nc6 [ECO C43 Petrov: modern attack, Steinitz variation] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qe2 [ECO C43 Petrov: modern attack, main line] e4 e5 Nf3 Nf6 d4 ed e5 Ne4 Qd4 [ECO C43 Petrov: modern attack] e4 e5 Nf3 Nf6 d4 [ECO C42 Petrov: Italian variation] e4 e5 Nf3 Nf6 Bc4 [ECO C42 Petrov three knights game] e4 e5 Nf3 Nf6 Nc3 [ECO C42 Petrov: Damiano variation] e4 e5 Nf3 Nf6 Ne5 Ne4 [ECO C42 Petrov: Paulsen attack] e4 e5 Nf3 Nf6 Ne5 d6 Nc4 [ECO C42 Petrov: Cochrane gambit] e4 e5 Nf3 Nf6 Ne5 d6 Nf7 [ECO C42 Petrov: classical attack, close variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 Nf6 [ECO C42 Petrov: classical attack, Marshall trap] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 o-o o-o c4 Bg4 cd f5 Re1 Bh2 [ECO C42 Petrov: classical attack, Tarrasch variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 o-o o-o c4 Bg4 [ECO C42 Petrov: classical attack, Marshall variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Bd6 [ECO C42 Petrov: classical attack, Mason variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o o-o [ECO C42 Petrov: classical attack, Jaenisch variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 c4 [ECO C42 Petrov: classical attack, Mar\'oczy variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 c4 Bh4 [ECO C42 Petrov: classical attack, Krause variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 c4 [ECO C42 Petrov: classical attack, Berger variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 Bg4 c3 f5 N1d2 [ECO C42 Petrov: classical attack, Chigorin variation] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 d5 Bd3 Be7 o-o Nc6 Re1 [ECO C42 Petrov: classical attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d4 [ECO C42 Petrov: Cozio attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 Qe2 [ECO C42 Petrov: Nimzovich attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 Nc3 [ECO C42 Petrov: Kaufmann attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 c4 [ECO C42 Petrov: French attack] e4 e5 Nf3 Nf6 Ne5 d6 Nf3 Ne4 d3 [ECO C42 Petrov's defence] e4 e5 Nf3 Nf6 [ECO C41 Philidor: Hanham, Delmar variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 c3 [ECO C41 Philidor: Hanham, Schlechter variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Nc3 [ECO C41 Philidor: Hanham, Berger variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Ng5 Nh6 f4 Be7 o-o o-o c3 d5 [ECO C41 Philidor: Hanham, Kmoch variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 Ng5 [ECO C41 Philidor: Hanham, Steiner variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 o-o Be7 de [ECO C41 Philidor: Hanham, Krause variation] e4 e5 Nf3 d6 d4 Nd7 Bc4 c6 o-o [ECO C41 Philidor: Hanham variation] e4 e5 Nf3 d6 d4 Nd7 [ECO C41 Philidor: Nimzovich, Klein variation] e4 e5 Nf3 d6 d4 Nf6 Bc4 [ECO C41 Philidor: Nimzovich, Locock variation] e4 e5 Nf3 d6 d4 Nf6 Ng5 [ECO C41 Philidor: Nimzovich, Rellstab variation] e4 e5 Nf3 d6 d4 Nf6 de Ne4 Qd5 [ECO C41 Philidor: Nimzovich, Sokolsky variation] e4 e5 Nf3 d6 d4 Nf6 de Ne4 N1d2 [ECO C41 Philidor: Nimzovich variation] e4 e5 Nf3 d6 d4 Nf6 de [ECO C41 Philidor: Nimzovich, L\"arobok variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 Bc4 Be7 Ng5 o-o Bf7 [ECO C41 Philidor: Nimzovich, Sozin variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 Bc4 Be7 o-o o-o Qe2 c6 a4 ed [ECO C41 Philidor: Improved Hanham variation] e4 e5 Nf3 d6 d4 Nf6 Nc3 N8d7 [ECO C41 Philidor: Nimzovich variation] e4 e5 Nf3 d6 d4 Nf6 [ECO C41 Philidor: Larsen variation] e4 e5 Nf3 d6 d4 ed Nd4 g6 [ECO C41 Philidor: Berger variation] e4 e5 Nf3 d6 d4 ed Nd4 Nf6 Nc3 Be7 Be2 o-o o-o c5 Nf3 Nc6 Bg5 Be6 Re1 [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed Nd4 Nf6 [ECO C41 Philidor: Paulsen attack] e4 e5 Nf3 d6 d4 ed Nd4 d5 ed [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed Nd4 [ECO C41 Philidor: Boden variation] e4 e5 Nf3 d6 d4 ed Qd4 Bd7 [ECO C41 Philidor: exchange variation] e4 e5 Nf3 d6 d4 ed [ECO C41 Philidor: Philidor counter-gambit, Zukertort variation] e4 e5 Nf3 d6 d4 f5 Nc3 [ECO C41 Philidor: Philidor counter-gambit, Berger variation] e4 e5 Nf3 d6 d4 f5 de fe Ng5 d5 e6 Bc5 Nc3 [ECO C41 Philidor: Philidor counter-gambit, del Rio attack] e4 e5 Nf3 d6 d4 f5 de fe Ng5 d5 e6 [ECO C41 Philidor: Philidor counter-gambit] e4 e5 Nf3 d6 d4 f5 [ECO C41 Philidor's defence] e4 e5 Nf3 d6 d4 [ECO C41 Philidor: L\'opez counter-gambit, Jaenisch variation] e4 e5 Nf3 d6 Bc4 f5 d4 ed Ng5 Nh6 Nh7 [ECO C41 Philidor: L\'opez counter-gambit] e4 e5 Nf3 d6 Bc4 f5 [ECO C41 Philidor: Steinitz variation] e4 e5 Nf3 d6 Bc4 Be7 c3 [ECO C41 Philidor's defence] e4 e5 Nf3 d6 [ECO C40 Latvian: corkscrew counter-gambit] e4 e5 Nf3 f5 Bc4 fe Ne5 Nf6 [ECO C40 Latvian: Polerio variation] e4 e5 Nf3 f5 Bc4 fe Ne5 d5 [ECO C40 Latvian: Behting variation] e4 e5 Nf3 f5 Bc4 fe Ne5 Qg5 Nf7 Qg2 Rf1 d5 Nh8 Nf6 [ECO C40 Latvian gambit, 3.Bc4] e4 e5 Nf3 f5 Bc4 [ECO C40 Latvian: Fraser defence] e4 e5 Nf3 f5 Ne5 Nc6 [ECO C40 Latvian: Nimzovich variation] e4 e5 Nf3 f5 Ne5 Qf6 d4 d6 Nc4 fe Ne3 [ECO C40 Latvian counter-gambit] e4 e5 Nf3 f5 [ECO C40 QP counter-gambit: Maroczy gambit] e4 e5 Nf3 d5 ed Bd6 [ECO C40 QP counter-gambit ] e4 e5 Nf3 d5 [ECO C40 Damiano's defence] e4 e5 Nf3 f6 [ECO C40 Greco defence] e4 e5 Nf3 Qf6 [ECO C40 Gunderam defence] e4 e5 Nf3 Qe7 [ECO C40 King's knight opening] e4 e5 Nf3 [ECO C39 KGA: Kieseritsky, Rice gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Bc4 d5 ed Bd6 o-o [ECO C39 KGA: Kieseritsky, Berlin defence, 6.Bc4] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Bc4 [ECO C39 KGA: Kieseritsky, Berlin defence, Rivi\`ere variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 Ng4 d5 [ECO C39 KGA: Kieseritsky, Berlin defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nf6 [ECO C39 KGA: Kieseritsky, Kolisch defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d6 [ECO C39 KGA: Kieseritsky, Neumann defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Nc6 [ECO C39 KGA: Kieseritsky, Polerio defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Be7 [ECO C39 KGA: Kieseritsky, Salvio defence, Cozio variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Qe7 d4 f5 Bc4 [ECO C39 KGA: Kieseritsky, Salvio defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Qe7 [ECO C39 KGA: Kieseritsky, Brentano defence, Caro variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 Bf4 Ne4 Nd2 [ECO C39 KGA: Kieseritsky, Brentano defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 Bf4 [ECO C39 KGA: Kieseritsky, Brentano defence, Kaplanek variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 d4 Nf6 ed Qd5 Nc3 Bb4 Kf2 [ECO C39 KGA: Kieseritsky, Brentano defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 d5 [ECO C39 KGA: Kieseritsky, long whip defence, Jaenisch variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 h5 Bc4 Rh7 d4 Bh6 Nc3 [ECO C39 KGA: Kieseritsky, long whip defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 h5 [ECO C39 KGA: Kieseritsky, Paulsen defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ne5 Bg7 [ECO C39 KGA: Allgaier, Schlechter defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 Nf6 [ECO C39 KGA: Allgaier, Urusov attack] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Bc4 d5 Bd5 Kg7 d4 [ECO C39 KGA: Allgaier, Walker attack] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Bc4 [ECO C39 KGA: Allgaier, Blackburne gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Nc3 [ECO C39 KGA: Allgaier, Cook variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 d4 d5 Bf4 de Bc4 Kg7 Be5 [ECO C39 KGA: Allgaier, Thorold variation] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 d4 [ECO C39 KGA: Allgaier, Horny defence] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 h6 Nf7 Kf7 Qg4 Nf6 Qf4 Bd6 [ECO C39 KGA: Allgaier gambit] e4 e5 f4 ef Nf3 g5 h4 g4 Ng5 [ECO C39 King's knight's gambit] e4 e5 f4 ef Nf3 g5 h4 [ECO C38 KGA: Philidor gambit, Schultz variation] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 h6 d4 d6 Qd3 [ECO C38 KGA: Greco gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 h6 d4 d6 Nc3 c6 hg hg Rh8 Bh8 Ne5 [ECO C38 KGA: Philidor gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 h4 [ECO C38 KGA: Hanstein gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 o-o [ECO C38 King's knight's gambit] e4 e5 f4 ef Nf3 g5 Bc4 Bg7 [ECO C37 KGA: Muzio gambit, Brentano defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o d5 [ECO C37 KGA: Muzio gambit, Kling and Horwitz counter-attack] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o Qe7 [ECO C37 KGA: Muzio gambit, Holloway defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Nc6 [ECO C37 KGA: Muzio gambit, From defence] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qe7 [ECO C37 KGA: double Muzio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qf6 e5 Qe5 Bf7 [ECO C37 KGA: Muzio gambit, Paulsen variation] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Qf6 e5 Qe5 d3 Bh6 Nc3 Ne7 Bd2 N8c6 a1e1 [ECO C37 KGA: Muzio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 o-o [ECO C37 KGA: Herzfeld gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nc6 [ECO C37 KGA: Cochrane gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 f3 [ECO C37 KGA: Salvio gambit, Anderssen counter-attack] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nh6 d4 d6 [ECO C37 KGA: Silberschmidt gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 Qh4 Kf1 Nh6 d4 f3 [ECO C37 KGA: Salvio gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Ne5 [ECO C37 KGA: MacDonnell gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 Nc3 [ECO C37 KGA: Ghulam Kassim gambit] e4 e5 f4 ef Nf3 g5 Bc4 g4 d4 [ECO C37 KGA: Lolli gambit, Young variation] e4 e5 f4 ef Nf3 g5 Bc4 g4 Bf7 Kf7 o-o gf Qf3 Qf6 d4 Qd4 Be3 Qf6 Nc3 [ECO C37 KGA: Lolli gambit ] e4 e5 f4 ef Nf3 g5 Bc4 g4 Bf7 [ECO C37 KGA: Blachly gambit] e4 e5 f4 ef Nf3 g5 Bc4 Nc6 [ECO C37 KGA: King's knight's gambit] e4 e5 f4 ef Nf3 g5 Bc4 [ECO C37 KGA: S\o rensen gambit] e4 e5 f4 ef Nf3 g5 d4 g4 Ne5 [ECO C37 KGA: Rosentreter gambit] e4 e5 f4 ef Nf3 g5 d4 [ECO C37 KGA: Quaade gambit] e4 e5 f4 ef Nf3 g5 Nc3 [ECO C36 KGA: Abbazia defence, Botvinnik variation] e4 e5 f4 ef Nf3 d5 ed Nf6 Bb5 c6 dc bc Bc4 Nd5 [ECO C36 KGA: Abbazia defence, modern variation] e4 e5 f4 ef Nf3 d5 ed Nf6 [ECO C36 KGA: Abbazia defence ] e4 e5 f4 ef Nf3 d5 [ECO C35 KGA: Cunningham, Euwe defence] e4 e5 f4 ef Nf3 Be7 Bc4 Nf6 [ECO C35 KGA: Cunningham, three pawns gambit] e4 e5 f4 ef Nf3 Be7 Bc4 Bh4 g3 fg o-o gh Kh1 [ECO C35 KGA: Cunningham, Bertin gambit] e4 e5 f4 ef Nf3 Be7 Bc4 Bh4 g3 [ECO C35 KGA: Cunningham defence] e4 e5 f4 ef Nf3 Be7 [ECO C34 KGA: Schallop defence] e4 e5 f4 ef Nf3 Nf6 [ECO C34 KGA: Becker defence] e4 e5 f4 ef Nf3 h6 [ECO C34 KGA: Fischer defence] e4 e5 f4 ef Nf3 d6 [ECO C34 KGA: Gianutio counter-gambit] e4 e5 f4 ef Nf3 f5 [ECO C34 KGA: Bonsch-Osmolovsky variation] e4 e5 f4 ef Nf3 Ne7 [ECO C34 King's knight's gambit] e4 e5 f4 ef Nf3 [ECO C33 KGA: bishop's gambit, Jaenisch variation] e4 e5 f4 ef Bc4 Nf6 Nc3 c6 [ECO C33 KGA: bishop's gambit, Paulsen attack] e4 e5 f4 ef Bc4 Nf6 Nc3 Bb4 e5 [ECO C33 KGA: bishop's gambit, Bogolyubov variation] e4 e5 f4 ef Bc4 Nf6 Nc3 [ECO C33 KGA: bishop's gambit, Cozio defence] e4 e5 f4 ef Bc4 Nf6 [ECO C33 KGA: bishop's gambit, Morphy variation] e4 e5 f4 ef Bc4 d5 Bd5 Nf6 [ECO C33 KGA: bishop's gambit, Anderssen variation] e4 e5 f4 ef Bc4 d5 Bd5 c6 [ECO C33 KGA: bishop's gambit, Bor\'en-Svenonius variation] e4 e5 f4 ef Bc4 d5 Bd5 Qh4 Kf1 Bd6 [ECO C33 KGA: bishop's gambit, Gifford variation] e4 e5 f4 ef Bc4 d5 Bd5 Qh4 Kf1 g5 g3 [ECO C33 KGA: bishop's gambit, Bledow variation] e4 e5 f4 ef Bc4 d5 [ECO C33 KGA: L\'opez-Gianutio counter-gambit, Hein variation] e4 e5 f4 ef Bc4 f5 Qe2 Qh4 Kd1 fe Nc3 Kd8 [ECO C33 KGA: bishop's gambit, L\'opez-Gianutio counter-gambit] e4 e5 f4 ef Bc4 f5 [ECO C33 KGA: bishop's gambit, Ruy L\'opez defence] e4 e5 f4 ef Bc4 c6 [ECO C33 KGA: bishop's gambit, Maurian defence] e4 e5 f4 ef Bc4 Nc6 [ECO C33 KGA: bishop's gambit, Steinitz defence] e4 e5 f4 ef Bc4 Ne7 [ECO C33 KGA: bishop's gambit, Bryan counter-gambit] e4 e5 f4 ef Bc4 b5 [ECO C33 KGA: bishop's gambit, Bryan counter-gambit] e4 e5 f4 ef Bc4 Qh4 Kf1 b5 [ECO C33 KGA: bishop's gambit, Boden defence] e4 e5 f4 ef Bc4 Qh4 Kf1 Nc6 [ECO C33 KGA: bishop's gambit, classical defence, Cozio attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Qf3 [ECO C33 KGA: bishop's gambit, Fraser variation] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 g3 fg Qf3 [ECO C33 KGA: bishop's gambit, McDonnell attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 g3 [ECO C33 KGA: bishop's gambit, McDonnell attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 Ne7 g3 [ECO C33 KGA: bishop's gambit, classical defence] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 Ne7 [ECO C33 KGA: bishop's gambit, Grimm attack] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 Nc3 Bg7 d4 d6 e5 [ECO C33 KGA: bishop's gambit, classical defence] e4 e5 f4 ef Bc4 Qh4 Kf1 g5 [ECO C33 KGA: bishop's gambit, Greco variation] e4 e5 f4 ef Bc4 Qh4 Kf1 Bc5 [ECO C33 KGA: bishop's gambit, Chigorin's attack] e4 e5 f4 ef Bc4 Qh4 Kf1 d5 Bd5 g5 g3 [ECO C33 KGA: bishop's gambit] e4 e5 f4 ef Bc4 [ECO C33 KGA: Lesser bishop's gambit] e4 e5 f4 ef Be2 [ECO C33 KGA: Breyer gambit] e4 e5 f4 ef Qf3 [ECO C33 KGA: Keres gambit] e4 e5 f4 ef Nc3 [ECO C33 KGA: Villemson gambit] e4 e5 f4 ef d4 [ECO C33 KGA: Carrera gambit] e4 e5 f4 ef Qe2 [ECO C33 KGA: Schurig gambit] e4 e5 f4 ef Bd3 [ECO C33 KGA: Pawn's gambit ] e4 e5 f4 ef h4 [ECO C33 KGA: Orsini gambit] e4 e5 f4 ef b3 [ECO C33 KGA: Tumbleweed gambit] e4 e5 f4 ef Kf2 [ECO C33 King's gambit accepted] e4 e5 f4 ef [ECO C32 KGD: Falkbeer, R\'eti variation] e4 e5 f4 d5 ed e4 d3 Nf6 Qe2 [ECO C32 KGD: Falkbeer, Keres variation] e4 e5 f4 d5 ed e4 d3 Nf6 Nd2 [ECO C32 KGD: Falkbeer, Charousek variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Qe2 Qd5 Nd2 f5 g4 [ECO C32 KGD: Falkbeer, Charousek gambit] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Qe2 [ECO C32 KGD: Falkbeer, Tarrasch variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf5 g4 o-o [ECO C32 KGD: Falkbeer, main line, 7...Bf5] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf5 [ECO C32 KGD: Falkbeer, Alapin variation] e4 e5 f4 d5 ed e4 d3 Nf6 de Ne4 Nf3 Bc5 Qe2 Bf2 Kd1 Qd5 N3d2 [ECO C32 KGD: Falkbeer, 5.de] e4 e5 f4 d5 ed e4 d3 Nf6 de [ECO C31 KGD: Falkbeer, Morphy gambit] e4 e5 f4 d5 ed e4 d3 Nf6 Nc3 Bb4 Bd2 e3 [ECO C31 KGD: Falkbeer, 4.d3] e4 e5 f4 d5 ed e4 d3 [ECO C31 KGD: Falkbeer, Nimzovich variation] e4 e5 f4 d5 ed e4 Bb5 [ECO C31 KGD: Falkbeer, Rubinstein variation] e4 e5 f4 d5 ed e4 Nc3 Nf6 Qe2 [ECO C31 KGD: Falkbeer, 3...e4] e4 e5 f4 d5 ed e4 [ECO C31 KGD: Nimzovich counter-gambit] e4 e5 f4 d5 ed c6 [ECO C31 KGD: Falkbeer counter-gambit] e4 e5 f4 d5 ed [ECO C31 KGD: Falkbeer, Milner-Barry variation] e4 e5 f4 d5 Nc3 [ECO C31 KGD: Falkbeer, Tartakower variation] e4 e5 f4 d5 Nf3 [ECO C31 KGD: Falkbeer counter-gambit] e4 e5 f4 d5 [ECO C30 KGD: 2...Nf6] e4 e5 f4 Nf6 [ECO C30 KGD: classical, Heath variation] e4 e5 f4 Bc5 Nf3 d6 b4 [ECO C30 KGD: classical, Soldatenkov variation] e4 e5 f4 Bc5 Nf3 d6 fe [ECO C30 KGD: classical, R\'eti variation] e4 e5 f4 Bc5 Nf3 d6 c3 f5 fe de d4 ed Bc4 [ECO C30 KGD: classical counter-gambit] e4 e5 f4 Bc5 Nf3 d6 c3 f5 [ECO C30 KGD: classical, Marshall attack] e4 e5 f4 Bc5 Nf3 d6 c3 Bg4 fe de Qa4 [ECO C30 KGD: classical, 4.c3] e4 e5 f4 Bc5 Nf3 d6 c3 [ECO C30 KGD: classical, Hanham variation] e4 e5 f4 Bc5 Nf3 d6 Nc3 Nd7 [ECO C30 KGD: classical, Svenonius variation] e4 e5 f4 Bc5 Nf3 d6 Nc3 Nf6 Bc4 Nc6 d3 Bg4 h3 Bf3 Qf3 ef [ECO C30 KGD: classical variation] e4 e5 f4 Bc5 [ECO C30 KGD: Norwalde variation, B\"ucker gambit] e4 e5 f4 Qf6 Nf3 Qf4 Nc3 Bb4 Bc4 [ECO C30 KGD: Norwalde variation] e4 e5 f4 Qf6 [ECO C30 KGD: Mafia defence] e4 e5 f4 c5 [ECO C30 KGD: Keene's defence] e4 e5 f4 Qh4 g3 Qe7 [ECO C30 King's gambit] e4 e5 f4 [ECO C29 Vienna gambit, Steinitz variation] e4 e5 Nc3 Nf6 f4 d5 d3 [ECO C29 Vienna gambit, Wurzburger trap] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 d3 Qh4 g3 Ng3 Nf3 Qh5 Nd5 [ECO C29 Vienna gambit] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 d3 [ECO C29 Vienna gambit: Heyde variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 f5 d4 [ECO C29 Vienna gambit: Bardeleben variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 f5 [ECO C29 Vienna gambit: Paulsen attack] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Qf3 [ECO C29 Vienna gambit: Breyer variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Nf3 Be7 [ECO C29 Vienna gambit: Kaufmann variation] e4 e5 Nc3 Nf6 f4 d5 fe Ne4 Nf3 Bg4 Qe2 [ECO C29 Vienna gambit] e4 e5 Nc3 Nf6 f4 d5 [ECO C?? Vienna gambit] e4 e5 Nc3 Nf6 f4 [ECO C28 Vienna game] e4 e5 Nc3 Nf6 Bc4 Nc6 [ECO C27 Boden-Kieseritsky gambit: Lichtenhein defence] e4 e5 Nc3 Nf6 Bc4 Ne4 Nf3 d5 [ECO C27 Boden-Kieseritsky gambit] e4 e5 Nc3 Nf6 Bc4 Ne4 Nf3 [ECO C27 Vienna: Alekhine variation] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Be7 Nf3 Nc6 Ne5 [ECO C27 Vienna game] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Be7 [ECO C27 Vienna: Adams' gambit] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Nc6 d4 [ECO C27 Vienna: `Frankenstein-Dracula' variation] e4 e5 Nc3 Nf6 Bc4 Ne4 Qh5 Nd6 Bb3 Nc6 Nb5 g6 Qf3 f5 Qd5 Qe7 Nc7 Kd8 Na8 b6 [ECO C27 Vienna game] e4 e5 Nc3 Nf6 Bc4 Ne4 [ECO C26 Vienna game] e4 e5 Nc3 Nf6 Bc4 [ECO C26 Vienna: Paulsen-Mieses variation] e4 e5 Nc3 Nf6 g3 [ECO C26 Vienna: Mengarini variation] e4 e5 Nc3 Nf6 a3 [ECO C26 Vienna: Falkbeer variation] e4 e5 Nc3 Nf6 [ECO C25 Vienna: Pierce gambit, Rushmere attack] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 d4 g4 Bc4 gf o-o d5 ed Bg4 dc [ECO C25 Vienna: Pierce gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 d4 [ECO C25 Vienna: Hamppe-Muzio, Dubois variation] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 Bc4 g4 o-o gf Qf3 Ne5 Qf4 Qf6 [ECO C25 Vienna: Hamppe-Muzio gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 Bc4 g4 o-o [ECO C25 Vienna: Hamppe-Allgaier gambit, Alapin variation] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 h4 g4 Ng5 d6 [ECO C25 Vienna: Hamppe-Allgaier gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 g5 h4 g4 Ng5 [ECO C25 Vienna gambit] e4 e5 Nc3 Nc6 f4 ef Nf3 [ECO C25 Vienna: Steinitz gambit, Fraser-Minckwitz variation] e4 e5 Nc3 Nc6 f4 ef d4 Qh4 Ke2 b6 [ECO C25 Vienna: Steinitz gambit, Zukertort defence] e4 e5 Nc3 Nc6 f4 ef d4 Qh4 Ke2 d5 [ECO C25 Vienna: Steinitz gambit] e4 e5 Nc3 Nc6 f4 ef d4 [ECO C25 Vienna gambit] e4 e5 Nc3 Nc6 f4 [ECO C25 Vienna: Fyfe gambit] e4 e5 Nc3 Nc6 d4 [ECO C25 Vienna: Paulsen variation] e4 e5 Nc3 Nc6 g3 [ECO C25 Vienna game, Max Lange defence] e4 e5 Nc3 Nc6 [ECO C25 Vienna: Zhuravlev countergambit] e4 e5 Nc3 Bb4 Qg4 Nf6 [ECO C25 Vienna game] e4 e5 Nc3 [ECO C24 Bishop's opening: Urusov gambit, Panov variation] e4 e5 Bc4 Nf6 d4 ed Nf3 d5 ed Bb4 c3 Qe7 [ECO C24 Bishop's opening: Urusov gambit] e4 e5 Bc4 Nf6 d4 ed Nf3 [ECO C24 Bishop's opening: Ponziani gambit] e4 e5 Bc4 Nf6 d4 [ECO C24 Bishop's opening: Greco gambit] e4 e5 Bc4 Nf6 f4 [ECO C24 Bishop's opening: Berlin defence] e4 e5 Bc4 Nf6 [ECO C23 Bishop's opening: Four pawns' gambit] e4 e5 Bc4 Bc5 b4 Bb4 f4 ef Nf3 Be7 d4 Bh4 g3 fg o-o gh Kh1 [ECO C23 Bishop's opening: MacDonnell double gambit] e4 e5 Bc4 Bc5 b4 Bb4 f4 [ECO C23 Bishop's opening: Wing gambit] e4 e5 Bc4 Bc5 b4 [ECO C23 Bishop's opening: Lewis gambit] e4 e5 Bc4 Bc5 d4 [ECO C23 Bishop's opening: del Rio variation] e4 e5 Bc4 Bc5 c3 Qg5 [ECO C23 Bishop's opening: Lewis counter-gambit] e4 e5 Bc4 Bc5 c3 d5 [ECO C23 Bishop's opening: Pratt variation] e4 e5 Bc4 Bc5 c3 Nf6 d4 ed e5 d5 ef dc4 Qh5 o-o [ECO C23 Bishop's opening: Philidor variation] e4 e5 Bc4 Bc5 c3 [ECO C23 Bishop's opening: Lopez gambit] e4 e5 Bc4 Bc5 Qe2 Nc6 c3 Nf6 f4 [ECO C23 Bishop's opening: Classical variation] e4 e5 Bc4 Bc5 [ECO C23 Bishop's opening: Calabrese counter-gambit, Jaenisch variation] e4 e5 Bc4 f5 d3 [ECO C23 Bishop's opening: Calabrese counter-gambit] e4 e5 Bc4 f5 [ECO C23 Bishop's opening: Lisitsyn variation] e4 e5 Bc4 c6 d4 d5 ed cd Bb5 Bd7 Bd7 Nd7 de Ne5 Ne2 [ECO C23 Bishop's opening: Philidor counter-attack] e4 e5 Bc4 c6 [ECO C23 Bishop's opening] e4 e5 Bc4 [ECO C22 Centre game: Hall variation] e4 e5 d4 ed Qd4 Nc6 Qc4 [ECO C22 Centre game: Kupreichik variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Nf6 Nc3 Bb4 Bd2 o-o o-o-o Re8 Bc4 d6 Nh3 [ECO C22 Centre game: Berger variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Nf6 [ECO C22 Centre game: l'Hermet variation] e4 e5 d4 ed Qd4 Nc6 Qe3 f5 [ECO C22 Centre game: Charousek variation] e4 e5 d4 ed Qd4 Nc6 Qe3 Bb4 c3 Be7 [ECO C22 Centre game: Paulsen attack] e4 e5 d4 ed Qd4 Nc6 Qe3 [ECO C22 Centre game] e4 e5 d4 ed Qd4 Nc6 [ECO C?? Centre game] e4 e5 d4 ed Qd4 [ECO C21 Danish gambit: S\o rensen defence] e4 e5 d4 ed c3 d5 [ECO C21 Danish gambit: Schlechter defence] e4 e5 d4 ed c3 dc Bc4 cb Bb2 d5 [ECO C21 Danish gambit: Collijn defence] e4 e5 d4 ed c3 dc Bc4 cb Bb2 Qe7 [ECO C21 Danish gambit] e4 e5 d4 ed c3 [ECO C21 Halasz gambit] e4 e5 d4 ed f4 [ECO C21 Centre game, Kieseritsky variation] e4 e5 d4 ed Nf3 c5 Bc4 b5 [ECO C21 Centre game] e4 e5 d4 ed [ECO C20 Alapin's opening] e4 e5 Ne2 [ECO C20 KP: Lopez opening] e4 e5 c3 [ECO C20 KP: Napoleon's opening] e4 e5 Qf3 [ECO C20 KP: Patzer opening] e4 e5 Qh5 [ECO C20 KP: King's head opening] e4 e5 f3 [ECO C20 KP: Mengarini's opening] e4 e5 a3 [ECO C20 KP: Indian opening] e4 e5 d3 [ECO C20 King's pawn game] e4 e5 [ECO B99 Sicilian: Najdorf, 7...Be7 main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 o-o-o N8d7 [ECO B98 Sicilian: Najdorf variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 [ECO B98 Sicilian: Najdorf, G\"oteborg variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 h6 Bh4 g5 [ECO B98 Sicilian: Najdorf, Browne variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 h6 Bh4 Qc7 [ECO B98 Sicilian: Najdorf, 7...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 [ECO B97 Sicilian: Najdorf, Poisoned pawn variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6 Qd2 Qb2 Rb1 Qa3 [ECO B97 Sicilian: Najdorf, 7...Qb6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6 [ECO B96 Sicilian: Najdorf, Polugayevsky, Simagin variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 b5 e5 de fe Qc7 Qe2 [ECO B96 Sicilian: Najdorf, Polugayevsky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 b5 [ECO B96 Sicilian: Najdorf, 7.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 f4 [ECO B95 Sicilian: Najdorf, 6...e6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 e6 [ECO B94 Sicilian: Najdorf, Ivkov variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 N8d7 Bc4 Qa5 Qd2 e6 o-o-o b5 Bb3 Bb7 h1e1 Nc5 e5 [ECO B94 Sicilian: Najdorf, 6.Bg5] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bg5 [ECO B93 Sicilian: Najdorf, 6.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 f4 [ECO B92 Sicilian: Najdorf, Opo\v censky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Be2 [ECO B91 Sicilian: Najdorf, Zagreb variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 g3 [ECO B90 Sicilian: Najdorf, Byrne attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Be3 [ECO B90 Sicilian: Najdorf, Lipnitzky attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 Bc4 [ECO B90 Sicilian: Najdorf, Adams attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 h3 [ECO B90 Sicilian: Najdorf] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 a6 [ECO B89 Sicilian: Velimirovi\'c attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Be3 Be7 Qe2 [ECO B89 Sicilian: Sozin, 7.Be3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Be3 [ECO B88 Sicilian: Sozin, Fischer variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 Bb3 Be7 Be3 o-o f4 [ECO B88 Sicilian: Sozin, Leonhardt variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 Nc6 [ECO B87 Sicilian: Sozin with ...a6 and ...b5] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 a6 Bb3 b5 [ECO B86 Sicilian: Sozin attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bc4 [ECO B85 Sicilian: Scheveningen, classical main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Be3 Be7 Qe1 o-o [ECO B85 Sicilian: Scheveningen, classical] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Be3 [ECO B85 Sicilian: Scheveningen, classical, Mar\'oczy system] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 Kh1 Be7 a4 [ECO B85 Sicilian: Scheveningen, classical variation with ...Qc7 and ...Nc6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 f4 Nc6 [ECO B84 Sicilian: Scheveningen , classical variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o Qc7 [ECO B84 Sicilian: Scheveningen, classical, Nd7 system] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 o-o N8d7 [ECO B84 Sicilian: Scheveningen , classical variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 a6 [ECO B83 Sicilian: modern Scheveningen, main line with Nb3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 o-o Be7 Be3 o-o f4 Bd7 Nb3 [ECO B83 Sicilian: modern Scheveningen, main line] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 o-o Be7 Be3 o-o f4 [ECO B83 Sicilian: modern Scheveningen] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 Nc6 [ECO B83 Sicilian: Scheveningen, 6.Be2] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be2 [ECO B82 Sicilian: Scheveningen, Tal variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 f4 Nc6 Be3 Be7 Qf3 [ECO B82 Sicilian: Scheveningen, 6.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 f4 [ECO B81 Sicilian: Scheveningen, Keres attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 g4 [ECO B80 Sicilian: Scheveningen, fianchetto variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 g3 [ECO B80 Sicilian: Scheveningen, Vitoli\'n\'s variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Bb5 [ECO B80 Sicilian: Scheveningen, English variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 Be3 a6 Qd2 [ECO B80 Sicilian: Scheveningen variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e6 [ECO B79 Sicilian: dragon, Yugoslav attack, 12.h4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 o-o-o Qa5 Bb3 f8c8 h4 [ECO B78 Sicilian: dragon, Yugoslav attack, 10.O-O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 o-o-o [ECO B77 Sicilian: dragon, Yugoslav attack, 9...Bd7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 Bd7 [ECO B77 Sicilian: dragon, Yugoslav attack, Byrne variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 a5 [ECO B77 Sicilian: dragon, Yugoslav attack, 9.Bc4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 Bc4 [ECO B76 Sicilian: dragon, Yugoslav attack, Rauser variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o Qd2 Nc6 o-o-o [ECO B76 Sicilian: dragon, Yugoslav attack, 7...O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 o-o [ECO B75 Sicilian: dragon, Yugoslav attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 f3 [ECO B74 Sicilian: dragon, classical, Alekhine variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 a5 [ECO B74 Sicilian: dragon, classical, R\'eti-Tartakower variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Qc8 [ECO B74 Sicilian: dragon, classical, Bernard defence] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Bd3 Bd3 cd d5 [ECO B74 Sicilian: dragon, classical, Spielmann variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Bd3 [ECO B74 Sicilian: dragon, classical, Stockholm attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 Be6 f4 Na5 f5 Bc4 Na5 Be2 Qe2 Qa5 g4 [ECO B74 Sicilian: dragon, classical, 9.Nb3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Nb3 [ECO B73 Sicilian: dragon, classical, Richter variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o Qd2 [ECO B73 Sicilian: dragon, classical, Zollner gambit] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o o-o f4 Qb6 e5 [ECO B73 Sicilian: dragon, classical, 8.O-O] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 o-o [ECO B72 Sicilian: dragon, classical, Nottingham variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Nb3 [ECO B72 Sicilian: dragon, classical, Grigoriev variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Qd2 o-o o-o-o [ECO B72 Sicilian: dragon, classical, Amsterdam variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 Qd2 [ECO B72 Sicilian: dragon, classical attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 Bg7 Be2 [ECO B72 Sicilian: dragon, 6.Be3] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 Be3 [ECO B71 Sicilian: dragon, Levenfish; Flohr variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 f4 N8d7 [ECO B71 Sicilian: dragon, Levenfish variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 f4 [ECO B70 Sicilian: dragon variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 g6 [ECO B69 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 11.Bxf6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 f4 Be7 Nf3 b5 Bf6 [ECO B68 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 9...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 f4 Be7 [ECO B67 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6 defence, 8...Bd7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 o-o-o Bd7 [ECO B66 Sicilian: Richter-Rauzer, Rauzer attack, 7...a6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 [ECO B65 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9...Nxd4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 Nd4 Qd4 [ECO B65 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9...Nxd4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 Nd4 [ECO B64 Sicilian: Richter-Rauzer, Rauzer attack, Geller variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 e5 [ECO B64 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7 defence, 9.f4] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 o-o-o o-o f4 [ECO B63 Sicilian: Richter-Rauzer, Rauzer attack, 7...Be7] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 [ECO B63 Sicilian: Richter-Rauzer, Rauzer attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 [ECO B62 Sicilian: Richter-Rauzer, Keres variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Qd3 [ECO B62 Sicilian: Richter-Rauzer, Richter attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Nc6 [ECO B62 Sicilian: Richter-Rauzer, Margate variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Bb5 [ECO B62 Sicilian: Richter-Rauzer, Pod\v ebrady variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 Nb3 [ECO B62 Sicilian: Richter-Rauzer, 6...e6] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 e6 [ECO B61 Sicilian: Richter-Rauzer, Larsen variation, 7.Qd2] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 Bd7 Qd2 [ECO B60 Sicilian: Richter-Rauzer, Larsen variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 Bd7 [ECO B60 Sicilian: Richter-Rauzer, Bondarevsky variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 g6 [ECO B60 Sicilian: Richter-Rauzer] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bg5 [ECO B59 Sicilian: Boleslavsky variation, 7.Nb3] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 Nb3 [ECO B58 Sicilian: Boleslavsky, Louma variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 Nc6 [ECO B58 Sicilian: Boleslavsky variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 e5 [ECO B58 Sicilian: classical] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 d6 Be2 [ECO B57 Sicilian: Sozin, Benk\"o variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 Qb6 [ECO B57 Sicilian: Magnus Smith trap] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 g6 Nc6 bc e5 [ECO B57 Sicilian: Sozin, not Scheveningen] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 Bc4 [ECO B56 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 Nc6 [ECO B56 Sicilian: Venice attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 e5 Bb5 [ECO B56 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 Nc3 [ECO B55 Sicilian: Prins variation, Venice attack] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 f3 e5 Bb5 [ECO B54 Sicilian: Prins variation] e4 c5 Nf3 d6 d4 cd Nd4 Nf6 f3 [ECO B54 Sicilian] e4 c5 Nf3 d6 d4 cd Nd4 [ECO B53 Sicilian: Chekhover, Zaitsev variation] e4 c5 Nf3 d6 d4 cd Qd4 Nc6 Bb5 Qd7 [ECO B53 Sicilian, Chekhover variation] e4 c5 Nf3 d6 d4 cd Qd4 [ECO B?? Sicilian: Tartakower variation] e4 c5 Nf3 d6 d4 cd c3 [ECO B?? Sicilian] e4 c5 Nf3 d6 d4 cd [ECO B?? Sicilian: Cortlever variation] e4 c5 Nf3 d6 d4 Nf6 [ECO B52 Sicilian: Canal-Sokolsky attack, Sokolsky variation] e4 c5 Nf3 d6 Bb5 Bd7 Bd7 Qd7 c4 [ECO B52 Sicilian: Canal-Sokolsky attack, Bronstein gambit] e4 c5 Nf3 d6 Bb5 Bd7 Bd7 Qd7 o-o Nc6 c3 Nf6 d4 [ECO B52 Sicilian: Canal-Sokolsky attack, 3...Bd7] e4 c5 Nf3 d6 Bb5 Bd7 [ECO B51 Sicilian: Canal-Sokolsky attack] e4 c5 Nf3 d6 Bb5 [ECO B50 Sicilian: wing gambit deferred] e4 c5 Nf3 d6 b4 [ECO B50 Sicilian] e4 c5 Nf3 d6 [ECO B49 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 Be3 a6 Be2 [ECO B48 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 Be3 [ECO B47 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Qc7 [ECO B46 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 a6 [ECO B45 Sicilian: Taimanov, American attack] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 Nf6 N4b5 Bb4 Nd6 [ECO B45 Sicilian: Taimanov variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nc3 [ECO B44 Sicilian, Sz\'en variation, Dely-Kasparov gambit] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 d6 c4 Nf6 N1c3 a6 Na3 d5 [ECO B44 Sicilian, Sz\'en, hedgehog variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 d6 c4 Nf6 N1c3 a6 Na3 Be7 Be2 o-o o-o b6 [ECO B44 Sicilian, Sz\'en variation] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 Nb5 [ECO B44 Sicilian defence] e4 c5 Nf3 e6 d4 cd Nd4 Nc6 [ECO B43 Sicilian: Kan, 5.Nc3] e4 c5 Nf3 e6 d4 cd Nd4 a6 Nc3 [ECO B42 Sicilian: Kan, Swiss cheese variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 g6 [ECO B42 Sicilian: Kan, Polugaievsky variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 Bc5 [ECO B42 Sicilian: Kan, Gipslis variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 Nf6 o-o d6 c4 g6 [ECO B42 Sicilian: Kan, 5.Bd3] e4 c5 Nf3 e6 d4 cd Nd4 a6 Bd3 [ECO B41 Sicilian: Kan, Mar\'oczy bind - Bronstein variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 c4 Nf6 Nc3 Bb4 Bd3 Nc6 Bc2 [ECO B41 Sicilian: Kan, Mar\'oczy bind ] e4 c5 Nf3 e6 d4 cd Nd4 a6 c4 [ECO B41 Sicilian: Kan variation] e4 c5 Nf3 e6 d4 cd Nd4 a6 [ECO B40 Sicilian: Pin, Koch variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 e5 [ECO B40 Sicilian: Pin, Jaffe variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 Bd3 e5 [ECO B40 Sicilian: Pin variation ] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 Nc3 Bb4 [ECO B40 Sicilian: Anderssen variation] e4 c5 Nf3 e6 d4 cd Nd4 Nf6 [ECO B40 Sicilian defence] e4 c5 Nf3 e6 d4 cd [ECO B40 Sicilian: Marshall variation] e4 c5 Nf3 e6 d4 d5 [ECO B40 Sicilian defence] e4 c5 Nf3 e6 [ECO B39 Sicilian: accelerated fianchetto, Breyer variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Be3 Nf6 Nc3 Ng4 [ECO B38 Sicilian: accelerated fianchetto, Mar\'oczy bind, 6.Be3] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Be3 [ECO B37 Sicilian: accelerated fianchetto, Simagin variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 Nc2 d6 Be2 Nh6 [ECO B37 Sicilian: accelerated fianchetto, Mar\'oczy bind, 5...Bg7] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Bg7 [ECO B36 Sicilian: accelerated fianchetto, Gurgenidze variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 Nf6 Nc3 Nd4 Qd4 d6 [ECO B36 Sicilian: accelerated fianchetto, Mar\'oczy bind] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 c4 [ECO B35 Sicilian: accelerated fianchetto, modern variation with Bc4] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc3 Bg7 Be3 Nf6 Bc4 [ECO B34 Sicilian: accelerated fianchetto, modern variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc3 [ECO B34 Sicilian: accelerated fianchetto, exchange variation] e4 c5 Nf3 Nc6 d4 cd Nd4 g6 Nc6 [ECO B33 Sicilian: Sveshnikov variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 b5 Bf6 gf Nd5 f5 [ECO B33 Sicilian: Pelikan, Chelyabinsk variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 b5 [ECO B33 Sicilian: Pelikan, Bird variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 N4b5 d6 Bg5 a6 Na3 Be6 [ECO B33 Sicilian: Pelikan variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 Nc3 e5 [ECO B33 Sicilian defence] e4 c5 Nf3 Nc6 d4 cd Nd4 Nf6 [ECO B32 Sicilian: Labourdonnais-L\"owenthal variation] e4 c5 Nf3 Nc6 d4 cd Nd4 e5 Nb5 d6 [ECO B32 Sicilian: Labourdonnais-L\"owenthal variation] e4 c5 Nf3 Nc6 d4 cd Nd4 e5 [ECO B32 Sicilian: Nimzovich variation] e4 c5 Nf3 Nc6 d4 cd Nd4 d5 [ECO B32 Sicilian: Flohr variation] e4 c5 Nf3 Nc6 d4 cd Nd4 Qc7 [ECO B32 Sicilian defence] e4 c5 Nf3 Nc6 d4 [ECO B31 Sicilian: Nimzovich-Rossolimo attack, Gurgenidze variation] e4 c5 Nf3 Nc6 Bb5 g6 o-o Bg7 Re1 e5 b4 [ECO B31 Sicilian: Nimzovich-Rossolimo attack ] e4 c5 Nf3 Nc6 Bb5 g6 [ECO B30 Sicilian: Nimzovich-Rossolimo attack ] e4 c5 Nf3 Nc6 Bb5 [ECO B30 Sicilian defence] e4 c5 Nf3 Nc6 [ECO B29 Sicilian: Nimzovich-Rubinstein; Rubinstein counter-gambit] e4 c5 Nf3 Nf6 e5 Nd5 Nc3 e6 Nd5 ed d4 Nc6 [ECO B29 Sicilian: Nimzovich-Rubinstein variation] e4 c5 Nf3 Nf6 [ECO B28 Sicilian: O'Kelly variation] e4 c5 Nf3 a6 [ECO B27 Sicilian: Acton extension] e4 c5 Nf3 g6 c4 Bh6 [ECO B27 Sicilian: Hungarian variation] e4 c5 Nf3 g6 [ECO B27 Sicilian: Katalimov variation] e4 c5 Nf3 b6 [ECO B27 Sicilian: Quinteros variation] e4 c5 Nf3 Qc7 [ECO B27 Sicilian: Stiletto variation] e4 c5 Nf3 Qa5 [ECO B27 Sicilian defence] e4 c5 Nf3 [ECO B26 Sicilian: closed, 6.Be3] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 Be3 [ECO B25 Sicilian: closed, 6.f4 e5 ] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 f4 e5 [ECO B25 Sicilian: closed, 6.f4] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 f4 [ECO B25 Sicilian: closed, 6.Ne2 e5 ] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 N1e2 e5 [ECO B25 Sicilian: closed] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 [ECO B24 Sicilian: closed, Smyslov variation] e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 e6 Be3 Nd4 N3e2 [ECO B24 Sicilian: closed] e4 c5 Nc3 Nc6 g3 [ECO B23 Sicilian: Grand Prix attack, Schofman variation] e4 c5 Nc3 Nc6 f4 g6 Nf3 Bg7 Bc4 e6 f5 [ECO B23 Sicilian: Grand Prix attack] e4 c5 Nc3 Nc6 f4 [ECO B23 Sicilian: chameleon variation] e4 c5 Nc3 Nc6 N1e2 [ECO B23 Sicilian: closed, 2...Nc6] e4 c5 Nc3 Nc6 [ECO B23 Sicilian: closed, Korchnoi variation] e4 c5 Nc3 e6 g3 d5 [ECO B23 Sicilian: closed] e4 c5 Nc3 [ECO B22 Sicilian: 2.c3, Heidenfeld variation] e4 c5 c3 Nf6 e5 Nd5 Nf3 Nc6 Na3 [ECO B22 Sicilian: Alapin's variation ] e4 c5 c3 [ECO B21 Sicilian: Smith-Morra gambit, Chicago defence] e4 c5 d4 cd c3 dc Nc3 Nc6 Nf3 d6 Bc4 e6 o-o a6 Qe2 b5 Bb3 Ra7 [ECO B21 Sicilian: Smith-Morra gambit] e4 c5 d4 cd c3 [ECO B21 Sicilian: Andreaschek gambit] e4 c5 d4 cd Nf3 e5 c3 [ECO B21 Sicilian: Smith-Morra gambit] e4 c5 d4 [ECO B21 Sicilian: Grand Prix attack] e4 c5 f4 [ECO B20 Sicilian: Keres variation ] e4 c5 Ne2 [ECO B20 Sicilian: wing gambit, Carlsbad variation] e4 c5 b4 cb a3 ba [ECO B20 Sicilian: wing gambit, Marienbad variation] e4 c5 b4 cb a3 d5 ed Qd5 Bb2 [ECO B20 Sicilian: wing gambit, Marshall variation] e4 c5 b4 cb a3 [ECO B20 Sicilian: wing gambit, Santasiere variation] e4 c5 b4 cb c4 [ECO B20 Sicilian: wing gambit] e4 c5 b4 [ECO B20 Sicilian: Steinitz variation] e4 c5 g3 [ECO B20 Sicilian: Gloria variation] e4 c5 c4 d6 Nc3 Nc6 g3 h5 [ECO B20 Sicilian defence] e4 c5 [ECO C19 French: Winawer, advance, positional main line] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Nf3 [ECO C19 French: Winawer, advance, Smyslov variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 a4 [ECO C18 French: Winawer, advance, poisoned pawn, Konstantinopolsky variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 Qc7 Qg7 Rg8 Qh7 cd Ne2 [ECO C18 French: Winawer, advance, poisoned pawn, Euwe-Gligori\'c variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 Qc7 Qg7 Rg8 Qh7 cd Kd1 [ECO C18 French: Winawer, advance, poisoned pawn variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 Qg4 [ECO C18 French: Winawer, advance, 6...Ne7] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Ne7 [ECO C18 French: Winawer, classical variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc Qc7 [ECO C18 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bc3 bc [ECO C17 French: Winawer, advance, Rauzer variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 cd ab dc Nf3 [ECO C17 French: Winawer, advance, 5.a3] e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 [ECO C17 French: Winawer, advance, Russian variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 Qg4 [ECO C17 French: Winawer, advance, Bogolyubov variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 Bd2 [ECO C17 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 c5 [ECO C16 French: Winawer, Petrosian variation] e4 e6 d4 d5 Nc3 Bb4 e5 Qd7 [ECO C16 French: Winawer, advance variation] e4 e6 d4 d5 Nc3 Bb4 e5 [ECO C15 French: Winawer, Alekhine gambit, Kan variation] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Bc3 Nc3 Nc6 [ECO C15 French: Winawer, Alekhine gambit] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Bc3 [ECO C15 French: Winawer, Alekhine gambit, Alatortsev variation] e4 e6 d4 d5 Nc3 Bb4 Ne2 de a3 Be7 Ne4 Nf6 N2g3 o-o Be2 Nc6 [ECO C15 French: Winawer, Alekhine gambit] e4 e6 d4 d5 Nc3 Bb4 Ne2 [ECO C15 French: Winawer, fingerslip variation] e4 e6 d4 d5 Nc3 Bb4 Bd2 [ECO C15 French: Winawer, Kondratiyev variation] e4 e6 d4 d5 Nc3 Bb4 Bd3 c5 ed Qd5 Bd2 [ECO C15 French: Winawer variation] e4 e6 d4 d5 Nc3 Bb4 [ECO C14 French: classical, St\a hlberg variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 f4 o-o Nf3 c5 Qd2 Nc6 o-o-o c4 [ECO C14 French: classical, Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 f4 [ECO C14 French: classical, Pollock variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Qg4 [ECO C14 French: classical, Alapin variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Nb5 [ECO C14 French: classical, Rubinstein variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Qd2 [ECO C14 French: classical, Tarrasch variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 Bd3 [ECO C14 French: classical variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 Be7 Qe7 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Spielmann variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 o-o [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Teichmann variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 f6 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Breyer variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 c5 [ECO C13 French: Albin-Alekhine-Ch\^atard attack, Mar\'oczy variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 a6 [ECO C13 French: Albin-Alekhine-Ch\^atard attack] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 N6d7 h4 [ECO C13 French: classical, Tartakower variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ne4 [ECO C13 French: classical, Frankfurt variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ng8 Be3 b6 [ECO C13 French: classical, Vistaneckis variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Ng8 [ECO C13 French: classical, Anderssen-Richter variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 Bf6 Bf6 e5 Be7 Qg4 [ECO C13 French: classical, Anderssen variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 Bf6 [ECO C13 French: classical] e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 [ECO C12 French: MacCutcheon, Lasker variation, 8...g6] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 bc Ne4 Qg4 g6 [ECO C12 French: MacCutcheon, Duras variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 bc Ne4 Qg4 Kf8 Bc1 [ECO C12 French: MacCutcheon, Lasker variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 Bc3 [ECO C12 French: MacCutcheon, Tartakower variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bd2 N6d7 [ECO C12 French: MacCutcheon, Dr. Olland variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bc1 [ECO C12 French: MacCutcheon, Janowski variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Be3 [ECO C12 French: MacCutcheon, Bernstein variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 Bh4 [ECO C12 French: MacCutcheon, Grigoriev variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 ef hg fg Rg8 h4 gh Qg4 [ECO C12 French: MacCutcheon, Chigorin variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 h6 ef [ECO C12 French: MacCutcheon, advance variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 e5 [ECO C12 French: MacCutcheon, Bogolyubov variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 ed Qd5 Bf6 gf Qd2 Qa5 [ECO C12 French: MacCutcheon variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4 [ECO C11 French: Burn variation] e4 e6 d4 d5 Nc3 Nf6 Bg5 de [ECO C11 French: Steinitz, Gledhill attack] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 Qg4 [ECO C11 French: Steinitz, Boleslavsky variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 Nf3 Nc6 Be3 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 Nf3 [ECO C11 French: Steinitz, Brodsky-Jones variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Nc6 a3 Bc5 Qg4 o-o Nf3 f6 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Nc6 [ECO C11 French: Steinitz, Bradford attack] e4 e6 d4 d5 Nc3 Nf6 e5 N6d7 f4 c5 dc Bc5 Qg4 [ECO C11 French: Steinitz variation] e4 e6 d4 d5 Nc3 Nf6 e5 [ECO C11 French: Henneberger variation] e4 e6 d4 d5 Nc3 Nf6 Be3 [ECO C11 French: Swiss variation] e4 e6 d4 d5 Nc3 Nf6 Bd3 [ECO C11 French defence] e4 e6 d4 d5 Nc3 Nf6 [ECO C10 French: Frere variation] e4 e6 d4 d5 Nc3 de Ne4 Qd5 [ECO C10 French: Rubinstein, Capablanca line] e4 e6 d4 d5 Nc3 de Ne4 Nd7 Nf3 N8f6 Nf6 Nf6 Ne5 [ECO C10 French: Rubinstein variation] e4 e6 d4 d5 Nc3 de Ne4 Nd7 [ECO C10 French: Fort Knox variation] e4 e6 d4 d5 Nc3 de Ne4 Bd7 Nf3 Bc6 [ECO C10 French: Rubinstein variation] e4 e6 d4 d5 Nc3 de [ECO C10 French: Marshall variation] e4 e6 d4 d5 Nc3 c5 [ECO C10 French: Paulsen variation] e4 e6 d4 d5 Nc3 [ECO C09 French: Tarrasch, open variation, main line] e4 e6 d4 d5 Nd2 c5 ed ed N1f3 Nc6 [ECO C08 French: Tarrasch, open, 4.ed ed] e4 e6 d4 d5 Nd2 c5 ed ed [ECO C07 French: Tarrasch, Eliskases variation] e4 e6 d4 d5 Nd2 c5 ed Qd5 N1f3 cd Bc4 Qd8 [ECO C07 French: Tarrasch, open variation] e4 e6 d4 d5 Nd2 c5 [ECO C06 French: Tarrasch, Leningrad variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 Ne2 cd cd Nb6 [ECO C06 French: Tarrasch, closed variation, main line] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 Ne2 cd cd [ECO C05 French: Tarrasch, closed variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 Nc6 [ECO C05 French: Tarrasch, Botvinnik variation] e4 e6 d4 d5 Nd2 Nf6 e5 N6d7 Bd3 c5 c3 b6 [ECO C05 French: Tarrasch, closed variation] e4 e6 d4 d5 Nd2 Nf6 [ECO C04 French: Tarrasch, Guimard main line] e4 e6 d4 d5 Nd2 Nc6 N1f3 Nf6 [ECO C03 French: Tarrasch, Guimard variation] e4 e6 d4 d5 Nd2 Nc6 [ECO C03 French: Tarrasch, Haberditz variation] e4 e6 d4 d5 Nd2 f5 [ECO C03 French: Tarrasch] e4 e6 d4 d5 Nd2 [ECO C02 French: advance, Euwe variation] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 Bd7 [ECO C02 French: advance, Milner-Barry gambit] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 Qb6 Bd3 [ECO C02 French: advance, Paulsen attack] e4 e6 d4 d5 e5 c5 c3 Nc6 Nf3 [ECO C02 French: advance variation] e4 e6 d4 d5 e5 c5 c3 Nc6 [ECO C02 French: advance, Wade variation] e4 e6 d4 d5 e5 c5 c3 Qb6 Nf3 Bd7 [ECO C02 French: advance variation] e4 e6 d4 d5 e5 c5 c3 [ECO C02 French: advance, Nimzovich system] e4 e6 d4 d5 e5 c5 Nf3 [ECO C02 French: advance, Nimzovich variation] e4 e6 d4 d5 e5 c5 Qg4 [ECO C02 French: advance, Steinitz variation] e4 e6 d4 d5 e5 c5 dc [ECO C02 French: advance variation] e4 e6 d4 d5 e5 [ECO C01 French: exchange, Bogolyubov variation] e4 e6 d4 d5 ed ed Nc3 Nf6 Bg5 Nc6 [ECO C01 French: exchange, Svenonius variation] e4 e6 d4 d5 ed ed Nc3 Nf6 Bg5 [ECO C01 French: exchange variation] e4 e6 d4 d5 ed [ECO C00 French: Alapin variation] e4 e6 d4 d5 Be3 [ECO C00 French: Schlechter variation] e4 e6 d4 d5 Bd3 [ECO C00 French defence] e4 e6 d4 d5 [ECO C00 St. George defence] e4 e6 d4 a6 [ECO C00 Lengfellner system] e4 e6 d4 d6 [ECO C00 French defence] e4 e6 d4 [ECO C00 French: Reversed Philidor formation] e4 e6 d3 d5 Nd2 Nf6 N1f3 Nc6 Be2 [ECO C00 French: King's Indian attack] e4 e6 d3 [ECO C00 French: Chigorin variation] e4 e6 Qe2 [ECO C00 French: Two knights variation] e4 e6 Nc3 d5 Nf3 [ECO C00 French: Pelikan variation] e4 e6 Nc3 d5 f4 [ECO C00 French defence] e4 e6 Nc3 [ECO C00 French: Wing gambit] e4 e6 Nf3 d5 e5 c5 b4 [ECO C00 French defence] e4 e6 Nf3 [ECO C00 French: Labourdonnais variation] e4 e6 f4 [ECO C00 French: Steinitz attack] e4 e6 e5 [ECO C00 French: R\'eti variation] e4 e6 b3 [ECO C00 French defence, Steiner variation] e4 e6 c4 [ECO C00 French defence] e4 e6 [ECO B19 Caro-Kann: classical, Spassky variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 h5 [ECO B19 Caro-Kann: classical, 7...Nd7] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7 [ECO B18 Caro-Kann: classical, 6.h4] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 h4 [ECO B18 Caro-Kann: classical, Mar\'oczy attack] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 f4 [ECO B18 Caro-Kann: classical, Flohr variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 Ng3 Bg6 Nh3 [ECO B18 Caro-Kann: classical variation] e4 c6 d4 d5 Nc3 de Ne4 Bf5 [ECO B17 Caro-Kann: Steinitz variation] e4 c6 d4 d5 Nc3 de Ne4 Nd7 [ECO B16 Caro-Kann: Bronstein-Larsen variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 gf [ECO B15 Caro-Kann: Forg\'acs variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 ef Bc4 [ECO B15 Caro-Kann: Tartakower variation] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Nf6 ef [ECO B15 Caro-Kann: Alekhine gambit] e4 c6 d4 d5 Nc3 de Ne4 Nf6 Bd3 [ECO B15 Caro-Kann defence] e4 c6 d4 d5 Nc3 de Ne4 [ECO B15 Caro-Kann: Rasa-Studier gambit] e4 c6 d4 d5 Nc3 de f3 [ECO B15 Caro-Kann: Gurgenidze system] e4 c6 d4 d5 Nc3 g6 [ECO B15 Caro-Kann: Gurgenidze counter-attack] e4 c6 d4 d5 Nc3 b5 [ECO B15 Caro-Kann defence] e4 c6 d4 d5 Nc3 [ECO B14 Caro-Kann: Panov-Botvinnik attack, 5...g6] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 g6 [ECO B14 Caro-Kann: Panov-Botvinnik attack, 5...e6] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 e6 [ECO B13 Caro-Kann: Panov-Botvinnik, Reifir variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 Qb6 [ECO B13 Caro-Kann: Panov-Botvinnik, Czerniak variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 Qa5 [ECO B13 Caro-Kann: Panov-Botvinnik, normal variation] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 e6 [ECO B13 Caro-Kann: Panov-Botvinnik, Herzog defence] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 Nc6 Bg5 dc d5 Na5 [ECO B13 Caro-Kann: Panov-Botvinnik attack] e4 c6 d4 d5 ed cd c4 Nf6 Nc3 [ECO B13 Caro-Kann: Panov-Botvinnik, Gunderam attack] e4 c6 d4 d5 ed cd c4 Nf6 c5 [ECO B13 Caro-Kann: Panov-Botvinnik attack] e4 c6 d4 d5 ed cd c4 [ECO B13 Caro-Kann: exchange, Rubinstein variation] e4 c6 d4 d5 ed cd Bd3 Nc6 c3 Nf6 Bf4 [ECO B13 Caro-Kann: exchange variation] e4 c6 d4 d5 ed [ECO B12 Caro-Kann: advance, Short variation] e4 c6 d4 d5 e5 Bf5 c3 e6 Be2 [ECO B12 Caro-Kann: advance variation] e4 c6 d4 d5 e5 [ECO B12 Caro-Kann: Edinburgh variation] e4 c6 d4 d5 Nd2 Qb6 [ECO B12 Caro-Kann: 3.Nd2] e4 c6 d4 d5 Nd2 [ECO B12 Caro-Kann: Tartakower variation] e4 c6 d4 d5 f3 [ECO B12 Caro-Kann defence] e4 c6 d4 d5 [ECO B12 Caro-Masi defence] e4 c6 d4 Nf6 [ECO B12 de Bruycker defence] e4 c6 d4 Na6 Nc3 Nc7 [ECO B12 Caro-Kann defence] e4 c6 d4 [ECO B11 Caro-Kann: two knights, 3...Bg4] e4 c6 Nc3 d5 Nf3 Bg4 [ECO B10 Caro-Kann: two knights variation] e4 c6 Nc3 d5 Nf3 [ECO B10 Caro-Kann: Goldman variation] e4 c6 Nc3 d5 Qf3 [ECO B10 Caro-Kann defence] e4 c6 Nc3 [ECO B10 Caro-Kann: closed variation] e4 c6 d3 [ECO B10 Caro-Kann: anti-anti-Caro-Kann defence] e4 c6 c4 d5 [ECO B10 Caro-Kann: anti-Caro-Kann defence] e4 c6 c4 [ECO B10 Caro-Kann: Hillbilly attack] e4 c6 Bc4 [ECO B10 Caro-Kann defence] e4 c6 [ECO B09 Pirc: Austrian attack, Ljubojevi\'c variation] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Bc4 [ECO B09 Pirc: Austrian attack, dragon formation] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 c5 [ECO B09 Pirc: Austrian attack, 6.Bd3] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o Bd3 [ECO B09 Pirc: Austrian attack, 6.Be3] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o Be3 [ECO B09 Pirc: Austrian attack, 6.e5] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o e5 [ECO B09 Pirc: Austrian attack] e4 d6 d4 Nf6 Nc3 g6 f4 Bg7 Nf3 o-o [ECO B09 Pirc: Austrian attack] e4 d6 d4 Nf6 Nc3 g6 f4 [ECO B08 Pirc: classical system, 5.Be2] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 Be2 [ECO B08 Pirc: classical, h3 system] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 h3 [ECO B08 Pirc: classical system] e4 d6 d4 Nf6 Nc3 g6 Nf3 Bg7 [ECO B?? Pirc: classical system] e4 d6 d4 Nf6 Nc3 g6 Nf3 [ECO B07 Pirc: bayonet attack] e4 d6 d4 Nf6 Nc3 g6 Be2 Bg7 h4 [ECO B07 Pirc: Chinese variation] e4 d6 d4 Nf6 Nc3 g6 Be2 Bg7 g4 [ECO B07 Pirc defence] e4 d6 d4 Nf6 Nc3 g6 Be2 [ECO B07 Pirc: Byrne variation] e4 d6 d4 Nf6 Nc3 g6 Bg5 [ECO B07 Pirc: Holmov system] e4 d6 d4 Nf6 Nc3 g6 Bc4 [ECO B07 Pirc: Sveshnikov system] e4 d6 d4 Nf6 Nc3 g6 g3 [ECO B07 Pirc: 150 attack] e4 d6 d4 Nf6 Nc3 g6 Be3 c6 Qd2 [ECO B07 Pirc defence] e4 d6 d4 Nf6 Nc3 g6 [ECO B07 Pirc: Ufimtsev-Pytel variation] e4 d6 d4 Nf6 Nc3 c6 [ECO B07 Pirc defence] e4 d6 d4 Nf6 [ECO A82 Balogh defence] e4 d6 d4 f5 [ECO C00 Lengfellner system] e4 d6 d4 e6 [ECO B06 Robatsch defence: Pseudo-Austrian attack] e4 g6 d4 Bg7 Nc3 d6 f4 [ECO B06 Robatsch defence: two knights, Suttles variation] e4 g6 d4 Bg7 Nc3 d6 Nf3 c6 [ECO B06 Robatsch defence: two knights variation] e4 g6 d4 Bg7 Nc3 d6 Nf3 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 Nc3 d6 [ECO B06 Robatsch defence: Gurgenidze variation] e4 g6 d4 Bg7 Nc3 c6 f4 d5 e5 h5 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 Nc3 [ECO B06 Robatsch defence: three pawns attack] e4 g6 d4 Bg7 f4 [ECO B07 Robatsch defence: Geller's system] e4 g6 d4 Bg7 Nf3 d6 c3 [ECO A41 Robatsch defence: Rossolimo variation] e4 g6 d4 Bg7 Nf3 d6 c4 Bg4 [ECO B06 Robatsch defence] e4 g6 d4 Bg7 [ECO B06 Norwegian defence] e4 g6 d4 Nf6 e5 Nh5 g4 Ng7 [ECO B06 Robatsch defence] e4 g6 [ECO B05 Alekhine's defence: modern, Vitolins attack] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 c4 Nb6 d5 [ECO B05 Alekhine's defence: modern, Alekhine variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 c4 [ECO B05 Alekhine's defence: modern, Panov variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 h3 [ECO B05 Alekhine's defence: modern, Flohr variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 Be2 c6 [ECO B05 Alekhine's defence: modern variation, 4...Bg4] e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4 [ECO B04 Alekhine's defence: modern, Keres variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 g6 Bc4 Nb6 Bb3 Bg7 a4 [ECO B04 Alekhine's defence: modern, fianchetto variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 g6 [ECO B04 Alekhine's defence: modern, Schmid variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 Nb6 [ECO B04 Alekhine's defence: modern, Larsen variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 de [ECO B04 Alekhine's defence: modern variation] e4 Nf6 e5 Nd5 d4 d6 Nf3 [ECO B03 Alekhine's defence: four pawns attack, Trifunovi\'c variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 Bf5 [ECO B03 Alekhine's defence: four pawns attack, fianchetto variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 g6 [ECO B03 Alekhine's defence: four pawns attack, Planinc variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 g5 [ECO B03 Alekhine's defence: four pawns attack, Tartakower variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Be3 Bf5 Nc3 e6 Nf3 Qd7 Be2 o-o-o o-o Be7 [ECO B03 Alekhine's defence: four pawns attack, 7.Be3] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Be3 [ECO B03 Alekhine's defence: four pawns attack, Ilyin-Genevsky variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 Nf3 Bg4 e6 fe c5 [ECO B03 Alekhine's defence: four pawns attack, 6...Nc6] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Nc6 [ECO B03 Alekhine's defence: four pawns attack, Korchnoi variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 de fe Bf5 Nc3 e6 Nf3 Be7 Be2 o-o o-o f6 [ECO B03 Alekhine's defence: four pawns attack] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 f4 [ECO B03 Alekhine's defence: exchange, Karpov variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 ed cd Nf3 g6 Be2 Bg7 o-o o-o h3 Nc6 Nc3 Bf5 Bf4 [ECO B03 Alekhine's defence: exchange variation] e4 Nf6 e5 Nd5 d4 d6 c4 Nb6 ed [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 d6 c4 [ECO B03 Alekhine's defence: Balogh variation] e4 Nf6 e5 Nd5 d4 d6 Bc4 [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 d6 [ECO B03 Alekhine's defence: O'Sullivan gambit] e4 Nf6 e5 Nd5 d4 b5 [ECO B03 Alekhine's defence] e4 Nf6 e5 Nd5 d4 [ECO B02 Alekhine's defence: two pawns' attack, Mikenas variation] e4 Nf6 e5 Nd5 c4 Nb6 c5 Nd5 Bc4 e6 Nc3 d6 [ECO B02 Alekhine's defence: two pawns' attack] e4 Nf6 e5 Nd5 c4 Nb6 c5 [ECO B02 Alekhine's defence: Steiner variation] e4 Nf6 e5 Nd5 c4 Nb6 b3 [ECO B02 Alekhine's defence] e4 Nf6 e5 Nd5 c4 [ECO B02 Alekhine's defence: Welling variation] e4 Nf6 e5 Nd5 b3 [ECO B02 Alekhine's defence: S\"amisch attack] e4 Nf6 e5 Nd5 Nc3 [ECO B02 Alekhine's defence: Kmoch variation] e4 Nf6 e5 Nd5 Bc4 Nb6 Bb3 c5 d3 [ECO B02 Alekhine's defence] e4 Nf6 e5 Nd5 [ECO B02 Alekhine's defence: Brooklyn defence] e4 Nf6 e5 Ng8 [ECO B02 Alekhine's defence: Mokele Mbembe variation] e4 Nf6 e5 Ne4 [ECO B02 Alekhine's defence: Krejcik variation] e4 Nf6 Bc4 [ECO B02 Alekhine's defence: Mar\'oczy variation] e4 Nf6 d3 [ECO B02 Alekhine's defence: Spielmann variation] e4 Nf6 Nc3 d5 e5 N6d7 e6 [ECO B02 Alekhine's defence: Scandinavian variation] e4 Nf6 Nc3 d5 [ECO B02 Alekhine's defence] e4 Nf6 [ECO B01 Scandinavian: Richter variation] e4 d5 ed Nf6 d4 g6 [ECO B01 Scandinavian: Kiel variation] e4 d5 ed Nf6 d4 Nd5 c4 Nb4 [ECO B01 Scandinavian: Marshall variation] e4 d5 ed Nf6 d4 Nd5 [ECO B01 Scandinavian defence] e4 d5 ed Nf6 d4 [ECO B01 Scandinavian gambit] e4 d5 ed Nf6 c4 c6 [ECO B01 Scandinavian: Icelandic gambit] e4 d5 ed Nf6 c4 e6 [ECO B01 Scandinavian defence] e4 d5 ed Nf6 [ECO B01 Scandinavian: Pytel-Wade variation] e4 d5 ed Qd5 Nc3 Qd6 [ECO B01 Scandinavian, Mieses-Kotr\v c gambit] e4 d5 ed Qd5 Nc3 Qa5 b4 [ECO B01 Scandinavian: Anderssen counter-attack, Collijn variation] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 Nf3 Bg4 [ECO B01 Scandinavian: Anderssen counter-attack, Goteborg system] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 Nf3 [ECO B01 Scandinavian: Anderssen counter-attack orthodox attack] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 de Bb4 Bd2 Nc6 Nf3 [ECO B01 Scandinavian: Anderssen counter-attack] e4 d5 ed Qd5 Nc3 Qa5 d4 e5 [ECO B01 Scandinavian defence, Gr\"unfeld variation] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bf5 Ne5 c6 g4 [ECO B01 Scandinavian defence] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bf5 [ECO B01 Scandinavian defence, Lasker variation] e4 d5 ed Qd5 Nc3 Qa5 d4 Nf6 Nf3 Bg4 h3 [ECO B01 Scandinavian defence] e4 d5 [ECO B00 KP: Neo-Mongoloid defence] e4 Nc6 d4 f6 [ECO B00 KP: Nimzovich defence, Bogolyubov variation] e4 Nc6 d4 d5 Nc3 [ECO B00 KP: Nimzovich defence, Marshall gambit] e4 Nc6 d4 d5 ed Qd5 Nc3 [ECO B00 KP: Nimzovich defence] e4 Nc6 d4 [ECO B00 KP: Colorado counter] e4 Nc6 Nf3 f5 [ECO B00 KP: Nimzovich defence] e4 Nc6 Nf3 [ECO B00 KP: Nimzovich defence, Wheeler gambit] e4 Nc6 b4 Nb4 c3 Nc6 d4 [ECO B00 KP: Nimzovich defence] e4 Nc6 [ECO B00 Guatemala defence] e4 b6 d4 Ba6 [ECO B00 Owen defence] e4 b6 [ECO B00 St. George defence] e4 a6 [ECO B00 Reversed Grob ] e4 g5 [ECO B00 Carr's defence] e4 h6 [ECO B00 Fried fox defence] e4 f6 d4 Kf7 [ECO B00 Barnes defence] e4 f6 [ECO B00 Fred] e4 f5 [ECO B00 Lemming defence] e4 Na6 [ECO B00 Corn stalk defence] e4 a5 [ECO B00 Hippopotamus defence] e4 Nh6 d4 g6 c4 f6 [ECO B00 King's pawn opening] e4 [ECO D69 QGD: Orthodox defence, classical, 13.de] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 de Ne5 Ne5 Qe5 [ECO D68 QGD: Orthodox defence, classical, 13.d1c2 ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 Qc2 [ECO D68 QGD: Orthodox defence, classical, 13.d1b1 ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 Qb1 [ECO D68 QGD: Orthodox defence, classical variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o Nc3 Rc3 e5 [ECO D67 QGD: Orthodox defence, Bd3 line, 11.O-O] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 o-o [ECO D67 QGD: Orthodox defence, Bd3 line, Alekhine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 Ne4 [ECO D67 QGD: Orthodox defence, Bd3 line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 Be7 Qe7 [ECO D67 QGD: Orthodox defence, Bd3 line, Janowski variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 h4 [ECO D67 QGD: Orthodox defence, Bd3 line, Capablanca freeing manoevre] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 Nd5 [ECO D66 QGD: Orthodox defence, Bd3 line, fianchetto variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 dc Bc4 b5 [ECO D66 QGD: Orthodox defence, Bd3 line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Bd3 [ECO D65 QGD: Orthodox defence, Rubinstein attack, main line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 cd [ECO D64 QGD: Orthodox defence, Rubinstein attack, Gr\"unfeld variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 a3 [ECO D64 QGD: Orthodox defence, Rubinstein attack, Karlsbad variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 a6 [ECO D64 QGD: Orthodox defence, Rubinstein attack, Wolf variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 Ne4 [ECO D64 QGD: Orthodox defence, Rubinstein attack ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 Qc2 [ECO D63 QGD: Orthodox defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 c6 [ECO D63 QGD: Orthodox defence, Swiss, Karlsbad variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 a6 cd [ECO D63 QGD: Orthodox defence, Swiss variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 a6 [ECO D63 QGD: Orthodox defence, Capablanca variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 b6 cd ed Bb5 [ECO D63 QGD: Orthodox defence, Pillsbury attack] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 b6 cd ed Bd3 [ECO D63 QGD: Orthodox defence, 7.Rc1] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Rc1 [ECO D62 QGD: Orthodox defence, 7.Qc2 c5, 8.cd ] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qc2 c5 cd [ECO D61 QGD: Orthodox defence, Rubinstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qc2 [ECO D60 QGD: Orthodox defence, Rauzer variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Qb3 [ECO D60 QGD: Orthodox defence, Botvinnik variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 Bd3 [ECO D60 QGD: Orthodox defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 N8d7 [ECO D59 QGD: Tartakower variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 cd Nd5 Be7 Qe7 Nd5 ed Rc1 Be6 [ECO D59 QGD: Tartakower system, 8.cd Nxd5] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 cd Nd5 [ECO D58 QGD: Tartakower system] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 b6 [ECO D57 QGD: Lasker defence, Bernstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 cd Nc3 bc ed Qb3 Qd6 [ECO D57 QGD: Lasker defence, main line] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 cd Nc3 bc [ECO D56 QGD: Lasker defence, Russian variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 Qc2 Nf6 Bd3 dc Bc4 c5 o-o Nc6 f1d1 Bd7 [ECO D56 QGD: Lasker defence, Teichmann variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 Be7 Qe7 Qc2 [ECO D56 QGD: Lasker defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 Ne4 [ECO D55 QGD: Neo-orthodox variation, 7.Bh4] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bh4 [ECO D55 QGD: Petrosian variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bf6 Bf6 Rc1 c6 Bd3 Nd7 o-o dc Bc4 [ECO D55 QGD: Neo-orthodox variation, 7.Bxf6] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 Bf6 [ECO D55 QGD: Neo-orthodox variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 h6 [ECO D55 QGD: Pillsbury attack] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 b6 Bd3 Bb7 cd ed Ne5 [ECO D55 QGD: 6.Nf3] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Nf3 [ECO D54 QGD: Anti-neo-orthodox variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o Rc1 [ECO D53 QGD: 4.Bg5 Be7, 5.e3 O-O] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 o-o [ECO D53 QGD: Lasker variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 Ne4 [ECO D53 QGD: 4.Bg5 Be7] d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 [ECO D52 QGD: Cambridge Springs defence, Yugoslav variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 cd Nd5 [ECO D52 QGD: Cambridge Springs defence, 7.cd] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 cd [ECO D52 QGD: Cambridge Springs defence, Capablanca variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Bf6 [ECO D52 QGD: Cambridge Springs defence, Rubinstein variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 dc [ECO D52 QGD: Cambridge Springs defence, Argentine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 Bb4 Qc2 o-o Bh4 [ECO D52 QGD: Cambridge Springs defence, Bogolyubov variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 Nd2 Bb4 Qc2 [ECO D52 QGD: Cambridge Springs defence] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 Qa5 [ECO D?? QGD] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 Nf3 [ECO D51 QGD: Capablanca anti-Cambridge Springs variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 a3 [ECO D51 QGD: 5...c6] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 c6 [ECO D51 QGD: Manhattan variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 Bb4 [ECO D51 QGD] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 e3 [ECO D51 QGD: Alekhine variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 Nf3 c6 e4 [ECO D51 QGD: Rochlin variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 Nf3 c6 Rc1 Qa5 Bd2 [ECO D51 QGD: 4.Bg5 Nbd7] d4 d5 c4 e6 Nc3 Nf6 Bg5 N8d7 [ECO D50 QGD: Canal variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 cd Qb6 [ECO D50 QGD: Semi-Tarrasch] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 cd [ECO D50 QGD: Semi-Tarrasch, Primitive Pillsbury variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 Nf3 cd Qd4 [ECO D50 QGD: Semi-Tarrasch, Krause variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 Nf3 cd Nd4 e5 N4b5 a6 Qa4 [ECO D50 QGD: Been-Koomen variation] d4 d5 c4 e6 Nc3 Nf6 Bg5 c5 [ECO D50 QGD: 4.Bg5] d4 d5 c4 e6 Nc3 Nf6 Bg5 [ECO D49 QGD semi-Slav: Meran, Rellstab attack] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab o-o Qd5 Qe2 Ba6 Bg5 [ECO D49 QGD semi-Slav: Meran, Sozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab o-o [ECO D49 QGD semi-Slav: Meran, Stahlberg variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 Ne5 ab Qf3 [ECO D49 QGD semi-Slav: Meran, Sozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ne5 [ECO D49 QGD semi-Slav: Meran, Rabinovich variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 Ng4 [ECO D49 QGD semi-Slav: Meran, Blumenfeld variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 cd Nb5 [ECO D48 QGD semi-Slav: Meran, old main line] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 e5 [ECO D48 QGD semi-Slav: Meran, Reynolds' variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 d5 [ECO D48 QGD semi-Slav: Meran] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 c5 [ECO D48 QGD semi-Slav: Meran, Pir\'c variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 e4 b4 [ECO D48 QGD semi-Slav: Meran, 8...a6] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 a6 [ECO D47 QGD semi-Slav: Meran, Wade variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 Bb7 [ECO D47 QGD semi-Slav: neo-Meran ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 Bd3 b4 [ECO D47 QGD semi-Slav: Meran variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 b5 [ECO D47 QGD semi-Slav: 7.Bc4] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 dc Bc4 [ECO D46 QGD semi-Slav: Chigorin defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Bd6 [ECO D46 QGD semi-Slav: Romih variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Bb4 [ECO D46 QGD semi-Slav: Bogolyubov variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 Be7 [ECO D46 QGD semi-Slav: 6.Bd3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Bd3 [ECO D45 QGD semi-Slav: Rubinstein system] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Ne5 [ECO D45 QGD semi-Slav: Stoltz variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 Qc2 [ECO D45 QGD semi-Slav: 5...Nd7] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 N8d7 [ECO D45 QGD semi-Slav: accelerated Meran ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 a6 [ECO D45 QGD semi-Slav: stonewall defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Ne4 Bd3 f5 [ECO D45 QGD semi-Slav: 5.e3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 [ECO D44 QGD semi-Slav: anti-Meran, Alatortsev system] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 Nd5 [ECO D44 QGD semi-Slav: anti-Meran, Szab\'o variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 hg Bg5 N8d7 Qf3 [ECO D44 QGD semi-Slav: anti-Meran, Lilienthal variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 hg Bg5 N8d7 g3 [ECO D44 QGD semi-Slav: anti-Meran gambit] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 Ng5 [ECO D44 QGD semi-Slav: Ekstrom variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 b5 e5 h6 Bh4 g5 ef gh Ne5 [ECO D44 QGD semi-Slav: Botvinnik system ] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc e4 [ECO D44 QGD semi-Slav: 5.Bg5 dc] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dc [ECO D43 QGD semi-Slav: Hastings variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 h6 Bf6 Qf6 Qb3 [ECO D43 QGD semi-Slav] d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 [ECO D42 QGD: Semi-Tarrasch, 7.Bd3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e3 Nc6 Bd3 [ECO D41 QGD: Semi-Tarrasch with e3] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e3 [ECO D41 QGD: Semi-Tarrasch, San Sebastian variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e4 Nc3 bc cd cd Bb4 Bd2 Qa5 [ECO D41 QGD: Semi-Tarrasch, Kmoch variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd Nd5 e4 Nc3 bc cd cd Bb4 Bd2 Bd2 Qd2 o-o Bb5 [ECO D41 QGD: Semi-Tarrasch, 5.cd] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cd [ECO D40 QGD: Semi-Tarrasch defence, Pillsbury variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 Bg5 [ECO D40 QGD: Semi-Tarrasch, Levenfish variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 e3 Nc6 Bd3 Bd6 o-o o-o Qe2 Qe7 dc Bc5 e4 [ECO D40 QGD: Semi-Tarrasch, symmetrical variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 e3 Nc6 Bd3 Bd6 o-o o-o [ECO D40 QGD: Semi-Tarrasch defence] d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 [ECO D39 QGD: Ragozin, Vienna variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 Bg5 dc [ECO D38 QGD: Ragozin variation] d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 [ECO D37 QGD: classical variation ] d4 d5 c4 e6 Nc3 Nf6 Nf3 Be7 Bf4 [ECO D37 QGD: 4.Nf3] d4 d5 c4 e6 Nc3 Nf6 Nf3 [ECO D36 QGD: exchange, positional line, 6.Qc2] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 c6 Qc2 [ECO D35 QGD: exchange, positional line, 5...c6] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 c6 [ECO D35 QGD: exchange, chameleon variation] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 Be7 e3 o-o Bd3 N8d7 Qc2 Re8 N1e2 Nf8 o-o-o [ECO D35 QGD: exchange, positional line] d4 d5 c4 e6 Nc3 Nf6 cd ed Bg5 [ECO D35 QGD: exchange, S\"amisch variation] d4 d5 c4 e6 Nc3 Nf6 cd ed Nf3 N8d7 Bf4 [ECO D35 QGD: exchange variation] d4 d5 c4 e6 Nc3 Nf6 cd [ECO D35 QGD: Harrwitz attack] d4 d5 c4 e6 Nc3 Nf6 Bf4 [ECO D35 QGD: 3...Nf6] d4 d5 c4 e6 Nc3 Nf6 [ECO D34 QGD: Tarrasch, Stoltz variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 Be6 Rc1 b6 [ECO D34 QGD: Tarrasch, Bogolyubov variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 Be6 Rc1 c4 [ECO D34 QGD: Tarrasch, Prague variation, 9.Bg5] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o Bg5 [ECO D34 QGD: Tarrasch, R\'eti variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o dc Bc5 Na4 [ECO D34 QGD: Tarrasch, Prague variation, Normal position] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 o-o o-o [ECO D34 QGD: Tarrasch, Prague variation, 7...Be7] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Be7 [ECO D33 QGD: Tarrasch, Wagner variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 Bg2 Bg4 [ECO D33 QGD: Tarrasch, Prague variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 Nf6 [ECO D33 QGD: Tarrasch, Schlechter-Rubinstein system, Rey Ardid variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 c4 e4 [ECO D33 QGD: Tarrasch, Folkestone variation] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 c4 [ECO D33 QGD: Tarrasch, Schlechter-Rubinstein system] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 Nc6 g3 [ECO D32 QGD: Tarrasch defence] d4 d5 c4 e6 Nc3 c5 cd ed Nf3 [ECO D32 QGD: Tarrasch defence, Marshall gambit] d4 d5 c4 e6 Nc3 c5 cd ed e4 [ECO D32 QGD: Tarrasch defence, Tarrasch gambit] d4 d5 c4 e6 Nc3 c5 cd ed dc d4 Na4 b5 [ECO D32 QGD: Tarrasch defence, 4.cd ed] d4 d5 c4 e6 Nc3 c5 cd ed [ECO D32 QGD: Tarrasch, von Hennig-Schara gambit] d4 d5 c4 e6 Nc3 c5 cd cd [ECO D32 QGD: Tarrasch defence] d4 d5 c4 e6 Nc3 c5 [ECO D31 QGD: semi-Slav, Marshall gambit] d4 d5 c4 e6 Nc3 c6 e4 [ECO D31 QGD: semi-Slav, Abrahams variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 a5 [ECO D31 QGD: semi-Slav, Junge variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 Qb6 [ECO D31 QGD: semi-Slav, Koomen variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc a4 Bb4 e3 b5 Bd2 Qe7 [ECO D31 QGD: semi-Slav, Noteboom variation] d4 d5 c4 e6 Nc3 c6 Nf3 dc [ECO D31 QGD: semi-Slav] d4 d5 c4 e6 Nc3 c6 [ECO D31 QGD: Charousek variation] d4 d5 c4 e6 Nc3 Be7 [ECO D31 QGD: Alapin variation] d4 d5 c4 e6 Nc3 b6 [ECO D31 QGD: Janowski variation] d4 d5 c4 e6 Nc3 a6 [ECO D31 QGD: 3.Nc3] d4 d5 c4 e6 Nc3 [ECO D30 QGD: Hastings variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 h6 Bf6 Qf6 Nc3 c6 Qb3 [ECO D30 QGD: Capablanca-Duras variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 h6 [ECO D30 QGD: Vienna variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 Bb4 [ECO D30 QGD: Capablanca variation] d4 d5 c4 e6 Nf3 Nf6 Bg5 N8d7 e3 c6 N1d2 [ECO D30 QGD] d4 d5 c4 e6 Nf3 Nf6 Bg5 [ECO D30 QGD: Spielmann variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 g6 [ECO D30 QGD Slav: Semmering variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 N8d7 Bd3 c5 [ECO D30 QGD Slav] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 N8d7 [ECO D30 QGD: Stonewall variation] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 Ne4 Bd3 f5 [ECO D30 QGD Slav] d4 d5 c4 e6 Nf3 Nf6 e3 c6 N1d2 [ECO D30 Queen's gambit declined] d4 d5 c4 e6 [ECO D29 QGA: classical, Smyslov variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Bb7 Rd1 N8d7 Nc3 Bd6 [ECO D29 QGA: classical, 8...Bb7] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Bb7 [ECO D28 QGA: classical, Flohr variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 Bb3 Nc6 Rd1 c4 Bc2 Nb4 Nc3 Nc2 Qc2 Bb7 d5 Qc7 [ECO D28 QGA: classical, 7...b5] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 b5 [ECO D28 QGA: classical, 7.Qe2] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 Qe2 [ECO D27 QGA: classical, Geller variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 e4 [ECO D27 QGA: classical, Rubinstein variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 a4 [ECO D27 QGA: classical, 6...a6] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o a6 [ECO D26 QGA: classical, Steinitz variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o cd [ECO D26 QGA: classical variation, 6.O-O] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 o-o [ECO D26 QGA: classical, Furman variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 Qe2 a6 dc Bc5 o-o Nc6 e4 b5 e5 [ECO D26 QGA: classical variation] d4 d5 c4 dc Nf3 Nf6 e3 e6 Bc4 c5 [ECO D26 QGA: 4...e6] d4 d5 c4 dc Nf3 Nf6 e3 e6 [ECO D25 QGA, Flohr variation] d4 d5 c4 dc Nf3 Nf6 e3 Be6 [ECO D25 QGA, Janowsky-Larsen variation] d4 d5 c4 dc Nf3 Nf6 e3 Bg4 [ECO D25 QGA, Smyslov variation] d4 d5 c4 dc Nf3 Nf6 e3 g6 [ECO D25 QGA, 4.e3] d4 d5 c4 dc Nf3 Nf6 e3 [ECO D24 QGA, Bogolyubov variation] d4 d5 c4 dc Nf3 Nf6 Nc3 a6 e4 [ECO D24 QGA, 4.Nc3] d4 d5 c4 dc Nf3 Nf6 Nc3 [ECO D23 QGA: Mannheim variation] d4 d5 c4 dc Nf3 Nf6 Qa4 [ECO D23 Queen's gambit accepted] d4 d5 c4 dc Nf3 Nf6 [ECO D21 QGA: Alekhine defense, Borisenko-Furman variation] d4 d5 c4 dc Nf3 a6 e4 [ECO D22 QGA: Haberditz variation] d4 d5 c4 dc Nf3 a6 e3 b5 [ECO D22 QGA: Alekhine defence, Alatortsev variation] d4 d5 c4 dc Nf3 a6 e3 Bg4 Bc4 e6 d5 [ECO D22 QGA: Alekhine defence] d4 d5 c4 dc Nf3 a6 [ECO D21 QGA: Ericson variation] d4 d5 c4 dc Nf3 b5 [ECO D21 QGA: 3.Nf3] d4 d5 c4 dc Nf3 [ECO D20 QGA: Schwartz defence] d4 d5 c4 dc e4 f5 [ECO D20 QGA: Linares variation] d4 d5 c4 dc e4 c5 d5 Nf6 Nc3 b5 [ECO D20 QGA: 3.e4] d4 d5 c4 dc e4 [ECO D20 Queen's gambit accepted] d4 d5 c4 dc [ECO D19 QGD Slav: Dutch, S\"amisch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o o-o Qe2 Ne4 g4 [ECO D19 QGD Slav: Dutch variation, main line] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o o-o Qe2 [ECO D19 QGD Slav: Dutch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 e6 Bc4 Bb4 o-o [ECO D18 QGD Slav: Dutch, Lasker variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 Na6 [ECO D18 QGD Slav: Dutch variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 e3 [ECO D17 QGD Slav: Wiesbaden variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 e6 [ECO D17 QGD Slav: Carlsbad variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 N8d7 Nc4 Qc7 g3 e5 [ECO D17 QGD Slav: Krause attack] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 Ne5 [ECO D17 QGD Slav: Czech defence] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bf5 [ECO D16 QGD Slav: Steiner variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Bg4 [ECO D16 QGD Slav: Soultanb\'eieff variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 e6 [ECO D16 QGD Slav: Smyslov variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 Na6 e4 Bg4 [ECO D16 QGD Slav accepted: Alapin variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc a4 [ECO D15 QGD Slav: Tolush-Geller gambit] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e4 b5 e5 [ECO D15 QGD Slav: Slav gambit] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e4 [ECO D15 QGD Slav: 5.e3 ] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc e3 [ECO D15 QGD Slav accepted] d4 d5 c4 c6 Nf3 Nf6 Nc3 dc [ECO D15 QGD Slav: Schlechter variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 g6 [ECO D15 QGD Slav: S\"uchting variation] d4 d5 c4 c6 Nf3 Nf6 Nc3 Qb6 [ECO D15 QGD Slav: 4.Nc3] d4 d5 c4 c6 Nf3 Nf6 Nc3 [ECO D14 QGD Slav: exchange, Trifunovi\'c variation] d4 d5 c4 c6 Nf3 Nf6 cd cd Nc3 Nc6 Bf4 Bf5 e3 e6 Qb3 Bb4 [ECO D14 QGD Slav: exchange variation, 6.Bf4 Bf5] d4 d5 c4 c6 Nf3 Nf6 cd cd Nc3 Nc6 Bf4 Bf5 [ECO D13 QGD Slav: exchange variation] d4 d5 c4 c6 Nf3 Nf6 cd cd [ECO D12 QGD Slav: Amsterdam variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Nc3 e6 Ne5 N6d7 [ECO D12 QGD Slav: exchange variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Nc3 [ECO D12 QGD Slav: Landau variation] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 cd cd Qb3 Qc8 Bd2 e6 Na3 [ECO D12 QGD Slav: 4.e3 Bf5] d4 d5 c4 c6 Nf3 Nf6 e3 Bf5 [ECO D11 QGD Slav: 4.e3] d4 d5 c4 c6 Nf3 Nf6 e3 [ECO D11 QGD Slav: Breyer variation] d4 d5 c4 c6 Nf3 Nf6 N1d2 [ECO D11 QGD Slav: 3.Nf3] d4 d5 c4 c6 Nf3 [ECO D10 QGD Slav defence: exchange variation] d4 d5 c4 c6 cd [ECO D10 QGD Slav: Winawer counter-gambit] d4 d5 c4 c6 Nc3 e5 [ECO D10 QGD Slav defence, Alekhine variation] d4 d5 c4 c6 Nc3 dc e4 [ECO D10 QGD Slav defence] d4 d5 c4 c6 [ECO D09 QGD: Albin counter-gambit, 5.g3] d4 d5 c4 e5 de d4 Nf3 Nc6 g3 [ECO D08 QGD: Albin counter-gambit, Balogh variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 Qe7 [ECO D08 QGD: Albin counter-gambit, Janowski variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 f6 [ECO D08 QGD: Albin counter-gambit, Kr\'enosz variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 Bg4 h3 Bf3 Nf3 Bb4 Bd2 Qe7 [ECO D08 QGD: Albin counter-gambit, Alapin variation] d4 d5 c4 e5 de d4 Nf3 Nc6 N1d2 [ECO D08 QGD: Albin counter-gambit] d4 d5 c4 e5 de d4 Nf3 [ECO D08 QGD: Albin counter-gambit, Lasker trap] d4 d5 c4 e5 de d4 e3 Bb4 Bd2 de [ECO D08 QGD: Albin counter-gambit] d4 d5 c4 e5 [ECO D07 QGD: Chigorin defence, Janowski variation] d4 d5 c4 Nc6 Nc3 dc Nf3 [ECO D07 QGD: Chigorin defence] d4 d5 c4 Nc6 [ECO D06 QGD: symmetrical defence] d4 d5 c4 c5 [ECO D06 QGD: Marshall defence] d4 d5 c4 Nf6 [ECO D06 QGD: Grau defence] d4 d5 c4 Bf5 [ECO D06 Queen's gambit declined] d4 d5 c4 [ECO D05 Colle system] d4 d5 Nf3 Nf6 e3 e6 Bd3 c5 c3 [ECO D05 Queen's pawn game, Rubinstein variation] d4 d5 Nf3 Nf6 e3 e6 Bd3 c5 b3 [ECO D05 Queen's pawn game] d4 d5 Nf3 Nf6 e3 e6 Bd3 [ECO D05 Queen's pawn game, Zukertort variation] d4 d5 Nf3 Nf6 e3 e6 N1d2 c5 b3 [ECO D05 Queen's pawn game] d4 d5 Nf3 Nf6 e3 e6 [ECO D04 Queen's pawn game] d4 d5 Nf3 Nf6 e3 [ECO D03 Torre attack ] d4 d5 Nf3 Nf6 Bg5 [ECO D02 Queen's bishop game] d4 d5 Nf3 Nf6 Bf4 [ECO D02 Queen's pawn game] d4 d5 Nf3 Nf6 [ECO D02 Queen's pawn game, Krause variation] d4 d5 Nf3 c5 [ECO D02 Queen's pawn game, Chigorin variation] d4 d5 Nf3 Nc6 [ECO D02 Queen's pawn game] d4 d5 Nf3 [ECO D01 Richter-Veresov attack, Richter variation] d4 d5 Nc3 Nf6 Bg5 Bf5 f3 [ECO D01 Richter-Veresov attack, Veresov variation] d4 d5 Nc3 Nf6 Bg5 Bf5 Bf6 [ECO D01 Richter-Veresov attack] d4 d5 Nc3 Nf6 Bg5 [ECO D00 Blackmar-Diemer: Lemberg counter-gambit] d4 d5 Nc3 Nf6 e4 e5 [ECO D00 Blackmar-Diemer: Euwe defence] d4 d5 Nc3 Nf6 e4 de f3 ef Nf3 e6 [ECO D00 Blackmar-Diemer gambit] d4 d5 Nc3 Nf6 e4 [ECO D00 Queen's pawn: Anti-Veresov] d4 d5 Nc3 Bg4 [ECO D00 Queen's pawn: Chigorin variation] d4 d5 Nc3 [ECO D00 Queen's pawn: stonewall attack] d4 d5 e3 Nf6 Bd3 [ECO D00 Blackmar gambit] d4 d5 e4 [ECO D00 Levitsky attack ] d4 d5 Bg5 [ECO D00 Queen's pawn, Mason variation, Steinitz counter-gambit] d4 d5 Bf4 c5 [ECO D00 Queen's pawn, Mason variation] d4 d5 Bf4 [ECO D00 Queen's pawn game] d4 d5 [ECO E59 Nimzo-Indian: 4.e3, main line] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 Bc3 bc dc Bc4 [ECO E58 Nimzo-Indian: 4.e3, main line with 8...Bxc3] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 Bc3 bc [ECO E57 Nimzo-Indian: 4.e3, main line with 8...dc and 9...cd] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 a3 dc Bc4 cd [ECO E56 Nimzo-Indian: 4.e3, main line with 7...Nc6] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o Nc6 [ECO E55 Nimzo-Indian: 4.e3, Gligori\'c system, Bronstein variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 N8d7 [ECO E54 Nimzo-Indian: 4.e3, Gligori\'c system, Smyslov variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 Qe7 [ECO E54 Nimzo-Indian: 4.e3, Gligori\'c system with 7...dc] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o dc Bc4 [ECO E53 Nimzo-Indian: 4.e3, Gligori\'c system with 7...Nbd7] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o N8d7 [ECO E53 Nimzo-Indian: 4.e3, Keres variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 o-o b6 [ECO E53 Nimzo-Indian: 4.e3, main line with ...c5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 c5 [ECO E52 Nimzo-Indian: 4.e3, main line with ...b6] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 b6 [ECO E51 Nimzo-Indian: 4.e3, Ragozin variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 Bd3 Nc6 o-o dc [ECO E51 Nimzo-Indian: 4.e3 e8g8, 5.Nf3 d7d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 d5 [ECO E50 Nimzo-Indian: 4.e3 e8g8, 5.Nf3, without ...d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Nf3 [ECO E49 Nimzo-Indian: 4.e3, Botvinnik system] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 d5 a3 Bc3 bc [ECO E48 Nimzo-Indian: 4.e3 O-O, 5.Bd3 d5] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 d5 [ECO E47 Nimzo-Indian: 4.e3 O-O, 5.Bd3] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Bd3 [ECO E46 Nimzo-Indian: Simagin variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Ne2 d5 a3 Bd6 [ECO E46 Nimzo-Indian: Reshevsky variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o Ne2 [ECO E46 Nimzo-Indian: 4.e3 O-O] d4 Nf6 c4 e6 Nc3 Bb4 e3 o-o [ECO E45 Nimzo-Indian: 4.e3, Bronstein variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 Ba6 [ECO E44 Nimzo-Indian: Fischer variation, 5.Ne2] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 [ECO E43 Nimzo-Indian: Fischer variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 [ECO E42 Nimzo-Indian: 4.e3 c5, 5.Ne2 ] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Ne2 [ECO E41 Nimzo-Indian: e3, H\"ubner variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Bd3 Nc6 Nf3 Bc3 bc d6 [ECO E41 Nimzo-Indian: 4.e3 c5] d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 [ECO E40 Nimzo-Indian: 4.e3, Taimanov variation] d4 Nf6 c4 e6 Nc3 Bb4 e3 Nc6 [ECO E40 Nimzo-Indian: 4.e3] d4 Nf6 c4 e6 Nc3 Bb4 e3 [ECO E39 Nimzo-Indian: classical, Pir\'c variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 dc o-o [ECO E38 Nimzo-Indian: classical, 4...c5] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 [ECO E37 Nimzo-Indian: classical, San Remo variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 Qc2 Nc6 e3 e5 [ECO E37 Nimzo-Indian: classical, Noa variation, main line, 7.Qc2] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 Qc2 [ECO E36 Nimzo-Indian: classical, Noa variation, main line] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Ne4 [ECO E36 Nimzo-Indian: classical, Botvinnik variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bc3 Qc3 Nc6 [ECO E36 Nimzo-Indian: classical, Noa variation, 5.a3] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 [ECO E35 Nimzo-Indian: classical, Noa variation, 5.cd ed] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 cd ed [ECO E34 Nimzo-Indian: classical, Noa variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 [ECO E33 Nimzo-Indian: classical, Milner-Barry variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6 Nf3 d6 [ECO E33 Nimzo-Indian: classical, 4...Nc6] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6 [ECO E32 Nimzo-Indian: classical, Adorjan gambit] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 o-o a3 Bc3 Qc3 b5 [ECO E32 Nimzo-Indian: classical variation] d4 Nf6 c4 e6 Nc3 Bb4 Qc2 [ECO E31 Nimzo-Indian: Leningrad, main line] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 d6 [ECO E30 Nimzo-Indian: Leningrad, ...b5 gambit] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 b5 [ECO E30 Nimzo-Indian: Leningrad variation] d4 Nf6 c4 e6 Nc3 Bb4 Bg5 [ECO E29 Nimzo-Indian: S\"amisch, Capablanca variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 c5 Bd3 Nc6 Ne2 b6 e4 Ne8 [ECO E29 Nimzo-Indian: S\"amisch, main line] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 c5 Bd3 Nc6 [ECO E28 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o e3 [ECO E27 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc o-o [ECO E26 Nimzo-Indian: S\"amisch, O'Kelly variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 e3 b6 [ECO E26 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 e3 [ECO E25 Nimzo-Indian: S\"amisch, Romanovsky variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd Nd5 dc f5 [ECO E25 Nimzo-Indian: S\"amisch, Keres variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd Nd5 dc [ECO E25 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 cd [ECO E24 Nimzo-Indian: S\"amisch, Botvinnik variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc c5 f3 d5 e3 o-o cd Nd5 [ECO E24 Nimzo-Indian: S\"amisch variation] d4 Nf6 c4 e6 Nc3 Bb4 a3 Bc3 bc [ECO E23 Nimzo-Indian: Spielmann, St\aa hlberg variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nc5 Qc2 f5 g3 [ECO E23 Nimzo-Indian: Spielmann, San Remo variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nc5 [ECO E23 Nimzo-Indian: Spielmann, Karlsbad variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 Nf3 Ne4 Bd2 Nd2 [ECO E23 Nimzo-Indian: Spielmann, 4...c5, 5.dc Nc6] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dc Nc6 [ECO E22 Nimzo-Indian: Spielmann variation] d4 Nf6 c4 e6 Nc3 Bb4 Qb3 [ECO E21 Nimzo-Indian: three knights, Euwe variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 c5 d5 Ne4 [ECO E21 Nimzo-Indian: three knights, Korchnoi variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 c5 d5 [ECO E21 Nimzo-Indian: three knights variation] d4 Nf6 c4 e6 Nc3 Bb4 Nf3 [ECO E20 Nimzo-Indian: Romanishin-Kasparov system] d4 Nf6 c4 e6 Nc3 Bb4 g3 [ECO E20 Nimzo-Indian: Mikenas attack] d4 Nf6 c4 e6 Nc3 Bb4 Qd3 [ECO E20 Nimzo-Indian: Kmoch variation] d4 Nf6 c4 e6 Nc3 Bb4 f3 [ECO E20 Nimzo-Indian defence] d4 Nf6 c4 e6 Nc3 Bb4 [ECO E19 Queen's Indian: old main line, 9.Qxc3] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o Nc3 Ne4 Qc2 Nc3 Qc3 [ECO E18 Queen's Indian: old main line, 7.Nc3] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o Nc3 [ECO E17 Queen's Indian: Euwe variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o o-o b3 [ECO E17 Queen's Indian: old main line, 6.O-O] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 o-o [ECO E17 Queen's Indian: Opo\v censky variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 Nc3 Ne4 Bd2 [ECO E17 Queen's Indian: anti-Queen's Indian system] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 Nc3 [ECO E17 Queen's Indian: 5.Bg2 Be7] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 [ECO E16 Queen's Indian: Riumin variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 Bd2 Be7 [ECO E16 Queen's Indian: Yates variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 Bd2 a5 [ECO E16 Queen's Indian: Capablanca variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4 [ECO E15 Queen's Indian: B\"urger variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 c5 d5 ed Ng5 [ECO E15 Queen's Indian: Rubinstein variation] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 c5 d5 ed Nh4 [ECO E15 Queen's Indian: 4.g3 Bb7] d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 [ECO E15 Queen's Indian: Nimzovich variation ] d4 Nf6 c4 e6 Nf3 b6 g3 Ba6 [ECO E15 Queen's Indian: 4.g3] d4 Nf6 c4 e6 Nf3 b6 g3 [ECO E14 Queen's Indian: Averbakh variation] d4 Nf6 c4 e6 Nf3 b6 e3 Bb7 Bd3 c5 o-o Be7 b3 o-o Bb2 cd Nd4 [ECO E14 Queen's Indian: 4.e3] d4 Nf6 c4 e6 Nf3 b6 e3 [ECO E13 Queen's Indian: 4.Nc3, main line] d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 Bb4 [ECO E12 Queen's Indian: 4.Nc3, Botvinnik variation] d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 g5 Bg3 Nh5 [ECO E12 Queen's Indian: 4.Nc3] d4 Nf6 c4 e6 Nf3 b6 Nc3 [ECO E12 Queen's Indian: Petrosian system] d4 Nf6 c4 e6 Nf3 b6 a3 [ECO E12 Queen's Indian: Miles variation] d4 Nf6 c4 e6 Nf3 b6 Bf4 [ECO E12 Queen's Indian defence] d4 Nf6 c4 e6 Nf3 b6 [ECO E11 Bogo-Indian defence, Gr\"unfeld variation] d4 Nf6 c4 e6 Nf3 Bb4 N1d2 [ECO E11 Bogo-Indian defence, Nimzovich variation] d4 Nf6 c4 e6 Nf3 Bb4 Bd2 Qe7 [ECO E11 Bogo-Indian defence, Monticelli trap] d4 Nf6 c4 e6 Nf3 Bb4 Bd2 Bd2 Qd2 b6 g3 Bb7 Bg2 o-o Nc3 Ne4 Qc2 Nc3 Ng5 [ECO E11 Bogo-Indian defence] d4 Nf6 c4 e6 Nf3 Bb4 [ECO E10 D\"ory defence] d4 Nf6 c4 e6 Nf3 Ne4 [ECO E10 Dzindzikhashvili defence] d4 Nf6 c4 e6 Nf3 a6 [ECO E10 Blumenfeld counter-gambit, Spielmann variation] d4 Nf6 c4 e6 Nf3 c5 d5 b5 Bg5 ed cd h6 [ECO E10 Blumenfeld counter-gambit, Dus-Chotimursky variation] d4 Nf6 c4 e6 Nf3 c5 d5 b5 Bg5 [ECO E10 Blumenfeld counter-gambit accepted] d4 Nf6 c4 e6 Nf3 c5 d5 b5 de fe cb d5 [ECO E10 Blumenfeld counter-gambit] d4 Nf6 c4 e6 Nf3 c5 d5 b5 [ECO E10 Queen's pawn game] d4 Nf6 c4 e6 Nf3 [ECO E09 Catalan: closed, Sokolsky variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 N1d2 b6 b3 a5 Bb2 Ba6 [ECO E09 Catalan: closed, main line] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 N1d2 [ECO E08 Catalan: closed, Spassky gambit] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 b3 b6 Rd1 Bb7 Nc3 b5 [ECO E08 Catalan: closed, Qc2 & b3] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 b3 [ECO E08 Catalan: closed, Zagoryansky variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 c6 Rd1 b6 a4 [ECO E08 Catalan: closed, 7.Qc2] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Qc2 [ECO E07 Catalan: closed, Botvinnik variation] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 Nc3 c6 Qd3 [ECO E07 Catalan: closed, 6...Nbd7] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 o-o o-o N8d7 [ECO E06 Catalan: closed, 5.Nf3] d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 [ECO E05 Catalan: open, classical line] d4 Nf6 c4 e6 g3 d5 Bg2 dc Nf3 Be7 [ECO E04 Catalan: open, 5.Nf3] d4 Nf6 c4 e6 g3 d5 Bg2 dc Nf3 [ECO E03 Catalan: open, Alekhine variation] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 N8d7 Qc4 a6 Qc2 [ECO E03 Catalan: open, 5.Qa4 Nbd7, 6.Qxc4] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 N8d7 Qc4 [ECO E02 Catalan: open, 5.Qa4] d4 Nf6 c4 e6 g3 d5 Bg2 dc Qa4 [ECO E01 Catalan: closed] d4 Nf6 c4 e6 g3 d5 Bg2 [ECO E00 Catalan opening] d4 Nf6 c4 e6 g3 [ECO E00 Neo-Indian attack] d4 Nf6 c4 e6 Bg5 [ECO E00 Queen's pawn game] d4 Nf6 c4 e6 [ECO E99 King's Indian: orthodox, Aronin-Taimanov, Benk\"o attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 Nd7 f3 f5 g4 [ECO E99 King's Indian: orthodox, Aronin-Taimanov, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 Nd7 f3 f5 [ECO E98 King's Indian: orthodox, Aronin-Taimanov, 9.Ne1] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 Ne1 [ECO E97 King's Indian: orthodox, Aronin-Taimanov, bayonet attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 d5 Ne7 b4 [ECO E97 King's Indian: orthodox, Aronin-Taimanov variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o Nc6 [ECO E96 King's Indian: orthodox, 7...Nbd7, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 Re1 c6 Bf1 a5 [ECO E95 King's Indian: orthodox, 7...Nbd7, 8.Re1] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 Re1 [ECO E94 King's Indian: orthodox, 7...Nbd7] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o N8d7 [ECO E94 King's Indian: orthodox, Donner variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o c6 [ECO E94 King's Indian: orthodox variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 o-o [ECO E93 King's Indian: Petrosian system, Keres variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 N8d7 Bg5 h6 Bh4 g5 Bg3 Nh5 h4 [ECO E93 King's Indian: Petrosian system, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 N8d7 [ECO E92 King's Indian: Petrosian system, Stein variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 a5 [ECO E92 King's Indian: Petrosian system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 d5 [ECO E92 King's Indian: Gligori\'c-Taimanov system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 Be3 [ECO E92 King's Indian: Andersson variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 de [ECO E92 King's Indian: classical variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 e5 [ECO E91 King's Indian: Kazakh variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 Na6 [ECO E91 King's Indian: 6.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be2 [ECO E90 King's Indian: Zinnowitz variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Bg5 [ECO E90 King's Indian: Larsen variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 o-o Be3 [ECO E90 King's Indian: 5.Nf3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 [ECO E89 King's Indian: S\"amisch, orthodox main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 c6 N1e2 cd [ECO E88 King's Indian: S\"amisch, orthodox, 7.d5 c6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 c6 [ECO E87 King's Indian: S\"amisch, orthodox, Bronstein variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 Nh5 Qd2 Qh4 g3 Ng3 Qf2 Nf1 Qh4 Ne3 Ke2 Nc4 [ECO E87 King's Indian: S\"amisch, orthodox, 7.d5] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 d5 [ECO E86 King's Indian: S\"amisch, orthodox, 7.Nge2 c6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 N1e2 c6 [ECO E85 King's Indian: S\"amisch, orthodox variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 e5 [ECO E84 King's Indian: S\"amisch, Panno main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 a6 Qd2 Rb8 [ECO E83 King's Indian: S\"amisch, Panno formation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 a6 [ECO E83 King's Indian: S\"amisch, Ruban variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 N1e2 Rb8 [ECO E83 King's Indian: S\"amisch, 6...Nc6] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 Nc6 [ECO E82 King's Indian: S\"amisch, double fianchetto variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 b6 [ECO E81 King's Indian: S\"amisch, Byrne variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o Be3 c6 Bd3 a6 [ECO E81 King's Indian: S\"amisch, 5...O-O] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 o-o [ECO E80 King's Indian: S\"amisch variation] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 [ECO E79 King's Indian: Four pawns attack, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 Nf3 cd Nd4 Nc6 Be3 [ECO E78 King's Indian: Four pawns attack, with Be2 and Nf3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 Nf3 [ECO E77 King's Indian: Four pawns attack, Florentine gambit] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 Nf3 ed e5 [ECO E77 King's Indian: Four pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 Nf3 [ECO E77 King's Indian: Six pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 c5 d5 e6 de fe g4 Nc6 h4 [ECO E77 King's Indian: Four pawns attack, 6.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Be2 [ECO E76 King's Indian: Four pawns attack, dynamic line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 o-o Nf3 c5 d5 [ECO E76 King's Indian: Four pawns attack] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 [ECO E75 King's Indian: Averbakh, main line] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 c5 d5 e6 [ECO E74 King's Indian: Averbakh, 6...c5] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 c5 [ECO E73 King's Indian: Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Bg5 [ECO E73 King's Indian: Semi-Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 o-o Be3 [ECO E73 King's Indian: 5.Be2] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 [ECO E72 King's Indian: Pomar system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3 o-o Bg2 e5 N1e2 [ECO E72 King's Indian with e4 & g3] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3 [ECO E71 King's Indian: Makagonov system ] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 h3 [ECO E70 King's Indian: accelerated Averbakh system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Bg5 [ECO E70 King's Indian: Kramer system] d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 N1e2 [ECO E70 King's Indian: 4.e4] d4 Nf6 c4 g6 Nc3 Bg7 e4 [ECO E69 King's Indian: fianchetto, classical main line] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 e4 c6 h3 [ECO E68 King's Indian: fianchetto, classical variation, 8.e4] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 e4 [ECO E67 King's Indian: fianchetto, classical variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 o-o e5 [ECO E67 King's Indian: fianchetto with ...Nd7] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 N8d7 [ECO E66 King's Indian: fianchetto, Yugoslav Panno] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 o-o Nc6 d5 [ECO E65 King's Indian: fianchetto, Yugoslav, 7.O-O] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 o-o [ECO E64 King's Indian: fianchetto, Yugoslav system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c5 [ECO E63 King's Indian: fianchetto, Panno variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o a6 [ECO E62 King's Indian: fianchetto, Simagin variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o Bg4 [ECO E62 King's Indian: fianchetto, lesser Simagin variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o Bf5 [ECO E62 King's Indian: fianchetto, Uhlmann variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 o-o e5 [ECO E62 King's Indian: fianchetto with ...Nc6] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 Nc6 [ECO E62 King's Indian: fianchetto, Kavalek variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c6 o-o Qa5 [ECO E62 King's Indian: fianchetto, Larsen system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 o-o Bg2 c6 o-o Bf5 [ECO E62 King's Indian: fianchetto variation] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 [ECO E61 King's Indian: Smyslov system] d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 Bg5 [ECO E61 King's Indian defence, 3.Nc3] d4 Nf6 c4 g6 Nc3 [ECO D99 Gr\"unfeld defence: Smyslov, Yugoslav variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Qb3 c5 [ECO D99 Gr\"unfeld defence: Smyslov, main line] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Qb3 [ECO D98 Gr\"unfeld: Russian, Keres variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 Be3 N6d7 Be2 Nb6 Qd3 Nc6 o-o-o [ECO D98 Gr\"unfeld: Russian, Smyslov variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Bg4 [ECO D97 Gr\"unfeld: Russian, Prins variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Na6 [ECO D97 Gr\"unfeld: Russian, Byrne variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 Nc6 [ECO D97 Gr\"unfeld: Russian, Levenfish variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 b6 [ECO D97 Gr\"unfeld: Russian, Szabo variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 c6 [ECO D97 Gr\"unfeld: Russian, Alekhine variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 a6 [ECO D97 Gr\"unfeld: Russian variation with e4] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dc Qc4 o-o e4 [ECO D96 Gr\"unfeld: Russian variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 [ECO D95 Gr\"unfeld: Botvinnik variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 e6 [ECO D95 Gr\"unfeld: Pachman variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 dc Bc4 N8d7 Ng5 [ECO D95 Gr\"unfeld with e3 & Qb3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Qb3 [ECO D94 Gr\"unfeld: Flohr defence] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 c6 o-o Bf5 [ECO D94 Gr\"unfeld: Smyslov defence] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 c6 o-o Bg4 [ECO D94 Gr\"unfeld with e3 & Bd3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd3 [ECO D94 Gr\"unfeld: Opo\v censky variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o Bd2 [ECO D94 Gr\"unfeld: Makogonov variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 o-o b4 [ECO D94 Gr\"unfeld: 5.e3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 [ECO D93 Gr\"unfeld with Bf4 & e3] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 o-o e3 [ECO D92 Gr\"unfeld: 5.Bf4] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 [ECO D91 Gr\"unfeld: 5.Bg5] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bg5 [ECO D90 Gr\"unfeld: Flohr variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qa4 [ECO D90 Gr\"unfeld: Three knights variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 [ECO D90 Gr\"unfeld: Schlechter variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 c6 [ECO D90 Gr\"unfeld: Three knights variation] d4 Nf6 c4 g6 Nc3 d5 Nf3 [ECO D89 Gr\"unfeld: exchange, Sokolsky variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd Bg4 f3 Na5 Bd3 Be6 d5 [ECO D89 Gr\"unfeld: Spassky variation, main line, 13.Bd3] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd Bg4 f3 Na5 Bd3 Be6 [ECO D88 Gr\"unfeld: Spassky variation, main line, 10...cd, 11.cd] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 cd cd [ECO D87 Gr\"unfeld: exchange, Seville variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 o-o Nc6 Be3 Bg4 f3 Na5 Bf7 [ECO D87 Gr\"unfeld: exchange, Spassky variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 c5 [ECO D86 Gr\"unfeld: exchange, Simagin's improved variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 Nc6 [ECO D86 Gr\"unfeld: exchange, Simagin's lesser variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 b6 [ECO D86 Gr\"unfeld: exchange, Larsen variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 o-o Ne2 Qd7 o-o b6 [ECO D86 Gr\"unfeld: exchange, classical variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Bc4 [ECO D85 Gr\"unfeld: modern exchange variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 e4 Nc3 bc Bg7 Nf3 [ECO D85 Gr\"unfeld: exchange variation] d4 Nf6 c4 g6 Nc3 d5 cd Nd5 [ECO D84 Gr\"unfeld: Gr\"unfeld gambit accepted] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o cd Nd5 Nd5 Qd5 Bc7 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit, Botvinnik variation] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o Rc1 c5 dc Be6 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit, Capablanca variation] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o Rc1 [ECO D83 Gr\"unfeld: Gr\"unfeld gambit] d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 o-o [ECO D82 Gr\"unfeld: 4.Bf4] d4 Nf6 c4 g6 Nc3 d5 Bf4 [ECO D81 Gr\"unfeld: Russian variation] d4 Nf6 c4 g6 Nc3 d5 Qb3 [ECO D80 Gr\"unfeld: Lundin variation] d4 Nf6 c4 g6 Nc3 d5 Bg5 Ne4 Ne4 de Qd2 c5 [ECO D80 Gr\"unfeld: Stockholm variation] d4 Nf6 c4 g6 Nc3 d5 Bg5 [ECO D80 Gr\"unfeld: Spike gambit] d4 Nf6 c4 g6 Nc3 d5 g4 [ECO D80 Gr\"unfeld defence] d4 Nf6 c4 g6 Nc3 d5 [ECO D79 Neo-Gr\"unfeld, 6.O-O, main line] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o c6 cd cd [ECO D78 Neo-Gr\"unfeld, 6.O-O c6] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o c6 [ECO D77 Neo-Gr\"unfeld, 6.O-O] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o o-o [ECO D76 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O Nb6] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o Nb6 [ECO D75 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.Nc3] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o c5 Nc3 [ECO D75 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O c5, 8.dc] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o c5 dc [ECO D74 Neo-Gr\"unfeld, 6.cd Nxd5, 7.O-O] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 o-o cd Nd5 o-o [ECO D73 Neo-Gr\"unfeld, 5.Nf3] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 [ECO D72 Neo-Gr\"unfeld, 5.cd, main line] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cd Nd5 e4 Nb6 Ne2 [ECO D71 Neo-Gr\"unfeld, 5.cd] d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cd Nd5 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 g3 d5 [ECO E60 King's Indian: 3.g3, counterthrust variation] d4 Nf6 c4 g6 g3 Bg7 Bg2 d5 [ECO E60 King's Indian: 3.g3] d4 Nf6 c4 g6 g3 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 Nf3 d5 [ECO E60 King's Indian, 3.Nf3] d4 Nf6 c4 g6 Nf3 [ECO E60 Queen's pawn: Mengarini attack] d4 Nf6 c4 g6 Qc2 [ECO E60 King's Indian: Danube gambit] d4 Nf6 c4 g6 d5 b5 [ECO E60 King's Indian: Anti-Gr\"unfeld] d4 Nf6 c4 g6 d5 [ECO D70 Neo-Gr\"unfeld defence] d4 Nf6 c4 g6 f3 d5 [ECO E60 King's Indian defence] d4 Nf6 c4 g6 [ECO A79 Benoni: classical, 11.f3] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 Na6 f3 [ECO A78 Benoni: classical with ...Re8 and ...Na6] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 Na6 [ECO A77 Benoni: classical, 9...Re8, 10.Nd2] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 Nd2 [ECO A76 Benoni: classical, 9...Re8] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o Re8 [ECO A75 Benoni: classical with ...a6 and 10...Bg4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o a6 a4 Bg4 [ECO A74 Benoni: classical, 9...a6, 10.a4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o a6 a4 [ECO A73 Benoni: classical, 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o o-o [ECO A72 Benoni: classical without 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 o-o [ECO A70 Benoni: classical without 9.O-O] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Be2 [ECO A71 Benoni: classical, 8.Bg5] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 Bg7 Bg5 [ECO A70 Benoni: classical with e4 and Nf3] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 Nf3 [ECO A67 Benoni: Taimanov variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Bb5 [ECO A66 Benoni: Mikenas variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 e5 [ECO A69 Benoni: four pawns attack, main line] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Nf3 o-o Be2 Re8 [ECO A68 Benoni: four pawns attack] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 Bg7 Nf3 o-o [ECO A66 Benoni: pawn storm variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 g6 f4 [ECO A65 Benoni: 6.e4] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 e4 [ECO A64 Benoni: fianchetto, 11...Re8] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o o-o N8d7 Nd2 a6 a4 Re8 [ECO A63 Benoni: fianchetto, 9...Nbd7] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o o-o N8d7 [ECO A62 Benoni: fianchetto variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 Bg7 Bg2 o-o [ECO A61 Benoni: fianchetto variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 g3 [ECO A61 Benoni: Nimzovich variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 Nd2 [ECO A61 Benoni: Uhlmann variation] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 Bg5 [ECO A61 Benoni defence] d4 Nf6 c4 c5 d5 e6 Nc3 ed cd d6 Nf3 g6 [ECO A60 Benoni defence] d4 Nf6 c4 c5 d5 e6 [ECO A59 Benk\"o gambit: main line] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 g3 Bg7 Kg2 o-o Nf3 [ECO A59 Benk\"o gambit] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 g3 [ECO A59 Benk\"o gambit: Ne2 variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 Bf1 Kf1 g6 N1e2 [ECO A59 Benk\"o gambit: 7.e4] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 e4 [ECO A58 Benk\"o gambit: fianchetto variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 Nf3 g6 g3 [ECO A58 Benk\"o gambit: Nd2 variation] d4 Nf6 c4 c5 d5 b5 cb a6 ba Ba6 Nc3 d6 Nf3 g6 Nd2 [ECO A58 Benk\"o gambit accepted] d4 Nf6 c4 c5 d5 b5 cb a6 ba [ECO A57 Benk\"o gambit: Nescaf\'e Frapp\'e attack] d4 Nf6 c4 c5 d5 b5 cb a6 Nc3 ab e4 b4 Nb5 d6 Bc4 [ECO A57 Benk\"o gambit: Zaitsev system] d4 Nf6 c4 c5 d5 b5 cb a6 Nc3 [ECO A57 Benk\"o gambit half accepted] d4 Nf6 c4 c5 d5 b5 cb a6 [ECO A57 Benk\"o gambit] d4 Nf6 c4 c5 d5 b5 [ECO A56 Czech Benoni: King's Indian system] d4 Nf6 c4 c5 d5 e5 Nc3 d6 e4 g6 [ECO A56 Czech Benoni defence] d4 Nf6 c4 c5 d5 e5 [ECO A56 Vulture defence] d4 Nf6 c4 c5 d5 Ne4 [ECO A56 Benoni defence, Hromodka system] d4 Nf6 c4 c5 d5 d6 [ECO A56 Benoni defence] d4 Nf6 c4 c5 [ECO A55 Old Indian: main line] d4 Nf6 c4 d6 Nc3 e5 Nf3 N8d7 e4 [ECO A54 Old Indian: Ukrainian variation, 4.Nf3] d4 Nf6 c4 d6 Nc3 e5 Nf3 [ECO A54 Old Indian: Dus-Khotimirsky variation] d4 Nf6 c4 d6 Nc3 e5 e3 N8d7 Bd3 [ECO A54 Old Indian: Ukrainian variation] d4 Nf6 c4 d6 Nc3 e5 [ECO A53 Old Indian: Janowski variation] d4 Nf6 c4 d6 Nc3 Bf5 [ECO A53 Old Indian defence] d4 Nf6 c4 d6 [ECO A52 Budapest: Alekhine variation, Balogh gambit] d4 Nf6 c4 e5 de Ng4 e4 d6 [ECO A52 Budapest: Alekhine, Abonyi variation] d4 Nf6 c4 e5 de Ng4 e4 Ne5 f4 N5c6 [ECO A52 Budapest: Alekhine variation] d4 Nf6 c4 e5 de Ng4 e4 [ECO A52 Budapest: Rubinstein variation] d4 Nf6 c4 e5 de Ng4 Bf4 [ECO A52 Budapest: Adler variation] d4 Nf6 c4 e5 de Ng4 Nf3 [ECO A52 Budapest defence] d4 Nf6 c4 e5 de Ng4 [ECO A51 Budapest: Fajarowicz, Steiner variation] d4 Nf6 c4 e5 de Ne4 Qc2 [ECO A51 Budapest: Fajarowicz variation] d4 Nf6 c4 e5 de Ne4 [ECO A51 Budapest defence declined] d4 Nf6 c4 e5 [ECO A50 Queen's Indian accelerated] d4 Nf6 c4 b6 [ECO A?? Kevitz-Trajkovich defence] d4 Nf6 c4 Nc6 [ECO A?? Queen's pawn game] d4 Nf6 c4 [ECO A49 King's Indian: fianchetto without c4] d4 Nf6 Nf3 g6 g3 [ECO A48 King's Indian: London system] d4 Nf6 Nf3 g6 Bf4 [ECO A48 King's Indian: Torre attack] d4 Nf6 Nf3 g6 Bg5 [ECO A48 King's Indian: East Indian defence] d4 Nf6 Nf3 g6 [ECO A47 Queen's Indian: Marienbad system, Berg variation] d4 Nf6 Nf3 b6 g3 Bb7 Bg2 c5 c4 cd Qd4 [ECO A47 Queen's Indian: Marienbad system] d4 Nf6 Nf3 b6 g3 Bb7 Bg2 c5 [ECO A47 Queen's Indian defence] d4 Nf6 Nf3 b6 [ECO A46 D\"ory defence] d4 Nf6 Nf3 Ne4 [ECO A46 Queen's pawn: Yusupov-Rubinstein system] d4 Nf6 Nf3 e6 e3 [ECO A46 Queen's pawn: Torre attack, Wagner gambit] d4 Nf6 Nf3 e6 Bg5 c5 e4 [ECO A46 Queen's pawn: Torre attack] d4 Nf6 Nf3 e6 Bg5 [ECO A46 Queen's pawn game] d4 Nf6 Nf3 [ECO A45 Trompovsky attack ] d4 Nf6 Bg5 [ECO A45 Gedult attack] d4 Nf6 f3 d5 g4 [ECO A45 Blackmar-Diemer gambit] d4 Nf6 f3 d5 e4 [ECO A45 Paleface attack] d4 Nf6 f3 [ECO A45 Canard opening] d4 Nf6 f4 [ECO A45 Queen's pawn: Bronstein gambit] d4 Nf6 g4 [ECO A45 Queen's pawn game] d4 Nf6 [ECO A99 Dutch: Ilyin-Genevsky variation with b3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 b3 [ECO A98 Dutch: Ilyin-Genevsky variation with Qc2] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 Qc2 [ECO A97 Dutch: Ilyin-Genevsky, Winter variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 Re1 [ECO A97 Dutch: Ilyin-Genevsky variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 Nc3 Qe8 [ECO A96 Dutch: classical variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d6 [ECO A95 Dutch: stonewall: Chekhover variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 c6 Qc2 Qe8 Bg5 [ECO A95 Dutch: stonewall with Nc3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 c6 [ECO A92 Dutch: stonewall with Nc3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 Nc3 [ECO A94 Dutch: stonewall with Ba3] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 b3 c6 Ba3 [ECO A93 Dutch: stonewall, Botwinnik variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 b3 [ECO A92 Dutch: stonewall variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o d5 [ECO A92 Dutch defence, Alekhine variation] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o o-o Ne4 [ECO A92 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 o-o [ECO A91 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 Be7 [ECO A90 Dutch-Indian, Alekhine variation] d4 f5 c4 Nf6 g3 e6 Bg2 Bb4 Bd2 Be7 [ECO A90 Dutch defence: Dutch-Indian variation] d4 f5 c4 Nf6 g3 e6 Bg2 Bb4 [ECO A90 Dutch defence] d4 f5 c4 Nf6 g3 e6 Bg2 [ECO A89 Dutch: Leningrad, main variation with Nc6] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 o-o o-o d6 Nc3 Nc6 [ECO A88 Dutch: Leningrad, main variation with c6] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 o-o o-o d6 Nc3 c6 [ECO A87 Dutch: Leningrad, main variation] d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 [ECO A86 Dutch: Leningrad variation] d4 f5 c4 Nf6 g3 g6 [ECO A86 Dutch: Hort-Antoshin system] d4 f5 c4 Nf6 g3 d6 Bg2 c6 Nc3 Qc7 [ECO A86 Dutch with c4 & g3] d4 f5 c4 Nf6 g3 [ECO A85 Dutch with c4 & Nc3] d4 f5 c4 Nf6 Nc3 [ECO A84 Dutch defence] d4 f5 c4 Nf6 [ECO A84 Dutch: Staunton gambit deferred] d4 f5 c4 e6 e4 [ECO A84 Dutch defence, Rubinstein variation] d4 f5 c4 e6 Nc3 [ECO A84 Dutch defence] d4 f5 c4 e6 [ECO A84 Dutch defence: Bladel variation] d4 f5 c4 g6 Nc3 Nh6 [ECO A84 Dutch defence] d4 f5 c4 [ECO A83 Dutch: Staunton gambit, Nimzovich variation] d4 f5 e4 fe Nc3 Nf6 Bg5 b6 [ECO A83 Dutch: Staunton gambit, Chigorin variation] d4 f5 e4 fe Nc3 Nf6 Bg5 c6 [ECO A83 Dutch: Staunton gambit, Lasker variation] d4 f5 e4 fe Nc3 Nf6 Bg5 g6 f3 [ECO A83 Dutch: Staunton gambit, Alekhine variation] d4 f5 e4 fe Nc3 Nf6 Bg5 g6 h4 [ECO A83 Dutch: Staunton gambit, Staunton's line] d4 f5 e4 fe Nc3 Nf6 Bg5 [ECO A82 Dutch: Staunton gambit, Tartakower variation] d4 f5 e4 fe Nc3 Nf6 g4 [ECO A82 Dutch: Staunton gambit] d4 f5 e4 fe [ECO A82 Dutch: Balogh defence] d4 f5 e4 d6 [ECO A82 Dutch: Staunton gambit] d4 f5 e4 [ECO A81 Dutch: Leningrad, Karlsbad variation] d4 f5 g3 g6 Bg2 Bg7 Nh3 [ECO A81 Dutch: Leningrad, Basman system] d4 f5 g3 g6 Bg2 Bg7 Nf3 c6 o-o Nh6 [ECO A81 Dutch defence] d4 f5 g3 Nf6 Bg2 g6 [ECO A81 Dutch defence, Blackburne variation] d4 f5 g3 Nf6 Bg2 e6 Nh3 [ECO A81 Dutch defence] d4 f5 g3 [ECO A80 Dutch, 2.Bg5 variation] d4 f5 Bg5 [ECO A80 Dutch, Krejcik gambit] d4 f5 g4 [ECO A80 Dutch, Korchnoi attack] d4 f5 h3 [ECO A80 Dutch, Von Pretzel gambit] d4 f5 Qd3 e6 g4 [ECO A80 Dutch, Manhattan variation] d4 f5 Qd3 [ECO A80 Dutch, Spielmann gambit] d4 f5 Nc3 Nf6 g4 [ECO A80 Dutch] d4 f5 [ECO A44 Semi-Benoni ] d4 c5 d5 e5 e4 d6 [ECO A44 Old Benoni defence] d4 c5 d5 e5 [ECO A43 Old Benoni: Schmid's system] d4 c5 d5 d6 Nc3 g6 [ECO A43 Old Benoni defence] d4 c5 d5 d6 [ECO A43 Hawk defence] d4 c5 d5 Nf6 Nf3 c4 [ECO A43 Old Benoni defence] d4 c5 d5 Nf6 Nf3 [ECO A43 Woozle defence] d4 c5 d5 Nf6 Nc3 Qa5 [ECO A43 Old Benoni defence] d4 c5 d5 Nf6 [ECO A43 Old Benoni: Mujannah formation] d4 c5 d5 f5 [ECO A43 Old Benoni: Franco-Benoni defence] d4 c5 d5 e6 e4 [ECO A43 Old Benoni defence] d4 c5 [ECO A42 Modern defence: Averbakh system, Kotov variation] d4 d6 c4 g6 Nc3 Bg7 e4 Nc6 [ECO A42 Modern defence: Averbakh system, Randspringer variation] d4 d6 c4 g6 Nc3 Bg7 e4 f5 [ECO A42 Pterodactyl defence] d4 d6 c4 g6 Nc3 Bg7 e4 c5 Nf3 Qa5 [ECO A42 Modern defence: Averbakh system] d4 d6 c4 g6 Nc3 Bg7 e4 [ECO A41 Modern defence] d4 d6 c4 g6 Nc3 Bg7 [ECO A41 Old Indian defence] d4 d6 c4 [ECO A41 Old Indian: Tartakower variation] d4 d6 Nf3 Bg4 [ECO A41 Queen's Pawn] d4 d6 [ECO A40 Beefeater defence] d4 g6 c4 Bg7 Nc3 c5 d5 Bc3 bc f5 [ECO A40 Modern defence] d4 g6 [ECO A40 Queen's pawn: Franco-Indian defence] d4 e6 c4 Bb4 [ECO A40 Queen's pawn: Keres defence] d4 e6 c4 b6 [ECO A40 Queen's pawn] d4 e6 [ECO A40 Polish defence] d4 b5 [ECO A40 Queen's pawn: English defence] d4 b6 [ECO A40 Queen's pawn: Englund gambit] d4 e5 de Nc6 Nf3 Qe7 Qd5 f6 ef Nf6 [ECO A40 Queen's pawn: Charlick gambit] d4 e5 [ECO A40 Queen's pawn: Lundin defence] d4 Nc6 [ECO A40 Queen's pawn] d4 [ECO A39 English: symmetrical, main line with d4] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o d4 [ECO A38 English: symmetrical, main line with d3] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o d3 [ECO A38 English: symmetrical, main line with b3] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 o-o o-o b3 [ECO A38 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 [ECO A37 English: symmetrical, Botvinnik system reversed] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 e5 [ECO A37 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 [ECO A36 English: symmetrical, Botvinnik system] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 e4 [ECO A36 English: symmetrical, Botvinnik system reversed] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 e5 [ECO A36 English: ultra-symmetrical variation] c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 [ECO A36 English: symmetrical variation] c4 c5 Nc3 Nc6 g3 [ECO A35 English: symmetrical, four knights system] c4 c5 Nc3 Nc6 Nf3 Nf6 [ECO A35 English: symmetrical variation] c4 c5 Nc3 Nc6 [ECO A34 English: symmetrical, Rubinstein system] c4 c5 Nc3 Nf6 g3 d5 cd Nd5 Bg2 Nc7 [ECO A34 English: symmetrical variation] c4 c5 Nc3 Nf6 g3 [ECO A34 English: symmetrical, three knights system] c4 c5 Nc3 Nf6 Nf3 d5 cd Nd5 [ECO A34 English: symmetrical variation] c4 c5 Nc3 [ECO A33 English: symmetrical, Geller variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 Nc3 Nc6 g3 Qb6 [ECO A33 English: symmetrical variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 Nc3 Nc6 [ECO A32 English: symmetrical variation] c4 c5 Nf3 Nf6 d4 cd Nd4 e6 [ECO A31 English: symmetrical, Benoni formation] c4 c5 Nf3 Nf6 d4 [ECO A30 English: symmetrical, hedgehog, flexible formation] c4 c5 Nf3 Nf6 g3 b6 Bg2 Bb7 o-o e6 Nc3 Be7 d4 cd Qd4 d6 Rd1 a6 b3 N8d7 [ECO A30 English: symmetrical, hedgehog system] c4 c5 Nf3 Nf6 g3 b6 Bg2 Bb7 o-o e6 Nc3 Be7 [ECO A30 English: symmetrical variation] c4 c5 [ECO A29 English: four knights, kingside fianchetto] c4 e5 Nc3 Nc6 Nf3 Nf6 g3 [ECO A28 English: four knights, Romanishin variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 Bb4 Qc2 Bc3 [ECO A28 English: four knights, Stean variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 Bb4 Qc2 o-o Nd5 Re8 Qf5 [ECO A28 English: four knights, 4.e3] c4 e5 Nc3 Nc6 Nf3 Nf6 e3 [ECO A28 English: four knights, Capablanca variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d3 [ECO A28 English: four knights, Marini variation] c4 e5 Nc3 Nc6 Nf3 Nf6 a3 [ECO A28 English: four knights, Nimzovich variation] c4 e5 Nc3 Nc6 Nf3 Nf6 e4 [ECO A28 English: Bradley Beach variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d4 e4 [ECO A28 English: Nenarokov variation] c4 e5 Nc3 Nc6 Nf3 Nf6 d4 ed Nd4 Bb4 Bg5 h6 Bh4 Bc3 bc Ne5 [ECO A28 English: four knights system] c4 e5 Nc3 Nc6 Nf3 Nf6 [ECO A27 English: three knights system] c4 e5 Nc3 Nc6 Nf3 [ECO A26 English: Botvinnik system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 e4 [ECO A26 English: closed system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 [ECO A25 English: closed system ] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 [ECO A25 English: closed, 5.Rb1 Taimanov variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 Rb1 Nh6 [ECO A25 English: closed, 5.Rb1] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 Rb1 [ECO A25 English: closed, Hort variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 d6 N1e2 Be6 [ECO A25 English: closed, Taimanov variation] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 e3 d6 N1e2 Nh6 [ECO A25 English: closed system] c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 [ECO A25 English: Sicilian reversed] c4 e5 Nc3 Nc6 [ECO A24 English: Bremen system with ...g6] c4 e5 Nc3 Nf6 g3 g6 [ECO A23 English: Bremen system, Keres variation] c4 e5 Nc3 Nf6 g3 c6 [ECO A22 English: Bremen, Smyslov system] c4 e5 Nc3 Nf6 g3 Bb4 [ECO A22 English: Bremen, reverse dragon] c4 e5 Nc3 Nf6 g3 d5 [ECO A22 English: Carls' Bremen system] c4 e5 Nc3 Nf6 g3 [ECO A22 English: Bellon gambit] c4 e5 Nc3 Nf6 Nf3 e4 Ng5 b5 [ECO A22 English opening] c4 e5 Nc3 Nf6 [ECO A21 English, Kramnik-Shirov counterattack] c4 e5 Nc3 Bb4 [ECO A21 English, Smyslov defence] c4 e5 Nc3 d6 Nf3 Bg4 [ECO A21 English opening] c4 e5 Nc3 d6 Nf3 [ECO A21 English, Keres variation] c4 e5 Nc3 d6 g3 c6 [ECO A21 English, Tr\"oger defence] c4 e5 Nc3 d6 g3 Be6 Bg2 Nc6 [ECO A21 English opening] c4 e5 Nc3 [ECO A20 English, Nimzovich, Flohr variation] c4 e5 Nf3 e4 [ECO A20 English, Nimzovich variation] c4 e5 Nf3 [ECO A20 English opening] c4 e5 [ECO A19 English: Mikenas-Carls, Sicilian variation] c4 Nf6 Nc3 e6 e4 c5 [ECO A18 English: Mikenas-Carls, Kevitz variation] c4 Nf6 Nc3 e6 e4 Nc6 [ECO A18 English: Mikenas-Carls, Flohr variation] c4 Nf6 Nc3 e6 e4 d5 e5 [ECO A18 English: Mikenas-Carls variation] c4 Nf6 Nc3 e6 e4 [ECO A17 English: Nimzo-English opening] c4 Nf6 Nc3 e6 Nf3 Bb4 [ECO A17 English: Queens Indian, Romanishin variation] c4 Nf6 Nc3 e6 Nf3 b6 e4 Bb7 Bd3 [ECO A17 English: Queens Indian formation] c4 Nf6 Nc3 e6 Nf3 b6 [ECO A17 English opening] c4 Nf6 Nc3 e6 [ECO A16 English: Anglo-Gr\"unfeld defense, Korchnoi variation] c4 Nf6 Nc3 d5 cd Nd5 Nf3 g6 g3 Bg7 Bg2 e5 [ECO A16 English: Anglo-Gr\"unfeld defense] c4 Nf6 Nc3 d5 cd Nd5 Nf3 [ECO A16 English: Anglo-Gr\"unfeld, Czech defense] c4 Nf6 Nc3 d5 cd Nd5 g3 g6 Bg2 Nb6 [ECO A16 English: Anglo-Gr\"unfeld, Smyslov defense] c4 Nf6 Nc3 d5 cd Nd5 g3 g6 Bg2 Nc3 [ECO A16 English: Anglo-Gr\"unfeld defense] c4 Nf6 Nc3 d5 [ECO A16 English opening] c4 Nf6 Nc3 [ECO A15 English opening] c4 Nf6 Nf3 [ECO A15 English orang-utan] c4 Nf6 b4 [ECO A15 English, 1...Nf6 ] c4 Nf6 [ECO A14 English: Symmetrical, Keres defence] c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 o-o c5 cd Nd5 Nc3 Nc6 [ECO A14 English: Neo-Catalan declined] c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 o-o [ECO A13 English: Neo-Catalan accepted] c4 e6 Nf3 d5 g3 Nf6 Bg2 dc [ECO A13 English: Neo-Catalan] c4 e6 Nf3 d5 g3 Nf6 [ECO A13 English: Kurajica defence] c4 e6 Nf3 d5 g3 c6 [ECO A13 English opening: Agincourt variation] c4 e6 Nf3 d5 g3 [ECO A13 English: Wimpey system] c4 e6 Nf3 d5 b3 Nf6 Bb2 c5 e3 [ECO A13 English opening: Agincourt variation] c4 e6 Nf3 d5 [ECO A13 English: Romanishin gambit] c4 e6 Nf3 Nf6 g3 a6 Bg2 b5 [ECO A13 English opening] c4 e6 [ECO A12 English: Caro-Kann defensive system, Bogolyubov variation] c4 c6 Nf3 d5 b3 Bg4 [ECO A12 English: Capablanca's variation] c4 c6 Nf3 d5 b3 Nf6 Bb2 Bg4 [ECO A12 English: New York defensive system] c4 c6 Nf3 d5 b3 Nf6 Bb2 Bf5 [ECO A12 English: Bled variation] c4 c6 Nf3 d5 b3 Nf6 Bb2 g6 [ECO A12 English: Caro-Kann defensive system] c4 c6 Nf3 d5 b3 Nf6 Bb2 [ECO A12 English: London defensive system] c4 c6 Nf3 d5 b3 Nf6 g3 Bf5 [ECO A12 English: Torre defensive system] c4 c6 Nf3 d5 b3 Nf6 g3 Bg4 [ECO A12 English: Caro-Kann defensive system] c4 c6 Nf3 d5 b3 [ECO A11 English: Caro-Kann defensive system] c4 c6 [ECO A10 English: Anglo-Dutch defense] c4 f5 [ECO A10 English: Jaenisch gambit] c4 b5 [ECO A10 English: Adorjan defence] c4 g6 e4 e5 [ECO A10 English opening] c4 g6 [ECO A10 English opening] c4 [ECO A09 R\'eti accepted: Keres variation] Nf3 d5 c4 dc e3 Be6 [ECO A09 R\'eti accepted] Nf3 d5 c4 dc [ECO A09 R\'eti: advance variation] Nf3 d5 c4 d4 [ECO A09 R\'eti opening] Nf3 d5 c4 [ECO A08 R\'eti: King's Indian attack, French variation] Nf3 d5 g3 c5 Bg2 Nc6 o-o e6 d3 Nf6 N1d2 Be7 e4 o-o Re1 [ECO A08 R\'eti: King's Indian attack] Nf3 d5 g3 c5 Bg2 [ECO A07 R\'eti: King's Indian attack ] Nf3 d5 g3 c5 [ECO A07 R\'eti: King's Indian attack, Pachman system] Nf3 d5 g3 g6 Bg2 Bg7 o-o e5 d3 Ne7 [ECO A07 R\'eti: King's Indian attack] Nf3 d5 g3 g6 [ECO A07 R\'eti: King's Indian attack, Keres variation] Nf3 d5 g3 Bg4 Bg2 Nd7 [ECO A07 R\'eti: King's Indian attack, Yugoslav variation] Nf3 d5 g3 Nf6 Bg2 c6 o-o Bg4 [ECO A07 R\'eti: King's Indian attack ] Nf3 d5 g3 [ECO A06 R\'eti: Nimzovich-Larsen attack] Nf3 d5 b3 [ECO A06 Tennison gambit] Nf3 d5 e4 [ECO A06 Santasiere's folly] Nf3 d5 b4 [ECO A06 R\'eti: old Indian attack] Nf3 d5 d3 [ECO A06 R\'eti opening] Nf3 d5 [ECO A05 R\'eti: King's Indian attack, R\'eti-Smyslov variation] Nf3 Nf6 g3 g6 b4 [ECO A05 R\'eti: King's Indian attack] Nf3 Nf6 g3 g6 [ECO A05 R\'eti: King's Indian attack, Spassky's variation] Nf3 Nf6 g3 b5 [ECO A05 R\'eti opening] Nf3 Nf6 [ECO A04 R\'eti: Pirc-Lisitsin gambit] Nf3 f5 e4 [ECO A04 R\'eti: Lisitsin gambit deferred] Nf3 f5 d3 Nf6 e4 [ECO A04 R\'eti v Dutch] Nf3 f5 [ECO A04 R\'eti: Wade defence] Nf3 d6 e4 Bg4 [ECO A04 R\'eti opening] Nf3 d6 [ECO A04 R\'eti: Herrstr\"om gambit] Nf3 g5 [ECO A04 R\'eti opening] Nf3 [ECO A03 Mujannah opening] f4 d5 c4 [ECO A03 Bird's opening: Williams gambit] f4 d5 e4 [ECO A03 Bird's opening: Lasker variation] f4 d5 Nf3 Nf6 e3 c5 [ECO A03 Bird's opening] f4 d5 [ECO A02 Bird: From gambit, Lipke variation] f4 e5 fe d6 ed Bd6 Nf3 Nh6 d4 [ECO A02 Bird: From gambit, Lasker variation] f4 e5 fe d6 ed Bd6 Nf3 g5 [ECO A02 Bird: From gambit] f4 e5 [ECO A02 Bird: Hobbs gambit] f4 g5 [ECO A02 Bird's opening, Swiss gambit] f4 f5 e4 fe Nc3 Nf6 g4 [ECO A02 Bird's opening] f4 [ECO A01 Nimzovich-Larsen attack: modern variation] b3 e5 [ECO A01 Nimzovich-Larsen attack: Indian variation] b3 Nf6 [ECO A01 Nimzovich-Larsen attack: classical variation] b3 d5 [ECO A01 Nimzovich-Larsen attack: English variation] b3 c5 [ECO A01 Nimzovich-Larsen attack: Dutch variation] b3 f5 [ECO A01 Nimzovich-Larsen attack: Polish variation] b3 b5 [ECO A01 Nimzovich-Larsen attack: symmetrical variation] b3 b6 [ECO A01 Nimzovich-Larsen attack] b3 [ECO A00 Polish: T\"ubingen variation] b4 Nh6 [ECO A00 Polish: Outflank variation] b4 c6 [ECO A00 Polish opening] b4 [ECO A00 Lasker simul special] g3 h5 [ECO A00 Benko's opening: reversed Alekhine] g3 e5 Nf3 [ECO A00 Benko's opening] g3 [ECO A00 Grob: Romford counter-gambit] g4 d5 Bg2 Bg4 c4 d4 [ECO A00 Grob: Fritz gambit] g4 d5 Bg2 Bg4 c4 [ECO A00 Grob: spike attack] g4 d5 Bg2 c6 g5 [ECO A00 Grob's attack] g4 [ECO A00 Global opening] h3 e5 a3 [ECO A00 Clemenz opening] h3 [ECO A00 Amar gambit] Nh3 d5 g3 e5 f4 Bh3 Bh3 ef [ECO A00 Amar opening] Nh3 [ECO A00 Battambang opening] Nc3 e5 a3 [ECO A00 Dunst opening] Nc3 e5 [ECO A00 Novosibirsk opening] Nc3 c5 d4 cd Qd4 Nc6 Qh4 [ECO A00 Dunst opening] Nc3 [ECO A00 Anderssen's opening] a3 [ECO A00 Crab opening] a4 e5 h4 [ECO A00 Ware opening] a4 [ECO A00 Saragossa opening] c3 [ECO A00 Valencia opening] d3 e5 Nd2 [ECO A00 Mieses opening] d3 e5 [ECO A00 Venezolana opening] d3 c5 Nc3 Nc6 g3 [ECO A00 Mieses opening] d3 [ECO A00 Amsterdam attack] e3 e5 c4 d6 Nc3 Nc6 b3 Nf6 [ECO A00 Van't Kruijs opening] e3 [ECO A00 Hammerschlag ] f3 e5 Kf2 [ECO A00 Gedult's opening] f3 [ECO A00 Anti-Borg opening] h4 [ECO A00 Durkin's attack] Na3 Phalanx-XXII/all.msvc0000644000175000001440000000442010314125617014074 0ustar sombrausers #include "phalanx.h" char * index ( char *s, int c ) { int i; while ((i = *s) && c != i) s++; return (*s ? s : 0); } char * rindex (char *s, char c) { char *p; for (p = s; *s; s++) ; while (c != *s && s >= p) s--; return (s < p ? 0 : s); } /* getopt.c (slightly modified by O.Garcia, 12/4/92) */ /* now it accepts either '-' or '/' as switch character */ /* Newsgroups: mod.std.unix Subject: public domain AT&T getopt source Date: 3 Nov 85 19:34:15 GMT Here's something you've all been waiting for: the AT&T public domain source for getopt(3). It is the code which was given out at the 1985 UNIFORUM conference in Dallas. I obtained it by electronic mail directly from AT&T. The people there assure me that it is indeed in the public domain. */ #include #include #include #define ERR(s, c) if(opterr){fprintf(stderr,"%s%s%c\n",argv[0],s,c);} int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt (int argc, char **argv, char *opts) { static int sp = 1; register int c; register char *cp; if (sp == 1) if (optind >= argc || (argv[optind][0] != '-' && argv[optind][0] != '/') || argv[optind][1] == '\0') return (EOF); else if (strcmp (argv[optind], "--") == 0 || strcmp (argv[optind], "//") == 0) { optind++; return (EOF); } optopt = c = argv[optind][sp]; if (c == ':' || (cp = strchr (opts, c)) == NULL) { ERR (": illegal option -- ", c); if (argv[optind][++sp] == '\0') { optind++; sp = 1; } return ('?'); } if (*++cp == ':') { if (argv[optind][sp + 1] != '\0') optarg = &argv[optind++][sp + 1]; else if (++optind >= argc) { ERR (": option requires an argument -- ", c); sp = 1; return ('?'); } else optarg = argv[optind++]; sp = 1; } else { if (argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return (c); } #include "learn.c" #include "killers.c" #include "data.c" #include "levels.c" #include "bcreate.c" #include "moving.c" #include "search.c" #include "endgame.c" #include "book.c" #include "hash.c" #include "genmoves.c" #include "evaluate.c" #include "io.c" #include "static.c" #include "phalanx.c" Phalanx-XXII/phalanx.h0000644000175000001440000002571710320061012014233 0ustar sombrausers#ifndef PHALANX_INCLUDED #define PHALANX_INCLUDED #define VERSION "XXII" #ifdef GNUFUN # include #endif #ifdef _WIN32 # include # include # include #endif #include #include #include #include #include #include #include #include #include #include /* * COMPATIBILITY */ #ifndef CLOCKS_PER_SEC # define CLOCKS_PER_SEC CLK_TCK #endif #ifdef _WIN32 # define inline __inline typedef __int64 int64; #else typedef long long int64; #endif /* * TYPES */ typedef unsigned char tsquare; /*** Moves are generated into and executed from struct tmove ***/ typedef struct { unsigned char from, /* square */ to, /* destination square */ special; /* Castling or en passant capture, see moving.c */ unsigned char in1, /* moving piece */ in2, /* captured piece or 0 */ in2a; /* moving piece or promoted piece */ signed short value; /* heuristic value - the order key - before search */ /* value returned - after search */ short dch; /* depth change -100...100 */ short shift; /* alphabeta window shift at root search */ } tmove; /* 12 bytes */ typedef struct { tmove m; unsigned hashboard; unsigned short rule50, /* number of half-moves since last irreversible */ castling:8, /* 4 castling flags: */ /* white short, w. long, b. s., b. l. */ check:8; short mtrl, /* material count of side on move */ xmtrl; /* material count of opposite side */ } tgamenode; /* 12+12 bytes */ typedef struct { unsigned hashboard; short value, depth: 14; unsigned result: 2; unsigned short move, age; } thashentry; /* 12 bytes */ /* Positional features of one side */ typedef struct { short hung; signed char khung, kshield; unsigned char p, n, b, r, q; /* number of given pieces */ unsigned char kp; /* king position */ unsigned char r7r; /* # of rooks on 7-th row */ signed char prune; /* is it ok to prune search in this pos ? */ signed char kstorm, qstorm; /* diffside castling: king attack q/k side */ unsigned char devel; /* development needed?, 0 ... no */ unsigned char castling; unsigned char bishopcolor, /* square color of friendly bishops, or-red */ xbishopcolor; /* square color of enemy bishops */ signed char worsebm; /* mobility of the worse bishop */ unsigned char lpf, rpf; /* leftmost/rightmost pawn file */ } tknow; typedef enum { timecontrol, averagetime, fixedtime, fixeddepth } tlevel; typedef struct { int centiseconds; unsigned moves, /* time levels */ increment; int depth; /* fixed depth level */ int noise; int resign; int bench; int machine_color, post, xboard, book, learn, cpu, /* use cpu time */ ponder, analyze, polling; /* polling input */ tlevel level; unsigned char easy; FILE * log; } tflag; typedef struct { unsigned char prev, next; } tlist; typedef struct { FILE * f; unsigned firstkey, lastkey; int filesize; } tsbook; typedef struct { FILE * f; int filesize; } tpbook; typedef struct { unsigned taxi, max, diag, min; } tdist; /* * DEFINITIONS */ #ifndef VERSION # define VERSION "unknown" #endif /* use SAN for output */ #undef SANOUT /* primary (text, small, user) book */ #ifndef PBOOK_FILE #define PBOOK_FILE "pbook.phalanx" #endif #ifndef PBOOK_DIR #define PBOOK_DIR "/usr/local/lib/phalanx" #endif /* secondary (binary, large, generated from pgn) book */ #ifndef SBOOK_FILE #define SBOOK_FILE "sbook.phalanx" #endif #ifndef SBOOK_DIR #define SBOOK_DIR "/usr/local/lib/phalanx" #endif #ifndef ECO_FILE #define ECO_FILE "eco.phalanx" #endif #ifndef ECO_DIR #define ECO_DIR "/usr/local/lib/phalanx" #endif #ifndef LEARN_FILE #define LEARN_FILE "learn.phalanx" #endif #ifndef LEARN_DIR #define LEARN_DIR "/var/local/lib/phalanx" #endif #define ENV_PBOOK "PHALANXPBOOKDIR" #define ENV_SBOOK "PHALANXSBOOKDIR" #define ENV_LEARN "PHALANXLEARNDIR" #define ENV_ECO "PHALANXECODIR" #define max(x,y) (((x)>(y))?(x):(y)) #define min(x,y) (((x)<(y))?(x):(y)) #define NOVALUE 32123 #define CHECKMATE 30000 #define MAXPLY 40 #define MAXCOUNTER 1024 /* 512 moves */ #define HASH_COLOR ((unsigned)0xFDB97531) #define no_cut 1 #define alpha_cut 2 #define beta_cut 3 /* Castling special move codes and flags */ #define SHORT_CASTLING 1 #define LONG_CASTLING 2 #define WSHORT 1 /* if set, white short castling is impossible */ #define WLONG 2 #define BSHORT 4 #define BLONG 8 /* Colors / sides */ #define WHITE 1 #define BLACK 2 #define empty(X) (((X)&3)==0) #define white(X) (((X)&3)==WHITE) #define black(X) (((X)&3)==BLACK) #define color(X) ((X)&3) #define enemy(X) ((X)^3) /* Values */ #define P_VALUE 100 #define N_VALUE 350 #define B_VALUE 350 #define R_VALUE 550 #define Q_VALUE 1050 /* Pieces */ #define piece(X) ((X)&0xFC) #define PAWN 0x10 #define KNIGHT 0x20 #define BISHOP 0x30 #define ROOK 0x40 #define QUEEN 0x50 #define KING 0x60 #define WP (WHITE|PAWN) #define WN (WHITE|KNIGHT) #define WB (WHITE|BISHOP) #define WR (WHITE|ROOK) #define WQ (WHITE|QUEEN) #define WK (WHITE|KING) #define BP (BLACK|PAWN) #define BN (BLACK|KNIGHT) #define BB (BLACK|BISHOP) #define BR (BLACK|ROOK) #define BQ (BLACK|QUEEN) #define BK (BLACK|KING) /*** Bit masks for power tables ***/ #define WPM 0x0001 #define WNM 0x0002 #define WBM 0x0004 #define WRM 0x0008 #define WQM 0x0010 #define WWW 0x0020 #define BPM 0x0100 #define BNM 0x0200 #define BBM 0x0400 #define BRM 0x0800 #define BQM 0x1000 #define BBB 0x2000 /* Files */ #define FILE_A 1 #define FILE_B 2 #define FILE_C 3 #define FILE_D 4 #define FILE_E 5 #define FILE_F 6 #define FILE_G 7 #define FILE_H 8 /* Squares */ #define A1 21 #define B1 22 #define C1 23 #define D1 24 #define E1 25 #define F1 26 #define G1 27 #define H1 28 #define A2 31 #define B2 32 #define C2 33 #define D2 34 #define E2 35 #define F2 36 #define G2 37 #define H2 38 #define A3 41 #define B3 42 #define C3 43 #define D3 44 #define E3 45 #define F3 46 #define G3 47 #define H3 48 #define A4 51 #define B4 52 #define C4 53 #define D4 54 #define E4 55 #define F4 56 #define G4 57 #define H4 58 #define A5 61 #define B5 62 #define C5 63 #define D5 64 #define E5 65 #define F5 66 #define G5 67 #define H5 68 #define A6 71 #define B6 72 #define C6 73 #define D6 74 #define E6 75 #define F6 76 #define G6 77 #define H6 78 #define A7 81 #define B7 82 #define C7 83 #define D7 84 #define E7 85 #define F7 86 #define G7 87 #define H7 88 #define A8 91 #define B8 92 #define C8 93 #define D8 94 #define E8 95 #define F8 96 #define G8 97 #define H8 98 #define H9 99 /* a bumper: we are out of board */ /* * VARIABLES */ extern tflag Flag; /* Misc. settings, see typedef of tflag */ extern tsquare B[120]; /* The chessboard */ extern tlist L[120]; /* List of pieces */ #define WKP (L[1].next) /* White king position */ #define BKP (L[2].next) /* Black king position */ extern signed char * Th; /* horizontal axe transf., (H8<->H1) */ extern signed char * Tv; /* vertical axe tr., (H8<->A8) */ extern tdist dist[120*120]; extern tknow Wknow, Bknow; /* Things i know about actual position */ extern int Color; /* c. to move: 1 ... white, 2 ... black */ extern int LastIter; /* result of last iteration */ extern int Depth; /* depth to be searched, in % of ply */ extern int Ply; extern int FollowPV; extern int Totmat; /* total mtrl sum on the board */ extern int Abort, NoAbort; /* abort the search when SIG_INT */ extern long AllDepth; /* Statistics for average Depth */ extern int64 AllNPS; extern int DrawScore; #define DRAW ( Ply%2 ? -DrawScore : DrawScore ) extern tgamenode G[MAXCOUNTER]; extern int Counter; /* game counter, points to G[] */ extern int64 Nodes; /* statistics */ extern int Scoring; extern int EasyMove; extern long Otim; /* remaining opponent's time */ /* move generation tables */ extern int N_moves[8], RB_dirs[8]; #define K_moves RB_dirs extern int Values[7]; /* piece values */ extern unsigned short P[120]; /* power table */ extern tmove PV[MAXPLY][MAXPLY]; /* principal variantion */ extern tmove Pondermove; /* Hashing codes */ extern unsigned H[12][64]; extern thashentry *HT; /* Hash table itself */ extern int * HS; /* square trans-table */ extern int HP[]; /* piece trans-table */ extern unsigned SizeHT; /* Size of the hash table */ extern unsigned Age; /* Opening book */ extern tpbook Pbook; /* primary book flags */ extern tpbook Learn; extern tsbook Sbook; /* secondary book flags */ extern FILE * Eco; extern int Bookout; /* params that cannot be pushed thru SIGALM handler, */ /* must be pushed thru global variables */ extern int A_n, A_i, A_d; extern tmove * A_m; /* * FUNCTIONS */ extern void myfwrite( void*, int, FILE* ); extern void myfread( void*, int, FILE* ); extern int bcreate(int,char**); extern void new_game(void); /* input/output */ extern void printm(tmove,char*); extern void printmSAN( tmove*, int, int, char* ); extern void printPV(int,int,char*); extern void infoline(int,char*); extern void verboseline(tmove*,int,int); extern void printboard(char*); extern int setfen(char*); extern void shell(void); extern int command(void); extern tmove * sandex(char*,tmove*,int); /* signal handlers */ extern void interrupt(int); extern int attacktest(int,int); #define checktest(side) attacktest( (side)==WHITE ? WKP : BKP, enemy(side)) extern void generate_legal_moves(tmove*,int*,int); extern void generate_legal_captures(tmove*,int*,int); extern void generate_legal_checks(tmove*,int*); extern int see( tsquare *, int, int ); extern int search(tmove*,int,int,int); extern int csearch(tmove*,int,int,int,int); extern tmove root_search(void); extern int repetition(int); extern int material_draw(void); extern int evaluate(int,int); extern int score_position(void); /* endgame knowledge */ extern int pawns(void); extern int e_nb(int); /* endgame: knight and bishop */ extern int e_mp(void); /* minor piece and pawn */ extern int e_rpr(void); /* R+P vs. R */ extern void do_move( tmove * ); extern void undo_move( tmove * ); extern unsigned hashboard(void); extern thashentry * seekHT(void); extern void writeHT(int,int,int); /* levels */ extern void l_level(char *); extern void l_startsearch(void); extern int l_iterate(void); extern long ptime(void); extern long LastTurn; extern int Turns; /* book */ extern int bookmove(tmove*,int); extern unsigned smove(tmove*); /* learning feature */ extern int rlearn(void); extern void wlearn(int,int); /* killer move utils */ extern void init_killers(void); extern void write_killer( int, int ); extern void add_killer( tmove *, int, thashentry * ); #endif Phalanx-XXII/bcreate.c0000644000175000001440000002372010314125617014207 0ustar sombrausers#include "phalanx.h" int WIN=5; /* highest value for every win of this move */ int DRA=2; /* much smaller value for drawing moves */ int LOO=1; /* lowest value for losing moves */ int UNK=1; /* the result is unknown. there is often [Result "*"] in lots of PGN files */ int Asize=500000; /* default buffer size. one cell is 12 bytes. qsort() temporarily needs about twice as much memory to sort the array. */ int MaxBookPly=70; /* we want only opening to be in the book ... stop the game parsing at this ply. */ int MaxComment=4096; /* maximum size of comment in bytes. if a comment exceeds this limit, we search for another game. */ int MinValue=15; /* move bonus must be >= MinValue, otherwise the move is not added into the opening book. */ int MinPercentage=80; /* alternate moves must be at least at MinPercentage % of the value of the most valuable move */ FILE * tb1; FILE * tb2; typedef struct { unsigned hashboard; unsigned n; unsigned short move; } tb; /* 10 bytes */ tb *A; int I=0; int bsortkey( const void *a, const void *b ) { if( ((tb*)a)->hashboard > ((tb*)b)->hashboard ) return 1; else if( ((tb*)a)->hashboard < ((tb*)b)->hashboard ) return -1; else if( ((tb*)a)->move > ((tb*)b)->move ) return 1; else if( ((tb*)a)->move < ((tb*)b)->move ) return -1; else return 0; } int usortkey( const void *a, const void *b ) { if( ((tb*)a)->n < ((tb*)b)->n ) return 1; else return -1; } int games=0; int positions=0; void printit(int x) { printf("%8i%10i%7i%%", games,positions,I*100/Asize); fflush(stdout); signal(SIGALRM,printit); alarm(5); } void compress(void) { int i1, i2; printit(0); alarm(0); printf("\nsorting buffer ............ "); qsort( A, I, sizeof(tb), bsortkey ); puts("done"); printf("compressing buffer ........ "); i1=0; i2=1; while( i2 != I ) { while( i2 != I && A[i1].hashboard == A[i2].hashboard && A[i1].move == A[i2].move ) { A[i1].n += A[i2].n; i2++; } if( i2 != I ) { i1++; A[i1]=A[i2]; i2++; } } I=i1+1; A[I].n = 0; printf("done, buffer usage=%i (%i%%)\n",I,100*I/Asize); /** Now, take tb1 file and the memory buffer and join them to *** the tb2 (rbook.phalanx.tmp). Rename tb2 to tb1. **/ { int i=0; int done_m, done_f; tb mtb, ftb; printf("adding to file ............ "); tb1=fopen("rbook.phalanx","rb"); tb2=fopen("rbook.phalanx.tmp","wb"); rewind(tb1); mtb=A[0]; i=1; done_m=(i==I); myfread( &ftb, sizeof(tb), tb1 ); done_f=feof(tb1); while( !done_f || !done_m ) { if( !done_m && !done_f && bsortkey(&mtb,&ftb)==0 ) { mtb.n += ftb.n; myfwrite(&mtb,sizeof(tb),tb2); mtb=A[i]; i++; done_m=(i==I); myfread(&ftb,sizeof(tb),tb1); done_f=feof(tb1); } else if( !done_m && ( done_f || bsortkey(&mtb,&ftb)==-1 ) ) { myfwrite(&mtb,sizeof(tb),tb2); mtb=A[i]; i++; done_m=(i==I); } else if( !done_f && ( done_m || bsortkey(&mtb,&ftb)==1 ) ) { myfwrite(&ftb,sizeof(tb),tb2); myfread(&ftb,sizeof(tb),tb1); done_f=feof(tb1); } } /* good, it's there, close the two files, move newly * joined to the first one and reopen */ fclose(tb1); fclose(tb2); rename("rbook.phalanx.tmp","rbook.phalanx"); printf("done\n"); } I=0; alarm(5); } int bpoints, wpoints; int findgame(void) { register int c; register int found=0; char s[64]; bpoints=0; wpoints=0; while( ! found ) { while( (c=getchar()) != EOF && c!='R' ) {} if( c==EOF ) return 0; if( fgets(s,6,stdin)==NULL ) return 0; if( strncmp(s,"esult",5) == 0 ) { int nlns=0; while( (c=getchar()) == ' ' ) {} if( fgets(s,4,stdin)==NULL ) return 0; if( strncmp(s,"1-0",3) == 0 ) { bpoints=LOO; wpoints=WIN; } else if( strncmp(s,"0-1",3) == 0 ) { bpoints=WIN; wpoints=LOO; } else if( strncmp(s,"1/2",3) == 0 ) { bpoints=DRA; wpoints=DRA; } else { bpoints=UNK; wpoints=UNK; } /*** find two newlines in a row -> end of the header ***/ while( (c=getchar()) != EOF && nlns < 2 ) { if(c=='\n') nlns++; else nlns=0; } if(c!=EOF) return 1; } } return 0; } extern char piece[7]; extern char file[10]; extern char row[12]; int addmove(char *move) { static tmove m[256]; tmove * mf; static int n; int i; int p=PAWN+Color; for(i=2;i!=7;i++) if(piece[i]==move[0]) p=16*i+Color; if( move[0]=='O' ) { p=KING+Color; if(move[3]=='-') { if(Color==WHITE){} } } generate_legal_moves( m, &n, checktest(Color) ); if( (mf=sandex(move,m,n)) != NULL ) { if( Color==WHITE ) { if(wpoints) { A[I].hashboard=G[Counter].hashboard; A[I].move = smove(mf); A[I].n = wpoints; positions++; I++; if( I>=Asize ) compress(); } } else { if(bpoints) { A[I].hashboard=G[Counter].hashboard; A[I].move = smove(mf); A[I].n = bpoints; positions++; I++; if( I>=Asize ) compress(); } } do_move(mf); return 1; } else { return 0; } } void parsegame(void) { register int c='*'; unsigned char m[128]; int i; setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); while( c!='[' && c!=EOF && Counter < MaxBookPly ) { while( (c=getchar()) != '.' && c!=EOF ) if(c=='{') { int csize=0; while( (c=getchar())!='}' && c!=EOF && csize\n"); printf("Options: -b one cell is %lu bytes\n", (unsigned long) sizeof(tb) ); printf(" -p \n"); printf(" -c \n"); printf(" -v \n"); printf(" -g \n"); printf(" -w \n"); printf(" -d \n"); printf(" -l \n"); printf(" -u \n"); exit(0); } int bcreate( int argc, char ** argv ) { FILE * f; int c; while( (c=getopt(argc,argv,"b:p:c:v:g:w:d:l:u:")) != -1 ) switch(c) { case 'b': if( sscanf( optarg, "%i", &Asize ) == 0 ) wusage(); if( Asize < 1000 ) wusage(); break; case 'p': if( sscanf( optarg, "%i", &MaxBookPly ) == 0 ) wusage(); if( MaxBookPly < 2 ) wusage(); break; case 'c': if( sscanf( optarg, "%i", &MaxComment ) == 0 ) wusage(); if( MaxComment < 2 ) wusage(); break; case 'v': if( sscanf( optarg, "%i", &MinValue ) == 0 ) wusage(); if( MinValue < 0 ) wusage(); break; case 'g': if( sscanf( optarg, "%i", &MinPercentage ) == 0 ) wusage(); if( MinPercentage < 50 || MinPercentage > 100 ) wusage(); break; case 'w': if( sscanf( optarg, "%i", &WIN ) == 0 ) wusage(); if( WIN < 1 || WIN > 10 ) wusage(); break; case 'd': if( sscanf( optarg, "%i", &DRA ) == 0 ) wusage(); if( DRA < 0 || DRA > 10 ) wusage(); break; case 'l': if( sscanf( optarg, "%i", &LOO ) == 0 ) wusage(); if( LOO < 0 || LOO > 10 ) wusage(); break; case 'u': if( sscanf( optarg, "%i", &UNK ) == 0 ) wusage(); if( UNK < 0 || UNK > 10 ) wusage(); break; default: wusage(); } A=malloc(Asize*sizeof(tb)); if( A == NULL ) { printf("cannot alloc %lu bytes of memory\n", (unsigned long)(Asize*sizeof(tb))); exit(0); } { struct stat fs; if( ! stat("rbook.phalanx",&fs) ) { puts("rbook.phalanx exists, skipping stage 1"); goto stage_2; } else { tb1 = fopen("rbook.phalanx", "w+"); } } setvbuf(stdout, (char*)NULL, _IONBF, 0); puts( "creating opening book"); puts( "-----------------------------"); puts( " games positions buffer%"); puts( "-----------------------------"); signal(SIGALRM,printit); alarm(5); while( findgame() ) { parsegame(); games++; } printf("end of file, parsed %i positions in %i games\n",positions,games); if( games == 0 ) { puts("opening book not created"); return 0; } compress(); alarm(0); stage_2:; if( ( f = fopen( SBOOK_FILE, "wb" ) ) == NULL ) { printf("cannot create book file %s\n", SBOOK_FILE); return 1; } { int dots=0; struct stat fs; int fsize; tb M; tb1=fopen("rbook.phalanx","rb"); myfread( &M, sizeof(tb), tb1 ); stat("rbook.phalanx",&fs); fsize = fs.st_size/sizeof(tb); printf("writing book "); while(!feof(tb1)) { int i; int minn; A[0]=M; I=0; do { int fpos=ftell(tb1)/sizeof(tb); if( fpos % (fsize/30) == 1 ) { if( dots==3 ) { printf("%i%%", (int)(((float)fpos)*100/fsize + 1) ); dots=0; } else printf("."); dots++; } I++; myfread( A+I, sizeof(tb), tb1 ); } while( !feof(tb1) && M.hashboard==A[I].hashboard ); M=A[I]; /* sort them, better first */ qsort( A, I, sizeof(tb), usortkey ); /* more variability in frequently played lines of early openings */ { unsigned i=100, j=10, p=MinPercentage; while( A[0].n > i && p>10 ) { p-=j; j--; i*=10; } minn=A[0].n*p/100; } if( minn > A[0].n ) minn = A[0].n; if( minn < MinValue ) minn=MinValue; for( i=0; i!=I && A[i].n>=minn; i++ ) {} /* printf("got %i of %i moves at hasboard of %08X, next HB %08X\n", i, I, A[0].hashboard, M.hashboard ); */ I=i; for(i=0;i!=I;i++) { unsigned short m = A[i].move; myfwrite( A+i, sizeof(unsigned), f ); myfwrite( &m, sizeof(unsigned short), f ); } } printf(" done\n"); } return 0; } Phalanx-XXII/book.c0000644000175000001440000002612310320055601013524 0ustar sombrausers#include "phalanx.h" #undef SHOWREADS #undef SHOWDUPS tsbook Sbook; tpbook Pbook; int Bookout=0; /* * myfwrite(), myfread() to fix the endianess problem. */ # define ISI ((int)sizeof(int)) void myfwrite( void *ptr, int size, FILE *stream ) { int i,j; for( i=0; i9) lenght++; lenght++; counter=0; } sprintf(&s[lenght],"%c",P[B[i]/8+(color(B[i])==BLACK)]); lenght++; } else if( B[i]==0 ) counter++; if(counter) sprintf(&s[lenght],"%i ",counter); else sprintf(&s[lenght]," "); } /* * Compare position strings p1 and p2. * p1==p2 ... returns 0 * p1>p2 ... 1; p1p2[i]) return 1; if(p1[i]==' ') return 0; } fprintf(stderr,"Phalanx error: Opening book corrupted.\n"); exit(2); } /* * Now the book searching functions. If there is less than * 512 bytes to search, the book is searched linearly. */ int linSB(FILE *f, long from, long to, char *p, char *s) { if( fseek(f,from,SEEK_SET)!=0 ) { return -1; } if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ while(ftell(f)<=to && !feof(f)) { fgets(s,100,f); if( poscmp(p,s)==0 ) return 0; } return -1; } /* * There is more than 512 bytes to search -> use binary search. */ int binSB(FILE *f, long from, long to, char *p, char *s) { long mid; if( to-from < 512 ) return( linSB(f,from,to,p,s) ); mid=(to+from)/2; if( fseek(f,mid,SEEK_SET)!=0 ) return -1; if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ if(!feof(f)) fgets(s,100,f); switch(poscmp(p,s)) { case 0: return(0); case 1: return( binSB(f,mid,to,p,s) ); case -1: return( binSB(f,from,mid,p,s) ); default: return -1; } } int parsemove( char *inp, tmove *m, int n ) { int special, from, to, in2a, i; special = 0; from = inp[0]-'a'+1 + 10*(inp[1]-'1') + 20; to = inp[2]-'a'+1 + 10*(inp[3]-'1') + 20; in2a = 0; if( strncmp(inp,"o-o-o",5)==0 || strncmp(inp,"0-0-0",5)==0 || strncmp(inp,"O-O-O",5)==0 || ( B[E1]==WK && strncmp(inp,"e1c1",4)==0 ) || ( B[E8]==BK && strncmp(inp,"e8c8",4)==0 ) ) special = LONG_CASTLING; else if( strncmp(inp,"o-o",3)==0 || strncmp(inp,"0-0",3)==0 || strncmp(inp,"O-O",3)==0 || ( B[E1]==WK && strncmp(inp,"e1g1",4)==0 ) || ( B[E8]==BK && strncmp(inp,"e8g8",4)==0 ) ) special = SHORT_CASTLING; switch(inp[4]) { case 'Q': case 'q': in2a=QUEEN+Color; break; case 'R': case 'r': in2a=ROOK+Color; break; case 'B': case 'b': in2a=BISHOP+Color; break; case 'N': case 'n': in2a=KNIGHT+Color; break; default : in2a=B[from]; } for(i=0; i!=n; i++) { if( ( special>0 && special Sbook.lastkey ) return -1; fkey = Sbook.firstkey; lkey = Sbook.lastkey; booksize = Sbook.filesize/6; first = 0; last = booksize-1; if( G[Counter].hashboard == Sbook.firstkey ) middle=0; else if( G[Counter].hashboard == Sbook.lastkey ) middle=booksize-1; else while( first < last ) { /* middle = (first+last) / 2; */ middle = (G[Counter].hashboard-fkey)*(last-first) / (lkey-fkey) + first; if(middle==first) middle++; if(middle==last) middle--; if(middle==first) { #ifdef SHOWREADS printf("notfoundinbook %i\n", hits ); #endif return -1; } if( fseek(f,middle*6,SEEK_SET)!=0 ) return -1; myfread( &pos, sizeof(unsigned), f ); hits++; if( pos < G[Counter].hashboard ) { first=middle; fkey=pos; } else if( pos == G[Counter].hashboard ) break; else { last=middle; lkey=pos; } } /* printf("[%i %i %i %i] [%08X %08X]\n", first,middle,last,booksize,pos,G[Counter].hashboard); */ #ifdef SHOWREADS printf("yesfoundinbook %i\n",hits); #endif if( middle == 0 ) pos = G[Counter].hashboard; else do { middle --; if( fseek(f,middle*6,SEEK_SET)!=0 ) return -1; myfread( &pos, sizeof(unsigned), f ); } while( middle>0 && pos==G[Counter].hashboard ); if(pos!=G[Counter].hashboard) { middle ++; pos = G[Counter].hashboard; } /*** Position found in book! ***/ index=0; if( fseek(f,middle*6+4,SEEK_SET)!=0 ) return -1; while( middle=1 && index>=1 && Counter>8 ) { char p[256]; int i; postr(p); puts("found in both sbook and pbook"); printboard(NULL); puts(p); printf(" 0 0 0 0 book2 "); for( i=0; i!=index2; i++ ) if( i==0 || moves2[i-1]!=moves2[i] ) { printm( m[moves2[i]], NULL ); } puts(""); } #endif foundtxt=1; } if( index > 0 ) { int ii, sumvalues=0, rn; for( ii=0; ii!=index; ii++ ) { sumvalues += values[ii]; } rn = rand()%sumvalues; sumvalues = 0; for( ii=0; ii!=index; ii++ ) { sumvalues += values[ii]; if( sumvalues >= rn ) break; } if( Flag.post ) { int i; char s[128]; if( Flag.xboard ) sprintf(s," 0 0 0 0 book"); else sprintf(s,"Book moves "); if( foundtxt ) sprintf(s+strlen(s),"1 "); else sprintf(s+strlen(s),"2 "); for( i=0; i!=index; i++ ) { printm( m[moves[i]], s+strlen(s) ); } sprintf(s+strlen(s),"\n"); printf(s); if( Flag.log!=NULL && Flag.ponder<2 ) { char sm[64]; if(Flag.xboard) fprintf(Flag.log,s+26); else fprintf(Flag.log,s); fprintf(Flag.log," selected move "); printm( m[moves[ii]], sm ); fprintf(Flag.log,sm); fprintf(Flag.log,"\n"); } } return ( moves[ii] ); } return( -1 ); } /* * Print all book moves (command bk) */ FILE * Eco = NULL; void bk( tmove *m, int n ) { int moves[80], values[80], idx; int pass; int sumvalues=0; #define SHOWECO #ifdef SHOWECO static int att=1; static int seco=0; if( att != 0 && Eco!=NULL ) { typedef struct teco { unsigned hashboard; unsigned point; } teco; static struct teco * peco = NULL; if( att==1 && Counter==0 && G[Counter].hashboard==0x39512910 /*init*/) { int c; tmove * move; peco = malloc(2048*sizeof(teco)); if( peco == NULL ) { puts(" telluser cannot alloc memory for ECO"); att=0; goto abort; } printf("telluser creating ECO index, please wait\n"); while( (c=fgetc(Eco))!='[' ) if( c==EOF ) goto doneinit; for(;;) { tmove m[128]; char ms[32]; int msi; int n; (peco+seco)->point=ftell(Eco)-1; while( (c=getc(Eco))!=']' ) if( c==EOF ) goto doneinit; if( c==EOF ) goto doneinit; setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); for(;;) { msi=0; while( (c=getc(Eco))==' ' || c=='\n' ) {} ungetc(c,Eco); while( (c=getc(Eco))!=' ' && c!='\n' && msi<=30 ) { ms[msi]=c; msi++; if( c==EOF || c=='[' ) { ungetc(c,Eco); goto nextgame; } } ms[msi]='\0'; /* printf("%s ",ms); */ generate_legal_moves( m, &n, checktest(Color) ); move=sandex(ms,m,n); if( move==NULL ) goto nextgame; do_move(move); if( c==EOF ) goto doneinit; } nextgame:; peco[seco].hashboard=G[Counter].hashboard; seco++; while( (c=fgetc(Eco))!='[' ) if( c==EOF ) goto doneinit; } doneinit:; printf(" parsed %i ECO records\n",seco); att=2; setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); } if( Counter>0 && att>1 ) { int counter=Counter; int text=-1; while( Counter > 0 ) { int i; for(i=0;i!=seco;i++) if(peco[i].hashboard==G[Counter].hashboard) { text=peco[i].point; goto foundeco; } undo_move( & G[Counter-1].m ); } foundeco:; while( counter > Counter ) do_move( & G[Counter].m ); if( text==-1 ) printf(" no eco found\n"); else { char t[128], * c; fseek(Eco,text,SEEK_SET); fgets(t,126,Eco); t[127]='\0'; c=index(t,'['); if(c!=NULL) *c = ' '; c=rindex(t,']'); if(c!=NULL) *c = '\0'; puts(t); } } abort:; } #endif for( pass=0; pass!=2; pass++ ) { if( pass==0 ) { int i; idx = bookmoves(moves,values,m,n); if( idx != -1 ) for(i=0;i!=idx;i++) sumvalues += values[i]; printf(" primary book moves\n"); } else { idx = sbookmoves(moves,values,m,n); printf(" secondary book moves\n"); } if( idx > 0 ) { int i; for( i=0; i!=idx; i++ ) if( i==0 || moves[i-1]!=moves[i] ) { printf(" "); printm( m[moves[i]], NULL ); if(pass==0) printf("%3d%%\n",values[i]*100/sumvalues); else printf("\n"); } } else printf(" no move found\n"); } if( Flag.xboard>1 ) puts(""); { char c[128]; postr(c); printf("%s\n",c); } } Phalanx-XXII/data.c0000644000175000001440000000621710314125617013515 0ustar sombrausers#include "phalanx.h" tflag Flag; tsquare B[120]; /* The chessboard */ tlist L[120]; /* List of pieces */ /*** L[1].next ... white king position; L[2].next ... black king position */ tmove PV[MAXPLY][MAXPLY]; /* Principal var. */ tmove Pondermove; tgamenode G[MAXCOUNTER]; int Counter; int Color; int LastIter, Depth, Ply, FollowPV, Totmat, Abort, NoAbort; int DrawScore = -20; long AllDepth = 0; int64 AllNPS = 0; int64 Nodes; /* params that cannot be pushed via SIGALM handler */ int A_n, A_i, A_d; tmove * A_m; int N_moves[8] = { -21, -19, -12, -8, 21, 19, 12, 8 }; int RB_dirs[8] = { 1, -1, 10, -10, 11, -11, 9, -9 }; int Values[7] = { 0, P_VALUE, N_VALUE, B_VALUE, R_VALUE, Q_VALUE, 0 }; signed char Th_[80] = { 0, 91, 92, 93, 94, 95, 96, 97, 98, 0, 0, 81, 82, 83, 84, 85, 86, 87, 88, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 0, 0, 51, 52, 53, 54, 55, 56, 57, 58, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 0, 0, 31, 32, 33, 34, 35, 36, 37, 38, 0, 0, 21, 22, 23, 24, 25, 26, 27, 28, 0 }; signed char *Th = Th_-20; signed char Tv_[80] = { 0, 28, 27, 26, 25, 24, 23, 22, 21, 0, 0, 38, 37, 36, 35, 34, 33, 32, 31, 0, 0, 48, 47, 46, 45, 44, 43, 42, 41, 0, 0, 58, 57, 56, 55, 54, 53, 52, 51, 0, 0, 68, 67, 66, 65, 64, 63, 62, 61, 0, 0, 78, 77, 76, 75, 74, 73, 72, 71, 0, 0, 88, 87, 86, 85, 84, 83, 82, 81, 0, 0, 98, 97, 96, 95, 94, 93, 92, 91, 0 }; signed char *Tv = Tv_-20; int HP[100] = /* hash codes for pieces */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PAWN */ 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* KNIGHT */ 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* BISHOP */ 0, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ROOK */ 0, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* QUEEN */ 0, 11, 10, 0 /* KING */ }; int HS_[80] = /* hash codes for squares */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, 22, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 0, 0, 56, 57, 58, 59, 60, 61, 62, 63, 0 }; int * HS=HS_-20; tdist dist[120*120]; inline int taxi_dist( int a, int b ) { return abs( a%10 - b%10 ) + abs( a/10 - b/10 ); } inline int diag_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return abs(rdi-fdi) + max(rdi,fdi); } inline int max_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return max(rdi,fdi); } inline int min_dist( int a, int b ) { int fdi = abs( a%10 - b%10 ); int rdi = abs( a/10 - b/10 ); return min(rdi,fdi); } void initdist(void) { int i,j; for( i=A1; i!=H9; i++ ) for( j=A1; j!=H9; j++ ) { dist[120*i+j].taxi = taxi_dist(i,j); dist[120*i+j].diag = diag_dist(i,j); dist[120*i+j].max = max_dist(i,j); dist[120*i+j].min = min_dist(i,j); } } Phalanx-XXII/endgame.c0000644000175000001440000002465110314125617014206 0ustar sombrausers#include "phalanx.h" int onepawn( int wk, int wp, int bk, int wtm ) { #define PWINS R_VALUE #define PDRAWS (1-P_VALUE) int wpfile = wp%10; int target = wpfile + 90; int steps = target/10 - wp/10 + ( wk>wp && (wk-wp)%10==0 ) - ( wp <= H2 ); tdist * tardist = dist+120*target; int rookpawn; /** *** If black king is out of the square, it's won. **/ if( (int)(tardist[bk].max) > steps-wtm+1 ) return PWINS-steps; /** *** Now, a draw rule: if black king is much closer to the pawn than *** the white king, it must be a draw. We already know it is in the *** square. Sometimes pawn can stop enemy's diagonal run, so let's *** add a step. With rook pawn it's even easier for the defending side *** - let's add a step too. **/ if( dist[120*wp+bk].max + wtm + 1 + ( (bk-wp)%9==0 || (bk-wp)%11==0 ) <= dist[120*wp+wk].max + ( rookpawn = ( wpfile==FILE_A || wpfile==FILE_H ) ) ) return PDRAWS; /** *** Rook-pawn. **/ if(rookpawn) { if( tardist[bk].max+wtm-1 > tardist[wk].max && abs(wpfile-wk%10)==1 ) return PWINS-P_VALUE-2*steps; return PDRAWS; } /** *** Look at the critical squares, according to the endgames textbook *** by IGM Ludek Pachman. **/ if( wk-wp==19 || wk-wp==20 || wk-wp==21 ) return PWINS-4*steps; if( wk-wp==9 || wk-wp==10 || wk-wp==11 ) if( wp>A5 || ( wtm != (bk-wk==20) ) ) return PWINS-8*steps; /** *** Some simple drawish knowledge - white cannot access critical square. **/ if( wp dist[wk+d2].max ) d = wtm + dist[bk+d2].max - dist[wk+d2].max; else if( dist[bk+d1].max < dist[bk+d2].max ) d = wtm + dist[bk+d2].max - dist[wk+d2].max; else d = wtm + dist[bk+d1].max - dist[wk+d1].max; if(d>0) return PWINS-P_VALUE-4*(steps-d); else if(d<0) return PDRAWS+20+2*d; return 32 * ( dist[(wp+10)*120+bk].taxi - dist[(wp+20)*120+wk].taxi ); } } int Oppb[17] = /* outside passed pawn bonus */ /* +10 +8 +6 +4 */ { 0, 0, 40, 50, 58, 64, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 }; int pawns(void) { extern int wpf[10]; extern int bpf[10]; int result; int color; int wbest=32, bbest=32; static int passed[16] = { 0, 100, 75, 50, 30, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static int kbonus_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 20, 21, 22, 23, 23, 22, 21, 20, 0, 0, 30, 31, 32, 33, 33, 32, 31, 30, 0, 0, 40, 41, 42, 43, 43, 42, 41, 40, 0, 0, 50, 51, 52, 53, 53, 52, 51, 50, 0, 0, 50, 51, 52, 53, 53, 52, 51, 50, 0, 0, 42, 45, 47, 48, 48, 47, 45, 42, 0 }; const int * kbonus = kbonus_-20; if( Totmat == P_VALUE ) /* KPK routine */ { int wk, wp, bk, wtm; if( Color==WHITE ) wtm=1; else wtm=0; if( L[WKP].next != 0 ) { wk = WKP; wp = L[WKP].next; bk = BKP; result = onepawn(wk,wp,bk,wtm); } else { wk = Th[BKP]; wp = Th[L[BKP].next]; bk = Th[WKP]; wtm = !wtm; result = -onepawn(wk,wp,bk,wtm); } if(Color==WHITE) return result; else return -result; } #define bonus(x) ( color==WHITE ? (x) : -(x) ) result = kbonus[WKP]-kbonus[Th[BKP]]; for( color=1; color!=3; color++ ) { int step = ( color==WHITE ? 10 : -10 ); int best = 32; unsigned pawn = PAWN+color; unsigned xpawn = PAWN+enemy(color); unsigned kp = L[color].next; unsigned xkp = L[enemy(color)].next; int * pf = ( color==WHITE ? wpf : bpf ); int s; /* square */ int i; for( i=1; i!=9; i++ ) pf[i]=0; for( s = L[kp].next; s != 0; s = L[s].next ) { int b, togo; int blocks = 0; int cannotmove; int protected; int stepstosquare; pf[s%10]++; /* doubled pawn */ if( pf[s%10] > 1 ) result -= bonus(8); if( B[s+step] ) cannotmove = 1; else { int f=0; if( B[s+step+step+1] == xpawn ) f++; if( B[s+step+step-1] == xpawn ) f++; if(f) { if( B[s+1] == pawn ) f--; if( B[s-1] == pawn ) f--; cannotmove = (f>0); } else cannotmove=0; } if(cannotmove) result -= bonus(6); protected = ( B[s-step-1]==pawn || B[s-step+1]==pawn ); /* lets make kings active */ if( ! protected ) { int di = dist[120*xkp+s].max; if(cannotmove) b = bonus( 32-4*di ); else b = bonus( 16-2*di ); if(di==1) { if(cannotmove) b+=30; else b+=20; } result -= b; } if( B[s+step] == xpawn ) goto end_passed; for( i=s+step+step; B[i]!=3; i+=step ) { if( B[i] ) blocks++; if( B[i]==xpawn || B[i-1]==xpawn || B[i+1]==xpawn ) goto end_passed; } /*** BEGIN: passed pawn evaluation ***/ i -= step; /* the queening square */ togo = blocks+abs(s-i)/10; /* steps to queen */ b = bonus(passed[togo]); result += b; /* protected passer -> more bonus */ if( protected ) result += b+b; /* out of enemy's king square */ stepstosquare=(int)(dist[xkp*120+i].max)-togo+(Color==color); if( stepstosquare>1 ) { result += b+b; if( togo < best ) best = togo; } /* distance from enemy king */ b = dist[xkp*120+s+step].max * (12-togo); result += bonus(b); /*** END: passed pawn evaluation ***/ end_passed:; /*** some points for advancement ***/ result += (s/10-4-color)*2; } if( color == WHITE ) wbest=best; else bbest=best; } if( wbest!=32 ) if( bbest!=32 ) { if( wbest-bbest > 2 ) result += -300 + (bbest-wbest)*60; else if( bbest-wbest > 2 ) result += 300 + (bbest-wbest)*60; else result += (bbest-wbest)*40; } else result += (30-wbest)*20; else if( bbest!=32 ) result -= (30-bbest)*20; /* a simple detection of outside passed pawn */ if( G[Counter].mtrl && G[Counter].xmtrl ) /* both sides must have pawns */ { int whas=0, bhas=0; /* white/black left/right -most pawn file (0-10) */ int wrm = Wknow.rpf; int wlm = Wknow.lpf; int brm = Bknow.rpf; int blm = Bknow.lpf; /*** look at leftmost pawn ***/ if( wlm+1wlm+3 ) whas=blm-wlm; else if( blm+1blm+3 ) bhas=wlm-blm; /*** look at rightmost pawn ***/ if( wrm-1>brm && wrm>wlm+3 ) whas+=wrm-brm; else if( brm-1>wrm && brm>blm+3 ) bhas+=brm-wrm; result += Oppb[whas]-Oppb[bhas]; } if( Color == BLACK ) result = -result; /* consistency with trade down bonus: 5 points per pawn */ if( G[Counter].mtrl > G[Counter].xmtrl ) result += G[Counter].mtrl/20; else if( G[Counter].mtrl < G[Counter].xmtrl ) result -= G[Counter].xmtrl/20; return result; } /* table for king bishop knight endings */ int nb_[80] = { 0,100, 90, 80, 70, 60, 50, 40, 30, 0, 0, 90, 80, 70, 57, 45, 32, 20, 40, 0, 0, 80, 70, 50, 37, 23, 10, 32, 50, 0, 0, 70, 57, 37, 10, 0, 23, 45, 60, 0, 0, 60, 45, 23, 0, 10, 37, 57, 70, 0, 0, 50, 32, 10, 23, 37, 50, 70, 80, 0, 0, 40, 20, 32, 45, 57, 70, 80, 90, 0, 0, 30, 40, 50, 60, 70, 80, 90,100, 0 }; int * nb = nb_-20; int e_mp(void) /*** minor piece and pawn ***/ { if( G[Counter].mtrl && G[Counter].xmtrl ) { /*** minor piece against pawn ***/ int p; if( G[Counter].mtrl == P_VALUE ) { if( Color == WHITE ) p = L[WKP].next/10; else p = 11 - L[BKP].next/10; } else { if( Color == WHITE ) p = - ( 11 - L[BKP].next/10 ); else p = - L[WKP].next/10; } return G[Counter].xmtrl - G[Counter].mtrl + 3*p; } else { /*** check for bad bishop ***/ int ss; /* stronger side */ int wb, wp, wk, bk; extern signed char * sqcolor; if( L[WKP].next ) { wk=WKP; if( B[L[wk].next]==WP ) { wp=L[wk].next; wb=L[wp].next; } else { wb=L[wk].next; wp=L[wb].next; } if( B[wb] == WN ) { if( ( B[A7]==WP && ( B[A8]==BK || B[B7]==BK ) ) ||( B[H7]==WP && ( B[H8]==BK || B[G7]==BK ) ) ) return G[Counter].xmtrl - G[Counter].mtrl; else return 0; } bk=BKP; ss=WHITE; } else { wk=BKP; if( B[L[wk].next]==BP ) { wp=L[wk].next; wb=L[wp].next; } else { wb=L[wk].next; wp=L[wb].next; } bk=WKP; ss=BLACK; if( B[wb] == BN ) { if( ( B[A2]==BP && ( B[A1]==WK || B[B2]==WK ) ) ||( B[H2]==BP && ( B[H1]==WK || B[G2]==WK ) ) ) return G[Counter].xmtrl - G[Counter].mtrl; else return 0; } wk=Th[wk]; wp=Th[wp]; wb=Th[wb]; bk=Th[bk]; } switch( wp%10 ) { case FILE_A: break; case FILE_H: wp=Tv[wp]; wk=Tv[wk]; wb=Tv[wb]; bk=Tv[bk]; break; default: return 0; /* this is not a rook pawn */ } if( sqcolor[wb] == 1 ) return 0; /* the bishop is ok */ /* Draw!! */ if( bk > wp ) if( bk%10=A7 ) { return G[Counter].xmtrl - G[Counter].mtrl; } } return 0; } int e_nb( int color ) /*** mating with knight and bishop ***/ { int kdist = 8 * dist[WKP*120+BKP].max; int kp=A1; int i, npd=0; extern signed char * sqcolor; if( color == WHITE ) { for( i=L[WKP].next; i!=0; i=L[i].next ) if( B[i] == WN ) npd=2*dist[120*i+BKP].taxi; else if( B[i] == WB ) { if( sqcolor[i] == 1 ) kp = Th[BKP]; else kp = BKP; } } else { for( i=L[BKP].next; i!=0; i=L[i].next ) if( B[i] == BN ) npd=2*dist[120*i+WKP].taxi; else if( B[i] == BB ) { if( sqcolor[i] == 1 ) kp = Th[WKP]; else kp = WKP; } } if( color == Color ) return -kdist-npd+nb[kp]; else return kdist+npd-nb[kp]; } int e_rpr(void) { int wk, wr, wp, bk, br; int result = 0; int sstm; /* it's stronger's side move */ if( G[Counter].mtrl > G[Counter].xmtrl ) { sstm=1; wk=L[Color].next; bk=L[enemy(Color)].next; br=L[bk].next; } else { sstm=0; wk=L[enemy(Color)].next; bk=L[Color].next; br=L[bk].next; } if( piece(B[L[wk].next]) == ROOK ) { wr=L[wk].next; wp=L[wr].next; } else { wp=L[wk].next; wr=L[wp].next; } if( B[bk] == WK ) { wk=Th[wk]; wr=Th[wr]; wp=Th[wp]; bk=Th[bk]; br=Th[br]; } if( wp%10 > FILE_D ) { wk=Tv[wk]; wr=Tv[wr]; wp=Tv[wp]; bk=Tv[bk]; br=Tv[br]; } result = wp/10-5; if( wp%10 == FILE_A ) result -= 15; result -= 2*dist[br*120+wp].max + 3*abs(br%10-wp%10); if( bk > wp ) switch( wp%10-bk%10 ) { case -2: break; case -1: result -= 20; break; case 0: result -= 50; break; case 1: result -= 40; break; case 2: if( br%10-wp%10 > 3 ) result -= 35; else result -= abs(br%10-wp%10)*3; break; default: result += 10*abs(wp%10-bk%10); } else result += 5*(wp/10-bk/10); if( wk < wp ) result -= 5*(wp/10-wk/10); if( br1) for( i=(*n)-1; i>=0 && (*n)>4; i-- ) { /* compute the probability this move is not seen */ int p = initp; /* being blind to recaptures is too stupid, see them */ if( m[i].to == G[Counter-1].m.to ) p -= 30; /* same for pawn captures */ if( m[i].in2 != 0 && piece(m[i].from)==PAWN ) p -= 40; /* another bonus for this is in the next section */ /* same for very short captures */ switch( dist[120*m[i].from+m[i].to].max ) { case 0: case 1: p -= 80; break; case 2: p -= 50; break; case 3: p -= 10; break; } /* underpromotions? too precise! */ if( m[i].in1 != m[i].in2a && piece(m[i].in2a) != QUEEN ) p += 10; else p -= 10; /* dont see long moves, especially diagonal ones */ p += dist[120*m[i].from+m[i].to].taxi * 2; /* dont see some knight moves */ if( piece(m[i].in1) == KNIGHT ) p += 10; /* going backward? (white)Bf6xc3 is much more difficult * to see than (white)Bc3xf6 ***/ if( Color==WHITE ) p += 3 * ( m[i].to/10 - m[i].from/10 ); else p += 3 * ( m[i].from/10 - m[i].to/10 ); if( rand()%128 < p ) { m[i] = m[(*n)-1]; (*n)--; } } } void initcache(void) { #ifdef CACHE C = malloc(0x10000*sizeof(unsigned)); /* 64k entries of 8 bytes: 512kB */ if( C==NULL ) { puts("cannot alloc static eval cache!"); exit(0); } #endif } int psnl[MAXPLY]; int devi[MAXPLY]; inline int approx_eval(void) { psnl[Ply] = - psnl[Ply-1]; devi[Ply] = devi[Ply-1]*2/3 + abs(psnl[Ply])/8; if( G[Counter-1].m.in2 ) devi[Ply] += 60; else devi[Ply] += 40; return G[Counter].mtrl - G[Counter].xmtrl + psnl[Ply]; } int static_eval(void) { int positional; int r50 = 100 - G[Counter].rule50; int material = G[Counter].mtrl-G[Counter].xmtrl; #ifdef CACHE if( ( ( C[ 0x0000FFFF & G[Counter].hashboard ] ^ G[Counter].hashboard ) & 0xFFFF0000 ) == 0 ) { unsigned * cc = C + ( 0x0000FFFF & G[Counter].hashboard ); Wknow.prune = (((*cc)&0x00004FFF)!=0); Bknow.prune = (((*cc)&0x00008FFF)!=0); return ( (*cc) & 0x00003FFF ) ; } #endif positional = score_position(); if( r50 < RULE_50_CLOSE ) { positional = positional * r50 / RULE_50_CLOSE; material = material * r50 / RULE_50_CLOSE; } #undef RAISE #ifdef RAISE /* Inbalanced material: take positional bonus seriously */ if( abs(material) > 200 ) { int m = abs(material) - 200; if( m > 1000 ) m=1000; #ifdef SCORING if( Scoring ) printf( " ( ) inbalanced material, positional raised: %i -> %i\n", positional, positional + positional*m/500 ); #endif positional = positional + positional*m/500; } #endif #ifdef CACHE { unsigned * cc = C + ( 0x0000FFFF & G[Counter].hashboard ); *cc = ( 0xFFFF0000 & G[Counter].hashboard ) | ( material+positional ); if( Wknow.prune ) *cc |= 0x00004000; else *cc &= (0xFFFFFFFF-0x00004000); if( Bknow.prune ) *cc |= 0x00008000; else *cc &= (0xFFFFFFFF-0x00008000); } #endif psnl[Ply] = positional; devi[Ply] = 0; #undef debug #ifdef debug if(abs(positional)>600) { Scoring = 1; score_position(); Scoring = 0; printboard(); printf("[%i,%i,%i]",material,positional,score_position()); getchar(); } #endif return material+positional; } inline int repetition( int n ) { int i; int r=0; unsigned board = G[Counter].hashboard; for( i=Counter-2; i>=0; i-=2 ) { if( G[i].hashboard == board ) if( ++r == n ) return 1; if( G[i].rule50 <= 1 ) break; } return 0; } int material_draw( void ) { int i, n=2; for( i=L[WKP].next; i!=0; i=L[i].next ) switch( B[i] ) { case WQ: case WR: case WP: return 0; default: n--; if( n==0 ) return 0; } for( i=L[BKP].next; i!=0; i=L[i].next ) switch( B[i] ) { case BQ: case BR: case BP: return 0; default: n--; if( n==0 ) return 0; } return 1; } /*****************************************************************/ int evaluate( int Alpha, int Beta ) { static int timeslice = 2000; int result; tmove m[256]; int n; /* moves and number of moves */ thashentry *t; int check; int lastiter; int depthplus = 0; int totmat = Totmat = G[Counter].mtrl+G[Counter].xmtrl; if(Ply%2) lastiter = -LastIter; else lastiter = LastIter; Nodes++; if( Flag.level == fixedtime || Flag.level == timecontrol ) if( ( Nodes % timeslice ) == 0 && !Flag.analyze ) { extern long T1; int t = Flag.centiseconds - ptime() + T1; if( t < 0 ) { if( Flag.ponder >= 2 ) Flag.ponder = 3; else Abort = 2; } else if( t != Flag.centiseconds ) timeslice = Nodes * t / ( Flag.centiseconds - t ) * 2 / 3; if( timeslice > 5*Flag.centiseconds ) timeslice = 5*Flag.centiseconds; if( timeslice < 50 ) timeslice = 50; } { static int slice = 4000; static int64 lnodes = 0; if( lnodes + slice < Nodes || Nodes == 1 ) { static long lptime = 0; long nptime = ptime(); if( nptime == lptime ) nptime++; if( nptime - lptime < 100 ) slice = slice*11/10; else slice = slice*10/11; lptime = nptime; if( Flag.post && !Flag.xboard ) verboseline( A_m, A_i, A_n ); if(Flag.polling) { static fd_set readfds; static struct timeval tv; int data; FD_ZERO (&readfds); FD_SET (fileno(stdin), &readfds); tv.tv_sec=0; tv.tv_usec=0; select(16, &readfds, 0, 0, &tv); data=FD_ISSET(fileno(stdin), &readfds); if(data) interrupt(0); } /* if( Flag.analyze ) printf("stat01: %d %d %d %d %d\n",0,Nodes,A_d,A_i,A_n); */ lnodes = Nodes; } } if( Ply >= MAXPLY-2 ) { PV[Ply][Ply].from=0; return G[Counter].mtrl-G[Counter].xmtrl; } if( G[Counter].rule50 >= 100 ) /* 50 moves draw */ { PV[Ply][Ply].from=0; return DRAW; } /* insufficient material draw */ if( G[Counter].mtrl<400 && G[Counter].mtrl<400 ) if( material_draw() ) { PV[Ply][Ply].from=0; return DRAW; } /* if( Depth <= -200 && G[Counter].rule50 >= 3 ) { printboard(); printf("[depth=%i]",Depth); printm(G[Counter-1].m,NULL); getchar(); } */ if( G[Counter].rule50 >= 3 ) if( repetition(1) ) /* third rep. draw */ { int j; int ext=0; PV[Ply][Ply].from=0; for( j=Counter-1; j>Counter-Ply; j-=2 ) { ext += G[j-1].m.dch - G[j].m.dch; } if( ext > 0 ) { if( ext > 500 ) ext=500; ext += Ply*20; } else if( ext < 0 ) { if( ext < -500 ) ext=-500; ext -= Ply*20; } return ext/10+DRAW; } /******************************************************************** * Now it is time to look into the hashtable. ********************************************************************/ if( SizeHT == 0 ) t = NULL; else if( (t=seekHT()) != NULL ) if( t->depth >= Depth || ( Depth<300 && abs(t->value)>CHECKMATE-1000 ) ) { int val = t->value; if( val > CHECKMATE-1000 ) val -= Ply; else if( val < -CHECKMATE+1000 ) val += Ply; switch( t->result ) { case no_cut: /* `true value', good_score */ PV[Ply][Ply].from=0; return val; break; case alpha_cut: /* `this or less', failed_low */ if( val <= Alpha ) { PV[Ply][Ply].from=0; return val; } if( val < Beta ) Beta = val; break; case beta_cut: /* `this or more', failed_high */ if( val >= Beta ) { PV[Ply][Ply].from=0; return val; } if( val > Alpha ) Alpha = val; break; } } /***** End of hashtable stuff *****/ #undef nodef #ifdef nodef { static int64 int good=0, all=0; if( t!=NULL && t->move!=0 ) good++; all++; if( all%100000 == 0 && all!=0 ) printf("hit percentage = %lld.%02lld%%\n",good*100/all,good*10000/all%100); } #endif G[Counter].check = check = checktest(Color); if( Depth>0 || check ) { result = approx_eval(); #ifdef FORWARD_PRUNING if( Depth < 100 && ! check && Totmat > 2000 && ( Color==WHITE ? Wknow.prune : Bknow.prune )) { if( result-devi[Ply] >= Beta ) return Beta; else if( result-devi[Ply] > Alpha ) Alpha = result-devi[Ply]; } #endif if(Depth>0) { result = static_eval(); } #ifdef FORWARD_PRUNING if( Depth < 100 && ! check && Totmat > 2000 && ( Color==WHITE ? Wknow.prune : Bknow.prune )) { if( result >= Beta ) return Beta; else if( result > Alpha ) Alpha = result; } #endif #ifdef NULL_MOVE_PRUNING if( Depth >= 100 && result+100 >= Beta && ( result >= Beta || Depth > NULL_MOVE_PRUNING ) && ! FollowPV && ! check && G[Counter].mtrl > Q_VALUE+B_VALUE /* zugzwang fix */ /* && G[Counter-1].m.special != 20 */ /* prev. node not nullm */ && ( t==NULL || t->depth <= Depth-NULL_MOVE_PRUNING || t->result==beta_cut || t->value >= Beta ) ) { int value; int olddepth = Depth; int alpha = -Beta; tmove m[256]; int n; /* moves and number of moves */ G[Counter].m.in1 = 0; /* disable en passant */ G[Counter].m.special = 20; G[Counter].m.to = 2; Counter ++; Ply ++; G[Counter].castling = G[Counter-1].castling; G[Counter].rule50 = G[Counter-1].rule50 + 1; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; G[Counter].mtrl = G[Counter-1].xmtrl; G[Counter].xmtrl = G[Counter-1].mtrl; Color = enemy(Color); Depth -= NULL_MOVE_PRUNING; if( Depth <= 0 ) { Depth = 0; #ifdef QCAPSONLY generate_legal_captures(m,&n,0); #else generate_legal_checks(m,&n); #endif } else { generate_legal_moves( m, &n, 0 ); } if( n!=0 ) value = -search( m, n, alpha, CHECKMATE ); else { if(Depth!=0) value=Alpha; else value=result; } Color = enemy(Color); Counter --; Ply --; Depth = olddepth; Totmat = totmat; if( value >= Beta ) { result = value; goto end; } if( value > Alpha ) Alpha = value; else if( value < -CHECKMATE+P_VALUE && Alpha > -CHECKMATE+Q_VALUE ) if( Depth <= 300 ) depthplus = (160-EXTENSION_BASE); } #endif generate_legal_moves(m,&n,check); /** Return, if there is no legal move - checkmate or stalemate **/ if(n==0) { PV[Ply][Ply].from=0; if(check) return Ply-CHECKMATE; else return DRAW; } #ifdef CHECK_EXTENSIONS if( check ) /* extend the lines */ { if( result>lastiter-50 && result>-250 ) { int i, newdch = EXTENSION_BASE-20, inrow=0; if( Depth <= 100 ) newdch -= 30; else if( Depth <= 200 ) newdch -= 20; for( i=Counter-2; i>0 && G[i].check; i-=2 ) inrow++; switch( inrow ) /* number of checks in row */ { case 0: break; case 1: newdch -= 10; break; default: newdch -= 30; break; } if(n>4) newdch += 6*(n-5); else newdch -= 20*(5-n); if( newdch > 60 ) newdch = 60; else if( newdch < -40 ) newdch = -40; for( i=0; i!=n; i++ ) m[i].dch = newdch; } else /* losing anyway */ { int i; for( i=0; i!=n; i++ ) m[i].dch = 60; } } #endif #ifdef PAWNSTRIKE_EXTENSIONS if( piece(G[Counter-1].m.in1) == PAWN ) if(result>lastiter-50 && result>-250) /* winning anyway: dont extend */ { /* Look at the targets of previous enemy move. * If it seems to be dangerous, extend all safe * captures of enemy's last moved pawn. */ int i; int nex = 0; int squ = G[Counter-1].m.to; int t1=0, t2=0; int newdch = EXTENSION_BASE-49; if(Ply==1) newdch = (newdch+100) >> 1; if( Color == WHITE ) /* targets of black p. */ { if( color(B[squ-11]) == WHITE ) if( B[squ-11] >= KNIGHT ) t1 = squ-11; if( color(B[squ-9]) == WHITE ) if( B[squ-9] >= KNIGHT ) t2 = squ-9; } else { if( color(B[squ+11]) == BLACK ) if( B[squ+11] >= KNIGHT ) t1 = squ+11; if( color(B[squ+9]) == BLACK ) if( B[squ+9] >= KNIGHT ) t2 = squ+9; } if( t1 || t2 ) { /* find all safe captures of the agressor */ for( i=0; i!=n; i++ ) if( m[i].to == squ ) if( piece(m[i].in1) == PAWN || ! attacktest( squ, enemy(Color) ) ) { m[i].dch = newdch; nex ++; } if( nex == 0 ) /* find all safe escapes */ for( i=0; i!=n; i++ ) if( m[i].dch == 100 ) if( ( t1 && m[i].from == t1 ) || ( t2 && m[i].from == t2 ) ) if( ! attacktest( m[i].to, enemy(Color) ) || Values[m[i].in2>>4] >= Values[m[i].in1>>4] ) if( newdch < m[i].dch ) { m[i].dch = newdch; nex++; } if( nex > 1 ) for(i=0;i!=n;i++) if(m[i].dch==newdch) m[i].dch=100; # undef debug # ifdef debug if( nex == 1 ) { printboard(); printm( G[Counter-1].m, NULL ); puts(""); for( i=0; i!=n; i++ ) if( m[i].dch != 100 ) { printm( m[i], NULL ); printf("/ %i ", m[i].dch ); } getchar(); } # endif } } #endif #ifdef PAWNPUSH_EXTENSIONS if( Totmat < 4000 ) if(result= A6 ) || ( Color==BLACK && m[i].to <= H3 ) ) ) { int j; int support=0; int newdch=EXTENSION_BASE; if( Color == WHITE ) { for( j=m[i].to+10; j<=H7; j+=10 ) if( B[j-1]==BP || B[j]==BP || B[j+1]==BP ) goto no_push_extension; for( j=m[i].to; j<=H8; j+=10 ) { if( B[j] ) support--; if( see(B,m[i].from,j) < 0 ) support--; else support++; } } else { for( j=m[i].to-10; j>=A2; j-=10 ) if( B[j-1]==WP || B[j]==WP || B[j+1]==WP ) goto no_push_extension; for( j=m[i].to; j>=A1; j-=10 ) { if( B[j] ) support--; if( see(B,m[i].from,j) < 0 ) support--; else support++; } } newdch += Depth/20 + Totmat/100 - 30*support; switch( m[i].to/10 ) { case 8: case 3: if(support>0) newdch -= 20*support+10; break; } if( newdch < m[i].dch ) { m[i].dch = newdch; } no_push_extension:; } } #endif #ifdef ETTC if( Depth > 200 && SizeHT != 0 ) { extern void do_hash(tmove *), undo_hash(tmove *); int i; for( i=0; i!=n; i++ ) { thashentry *t; do_hash(m+i); if( (t=seekHT()) != NULL ) if( t->depth >= Depth ) if( t->result != beta_cut ) { int val = -t->value; if( val > CHECKMATE-100 ) val -= Ply; else if( val < -CHECKMATE+100 ) val += Ply; if( val > Alpha ) { if( val >= Beta ) { undo_hash(m+i); G[Counter].m = m[i]; PV[Ply][Ply] = m[i]; PV[Ply][Ply+1].from = 0; result = Beta; goto end; } Alpha=val; } } undo_hash(m+i); } } #endif } else { /*** Quiescence search ***/ result = approx_eval(); if( Depth < -400 ) { PV[Ply][Ply].from=0; goto end; } if( ( result < Beta+devi[Ply] && result > Alpha-devi[Ply] ) || Totmat<=(B_VALUE+P_VALUE) ) result = static_eval(); if( result >= Beta ) return result; if( result <= Alpha-(Q_VALUE+minmv) && Depth <= -100 ) { return Alpha; } #ifdef QCAPSONLY generate_legal_captures(m,&n,Alpha-result-minmv); #else /* What to generate? Only captures or also safe checks? */ if( G[Counter].mtrl-G[Counter].xmtrl < 400 && Depth > -100 && ( Color==WHITE ? ( Bknow.khung > 1 ) : ( Wknow.khung > 1 ) ) ) generate_legal_checks(m,&n); else generate_legal_captures(m,&n,Alpha-result-minmv); #endif } #ifdef RECAPTURE_EXTENSIONS if( G[Counter-1].m.in2 ) if( result> 4 ]; int v2 = Values[ G[Counter-1].m.in2 >> 4 ]; int newdch; if( Depth <= 200 ) newdch = EXTENSION_BASE-30; else newdch = EXTENSION_BASE-20; if( min(v1,v2) > 400 || G[Counter].mtrl < Q_VALUE ) newdch -= 70; else if( min(v1,v2) > 200 || G[Counter].mtrl < (Q_VALUE+N_VALUE) ) newdch -= 45; /* recaptures depth bonus */ for( i=0; i!=n; i++ ) if( m[i].to == t ) if( m[i].dch > newdch ) /* if( Depth<=100 || see(B,m[i].from,m[i].to) >= v1 ) */ m[i].dch = newdch; } #endif #ifdef PEE_EXTENSIONS if( Depth > 200 && G[Counter].mtrl <= (8*P_VALUE) && G[Counter].xmtrl <= (8*P_VALUE+Q_VALUE) && G[Counter-1].m.in2 > KNIGHT ) { int i; int target=0; int cdch; for( i=L[L[Color].next].next; i!=0; i=L[i].next ) if( B[i] >= KNIGHT ) goto nopee; for( i=L[L[enemy(Color)].next].next; i!=0; i=L[i].next ) if( B[i] >= KNIGHT ) { if( target ) goto nopee; else target=i; } if( ! target ) goto nopee; if( G[Counter-1].m.in2 >= QUEEN ) cdch = min(Depth,450); else cdch = min(Depth*2/3,350); for( i=0; i!=n; i++ ) if( m[i].to == target ) { m[i].dch -= cdch; /* printboard(NULL); printm(m[i],NULL); getchar(); */ } nopee:; } #endif /*** Compute heuristic values of moves ***/ add_killer( m, n, t ); PV[Ply][Ply].from = 0; /* easy levels: be blind: forget about some long and knight captures */ if( Flag.easy && n>10 ) blunder(m,&n); /*** Full-width search ***/ if( Depth>0 || check ) { if( depthplus ) result = csearch(m,n,Alpha,Beta,depthplus); else result = search(m,n,Alpha,Beta); } else /*** Quiescence ***/ { if( result > Alpha ) result = search(m,n,result,Beta); else result = search(m,n,Alpha,Beta); } end: if( result>=Beta && Depth>0 ) write_killer( G[Counter].m.from, G[Counter].m.to ); if( SizeHT != 0 && Abort == 0 ) writeHT( result, Alpha, Beta ); /** *** Check learning file. *** This should be done before search. It is here only for *** timing heuristics stability problem that needs better *** solution. **/ if( Depth > 300 && Flag.learn ) if( Depth > 400 || Ply<3 ) { int lresult = rlearn(); if( lresult != NOVALUE ) { PV[Ply][Ply].from=0; if( lresult > CHECKMATE-1000 ) lresult -= Ply; if( lresult < -CHECKMATE+1000 ) lresult += Ply; result = lresult; } } return result; } Phalanx-XXII/genmoves.c0000644000175000001440000003140210314125617014421 0ustar sombrausers/* * Generating moves */ #include "phalanx.h" unsigned char pin[120]; unsigned char tar[120]; #undef debugsee /* Static Exchange Evaluator */ int see( tsquare * b, int from, int square ) { static int wl[16]; static int bl[16]; int wn, bn; int color = color(b[from]); int i,p; int minwn, minbn; unsigned static int backup; #define ret(X) return ( color==WHITE ? (X) : -(X) ) wn=bn=1; if( color == WHITE ) { wl[0] = Values[ b[from] >> 4 ]; bl[0] = Values[ b[square] >> 4 ]; } else { wl[0] = Values[ b[square] >> 4 ]; bl[0] = Values[ b[from] >> 4 ]; } backup = b[from]; b[from] = 0; if( b[square-9]==WP ) { wl[wn] = P_VALUE; wn++; } if( b[square-11]==WP ) { wl[wn] = P_VALUE; wn++; } if( b[square+9]==BP ) { bl[bn] = P_VALUE; bn++; } if( b[square+11]==BP ) { bl[bn] = P_VALUE; bn++; } for( i=0; i!=8; i++ ) if( ( p = b[square+N_moves[i]] ) ) switch( p ) { case WN: wl[wn] = N_VALUE; wn++; break; case BN: bl[bn] = N_VALUE; bn++; break; } wl[ minwn=wn ] = CHECKMATE; bl[ minbn=bn ] = CHECKMATE; for( i=0; i!=8; i++ ) { int step = RB_dirs[i]; int minw = minwn; int minb = minbn; int dest = square; for(;;) { dest += step; while( b[dest] == 0 ) dest += step; p = b[dest]; if( p==3 || piece(p)==KNIGHT ) break; if( i < 4 ) { if( piece(p) == BISHOP ) break; } else { if( piece(p) == ROOK ) break; } if( p==WK ) { if( dest-step==square ) { wl[wn] = CHECKMATE; wn++; wl[wn] = CHECKMATE; } break; } else if( p==BK ) { if( dest-step==square ) { bl[bn] = CHECKMATE; bn++; bl[bn] = CHECKMATE; } break; } else if( p==WP ) { if( dest-square == 9 || dest-square == 11 ) continue; else break; } else if( p==BP ) { if( dest-square == -9 || dest-square == -11 ) continue; else break; } else { int j; int val = Values[p>>4]; if( color(p) == WHITE ) { while( wl[minw] <= val ) minw++; for( j=wn+1; j!=minw; j-- ) wl[j] = wl[j-1]; wl[minw] = val; wn++; wl[wn]=CHECKMATE; minw++; } else { while( bl[minb] <= val ) minb++; for( j=bn+1; j!=minb; j-- ) bl[j] = bl[j-1]; bl[minb] = val; bn++; bl[bn]=CHECKMATE; minb++; } } } } b[from] = backup; #ifdef debugsee printf("WHITE: "); for(i=0;i!=wn;i++) printf(" %hi",wl[i]); puts(""); printf("BLACK: "); for(i=0;i!=bn;i++) printf(" %hi",bl[i]); puts(""); #endif /*** Let's count it ***/ { int wi=0; int bi=0; int result=0; int alpha=-CHECKMATE, beta=CHECKMATE; if( color == BLACK ) { result -= wl[wi]; wi++; alpha = result; } for(;;) { if( wi == wn ) ret(alpha); else { result += bl[bi]; bi++; if( result < beta ) { if( result < alpha ) ret(alpha); beta = result; } } #ifdef debugsee printf("[w,%hi,%hi,%hi]",alpha,result,beta); #endif if( bi == bn ) ret(beta); else { result -= wl[wi]; wi++; if( result > alpha ) { if( result > beta ) ret(beta); alpha = result; } } #ifdef debugsee printf("[b,%hi,%hi,%hi]",alpha,result,beta); #endif } } } void find_pins( int check ) { int d, square; if(check) { memset( pin+20, 1, 80*sizeof(char) ); return; } memset( pin+20, 0, 80*sizeof(char) ); square = L[Color].next; pin[square] = 1; for(d=0;d!=8;d++) { int step = RB_dirs[d]; int destination = square; int mark = 0; for(;;) { destination += step; if( B[destination] ) { if( color(B[destination]) == Color ) { if(mark) break; mark = destination; } else { if(mark) { switch( piece(B[destination]) ) { case QUEEN: pin[mark]=abs(step); break; case ROOK: if(d<4) pin[mark]=abs(step); break; case BISHOP: if(d>3) pin[mark]=abs(step); break; } } break; } } } } #undef debug #ifdef debug printboard(); for(d=0;d!=120;d++) { if(d%10==0) puts(""); printf("%3i",pin[d]); } getchar(); #endif } void find_targets(void) { int d,square; /* memset( tar, 0, 120*sizeof(char) ); */ memset( tar+20, 0, 80*sizeof(char) ); square = L[enemy(Color)].next; for(d=0;d!=8;d++) { int step = RB_dirs[d]; int destination = square; for(;;) { destination += step; if( B[destination] ) break; if( d<4 ) tar[destination]=ROOK; else tar[destination]=BISHOP; } if( B[(destination=square+N_moves[d])] == 0 ) tar[destination]=KNIGHT; } #undef debug #ifdef debug printboard(); for(d=0;d!=120;d++) { if(d%10==0) puts(""); printf("%04X ",tar[d]); } getchar(); #endif } /* * LINKING GENERATED MOVE */ int square, destination; #define From square #define To destination void lm( tmove *m, unsigned char In2a, unsigned char Special, int *i ) { m->in1 = B[m->from=From]; m->in2 = B[m->to=To]; m->in2a = In2a; m->dch = 100; m->value = 0; m->special = Special; if( m->special != 0 || pin[m->from] ) { do_move(m); if( ! checktest(enemy(Color)) ) (*i)++; undo_move(m); } else (*i)++; } # define link_move(In2a,Special) \ { lm( moves+i, In2a, Special, &i ); } #define link_castling(C) \ { register tmove* m = &moves[i]; \ m->from = A1; /* anything different from 0 */ \ m->to = A1; \ m->dch = 100; \ m->special = C; \ i++; \ } void generate_legal_moves( tmove moves[], int *n, int check ) { int i = 0; find_pins( check ); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 ) { if( destination < A8 ) /* not a promotion */ { link_move(WP,0); } else /* pawn promotion */ { unsigned piece; for( piece=WQ; piece!=WP; piece-=PAWN ) link_move(piece,0); } if( square < A3 ) { destination += 10; if( B[destination] == 0 ) link_move(B[square],0); } } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { link_move(WP,0); } else { unsigned piece; for( piece=WQ; piece!=WP; piece-=PAWN ) link_move(piece,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 ) { if( destination>H1 ) /* not a promotion */ { link_move(BP,0); } else /* pawn promotion */ { unsigned piece; for( piece=BQ; piece!=BP; piece-=PAWN ) link_move(piece,0); } if( square>H6 ) { destination -= 10; if( B[destination] == 0 ) link_move(BP,0); } } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { link_move(BP,0); } else { unsigned piece; for( piece=BQ; piece!=BP; piece-=PAWN ) link_move(piece,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( ! ( color(B[destination]) & Color ) ) link_move(B[square],0); } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( ! ( color(B[destination]) & Color ) ) link_move(B[square],0); if( B[destination] ) break; } } } } } /* Special moves: en passant, castling */ /* En passant capture first */ if( Counter != 0 ) { int c = Counter-1; if( piece(G[c].m.in1) == PAWN && abs(G[c].m.from-G[c].m.to) == 20 ) /* The last move was a pawn double step */ { for( square = G[c].m.to-1; square != G[c].m.to+3; square += 2 ) if( B[square] == PAWN+Color ) { int special = G[c].m.to; destination = Color==WHITE ? special+10 : special-10; link_move( B[square], special ) } } } /* Castling */ if( ! check ) { if( Color == WHITE ) { /****** Short ******/ if( ( G[Counter].castling & WSHORT ) == 0 ) if( B[F1]==0 && B[G1]==0 ) if( ! attacktest(F1,BLACK) && ! attacktest(G1,BLACK) ) link_castling( SHORT_CASTLING ); /****** Long ******/ if( ( G[Counter].castling & WLONG ) == 0 ) if( B[B1]==0 && B[C1]==0 && B[D1]==0 ) if( ! attacktest(C1,BLACK) && ! attacktest(D1,BLACK) ) link_castling( LONG_CASTLING ); } else /* Black */ { /****** Short ******/ if( ( G[Counter].castling & BSHORT ) == 0 ) if( B[F8]==0 && B[G8]==0 ) if( ! attacktest(F8,WHITE) && ! attacktest(G8,WHITE) ) link_castling( SHORT_CASTLING ); /****** Long ******/ if( ( G[Counter].castling & BLONG ) == 0 ) if( B[B8]==0 && B[C8]==0 && B[D8]==0 ) if( ! attacktest(C8,WHITE) && ! attacktest(D8,WHITE) ) link_castling( LONG_CASTLING ); } } *n = i; } void lc( tmove *m, int *i ) { if( Depth < -200 ) { if( Values[ B[From]>>4 ] > Values[ B[To]>>4 ] ) { if( Color == BLACK ) { if( (P[To]&0x00FF) ) return; } else { if( (P[To]&0xFF00) ) return; } } } else if( Values[ B[From]>>4 ] > Values[ B[To]>>4 ] ) { if( see(B,From,To) < 0 ) return; } m->in1 = m->in2a = B[m->from=From]; m->in2 = B[m->to=To]; m->dch = 100; m->value = 0; m->special = 0; if( pin[m->from] ) { do_move(m); if( ! checktest(enemy(Color)) ) (*i)++; undo_move(m); } else (*i)++; } # define link_capture { lc( moves+i, &i ); } void generate_legal_captures( tmove moves[], int *n, int minval ) /* we are sure we are not in check */ { int i = 0; find_pins( 0 ); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 && destination>=A8 ) { link_move(WQ,0); } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { if( Values[ B[destination] >> 4 ] >= minval ) link_move(WP,0); } else { link_move(WQ,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 && destination<=H1 ) { link_move(BQ,0); } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { if( Values[ B[destination] >> 4 ] >= minval ) link_move(BP,0); } else { link_move(BQ,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( color(B[destination]) == enemy(Color) ) if( Values[ B[destination] >> 4 ] >= minval ) link_capture; } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( color(B[destination]) == enemy(Color) ) if( Values[ B[destination] >> 4 ] >= minval ) link_capture; if( B[destination] ) break; } } } } } *n = i; } #ifndef QCAPSONLY /* generating checks AND captures */ void generate_legal_checks( tmove moves[], int *n ) /* we are sure we are not in check */ /* pawn checks should be added */ { int i = 0; find_pins( 0 ); find_targets(); for( square=L[Color].next; square!=0; square=L[square].next ) { unsigned pbs=piece(B[square]); switch ( pbs ) { case PAWN: if(Color==WHITE) { destination = square+10; if( B[destination] == 0 && ( destination>=A8 ) ) { link_move(WQ,0); link_move(WN,0); } for( destination = square+9; destination != square+13; destination += 2 ) if( color(B[destination]) == BLACK ) { if( destination < A8 ) { link_move(WP,0); } else { link_move(WQ,0); link_move(WN,0); } } } else /* This is a black pawn */ { destination = square-10; if( B[destination] == 0 && destination<=H1 ) { link_move(BQ,0); link_move(BN,0); } for( destination = square-9; destination != square-13; destination -= 2 ) if( color(B[destination]) == WHITE ) { if( destination > H1 ) { link_move(BP,0); } else { link_move(BQ,0); link_move(BN,0); } } } break; case KNIGHT: case KING: { int j; int *mov = pbs==KING ? K_moves : N_moves; for( j=0; j!=8; j++ ) { destination = square+mov[j]; if( color(B[destination]) == enemy(Color) || ( B[destination]==0 && tar[destination] == pbs ) ) link_capture; } } break; default: /* BISHOP, ROOK, QUEEN */ { int d; int d1 = pbs==BISHOP ? 4 : 0; int d2 = pbs==ROOK ? 4 : 8; for( d=d1; d!=d2; d++ ) { int step=RB_dirs[d]; destination=square; for(;;) { destination += step; if( color(B[destination]) == enemy(Color) || ( B[destination]==0 && tar[destination] && ( tar[destination]==pbs || ( tar[destination]!=KNIGHT && pbs==QUEEN ) ) ) ) link_capture; if( B[destination] ) break; } } } } } *n = i; } #endif /* QCAPSONLY */ Phalanx-XXII/hash.c0000644000175000001440000003203310314125617013522 0ustar sombrausers#include "phalanx.h" #ifndef REHASH # define REHASH 3 #endif thashentry *HT; unsigned SizeHT = 70000; unsigned Age = 0; /** *** 16-bit-int representation of move. To be used in the binary *** opening book and hash table. **/ unsigned smove(tmove *m) { unsigned sm; sm = ( m->from << 8 ); if( m->special ) return sm | m->special; sm |= m->to; if( m->in1 != m->in2a ) switch( m->in2a ) { case WQ: sm -= 10; break; case BQ: sm += 10; break; case WR: sm -= 20; break; case BR: sm += 20; break; case WB: sm -= 30; break; case BB: sm += 30; break; case WN: sm -= 40; break; case BN: sm += 40; break; } return sm; } thashentry *seekHT(void) { register int i; register thashentry *t; for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( G[Counter].hashboard == t->hashboard ) return t; } return NULL; } /************************************************************ * We need a good replacement strategy! * Good cells to replace: * 1) empty (not used) or cell with the same board * 2) cell stored at previous search * 3) cell that stores results computed at a low depth * 4) beta_cut (fail high) cell *********************************************************/ void writeHT( int value, int Alpha, int Beta ) { register int i; register thashentry *t; register thashentry *best = NULL; tmove *m = & PV[Ply][Ply]; /* First pass: look for the same board or an empty cell */ for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( G[Counter].hashboard == t->hashboard || t->hashboard == 0 ) { best = t; break; } } /* Second pass: look for an oldest-aged cell */ if( best == NULL ) for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( t->age < Age && ( best==NULL || best->age > t->age ) ) best = t; } /* Third pass: look for a cell with least depth */ if( best == NULL ) for( i=0; i!=REHASH; i++ ) { t = HT + ( G[Counter].hashboard + i ) % SizeHT; if( best==NULL || best->depth > t->depth || ( best->depth==t->depth && best->result!=beta_cut && t->result==beta_cut ) ) best = t; } if( best->hashboard == G[Counter].hashboard && best->depth > Depth && best->result!=beta_cut ) return; if( value > CHECKMATE-100 ) best->value = value+Ply; else if( value < -CHECKMATE+100 ) best->value = value-Ply; else best->value = value; if( value <= Alpha ) best->result = alpha_cut; else if( value >= Beta ) best->result = beta_cut; else best->result = no_cut; /* alpha_cut brings no killer information */ if( best->result != alpha_cut ) best->move = smove(m); else if( best->hashboard != G[Counter].hashboard ) best->move = 0; best->hashboard = G[Counter].hashboard; best->age = Age; best->depth = Depth; } /* * Full recomputation of hash board. */ unsigned hashboard(void) { register int i; unsigned result = 0; for ( i=A1; i!=H9; i++ ) if ( B[i] != 3 && B[i] != 0 ) { /* int square = i%10-1 + 8*(i/10-2); int piece = B[i]; piece = piece/8 - ( color(piece)==WHITE ? 1 : 2 ); */ result ^= H[ HP[ B[i] ] ][ HS[i] ]; } if( Color == BLACK ) result ^= HASH_COLOR; #undef debug #ifdef debug /* just showing the result */ printf ("Debug: Hashboard = %08X\n",result); printf ("Hit ENTER to continue "); getchar(); #endif return result; } /******************************************************** * The rest contains random numbers * to be used for hashing. ********************************************************/ unsigned H[12][64]= { { 0x8C78407C, 0xC3667B4A, 0x22AD4CED, 0x0BCAE627, 0x5BE2A9A3, 0xC4940655, 0x274C9DCB, 0xB55EB368, 0xE6C71E6E, 0x9A9E7EEE, 0xC425FD27, 0xCC007EED, 0x476192E5, 0x89E3D3A5, 0xEA78FAFB, 0x27665BD0, 0x9E46E105, 0xCD8B82C2, 0x2EA87ABA, 0x54462C94, 0xB3449DD5, 0x42666A5D, 0x3F657968, 0x4DCF2DE5, 0x09290438, 0x3E95D957, 0xD2E53D4F, 0x8E16CDF2, 0xCE6DFEA2, 0x75640BA3, 0xED9F39A4, 0x3AC65C2C, 0xBBDD20E3, 0x98132489, 0x5F7FBA11, 0x28C05E8D, 0x930D52BE, 0x5B21D077, 0x09710190, 0x0D45D752, 0x645D0413, 0x2E22DBD7, 0xA1B7583F, 0x37034473, 0xA247F1CA, 0x6DFBBAF5, 0x45389FEF, 0xF841DCB1, 0x7040F197, 0xEF9CE22F, 0xF775B834, 0x9AA89DA4, 0x8D53D2F0, 0x379D964D, 0x1D29DAB7, 0xD9507BBF, 0x9670F36B, 0x459B60B9, 0x99A710A3, 0x3BF21F7E, 0x0813320E, 0xFD99DBF7, 0x32CCF151, 0x6FDD5C05 }, { 0xF31F74FC, 0x5B939226, 0xD9D53A93, 0x3A273431, 0xEF296980, 0xF5412E1B, 0x4DF02F5B, 0xA4179950, 0x731CCC54, 0x4FF36FB0, 0x68459C3C, 0xD6B84245, 0x3B3C6C3F, 0x6D697176, 0xE9FBDA0D, 0xA03D888C, 0x4909A463, 0xAD14FFCF, 0x505ED35C, 0xC21FC657, 0x3DC31765, 0x92AAC442, 0xD341CC0F, 0x6C5BBAB1, 0xB8502A8B, 0x18A67A16, 0x8E2EB8B1, 0x78ACCA56, 0xD9A341F6, 0xE72BD561, 0x889A3CE9, 0xAE76C9C2, 0x8AE93753, 0xF9A98412, 0x933EF928, 0x3314A922, 0xF279492F, 0x4AE1499F, 0x1A1F4A53, 0x4B2BDD5B, 0x1FC5C7E7, 0x1EEAB635, 0xE9190AFA, 0x1B05337B, 0x78DC1ECF, 0xD07AD6A0, 0xC98650B7, 0xA7FFB330, 0x4EBA9C85, 0xD99CE128, 0xBC94E705, 0x4E829926, 0xA84ED58B, 0x874DD802, 0xF47628A3, 0x9CA58BB0, 0x0FA76581, 0xCC490CAC, 0xC391C24C, 0xA1DF2A2B, 0x038FCCBD, 0xFCD97DA4, 0xADE39237, 0xA004F9FF }, { 0x50EC499A, 0x57244DD1, 0x989DAB7C, 0x39943899, 0x0506EA3E, 0x62B98D9F, 0xD2602F70, 0x9BFB7CC1, 0x7E1DEC6D, 0xEA1614B0, 0x9A47DAB5, 0x2863A26D, 0x2E177B72, 0xDABC13E1, 0xE61AB6C9, 0x18D42B25, 0xCA795ACC, 0x664E849D, 0x9B597A60, 0x73F03242, 0xCB576344, 0x31253FEB, 0x173CE93B, 0x5E7238CA, 0xC0521EF1, 0x67767816, 0xF8F0AB0C, 0x860D3784, 0xE86BB2C3, 0x4754DDC7, 0x4E013AA1, 0xDC7E3630, 0xD7FA7EF2, 0x3ED76494, 0x897DF05F, 0xAF6D0BAF, 0xDF277D17, 0xD73D7EB6, 0xCE29640A, 0x1556B57A, 0x4CE3D7A2, 0xA0AA143B, 0x4E7036D0, 0x18FE8ABC, 0x3E8E47D1, 0xB42C78FD, 0x56516DC9, 0x6A2366E0, 0x454863EE, 0xEADC1C32, 0x06FDF69B, 0xBDC94E8B, 0x54144F7D, 0x454E3D51, 0x459683C2, 0xB55F7DBB, 0x1FAAFFB0, 0x097045AF, 0xEC1A0D56, 0x499B69A1, 0xE8B4269A, 0x78FA53DA, 0xFA3F866C, 0x36FAB278 }, { 0x9A348CF3, 0xDE7E448B, 0xCF27554C, 0x2CFA638F, 0xCEA9243C, 0x27E2BB7E, 0x997E6C9E, 0x7EA514B9, 0xA8B716B9, 0x45E49D60, 0xF1FC5321, 0xA937BCF5, 0xC496971C, 0xC4B80B3B, 0x3206D1FB, 0x5670616B, 0xCA2DB3C3, 0x01EAFE8A, 0xBD174755, 0x0DD3D042, 0xB8591C80, 0x15B6F0FB, 0x23D3A6F7, 0x1DE910AA, 0x2F1A056A, 0x9714E13A, 0x0F17DE0E, 0xC8C48954, 0xE75A5034, 0x32D7A560, 0x72CB9C52, 0x62794B32, 0x98DE2EEE, 0x1140E617, 0x4CC1C405, 0x2C319BB2, 0x622AF9E9, 0x9D6ECA20, 0x7DD528A7, 0x6272DA54, 0x0EDBCF46, 0x4911DD6E, 0x89D4673F, 0x171F78B4, 0xBF20922B, 0xEB4FF37A, 0x069DF251, 0x377C8E42, 0xE5892067, 0x77FF3A2C, 0x9E4B9142, 0xAEED36BC, 0xD27C3989, 0xC01C2F8C, 0x59127E91, 0x214F868E, 0x0945B82A, 0x797203E6, 0xE3F125DF, 0x2A7FD03D, 0xC3E5D603, 0xF7CB6AAA, 0xCDD12B04, 0x8669DBCC }, { 0x69590D31, 0x16D9B0F1, 0x674B7BF3, 0xD76F69A7, 0xA66766B1, 0x7FEF1874, 0xF5B204C3, 0xDF548D7F, 0x41167C52, 0x321D609E, 0xAB6ED1D7, 0x027178D4, 0x89ADF27B, 0xB8E2B6DF, 0x19F76ABE, 0x41F7A411, 0xBD30CD84, 0x55D73E2E, 0x9EA86CD3, 0x4E3C73E9, 0xCD75DF37, 0x4C8180FE, 0xD90E1CD1, 0xD183DA5E, 0x52103498, 0x7A924A14, 0x74343213, 0x3EDC35CC, 0x63E7DD1C, 0x65364446, 0x05861C2B, 0xF2C67748, 0x2F58E1BB, 0x276DF71B, 0xA249122A, 0x67F0928B, 0x5E03001C, 0xEB9A0419, 0x9499CF06, 0xC6442C17, 0x983FE628, 0x2A7EF798, 0xB8306B58, 0xC10B4767, 0xA1EF9EBB, 0x5DA508B0, 0xE0698489, 0x502E2166, 0x1C0203E1, 0xED070148, 0x2FC4485E, 0x6FE5BB03, 0x426D5037, 0xC8B4F020, 0x029AEF51, 0xA3A66A3C, 0x5C117F3A, 0x14068942, 0x56DDD16C, 0xA7026955, 0xCB6BA5CE, 0xEB30E20B, 0x14EFDCEA, 0xB0E615EC }, { 0x5DEDF0A4, 0xB7D958A1, 0x5DE41621, 0xE6451281, 0x8988FBAB, 0xFFA12EF9, 0x4DD994BF, 0xB5AEA3D8, 0x45FD3758, 0x43552D82, 0xC63614C0, 0x4BB63A8E, 0x7E4FF025, 0xF1F1A3C4, 0x4363B994, 0x371DBCE8, 0x3BFFCA9C, 0x11A2FF9B, 0x5A694E9A, 0x033069E0, 0xF2E4CF8F, 0x5002250D, 0xE7911156, 0xAC1E0C0C, 0x4883A403, 0xF394E56E, 0x906FEE65, 0x66C4C893, 0x0DD9FCB5, 0x9347DDBB, 0x84E0477A, 0x087CD416, 0x8898C22D, 0x17030492, 0x290AEEE5, 0xD6E170C9, 0xCA1C9885, 0x7FCCCC08, 0x2E895D9F, 0x4D73C332, 0x0AB56CF9, 0x9F73F163, 0x2DC27FE5, 0xF917D52F, 0x0E965189, 0x124514A6, 0x3F504E11, 0x9F1EB4D9, 0x2D48917A, 0x7B9A80CE, 0xB19B3D07, 0xCD79E55F, 0x2EA71B3A, 0x365A6F84, 0x1CB15057, 0x72F0011C, 0xC049EB75, 0xE621EFBE, 0x842D9DBF, 0xA704E426, 0x9FE20D6E, 0x98524416, 0x3ECC79FC, 0x3B05F6A7 }, { 0xB57B6D79, 0xD3DD2098, 0xAB159E6E, 0xDA63753B, 0x34C873EB, 0xFB55B708, 0x34CFFA24, 0x2D689DD9, 0x5F6A63FB, 0xAC862A1F, 0x111E4467, 0x6DDD5404, 0x20712442, 0xA291C35C, 0xF7C0C840, 0xF8B099AA, 0x2B428B60, 0xFC684FEB, 0x3DDE74F5, 0xD8101CD5, 0x0196DDC4, 0x2CF3F64F, 0x3927252D, 0x79FBDCDD, 0xE8555194, 0xA6B45FE7, 0x77355E02, 0xF007DC63, 0x1F01EAE1, 0x050B036D, 0x5B128D46, 0x0713409F, 0x4732CB7B, 0x00CF5262, 0x873B3BF5, 0x29CB2119, 0x9B1F6CEC, 0xC5F09BC5, 0xACFADC7B, 0x9AF997FE, 0xF3A80F72, 0x9AD8566A, 0x3A5846E4, 0xCE9957E7, 0x5A773A0D, 0x64D9DC1B, 0x14137768, 0xD5E2149D, 0xE11FAC72, 0xF141CB01, 0xD1DA5AC4, 0x876D6DF4, 0x3DA52A20, 0x79A1A38C, 0x52A8D32D, 0x4818FC2D, 0x72474A4D, 0x38C45617, 0x792ADBE2, 0x543EB6AF, 0xC967585B, 0xB9A99FB9, 0xB96BEAD2, 0x9DBF4552 }, { 0x5F126D87, 0x209590FA, 0x90ED9298, 0xC5933CFC, 0xB1526FC5, 0x566FA246, 0x6F57234A, 0xFE0DA29C, 0x688DD003, 0xB35FDCFE, 0xD0046D83, 0x92277A7D, 0x6488800B, 0x15C8319F, 0x7449411C, 0xE1C619C5, 0x7A01905B, 0x19C28E70, 0xAA8C6CA1, 0xE016E8A3, 0x91BF3060, 0x6AD8A4BD, 0x36625121, 0x6D74365F, 0x95E0D370, 0x55AFED48, 0xEC9A0A00, 0xF3761CE3, 0x091D44C1, 0x83F6C456, 0xC28B4BDB, 0xF12FF37F, 0xCF3FA70A, 0xFDC369A6, 0x83C91DB0, 0x44D097C2, 0x0FBFB224, 0xF24ED416, 0x4F438995, 0x7B0FEAE6, 0x3943729E, 0x35F82C7A, 0x8A234F89, 0x80C91E1A, 0xEB1A1262, 0x978E78C6, 0x767B7DFB, 0x08F0DADE, 0x2DE99D20, 0x35FB22EB, 0x8BB0FD9F, 0x605EE2EA, 0xBEFF4C9D, 0x0FE77DA7, 0x500AE16A, 0x10D3482B, 0xA87187EB, 0x854027FC, 0x7C0FE08B, 0x34607ECF, 0xD0234C8C, 0xF6D73D2E, 0x0948578B, 0x74ACFEA8 }, { 0x14454B76, 0x89C9C4FB, 0x4343E832, 0xEDFBCDAF, 0xD6AE6671, 0x31B22D7D, 0xDB9D415E, 0xD0D1E4FB, 0x73C35D86, 0x29695252, 0x99EE7F32, 0x232FEE60, 0x2B4FE03D, 0x59C92328, 0x43B7835A, 0x0AF1F352, 0x430D1D4B, 0x5F9E3619, 0x49D0BD47, 0xA3D6E289, 0x936636BD, 0x4FA1A859, 0x7A15317F, 0x93FBBE1C, 0x1FE45E6E, 0x4526CCDE, 0x07AA1600, 0x3F5DA670, 0xC05B6532, 0x9AF76BF2, 0x3A9A73F9, 0x13BD7268, 0x6BD8E37F, 0xFB96271E, 0x95014B60, 0xF4C7B5C3, 0x01D23DB6, 0x0B3F0A85, 0x4BCB4683, 0x597ED680, 0x53BFBB56, 0xB3D7D046, 0xF4B14E8A, 0xB60AE278, 0x4D29F5AE, 0x268AA1F4, 0xE28B5ACA, 0x29481E5A, 0x0BD29CE1, 0xC4ADD091, 0x21F11101, 0xAF182B94, 0x78C9DD4C, 0x0C59C5C6, 0xF484EAB5, 0x3AA65D4B, 0x387CF5A8, 0x7DEEEBE9, 0x92865FDC, 0x83650242, 0x83F4BBB4, 0x47CBDCCB, 0x1BB6C2EB, 0xD9DB0D93 }, { 0x07E5E382, 0xAD974E9B, 0xF108F97A, 0xBC925B4C, 0x43FC2D0A, 0x2D2D16F4, 0xFC8E33C0, 0x5D905103, 0x09002E56, 0x342F3BA6, 0xC52F8051, 0xBCC7AFBD, 0xF44BCC8E, 0x9CF2BA63, 0x2AF62947, 0x6D32A4E2, 0x97CB4B7E, 0x7EB36969, 0x6C5A1BEF, 0x91DDABAF, 0xD19F38D1, 0x28168456, 0x18F5BFF7, 0xD942A200, 0xD74AC610, 0xA084BA17, 0x6209C788, 0x71298136, 0x2E478EB0, 0xC6FF24F1, 0x7FB12530, 0xB05DCEDD, 0x63CEE2B8, 0x9828CCA7, 0x74267745, 0xCE31CE0B, 0x7F5E241A, 0x9DD687D7, 0xF49A4001, 0x2079D26E, 0x77A7F9AB, 0xF018F8E6, 0x6732A7D8, 0x050FE733, 0x509F344C, 0xDDDAAA74, 0xBDE184D6, 0xCA198ED9, 0x0E013550, 0xF6AB7695, 0x81AB4084, 0x1E1FBE13, 0x74641C6F, 0xA42D6C69, 0x7A59A7DE, 0x97FE33E1, 0x22A5C0E7, 0x2DDAB736, 0x11E80476, 0xEB197C10, 0xEF2D5E0D, 0xA80ADF81, 0x01B6A52D, 0x3F60E848 }, { 0x0591FA9E, 0xD84CCD30, 0xAF8645F3, 0xA8F14118, 0xEF4E2EB5, 0x1D7EBA58, 0xB1FC516B, 0x328E94D2, 0x98F01FE2, 0xA33BAE23, 0xFBFF78E2, 0x319FC7A0, 0xB4F9AD3D, 0x83354F5A, 0x822E27B5, 0x6E4D8FBF, 0x0DFD5C47, 0xED41261F, 0x7DF08357, 0xA54CF110, 0xBF7A0373, 0x3A899027, 0x679C2E1D, 0x902FB5D1, 0x937155EA, 0x0C11875D, 0x9AC4F3DD, 0xC0FCBCD2, 0xA317C764, 0x7D6106C2, 0x48931D7F, 0x8D38AD15, 0x1E5EEAF1, 0x799D6466, 0x120A0D78, 0xA358EF27, 0x8301E807, 0x41453072, 0x3DDDD84E, 0x67DAA5B7, 0xC4831F14, 0xB4FF3ECC, 0x54FBE1DF, 0xF487050B, 0xE23FC0CB, 0x4DA17492, 0xE21D074D, 0x78F519B4, 0x73641E6C, 0x471797DE, 0x0B9EF879, 0xCB34E343, 0x093C039B, 0x032C80AC, 0x8D71A4E8, 0x40EE5B0F, 0xFBDC92DD, 0x2C03A2BD, 0x4E40AB0C, 0x01AC0C5A, 0x3ADEC6DD, 0x450A4C28, 0xF246725D, 0x79CD91EB }, { 0x72ACDC1B, 0xF2014F34, 0xFA67FB76, 0x6C0951E3, 0xC84F7766, 0x0BF7F3E7, 0x5056038F, 0xB1773ABF, 0x40C2A3DD, 0xBC19DD18, 0x2DD4A6EC, 0x421E6F72, 0xDFE17CDB, 0xFE0B6A09, 0x3FA0C3EA, 0x1661B6A1, 0x40FEE764, 0x84B26A19, 0xF858D748, 0xCBF20F5F, 0xB83792BF, 0x83CE6144, 0x5B1C27E1, 0xBAD45539, 0xFC174283, 0xD8E4151B, 0x9C51B5A3, 0xA4CBB787, 0x829892B4, 0xB0DBB955, 0xAE9BF750, 0xD5EC9DE5, 0xBA425010, 0x5D401F05, 0xC1A67E17, 0xFF57C3B2, 0xD2F9FCF1, 0xFA92C983, 0xF4ECAC03, 0x01F39D8F, 0x85842BC7, 0x9AF22BFF, 0xA240C52A, 0xC92F7885, 0xCEC15E11, 0x9D12F7EC, 0x92912226, 0x622D12EC, 0xF1562785, 0x4DA4B897, 0x38B97ACC, 0xD7E70669, 0x5330B480, 0x821DC482, 0x446387E8, 0x26FFFE50, 0xF4B0E87A, 0x2BB8837C, 0x6839CEEA, 0xEA444EE6, 0x5635F0EE, 0x55CA3220, 0xDF276DDF, 0xBB90E015 } }; Phalanx-XXII/io.c0000644000175000001440000010333110320057502013200 0ustar sombrausers #include "phalanx.h" extern long Time; char Inp[256] = "\0"; char piece[7] = { ' ', 'P', 'N', 'B', 'R', 'Q', 'K' }; char file[10] = { '<', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '>' }; char row[12] = { '<', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '>' }; tmove Pm[256]; int Pn; /** *** Init board and structures *** To be called after position is set (FEN or xboard's edit) **/ void initbs(void) { int s; Counter = 0; DrawScore = 0; G[0].hashboard = hashboard(); /* Do full material count */ G[0].mtrl = G[0].xmtrl = 0; for( s=A1; s!=H9; s++ ) if( color(B[s]) == Color ) G[0].mtrl += Values[ B[s]>>4 ]; else G[0].xmtrl += Values[ B[s]>>4 ]; G[0].castling = 0; /* enabled all, disable if impossible: */ if( B[E1]!=WK || B[A1]!=WR ) G[0].castling |= WLONG; if( B[E1]!=WK || B[H1]!=WR ) G[0].castling |= WSHORT; if( B[E8]!=BK || B[A8]!=BR ) G[0].castling |= BLONG; if( B[E8]!=BK || B[H8]!=BR ) G[0].castling |= BSHORT; G[0].rule50 = 0; /* create the piece list */ L[L[1].next].prev = 1; L[L[2].next].prev = 2; L[L[1].next].next = L[L[2].next].next = 0; { int wlast = L[1].next, blast = L[2].next; for( s=A1; s!=H9; s++ ) if( B[s]!=0 && B[s]!=3 && B[s]!=WK && B[s]!=BK ) { if( color(B[s])==WHITE ) { L[wlast].next = s; L[s].prev = wlast; L[s].next = 0; wlast = s; } else { L[blast].next = s; L[s].prev = blast; L[s].next = 0; blast = s; } } } Flag.machine_color = enemy(Color); } /** *** Xboard compatible edit **/ void edit(void) { int i; int color = WHITE; int squ, pie; char s[8]; s[0] = '@'; for(;;) { for( i=0; i!=3; i++ ) s[i] = toupper(s[i]); switch(*s) { case '#': for(i=A1;i!=H9;i++) if(B[i]!=3) B[i]=0; break; case 'C': color = enemy(color); break; case 'S': Color = enemy(Color); break; case '.': break; case 'P': case 'N': case 'B': case 'R': case 'Q': case 'K': squ = s[1]-'A' + 10*(s[2]-'1') + A1; if( squH8 ) squ=0; pie = 0; for( i=1; i!=7; i++ ) if( s[0] == piece[i] ) { pie = i*16+color; break; } B[squ]=pie; if( *s == 'K' ) L[color].next = squ; break; } printboard(NULL); printf("\n"); printf(" \n"); printf(" . exit\n"); printf(" # clear\n"); printf(" c change "); if( color==WHITE ) printf("put white pieces\n"); else printf("put black pieces\n"); printf(" s side to move\n"); printf("edit > "); if( fgets(s,7,stdin) == NULL ) { strcpy(Inp,"quit\n"); return; } if( *s == '.' ) break; } initbs(); Inp[0]='\0'; return; } /** *** Print move in full notation (Ng1-f3) to string 's' or to stdout. *** SAN would be more complicated since we need a list of all possible *** moves to find out whether to print 'Nbd2' or 'Nd2'. **/ void printm( tmove m, char *s ) { char ss[64]; switch( m.special ) { case LONG_CASTLING: sprintf( ss, "O-O-O " ); goto endprint; case SHORT_CASTLING: sprintf( ss, "O-O " ); goto endprint; } sprintf( ss, "%c%c%c%c%c%c", piece[m.in1>>4], file[m.from%10], row[m.from/10], ( m.in2 || m.special ) ? 'x' : '-', file[m.to%10], row[m.to/10] ); if( m.in2a != m.in1 ) sprintf( ss+strlen(ss), "%c", piece[m.in2a>>4] ); #ifdef SHOW_FORCED_MOVES if( m.dch != 100 ) sprintf( ss+strlen(ss), "/%i",m.dch ); #endif sprintf( ss+strlen(ss), " " ); endprint:; if( s == NULL ) printf(ss); else strcpy( s, ss ); } #ifdef SANOUT void printmSAN( tmove *m, int i, int n, char *s ) { char ss[8]; /* longest: "Nb1xd2+\0" */ int j; tmove *mi = m+i; switch( mi->special ) { case LONG_CASTLING: sprintf( ss, "O-O-O" ); goto endprint; case SHORT_CASTLING: sprintf( ss, "O-O" ); goto endprint; } if( piece(mi->in1) == PAWN ) { sprintf( ss, "%c", file[mi->from%10] ); if( mi->in2 != 0 || mi->special ) sprintf( ss+strlen(ss), "x%c%c", file[mi->to%10], row[mi->to/10] ); else sprintf( ss+strlen(ss), "%c", row[mi->to/10] ); if( mi->in1 != mi->in2a ) sprintf( ss+strlen(ss), "=%c", piece[mi->in2a>>4] ); goto endprint; } /* print NBRQ moves */ sprintf( ss, "%c", piece[mi->in1>>4] ); for( j=0; j!=n; j++ ) if( j!=i && mi->in1 == m[j].in1 && mi->to == m[j].to && mi->from%10 != m[j].from%10 ) sprintf( ss+strlen(ss), "%c", file[mi->from%10] ); for( j=0; j!=n; j++ ) if( j!=i && mi->in1 == m[j].in1 && mi->to == m[j].to && mi->from%10 == m[j].from%10 ) sprintf( ss+strlen(ss), "%c", row[mi->from/10] ); if( mi->in2 != 0 || mi->special ) sprintf( ss+strlen(ss), "x" ); sprintf( ss+strlen(ss), "%c%c", file[mi->to%10], row[mi->to/10] ); endprint:; /* is this a checking move? */ do_move( m+i ); if( checktest(Color) ) sprintf( ss+strlen(ss), "+" ); undo_move( m+i ); if( s == NULL ) printf(ss); else strcpy( s, ss ); } void pvSAN( tmove *v, char *s ) { int n; tmove m[256]; int i; generate_legal_moves( m, &n, checktest(Color) ); for( i=0; i!=n; i++ ) if( smove(v) == smove(m+i) ) break; if( i != n ) { printmSAN( m, i, n, s ); do_move( m+i ); v++; if( v->from ) { sprintf( s+strlen(s), " " ); pvSAN( v, s+strlen(s) ); } undo_move( m+i ); } } #endif /* GNU Chess `X' understands only moves in `g1f3' notation. We have to send * this to older versions of xboard when playing phalanx with gnu. */ void gnuprintm(tmove m) { switch( m.special ) { case LONG_CASTLING: printf("o-o-o"); return; case SHORT_CASTLING: printf("o-o"); return; } printf( "%c%c%c%c%c", file[m.from%10], row[m.from/10], file[m.to%10], row[m.to/10], m.in2a == m.in1 ? ' ' : tolower(piece[m.in2a>>4]) ); } /** *** Return pointer to move in m[] if it matches the SAN representation. *** If there is no such move, return NULL. **/ tmove * sandex( char *inp, tmove *m, int n ) { char bufik[32]; char *s = bufik; char * ss; char * sto; int move,to; int i; unsigned p=0; int frow=0, ffile=0; int in2a=0; int color = color(m->in1); int sc=-1; int lc=-1; strncpy(bufik,inp,30); for( i=0; i!=n; i++ ) if(m[i].special==SHORT_CASTLING) sc=i; else if(m[i].special==LONG_CASTLING) lc=i; /*** step 0: castlings ***/ if( lc != -1 ) if( strncmp(s,"o-o-o",5)==0 || strncmp(s,"O-O-O",5)==0 || strncmp(s,"0-0-0",5)==0 || ( strncmp(s,"e1c1",4)==0 && color==WHITE ) || ( strncmp(s,"e8c8",4)==0 && color==BLACK ) ) return m+lc; if( sc != -1 && s[3]!='-' ) if( strncmp(s,"o-o",3)==0 || strncmp(s,"O-O",3)==0 || strncmp(s,"0-0",3)==0 || ( strncmp(s,"e1g1",4)==0 && color==WHITE ) || ( strncmp(s,"e8g8",4)==0 && color==BLACK ) ) return m+sc; /*** step 1: noncastling move must start with PNBRQKabcdefgh ***/ /*** if it starts with pnrqk, do the letter upercase ***/ { static char ok[] = "PNBRQKabcdefghpnrqk"; static char up[] = "pnrqk"; for( i=0; ok[i]!=*s; i++ ) if( ok[i] == '\0' ) return(NULL); for( i=0; up[i]!='\0'; i++ ) if( up[i] == *s ) { *s = toupper(*s); break; } } /*** step 2: find the destination square ***/ /* Find the last digit <1-8> in the input string. It must * be the row of the destination square and must be preceded * by letter of the dest. square **********************/ sto=NULL; for( ss=s+1; *ss!='\0'; ss++ ) if( *ss>='1' && *ss<='8' ) sto = ss-1; if( sto == NULL ) { if( ( s[2]=='\0' || s[2]=='\n' ) && s[1]>='a' && s[1]<='h' && s[0]>='a' && s[0]<='h' ) { /* exception: pawn capture can be typed as 'ef' */ int mn=-1; /* printf("trying exception %c %c %c\n", s[0], s[1], s[2] ); */ for( i=0; i!=n; i++ ) if( piece(m[i].in1) == PAWN ) if( m[i].from%10 == s[0]+1-'a' ) if( m[i].to%10 == s[1]+1-'a' ) { if( mn==-1 ) mn=i; else mn=-2; } if( mn>=0 ) return m+mn; } return NULL; /* no digit 1-8 found */ } for( i=1; i!=9; i++ ) if(file[i]==*sto) break; if(i==9) return NULL; to = i; for( i=2; i!=10; i++ ) if(row[i]==sto[1]) break; if(i==10) return NULL; to += i*10; /*** step 3: find the origin square ***/ /* 3a - try to find full description of origin square (g1f3) */ ss=sto-1; if(ss>=s) for( ss=sto-1; ss!=s; ss-- ) if( *ss>='1' && *ss<='8' && *(ss-1)>='a' && *(ss-1)<='h' ) { for( i=2; i!=10; i++ ) if(row[i]==*ss) break; frow = i; ss--; for( i=1; i!=9; i++ ) if(file[i]==*ss) break; ffile = i; for(i=0;i!=n;i++) if(m[i].from==frow*10+ffile) { p=m[i].in1; break; } goto step4; } /* 3b - origin square must be computed from piece */ { for(p=6;p!=1;p--) if( piece[p] == *s ) { s++; break; } p = (p<<4) + color; if( *s!='x' && s='a' && *s<='h' ) ffile = *s-'a'+1; else if( *s>='1' && *s<='8' ) frow = *s-'1'+2; } } step4:; /*** step 4: is it a pawn promotion? determine piece ***/ in2a = p; sto += 2; if( *sto == '=' ) sto++; *sto = toupper(*sto); for(i=2;i!=7;i++) if( piece[i]==*sto ) in2a=(i<<4)+color; /*** step 5: scan move list ***/ move = -1; for(i=0;i!=n;i++) if( m[i].to==to && m[i].in1==p && m[i].in2a==in2a ) if( ffile==0 || ffile==m[i].from%10 ) if( frow==0 || frow==m[i].from/10 ) { if(move==-1) move=i; else return NULL; } if(move==-1) return NULL; return m+move; } /** *** Is the string represented move ("Pe2-e4") same as the tmove move? *** This correctly parses almost anything but not SAN - we dont have *** full move list. **/ int checkmove( char *s, tmove *m ) { int i; if( m->special == LONG_CASTLING ) { if( strncmp(s,"o-o-o",5)==0 || strncmp(s,"O-O-O",5)==0 || strncmp(s,"0-0-0",5)==0 || ( Color == WHITE && strncmp(s,"e1c1",4) == 0 ) || ( Color == BLACK && strncmp(s,"e8c8",4) == 0 ) ) return 1; else return 0; } if( m->special == SHORT_CASTLING ) { if( ( strncmp(s,"o-o",3)==0 && strncmp(s,"o-o-o",5)!=0 ) || ( strncmp(s,"O-O",3)==0 && strncmp(s,"O-O-O",5)!=0 ) || ( strncmp(s,"0-0",3)==0 && strncmp(s,"0-0-0",5)!=0 ) || ( Color == WHITE && strncmp(s,"e1g1",4) == 0 ) || ( Color == BLACK && strncmp(s,"e8g8",4) == 0 ) ) return 1; else return 0; } for( i=0; s[i]!='\0' && ! islower(s[i]); i++ ); if( s[i]=='\0' || s[i]!=file[m->from%10] ) return 0; i++; if( s[i]=='\0' || s[i]!=row[m->from/10] ) return 0; for( ; s[i]!='\0' && ( s[i]=='x' || ! islower(s[i]) ); i++ ); if( s[i]=='\0' || s[i]!=file[m->to%10] ) return 0; i++; if( s[i]=='\0' || s[i]!=row[m->to/10] ) return 0; i++; if( m->in2a != m->in1 ) { if( s[i] == '=' || s[i] == ':' ) i++; if( toupper(s[i]) != piece[m->in2a>>4] ) return 0; } return 1; } void printPV( int mpl, int lid, char *s ) /* mpl ... moves per line */ { char ss[1024] = ""; int j; #ifdef SHOW_FORCED_MOVES if( mpl>2 ) mpl -= 2; #endif #ifdef SANOUT int k=0; int l=lid; char s1[1024] = ""; pvSAN( PV[0], s1 ); for( j=0; s1[j]!='\0'; j++,l++ ) if( l <= 72 || s1[j] != ' ' ) { ss[k] = s1[j]; k++; } else { ss[k] = '\n'; k++; for( l=0; l!=lid; l++ ) { ss[k] = ' '; k++; } } ss[k] = '\0'; #else for(j=0;PV[0][j].from;j++) { if( j%mpl == 0 && j != 0 && Flag.xboard!=2 ) { int i; sprintf( ss+strlen(ss), "\n" ); for( i=0; i!=lid; i++ ) sprintf( ss+strlen(ss), " " ); } printm( PV[0][j], ss+strlen(ss) ); } if( j < 3 ) sprintf( ss+strlen(ss), " " ); #endif sprintf( ss+strlen(ss), "\n" ); if( s == NULL ) printf(ss); else strcpy(s,ss); } void infoline( int typ, char *s ) { /** typ: *** 0 ... search finished, summary information *** 1 ... normal 'xboard' line, known eval, time, full PV *** 2 ... '!' - turn, new best move *** 3 ... summary informations at the end of ply level, no PV *** 4 ... '??' - first move fails low *** 5 ... '!!' - current move fails high, over window **/ char ss[1024]; extern long T1; long t = ptime(); if( typ!=0 && !Flag.analyze && ( Abort || t-T1 < Flag.noise ) ) return; if( Flag.log && s==NULL ) { int x = Flag.xboard; Flag.xboard = 0; infoline(typ,ss); Flag.xboard = x; fprintf(Flag.log, ss); } if( Flag.xboard == 2 ) switch( typ ) { case 0: /* ICS whispering */ if( Flag.ponder<2 && Flag.xboard>1 && typ==0 ) { printf( "tellics whisper depth=%i; eval=%c%i.%02i; nodes=%lli; nps=%i\n", A_d, PV[0][0].value>=0 ? '+' : '-', abs(PV[0][0].value/100), abs(PV[0][0].value)%100, Nodes, (int)( ((float)Nodes) / (((float)max(t-T1,1))/100) ) ); /* printPV(8,5,ss); printf("tellics whisper %s",ss); */ } return; case 3: typ=1; break; } if( typ >= 1 && typ <= 5 ) { sprintf( ss, "%3i", A_d ); if( typ==1 || typ==2 || typ==4 || typ == 5 ) sprintf( ss+strlen(ss), "%7i", PV[0][0].value ); else if( typ == 3 ) sprintf( ss+strlen(ss), " -> " ); if( typ == 3 ) { long tt = (long) (ptime()-T1); long t = tt / 100; sprintf( ss+strlen(ss), "%3i:%02i.%02li", (int)t/60, (int)t%60, tt*100/100-t*100 ); } else { sprintf( ss+strlen(ss), " %5li", (long)(t-T1) ); } sprintf( ss+strlen(ss), " %8lli ", Nodes ); } else { sprintf( ss, "Depth=%i, Value=%i, Time=%i.%02i, Last turn=%i.%02i, Nodes=%i", (int) A_d, (int) PV[0][0].value, (int) (t-T1)/100, (int) (t-T1)%100, (int) (LastTurn-T1)/100, (int) (LastTurn-T1)%100, (int) Nodes ); if( t-T1 != 0 ) sprintf( ss+strlen(ss), ", N/s=%i\n", (int) ( (float) Nodes / ( (float)(t-T1)/(float)100 ) ) ); else sprintf( ss+strlen(ss), "\n" ); } switch( typ ) { case 0: sprintf( ss+strlen(ss), "PV = " ); printPV(8,5,ss+strlen(ss)); if( PV[0][0].value > CHECKMATE-100 ) sprintf( ss+strlen(ss), " Mate in %i\n", (CHECKMATE-PV[0][0].value+1) / 2 ); break; case 1: printPV(6,27,ss+strlen(ss)); break; case 2: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "! \n" ); break; case 3: sprintf( ss+strlen(ss), "%2i turn", Turns ); if(Turns==1) sprintf( ss+strlen(ss), " \n"); else sprintf( ss+strlen(ss), "s \n"); break; case 4: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "?? \n" ); break; case 5: printm( PV[0][0], ss+strlen(ss) ); sprintf( ss+strlen(ss), "!! \n" ); } if( s != NULL ) strcpy( s, ss ); else { printf(ss); } } void verboseline( tmove* m, int i, int n ) { char s[256]; int j; extern long T1; long t = (long) (ptime()-T1) / 100; sprintf( s, "(%2i)", A_d ); sprintf( s+strlen(s), " "); sprintf( s+strlen(s), "%3li:%02li ", t/60, t%60 ); sprintf( s+strlen(s), "%9lli ", Nodes ); sprintf( s+strlen(s), "(%2i/%2i) ", i+1, n ); printm( m[i], s+strlen(s) ); sprintf( s+strlen(s), " " ); for( j=0; j!=79; j++ ) sprintf( s+strlen(s), "" ); printf(s); } void printboard(char *s) { int i; char ss[2048]; sprintf(ss, " +---+---+---+---+---+---+---+---+\n "); for(i=A8;i>=A1;i++) { switch(color(B[i])) { case WHITE: sprintf(ss+strlen(ss),"| %c ",piece[B[i]>>4]); break; case BLACK: sprintf(ss+strlen(ss),"| *%c",piece[B[i]>>4]); break; default: sprintf(ss+strlen(ss),"| "); } if( i%10 == 8 ) { i-=18; sprintf(ss+strlen(ss), "|\n +---+---+---+---+---+---+---+---+"); if(i!=10) sprintf(ss+strlen(ss),"\n "); } } if( Color == WHITE ) sprintf(ss+strlen(ss)," White to move\n"); else sprintf(ss+strlen(ss)," Black to move\n"); if( s==NULL ) printf(ss); else strcpy(s,ss); /* printf("%08X\n",G[Counter].hashboard); */ } /** *** The setfen() function is one of the two ways to set a position. *** The second one is edit(). **/ int setfen( char *f ) { int s; if( Flag.log != NULL ) { fprintf(Flag.log,"\n\nsetting position\n"); fprintf(Flag.log,f); fprintf(Flag.log,"\n\n"); } for( s=0; s!=120; s++ ) if( s>H8 || s=A1; f++ ) { if( *f == '\0' ) { puts("error: unexpected end of fen line"); return 1; } if( isdigit(*f) ) /* skip squares */ { s += *f - ('1'-1); continue; } switch( *f ) { case 'K': B[s] = WK; L[1].next=s; break; case 'k': B[s] = BK; L[2].next=s; break; case 'Q': B[s] = WQ; break; case 'q': B[s] = BQ; break; case 'R': B[s] = WR; break; case 'r': B[s] = BR; break; case 'B': B[s] = WB; break; case 'b': B[s] = BB; break; case 'N': B[s] = WN; break; case 'n': B[s] = BN; break; case 'P': B[s] = WP; break; case 'p': B[s] = BP; break; case '/': case ' ': case ';': s -= s%10 + 10; break; default: puts("error in fen line"); return 1; } s++; } switch( tolower(*f) ) { case 'w': Color = WHITE; break; case 'b': Color = BLACK; break; default: puts("error: side to move must be either 'w' or 'b'"); return 1; } initbs(); return 0; } /** *** If an entered string contains seven (or more) slashes *** it is considered as fen test position. **/ int sevenslashes(register char *s) { register int n=7; while( *s!='\0' && *s!=' ' ) { if(*s=='/') { n--; if(!n) return 1; } s++; } return 0; } /** *** Is the current position terminal? *** returns: 0 ... not terminal *** 1 ... draw, 50 moves or 3rd repetition; ok to continue play *** 2 ... draw, stalemate *** 3 ... checkmate **/ int terminal(void) { tmove m[256]; int n, c; if( G[Counter].rule50>=100 || repetition(2) || material_draw() ) { if(Flag.machine_color==(WHITE|BLACK)) Flag.machine_color=0; return 1; } generate_legal_moves( m, &n, c=checktest(Color) ); if( n!=0 ) return 0; if(c) return 3; else return 2; } void printpositionfen(void) { int s, empty_counter=0, Castling=0; #define EMPTY_COUNTER if (empty_counter) { printf("%d", empty_counter); empty_counter=0; }; for( s=A8; s>=A1; s++ ) { switch( B[s] ) { case WK: EMPTY_COUNTER; printf("K"); break; case BK: EMPTY_COUNTER; printf("k"); break; case WQ: EMPTY_COUNTER; printf("Q"); break; case BQ: EMPTY_COUNTER; printf("q"); break; case WR: EMPTY_COUNTER; printf("R"); break; case BR: EMPTY_COUNTER; printf("r"); break; case WB: EMPTY_COUNTER; printf("B"); break; case BB: EMPTY_COUNTER; printf("b"); break; case WN: EMPTY_COUNTER; printf("N"); break; case BN: EMPTY_COUNTER; printf("n"); break; case WP: EMPTY_COUNTER; printf("P"); break; case BP: EMPTY_COUNTER; printf("p"); break; default: empty_counter++; break; } if( s%10 == 8 ) { EMPTY_COUNTER; s-=18; if (s!=H1-18) printf("/"); else printf(" "); } } if( Color == WHITE ) printf("w "); else printf("b "); /****** White Short ******/ if( ( G[Counter].castling & WSHORT ) == 0 ) { printf("K"); Castling++;} /****** White Long ******/ if( ( G[Counter].castling & WLONG ) == 0 ) { printf("Q"); Castling++;} /****** Black Short ******/ if( ( G[Counter].castling & BSHORT ) == 0 ) { printf("k"); Castling++;} /****** Black Long ******/ if( ( G[Counter].castling & BLONG ) == 0 ) { printf("q"); Castling++;} if (!Castling) printf("- "); else printf(" "); if( Counter != 0 ) { int c = Counter-1; if( piece(G[c].m.in1) == PAWN && abs(G[c].m.from-G[c].m.to) == 20 ) /* The last move was a pawn double step */ { int destination; int special = G[c].m.to; destination = Color==WHITE ? special+10 : special-10; printf("%c%c ", file[destination%10], row[destination/10]); } else printf("- "); } else printf("- "); printf("%d %d\n", G[Counter].rule50, Counter/2+1); } void about(void) { printf(" Phalanx "); puts(VERSION); puts(" Copyright (C) Dusan Dobes, 1997-2000"); printf(" Level ................. "); switch( Flag.level ) { case averagetime: printf( "average time %i seconds\n", Flag.centiseconds/100 ); break; case timecontrol: printf( "%i moves in %i minutes\n", Flag.moves, Flag.centiseconds/6000 ); break; case fixeddepth: printf( "%i search depth\n", Flag.depth/100 ); break; case fixedtime: printf( "fixed time %i seconds\n", Flag.centiseconds/100 ); } printf(" Time .................. "); if( Flag.cpu ) puts("cpu"); else puts("elapsed"); printf(" Book .................. "); if( Flag.book ) puts("on"); else puts("off"); printf(" Learning .............. "); if( Flag.learn ) puts("on"); else puts("off"); printf(" Permanent brain ....... "); switch( Flag.ponder ) { case 0: puts("off"); break; case 1: puts("on"); break; case 2: puts("on (pondering)"); break; default: break; /* 2005-09-14, José de Paula * GCC 3.4 thinks that this "default:" without a * statement is an error, so I put a break here. */ } printf(" Transposition table ... "); if( SizeHT == 0 ) puts("not used"); else { printf("hashing %i positions in %lu bytes\n", SizeHT, (unsigned long)(sizeof(thashentry)*SizeHT) ); } if( Flag.easy ) { printf(" Easy level ............ %i\n",Flag.easy); } printf(" Resigning ............. "); if( Flag.resign ) printf("%i.%02i\n",Flag.resign/100,Flag.resign%100); else printf("off\n"); printf("\n"); } /* SIG_INT handler */ void interrupt(int x) { int c; signal(SIGINT,SIG_IGN); if( Flag.polling ) { /* ignore lines that begin with '.' */ c=getc(stdin); ungetc(c,stdin); if( c=='.' ) { fgets(Inp,255,stdin); goto go_on; } } if( Flag.ponder < 2 ) { puts("interrupted"); Abort = 1; goto go_on; } while( command() ) {} go_on:; if( !Abort && !Flag.polling ) signal(SIGINT,interrupt); } int command(void) { static int no_prompt = 0; if( Flag.xboard < 2 ) { if( no_prompt ) { no_prompt = 0; } else if( Flag.ponder >= 2 ) { printf("\n[ pondering ]\n"); } else { printf( "[ %s, %i ]\n", Color==WHITE ? "white" : "black", Counter/2+1 ); } } if( Inp[0] == '\0' ) if( fgets(Inp,255,stdin) == NULL ) strcpy(Inp,"quit\n"); if( strncmp(Inp,"exit\n",5) == 0 && Flag.analyze ) { Flag.machine_color = Flag.analyze = 0; Inp[0]='\0'; return 1; } if( strncmp(Inp,"quit\n",5) == 0 || strncmp(Inp,"exit\n",5) == 0 ) { if( Flag.ponder < 2 ) return 0; else { Abort = 1; return 0; } } /* COMMAND: comment */ if( Inp[0]=='#' ) { printf("%s",Inp); no_prompt = 1; Inp[0]='\0'; return 1; } /* COMMAND: no op */ if( Inp[0]=='\n' ) { Inp[0]='\0'; if( Flag.ponder >= 2 ) return 0; /* continue search */ else return 1; } /* COMMAND: analyze */ if( strncmp( Inp, "analyze\n", 8 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } puts("analyze mode, type 'exit' to terminate"); Flag.analyze = 1; Flag.machine_color = 3; Inp[0]='\0'; return 1; } /* COMMAND: force */ if( strncmp( Inp, "force\n", 6 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } puts("you play both"); if( Flag.analyze ) Flag.machine_color = Color; else Flag.machine_color = 0; Inp[0]='\0'; return 1; } /* COMMANDS: white, black */ if( strncmp( Inp, "white\n", 6 ) == 0 || strncmp( Inp, "black\n", 6 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } puts("you do not play both"); if( Flag.machine_color == 0 ) Flag.machine_color = enemy(Color); Inp[0]='\0'; return 1; } /* COMMAND: both */ if( strncmp( Inp, "both\n", 5 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } puts("machine plays both"); Flag.machine_color = 3; Inp[0]='\0'; return 1; } /* COMMAND: new */ if( strncmp( Inp, "new\n", 4 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); DrawScore = -20; if( Flag.analyze ) Flag.machine_color = WHITE; else { Flag.machine_color = BLACK; puts("initial position set, machine plays black"); } Inp[0]='\0'; return 1; } /* COMMAND: go */ if( strncmp( Inp, "go\n", 3 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } Flag.machine_color = Color; Inp[0]='\0'; return 1; } /* COMMAND: bd */ if( strncmp( Inp, "bd\n", 3 ) == 0 || strncmp( Inp, "d\n", 2 ) == 0 ) { printboard(NULL); Inp[0]='\0'; return 1; } /* COMMAND: bk */ if( strncmp( Inp, "bk\n", 3 ) == 0 ) { tmove m[256]; int n; extern void bk(tmove *, int ); if( Flag.ponder >= 2 ) { Abort = 1; return 0; } generate_legal_moves( m, &n, checktest(Color) ); bk(m,n); /* printf("%08X\n",G[Counter].hashboard); */ Inp[0]='\0'; return 1; } /* COMMAND: post */ if( strncmp( Inp, "post\n", 5 ) == 0 ) { Flag.post = 1; puts("post on"); Inp[0]='\0'; return 1; } /* COMMAND: nopost */ if( strncmp( Inp, "nopost\n", 7 ) == 0 ) { Flag.post = 0; puts("post off"); Inp[0]='\0'; return 1; } /* COMMAND: level */ if( strncmp( Inp, "level ", 6 ) == 0 ) { l_level( Inp+6 ); Inp[0]='\0'; return 1; } /* COMMAND: time */ if( strncmp( Inp, "time ", 5 ) == 0 ) { sscanf( Inp+5, "%li", &Time ); Inp[0]='\0'; return 1; } /* COMMAND: otim */ if( strncmp( Inp, "otim ", 5 ) == 0 ) { sscanf( Inp+5, "%li", &Otim ); Inp[0]='\0'; return 1; } /* COMMAND: rating */ if( strncmp( Inp, "rating ", 7 ) == 0 ) { int phal, oppo, diff; if( sscanf( Inp+7, "%i %i", &phal, &oppo ) == 2 ) { diff = oppo-phal; if( diff > 300 ) DrawScore = 20; else if( diff < -300 ) DrawScore = -20; else DrawScore = diff/15; printf("setting draw score to %i\n",DrawScore); Inp[0]='\0'; return 1; } } /* COMMAND: hard */ if( strncmp( Inp, "hard\n", 5 ) == 0 ) { if( Flag.ponder==0 && Flag.easy==0 ) Flag.ponder = 1; if(Flag.ponder) puts("pondering on"); Inp[0]='\0'; return 1; } /* COMMAND: easy */ if( strncmp( Inp, "easy\n", 5 ) == 0 ) { if( Flag.ponder != 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } Flag.ponder = 0; } puts("pondering off"); Inp[0]='\0'; return 1; } /* COMMAND: beep, draw, ... ignored */ if( strncmp( Inp, "beep\n", 5 ) == 0 || strncmp( Inp, "bogus\n", 6 ) == 0 || strncmp( Inp, "draw\n", 5 ) == 0 || strncmp( Inp, "name ", 5 ) == 0 || strncmp( Inp, "random\n", 7 ) == 0 || strncmp( Inp, "noise ", 6 ) == 0 || strncmp( Inp, ".\n", 2 ) == 0 ) { /* ignore */ Inp[0]='\0'; return 1; } /* COMMAND: depth */ if( strncmp( Inp, "depth", 5 ) == 0 ) { int newdepth; if( Inp[5] == '\n' ) { printf("depth= "); scanf( "%i", &newdepth ); } else { sscanf( &Inp[6],"%i",&newdepth); } Flag.depth = 100*newdepth; if( Flag.depth < 200 ) Flag.depth = 200; else if( Flag.depth > MAXPLY*100 ) Flag.depth = MAXPLY*100; Flag.level = fixeddepth; printf("search depth %i\n", Flag.depth/100 ); Inp[0]='\0'; return 1; } /* COMMAND: book */ if( strncmp( Inp, "book\n", 5 ) == 0 ) { Flag.book = ! Flag.book; if( Flag.book ) puts("book on"); else puts("book off"); Inp[0]='\0'; return 1; } /* COMMAND: about */ if( strncmp( Inp, "about\n", 6 ) == 0 ) { about(); Inp[0]='\0'; return 1; } /* COMMAND: fen */ if( strncmp( Inp, "fen\n", 3 ) == 0 ) { printpositionfen(); Inp[0]='\0'; return 1; } /* COMMAND: help */ if( strncmp( Inp, "help\n", 5 ) == 0 ) { puts("COMMAND SUMMARY: about (shows settings), bd (displays position - same"); puts("as 'd'), bk (shows book info), book (enables/disables book), both"); puts("(machine plays both), depth (set search depth), fen, force (user"); puts("plays both, go (start computing), help, history (show game moves),"); puts("level , level , new (new game), post (show thinking), remove (take back last"); puts("move, two plies), nopost (do not show thinking), quit (same as 'exit'"); puts("or end of file character), score (show static evaluation), time "); puts("(remaining time is N/100 s), undo (undo last ply - same as 'u'),"); puts(" (set test position, start search, show result),"); puts("# (comment)"); Inp[0]='\0'; return 1; } /* COMMAND: score */ if( strncmp( Inp, "score\n", 6 ) == 0 ) { Scoring = 1; Depth = 100; printf("\n (stm) material = %i\n", G[Counter].mtrl-G[Counter].xmtrl); printf(" TOTAL EVALUATION = %i\n", score_position() ); printf("Wknow.hung=%i; Wknow.khung=%i\n", Wknow.hung, Wknow.khung); printf("Bknow.hung=%i; Bknow.khung=%i\n", Bknow.hung, Bknow.khung); puts(""); Scoring = 0; Inp[0]='\0'; return 1; } /* COMMAND: xboard */ if( strncmp( Inp, "xboard\n", 7 ) == 0 ) { Flag.xboard = 2; puts("xboard mode on"); Inp[0]='\0'; return 1; } /* COMMAND: history */ if( strncmp( Inp, "history\n", 8 ) == 0 ) { int i; int sc = (Counter+Color+1) % 2; if( sc ) printf("\n 1. ... "); for( i=0; i= 2 ) { Abort = 1; return 0; } if( Counter != 0 ) { undo_move( & G[Counter-1].m ); if(Flag.xboard<2) puts("halfmove back"); if( Flag.machine_color != 0 ) Flag.machine_color = enemy(Color); if( Flag.analyze ) Flag.machine_color = Color; } else puts("cannot undo"); Inp[0]='\0'; return 1; } /* COMMAND: remove (xboard) */ if( strncmp( Inp, "remove\n", 7 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } if( Counter > 1 ) { undo_move( & G[Counter-1].m ); undo_move( & G[Counter-1].m ); if(Flag.xboard<2) puts("move back"); if( Flag.machine_color != 0 ) Flag.machine_color = enemy(Color); } else puts("cannot remove"); Inp[0]='\0'; return 1; } /* COMMAND: edit (xboard) */ if( strncmp( Inp, "edit\n", 5 ) == 0 ) { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } edit(); if( Flag.analyze ) Flag.machine_color = 3; else Flag.machine_color = 0; if( Inp[0]=='e' ) Inp[0]='\0'; return 1; } /* COMMAND: test a position */ if( sevenslashes(Inp) ) /* test */ { if( Flag.ponder >= 2 ) { Abort = 1; return 0; } if( setfen(Inp) == 0 ) { static int entered=0; static int found=0; int f=0; tmove m; int i; printf("\n%s",Inp); m = root_search(); Flag.machine_color = 0; if( ! Flag.post ) { Depth += 100; infoline(0,NULL); } entered++; for( i=0; Inp[i]!='\0'; i++ ) if( checkmove( Inp+i, &m ) ) { f=1; found++; break; } if( f ) printf("[ Solution correct "); else { FILE * nf; /* not found */ static char filename[16] = "notfound.fin"; if( entered-found == 1 ) nf = fopen(filename,"w"); else nf = fopen(filename,"a"); if( nf != NULL ) { fputs( Inp, nf ); fclose(nf); } printf("[ Solution incorrect "); } printf(" %i.%02i%%, %i/%i ]\n", found*100/entered, found*10000/entered%100, found, entered); no_prompt = 1; } Inp[0]='\0'; return 1; } /* suppose this is an user move */ if( Flag.ponder >= 2 ) { tmove *pm = sandex(Inp,Pm,Pn); if(pm!=NULL) if( pm->from == Pondermove.from && pm->to == Pondermove.to && pm->in1 == Pondermove.in1 && pm->in2 == Pondermove.in2 && pm->in2a == Pondermove.in2a && pm->special == Pondermove.special ) { Flag.ponder = 1; if( ! l_iterate() ) Abort = 2; else if( !Flag.polling ) signal(SIGINT,interrupt); Inp[0] = '\0'; return 0; } Abort = 1; return 0; } if( terminal() < 2 ) { tmove m[256]; int n; int i; generate_legal_moves( m, &n, checktest(Color) ); { tmove *sd = sandex(Inp,m,n); if(sd!=NULL) i=sd-m; else i=n; } if( i != n ) { printf("\nyour move is "); printm( m[i], NULL ); puts(""); do_move( m+i ); switch( terminal() ) { case 1: puts("1/2-1/2 {Drawn game}"); break; case 2: puts("1/2-1/2 {Stalemate}"); break; case 3: if( Color == WHITE ) puts("0-1 {Black mates}"); else puts("1-0 {White mates}"); } Inp[0]='\0'; return 1; } } /*** UNKNOWN COMMAND / ILLEGAL MOVE ***/ { char *c=strchr(Inp,'\n'); if(c!=NULL) *c='\0'; else *Inp='\0'; } printf("Illegal move: %s\n",Inp); Inp[0] = '\0'; return 1; } void shell(void) { while( command() ) { while( ( Flag.machine_color & Color ) && terminal() < 2 ) { tmove m; m = root_search(); if( Flag.analyze ) { undo_move(&m); Flag.machine_color = enemy(Color); continue; } if( Flag.ponder >= 2 ) { Flag.ponder = 1; undo_move(&m); undo_move(&Pondermove); continue; } if( Flag.machine_color == 3 && Abort == 1 ) Flag.machine_color = 0; { int ter; if( Flag.resign != 0 ) { static int resign=0; if( m.value < -Flag.resign && Counter > 20 ) resign++; else resign=0; if( resign > 3 && Otim > 2000 /* oppo must have 20 s */ && Otim + Flag.increment*900 > 9000 /* && m.value > -CHECKMATE+100 */ ) { if( Flag.xboard ) puts("tellics resign"); if( Color == WHITE ) puts("1-0 {Black resigns}"); else puts("0-1 {White resigns}"); } } printf("my move is "); printm( m, NULL ); if( Flag.xboard ) { printf("\n%i. ... ",(Counter+1)/2); gnuprintm(m); } puts(""); switch( ( ter = terminal() ) ) { case 1: puts("1/2-1/2 {Drawn game}"); continue; case 2: puts("1/2-1/2 {Stalemate}"); continue; case 3: if( Color == WHITE ) puts("0-1 {Black mates}"); else puts("1-0 {White mates}"); continue; } if( Flag.ponder == 1 && Flag.machine_color != 3 && ter < 2 && ( Abort != 0 || Abort != 4 ) ) { int i; Pondermove = PV[0][1]; generate_legal_moves(Pm,&Pn,checktest(Color)); for( i=0; i!=Pn; i++ ) if( Pondermove.from == Pm[i].from && Pondermove.to == Pm[i].to && Pondermove.in1 == Pm[i].in1 && Pondermove.in2a == Pm[i].in2a ) break; if( i==Pn ) { if( Flag.post ) { puts("No move to ponder from PV."); puts("Looking for a move to ponder."); } if( Bookout < 4 || Counter < 10 ) i = bookmove( Pm, Pn ); else i = -1; if( i != -1 ) { Pondermove = Pm[i]; if( Flag.post ) puts("Found in book."); } else { if( Flag.post ) puts("Trying search."); Depth = -100; NoAbort = 1; Ply = 1; search(Pm,Pn,-CHECKMATE,CHECKMATE); NoAbort = 0; Pondermove = PV[1][1]; } for( i=0; i!=Pn; i++ ) if( Pondermove.from == Pm[i].from && Pondermove.to == Pm[i].to && Pondermove.in1 == Pm[i].in1 && Pondermove.in2a == Pm[i].in2a ) break; if( i==Pn ) { if(Flag.post) puts("No move found. A bug?"); i=0; } else { if(Flag.post) puts("Done."); } } if( i != Pn ) { /* OK, the move was also found in just * generated list of moves, not only in * the PV (principal variation). Let's * ponder then!!! ********************/ do_move(&Pondermove); if( terminal() > 1 ) undo_move(&Pondermove); else { if( Flag.post ) { printf("Hint: "); printm(Pondermove,NULL); puts(""); } Flag.ponder = 2; } } } continue; } } } } Phalanx-XXII/killers.c0000644000175000001440000000447310314125617014253 0ustar sombrausers#include "phalanx.h" typedef struct { unsigned f, t; } killentry; killentry RK[H9][H9]; /* reaction killer */ unsigned HK[H9][H9]; /* history killer table */ unsigned Maxhist = 1; void init_killers(void) { memset( RK, 0, H9*H9*sizeof(killentry) ); memset( HK, 0, H9*H9*sizeof(unsigned) ); Maxhist = 1; } void write_killer( int from, int to ) { if( B[to] == 0 ) { RK[G[Counter-1].m.from][G[Counter-1].m.to].f = from; RK[G[Counter-1].m.from][G[Counter-1].m.to].t = to; HK[from][to] += Depth/10 + 1; if( HK[from][to] > Maxhist ) { Maxhist = HK[from][to]; if( Maxhist > 16000 ) { int f,t; Maxhist /= 2; for( f=A1; f!=H9; f++ ) for( t=A1; t!=H9; t++ ) HK[f][t] /= 2; } } } } void add_killer( tmove *m, int n, thashentry *ht ) { int i, f=0, t=0; tmove *mpv = &PV[0][Ply]; tmove *mlv = &PV[Ply][Ply]; if( Depth > 0 ) { f = RK[G[Counter-1].m.from][G[Counter-1].m.to].f; t = RK[G[Counter-1].m.from][G[Counter-1].m.to].t; } for( i=0; i!=n; i++ ) { register tmove *m1 = m+i; if( FollowPV ) { if( m1->from == mpv->from && m1->to == mpv->to && m1->in2a == mpv->in2a ) m1->value = CHECKMATE; } else { if( m1->from == mlv->from && m1->to == mlv->to && m1->in2a == mlv->in2a ) m1->value += 350; if( ht != NULL ) if( ht->move != 0 ) if( ht->move == smove(m1) ) m1->value = CHECKMATE; } if( m1->value != CHECKMATE ) { if( m1->in2 ) /* capture */ { m1->value += Values[ m1->in2>>4 ]; if( Color==WHITE ) { if( P[m1->to]&0xFF00 ) m1->value -= ( Values[ m1->in1>>4 ] >> 2 ); else m1->value += 100; } else { if( P[m1->to]&0x00FF ) m1->value -= ( Values[ m1->in1>>4 ] >> 2 ); else m1->value += 100; } if( m1->value < 30 ) m1->value = 30; } /* leaving attacked square */ if( Color==WHITE ) { if(P[m1->from]&0xFF00) m1->value += 50; } else { if(P[m1->from]&0x00FF) m1->value += 50; } if( m->in1 != m->in2 ) /* pawn promotion */ m->value += Values[ m->in2>>4 ] - Values[ m->in1>>4 ]; if( Depth > 200 ) m1->value += see( B, m1->from, m1->to ); else /* last moved piece */ if( m1->to == G[Counter-1].m.to ) m1->value += 150; if( Depth > 0 ) { if( m1->from == f && m1->to == t ) m1->value += max(Depth,50); if( HK[ m1->from ][ m1->to ] ) m1->value += 1 + HK[ m1->from ][ m1->to ] * 500 / Maxhist; } } } } Phalanx-XXII/learn.c0000644000175000001440000000320210314125617013674 0ustar sombrausers#include "phalanx.h" #define LREHASH 8 tpbook Learn; typedef struct { unsigned hashboard; short depth, value; } tlearn; void wlearn( int depth, int value ) { int size, pos; int i; int bdepth, bpos; tlearn cell; if( Flag.learn == 0 || Learn.f == NULL || depth <= 400 ) return; size = Learn.filesize/sizeof(tlearn); pos = G[Counter].hashboard % size; if( fseek( Learn.f, pos*sizeof(tlearn), SEEK_SET ) != 0 ) return; myfread( &cell, sizeof(tlearn), Learn.f ); bdepth = -1000; bpos = pos; for( i=0; i bdepth ) { bdepth = cell.depth; bpos = pos+i; } } if( cell.hashboard == G[Counter].hashboard && cell.depth > depth ) return; if( fseek( Learn.f, (bpos%size)*sizeof(tlearn), SEEK_SET ) != 0 ) return; cell.hashboard = G[Counter].hashboard; cell.depth = depth; cell.value = value; myfwrite( &cell, sizeof(tlearn), Learn.f ); } int rlearn( void ) { int size, pos; int i; tlearn cell; if( Flag.learn == 0 || Learn.f == NULL ) return NOVALUE; size = Learn.filesize/sizeof(tlearn); pos = G[Counter].hashboard % size; for( i=0; i= Depth ) return cell.value; else return NOVALUE; } } return NOVALUE; } Phalanx-XXII/levels.c0000644000175000001440000000735510314125617014102 0ustar sombrausers#include "phalanx.h" long T1, T2; long Time = 600*100; long Otim = 600*100; /* return time in centiseconds */ long ptime(void) { if( Flag.easy ) return Nodes; else if( Flag.cpu ) return ((double)clock())*100/CLOCKS_PER_SEC; else { #ifdef _WIN32 return GetTickCount()/10; #else struct timeval t; gettimeofday( &t, NULL ); return t.tv_sec*100 + t.tv_usec/10000; #endif } } void l_level( char * l ) { int moves, seconds, minutes, increment; while( *l == ' ' ) l++; moves = atoi(l); while( isdigit(*l) ) l++; while( *l == ' ' ) l++; if( *l == '\n' || *l == '\0' ) if( ! Flag.easy ) { printf("fixed time %i seconds\n", moves ); Flag.level = fixedtime; Flag.centiseconds = moves*100; return; } minutes = atoi(l); while( isdigit(*l) ) l++; if( *l == ':' ) { l++; seconds = atoi(l); while( isdigit(*l) ) l++; } else seconds = 0; while( isdigit(*l) ) l++; while( *l == ' ' ) l++; increment = atoi(l); if( moves==0 ) printf( "level: all moves in %i:%02i, increment %i seconds\n", minutes, seconds, increment ); else printf( "level: %i moves in %i:%02i, increment %i seconds\n", moves, minutes, seconds, increment ); if( Flag.easy ) { if( moves == 0 ) moves = 80; Flag.level = fixedtime; Flag.centiseconds = (increment+minutes*60/moves) * (150-Flag.easy); if( Flag.post ) printf( "setting avg time to %i cs\n", Flag.centiseconds ); } else { Flag.level = timecontrol; Flag.moves = moves; Flag.centiseconds = minutes*6000+seconds*100; Flag.increment = increment; Time = Flag.centiseconds; } } void l_startsearch(void) { int moves; T1 = ptime(); switch( Flag.level ) { case timecontrol: if( Flag.moves > 0 ) moves = 2*Flag.moves; else { moves = Counter + (G[Counter].mtrl+G[Counter].xmtrl)/800; if( Counter < 120 ) moves += 60 - Counter/4; else moves += 30; } if( Flag.increment == 0 ) T2 = 0; else if( Time/Flag.increment >= 1600 ) T2 = Flag.increment * 60; else if( Time/Flag.increment <= 400 ) T2 = Flag.increment * 10; else T2 = Flag.increment * (Time/Flag.increment/8-20)/3; if( Flag.post && T2 && Flag.xboard<2 ) printf( " -> increment adds %g s to soft time limit\n", ((float)T2) / (float)100 ); T2 += Time / ( moves - Counter%moves + 4 ); if( Flag.ponder ) T2 += T2/8; if( Flag.increment==0 && Flag.level==timecontrol ) { if( Time<1500 ) T2 -= T2/2; else if( Time<6000 ) T2 -= T2/4; } if( Flag.post && Flag.xboard<2 ) printf( " -> soft time limit %g s\n", ((float)T2) / (float)100 ); /*** Now, set up the hard limit ***/ if( Time < 1500) Flag.centiseconds = Time/(moves+1)*3; else if( Time < 3000) Flag.centiseconds = Time/(moves+1)*6; else if( Time < 6000) Flag.centiseconds = Time/(moves+1)*12; else Flag.centiseconds = Time/(moves+1)*18; Flag.centiseconds += 400*Flag.increment; if( Flag.centiseconds > Time-Flag.increment*100 ) { if( Time > 200*Flag.increment ) Flag.centiseconds = Time-100*Flag.increment; else Flag.centiseconds = Time/2; } if( Flag.centiseconds < 25 ) Flag.centiseconds = 25; if( Flag.post && Flag.xboard<2 ) printf( " -> hard time limit %g s\n", ((float)Flag.centiseconds) / (float)100 ); break; case averagetime: T2 = Flag.centiseconds/3; break; default: break; } if( T2 < 1 ) T2 = 1; } int l_iterate(void) { if( Flag.level == fixeddepth ) { return ( Depth < Flag.depth ); } else if( Flag.level == averagetime || Flag.level == timecontrol ) { long t = ptime(); switch( EasyMove ) { case 1: return ( t <= T1 + T2/3 ); case 2: return ( t <= T1 + T2/6 ); default: if( Turns==0 ) return ( t <= T1 + T2 ); else return ( t <= T1 + T2*(8+Turns)/8 ); } } else return 1; } Phalanx-XXII/moving.c0000644000175000001440000001677310314125617014113 0ustar sombrausers/* * executing and unexecuting generated moves */ #include "phalanx.h" #undef DEBUG_MLIST #ifdef DEBUG_MLIST int checklist(tmove *m) { int j; int err=0; int wp=0, bp=0; for( j=WKP; j!=0 && wp<18; j=L[j].next ) { wp++; if(color(B[j])!=WHITE) err=1; } for( j=A1; j!=H9; j++ ) if( color(B[j])==WHITE ) wp--; for( j=BKP; j!=0 && bp<18; j=L[j].next ) { bp++; if(color(B[j])!=BLACK) err=1; } for( j=A1; j!=H9; j++ ) if( color(B[j])==BLACK ) bp--; if( wp!=0 || bp!=0 || err ) { int x=18; puts(""); for( j=WKP; j!=0 && x!=0; j=L[j].next ) { x--; if(color(B[j])!=WHITE) printf("!"); printf("%i,",j); } puts(""); x=18; for( j=BKP; j!=0 && x!=0; j=L[j].next ) { x--; if(color(B[j])!=BLACK) printf("!"); printf("%i,",j); } puts(""); printboard(NULL); printf("wp=%i, bp=%i\n",wp,bp); for(j=0;j!=Counter;j++) printm(G[j].m,NULL); puts(""); if( m!=NULL) printm(*m,NULL); getchar(); return 1; } return 0; } #endif #define update_hash(p,s) { G[Counter].hashboard ^= H[ HP[p] ][ HS[s] ]; } void do_move(register tmove * m) { G[Counter].m = *m; Counter++; G[Counter].castling = G[Counter-1].castling; G[Counter].rule50 = G[Counter-1].rule50 + 1; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; G[Counter].mtrl = G[Counter-1].xmtrl; G[Counter].xmtrl = G[Counter-1].mtrl; Ply++; switch(m->special) { case 0: /* most of the moves */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); if( m->in2 != 0 ) /* capture */ { update_hash( m->in2, m->to ); G[Counter].mtrl -= Values[ m->in2 >> 4 ]; G[Counter].rule50 = 0; /* remove captured piece from the list */ L[ L[m->to].prev ].next = L[m->to].next; L[ L[m->to].next ].prev = L[m->to].prev; } else if( piece(m->in1) == PAWN ) G[Counter].rule50 = 0; /* update piece list */ L[m->to] = L[m->from]; L[ L[m->to].prev ].next = L[ L[m->to].next ].prev = m->to; if( m->in2a != m->in1 ) /* pawn promotion */ G[Counter].xmtrl += Values[ m->in2a >> 4 ] - P_VALUE; B[m->from] = 0; B[m->to] = m->in2a; { static unsigned char cb_[80] = { 0, WLONG, 0, 0, 0, (WSHORT|WLONG), 0, 0, WSHORT, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, BLONG, 0, 0, 0, (BSHORT|BLONG), 0, 0, BSHORT, 0 }; static unsigned char * cb = cb_-20; G[Counter].castling |= cb[m->from] | cb[m->to]; } break; case SHORT_CASTLING: if( Color == WHITE ) { B[E1]=0; B[F1]=WR; B[G1]=WK; B[H1]=0; G[Counter].castling |= ( WSHORT | WLONG ); update_hash( WK, E1 ); update_hash( WK, G1 ); update_hash( WR, H1 ); update_hash( WR, F1 ); L[G1] = L[E1]; WKP = L[L[G1].next].prev = G1; L[F1] = L[H1]; L[L[F1].prev].next = L[L[F1].next].prev = F1; } else { B[E8]=0; B[F8]=BR; B[G8]=BK; B[H8]=0; G[Counter].castling |= ( BSHORT | BLONG ); update_hash( BK, E8 ); update_hash( BK, G8 ); update_hash( BR, H8 ); update_hash( BR, F8 ); L[G8] = L[E8]; BKP = L[L[G8].next].prev = G8; L[F8] = L[H8]; L[L[F8].prev].next = L[L[F8].next].prev = F8; } break; case LONG_CASTLING: if( Color == WHITE ) { B[A1]=0; B[C1]=WK; B[D1]=WR; B[E1]=0; G[Counter].castling |= ( WSHORT | WLONG ); update_hash( WK, E1 ); update_hash( WK, C1 ); update_hash( WR, A1 ); update_hash( WR, D1 ); L[C1] = L[E1]; WKP = L[L[C1].next].prev = C1; L[D1] = L[A1]; L[L[D1].prev].next = L[L[D1].next].prev = D1; } else { B[A8]=0; B[C8]=BK; B[D8]=BR; B[E8]=0; G[Counter].castling |= ( BSHORT | BLONG ); update_hash( BK, E8 ); update_hash( BK, C8 ); update_hash( BR, A8 ); update_hash( BR, D8 ); L[C8] = L[E8]; BKP = L[L[C8].next].prev = C8; L[D8] = L[A8]; L[L[D8].prev].next = L[L[D8].next].prev = D8; } break; default: /* en passant pawn capture */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); update_hash( B[m->special], m->special ); B[m->from] = 0; B[m->to] = m->in2a; B[m->special] = 0; /* captured pawn */ /* update piece list */ L[m->to] = L[m->from]; L[ L[m->to].prev ].next = L[ L[m->to].next ].prev = m->to; L[L[m->special].next].prev = L[m->special].prev; L[L[m->special].prev].next = L[m->special].next; G[Counter].mtrl -= P_VALUE; G[Counter].rule50 = 0; /* this is an irreversible move */ } Color = enemy(Color); Depth -= m->dch; #ifdef DEBUG_MLIST checklist(m); #endif } void undo_move(register tmove * m) { Color = enemy(Color); Depth += m->dch; Ply--; Counter--; switch(m->special) { case 0: /* most of the moves */ B[m->from] = m->in1; B[m->to] = m->in2; /* update piece list */ L[m->from] = L[m->to]; L[ L[m->from].prev ].next = L[ L[m->from].next ].prev = m->from; if( m->in2 != 0 ) /* return captured piece to the list */ { if( color(m->in2) == WHITE ) { L[m->to].next = L[WKP].next; L[m->to].prev = WKP; L[L[WKP].next].prev = m->to; L[WKP].next = m->to; } else { L[m->to].next = L[BKP].next; L[m->to].prev = BKP; L[L[BKP].next].prev = m->to; L[BKP].next = m->to; } } break; case SHORT_CASTLING: if( Color == WHITE ) { B[E1]=WK; B[F1]=0; B[G1]=0; B[H1]=WR; L[E1] = L[G1]; WKP = L[L[E1].next].prev = E1; L[H1] = L[F1]; L[L[H1].prev].next = L[L[H1].next].prev = H1; } else { B[E8]=BK; B[F8]=0; B[G8]=0; B[H8]=BR; L[E8] = L[G8]; BKP = L[L[E8].next].prev = E8; L[H8] = L[F8]; L[L[H8].prev].next = L[L[H8].next].prev = H8; } break; case LONG_CASTLING: if( Color == WHITE ) { B[A1]=WR; B[C1]=0; B[D1]=0; B[E1]=WK; L[E1] = L[C1]; WKP = L[L[E1].next].prev = E1; L[A1] = L[D1]; L[L[A1].prev].next = L[L[A1].next].prev = A1; } else { B[A8]=BR; B[C8]=0; B[D8]=0; B[E8]=BK; L[E8] = L[C8]; BKP = L[L[E8].next].prev = E8; L[A8] = L[D8]; L[L[A8].prev].next = L[L[A8].next].prev = A8; } break; default: /* en passant pawn capture */ B[m->to] = 0; L[m->from] = L[m->to]; L[ L[m->from].prev ].next = L[ L[m->from].next ].prev = m->from; if( Color == WHITE ) { B[m->from] = WP; B[m->special] = BP; /* captured pawn */ L[m->special].next = L[BKP].next; L[m->special].prev = BKP; L[L[BKP].next].prev = m->special; L[BKP].next = m->special; } else { B[m->from] = BP; B[m->special] = WP; /* captured pawn */ L[m->special].next = L[WKP].next; L[m->special].prev = WKP; L[L[WKP].next].prev = m->special; L[WKP].next = m->special; } } #ifdef DEBUG_MLIST checklist(m); #endif } #ifdef ETTC /** *** Doing and undoing only hash keys. To be used for ETC *** (enhanced transpostion cutoffs); see evaluate.c **/ void do_hash(register tmove * m) { Counter++; G[Counter].hashboard = HASH_COLOR ^ G[Counter-1].hashboard; switch(m->special) { case 0: /* most of the moves */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); if( m->in2 != 0 ) /* capture */ update_hash( m->in2, m->to ); break; case SHORT_CASTLING: if( Color == WHITE ) { update_hash( WK, E1 ); update_hash( WK, G1 ); update_hash( WR, H1 ); update_hash( WR, F1 ); } else { update_hash( BK, E8 ); update_hash( BK, G8 ); update_hash( BR, H8 ); update_hash( BR, F8 ); } break; case LONG_CASTLING: if( Color == WHITE ) { update_hash( WK, E1 ); update_hash( WK, C1 ); update_hash( WR, A1 ); update_hash( WR, D1 ); } else { update_hash( BK, E8 ); update_hash( BK, C8 ); update_hash( BR, A8 ); update_hash( BR, D8 ); } break; default: /* en passant pawn capture */ update_hash( m->in1, m->from ); update_hash( m->in2a, m->to ); update_hash( B[m->special], m->special ); } Depth -= m->dch; } void undo_hash(register tmove * m) { Depth += m->dch; Counter--; } #endif /* ETTC */ Phalanx-XXII/phalanx.c0000644000175000001440000003025610320055772014240 0ustar sombrausers /* * The main module: * - Parsing command line parameters * - benchmark */ #include "phalanx.h" /* 2005-09-14, José de Paula * GCC 3.0 deprecated multi-line strings, and, as of GCC 3.4, they are no longer supported. */ void badoptions(void) { printf("\nUsage: phalanx [options] [ []]\n phalanx [options] []\n phalanx bench\n phalanx bcreate [options]\nOptions: -t \n -f \n -x <+/-> xboard mode on/off default: on\n -p <+/-> permanent brain on/off default: off\n -s <+/-> show thinking on/off default: off\n -c <+/-> cpu time default: off\n -o <+/-> polling input default: on\n -b <+/-> opening book default: on\n -r default: 0 (no resigning)\n -e default: 0 (best play)\n -l <+/-> learning on/off default: on\n -v print version and exit\n -P \n -S \n -L \n -g \nExamples: phalanx -c+ -s+ -o - -x- -f 60 -t4000\n xboard -fcp \"phalanx -l+ -r800\"\n"); exit(0); } char *get_book_file(char *bookdir,char *env_variable, char *path,char *name,int mode) { char file[256]; char *aux; if(bookdir) /* Specified in options? */ path = bookdir; else if((aux=getenv(env_variable))) /* In an environment variable? */ path = aux; else if(!access(name,mode)) /* In the current directory? */ path = "."; else /* Desperacy now, use compile time file. */ ; #ifdef GNUFUN snprintf(file,255,"%s/%s",path,name); #else sprintf(file,"%s/%s",path,name); #endif return strdup(file); } int main( int argc, char **argv ) { int c; clock_t t; char *PbookDir,*SbookDir,*LbookDir,*EcoDir; #ifdef GNUFUN int indexptr; struct option longopts[] = { { "help", no_argument, NULL, '?' }, { "version", no_argument, NULL, 'v' }, { "trans-table-cells", required_argument, NULL, 'T' }, { "trans-table-bytes", required_argument, NULL, 't' }, { "fixed-search-time", required_argument, NULL, 'f' }, { "xboard-mode", no_argument, &Flag.xboard, 1 }, { "no-xboard-mode", no_argument, &Flag.xboard, 0 }, { "permanent-brain", no_argument, &Flag.ponder, 1 }, { "no-permanent-brain", no_argument, &Flag.ponder, 0 }, { "show-thinking", no_argument, &Flag.post, 0 }, { "no-show-thinking", no_argument, &Flag.post, 1 }, { "cpu-time", no_argument, &Flag.cpu, 1 }, { "no-cpu-time", no_argument, &Flag.cpu, 0 }, { "poll-input", no_argument, &Flag.polling, 1 }, { "no-poll-input", no_argument, &Flag.polling, 0 }, { "use-opening-book", no_argument, &Flag.book, 1 }, { "no-use-opening-book", no_argument, &Flag.book, 0 }, { "easy-level", required_argument, NULL, 'e' }, { "resign-value", required_argument, NULL, 'r' }, { "learning", no_argument, &Flag.learn, 1 }, { "no-learning", no_argument, &Flag.learn, 0 }, { "primary-book-dir", required_argument, NULL, 'P' }, { "secondary-book-dir", required_argument, NULL, 'S' }, { "learning-file-dir", required_argument, NULL, 'L' }, { "log-file-name", required_argument, NULL, 'g' }, { 0,0,0,0 } }; #endif t = clock(); /* Do NOT buffer I/O - needed for communication with xboard */ setvbuf(stdout, (char*)NULL, _IONBF, 0); printf("Phalanx "); puts(VERSION); if(argc>1) if( strncmp("bcreate\0",argv[1],8) == 0 ) { return bcreate(argc-1,argv+1); } /* Initialize the random number generator. */ srand( ((unsigned)time(NULL)) + ((unsigned)getpid()) ); /* SIG_INT */ signal(SIGINT,SIG_IGN); setfen("rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w"); #undef debugsee #ifdef debugsee { int x; int j; setfen("q2r2k1/1b3ppp/2prpn2/3P4/2PRP3/4NB2/5PPP/3R2K1 w"); printboard(NULL); for(j=0;j!=1000000;j++) x=see(C6,D5); printf(" [%i]\n",see(C6,D5)); return 0; } #endif Flag.machine_color = BLACK; Flag.post = 0; Flag.analyze = 0; Flag.xboard = 1; Flag.book = 1; Flag.centiseconds = 1000; Flag.level = averagetime; Flag.ponder = 0; Flag.cpu = 0; Flag.increment = 0; Flag.polling = 1; Flag.resign = 0; Flag.easy = 0; Flag.noise = 50; /* 0.5 s */ Flag.learn = 1; Flag.bench = 0; Flag.log = NULL; Scoring = 0; SbookDir = NULL; PbookDir = NULL; EcoDir = NULL; LbookDir = NULL; opterr = 0; #ifdef GNUFUN while( ( c = getopt_long( argc, argv, "vf:T:t:p:s:x:c:o:r:b:e:l:S:P:L:g:", longopts, &indexptr) ) != -1 ) #else while( ( c = getopt(argc,argv,"vf:T:t:p:s:x:c:o:r:b:e:l:S:P:L:g:") ) != -1 ) #endif switch(c) { case 'T': if( sscanf( optarg, "%i", &SizeHT ) == 0 ) badoptions(); break; case 't': if( sscanf( optarg, "%i", &SizeHT ) == 0 ) badoptions(); SizeHT = 1024 * SizeHT / sizeof(thashentry); break; case 'r': { int i; if( sscanf( optarg, "%i", &i ) == 0 ) badoptions(); Flag.resign = abs(i); } break; case 'f': { static int t; if( sscanf( optarg, "%i", &t ) == 0 ) badoptions(); Flag.centiseconds = t*100; Flag.level = fixedtime; } break; case 'e': { static int e; if( sscanf( optarg, "%i", &e ) == 0 ) badoptions(); if( e > 100 ) badoptions(); Flag.easy = e; } break; case 'p': switch(*optarg) { case '+': Flag.ponder = 1; break; case '-': Flag.ponder = 0; break; default: badoptions(); } break; case 's': switch(*optarg) { case '+': Flag.post = 1; break; case '-': Flag.post = 0; break; default: badoptions(); } break; case 'x': switch(*optarg) { case '+': Flag.xboard = 1; break; case '-': Flag.xboard = 0; break; default: badoptions(); } break; case 'c': switch(*optarg) { case '+': Flag.cpu = 1; break; case '-': Flag.cpu = 0; break; default: badoptions(); } break; case 'o': switch(*optarg) { case '+': Flag.polling = 1; break; case '-': Flag.polling = 0; break; default: badoptions(); } break; case 'b': switch(*optarg) { case '+': Flag.book = 1; break; case '-': Flag.book = 0; break; default: badoptions(); } break; case 'l': switch(*optarg) { case '+': Flag.learn = 1; break; case '-': Flag.learn = 0; break; default: badoptions(); } break; case 'g': { if( ( Flag.log = fopen(optarg,"a") ) != NULL ) { setvbuf(Flag.log, (char*)NULL, _IONBF, 0); printf("log file %s\n",optarg); } else printf("telluser Phalanx: cannot open log file\n"); } break; case 'v': /* fprintf(stderr,"%s\n",VERSION); */ exit(0); case 'P': PbookDir = strdup(optarg); break; case 'E': EcoDir = strdup(optarg); break; case 'S': SbookDir = strdup(optarg); break; case 'L': LbookDir = strdup(optarg); break; case '?': badoptions(); break; } { int m; switch( argc - optind ) { case 0: break; case 1: if( argc==2 && strncmp("bench\0",argv[1],6)==0 ) { Flag.bench = 1; break; } if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = 100*m; Flag.level = averagetime; break; case 2: if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.moves = m; if( sscanf(argv[optind+1],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = m*6000; Flag.level = timecontrol; break; case 3: if( sscanf(argv[optind],"%i",&m) == 0 ) badoptions(); Flag.moves = m; if( sscanf(argv[optind+1],"%i",&m) == 0 ) badoptions(); Flag.centiseconds = m*6000; if( sscanf(argv[optind+2],"%i",&m) == 0 ) badoptions(); Flag.increment = m; Flag.level = timecontrol; break; default: badoptions(); } } if( Flag.easy ) { SizeHT = 0; Flag.ponder = 0; Flag.learn = 0; } else if( SizeHT != 0 ) { HT = calloc( SizeHT, sizeof(thashentry) ); if( HT == NULL ) { puts("cannot alloc hashtable"); SizeHT = 0; } } /* alloc static eval cache */ { extern void initcache(void); initcache(); } /* init distance tables */ { extern void initdist(void); initdist(); } if( Flag.bench ) { # define NPOS 10 /* number of positions */ int i; long tim; int64 allnodes = 0; char * positions[NPOS] = { "rnbqkbnr/pppppppp/////PPPPPPPP/RNBQKBNR/w", "2kr3r/pp3Npp/2pbbn2/6B1/2BPp3/6Pq/PPP1Q2P/2KR3R b", "r1bq1r1k/2pn2bp/1p1p1np1/pN1Pp3/1PP1Pp2/P2B1P2/1BQN2PP/1R3RK1 b", "r4rk1/2p1p1b1/p1n3pp/1p1qP3/P1pP4/B1P2PPN/4Q1K1/R6R b", "8/1p3rpp/p2nk3/P3p3/2R5/2N2PP1/1P2K2P/8 w", "rnbr2k1/ppq1ppbp/6p1/2p5/3P4/2PBPN2/P4PPP/1RBQ1RK1 w", "3r1rk1/1q2b1pp/pn3p2/1pp5/4PB2/5N2/PP1RQPPP/3R2K1 w", "8/2p5/5pK1/5R2/4k2P/p4P2/1r6/8 b", "3r1rk1/p3qp1p/2bb2p1/2pp4/8/1P2P3/PBQN1PPP/2R2RK1 b", "k7/ppp5/8/8/8/8/P1P5/K7/w" }; Flag.cpu = 1; Flag.level = fixedtime; Flag.centiseconds = 3000; Flag.post = Flag.book = Flag.learn = Flag.ponder = Flag.polling = 0; printf("Running benchmark, this will take 5 minutes of CPU time.\n"); printf("----------"); tim = ptime(); for( i=0; i!=NPOS; i++ ) { setfen(positions[i]); if( i!=0 ) printf("+"); fflush(stdout); root_search(); if( Abort == 1 ) return 0; allnodes += Nodes; } printf("+\n%10i nodes per second\n", (int)(100*allnodes / (ptime()-tim) )); return 0; } /*** Opening book init ***/ /* Try to open book files. Give a message if not successful. */ SbookDir = get_book_file(SbookDir,ENV_SBOOK,SBOOK_DIR,SBOOK_FILE,R_OK); Sbook.f = fopen(SbookDir,"rb"); PbookDir = get_book_file(PbookDir,ENV_PBOOK,PBOOK_DIR,PBOOK_FILE,R_OK); Pbook.f = fopen(PbookDir,"rb"); EcoDir = get_book_file(EcoDir,ENV_ECO,ECO_DIR,ECO_FILE,R_OK); Eco = fopen(EcoDir,"rb"); if( Flag.learn ) { LbookDir = get_book_file(LbookDir,ENV_LEARN,LEARN_DIR,LEARN_FILE,R_OK|W_OK); Learn.f = fopen(LbookDir,"r+"); if( Learn.f == NULL ) { # define LFSZ 65536 int b[LFSZ]; char filename[256]; memset( b, 0, LFSZ*sizeof(int) ); sprintf(filename,"./%s",LEARN_FILE); free( LbookDir ); LbookDir = strdup( filename ); Learn.f = fopen(LbookDir,"w+"); if( fwrite( b, sizeof(int), LFSZ, Learn.f ) == LFSZ ) printf("telluser Phalanx: created learn file %s\n",LbookDir); } } else Learn.f = NULL; if( Pbook.f != NULL ) { struct stat fs; stat(PbookDir,&fs); Pbook.filesize = fs.st_size; printf("primary book %s, %d bytes\n",PbookDir,Pbook.filesize); } if( Sbook.f != NULL ) { struct stat fs; unsigned pos; stat(SbookDir,&fs); Sbook.filesize = fs.st_size; myfread( &pos, sizeof(unsigned), Sbook.f ); Sbook.firstkey=pos; fseek( Sbook.f, Sbook.filesize-6, SEEK_SET ); myfread( &pos, sizeof(unsigned), Sbook.f ); Sbook.lastkey=pos; printf("secondary book %s, %d bytes\n",SbookDir,Sbook.filesize); } if( Learn.f != NULL ) { struct stat fs; stat(LbookDir,&fs); Learn.filesize = fs.st_size; printf("learning file %s, %d bytes\n",LbookDir,Learn.filesize); } if( Eco != NULL ) { struct stat fs; stat(EcoDir,&fs); printf("eco file %s, %i bytes\n",EcoDir,(int) fs.st_size); } if( Sbook.f==NULL || Pbook.f==NULL ) { if( Flag.xboard ) printf("telluser Phalanx: "); printf("Cannot open "); } if( Sbook.f == NULL ) if( Pbook.f == NULL ) printf("both [%s] and [%s]\n", SBOOK_FILE, PBOOK_FILE ); else printf("[%s]\n", SBOOK_FILE ); else if( Pbook.f == NULL ) printf("[%s]\n", PBOOK_FILE ); if( Learn.f == NULL && Flag.learn ) { Flag.learn=0; puts("telluser Phalanx: cannot open learn file"); } printf("tellics set 1 Phalanx "); printf(VERSION); if( Flag.easy ) printf(", easy level %i\n", Flag.easy ); else printf(", %i kB hashtable, %i/%i kB P/S opening book", (int)(((1+SizeHT)*sizeof(thashentry)-1)/1024),(int)(Pbook.filesize/1024), (int) (Sbook.filesize/1024)); printf("\n"); /************************************/ /************************************/ shell(); /************************************/ /************************************/ t = clock()-t; printf("Processor time ......... %i:%02i:%02i.%02i\n", (int) (t/CLOCKS_PER_SEC/3600), (int) (t/CLOCKS_PER_SEC%3600/60), (int) (t/CLOCKS_PER_SEC%60), (int) (t*100/CLOCKS_PER_SEC%100) ); if( Age != 0 ) { printf("Average search depth ... %g\n", ((float)AllDepth) / ((float)(Age*100)) ); printf("Average NPS report ..... %g\n", ((float)AllNPS) / ((float)Age) ); } printf("Hash table age ......... %i\n", Age); puts("Good bye!"); return 0; } Phalanx-XXII/search.c0000644000175000001440000002350010314125617014043 0ustar sombrausers /* * Alphabeta negamax search */ #include "phalanx.h" #define SCOUT #define WINDOW 60 #define update_PV( move, ply ) \ { register int j; \ PV[ply][ply] = move; \ for(j=ply+1;PV[ply+1][j].from;j++) PV[ply][j] = PV[ply+1][j]; \ PV[ply][j].from = 0; /* end of copied line */ \ } int sortkey( const void *a, const void *b ) { return ( ((tmove*)b)->value - ((tmove*)a)->value ); } /* enemy attacks given square */ int attacktest( int square, int ocolor ) { /* pawn */ if(ocolor!=1) { if( B[square+11]==BP || B[square+9]==BP ) return 2; } else { if( B[square-11]==WP || B[square-9]==WP ) return 2; } /* knight */ { int i, enemy = KNIGHT+ocolor; for( i=0; i!=8; i++ ) if( B[square+N_moves[i]] == enemy ) return 2; } /* rook or queen */ { int d, enemy1 = ROOK+ocolor, enemy2 = QUEEN+ocolor; for( d=0; d!=4; d++ ) { int i=square; int step=RB_dirs[d]; do i += step; while( B[i] == 0 ); if( B[i]==enemy1 || B[i]==enemy2 ) return 2; } } /* bishop or queen */ { int d, enemy1 = BISHOP+ocolor, enemy2 = QUEEN+ocolor; for( d=4; d!=8; d++ ) { int i=square; int step=RB_dirs[d]; do i += step; while( B[i] == 0 ); if( B[i]==enemy1 || B[i]==enemy2 ) return 2; } } /* king */ if( dist[ 120*square + L[ocolor].next ].max == 1 ) return 1; return 0; } /* * search carefuly. we expect fail-low at this node. * This is only used when null move fails low by a high amount -> * that means we are probably under a major threat and we should * extend anything that removes or delays the threat. * So, this is a normal PVS search that extends moves * that fail high in the zero width search - their re-search * is extended. */ int csearch( tmove *m, /* move list */ int n, /* number of moves */ int Alpha, int Beta, int extend ) { int i; int result; for( i=0; i!=n; i++ ) { int max; { int j; max = i; for( j=i+1; j!=n; j++ ) if( m[j].value > m[max].value ) max=j; } do_move(m+max); result = - evaluate( -Alpha-1, -Alpha ); if( result > Alpha ) /* let's look better at this move */ { Depth+=extend; result = - evaluate( -Beta, -Alpha ); /* undo_move(m+max); printboard(NULL); printm( m[max], NULL ); printf("ext=%i",extend); if( result <= Alpha ) printf("[+]"); else printf("[-]"); do_move(m+max); getchar(); */ Depth-=extend; } undo_move(m+max); FollowPV = 0; if( result > Alpha ) /* still better? ok, we can trust it. */ { update_PV( m[max], Ply ); Alpha = result; if(Alpha>=Beta) return Alpha; extend=0; } m[max] = m[i]; } return Alpha; } int search( tmove *m, /* move list */ int n, /* number of moves */ int Alpha, int Beta ) { int i; int maxi = -1; int result; if( Abort && ! NoAbort ) return 0; /*** internal iterative deepening ***/ #define IID #ifdef IID if( Depth > 200 ) { int max=0; for( i=1; i!=n; i++ ) if( m[i].value > m[max].value ) max=i; if( m[max].value != CHECKMATE ) { int depth=Depth; Depth -= 200; search( m, n, Alpha, Beta ); Depth = depth; #undef DEBUGIID #ifdef DEBUGIID if(Depth>400) { max=0; printboard(NULL); for(i=0;i!=n;i++) if(m[i].value>m[max].value) max=i; printm(m[max],NULL); getchar(); } #endif } } #endif for( i=0; i!=n; i++ ) { int max; { int j; max = i; for( j=i+1; j!=n; j++ ) if( m[j].value > m[max].value ) max=j; } do_move(m+max); if( i == 0 || Depth <= 0 ) result = - evaluate( -Beta, -Alpha ); else { result = - evaluate( -Alpha-1, -Alpha ); if( result>Alpha && result Alpha ) { /* { int i; for(i=Counter-Ply;i!=Counter;i++) printm(G[i].m,NULL); printf("[%i,%i] %i",Alpha,Beta,result); getchar(); } */ update_PV( m[max], Ply ); Alpha = result; if(Alpha>=Beta) { m[max].value = (CHECKMATE-5000)+Depth; return Alpha; } maxi = i; } { tmove mo=m[max]; m[max] = m[i]; m[i] = mo; } } if( maxi != -1 ) m[maxi].value = (CHECKMATE-5000)+Depth; return Alpha; } int EasyMove; int bgs; /* best group size */ /** *** Sorting root moves and detecting possible `Easy Move'. **/ int sort_root_moves( tmove *m, int n ) { int i; int best = -CHECKMATE; int secondbest = -CHECKMATE; int result; bgs=0; FollowPV = 0; PV[0][0] = m[0]; EasyMove = 0; Depth = 100; for( i=0; i!=n; i++ ) { do_move(m+i); result = - evaluate( -CHECKMATE, CHECKMATE ); m[i].value = result/4; if( m[i].in2 ) { m[i].value += Values[ m[i].in2>>4 ]; bgs++; } else if( m[i].special ) { m[i].value += 100; bgs++; } if( checktest(Color) ) { m[i].value += 150; bgs++; } undo_move(m+i); if( result > best ) { tmove mm=m[0]; m[0]=m[i]; m[i]=mm; secondbest = best; best = result; update_PV( m[0], 0 ); } else if( result > secondbest ) secondbest = result; } qsort( m+1, n-1, sizeof(tmove), sortkey ); if( n == 1 ) EasyMove = 3; else if( abs(best) > CHECKMATE - 100 ) EasyMove = 2; else if( best - secondbest > 250 ) EasyMove = 2; else if( best - secondbest > 70 ) EasyMove = 1; if( Flag.post && EasyMove!=0 && Flag.xboard<2 ) { printf( " -> easy move (%i) ", EasyMove ); printm(m[0],NULL); puts(" "); } /* for( i=0; i!=n; i++ ) printm( m[i], NULL ); puts(""); */ return best; } long LastTurn; int Turns; tmove root_search( void ) { tmove m[256]; int n, i; int Alpha, Beta; int r; int Nod[256]; Abort = 0; NoAbort = 1; generate_legal_moves( m, &n, checktest(Color) ); /***delete this!!!!***/ /* for(i=0;i!=n;i++) if( m[i].from==E5 && m[i].to==F7 ) {m[i]=m[n-1]; n--;} */ if( Flag.log != NULL ) { char pb[2048]; if( Counter>0 ) { fprintf(Flag.log,"\n"); if( Flag.ponder == 2 ) fprintf(Flag.log," pondering move "); else fprintf(Flag.log," opponent plays "); printm( G[Counter-1].m, pb ); fprintf(Flag.log,pb); fprintf(Flag.log,"\n"); } printboard(pb); fprintf(Flag.log,pb); fprintf(Flag.log,"\n"); } if( Flag.book ) if( Counter < 20 || Bookout < 4 || Flag.analyze ) { int b = 0; if( Flag.easy && Counter > 4 ) { if( rand()%128 < Flag.easy+Counter*4 ) b = -1; } if( b==0 ) b = bookmove( m, n ); if( b != -1 ) { /* PV[0][0] = m[b]; */ Bookout = 0; PV[0][1].from = 0; /* dont start pondering */ m[b].value = 0; do_move(m+b); return m[b]; } else Bookout ++; } init_killers(); if( n == 0 ) NoAbort = 0; else { int learndepth = 0; int learnalpha = 0; Age ++; Nodes = 0; A_n = n; A_m = m; A_i = 0; PV[0][0].from = 0; l_startsearch(); Ply = 0; LastIter = Alpha = sort_root_moves( m, n ); LastTurn = ptime(); if( EasyMove == 3 && ! Flag.analyze ) { do_move(m); return m[0]; } FollowPV = 1; NoAbort = 0; Depth = 290; Ply = 0; A_d = 2; memset( Nod, 0, 256*sizeof(int) ); if( !Flag.polling ) signal(SIGINT,interrupt); Turns=n; while( ( Flag.ponder==2 || l_iterate() || Flag.analyze ) && !Abort && Depth < MAXPLY*100 ) { A_d++; Turns=0; Beta = Alpha + WINDOW; Alpha = Alpha - WINDOW; if( Flag.post && ! Flag.xboard ) verboseline( m, 0, n ); for( i=0; i!=n; i++ ) { int64 lastnodes = Nodes; A_i = i; do_move(m+i); #ifdef SCOUT if( i == 0 ) { r = - evaluate( -Beta, -Alpha ); if(!Abort) m[i].value = r; if( m[i].value <= Alpha && !Abort ) { if( Flag.post ) infoline(4,NULL); r = - evaluate( -Alpha, CHECKMATE ); if(!Abort) m[i].value = Alpha = r; update_PV( m[0], 0 ); if( Flag.post ) infoline(1,NULL); } } else { #define SWINDOW 5 r = - evaluate( -Alpha-SWINDOW, -Alpha ); if(!Abort) m[i].value = r; if( m[i].value > Alpha ) /* TURN */ { if( ! Abort ) { Turns++; if(i>bgs) bgs++; update_PV( m[i], 0 ); LastTurn = ptime(); if( EasyMove != 0 ) { EasyMove = 0; if( Flag.post && Flag.xboard<2 ) printf( " -> easy move off \n" ); } } if( m[i].value >= Alpha+SWINDOW ) { if( Flag.post ) infoline(2,NULL); r = - evaluate( -Beta, -Alpha ); if(!Abort) m[i].value = r; } } } #else r = - evaluate( -Beta, -Alpha ); if(!Abort) m[i].value = r; if( i==0 && m[i].value <= Alpha && !Abort ) { if( Flag.post ) infoline(4,NULL); Beta = Alpha; Alpha = -CHECKMATE; r = - evaluate( -Beta, -Alpha ); if(!Abort) m[i].value = r; } #endif if( m[i].value >= Beta ) { #ifndef SCOUT LastTurn = ptime(); update_PV( m[i], 0 ); #endif PV[0][0].value = Beta; if( Flag.post ) infoline(5,NULL); r = - evaluate( -CHECKMATE, -Beta ); if(!Abort) m[i].value = r; } undo_move(m+i); if( Abort ) { if( Abort == 1 && Flag.post ) puts("search aborted"); break; } if( m[i].value > Alpha ) { int j; tmove pom; #ifndef SCOUT LastTurn = ptime(); #endif update_PV( m[i], 0 ); Alpha = m[i].value; if( Flag.post ) infoline(1,NULL); /* bubble the move up */ pom = m[i]; for( j=i; j!=0; j-- ) m[j] = m[j-1]; m[0] = pom; Beta = Alpha + WINDOW; } else { int j; int64 ipom; tmove pom; ipom = Nod[i] = Nodes-lastnodes; /* bubble up */ pom = m[i]; for( j=i; j>bgs+1 && Nod[i]>Nod[j-1]; j-- ) { m[j] = m[j-1]; Nod[j] = Nod[j-1]; } m[j] = pom; Nod[j] = ipom; } } if( !Abort && Depth>300 ) { learndepth = Depth; learnalpha = Alpha; } if( Flag.post ) infoline(3,NULL); Depth += 100; FollowPV = 1; if( abs(Alpha) > 29000 ) { if( abs(Alpha)+Depth/100 > CHECKMATE ) break; if( EasyMove < 2 ) { EasyMove = 2; if( Flag.post && Flag.xboard<2 ) printf( " -> forced checkmate -> easy move (2) \n"); } } LastIter = Alpha; } Depth -= 100; AllDepth += Depth; { extern long T1; long t=ptime()-T1; if( t != 0 ) AllNPS += 100*Nodes/t; } if( Flag.post ) infoline(0,NULL); if( Flag.learn && learndepth ) wlearn( learndepth, learnalpha ); do_move(PV[0]); } signal(SIGINT,SIG_IGN); return PV[0][0]; } Phalanx-XXII/static.c0000644000175000001440000011236510314125617014075 0ustar sombrausers/** *** STATIC EVALUATION **/ #include "phalanx.h" /** *** command `score' shows detailed information about static *** evaluation of actual position. If you want this to work, *** SCORING must be defined. Then, static evaluation function *** is somewhat slower. **/ #undef SCORING int Scoring; /** *** If the material value is between ENDMATERIAL and MIDMATERIAL, *** Phalanx computes both endgame and middlegame evaluation. *** The evaluation is proportionally computed from these two values. **/ #define ENDMATERIAL 3000 /* minimum is 0 */ #define MIDMATERIAL 6000 /* maximum is 8600 */ tknow Wknow, Bknow; /* isolated pawn penalty by rank */ static const int isofile[10] = { 0, -4, -6, -8, -10, -10, -8, -6, -4, 0 }; /*** A B C D E F G H ***/ /*** Square color ***/ signed char sqcolor_[80] = { 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0 }; signed char * sqcolor = sqcolor_-20; /*** Pawn in middlegame ***/ int pmpb_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 6, 4, 3, 2, 0, 0, 0, 1, 5, 8, 8, 5, 1, 0, 0, 0, 0, 1, 6, 16, 12, 6, 1, 0, 0, 0, 1, 5, 7, 16, 12, 7, 5, 1, 0, 0, 5, 8, 10, 16, 12, 10, 8, 5, 0, 0, 5, 5, 5, 6, 6, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int * pmpb = pmpb_-20; /*** queenside pawn attack ***/ int qstormtable_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-12,-12,-12, 0, 0, 10, 10, 10, 0, 0, -9,-10, -9, 0, 6, 8, 8, 8, 0, 0, -6, -6, -6, 6, 10, 4, 4, 4, 0, 0, -3, -3, -3, 10, 4, 0, 0, 0, 0, 0, 0, 0, 5, 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 }; const int * qstormtable = qstormtable_-20; /*** kingside pawn attack ***/ int kstormtable_[80] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0,-12,-12,-12, 0, 0, 8, 8, 8, 6, 0, -9,-10, -9, 0, 0, 4, 4, 4, 10, 6, -6, -6, -6, 0, 0, 0, 0, 0, 4, 10, -3, -3, -3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int * kstormtable = kstormtable_-20; /*** knight in middlegame ***/ int nmpb_[80] = { 0,-16,-10, -8, -8, -8, -8,-10,-16, 0, 0,-10, -3, 1, 3, 3, 1, -3,-10, 0, 0, -8, 1, 5, 5, 5, 5, 1, -8, 0, 0, -8, 2, 5, 8, 8, 5, 2, -8, 0, 0, -8, 4, 6, 10, 10, 6, 4, -8, 0, 0, -8, 4, 7, 8, 8, 7, 4, -8, 0, 0,-10, 0, 3, 4, 4, 3, 0,-10, 0, 0,-16,-10, -8, -8, -8, -8,-10,-16, 0 }; const int * nmpb = nmpb_-20; /*** bishop in middlegame ***/ int bmpb_[80] = { 0, 10, 8, 6, 4, 4, 6, 8, 10, 0, 0, 8, 12, 8, 9, 9, 8, 12, 8, 0, 0, 10, 10, 11, 11, 11, 11, 10, 10, 0, 0, 11, 12, 13, 14, 14, 13, 12, 11, 0, 0, 12, 13, 15, 17, 17, 15, 14, 12, 0, 0, 13, 14, 16, 16, 16, 16, 14, 13, 0, 0, 11, 14, 12, 12, 12, 12, 14, 11, 0, 0, 13, 10, 10, 10, 10, 10, 10, 13, 0 }; const int * bmpb = bmpb_-20; /*** bishop in endgame ***/ int bepb_[80] = { 0, 24, 21, 18, 15, 15, 18, 21, 24, 0, 0, 21, 24, 21, 18, 18, 21, 24, 21, 0, 0, 18, 21, 24, 24, 24, 24, 21, 18, 0, 0, 15, 18, 24, 30, 30, 24, 18, 15, 0, 0, 15, 18, 24, 30, 30, 24, 18, 15, 0, 0, 18, 21, 24, 24, 24, 24, 21, 18, 0, 0, 21, 24, 21, 18, 18, 21, 24, 21, 0, 0, 24, 21, 18, 15, 15, 18, 21, 24, 0 }; const int * bepb = bepb_-20; /*** rook in middlegame ***/ int rmpb_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 7, 8, 9, 10, 10, 9, 8, 7, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0 }; const int * rmpb = rmpb_-20; /*** queen in middlegame ***/ int qmpb_[80] = { 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 4, 5, 6, 7, 7, 6, 5, 4, 0, 0, 5, 6, 7, 8, 8, 7, 6, 5, 0, 0, 6, 7, 8, 9, 9, 8, 7, 6, 0, 0, 8, 9, 10, 11, 11, 10, 9, 8, 0, 0, 10, 11, 12, 13, 13, 12, 11, 10, 0, 0, 8, 10, 11, 12, 12, 11, 10, 8, 0, 0, 5, 6, 7, 8, 8, 7, 6, 5, 0 }; const int * qmpb = qmpb_-20; /*** king in middlegame ***/ int kmpb_[80] = { 0, 0, 0, -3, -6, -6, -3, 0, 0, 0, 0, -2, -4, -8,-12,-12, -8, -4, -2, 0, 0, -6,-12,-20,-25,-25,-20,-12, -6, 0, 0,-15,-20,-30,-40,-40,-30,-20,-15, 0, 0,-30,-40,-50,-60,-60,-50,-40,-30, 0, 0,-35,-45,-55,-65,-65,-55,-45,-35, 0, 0,-30,-40,-50,-60,-60,-50,-40,-30, 0, 0,-20,-30,-40,-50,-50,-40,-30,-20, 0 }; const int * kmpb = kmpb_-20; /*** king in endgame ***/ int kepb_[80] = { 0, -5, 5, 10, 15, 15, 10, 5, -5, 0, 0, 6, 11, 16, 21, 21, 16, 11, 6, 0, 0, 12, 17, 22, 27, 27, 22, 17, 12, 0, 0, 18, 24, 30, 34, 34, 28, 24, 18, 0, 0, 20, 27, 33, 48, 48, 33, 27, 20, 0, 0, 16, 25, 34, 40, 40, 34, 25, 16, 0, 0, 9, 20, 28, 35, 35, 28, 20, 9, 0, 0, 3, 10, 17, 24, 24, 17, 10, 3, 0, }; const int * kepb = kepb_-20; /*** knight in endgame ***/ int c_bonus_[80] = { 0,-16,-10, -6, -2, -2, -6,-10,-16, 0, 0, -9, -3, 1, 4, 4, 1, -3, -9, 0, 0, -4, 1, 5, 8, 8, 5, 1, -4, 0, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 0, 1, 5, 9, 13, 13, 9, 5, 1, 0, 0, -2, 2, 6, 9, 9, 6, 2, -2, 0, 0, -6, -1, 2, 5, 5, 2, -1, -6, 0, 0, -9, -6, -3, 0, 0, -3, -6, -9, 0 }; int *c_bonus = c_bonus_-20; int outpost_[80] = { 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const int *outpost = outpost_-20; int B_mobi[20] = { -36, -28, -20, -14, -6, -2, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8 }; int R_mobi[16] = { -9, -5, -2, 0, 2, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6 }; /* power table */ unsigned short P[120]; int *pf, *xpf, wpf[10], bpf[10]; /* # of w&b pawns on a file */ int score_position(void) { int i; /** *** We always compute both 'endgame' value and 'middlegame' position *** value. After they are computed, they are balanced by total material. *** This prevents evaluation to do big jumps when searching a position *** on the edge of middlegame and endgame. *** *** Evaluation is done in two passes: *** 1) Extract knowledge (see typedef tknow), prepare mirrored board. *** 2) Use knowledge. Thanks to mirroring board in first pass, we dont *** have to write evaluation of specific things twice (for white and *** black separately). This might also make better use of internal *** cache on small machines. **/ int midresult, endresult, result; int whp, bhp; /* sum of hung pieces. >=2 means troubles -> big penalty. */ int kp, xkp; /* this side and other side king position */ tknow * know, * xknow; static int *l, wl[34], bl[34]; /* w&b piece list. Indexes to B[] (mB[]) */ static int n, wn, bn; static int pin[32]; int npin; /* mirrored board */ static tsquare mB[120] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static tsquare mBinit[80] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3 }; tsquare *b; /***************************************************************/ if( Totmat <= (R_VALUE+R_VALUE+P_VALUE) ) { /* if there are no pieces, return special pawn endgame evaluation */ /* [moved, computed later] */ /* Now, check some special endgame positions that are known to be * hopeless draw (this might also cause pruning of the search). */ switch(Totmat) { case (B_VALUE+P_VALUE): /* minor piece and pawn */ { int r = e_mp(); if( r ) return DRAW+r; } break; case (N_VALUE+N_VALUE): /* minor against minor or two knights */ if( G[Counter].mtrl == N_VALUE ) /* minor:minor */ if( G[Counter].m.in2 == 0 ) return DRAW; { int nn=0; for( i=L[WKP].next; i!=0; i=L[i].next ) if( B[i] == WN ) nn++; if( nn == 1 ) return e_nb(WHITE); if( nn == 2 ) return Color==WHITE ? DRAW-(N_VALUE+N_VALUE) : DRAW+(N_VALUE+N_VALUE); if( nn == 0 ) { for( i=L[BKP].next; i!=0; i=L[i].next ) if( B[i] == BN ) nn++; if( nn == 1 ) return e_nb(BLACK); if( nn == 2 ) return Color==WHITE ? DRAW+(N_VALUE+N_VALUE) : DRAW-(N_VALUE+N_VALUE); } } break; case (R_VALUE+R_VALUE+P_VALUE): /* RPr */ if( abs(G[Counter].mtrl-G[Counter].xmtrl) == P_VALUE ) { int i; int np=0; for( i=L[WKP].next; i!=0; i=L[i].next ) np++; for( i=L[BKP].next; i!=0; i=L[i].next ) np++; if( np == 3 ) return e_rpr(); } break; } } result = midresult = endresult = whp = bhp = npin = 0; memcpy( mB+20, mBinit, 80*sizeof(tsquare) ); wn = bn = 1; /* King ... at least */ for(i=0;i!=10;i++) wpf[i]=bpf[i]=0; memset( &Wknow, 0, sizeof(tknow) ); memset( &Bknow, 0, sizeof(tknow) ); memset( P, 0, 120*sizeof(short) ); Wknow.kp = WKP; Wknow.worsebm = 100; Wknow.lpf = 9; Bknow.kp = BKP; Bknow.worsebm = 100; Bknow.lpf = 9; /************************************************/ i=WKP; mB[ Th[i] ] = BK; wl[0] = i; for( i=L[i].next; i!=0; i=L[i].next ) { int j; int mobi; switch( B[i] ) { case WP: mB[ Th[i] ] = BP; wl[wn] = i; wn++; wpf[i%10]++; if(i%10Wknow.rpf) Wknow.rpf=i%10; Wknow.p++; for( j=i+9; j<=i+11; j+=2 ) { P[j] |= WPM; P[j] += WWW; } if( i>=A6 && B[i+10]==0 ) /* Passed pawn */ { Bknow.hung+=4; if(B[i+20]==0||B[i+20]==3) Bknow.hung+=16; } break; case WN: mB[ Th[i] ] = BN; wl[wn] = i; wn++; Wknow.n++; for( j=0; j!=8; j++ ) { int d = i+N_moves[j]; P[d] |= WNM; P[d] += WWW; } break; case WB: mB[ Th[i] ] = BB; wl[wn] = i; wn++; Wknow.b++; Wknow.bishopcolor |= sqcolor[i]; Bknow.xbishopcolor |= 3-sqcolor[i]; mobi = 4; for( j=4; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d+=step; mobi++; P[d] |= WBM; P[d] += WWW; } while( B[d] == 0 ); if( B[d] & WHITE ) /* edge or friendly piece */ { mobi--; if( B[d]==3 || ( B[d]==WP && B[d+10] ) ) mobi--; } else if( B[d]==BN || B[d]==BR || B[d]==BQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BQ || B[d]==BK ) npin++; } } result += B_mobi[mobi]; if( mobi < Wknow.worsebm ) Wknow.worsebm = mobi; break; case WR: mB[ Th[i] ] = BR; wl[wn] = i; wn++; if( i>=A7 && i<=H7 ) Wknow.r7r+=2; Wknow.r++; mobi = 0; for( j=0; j!=4; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= WRM; P[d] += WWW; } while( B[d] == 0 ); if( B[d] & WHITE ) mobi--; else if( B[d]==BN || B[d]==BB || B[d]==BQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BQ || B[d]==BK ) npin++; } } result += R_mobi[mobi]; break; case WQ: mB[ Th[i] ] = BQ; wl[wn] = i; wn++; if( i>=A1 && i<=H3 ) Wknow.r7r++; Wknow.q++; for( j=0; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; P[d] |= WQM; P[d] += WWW; } while( B[d] == 0 ); if( B[d]==BN || ( B[d]==BB && d<4 ) || ( B[d]==BR && d>=4 ) ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==BK ) npin++; } } break; } } i=BKP; mB[ Th[i] ] = WK; bl[0] = Th[i]; for( i=L[i].next; i!=0; i=L[i].next ) { int j; int mobi; switch( B[i] ) { case BP: mB[ Th[i] ] = WP; bl[bn] = Th[i]; bn++; bpf[i%10]++; if(i%10Bknow.rpf) Bknow.rpf=i%10; Bknow.p++; for( j=i-11; j<=i-9; j+=2 ) { P[j] |= BPM; P[j] += BBB; } if( i<=H3 && B[i-10]==0 ) { Wknow.hung+=4; if(B[i-20]==0||B[i-20]==3) Wknow.hung+=16; } break; case BN: mB[ Th[i] ] = WN; bl[bn] = Th[i]; bn++; Bknow.n++; for( j=0; j!=8; j++ ) { int d = i+N_moves[j]; P[d] |= BNM; P[d] += BBB; } break; case BB: mB[ Th[i] ] = WB; bl[bn] = Th[i]; bn++; Bknow.b++; Bknow.bishopcolor |= 3-sqcolor[i]; Wknow.xbishopcolor |= sqcolor[i]; mobi = 4; for( j=4; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= BBM; P[d] += BBB; } while( B[d] == 0 ); if( B[d] & BLACK ) { mobi--; if( B[d]==3 || ( B[d]==BP && B[d-10] ) ) mobi--; } else if( B[d]==WN || B[d]==WR || B[d]==WQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WQ || B[d]==WK ) npin++; } } result -= B_mobi[mobi]; if( mobi < Bknow.worsebm ) Bknow.worsebm = mobi; break; case BR: mB[ Th[i] ] = WR; bl[bn] = Th[i]; bn++; if( i>=A2 && i<=H2 ) Bknow.r7r+=2; Bknow.r++; mobi = 0; for( j=0; j!=4; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; mobi++; P[d] |= BRM; P[d] += BBB; } while( B[d] == 0 ); if( B[d] & BLACK ) mobi--; else if( B[d]==WN || B[d]==WB || B[d]==WQ ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WQ || B[d]==WK ) npin++; } } result -= R_mobi[mobi]; break; case BQ: mB[ Th[i] ] = WQ; bl[bn] = Th[i]; bn++; if( i>=A1 && i<=H3 ) Bknow.r7r++; Bknow.q++; for( j=0; j!=8; j++ ) { int step = RB_dirs[j]; int d = i; do { d += step; P[d] += BBB; P[d] |= BQM; } while( B[d] == 0 ); if( B[d]==WN || ( B[d]==WB && d<4 ) || ( B[d]==WR && d>=4 ) ) { pin[npin]=d; do d+=step; while( B[d]==0 ); if( B[d]==WK ) npin++; } } break; } } if( Totmat == P_VALUE*(Wknow.p+Bknow.p) ) { /* only pawns */ return pawns(); } #undef debug #ifdef debug { int i,j; puts(""); for(i=110;i>=0;i-=10) { for(j=0;j!=10;j++) printf(" %04X",P[i+j]);puts(""); } } #endif #ifdef SCORING if( Scoring ) printf(" (w/b) mobility = %i\n",result); #endif /** *** Scan pinned pieces **/ { int pini; for( i=0; i!=npin; i++ ) switch( B[ pini = pin[i] ] ) { case WQ: result -= 50; Wknow.hung += 20; break; case BQ: result += 50; Bknow.hung += 20; break; case WN: case WB: case WR: if( (P[pini] & WPM) == 0 ) /* not pawn-protected */ { Wknow.hung += 6; result += -15*(P[pini]>>13); } else result += -6*(P[pini]>>13); if( P[pini] & BPM ) { Wknow.hung += 5; result -= 15; } break; case BN: case BB: case BR: if( (P[pini] & BPM) == 0 ) { Bknow.hung += 6; result += 15*((0x00F0&P[pini])>>5); } else result += 6*((0x00F0&P[pini])>>5); if( P[pini] & WPM ) { Bknow.hung += 5; result += 15; } break; } } /** *** Look for hung pieces & weak pawns **/ { static unsigned m[112] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7, 0x7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF, 0xF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( i=L[WKP].next; i!=0; i=L[i].next ) if(P[i]&0xFF00) /* Black attacks the square 'i' */ { if( (P[i]&0x00FF)==0 /* undefended */ || ( m[B[i]] & (P[i]>>8) ) /* attacked by less valuable */ ) switch(B[i]) { case WP: Wknow.hung += 8; break; case WN: case WB: whp++; Wknow.hung+=12; break; case WR: whp++; Wknow.hung+=14; break; case WQ: whp++; Wknow.hung+=16; } else if( (P[i]&WPM) == 0 ) /* not pawn-protected */ { if(B[i]==WP) result += (P[i]>>13)*5; else Wknow.hung += 6; } } for( i=L[BKP].next; i!=0; i=L[i].next ) if(P[i]&0x00FF) /* white attacks this square */ { if( (P[i]&0xFF00)==0 || ( m[B[i]] & P[i] ) ) switch(B[i]) { case BP: Bknow.hung += 8; break; case BN: case BB: bhp++; Bknow.hung+=12; break; case BR: bhp++; Bknow.hung+=14; break; case BQ: bhp++; Bknow.hung+=16; } else if( (P[i]&BPM) == 0 ) /* not pawn-protected */ { if(B[i]==BP) result -= ((P[i]>>5)&0x7)*5; else Bknow.hung += 6; } } if( whp>1 ) Wknow.hung += 8*whp; if( bhp>1 ) Bknow.hung += 8*bhp; } /*** King safety ***/ for(i=0;i!=8;i++) { int direction = K_moves[i]; int d=Wknow.kp+direction; if(B[d]!=3) { int ataks = (P[d]>>13) & 0x7; if(ataks) { int defs = (P[d]>>5) & 0x7; Wknow.khung += ataks; if( defs == 0 ) { Wknow.khung ++; if( ataks>1 && (P[d]&BQM) ) Wknow.khung += 2; } } /*** Add number of safe checks available ***/ if( B[d]==0 ) { d += direction; while( (B[d]&BLACK) == 0 ) { if( ( P[d] & 0xE0 ) == 0 ) { if( i<4 ) { if( P[d] & (BQM|BRM) ) { Wknow.khung +=2; break; } } else { if( P[d] & (BQM|BBM) ) { Wknow.khung +=2; break; } } } if( B[d] ) break; d += direction; } } d = Wknow.kp+N_moves[i]; if( (P[d]&BNM) && (B[d]&BLACK) == 0 && ( P[d] & 0xE0 ) == 0 ) Wknow.khung += 2; } d=Bknow.kp+direction; if(B[d]!=3) { int ataks = (P[d]>>5) & 0x7; if(ataks) { int defs = (P[d]>>5) & 0x7; Bknow.khung += ataks; if( defs == 0 ) { Bknow.khung ++; if( ataks>1 && (P[d]&WQM) ) Bknow.khung += 2; } } /*** Add number of safe checks available ***/ if( B[d]==0 ) { d += direction; while( (B[d]&WHITE) == 0 ) { if( ( P[d] & 0xE000 ) == 0 ) { if( i<4 ) { if( P[d] & (WQM|WRM) ) { Bknow.khung +=2; break; } } else { if( P[d] & (WQM|WBM) ) { Bknow.khung +=2; break; } } } if( B[d] ) break; d += direction; } } d = Bknow.kp+N_moves[i]; if( (P[d]&WNM) && (B[d]&WHITE) == 0 && ( P[d] & 0xE000 ) == 0 ) { Bknow.khung += 2; } } } if( Totmat >= ENDMATERIAL+Q_VALUE ) { if( Wknow.kp%10 < FILE_E && Bknow.kp%10 > FILE_E ) { Wknow.kstorm = 1; Bknow.qstorm = 1; } else if( Wknow.kp%10 > FILE_E && Bknow.kp%10 < FILE_E ) { Wknow.qstorm = 1; Bknow.kstorm = 1; } } if( Wknow.hung || Bknow.hung ) { int hresult = Bknow.hung - Wknow.hung; midresult += hresult; endresult += hresult; #ifdef SCORING if( Scoring ) printf(" (w/b) hung pieces = %i\n",hresult); #endif } Wknow.castling = ( G[Counter].castling & 3 ); Bknow.castling = ( G[Counter].castling >> 2 ); if( (P[G1]|P[F1]) & 0xFF00 ) Wknow.castling |= WSHORT; if( (P[C1]|P[D1]) & 0xFF00 ) Wknow.castling |= WLONG; if( (P[G8]|P[F8]) & 0x00FF ) Bknow.castling |= WSHORT; /* WSHORT is correct! */ if( (P[C8]|P[D8]) & 0x00FF ) Bknow.castling |= WLONG; /* We're mirroring */ /** *** PASS 2 **/ n = wn; l = wl; b = B; pf = wpf; xpf = bpf; know = &Wknow; xknow = &Bknow; kp = Wknow.kp; xkp = Bknow.kp; for(;;) { tdist *kdist = dist+120*kp; tdist *xkdist = dist+120*xkp; int j; int mr = 0, er = 0; /* bishop pair */ if( know->bishopcolor == 3 ) { int bb = 18 + 2*know->worsebm; mr += bb; er += bb*2; #ifdef SCORING if( Scoring ) if(l==wl) printf(" (whi) bishop pair bonus = %i\n",bb); else printf(" (bla) bishop pair bonus = %i\n",bb); #endif } /* rooks on 7th row */ /* r7r: 2 pts for rook, 1 pt for queen on 6-8th row */ if( know->r7r > 1 ) { if( xkp >= A8 ) { er += 12 * know->r7r; mr += 5 * know->r7r; } mr += 10 * know->r7r; er += 4 * know->r7r; if( know->r7r > 2 ) mr += know->r7r * know->r7r + 4; } if( Totmat >= ENDMATERIAL ) { int d = 0; /*** play Pc2-c4 (black Pc7-c5) in closed games ***/ if( b[D5]==BP ) { if( b[C4]==WP ) { mr+=10; if( b[E6]==BP && B[D4]==WP ) mr+=10; /*** defender in stonewall must keep pressure *** to opponent's d-pawn ****/ if( b[F5]==BP ) mr+=15; } if( b[C2]==WP ) { if( b[C3]!=0 ) mr -= 7; else mr -= 3; if( b[E2]==WP || b[E3]==WP ) mr -= 5; if( b[E6]==BP || b[C6]==BP ) mr -= 4; } } /*** development ***/ if( b[A1] == WR && pf[FILE_A] != 0 ) d+=2; if( b[B1] == WN ) d+=5; if( b[C1] == WB ) { d+=3; if( b[B2] && b[D2] ) d+=4; } if( b[D1] == WQ ) d++; if( b[F1] == WB ) { d+=3; if( b[E2] && b[G2] ) d+=4; } if( b[G1] == WN ) d+=5; if( b[H1] == WR && pf[FILE_H] != 0 ) d+=2; know->devel = d; /* maximum is 29, <10 is okay */ /*** central pawns ***/ if( b[D4]==WP && b[E4]==WP ) { if( b[E5]!=BP && b[D5]!=BP ) d = 12; else d = 6; if( b[C4]==WP || b[F4]==WP ) d += 4; mr += d; #ifdef SCORING if( Scoring ) if(l==wl) printf( " (whi) pawn center = %i\n", d ); else printf( " (bla) pawn center = %i\n", d ); #endif } { /*** castling ***/ int cneed; d = 0; if( kp%10 < FILE_D || kp%10 > FILE_E ) cneed=0; else { cneed = 4; if( ! pf[FILE_E] ) cneed += 3; if( ! xpf[FILE_E] ) cneed += 5; } switch( know->castling ) { case 0: /* both castlings possible */ if( b[F1] ) d -= 2*cneed; if( b[G1] ) d -= 2*cneed; if( b[B1] ) d -= cneed; if( b[C1] ) d -= cneed; if( b[D1] ) d -= cneed; break; case WSHORT: /* only long castling possible */ d-=20; if( b[B1] ) d -= cneed; if( b[C1] ) d -= cneed; if( b[D1] ) d -= cneed; break; case WLONG: /* only short castling possible */ d-=8; if( b[F1] ) d -= 2*cneed; if( b[G1] ) d -= 2*cneed; break; case (WSHORT|WLONG): /* castling impossible */ if( kp%10 > FILE_E ) { if( b[G2]!=WP && b[G3]!=WP ) d -= 10; if( b[H2]!=WP && b[H3]!=WP ) d -= 8; } else if( kp%10 < FILE_D ) { d -= 15; if( b[B2]!=WP && b[B3]!=WP ) d -= 10; if( b[A2]!=WP && b[A3]!=WP ) d -= 8; } else { d -= 5*cneed; } break; } if( Totmat < 5000 ) d /= 2; mr += d; } #ifdef SCORING if( Scoring ) if(d!=0) if(l==wl) printf( " (whi) castling = %i\n", d ); else printf( " (bla) castling = %i\n", d ); #endif } /*** pawn structure ***/ for( i=1; i!=9; i++ ) if( pf[i] ) { if( pf[i] > 1 ) /* doubled */ { mr-=5; er-=10; } if( pf[i-1]==0 && pf[i+1]==0 ) /* isolated */ { /* knights are strong against an isolated pawn * since they can block it. */ int pen = isofile[i] + (2+isofile[i]) * xknow->n + 4*know->b; /* rooks are strong against an isolated pawn on * open file */ if( xpf[i]==0 && xknow->r ) { int j; static const int rfip[10] = { 0, -2, -3, -4, -5, -5, -4, -3, -2, 0 }; for( j=i+20; jr; } if( pf[i] > 1 ) pen = pen*pf[i] + 2*isofile[i]; mr += pen; er += pen; #ifdef SCORING if( Scoring ) if(l==wl) printf( " (whi) isolated pawn = %i\n", pen ); else printf( " (bla) isolated pawn = %i\n", pen ); #endif } } for( i=0; i!=n; i++ ) /* scan pieces */ { static int sq; sq = l[i]; switch( b[ sq ] ) { case WP: /* is it passed? */ for( j=sq+10; j=0) ppeval+=80; } else if( row==7 && b[sq+20]==0 ) if( see(b,sq,sq+10)>=0 && see(b,sq,sq+20)>=0 ) ppeval+=50; } else /* blocked */ if( color(b[sq+10]) == BLACK ) ppeval-=abonus/2; /* blocked - reserve blocking square */ if( color(b[sq+20]) == BLACK ) ppeval-=abonus/4; /* covered or a member of a phalanx */ if( b[sq-9]==WP || b[sq-11]==WP || b[sq-1]==WP || b[sq+1]==WP ) { ppeval += 2*abonus; } /* rook behind - support or brake */ for( j=sq-10; b[j]==0 || b[j]==WR || b[j]==BR || b[j]==BQ || b[j]==WQ; j-=10 ) if( b[j] == WR ) { ppeval += abonus/2 + 4; } else if( b[j] == BR ) { ppeval -= abonus/2 + 9; } if( Totmat < ENDMATERIAL ) { /* distance from enemy king */ int difdis = 2*xkdist[sq+10].max - ( 9 - row ); if( difdis >= 0 ) ppeval += 8+4*difdis; /* king supports the pawn */ if( kdist[sq+10].max < 2 ) ppeval += abonus; } er += ppeval; mr += ppeval/2; #ifdef SCORING if( Scoring && ppeval != 0 ) { if(l==wl) printf(" (whi) "); else printf(" (bla) "); printf("passed pawn = %i ... %i\n", ppeval/2, ppeval ); } #endif } not_passed:; /* backward */ if( sq <= H3 && ( b[sq+19]==BP || b[sq+21]==BP ) && b[sq+10] != BP && b[sq-1] != WP && b[sq+1] != WP && b[sq-9] != WP && b[sq-11] != WP ) { int pen = 0; /* printboard(); printf("%02i",sq); getchar(); */ if( xpf[sq%10]==0 && xknow->r ) { int j; for( j=sq%10+20; jr; } mr += isofile[ sq%10 ] + pen/2; er += -15 + pen; #ifdef SCORING if( Scoring && pen != 0 ) { if(l==wl) printf(" (whi) "); else printf(" (bla) "); printf("backward pawn = %i ... %i\n", isofile[ sq%10 ] + pen/2, -15 + pen ); } #endif } /* cannot move */ { int cannotmove = 0; if( b[ sq + 10 ] != 0 ) { mr -= (12-sq/10); er -= (12-sq/10); if( sq == E2 || sq == D2 ) { mr -= 10; er -= 8; } if( b[ sq + 10 ] ) { /* blocked pawn is an attack brake */ if( know->kstorm && sq%10 > FILE_E ) mr -= 12; else if( know->qstorm && sq%10 < FILE_D ) mr -= 12; if( b[sq+10]==BP && pf[sq%10-1]==0 && pf[sq%10+1]==0 ) /* this pawn was already penalized * as isolated. But this is a pawn * ram - blocked by enemy pawn * face to face. It is not so * critical; take back a small part * of the penalty. *********/ { mr+=5; er+=8; } } cannotmove = 1; } else { int ata=0; if( b[ sq - 1 ] == WP ) ata++; if( b[ sq + 1 ] == WP ) ata++; if( b[ sq + 9 ] == BP ) ata--; if( b[ sq +11 ] == BP ) ata--; if( ata < 1 ) { mr += -4+ata; er += -8+2*ata; cannotmove = 1; } } if( cannotmove ) { int p = 1 + (b[sq+10]==BP); if( Totmat < 1500 ) er -= 6*p; /* penalize friendly bishop that stands * on a square of this color */ if( sqcolor[sq] & know->bishopcolor ) { if( sq==E4 || sq==D4 || sq==E3 || sq==D3 ) { er-=7*p; mr-=5*p; } else { er-=5*p; mr-=4*p; } } } } /* pawn phalanx or chain, both midgame & endgame */ if( b[sq-1]==WP || b[sq-9]==WP || b[sq-11]==WP ) { if( sq >= A4 ) { mr += 6; er += 4; } else { mr += 2; er += 2; } } if( Totmat >= ENDMATERIAL ) { /*** outpost "spacemaker" pawn in midgame */ if( outpost[sq] ) { int o = outpost[sq] + (sq==D4); if( b[sq-1]==WP ) mr += 2*o; if( b[sq+1]==WP ) mr += 2*o; if( b[sq-9]==WP || b[sq-11]==WP ) mr += 3*o; if( b[sq+9]==BP || b[sq+11]==BP ) mr -= 3*o; if(b==B) mr += (P[sq]&0x00FF)/0x0020 * 5*o; else mr += (P[sq]>>8) /0x0020 * 5*o; } /*** storm */ if( know->qstorm ) mr += qstormtable[sq]; else if( know->kstorm ) mr += kstormtable[sq]; /*** `table' bonus */ mr += pmpb[sq]; /*** don't play a4/b4/g4/h4 in opening */ if( sq >= A4 ) { if( know->castling == (WSHORT|WLONG) ) { if( kp%10 > FILE_E ) { if( sq%10 > FILE_F ) mr -= 10; } else { if( kp%10 < FILE_D && sq%10 < FILE_C ) mr -= 8; } } else { if( sq%10 < 3 ) mr -= know->devel; else if( sq%10 > 6 ) mr -= 4+know->devel; } } } break; case WK: er += kepb[sq]; if( Totmat >= ENDMATERIAL ) { mr += kmpb[sq]; /* SHELTER */ switch( b[sq-1] ) { case WP: mr += 3; know->kshield++; break; case WB: mr += 2; know->kshield++; if( b[sq+9]==WP ) mr += 2; } switch( b[sq+1] ) { case WP: mr += 3; know->kshield++; break; case WB: mr += 2; know->kshield++; if( b[sq+11]==WP ) mr += 2; } switch( b[sq+10] ) { case WP: mr += 6; know->kshield+=2; if( b[sq+9]==WP || b[sq+11]==WP ) { mr += 3; know->kshield+=2; } break; case WB: mr += 2; know->kshield++; if( b[sq+9]==WP || b[sq+11]==WP ) { know->kshield++; if( b[sq+20]==WP ) { mr += 2; know->kshield++; } } } if( b[sq+20]==WP ) { know->kshield++; if( b[sq+19]==WP || b[sq+21]==WP ) know->kshield++; } if( b[sq+9]==WP ) { know->kshield++; mr += 4; } if( b[sq+11]==WP ) { know->kshield++; mr += 4; } if( xknow->q || xknow->r >= 2 ) { int file = sq%10; if( pf[file] == 0 ) mr -= 6; if( pf[file-1] == 0 ) mr -= 3; if( pf[file+1] == 0 ) mr -= 3; if( file > FILE_C && file < FILE_F ) { /* open center makes us cry */ if( xpf[file] == 0 ) { if(pf[file]==0) mr -= 8; else mr -= 5; } } } } break; case WR: { int j; int r; int mrr = 0; int err = 0; static int frb[12] = { 0, 0, -5, -5, -2, 0, 2, 4, 8, 10, 10, 10 }; for( j = sq+10; b[j]==0 || b[j]>=ROOK; j += 10 ) {}; r=j/10; /* 2...10 */ if( b[j]==WP && b[j+1] ) r--; mrr = err = frb[r]; if( xpf[sq%10] != 0 ) mrr -= 5; if( pf[sq%10] != 0 ) { mrr -= 5; if( b[j]==WP ) { /* avoid pseudocastling, that's moving king * e1-f1-g1, satisfying king safety but blocking * the rook undeveloped */ if( sq==H1 || sq==H2 || sq==G1 ) if( kp==F1 || kp==G1 ) { mrr -= 33; err -= 33; } } } { static int bon[8] = { 5, 3, 1, -2, -2, -2, -2, -2 }; int b = bon[ xkdist[sq].min ]; if(b>0) { b += r; if( know->qstorm || know->kstorm ) mrr += b; if( b > 5 ) { if( b > 8 ) xknow->khung += 2; else xknow->khung ++; } } } mrr += rmpb[sq]; mr += mrr; er += err; #ifdef SCORING if( Scoring ) if(l==wl) printf( " (whi) rook = %i,%i\n", mrr, err ); else printf( " (bla) rook = %i,%i\n", mrr, err ); #endif } break; case WB: if( b[sq+10]==BP || ( outpost[sq] && ( b[sq-9]==WP || b[sq-11]==WP ) ) ) { int j; int bonus; for( j=sq+9; jqstorm || know->kstorm ) { static int bon[16] = { 8, 8, 8, 7, 5, 3, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8 }; mr += bon[ xkdist[sq].diag ]; } mr += bmpb[sq]; er += bepb[sq]; break; case WN: if( b[sq+10]==BP || ( outpost[sq] && ( b[sq-9]==WP || b[sq-11]==WP ) ) ) { int j; int bonus; for( j=sq+9; j=A4 && sq%10>=FILE_B && sq%10<=FILE_G && xknow->n == 0 && ( know->xbishopcolor & sqcolor[sq] ) == 0 && ( b[sq-9]==WP || b[sq-11]==WP ) ) { mr+=8+2*outpost[sq]; er+=15+4*outpost[sq]; } mr += bonus; er += bonus/2; #ifdef SCORING if( Scoring ) if(l==wl) printf( " (whi) strong knight = %i\n", bonus ); else printf( " (bla) strong knight = %i\n", bonus ); #endif no_knight_outpost:; } /*** trapped knight ***/ if( sq==A8 ) { if( b[A7] == BP && see(b,A8,C7) < -200 ) { mr -= 140; er -= 140; } } else if( sq==H8 ) { if( b[H7] == BP && see(b,H8,F7) < -200 ) { mr -= 140; er -= 140; } } else if( sq==A7 ) { if( b[B7]==BP ) if( b[A6]==BP || b[C6]==BP ) { mr -= 45; er -= 45; } } else if( sq==H7 ) { if( b[G7]==BP ) if( b[H6]==BP || b[F6]==BP ) { mr -= 45; er -= 45; } } mr += nmpb[sq]; if( know->qstorm || know->kstorm ) { static int bon[8] = { 8, /* 1-st entry is never used */ 8, 8, 5, 2, -1, -4, -7 }; mr += bon[ xkdist[sq].max ]; } if( Totmat < ENDMATERIAL ) { /* look at the leftmost and righmost pawn file - * large distance between these files is bad * for knight in endgame */ int d = max(Wknow.rpf,Bknow.rpf)-min(Wknow.lpf,Bknow.lpf); if(d>3) /* look at nonpawn material */ { if( Totmat-P_VALUE*(Wknow.p+Bknow.p) <= N_VALUE+B_VALUE ) er-=5*d; else er-=3*d; } } er += c_bonus[sq]; break; case WQ: /* penalize early queen activity, */ /* 10 to 31 pts., depending on development */ if( know->devel >= 8 ) if( sq >= A3 ) mr -= (2+know->devel); /* let's play aggressively - */ /* penalize for distance from enemy king */ /* active queen is very strong; especially in endgame */ { static int bon[16] = { 10, 10, 10, 9, 7, 5, 3, 0, -2, -4, -8, -8, -8, -8, -8, -8 }; int qb; if( !( B==b ? (P[sq]>>8) : (P[Th[sq]]&0x00FF) ) ) qb = bon[ xkdist[sq].taxi ]; else qb = -8; if( know->qstorm || know->kstorm ) mr += 2*qb; else mr += qb; er += 3*qb; } mr += qmpb[sq]; break; } } if( l == wl ) { midresult += mr; endresult += er; l = bl; n = bn; b = mB; pf = bpf; xpf = wpf; know = &Bknow; xknow = &Wknow; kp = Th[Bknow.kp]; xkp = Th[Wknow.kp]; } else { midresult -= mr; endresult -= er; break; } } /*********** Development */ if( Totmat >= ENDMATERIAL ) { if( Color == WHITE ) { if( Wknow.devel>1 && Wknow.hung<10 ) Wknow.devel-=2; } else { if( Bknow.devel>1 && Bknow.hung<10 ) Bknow.devel-=2; } { int d = Bknow.devel-Wknow.devel; d = 4*d + d*max(Wknow.devel,Bknow.devel)/8; midresult += d; #ifdef SCORING if( Scoring ) { printf(" ( ) %i %i\n", Bknow.devel, Wknow.devel ); if( d!=0 ) printf( " (w/b) development = %i\n", d ); } #endif } } else /* outside passed pawn */ { int whas=0, bhas=0; extern int Oppb[]; /* outside passed pawn bonus, see endgame.c */ /* white/black left/right -most pawn file (0-10) */ int wrm = Wknow.rpf; int wlm = Wknow.lpf; int brm = Bknow.rpf; int blm = Bknow.lpf; /*** look at leftmost pawn ***/ if( wlm+1wlm+3 ) whas=blm-wlm; else if( blm+1blm+3 ) bhas=wlm-blm; /*** look at rightmost pawn ***/ if( wrm-1>brm && wrm>wlm+3 ) whas+=wrm-brm; else if( brm-1>wrm && brm>blm+3 ) bhas+=brm-wrm; endresult += (Oppb[whas]-Oppb[bhas]) * Q_VALUE / (Q_VALUE+Totmat-P_VALUE*(Wknow.p+Bknow.p)); } midresult += (Bknow.khung-Wknow.khung) * 2; /*********** King danger */ Wknow.khung -= Wknow.kshield/3; Bknow.khung -= Bknow.kshield/3; if( Wknow.khung > 1 ) { midresult -= Wknow.khung * Wknow.khung; #ifdef SCORING if( Scoring ) printf( " (whi) king safety = %i\n", Wknow.khung * Wknow.khung * -4 ); #endif } if( Bknow.khung > 1 ) { midresult += Bknow.khung * Bknow.khung; #ifdef SCORING if( Scoring ) printf( " (bla) king safety = %i\n", Bknow.khung * Bknow.khung * -4 ); #endif } Wknow.prune = ( Wknow.hung < 10 && Wknow.khung < 2 ); Bknow.prune = ( Bknow.hung < 10 && Bknow.khung < 2 ); /** *** Trade down bonus **/ { int tbonus = ( G[Counter].mtrl - G[Counter].xmtrl ); if( tbonus != 0 ) { int r; if( Color == BLACK ) tbonus = -tbonus; if( tbonus > 0 ) /* white stronger */ { if( Wknow.p || tbonus>=(N_VALUE+P_VALUE) ) r = ( tbonus * Wknow.p - tbonus * (2*Bknow.q+Bknow.b+Bknow.r+Bknow.n) ) / 30; else /* white has no pawns! */ r = - tbonus / 2; } else /* black stronger */ { if( Bknow.p || tbonus<=(N_VALUE+P_VALUE) ) r = ( tbonus * Bknow.p - tbonus * (2*Wknow.q+Wknow.b+Wknow.r+Wknow.n) ) / 30; else r = - tbonus / 2; } endresult += r; midresult += r/2; #ifdef SCORING if( Scoring ) printf(" (w/b) traded pieces/pawns = %i\n", r ); #endif } } if( Totmat < ENDMATERIAL ) result += endresult; else if( Totmat > MIDMATERIAL ) result += midresult; else result += (Totmat-ENDMATERIAL) * midresult / (MIDMATERIAL-ENDMATERIAL) + (MIDMATERIAL-Totmat) * endresult / (MIDMATERIAL-ENDMATERIAL); /*** different colored bishops in endgame lead to draw ***/ if( Totmat < ENDMATERIAL ) if( Wknow.bishopcolor && Wknow.xbishopcolor && Wknow.bishopcolor+Wknow.xbishopcolor == 3 && Wknow.n==0 && Wknow.r==0 && Wknow.q==0 && Bknow.n==0 && Bknow.r==0 && Bknow.q==0 ) { int difference = ( G[Counter].mtrl - G[Counter].xmtrl ) / 4; result/=2; if( difference > 0 ) { if(Color==WHITE) result -= 50+difference; else result += 50+difference; } else if( difference < 0 ) { if(Color==WHITE) result += 50-difference; else result -= 50-difference; } } #define TEMPO 4 if( Color == WHITE ) return result+TEMPO; else return -result-TEMPO; } Phalanx-XXII/.o/0000755000175000001440000000000010320061044012734 5ustar sombrausersPhalanx-XXII/learn.phalanx0000644000175000001440000100000010314125617015077 0ustar sombrausersuza:o>( zv>MUdDŐz,݂;SzO7wz}z_NjzM Iz s+\1zEsz2 dzL}z4 5z؊ȝz' z /zte [$Bz &8 y<ٲ- ܄'Uz؊!^[#NclFi} rLoGUz5Jzzs;}Fz*. גoe%'Ѳn~\"xK zO[7z(ѓ Tz؊tbLFYzw8<I{HZMz+'$Czmߘ7nz1& [*zHez o)N!| UN 5F51GzE%ʼn+z0X<Ԋ Bo*!}7p!ݦ9x]z!Nlz"tz"R8#e/_d#z>6BzZ$$z9V9lz Y #&*3]M'm8(L|H(dx+* .z+o(z*ltzN%+5+H+%8`)(NZ#Sz:^-g.(7.$1+A/?t0n{jsuԊѕzڊC϶im_NzzAz<S4zYi4;2{4zv43zHN5D?Bڊ5(jz<'Q7z2!Cz&7s-7s"<c^9 z6z3$mv;b+ fhv zSʼ@izSzbtT$>BڊJ:֊P?pxw\+A֖NdA-zmA*4blz$mB|BA?#CzB*C,C`z(zCM 4D2Gzߊ)KhGVbTȅ5ZȾzHCFIiziJѨ JiyJfz$"ֲ\KϯF%z͑z+͵zr΅#DϴzF Ye/&mmzgbOdjzS$a-zVTFT;Uڊ֌SzvתO֊,W|UThX"7Vٙв b[z,Z Zzh۲z~[E.N|ܰ]3\MK^Dz_47_aߝ5XNXoM}M]zWbb.z ܲO/mz}co;z{ec<d*~d2d8z5eeeZzezytf&M][ݲghizF6:Cl:G/qmJzrnuxzoo*8eFVl z#^zG zqqq z*qtP:rz6k{z4Izss6Wt*Xvzg!sN  uzu3ru-܊vSzv(zvԊ2wz8Q:swzCDiD9xr}Syvkrz9a5zz֊{;)z%^L}'{e9rI֊|)zu>xKZ1P}VzFc|u}:_V.U܊V~zuwzX$gzπzA5&Phalanx-XXII/book.lrn0000644000175000001440000000000010314125617014067 0ustar sombrausersPhalanx-XXII/position.bin0000644000175000001440000000011010314125617014760 0ustar sombrausers&SxS)ÀVPA8x]g*8*g2OPhalanx-XXII/position.lrn0000644000175000001440000000106610314125617015016 0ustar sombrausersposition [White "Crafty 19.8"] [Black "phalanx"] [Date "2005.09.14"] setboard r1bqkb1r/ppp2ppp/2n/3p/2Bpn/5N/PPP2PPP/RNBQR1K/ w kq {-24 55514 600} [White "phalanx"] [Black "Crafty 19.8"] [Date "2005.09.14"] setboard r1bq1rk/pppp1ppp/2n2n/2b1p/2P/2N1P1P/PP1PNPBP/R1BQK2R/ b KQ {2 6387 660} [White "phalanx"] [Black "Crafty 19.8"] [Date "2005.09.14"] setboard r1bq1rk/pppp1ppp/2n1pn/6B/1bPP/2N2N/PPQ1PPPP/R3KB1R/ b KQ {-18 6387 540} [White "phalanx"] [Black "Crafty 19.8"] [Date "2005.09.15"] setboard rnbqkbnr/pppppppp///4P//PPPP1PPP/RNBQKBNR/ b KQkq {-35 10937 540} Phalanx-XXII/Makefile0000777000175000001440000000000010320057524015565 2makefileustar sombrausers